lib/Nagios/Check/DNS/delegation.pm
changeset 23 1eed74960c1c
parent 22 8fdd1e3a6bc3
child 24 d20452378ead
equal deleted inserted replaced
22:8fdd1e3a6bc3 23:1eed74960c1c
    98 }
    98 }
    99 
    99 
   100 sub serial {
   100 sub serial {
   101     my $domain = shift;
   101     my $domain = shift;
   102     my %resflags = (nameservers => \@extns, @_);
   102     my %resflags = (nameservers => \@extns, @_);
       
   103     my $aa = delete $resflags{aa};
   103     my $nameservers = join ',' => @{$resflags{nameservers}};
   104     my $nameservers = join ',' => @{$resflags{nameservers}};
   104 
   105 
   105     my $r = Net::DNS::Resolver->new(%resflags);
   106     my $r = Net::DNS::Resolver->new(%resflags);
   106     my $q;
   107     my $q;
   107 
   108 
   108     for (my $i = 3; $i; --$i) {
   109     for (my $i = 3; $i; --$i) {
   109         $q  = $r->query($domain, 'SOA') and last;
   110         $q  = $r->query($domain, 'SOA') and last;
   110     }
   111     }
   111     die $r->errorstring, "\@$nameservers\n" if not $q;
   112     die $r->errorstring, "\@$nameservers\n" if not $q;
       
   113     die "no aa \@$nameservers\n" if $aa and not $q->header->aa;
   112 
   114 
   113     return (map { $_->serial } grep { $_->type eq 'SOA' } $q->answer)[0];
   115     return (map { $_->serial } grep { $_->type eq 'SOA' } $q->answer)[0];
   114 }
   116 }
   115 
   117 
   116 # - the nameservers known from the ns records
   118 # - the nameservers known from the ns records
   124 
   126 
   125 sub ns_ok {
   127 sub ns_ok {
   126     my ($domain, $reference, $override) = @_;
   128     my ($domain, $reference, $override) = @_;
   127 
   129 
   128     my (@errs, @ns);
   130     my (@errs, @ns);
       
   131     # obtain an authoritive list of nameservers from the reference server
   129     my @our = eval { sort +ns($domain, nameservers => [$reference], aa => 1, override => $override) };
   132     my @our = eval { sort +ns($domain, nameservers => [$reference], aa => 1, override => $override) };
   130     if (chomp $@) {
   133     if (chomp $@) {
   131         push @errs, $@;
   134         push @errs, $@;
   132         push @our, $@;
   135         push @our, $@;
   133     }
   136     }
   134 
   137 
   135     my @their = eval { sort +ns($domain) };
   138     # obtain a list of nameservers from some public nameserver
       
   139     my @public = eval { sort +ns($domain) };
   136     if (chomp $@) {
   140     if (chomp $@) {
   137         push @errs, $@;
   141         push @errs, $@;
   138         push @their, $@;
   142         push @public, $@;
   139     }
   143     }
   140 
   144 
   141     if (@errs or "@our" ne "@their") {
   145     if (@errs or "@our" ne "@public") {
   142         local $" = ', ';
   146         local $" = ', ';
   143         die sprintf "NS differ (%s: @our) vs (public: @their)\n",
   147         die sprintf "NS differ (%s: @our) vs (public: @public)\n",
   144             $override->{$domain} ? 'override' : 'our';
   148             $override->{$domain} ? 'override' : 'our';
   145     
   149     
   146     }
   150     }
   147 
   151 
   148     @ns = uniq sort @our, @their;
   152     @ns = uniq sort @our, @public;
   149     ### @ns
   153     ### @ns
   150     return @ns;
   154     return @ns;
   151 }
   155 }
   152 
   156 
   153 sub serial_ok {
   157 sub serial_ok {