diff options
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/whoisd/as.c | 234 | ||||
-rwxr-xr-x | contrib/whoisd/whoisd.pl | 122 |
2 files changed, 314 insertions, 42 deletions
diff --git a/contrib/whoisd/as.c b/contrib/whoisd/as.c new file mode 100644 index 0000000..354c9ec --- /dev/null +++ b/contrib/whoisd/as.c @@ -0,0 +1,234 @@ +/* $NetBSD: as.c,v 1.2 2008/04/28 20:24:17 martin Exp $ */ + +/* + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Andrew Brown. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <netdb.h> +#include <unistd.h> +#include <string.h> +#include <stdlib.h> +#include <errno.h> +#include <err.h> +#include <stdio.h> + +#include "as.h" + +#define DEFAULT_AS_SERVER "whois.radb.net" +#undef AS_DEBUG_FILE + +struct aslookup { + FILE *as_f; +#ifdef AS_DEBUG_FILE + FILE *as_debug; +#endif /* AS_DEBUG_FILE */ +}; + +void * +as_setup(server) + char *server; +{ + struct aslookup *asn; + struct hostent *he = NULL; + struct servent *se; + struct sockaddr_in in; + FILE *f; + int s; + + if (server == NULL) + server = DEFAULT_AS_SERVER; + + (void)memset(&in, 0, sizeof(in)); + in.sin_family = AF_INET; + in.sin_len = sizeof(in); + if ((se = getservbyname("whois", "tcp")) == NULL) { + warnx("warning: whois/tcp service not found"); + in.sin_port = ntohs(43); + } else + in.sin_port = se->s_port; + + if (inet_aton(server, &in.sin_addr) == 0 && + ((he = gethostbyname(server)) == NULL || + he->h_addr == NULL)) { + warnx("%s: %s", server, hstrerror(h_errno)); + return (NULL); + } + + if ((s = socket(PF_INET, SOCK_STREAM, 0)) == -1) { + warn("socket"); + return (NULL); + } + + do { + if (he != NULL) { + memcpy(&in.sin_addr, he->h_addr, he->h_length); + he->h_addr_list++; + } + if (connect(s, (struct sockaddr *)&in, sizeof(in)) == 0) + break; + if (he == NULL || he->h_addr == NULL) { + close(s); + s = -1; + break; + } + } while (1); + + if (s == -1) { + warn("connect"); + return (NULL); + } + + f = fdopen(s, "r+"); + (void)fprintf(f, "!!\n"); + (void)fflush(f); + + asn = malloc(sizeof(struct aslookup)); + if (asn == NULL) + (void)fclose(f); + else + asn->as_f = f; + +#ifdef AS_DEBUG_FILE + asn->as_debug = fopen(AS_DEBUG_FILE, "w"); + if (asn->as_debug) { + (void)fprintf(asn->as_debug, ">> !!\n"); + (void)fflush(asn->as_debug); + } +#endif /* AS_DEBUG_FILE */ + + return (asn); +} + +int +as_lookup(_asn, addr) + void *_asn; + struct in_addr *addr; +{ + struct aslookup *asn = _asn; + char buf[1024]; + int as, rc, dlen; + + as = rc = dlen = 0; + (void)fprintf(asn->as_f, "!r%s/32,l\n", inet_ntoa(*addr)); + (void)fflush(asn->as_f); + +#ifdef AS_DEBUG_FILE + if (asn->as_debug) { + (void)fprintf(asn->as_debug, ">> !r%s/32,l\n", + inet_ntoa(*addr)); + (void)fflush(asn->as_debug); + } +#endif /* AS_DEBUG_FILE */ + + while (fgets(buf, sizeof(buf), asn->as_f) != NULL) { + buf[sizeof(buf) - 1] = '\0'; + +#ifdef AS_DEBUG_FILE + if (asn->as_debug) { + (void)fprintf(asn->as_debug, "<< %s", buf); + (void)fflush(asn->as_debug); + } +#endif /* AS_DEBUG_FILE */ + + if (rc == 0) { + rc = buf[0]; + switch (rc) { + case 'A': + /* A - followed by # bytes of answer */ + sscanf(buf, "A%d\n", &dlen); +#ifdef AS_DEBUG_FILE + if (asn->as_debug) { + (void)fprintf(asn->as_debug, + "dlen: %d\n", dlen); + (void)fflush(asn->as_debug); + } +#endif /* AS_DEBUG_FILE */ + break; + case 'C': + case 'D': + case 'E': + case 'F': + /* C - no data returned */ + /* D - key not found */ + /* E - multiple copies of key */ + /* F - some other error */ + break; + } + if (rc == 'A') + /* skip to next input line */ + continue; + } + + if (dlen == 0) + /* out of data, next char read is end code */ + rc = buf[0]; + if (rc != 'A') + /* either an error off the bat, or a done code */ + break; + + /* data received, thank you */ + dlen -= strlen(buf); + + /* origin line is the interesting bit */ + if (as == 0 && strncasecmp(buf, "origin:", 7) == 0) { + sscanf(buf + 7, " AS%d", &as); +#ifdef AS_DEBUG_FILE + if (asn->as_debug) { + (void)fprintf(asn->as_debug, "as: %d\n", as); + (void)fflush(asn->as_debug); + } +#endif /* AS_DEBUG_FILE */ + } + } + + return (as); +} + +void +as_shutdown(_asn) + void *_asn; +{ + struct aslookup *asn = _asn; + + (void)fprintf(asn->as_f, "!q\n"); + (void)fclose(asn->as_f); + +#ifdef AS_DEBUG_FILE + if (asn->as_debug) { + (void)fprintf(asn->as_debug, ">> !q\n"); + (void)fclose(asn->as_debug); + } +#endif /* AS_DEBUG_FILE */ + + free(asn); +} diff --git a/contrib/whoisd/whoisd.pl b/contrib/whoisd/whoisd.pl index 67636c9..e1854a0 100755 --- a/contrib/whoisd/whoisd.pl +++ b/contrib/whoisd/whoisd.pl @@ -31,27 +31,30 @@ if($QUERY eq "!!\n") { $HACK=1; } -# ASNs -if($QUERY =~ m/^AS(.+?)$/) { - printf "%% AS section for %s\n", $QUERY; - my $AS=$1; - chdir("$RESDB/db/as") || die "%% error"; - if(chdir($AS) || die "%% error") { - foreach(split(/\n/,`grep '' -r .`)) { - $out = $_; - $out =~ s/^\.\///g; - $out =~ m/^(.+?):(.+?)$/; - ($title, $value) = ($1, $2); - printf "%-20s %s\n", $title . ":", $value; - if($title eq "owner") { - $QUERY = $value; +sub ASN_lookup { + if($QUERY =~ m/^AS(.+?)$/) { + printf "%% AS section for %s\n", $QUERY; + my $AS=$1; + chdir("$RESDB/db/as") || die "%% error"; + if(chdir($AS) || die "%% error") { + foreach(split(/\n/,`grep '' -r .`)) { + $out = $_; + $out =~ s/^\.\///g; + $out =~ m/^(.+?):(.+?)$/; + ($title, $value) = ($1, $2); + printf "%-20s %s\n", $title . ":", $value; + if($title eq "owner") { + $QUERY = $value; + } } + } else { + printf "AS not found."; } - } else { - printf "AS not found."; } } +ASN_lookup(); + # IPv4 addresses if($QUERY =~ m/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/) { printf "%% IP section for %s\n", $QUERY unless $HACK; @@ -74,7 +77,6 @@ if($QUERY =~ m/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0- } } - # if we get here and there's still a . in the query it is probably a domain. if($QUERY =~ m/\./) { printf "%% domain section for %s\n", $QUERY; @@ -102,34 +104,70 @@ if($QUERY =~ m/\./) { } } +#ipv6 addresses +#if($QUERY =~ m/:/) {#close enough? +# $QUERY =~ s/://g; +# $QUERY =~ s/[^a-fA-F0-9]//g; +# $QUERY = uc($QUERY); +# chdir("$RESDB/db/ip6"); +# foreach(split(//,$QUERY)) { +# chdir($_);; +# } +# foreach(split(/\n/,`grep '' -r .`)) { +# $out = $_; +# $out =~ s/^\.\///g; +# $out =~ m/^(.+?):(.+?)$/; +# ($title, $value) = ($1, $2); +# printf "%-20s %s\n", $title . ":", $value; +# if($title eq "owner") { +# $QUERY = $value; +# } +# } +#} + + # default to assuming it is a name. -printf "%% user section for '%s'\n", $QUERY unless $HACK; + printf "%% user section for '%s'\n", $QUERY unless $HACK; -chdir("$RESDB/db/usr") || die "%% error"; -if(chdir($QUERY)) { - foreach(split(/\n/,`grep '' -r .`)) { + chdir("$RESDB/db/usr") || die "%% error"; + if(chdir($QUERY)) { + foreach(split(/\n/,`grep '' -r .`)) { + $out = $_; + $out =~ s/^\.\///g; + $out =~ m/^(.+?):(.+?)$/; + ($title, $value) = ($1, $2); + printf "%-20s %s\n", $title . ":", $value unless $HACK; + } + } else { + printf "%-20s missing db/usr file.\n", "warning" . ":" unless $HACK; + } + chdir("$RESDB/db/as") || die "%% error"; + my @asn; + foreach(split(/\n/,`grep '^$QUERY\$' */owner | cut -d/ -f1`)) { $out = $_; - $out =~ s/^\.\///g; - $out =~ m/^(.+?):(.+?)$/; - ($title, $value) = ($1, $2); - printf "%-20s %s\n", $title . ":", $value unless $HACK; + $out =~ s/\n//g; + printf "%-20s AS%s\n", "origin" . ":", $out if $HACK; + printf "%-20s AS%s\n", "origin" . ":", $out unless $HACK; + @asn[scalar(@asn)]=$out; + } + chdir("$RESDB/db/ip") || die "%% error"; + my $merp; + foreach(split(/\n/,`grep '^$QUERY\$' */*/*/owner | cut -d/ -f1-3`)) { + $merp=`cat $_/cidr`; + chomp $merp; + printf "%-20s %s\n", "cidr" . ":", $merp; + } + + foreach(split(/\n/,`grep -i -e "^$QUERY\$" "$RESDB/db/dom"/*/*/owner`)) { + $out = $_; + $out =~ s/.*\/db\/dom\/(.+?)\/(.+?)\/owner.*/\2\.\1/; + if ($out ne "") { #fix this comparison. + printf "%-20s %s\n", "domain" . ":", $out; + } } -} else { - printf "%-20s missing db/usr file.\n", "warning" . ":" unless $HACK; -} -chdir("$RESDB/db/as") || die "%% error"; -foreach(split(/\n/,`grep '^$QUERY\$' */owner | cut -d/ -f1`)) { - $out = $_; - $out =~ s/\n//g; - printf "%-20s AS%s\n", "origin" . ":", $out if $HACK; - printf "%-20s AS%s\n", "origin" . ":", $out unless $HACK; -} -foreach(split(/\n/,`grep -i -e "^$QUERY\$" "$RESDB/db/dom"/*/*/owner`)) { - $out = $_; - $out =~ s/.*\/db\/dom\/(.+?)\/(.+?)\/owner.*/\2\.\1/; - if ($out ne "") { #fix this comparison. - printf "%-20s %s\n", "domain" . ":", $out; + foreach(@asn) { + $QUERY="AS$_"; #meh. fix to pass it instead of global. + ASN_lookup(); } -} -#printf "%-20s %s\n", "notice:","$QUERY did not claim any domains yet"; + #printf "%-20s %s\n", "notice:","$QUERY did not claim any domains yet"; |