diff options
| author | SeekingFor <SeekingFor@sfor.something> | 2013-11-01 15:53:43 +0000 | 
|---|---|---|
| committer | SeekingFor <SeekingFor@sfor.something> | 2013-11-01 15:53:43 +0000 | 
| commit | 2d36bc2b39072bf991aaec5b2b6d40dd33c4f046 (patch) | |
| tree | 0789805e80ddb6ad8abe10d03bddd563bbff57b2 /contrib | |
| parent | 384487ab14b45ecd40783ed2ddaa6ef433f542e6 (diff) | |
| parent | 1c0dfe1d6fbd33f24da3e8bad01acbb7565e6d3d (diff) | |
| download | resdb-2d36bc2b39072bf991aaec5b2b6d40dd33c4f046.tar.gz resdb-2d36bc2b39072bf991aaec5b2b6d40dd33c4f046.zip | |
Merge git://1.41.41.1
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"; | 
