Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:paddg
dnswalk
dnswalk-20100325.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
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")
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor