diff --git a/src/seeder/main.cpp b/src/seeder/main.cpp --- a/src/seeder/main.cpp +++ b/src/seeder/main.cpp @@ -347,7 +347,8 @@ signal(SIGPIPE, SIG_IGN); setbuf(stdout, nullptr); - CDnsSeedOpts opts; + CDnsSeedOpts opts(&gArgs); + opts.SetupSeederArgs(); int parseResults = opts.ParseCommandLine(argc, const_cast(argv)); if (parseResults != CONTINUE_EXECUTION) { diff --git a/src/seeder/options.h b/src/seeder/options.h --- a/src/seeder/options.h +++ b/src/seeder/options.h @@ -27,6 +27,7 @@ class CDnsSeedOpts { public: + ArgsManager *argsManager{nullptr}; int nThreads; int nPort; int nDnsThreads; @@ -41,18 +42,17 @@ std::string ipv6_proxy; std::set filter_whitelist; - CDnsSeedOpts() - : nThreads(DEFAULT_NUM_THREADS), nPort(DEFAULT_PORT), - nDnsThreads(DEFAULT_NUM_DNS_THREADS), fWipeBan(DEFAULT_WIPE_BAN), - fWipeIgnore(DEFAULT_WIPE_IGNORE), mbox(DEFAULT_EMAIL), - ns(DEFAULT_NAMESERVER), host(DEFAULT_HOST), tor(DEFAULT_TOR_PROXY), - ip_addr(DEFAULT_LISTEN_ADDRESS), ipv4_proxy(DEFAULT_IPV4_PROXY), - ipv6_proxy(DEFAULT_IPV6_PROXY) {} + CDnsSeedOpts(ArgsManager *argsMan) + : argsManager(argsMan), nThreads(DEFAULT_NUM_THREADS), + nPort(DEFAULT_PORT), nDnsThreads(DEFAULT_NUM_DNS_THREADS), + fWipeBan(DEFAULT_WIPE_BAN), fWipeIgnore(DEFAULT_WIPE_IGNORE), + mbox(DEFAULT_EMAIL), ns(DEFAULT_NAMESERVER), host(DEFAULT_HOST), + tor(DEFAULT_TOR_PROXY), ip_addr(DEFAULT_LISTEN_ADDRESS), + ipv4_proxy(DEFAULT_IPV4_PROXY), ipv6_proxy(DEFAULT_IPV6_PROXY) {} int ParseCommandLine(int argc, const char **argv); -private: - void SetupSeederArgs(ArgsManager &argsman); + void SetupSeederArgs(); }; #endif // BITCOIN_SEEDER_OPTIONS_H diff --git a/src/seeder/options.cpp b/src/seeder/options.cpp --- a/src/seeder/options.cpp +++ b/src/seeder/options.cpp @@ -11,40 +11,41 @@ #include int CDnsSeedOpts::ParseCommandLine(int argc, const char **argv) { - SetupSeederArgs(gArgs); + assert(argsManager); + std::string error; - if (!gArgs.ParseParameters(argc, argv, error)) { + if (!argsManager->ParseParameters(argc, argv, error)) { tfm::format(std::cerr, "Error parsing command line arguments: %s\n", error); return EXIT_FAILURE; } - if (HelpRequested(gArgs) || gArgs.IsArgSet("-version")) { + if (HelpRequested(*argsManager) || argsManager->IsArgSet("-version")) { std::string strUsage = PACKAGE_NAME " Seeder " + FormatFullVersion() + "\n"; - if (HelpRequested(gArgs)) { + if (HelpRequested(*argsManager)) { strUsage += "\nUsage: bitcoin-seeder -host= -ns= " "[-mbox=] [-threads=] [-port=]\n\n" + - gArgs.GetHelpMessage(); + argsManager->GetHelpMessage(); } tfm::format(std::cout, "%s", strUsage); return EXIT_SUCCESS; } - nThreads = gArgs.GetArg("-threads", DEFAULT_NUM_THREADS); - nPort = gArgs.GetArg("-port", DEFAULT_PORT); - nDnsThreads = gArgs.GetArg("-dnsthreads", DEFAULT_NUM_DNS_THREADS); - fWipeBan = gArgs.GetBoolArg("-wipeban", DEFAULT_WIPE_BAN); - fWipeIgnore = gArgs.GetBoolArg("-wipeignore", DEFAULT_WIPE_IGNORE); - mbox = gArgs.GetArg("-mbox", DEFAULT_EMAIL); - ns = gArgs.GetArg("-ns", DEFAULT_NAMESERVER); - host = gArgs.GetArg("-host", DEFAULT_HOST); - tor = gArgs.GetArg("-onion", DEFAULT_TOR_PROXY); - ip_addr = gArgs.GetArg("-address", DEFAULT_LISTEN_ADDRESS); - ipv4_proxy = gArgs.GetArg("-proxyipv4", DEFAULT_IPV4_PROXY); - ipv6_proxy = gArgs.GetArg("-proxyipv6", DEFAULT_IPV6_PROXY); - SelectParams(gArgs.GetChainName()); + nThreads = argsManager->GetArg("-threads", DEFAULT_NUM_THREADS); + nPort = argsManager->GetArg("-port", DEFAULT_PORT); + nDnsThreads = argsManager->GetArg("-dnsthreads", DEFAULT_NUM_DNS_THREADS); + fWipeBan = argsManager->GetBoolArg("-wipeban", DEFAULT_WIPE_BAN); + fWipeIgnore = argsManager->GetBoolArg("-wipeignore", DEFAULT_WIPE_IGNORE); + mbox = argsManager->GetArg("-mbox", DEFAULT_EMAIL); + ns = argsManager->GetArg("-ns", DEFAULT_NAMESERVER); + host = argsManager->GetArg("-host", DEFAULT_HOST); + tor = argsManager->GetArg("-onion", DEFAULT_TOR_PROXY); + ip_addr = argsManager->GetArg("-address", DEFAULT_LISTEN_ADDRESS); + ipv4_proxy = argsManager->GetArg("-proxyipv4", DEFAULT_IPV4_PROXY); + ipv6_proxy = argsManager->GetArg("-proxyipv6", DEFAULT_IPV6_PROXY); + SelectParams(argsManager->GetChainName()); // Both IPv4 and IPv6 addresses are valid, but the listening address is // treated as IPv6 internally @@ -52,9 +53,9 @@ ip_addr.insert(0, "::FFFF:"); } - if (gArgs.IsArgSet("-filter")) { + if (argsManager->IsArgSet("-filter")) { // Parse whitelist additions - std::string flagString = gArgs.GetArg("-filter", ""); + std::string flagString = argsManager->GetArg("-filter", ""); size_t flagstartpos = 0; while (flagstartpos < flagString.size()) { size_t flagendpos = flagString.find_first_of(',', flagstartpos); @@ -76,54 +77,56 @@ return CONTINUE_EXECUTION; } -void CDnsSeedOpts::SetupSeederArgs(ArgsManager &argsman) { - SetupHelpOptions(argsman); - argsman.AddArg("-help-debug", - "Show all debugging options (usage: --help -help-debug)", - ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); +void CDnsSeedOpts::SetupSeederArgs() { + assert(argsManager); + SetupHelpOptions(*argsManager); + argsManager->AddArg( + "-help-debug", "Show all debugging options (usage: --help -help-debug)", + ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); - SetupChainParamsBaseOptions(argsman); + SetupChainParamsBaseOptions(*argsManager); - argsman.AddArg("-version", "Print version and exit", ArgsManager::ALLOW_ANY, - OptionsCategory::OPTIONS); - argsman.AddArg("-host=", "Hostname of the DNS seed", - ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); - argsman.AddArg("-ns=", "Hostname of the nameserver", - ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); - argsman.AddArg("-mbox=", "E-Mail address reported in SOA records", - ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); - argsman.AddArg( + argsManager->AddArg("-version", "Print version and exit", + ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); + argsManager->AddArg("-host=", "Hostname of the DNS seed", + ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); + argsManager->AddArg("-ns=", "Hostname of the nameserver", + ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); + argsManager->AddArg("-mbox=", + "E-Mail address reported in SOA records", + ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); + argsManager->AddArg( "-threads=", strprintf("Number of crawlers to run in parallel (default: %d)", DEFAULT_NUM_THREADS), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); - argsman.AddArg("-dnsthreads=", - strprintf("Number of DNS server threads (default: %d)", - DEFAULT_NUM_DNS_THREADS), - ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); - argsman.AddArg("-address=
", - strprintf("Address to listen on (default: '%s')", - DEFAULT_LISTEN_ADDRESS), - ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); - argsman.AddArg( + argsManager->AddArg("-dnsthreads=", + strprintf("Number of DNS server threads (default: %d)", + DEFAULT_NUM_DNS_THREADS), + ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); + argsManager->AddArg("-address=
", + strprintf("Address to listen on (default: '%s')", + DEFAULT_LISTEN_ADDRESS), + ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); + argsManager->AddArg( "-port=", strprintf("UDP port to listen on (default: %d)", DEFAULT_PORT), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); - argsman.AddArg("-onion=", "Tor proxy IP/Port", - ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); - argsman.AddArg("-overridednsseed", - "If set, only use the specified DNS seed when " - "querying for peer addresses via DNS lookup.", - ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); - argsman.AddArg("-proxyipv4=", "IPV4 SOCKS5 proxy IP/Port", - ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); - argsman.AddArg("-proxyipv6=", "IPV6 SOCKS5 proxy IP/Port", - ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); - argsman.AddArg("-filter=", - "Allow these flag combinations as filters", - ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); - argsman.AddArg("-wipeban", "Wipe list of banned nodes", - ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); - argsman.AddArg("-wipeignore", "Wipe list of ignored nodes", - ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); + argsManager->AddArg("-onion=", "Tor proxy IP/Port", + ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); + argsManager->AddArg("-overridednsseed", + "If set, only use the specified DNS seed when " + "querying for peer addresses via DNS lookup->", + ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); + argsManager->AddArg("-proxyipv4=", "IPV4 SOCKS5 proxy IP/Port", + ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); + argsManager->AddArg("-proxyipv6=", "IPV6 SOCKS5 proxy IP/Port", + ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); + argsManager->AddArg("-filter=", + "Allow these flag combinations as filters", + ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS); + argsManager->AddArg("-wipeban", "Wipe list of banned nodes", + ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); + argsManager->AddArg("-wipeignore", "Wipe list of ignored nodes", + ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION); } diff --git a/src/seeder/test/options_tests.cpp b/src/seeder/test/options_tests.cpp --- a/src/seeder/test/options_tests.cpp +++ b/src/seeder/test/options_tests.cpp @@ -3,13 +3,31 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include +#include #include +class ArgsTestingSetup { +public: + ArgsManager argsManager; + CDnsSeedOpts opts = CDnsSeedOpts(&argsManager); + + ArgsTestingSetup() { opts.SetupSeederArgs(); } +}; + BOOST_AUTO_TEST_SUITE(options_tests) -BOOST_AUTO_TEST_CASE(options_basic_test) { - CDnsSeedOpts opts; +BOOST_FIXTURE_TEST_CASE(options_defaults_test, ArgsTestingSetup) { + const char *argv[] = {"ignored"}; + BOOST_CHECK(opts.ParseCommandLine(1, argv) == CONTINUE_EXECUTION); + BOOST_CHECK(opts.nPort == DEFAULT_PORT); + BOOST_CHECK(opts.nThreads == DEFAULT_NUM_THREADS); + BOOST_CHECK(opts.nDnsThreads == DEFAULT_NUM_DNS_THREADS); + BOOST_CHECK(opts.fWipeBan == DEFAULT_WIPE_BAN); + BOOST_CHECK(opts.fWipeIgnore == DEFAULT_WIPE_IGNORE); +} + +BOOST_FIXTURE_TEST_CASE(options_basic_test, ArgsTestingSetup) { const char *argv[] = {"ignored", "-host=seeder.bitcoinabc.org", "-ns=localhost", "-mbox=email@bitcoinabc.org", "-port=5555"};