/* * Copyright (c) 2013-2016, The PurpleI2P Project * * This file is part of Purple i2pd project and licensed under BSD3 * * See full license text in LICENSE file at top of project tree */ #include #include #include #include #include #include #include #include #include "Config.h" #include "version.h" using namespace boost::program_options; namespace i2p { namespace config { options_description m_OptionsDesc; variables_map m_Options; void Init() { options_description general("General options"); general.add_options() ("help,h", "Show this message") ("conf,c", value()->default_value(""), "Path to main i2pd config file (default: try ~/.i2pd/i2p.conf or /var/lib/i2pd/i2p.conf)") ("tunconf", value()->default_value(""), "Path to config with tunnels list and options (default: try ~/.i2pd/tunnels.cfg or /var/lib/i2pd/tunnels.cfg)") ("pidfile", value()->default_value(""), "Write pidfile to given path") ("log", value()->zero_tokens(), "Write logs to file instead stdout") ("loglevel", value()->default_value("info"), "Set the minimal level of log messages (debug, info, warn, error)") ("host", value()->default_value(""), "External IP (deprecated)") ("port,p", value()->default_value(4567), "Port to listen for incoming connections") ("ipv6,6", value()->zero_tokens()->default_value(false), "Enable communication through ipv6") ("daemon", value()->zero_tokens()->default_value(false), "Router will go to background after start") ("service", value()->zero_tokens()->default_value(false), "Router will use system folders like '/var/lib/i2pd'") ("notransit", value()->zero_tokens()->default_value(false), "Router will not forward transit traffic") ("floodfill", value()->zero_tokens()->default_value(false), "Router will try to become floodfill") ("bandwidth", value()->default_value('O'), "Bandwidth limiting: L - 32kbps, O - 256Kbps, P - unlimited (ignored if floodfill)") ; options_description httpserver("HTTP Server options"); httpserver.add_options() ("http.enabled", value()->default_value(true), "Enable or disable webconsole") ("http.address", value()->default_value("127.0.0.1"), "Webconsole listen address") ("http.port", value()->default_value(7070), "Webconsole listen port") ; options_description httpproxy("HTTP Proxy options"); httpproxy.add_options() ("httpproxy.enabled", value()->default_value(true), "Enable or disable HTTP Proxy") ("httpproxy.address", value()->default_value("127.0.0.1"), "HTTP Proxy listen address") ("httpproxy.port", value()->default_value(4446), "HTTP Proxy listen port") ("httpproxy.keys", value()->default_value("httpproxy-keys.dat"), "HTTP Proxy encryption keys") ; options_description socksproxy("SOCKS Proxy options"); socksproxy.add_options() ("socksproxy.enabled", value()->default_value(true), "Enable or disable SOCKS Proxy") ("socksproxy.address", value()->default_value("127.0.0.1"), "SOCKS Proxy listen address") ("socksproxy.port", value()->default_value(4447), "SOCKS Proxy listen port") ("socksproxy.keys", value()->default_value("socksproxy-keys.dat"), "SOCKS Proxy encryption keys") ; options_description sam("SAM bridge options"); sam.add_options() ("sam.enabled", value()->default_value(false), "Enable or disable SAM Application bridge") ("sam.address", value()->default_value("127.0.0.1"), "SAM listen address") ("sam.port", value()->default_value(7656), "SAM listen port") ; options_description bob("BOB options"); bob.add_options() ("bob.enabled", value()->default_value(false), "Enable or disable BOB command channel") ("bob.address", value()->default_value("127.0.0.1"), "BOB listen address") ("bob.port", value()->default_value(2827), "BOB listen port") ; options_description i2pcontrol("I2PControl options"); i2pcontrol.add_options() ("i2pcontrol.enabled", value()->default_value(false), "Enable or disable I2P Control Protocol") ("i2pcontrol.address", value()->default_value("127.0.0.1"), "I2PCP listen address") ("i2pcontrol.port", value()->default_value(7650), "I2PCP listen port") ("i2pcontrol.password", value()->default_value("itoopie"), "I2PCP access password") ("i2pcontrol.cert", value()->default_value("i2pcontrol.crt.pem"), "I2PCP connection cerificate") ("i2pcontrol.key", value()->default_value("i2pcontrol.key.pem"), "I2PCP connection cerificate key") ; m_OptionsDesc .add(general) .add(httpserver) .add(httpproxy) .add(socksproxy) .add(sam) .add(bob) .add(i2pcontrol) ; } void ParseCmdline(int argc, char* argv[]) { try { store(parse_command_line(argc, argv, m_OptionsDesc), m_Options); } catch (boost::program_options::error e) { std::cerr << "args: " << e.what() << std::endl; exit(EXIT_FAILURE); } if (m_Options.count("help")) { std::cout << "i2pd version " << I2PD_VERSION << " (" << I2P_VERSION << ")" << std::endl; std::cout << m_OptionsDesc; exit(EXIT_SUCCESS); } } void ParseConfig(const std::string& path) { std::ifstream config(path, std::ios::in); if (!config.is_open()) { std::cerr << "missing/unreadable config file: " << path << std::endl; exit(EXIT_FAILURE); } try { store(boost::program_options::parse_config_file(config, m_OptionsDesc), m_Options); } catch (boost::program_options::error e) { std::cerr << e.what() << std::endl; exit(EXIT_FAILURE); }; } void Finalize() { notify(m_Options); }; } // namespace config } // namespace i2p