chiark / gitweb /
Bugfixes
authorianmdlvl <ianmdlvl>
Sat, 5 Jan 2002 01:15:28 +0000 (01:15 +0000)
committerianmdlvl <ianmdlvl>
Sat, 5 Jan 2002 01:15:28 +0000 (01:15 +0000)
scripts/named-conf

index 1f964edc7ebfb25843c396d4baa116f79c1e4ecd..dfabc82dc36f9e8c3b08bfb538fc2756c32d64ba 100755 (executable)
@@ -231,7 +231,7 @@ sub zone_conf ($$$$$@) {
     $zone_cfg{$zone}{'style_p'}= $style.$mod;
     $zone_cfg{$zone}{'s'}= $sabbr.$mod; # p)rimary s)econdary u)npub f)oreign
     $zone_cfg{$zone}{'servers'}= [ @servers ];
-    foreach $sfx (qw(self_soa self_ns self_addr forbid_addr)) {
+    foreach $sfx (qw(self_soa self_ns self_addr forbid_addr conv_glueless)) {
        { no strict 'refs'; $aref= [ @$sfx ]; }
        @$aref or cfg_fail("failed to specify $sfx before zone")
            if $sfx =~ m/^self/;
@@ -250,7 +250,7 @@ sub set_output($) {
 
 #-------------------- checking
 
-use vars qw($zone $cfg $warnings);
+use vars qw($zone $cfg $warnings %zone_warnings);
 $warnings= 0;
 
 sub progress ($) {
@@ -291,8 +291,16 @@ sub process_zones (@) {
        $output_contents{$$cfg{'output'}} .= zone_output()
            if $install;
     }
-    print STDERR "$quis: $warnings warnings\n" or die $!
-       if $warnings;
+    if ($warnings) {
+       printf STDERR ("%s: %d warning(s) in %d zone(s);".
+                      " %d zone(s) checked ok.\n",
+                      $quis,
+                      $warnings,
+                      scalar(keys %zone_warnings),
+                      scalar(@zones - keys %zone_warnings));
+    } else {
+       progress(sprintf "%d zone(s) checked ok", scalar @zones);
+    }
 }
 
 use vars qw(%delgs); # $delgs{$nameserver_list} = [ $whosaidandwhy ]
@@ -316,6 +324,7 @@ sub zone_warning ($$) {
     $w .= " ($o)" if length $o;
     print STDERR "$zone: warning: $w\n" or die $!;
     $warnings++;
+    $zone_warnings{$zone}++;
     return 1;
 }
 
@@ -403,12 +412,13 @@ sub zone_check_nsrrset ($$$$) {
     }
     @s= sort keys %s2g;
     foreach $s (@s) {
-       $delg_to_us=1 if grep { $s eq $_ } @{ $cfg->{'self_ns'} };
+       zone_ns_name($s,$ww);
        @glue= @{ $s2g{$s} };
        if (!@glue) {
            zone_warning("glueless NS $s", $ww)
                unless $glueless_ok || !$needglue ||
-                      grep { has_suffix_of($s,".$_"); } @conv_glueless;
+                      grep { has_suffix_of($s,".$_"); }
+                          @{ $cfg->{'conv_glueless'} };
            next;
        }
        $glue= join ' ', sort @glue;
@@ -419,21 +429,28 @@ sub zone_check_nsrrset ($$$$) {
     push @{ $delgs_or_auths->{$s} }, $ww;
 }
 
+sub zone_ns_name ($$) {
+    my ($name,$ww) = @_;
+    my ($cg);
+    $delg_to_us=1 if grep { $name eq $_ } @{ $cfg->{'self_ns'} };
+    foreach $cg (@{ $cfg->{'conv_glueless'} }) {
+       zone_warning("nameserver $name in serverless-glueless".
+                    " namespace area $cg",
+                    $ww)
+           if has_suffix_of(".$name",".$cg");
+    }
+    zone_warning("published server, as $name, but configured as stealth",
+                $ww)
+       if $cfg->{'s'} =~ m/u/ &&
+          grep { $_ eq $name }
+               @{ $cfg->{'self_ns'} }, @{ $cfg->{'self_soa'} };
+}
+
 sub zone_server_addr ($$$$$) {
     my ($addr,$name,$ww,$wwq,$is_soa) = @_;
-    my ($cg);
     debug_trace("zone_server_addr ".join '|',@_);
     $addr_is_ok{$addr}= "$name ($wwq)"
        if $is_soa || $cfg->{'s'} =~ m/u/;
-    foreach $cg (@conv_glueless) {
-       next unless has_suffix_of(".$name",".$cg");
-       zone_warning("nameserver [$addr] $name in serverless-glueless".
-                    " namespace area $cg",
-                    $ww);
-    }
-    zone_warning("configured as stealth but we [$addr] $name are published",
-                $ww)
-       if $cfg->{'s'} =~ m/u/ && grep { $_ eq $addr } @self_addr;
     zone_warning("forbidden nameserver address [$addr] $name",$ww)
        if grep { $_ eq $addr } @{ $cfg->{'forbid_addr'} };
 
@@ -542,7 +559,10 @@ sub zone_servers_simplefind () {
     my ($rcode,@nsnames,$ns,@soas,$origin);
 
     ($rcode,@nsnames)= lookup($zone,'ns-','0',"zone's servers");
-    foreach $ns (@nsnames) { zone_server_simple($ns,'NS',0); }
+    foreach $ns (@nsnames) {
+       zone_ns_name($ns,"NS");
+       zone_server_simple($ns,'NS',0);
+    }
 
     ($rcode,@soas)= lookup($zone,'soa','0',"SOA ORIGIN");
     die "multiple SOA RRs in set!  @soas ?" if @soas!=1;
@@ -638,8 +658,10 @@ sub debug_trace ($) {
 
 sub has_suffix_of ($$) {
     my ($whole,$suffix) = @_;
+    debug_trace("has_suffix_of $whole $suffix");
     return 0 if length $whole < length $suffix;
     return 0 if substr($whole, length($whole) - length($suffix)) ne $suffix;
+    debug_trace("has_suffix_of $whole $suffix YES");
     return 1;
 }
 
@@ -665,7 +687,6 @@ sub lookup ($$$$) {
     return ($?,@result);
 }
 
-
 sub dig (&$$$) {
     my ($eachrr, $qowner,$qtype,$qaddr) = @_;
     # also pseudo-rr with type `flags:'