From 0195702cc6c7b1019da0d21dfa02eec60dcd51a5 Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Sun, 1 Jan 2012 23:23:21 +0100 Subject: [PATCH] help text --- README | 47 +++++++++++++++++++++++++++++++++++++++++++++++ main.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 README diff --git a/README b/README new file mode 100644 index 0000000..ca0656a --- /dev/null +++ b/README @@ -0,0 +1,47 @@ +bitcoin-seeder +============== + +Bitcoin-seeder is a crawler for the Bitcoin network, which exposes a list +of reliable nodes via a built-in DNS server. + +Features: +* regularly revisits known nodes to check their availability +* bans nodes after enough failures, or bad behaviour +* accepts nodes down to v0.3.19 to request new IP addresses from, + but only reports good post-v0.3.24 nodes. +* keeps statistics over (exponential) windows of 2 hours, 8 hours, + 1 day and 1 week, to base decisions on. +* very low memory (a few tens of megabytes) and cpu requirements. +* crawlers run in parallel (by default 24 threads simultaneously). + +USAGE +----- + +Assuming you want to run a dns seed on dnsseed.example.com, you will +need an authorative NS record in example.com's domain record, pointing +to for example vps.example.com: + +$ dig -t NS dnsseed.example.com + +;; ANSWER SECTION +dnsseed.example.com. 86400 IN NS vps.example.com. + +On the system vps.example.com, you can now run dnsseed: + +./dnsseed -h dnsseed.example.com -n vps.example.com + +If you want the DNS server to report SOA records, please provide an +e-mailadres (with the @ part replaced by .) using -m. + +RUNNING AS NON-ROOT +------------------- + +Typically, you'll need root privileges to listen to port 53 (name service). + +One solution is using an iptables rule (Linux only) to redirect it to +a non-privileged port: + +$ iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-port 5353 + +If properly configured, this will allow you to run dnsseed in userspace, using +the -p 5353 option. diff --git a/main.cpp b/main.cpp index 4f5a3e5..e384459 100644 --- a/main.cpp +++ b/main.cpp @@ -21,6 +21,19 @@ public: CDnsSeedOpts() : nThreads(24), nPort(53), mbox(NULL), ns(NULL), host(NULL) {} void ParseCommandLine(int argc, char **argv) { + static const char *help = "Bitcoin-seeder\n" + "Usage: %s -h -n [-m ] [-t ] [-p ]\n" + "\n" + "Options:\n" + "-h Hostname of the DNS seed\n" + "-n Hostname of the nameserver\n" + "-m E-Mail address reported in SOA records\n" + "-t Number of crawlers to run in parallel (default 24)\n" + "-p UDP port to listen on (default 53)\n" + "-?, --help Show this text\n" + "\n"; + bool showHelp = false; + while(1) { static struct option long_options[] = { {"host", required_argument, 0, 'h'}, @@ -28,6 +41,7 @@ public: {"mbox", required_argument, 0, 'm'}, {"threads", required_argument, 0, 't'}, {"port", required_argument, 0, 'p'}, + {"help", no_argument, 0, 'h'}, {0, 0, 0, 0} }; int option_index = 0; @@ -52,14 +66,23 @@ public: case 't': { int n = strtol(optarg, NULL, 10); if (n > 0 && n < 1000) nThreads = n; + break; } case 'p': { int p = strtol(optarg, NULL, 10); if (p > 0 && p < 65536) nPort = p; + break; + } + + case '?': { + showHelp = true; + break; } } } + if (host == NULL || ns == NULL) showHelp = true; + if (showHelp) fprintf(stderr, help, argv[0]); } }; @@ -175,6 +198,7 @@ int main(int argc, char **argv) { } if (!opts.host) { fprintf(stderr, "No hostname set. Please use -h.\n"); + exit(1); } FILE *f = fopen("dnsseed.dat","r"); if (f) {