--- a/plugins/check_dns-serial Tue Dec 30 12:24:43 2014 +0100
+++ b/plugins/check_dns-serial Tue Dec 30 14:40:45 2014 +0100
@@ -44,8 +44,8 @@
use Getopt::Long qw(GetOptionsFromArray);
use Net::DNS;
use Pod::Usage;
+use Smart::Comments;
-my %resolver;
sub uniq { my %h; @h{@_} = (); return keys %h; }
# return a list of the zones known to the local
@@ -94,26 +94,30 @@
}
# return a list of "official" nameservers
-sub get_ns {
- my ($nameserver) = map { /^\@(.*)/ } $_[0] =~ /^\@/ ? shift : '@8.8.8.8';
- my ($domain) = @_;
+sub ns {
+ my $domain = shift;
+ ### assert: @_ % 2 == 0
+ my %resflags = (nameservers => [qw/8.8.8.8/], @_);
+ my $aa = delete $resflags{aa};
+ my $nameservers = $resflags{nameservers};
my @ns;
- my $r = $resolver{$nameserver} //=
- Net::DNS::Resolver->new(nameservers => [$nameserver]);
- my $q = $r->query($domain, 'NS') or die $r->errorstring, "\@$nameserver\n";
+ my $r = Net::DNS::Resolver->new(%resflags);
+ my $q = $r->query($domain, 'NS') or die $r->errorstring, "\@@$nameservers\n";
+
+ die "no aa @@$nameservers\n" if $aa and not $q->header->aa;
push @ns, map { $_->nsdname } grep { $_->type eq 'NS' } $q->answer;
return sort @ns;
}
-sub get_serial {
- my ($nameserver) = map { /^\@(.*)/ } $_[0] =~ /^\@/ ? shift : '@8.8.8.8';
- my ($domain) = shift;
+sub serial {
+ my $domain = shift;
+ my %resflags = (nameservers => [qw/8.8.8.8/], @_);
+ my $nameservers = $resflags{nameservers};
- my $r = $resolver{$nameserver} //=
- Net::DNS::Resolver->new(nameservers => [$nameserver]);
- my $q = $r->query($domain, 'SOA') or die $r->errorstring, "\@$nameserver\n";
+ my $r = Net::DNS::Resolver->new(%resflags);
+ my $q = $r->query($domain, 'SOA') or die $r->errorstring, "\@@$nameservers\n";
return (map { $_->serial } grep { $_->type eq 'SOA' } $q->answer)[0];
}
@@ -127,10 +131,10 @@
# CRITICAL - if the serial cannot be found at one of the sources
sub ns_ok {
- my ($reference, $domain) = @_;
+ my ($domain, $reference) = @_;
- my @our = sort eval { get_ns($reference, $domain) };
- my @their = sort +get_ns($domain);
+ my @our = sort +ns($domain, nameservers => [$reference], aa => 1);
+ my @their = sort +ns($domain);
{
local $" = "\0";
@@ -148,8 +152,6 @@
GetOptionsFromArray(
\@argv,
-## Please see file perltidy.ERR
-## Please see file perltidy.ERR
'reference=s' => \$opt_reference,
'progress!' => \$opt_progress,
'h|help' => sub { pod2usage(-verbose => 1, -exit => 0) },
@@ -168,7 +170,7 @@
my (@OK, %CRITICAL);
foreach my $domain (@domains) {
print STDERR "$domain " if $opt_progress;
- eval { ns_ok('@212.80.235.130', $domain) };
+ eval { ns_ok($domain, $opt_reference) };
if ($@) { $CRITICAL{$domain} = $@ }
else { push @OK, $domain }
say STDERR $@ ? 'not ok' : 'ok' if $opt_progress;