help text
This commit is contained in:
parent
c00ca462ce
commit
0195702cc6
2 changed files with 71 additions and 0 deletions
47
README
Normal file
47
README
Normal file
|
@ -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.
|
24
main.cpp
24
main.cpp
|
@ -21,6 +21,19 @@ public:
|
||||||
CDnsSeedOpts() : nThreads(24), nPort(53), mbox(NULL), ns(NULL), host(NULL) {}
|
CDnsSeedOpts() : nThreads(24), nPort(53), mbox(NULL), ns(NULL), host(NULL) {}
|
||||||
|
|
||||||
void ParseCommandLine(int argc, char **argv) {
|
void ParseCommandLine(int argc, char **argv) {
|
||||||
|
static const char *help = "Bitcoin-seeder\n"
|
||||||
|
"Usage: %s -h <host> -n <ns> [-m <mbox>] [-t <threads>] [-p <port>]\n"
|
||||||
|
"\n"
|
||||||
|
"Options:\n"
|
||||||
|
"-h <host> Hostname of the DNS seed\n"
|
||||||
|
"-n <ns> Hostname of the nameserver\n"
|
||||||
|
"-m <mbox> E-Mail address reported in SOA records\n"
|
||||||
|
"-t <threads> Number of crawlers to run in parallel (default 24)\n"
|
||||||
|
"-p <port> UDP port to listen on (default 53)\n"
|
||||||
|
"-?, --help Show this text\n"
|
||||||
|
"\n";
|
||||||
|
bool showHelp = false;
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
static struct option long_options[] = {
|
static struct option long_options[] = {
|
||||||
{"host", required_argument, 0, 'h'},
|
{"host", required_argument, 0, 'h'},
|
||||||
|
@ -28,6 +41,7 @@ public:
|
||||||
{"mbox", required_argument, 0, 'm'},
|
{"mbox", required_argument, 0, 'm'},
|
||||||
{"threads", required_argument, 0, 't'},
|
{"threads", required_argument, 0, 't'},
|
||||||
{"port", required_argument, 0, 'p'},
|
{"port", required_argument, 0, 'p'},
|
||||||
|
{"help", no_argument, 0, 'h'},
|
||||||
{0, 0, 0, 0}
|
{0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
int option_index = 0;
|
int option_index = 0;
|
||||||
|
@ -52,14 +66,23 @@ public:
|
||||||
case 't': {
|
case 't': {
|
||||||
int n = strtol(optarg, NULL, 10);
|
int n = strtol(optarg, NULL, 10);
|
||||||
if (n > 0 && n < 1000) nThreads = n;
|
if (n > 0 && n < 1000) nThreads = n;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'p': {
|
case 'p': {
|
||||||
int p = strtol(optarg, NULL, 10);
|
int p = strtol(optarg, NULL, 10);
|
||||||
if (p > 0 && p < 65536) nPort = p;
|
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) {
|
if (!opts.host) {
|
||||||
fprintf(stderr, "No hostname set. Please use -h.\n");
|
fprintf(stderr, "No hostname set. Please use -h.\n");
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
FILE *f = fopen("dnsseed.dat","r");
|
FILE *f = fopen("dnsseed.dat","r");
|
||||||
if (f) {
|
if (f) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue