chiark / gitweb /
rationalise wrong soa warnings
[chiark-utils.git] / scripts / named-conf
index a54db8277c5c26adfbe4dff32435ab21535f9f8c..6117dcb7351d8d7f170c638d81edb77249107f57 100755 (executable)
@@ -306,14 +306,12 @@ sub zone_warning ($$) {
     my ($w,$o) = @_;
     my ($wk);
 
-    $wk= $w;
-    $wk =~ s/,.*// if !$repeat;
-    return 0 if $warned{$w}{$wk}++;
+    return 0 if !$repeat && $warned{$w}++;
 
     $w =~ s/\n$//;
     $w =~ s,\n, // ,g;
 
-    print STDERR "$zone: warning: $w\n" or die $!;
+    print STDERR "$zone: warning: $w ($o)\n" or die $!;
     $warnings++;
     return 1;
 }
@@ -378,8 +376,8 @@ sub zone_investigate() {
 sub zone_check_nsrrset ($$$$) {
     my ($uaddr,$wa, $is_auth, $glueless_ok) = @_;
     my (@s, $s, %s2g, @glue, $glue, $delgs_or_auths, $wwn, $ww);
-    verbose("checking delegation by $ww");
     $ww= "[$uaddr] $wa";
+    verbose("checking delegation by $ww");
     dig(sub {
        if ($dig_type eq 'ns' && $dig_owner eq $zone) {
            $s2g{lc $dig_rdata} = [ ];
@@ -395,14 +393,14 @@ sub zone_check_nsrrset ($$$$) {
        zone_warning("unable to find NS RRset at [$uaddr]", $wa);
        return;
     } elsif (keys %s2g == 1) {
-       zone_warning("only one nameserver",$ww);
+       zone_warning("only one nameserver ". (join '', keys %s2g),
+                    $ww);
     }
     @s= sort keys %s2g;
     foreach $s (@s) {
        @glue= @{ $s2g{$s} };
        if (!@glue) {
-           zone_warning("glueless NS $s,".($needglue<=1 ? " (eg)" : ""),
-                        $ww)
+           zone_warning("glueless NS $s", $ww)
                unless $glueless_ok || !$needglue ||
                       grep { has_suffix_of($s,".$_"); } @conv_glueless;
            next;
@@ -438,13 +436,20 @@ sub zone_server_addr ($$$$$) {
     $addr_is_self= grep { $_ eq $addr }
         @{ $cfg->{'self_addr'} };
     if ($name_is_self && !$addr_is_self) {
-       zone_warning("our name $name with wrong address [$addr]",$ww);
-    } elsif (!$name_is_self && $addr_is_self) {
-       zone_warning(($is_soa ? "SOA ORIGIN maps to" : "referral to").
-                    " us [$addr] with wrong name $name",
+       zone_warning("our $name supplied with wrong address [$addr]", $ww);
+    }
+    if (!$name_is_self && $addr_is_self) {
+       zone_warning("we [$addr] are named in ".
+                    ($is_soa ? "SOA" : "NS").
+                    " by wrong name $name",
                     $ww);
     }
-    $delg_to_us=1 if $name_is_self;
+    if (!$name_is_self && !$addr_is_self &&
+       $is_soa && $cfg->{'s'} =~ m/p/) {
+       zone_warning("SOA ORIGIN $name is not us (".
+                    (join ' ', @{ $cfg->{'self_soa'} }).")", $ww);
+    }
+    $delg_to_us=1 if $name_is_self || $addr_is_self;
 }
 
 sub zone_check_soa ($$$) {
@@ -485,17 +490,6 @@ sub zone_consistency() {
     }
     zone_consistency_set("SOA ORIGIN and SERIAL",\%soas);
     $self_soa= $cfg->{'self_soa'};
-    if ($cfg->{'s'} =~ m/p/) {
-       foreach $org_ser (keys %soas) {
-           $org_ser =~ m/^(\S+) \d+$/ or die "$org_ser ?";
-           $origin= $1;
-           next if grep { $_ eq $origin } @$self_soa;
-           foreach $wa (@{ $soas{$org_ser} }) {
-               zone_warning("SOA ORIGIN $origin is not our name (@$self_soa)",
-                            $wa);
-           }
-       }
-    }
 }
 
 sub zone_servers_ok () {
@@ -633,7 +627,7 @@ sub debug_trace ($) {
 }
 
 sub has_suffix_of ($$) {
-    my ($whole,$suffix);
+    my ($whole,$suffix) = @_;
     return 0 if length $whole < length $suffix;
     return 0 if substr($whole, length($whole) - length($suffix)) ne $suffix;
     return 1;