chiark / gitweb /
Can suppress multiple glue warnings
authorianmdlvl <ianmdlvl>
Mon, 31 Dec 2001 15:16:56 +0000 (15:16 +0000)
committerianmdlvl <ianmdlvl>
Mon, 31 Dec 2001 15:16:56 +0000 (15:16 +0000)
scripts/named-conf
scripts/named-conf.8

index eefadcd..d863dfc 100755 (executable)
@@ -14,7 +14,7 @@ $mode= '';
 $etcfile= "/etc/bind/chiark-conf-gen.zones";
 $where= '<built-in>';
 $debug= 0;
-$needglue= 1;
+$needglue= 2;
 $localonly= 0;
 $verbosity= 1;
 
@@ -26,7 +26,7 @@ while (@ARGV && $ARGV[0] =~ m/^\-/) {
        last if m/^$/;
        if (m/^(yes|no|force)$/) { m/^./; $mode= $&; }
        elsif (m/^config$/) { $etcfile= loarg(); $where= '--config option'; }
-       elsif (m/^glueless$/) { $needglue=0; }
+       elsif (m/^glueless$/) { $needglue--; }
        elsif (m/^localonly$/) { $localonly=1; }
        elsif (m/^quiet$/) { $verbosity=0; }
        elsif (m/^verbose$/) { $verbosity=2; }
@@ -38,7 +38,7 @@ while (@ARGV && $ARGV[0] =~ m/^\-/) {
            if (s/^[ynf]//) { $mode=$&; }
            elsif (s/^C//) { $etcfile= soarg(); $where= '-C option'; }
            elsif (s/^D//) { $debug++; }
-           elsif (s/^g//) { $needglue=0; }
+           elsif (s/^g//) { $needglue--; }
            elsif (s/^l//) { $localonly=1; }
            elsif (s/^q//) { $verbosity=0; }
            elsif (s/^v//) { $verbosity=2; }
@@ -50,6 +50,8 @@ while (@ARGV && $ARGV[0] =~ m/^\-/) {
 sub loarg() { usageerr("missing option value") if !@ARGV; return shift @ARGV; }
 sub soarg() { my ($rv); $rv=$_; $_=''; return length $rv ? $rv : loarg(); }
 
+usageerr("-g may be specified at most twice") if $needglue<0;
+usageerr("-D may be specified at most twice") if $debug>2;
 usageerr("must specify either -f|-y|-n or zones (and not both)")
     if !!$mode == !!@ARGV;
 
@@ -252,7 +254,7 @@ use vars qw(%delgs); # $delgs{$nameserver_list} = [ $whosaidandwhy ]
 use vars qw(%auths); # $auths{$nameserver_list} = [ $whosaidandwhy ]
 use vars qw(%glue);  # $glue{$name}{$addr_list} = [ $whosaidandwhy ]
 use vars qw(%soas);  # $soa{"$origin $serial"} = [ $whosaidandwhy ]
-use vars qw(%addr_is_ok);
+use vars qw(%addr_is_ok %gluelesswarned);
 use vars qw(@to_check); # ($addr,$whyask,$is_auth,$glueless_ok, ...)
 use vars qw(@to_check_soa); # ($addr,$whyask, ...)
 
@@ -264,7 +266,7 @@ sub zone_check_full () {
 }
 
 sub zone_reset() {
-    %delgs= %auths= %glue= %soas= %addr_is_ok= ();
+    %delgs= %auths= %glue= %soas= %gluelesswarned= %addr_is_ok= ();
     @to_check= @to_check_soa= ();
 }
 
@@ -335,7 +337,8 @@ sub zone_check_nsrrset ($$$$) {
        @glue= @{ $s2g{$s} };
        if (!@glue) {
            zone_warning("glueless NS $s, from $ww")
-               unless $glueless_ok || !$needglue;
+               unless $glueless_ok || !$needglue ||
+                      ($needglue<=1 && $gluelesswarned{$s}++);
            next;
        }
        $glue= join ' ', sort @glue;
index 864324e..89833a1 100644 (file)
@@ -59,11 +59,15 @@ increase the debugging level.  (Maximum is
 .BR -DD .)
 .TP
 .BR \-g | \-\-glueless
-Do not warn about glueless referrals.  Not recommended.  Note that
-glueless referrals usually cause extra delays looking up names, and
-can make lookups fail even if in theory they could succeed.  There is
-no generally agreed convention or standard for avoiding circular
-glueless situations such as
+Warn only once about a glueless referral for each zone and server,
+rather than once for each parent which gave out a referral without
+glue.
+
+When repeated, do not warn about glueless referrals at all.  Not
+recommended.  Note that glueless referrals usually cause extra delays
+looking up names, and can make lookups fail even if in theory they
+could succeed.  There is no generally agreed convention or standard
+for avoiding circular glueless situations such as
 .br
 .B example.com NS ns0.example.net.uk
 .br