#!/usr/bin/perl -w use Net::DNS; sub getRRVal($) { my $rr = shift; my $retVal = ''; if ($rr->type eq 'A' or $rr->type eq 'AAAA') { $retVal = $rr->address; } elsif ($rr->type eq 'CNAME') { $retVal = $rr->cname; } elsif ($rr->type eq 'NS') { $retVal = $rr->nsdname; } elsif ($rr->type eq 'MX') { $retVal = $rr->exchange; # preference } elsif ($rr->type eq 'TXT') { $retVal = $rr->txtdata; } return $retVal; } my $resNS = Net::DNS::Resolver->new; $resNS->nameservers("ns.fjfi.cvut.cz"); my $resBR = Net::DNS::Resolver->new; $resBR->nameservers("beta.fjfi.cvut.cz"); my @zone = $resNS->axfr("fjfi.cvut.cz"); foreach $rr (@zone) { my $name = $rr->name; my $type = $rr->type; my $pkNS = $resNS->query($name, $type); my $pkBR = $resBR->query($name, $type); if (defined($pkNS) and defined($pkBR)) { # both defined my @rrNS = $pkNS->answer; my @rrBR = $pkBR->answer; foreach my $rrNS (@rrNS) { my $valNS = getRRVal($rrNS); if ($valNS ne '') { print "DEBUG: valNS - " . $valNS . "\n"; my $ok = 0; foreach my $rrBR (@rrBR) { my $valBR = getRRVal($rrBR); print "DEBUG: valBR - " . $valBR . ($valBR eq $valNS) . "\n"; if ($valBR ne '' and $valBR eq $valNS) { $ok = 1; } } print "ERROR: $name ($type) different: $valNS is not in BR\n" if $ok == 0; } } foreach my $rrNS (@rrBR) { my $valNS = getRRVal($rrNS); if ($valNS ne '') { print "DEBUG: valNS - " . $valNS . "\n"; my $ok = 0; foreach my $rrBR (@rrNS) { my $valBR = getRRVal($rrBR); print "DEBUG: valBR - " . $valBR . ($valBR eq $valNS) . "\n"; if ($valBR ne '' and $valBR eq $valNS) { $ok = 1; } } print "ERROR: $name ($type) different: $valNS is not in NS\n" if $ok == 0; } } } elsif (defined($pkNS) or defined($pkBR)) { # one undef... print "ERROR: $name ($type) defined only in "; print "NS" if defined($pkNS); print "BR" if defined($pkBR); print "\n"; } else { # both undef? print "ERROR: check error for $name (both undef?)\n"; } }