File dnswalk-20100325.patch of Package dnswalk
--- dnswalk-2.0.2/dnswalk 1997-10-06 15:24:00.000000000 +0200
+++ dnswalk-2.0.2/dnswalk 2013-04-15 21:09:37.000000000 +0200
@@ -1,9 +1,9 @@
-#!/usr/contrib/bin/perl
+#!/usr/bin/perl
#
# dnswalk Walk through a DNS tree, pulling out zone data and
# dumping it in a directory tree
#
-# $Id: dnswalk,v 1.18 1997/10/06 13:23:58 barr Exp barr $
+# $Id: dnswalk,v 1.3 2010-03-25 01:36:37-10 tony Exp $
#
# check data collected for legality using standard resolver
#
@@ -21,6 +21,8 @@
use Getopt::Std;
use IO::Socket;
use Net::DNS;
+use Net::IP;
+use Socket6;
getopts("D:rfiadmFl");
@@ -86,10 +88,10 @@
@zone=$res->axfr($domain);
unless (defined(@zone) && @zone) {
print STDERR "failed\n";
- &printerr("FAIL",
- "Zone transfer of $domain from $server failed: ".
- $res->errorstring. "\n");
- next SERVER;
+ &printerr("FAIL",
+ "Zone transfer of $domain from $server failed: "
+ . $res->errorstring . "\n");
+ next SERVER;
}
@subdoms=undef;
foreach $rr (@zone) {
@@ -125,8 +127,8 @@
return if (!$domain);
$res = new Net::DNS::Resolver;
$ns_req = $res->query($domain, "NS");
- &printerr("FAIL", "No nameservers found for $domain: ".
- $res->errorstring ."\n")
+ &printerr("FAIL", "No nameservers found for $domain: " .
+ $res->errorstring . "\n")
unless (defined($ns_req) and ($ns_req->header->ancount > 0));
foreach $ns ($ns_req->answer) {
$ns_tmp = $ns->nsdname;
@@ -150,8 +152,8 @@
my ($packet) = new Net::DNS::Packet($zone, "SOA", "IN");
my ($soa_req) = $res->send($packet);
unless (defined($soa_req)) {
- &printerr("FAIL", "Cannot get SOA record for $zone:".
- $res->errorstring ."\n");
+ &printerr("FAIL", "Cannot get SOA record for $zone:" .
+ $res->errorstring . "\n");
return "";
}
unless (($soa_req->header->ancount >= 1) &&
@@ -174,66 +176,62 @@
local (@keys); # temp variable
foreach $rr (@zone) {
# complain about invalid chars only for mail names
- if ((($rr->type eq "A") || ($rr->type eq "MX")) && (!$opt_i) &&
+ if ((($rr->type eq "A") || ($rr->type eq "AAAA") ||
+ ($rr->type eq "MX")) &&
+ (!$opt_i) &&
($rr->name =~ /[^\*][^-A-Za-z0-9.]/)) {
- &printerr("WARN", $rr->name .": invalid character(s) in name\n");
+ &printerr("WARN", $rr->name . ": invalid character(s) in name\n");
}
if ($rr->type eq "SOA") {
print STDERR 's' if $opt_d;
- print "SOA=". $rr->mname ." contact=". $rr->rname ."\n";
+ print "SOA=" . $rr->mname . " contact=" . $rr->rname . "\n";
# basic address check. No "@", and user.dom.ain (two or more dots)
if (($rr->rname =~ /@/)||!($rr->rname =~ /\..*\./)) {
- &printerr("WARN", "SOA contact name (".
- $rr->rname .") is invalid\n");
+ &printerr("WARN", "SOA contact name (" . $rr->rname .
+ ") is invalid\n");
}
} elsif ($rr->type eq "PTR") {
print STDERR 'p' if $opt_d;
- if (scalar((@keys=split(/\./,$rr->name))) == 6 ) {
+ @keys = split(/\./, $rr->name);
+ if (scalar(@keys) == 6 || scalar(@keys) == 34) {
+ $af = (scalar(@keys) == 6) ? AF_INET : AF_INET6;
# check if forward name exists, but only if reverse is
# a full IP addr
- # skip ".0" networks
- if ($keys[0] ne "0") {
- ($name, $aliases, $addrtype, $length,
- @addrs)=gethostbyname($rr->ptrdname);
-# if (!(($name, $aliases, $addrtype, $length,
-# @addrs)=gethostbyname($rr->ptrdname))) {
-# &printerr("FAIL", "gethostbyname(".
-# $rr->ptrdname ."): $!\n");
-# }
-# else {
- if (!$name) {
- &printerr("WARN", $rr->name
- ." PTR ". $rr->ptrdname .": unknown host\n");
- }
- elsif (!&equal($name,$rr->ptrdname)) {
- &printerr("WARN", $rr->name
- ." PTR ". $rr->ptrdname .": CNAME (to $name)\n");
- }
- elsif (!&matchaddrlist($rr->name)) {
- &printerr("WARN", $rr->name
- ." PTR ". $rr->ptrdname .": A record not found\n");
- }
-# }
+ ($name, $aliases, $addrtype, $length, @addrs) =
+ gethostbyname($rr->ptrdname);
+ if (!$name) {
+ &printerr("WARN", $rr->name . " PTR " . $rr->ptrdname .
+ ": unknown host\n");
+ }
+ elsif (!&equal($name,$rr->ptrdname)) {
+ &printerr("WARN", $rr->name . " PTR " . $rr->ptrdname .
+ ": CNAME (to $name)\n");
+ }
+ elsif (!&matchaddrlist($rr->name)) {
+ $t = ($af == AF_INET) ? "A" : "AAAA";
+ &printerr("WARN", $rr->name . " PTR " . $rr->ptrdname .
+ ": $t record not found\n");
}
}
- } elsif (($rr->type eq "A") ) {
+ } elsif ($rr->type eq "A" || $rr->type eq "AAAA") {
print STDERR 'a' if $opt_d;
+ $af = ($rr->type eq "A") ? AF_INET : AF_INET6;
# check to see that a reverse PTR record exists
- ($name,$aliases,$addrtype,$length,@addrs)=gethostbyaddr(pack('C4',
- split(/\./,$rr->address)),2);
+ ($name, $aliases, $addrtype, $length, @addrs) =
+ gethostbyaddr(inet_pton($af, $rr->address), $af);
if (!$name) {
# hack - allow RFC 1101 netmasks encoding
if ($rr->address !=~ /^255/) {
- &printerr("WARN", $rr->name ." A ".
- $rr->address .": no PTR record\n");
+ &printerr("WARN", $rr->name . " " . $rr->type . " " .
+ $rr->address . ": no PTR record\n");
}
}
elsif ($opt_F && !&equal($name,$rr->name)) {
# Filter out "hostname-something" (like "neptune-le0")
if (index(split (/\./, $rr->name, 2) . "-",
split (/\./, $name, 2)) == -1 ) {
- &printerr("WARN", $rr->name ." A ".
- $rr->address .": points to $name\n")
+ &printerr("WARN", $rr->name . " " . $rr->type . " " .
+ $rr->address . ": points to $name\n")
if ((split(/\./,$name))[0] ne "localhost");
}
}
@@ -244,8 +242,9 @@
}
elsif (($glues{$rr->address} eq $rr->name) &&
(!&equal($lastns,$domain))) {
- &printerr("WARN", $rr->name
- .": possible duplicate A record (glue of $lastns?)\n");
+ &printerr("WARN", $rr->name .
+ ": possible duplicate " . $rr->type .
+ " record (glue of $lastns?)\n");
}
}
} elsif ($rr->type eq "NS") {
@@ -254,69 +253,51 @@
# check to see if object of NS is real
&checklamer($rr->name,$rr->nsdname) if ($main'opt_l);
# check for bogusnesses like NS->IP addr
- if (&isipv4addr($rr->nsdname)) {
- &printerr("BAD", $rr->name
- ." NS ". $rr->nsdname .": Nameserver must be a hostname\n");
+ if (&isipaddr($rr->nsdname)) {
+ &printerr("BAD", $rr->name . " NS " . $rr->nsdname .
+ ": Nameserver must be a hostname\n");
}
($name, $aliases, $addrtype, $length,
@addrs)=gethostbyname($rr->nsdname);
-# if (!(($name, $aliases, $addrtype, $length,
-# @addrs)=gethostbyname($rr->nsdname))) {
-# &printerr("FAIL", "gethostbyname(". $rr->nsdname ."): $!\n");
-# }
-# else {
- if (!$name) {
- &printerr("BAD", $rr->name
- ." NS ". $rr->nsdname .": unknown host\n");
- } elsif (!&equal($name,$rr->nsdname)) {
- &printerr("BAD", $rr->name
- ." NS ". $rr->nsdname .": CNAME (to $name)\n");
- }
-# }
+ if (!$name) {
+ &printerr("BAD", $rr->name . " NS " . $rr->nsdname .
+ ": unknown host\n");
+ } elsif (!&equal($name,$rr->nsdname)) {
+ &printerr("BAD", $rr->name . " NS " . $rr->nsdname .
+ ": CNAME (to $name)\n");
+ }
} elsif ($rr->type eq "MX") {
print STDERR 'm' if $opt_d;
# check to see if object of mx is real
- if (&isipv4addr($rr->exchange)) {
- &printerr("BAD", $rr->name
- ." MX ". $rr->exchange .": Mail exchange must be a hostname\n");
+ if (&isipaddr($rr->exchange)) {
+ &printerr("BAD", $rr->name . " MX " . $rr->exchange .
+ ": Mail exchange must be a hostname\n");
}
($name, $aliases, $addrtype, $length,
@addrs)=gethostbyname($rr->exchange);
-# if (!(($name, $aliases, $addrtype, $length,
-# @addrs)=gethostbyname($rr->exchange))) {
-# &printerr("FAIL", "gethostbyname(". $rr->exchange ."): $!\n");
-# }
-# else {
- if (!$name) {
- &printerr("WARN", $rr->name
- ." MX ". $rr->exchange .": unknown host\n");
- }
- elsif (!&equal($name,$rr->exchange)) {
- &printerr("WARN", $rr->name
- ." MX ". $rr->exchange .": CNAME (to $name)\n");
- }
-# }
+ if (!$name) {
+ &printerr("WARN", $rr->name . " MX " . $rr->exchange .
+ ": unknown host\n");
+ }
+ elsif (!&equal($name,$rr->exchange)) {
+ &printerr("WARN", $rr->name . " MX " . $rr->exchange .
+ ": CNAME (to $name)\n");
+ }
} elsif ($rr->type eq "CNAME") {
print STDERR 'c' if $opt_d;
($name, $aliases, $addrtype, $length,
@addrs)=gethostbyname($rr->cname);
- if (&isipv4addr($rr->cname)) {
- &printerr("BAD", $rr->name
- ." CNAME ". $rr->cname .": alias must be a hostname\n");
+ if (&isipaddr($rr->cname)) {
+ &printerr("BAD", $rr->name . " CNAME " . $rr->cname .
+ ": alias must be a hostname\n");
}
-# if (!(($name, $aliases, $addrtype, $length,
-# @addrs)=gethostbyname($rr->cname))) {
-# &printerr("FAIL", "gethostbyname(". $rr->cname ."): $!\n");
-# }
-# else {
- if (!$name) {
- &printerr("WARN", $rr->name
- ." CNAME ". $rr->cname .": unknown host\n");
- } elsif (!&equal($name,$rr->cname)) {
- &printerr("WARN", $rr->name
- ." CNAME ". $rr->cname .": CNAME (to $name)\n");
- }
-# }
+ if (!$name) {
+ &printerr("WARN", $rr->name . " CNAME " . $rr->cname .
+ ": unknown host\n");
+ } elsif (!&equal($name,$rr->cname)) {
+ &printerr("WARN", $rr->name . " CNAME " . $rr->cname .
+ ": CNAME (to $name)\n");
+ }
}
}
print STDERR "\n" if $opt_d;
@@ -353,17 +334,21 @@
return ($one eq $two);
}
-# check if argument looks like an IPv4 address
-sub isipv4addr {
- my ($host)=$_[0];
- my ($one,$two,$three,$four);
- ($one,$two,$three,$four)=split(/\./,$host);
- my $whole="$one$two$three$four";
- # strings evaluated as numbers are zero
- return (($whole+0) eq $whole);
+# check if argument looks like an IP address
+sub isipaddr {
+ my $ip = new Net::IP($_[0]) || return 0;
+ return $ip->version;
}
sub matchaddrlist {
- local($match)=pack('C4', reverse(split(/\./,$_[0],4)));
+ local(@x) = reverse( split(/\./, $_[0]) );
+ shift @x;
+ local($arpatype) = shift @x;
+ if ($arpatype =~ /in-addr/i) {
+ $match = pack('C4', @x);
+ }
+ else {
+ $match = pack('H32', join('', @x));
+ }
local($found)=0;
foreach $i (@addrs) {
$found=1 if ($i eq $match);
@@ -398,14 +383,14 @@
my ($soa_req);
my ($res) = new Net::DNS::Resolver;
unless ($res->nameservers($nameserver)) {
- &printerr("FAIL", "Cannot find address for nameserver: ".
- $res->errorstring. "\n");
+ &printerr("FAIL", "Cannot find address for nameserver: " .
+ $res->errorstring . "\n");
}
$soa_req = $res->send($packet);
unless (defined($soa_req)) {
&printerr("FAIL",
- "Cannot get SOA record for $zone from $nameserver (lame?): ".
- $res->errorstring ."\n");
+ "Cannot get SOA record for $zone from $nameserver (lame?): "
+ . $res->errorstring . "\n");
return;
}
&printerr("BAD", "$zone NS $nameserver: lame NS delegation\n")