#!/usr/bin/perl # read /etc/bind/named.conf.zones and do an NS lookup on each of the zones. # complain when there's a lookup error -- or if none of the resulting records # contain ns.arctic.org. # Copyright (c) 2006 dean gaudet # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR # OTHER DEALINGS IN THE SOFTWARE. use warnings; use strict; use Net::DNS; my $match_ns = 'ns\.arctic\.org'; my $zonefile = "/etc/bind/named.conf.zones"; my $res = Net::DNS::Resolver->new; my $last_contact = ""; open(ZONES, "<$zonefile") or die "unable to open $zonefile for reading: $!\n"; while () { if (m#^// contact: (.*)#) { $last_contact = $1; } elsif (m#^zone "([^"]+)"#) { my $domain = $1; my $query = $res->query($domain, "NS"); if ($query) { my $matched = 0; my @nsrr = sort { $a <=> $b } grep { $_->type eq 'NS' } $query->answer; foreach my $rr (@nsrr) { if ($rr->nsdname =~ m#$match_ns#oi) { $matched = 1; last; } } unless ($matched) { print "$domain NS (".join(', ', map {$_->nsdname} @nsrr).") [contact: $last_contact]\n"; } } else { print "query '$domain NS' failed: ", $res->errorstring, " [contact: $last_contact]\n"; } } }