X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=chiark-utils.git;a=blobdiff_plain;f=scripts%2Fnamed-conf;h=ba36757a41a33b4504e38dbd4bd9b34a38c460d4;hp=a031e32639306fc31a65fd775d2550a4e50e3bbb;hb=3bee7ab59141f811ec9bd2e41d5ae94ab8426055;hpb=cc33952a152bf96d0a78491e93e54b0f0774575c diff --git a/scripts/named-conf b/scripts/named-conf index a031e32..ba36757 100755 --- a/scripts/named-conf +++ b/scripts/named-conf @@ -286,8 +286,7 @@ sub process_zones (@) { eval { if ($localonly && $cfg->{'s'} =~ m/f/) { zone_warning("foreign zone specified with -l",''); - } elsif ($cfg->{'s'} =~ m/\*/ || - ($localonly && $cfg->{'s'} !~ m/p/)) { + } elsif ($localonly && $cfg->{'s'} !~ m/p/) { zone_check_local(); } else { zone_check_full(); @@ -352,28 +351,34 @@ sub zone_reset() { } sub zone_investigate() { - my ($super_zone, @super_nsnames, - $super_ns, @super_ns_addrs, $s, $wa, $name_if_auth, + my ($super_zone, @start_nsnames, $start_ww, + $start_ns, @start_ns_addrs, $s, $wa, $name_if_auth, %nsrrset_checked, %soa_checked, $addr, $glueless_ok, $rcode, $name, $is_ns); - $super_zone= $zone; - for (;;) { - debug_trace("zone $zone superzone $super_zone"); - $super_zone =~ s/^[^.]+\.// or die "no superzone ? ($super_zone)\n"; - ($rcode,@super_nsnames)= - lookup($super_zone,'ns-','06',"superzone search"); - last if !$rcode; + if ($cfg->{'s'} !~ m/\*/) { + $super_zone= $zone; + for (;;) { + debug_trace("zone $zone superzone $super_zone"); + $super_zone eq '.' + and die "no superzone ? ($super_zone)\n"; + $super_zone =~ s/^[^.]+\.// + or $super_zone= '.'; + ($rcode,@start_nsnames)= + lookup($super_zone,'ns-','06',"superzone search"); + last if !$rcode; + } + $start_ww= "server for $super_zone"; + } else { + ($rcode,@start_nsnames)= + lookup($zone,'ns-','0',"initial nameserver search"); + $start_ww= "nameserver for $zone"; } - for $super_ns (@super_nsnames) { - $super_ns= lc $super_ns; - ($rcode,@super_ns_addrs)= - lookup($super_ns,'a','0',"published nameserver"); - foreach $addr (@super_ns_addrs) { - push @to_check, - $addr, - "$super_ns, server for $super_zone", - undef, 0; + for $start_ns (@start_nsnames) { + $start_ns= lc $start_ns; + ($rcode,@start_ns_addrs)= lookup($start_ns,'a','0',"$start_ww"); + foreach $addr (@start_ns_addrs) { + push @to_check, $addr, "$start_ns, $start_ww", undef, 0; } } for (;;) { @@ -407,8 +412,7 @@ sub zone_check_nsrrset ($$$$) { $s2g{lc $dig_rdata} = [ ]; } elsif ($dig_type eq 'a' && exists $s2g{$dig_owner}) { $wwn= "in glue from $ww"; - push @to_check, $dig_rdata, "$dig_owner, $wwn", $dig_owner, 0; - zone_server_addr($dig_rdata,$dig_owner,$wwn,"NS [$uaddr]",0); + zone_server_queue($dig_rdata,$dig_owner,$wwn,"NS [$uaddr]",0); push @{ $s2g{$dig_owner} }, $dig_rdata; } }, @@ -427,13 +431,12 @@ sub zone_check_nsrrset ($$$$) { if (!@glue) { zone_warning("glueless NS $s", $ww) unless $glueless_ok || !$needglue || - grep { has_suffix_of($s,".$_"); } + grep { has_suffix_of($zone,".$_"); } @{ $cfg->{'conv_glueless'} }; ($rcode,@glue)= lookup($s,'a','0',"glueless NS from $ww"); foreach $a (@glue) { $wwn= "glueless NS from $ww"; - push @to_check, $a, "$s, $wwn", $s, 0; - zone_server_addr($a,$s,$wwn,"NS [$uaddr]",0); + zone_server_queue($a,$s,$wwn,"NS [$uaddr]",0); } } $glue= join ' ', sort @glue; @@ -461,6 +464,12 @@ sub zone_ns_name ($$) { @{ $cfg->{'self_ns'} }, @{ $cfg->{'self_soa'} }; } +sub zone_server_queue ($$$$$) { + my ($addr,$name,$wwn,$wwq,$is_soa) = @_; + zone_server_addr($addr,$name,$wwn,$wwq,$is_soa); + push @to_check, $addr, "$name, $wwn", $name, $is_soa; +} + sub zone_server_addr ($$$$$) { my ($addr,$name,$ww,$wwq,$is_soa) = @_; debug_trace("zone_server_addr ".join '|',@_); @@ -516,8 +525,7 @@ sub zone_check_soa ($$$$) { ($rcode,@soa_addrs)= lookup($origin,'a','0',"SOA ORIGIN"); $wwn= "SOA ORIGIN from $ww"; foreach $soa_addr (@soa_addrs) { - zone_server_addr($soa_addr,$origin,$wwn,"SOA [$uaddr]",1); - push @to_check, $soa_addr, "$origin, $wwn", $origin, 1; + zone_server_queue($soa_addr,$origin,$wwn,"SOA [$uaddr]",1); } } @@ -580,6 +588,7 @@ sub zone_servers_simplefind () { zone_ns_name($ns,"NS"); zone_server_simple($ns,'NS',0); } + $delgs{join ' ', sort @nsnames} = [ "zone's servers" ]; ($rcode,@soas)= lookup($zone,'soa','0',"SOA ORIGIN"); die "multiple SOA RRs in set! @soas ?" if @soas!=1; @@ -691,7 +700,7 @@ sub lookup ($$$$) { defined($c= open $h, "-|") or die "$quis: fork adnshost:\n $!\n"; if (!$c) { exec 'adnshost','-Fi','+Do','+Dt','+Dc','-Cf',"-t$type", - '-',"$domain."; + '-',"$domain"; die "$quis: exec adnshost:\n $!\n"; } @result= $h->getlines();