added check for serial aa
Now we can ask the serial() to request aa answers.
--- a/lib/Nagios/Check/DNS/delegation.pm Fri Jan 16 16:42:13 2015 +0100
+++ b/lib/Nagios/Check/DNS/delegation.pm Mon Jan 19 10:33:29 2015 +0100
@@ -100,6 +100,7 @@
sub serial {
my $domain = shift;
my %resflags = (nameservers => \@extns, @_);
+ my $aa = delete $resflags{aa};
my $nameservers = join ',' => @{$resflags{nameservers}};
my $r = Net::DNS::Resolver->new(%resflags);
@@ -109,6 +110,7 @@
$q = $r->query($domain, 'SOA') and last;
}
die $r->errorstring, "\@$nameservers\n" if not $q;
+ die "no aa \@$nameservers\n" if $aa and not $q->header->aa;
return (map { $_->serial } grep { $_->type eq 'SOA' } $q->answer)[0];
}
@@ -126,26 +128,28 @@
my ($domain, $reference, $override) = @_;
my (@errs, @ns);
+ # obtain an authoritive list of nameservers from the reference server
my @our = eval { sort +ns($domain, nameservers => [$reference], aa => 1, override => $override) };
if (chomp $@) {
push @errs, $@;
push @our, $@;
}
- my @their = eval { sort +ns($domain) };
+ # obtain a list of nameservers from some public nameserver
+ my @public = eval { sort +ns($domain) };
if (chomp $@) {
push @errs, $@;
- push @their, $@;
+ push @public, $@;
}
- if (@errs or "@our" ne "@their") {
+ if (@errs or "@our" ne "@public") {
local $" = ', ';
- die sprintf "NS differ (%s: @our) vs (public: @their)\n",
+ die sprintf "NS differ (%s: @our) vs (public: @public)\n",
$override->{$domain} ? 'override' : 'our';
}
- @ns = uniq sort @our, @their;
+ @ns = uniq sort @our, @public;
### @ns
return @ns;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/t/20-serial-aa.t Mon Jan 19 10:33:29 2015 +0100
@@ -0,0 +1,15 @@
+#! perl
+use strict;
+use warnings;
+use Test::More;
+use Test::Exception;
+use Nagios::Check::DNS::delegation;
+
+throws_ok { serial('schlittermann.de',
+ nameservers => [qw/8.8.8.8 8.8.4.4/], aa => 1) }
+ qr/no aa/ => 'throws exception on no aa';
+
+ok serial('schlittermann.de', nameservers => [qw/212.80.235.130/])
+ => 'aa for serial';
+
+done_testing;