chiark / gitweb /
Many fixes.
authorianmdlvl <ianmdlvl>
Mon, 31 Dec 2001 18:18:10 +0000 (18:18 +0000)
committerianmdlvl <ianmdlvl>
Mon, 31 Dec 2001 18:18:10 +0000 (18:18 +0000)
scripts/named-conf
scripts/named-conf.8

index 3ea8d08fcf7ef613534fe2c8259d0d4d1b1ecaf7..506b5b16358d70add6132533524881bde082bb39 100755 (executable)
@@ -84,8 +84,8 @@ $slave_dir= 'slave';
 $slave_prefix= '';
 $slave_suffix= '';
 
 $slave_prefix= '';
 $slave_suffix= '';
 
-use vars qw(@self_ns @self_soa);
-@self_ns= @self_soa= ();
+use vars qw(@self_ns @self_soa @self_addr);
+@self_ns= @self_soa= @self_addr= ();
 
 use vars qw(%zone_cfg @zone_cfg_list);
 %zone_cfg= ();
 
 use vars qw(%zone_cfg @zone_cfg_list);
 %zone_cfg= ();
@@ -113,7 +113,7 @@ sub cfg_fail ($) { die "$quis: $where:\n $_[0]\n"; }
 
 sub read_config ($) {
     my ($if) = @_;
 
 sub read_config ($) {
     my ($if) = @_;
-    my ($fh,$z,@self, $dir,$prefix,$suffix,$lprefix,$lsuffix);
+    my ($fh,$z,@self, $mod,$dir,$prefix,$suffix,$lprefix,$lsuffix);
     local ($_);
 
     $fh= new IO::File $if,'r' or cfg_fail("open $if:\n $!");
     local ($_);
 
     $fh= new IO::File $if,'r' or cfg_fail("open $if:\n $!");
@@ -132,7 +132,7 @@ sub read_config ($) {
            @self_ns= @self if $1 ne '-soa';
            @self_soa= @self if $1 ne '-ns';
        } elsif (m/^self\-addr\s+([0-9. \t]+)/) {
            @self_ns= @self if $1 ne '-soa';
            @self_soa= @self if $1 ne '-ns';
        } elsif (m/^self\-addr\s+([0-9. \t]+)/) {
-           @self_addr= split /\s+/, $2;
+           @self_addr= split /\s+/, $1;
        } elsif (m/^primary\-dir([*?]?)\s+(\S+)((?:\s+(\S+))?:\s+(\S+))?$/) {
            ($mod, $dir, $prefix, $suffix) = ($1,qualify($2),$3,$4);
            $suffix= '_db' if !defined $suffix;
        } elsif (m/^primary\-dir([*?]?)\s+(\S+)((?:\s+(\S+))?:\s+(\S+))?$/) {
            ($mod, $dir, $prefix, $suffix) = ($1,qualify($2),$3,$4);
            $suffix= '_db' if !defined $suffix;
@@ -145,15 +145,15 @@ sub read_config ($) {
                next unless substr($_,0,$lprefix) eq $prefix;
                next unless substr($_,length($_)-$lsuffix) eq $suffix;
                $z= substr($_,$lprefix,length($_)-($lprefix+$lsuffix));
                next unless substr($_,0,$lprefix) eq $prefix;
                next unless substr($_,length($_)-$lsuffix) eq $suffix;
                $z= substr($_,$lprefix,length($_)-($lprefix+$lsuffix));
-               zone_conf($z,'primary',"p$mod","$dir/$_");
+               zone_conf($z,'primary','p',$mod,"$dir/$_");
            }
            closedir D or cfg_fail("close primary-dir $dir:\n $!");
        } elsif (m/^primary([*?]?)\s+(\S+)\s+(\S+)$/) {
            }
            closedir D or cfg_fail("close primary-dir $dir:\n $!");
        } elsif (m/^primary([*?]?)\s+(\S+)\s+(\S+)$/) {
-           zone_conf($2,'primary',"p$1",qualify($3));
+           zone_conf($2,'primary','p',$1,qualify($3));
        } elsif (m/^published([*?]?)\s+(\S+)\s+([0-9.\t]+)$/) {
        } elsif (m/^published([*?]?)\s+(\S+)\s+([0-9.\t]+)$/) {
-           zone_conf($2,'published',"s$1",'',$3);
+           zone_conf($2,'published','s',$1,'',$3);
        } elsif (m/^stealth([*?]?)\s+(\S+)\s+([0-9. \t]+)$/) {
        } elsif (m/^stealth([*?]?)\s+(\S+)\s+([0-9. \t]+)$/) {
-           zone_conf($2,'stealth',"u$1",'',split /\s+/, $3);
+           zone_conf($2,'stealth','u',$1,'',split /\s+/, $3);
        } elsif (m/^slave\-dir\s+(\S+)((?:\s+(\S+))?:\s+(\S+))?$/) {
            ($slave_dir, $slave_prefix, $slave_suffix) = (qualify($1),$2,$3);
        } elsif (m/^output\s+bind8\+(\S+)$/) {
        } elsif (m/^slave\-dir\s+(\S+)((?:\s+(\S+))?:\s+(\S+))?$/) {
            ($slave_dir, $slave_prefix, $slave_suffix) = (qualify($1),$2,$3);
        } elsif (m/^output\s+bind8\+(\S+)$/) {
@@ -176,8 +176,9 @@ sub qualify ($) {
     return $i;
 }
 
     return $i;
 }
 
-sub zone_conf ($$$@) {
-    my ($zone,$style,$s,$file,@servers) = @_;
+sub zone_conf ($$$$$@) {
+    my ($zone,$style,$sabbr,$mod,$file,@servers) = @_;
+    my ($sfx,$aref);
     $file= qualify("$slave_dir/$slave_prefix".$zone.$slave_suffix)
        unless length $file;
     if (!length $output) {
     $file= qualify("$slave_dir/$slave_prefix".$zone.$slave_suffix)
        unless length $file;
     if (!length $output) {
@@ -188,10 +189,13 @@ sub zone_conf ($$$@) {
     cfg_fail("redefined zone $zone") if exists $zone_cfg{$zone};
     $zone_cfg{$zone}{'file'}= $file;
     $zone_cfg{$zone}{'style_p'}= $style.$mod;
     cfg_fail("redefined zone $zone") if exists $zone_cfg{$zone};
     $zone_cfg{$zone}{'file'}= $file;
     $zone_cfg{$zone}{'style_p'}= $style.$mod;
-    $zone_cfg{$zone}{'s'}= $s; # p)rimary s)econdary u)npublished f)oreign
+    $zone_cfg{$zone}{'s'}= $sabbr.$mod; # p)rimary s)econdary u)npub f)oreign
     $zone_cfg{$zone}{'servers'}= [ @servers ];
     $zone_cfg{$zone}{'servers'}= [ @servers ];
-    $zone_cfg{$zone}{'self_soa'}= [ @self_soa ];
-    $zone_cfg{$zone}{'self_ns'}= [ @self_ns ];
+    foreach $sfx (qw(soa ns addr)) {
+       $aref= [ @{ "self_$sfx" } ];
+       @$aref or cfg_fail("failed to specify self-$sfx before zone");
+       $zone_cfg{$zone}{'self_soa'}= $aref;
+    }
     $zone_cfg{$zone}{'output'}= $output;
     push @zone_cfg_list, $zone;
 }
     $zone_cfg{$zone}{'output'}= $output;
     push @zone_cfg_list, $zone;
 }
@@ -229,7 +233,7 @@ sub process_zones (@) {
            'servers' => [ ],
            };
        progress(sprintf "%-40s %s", $zone, $$cfg{'style_p'});
            'servers' => [ ],
            };
        progress(sprintf "%-40s %s", $zone, $$cfg{'style_p'});
-       if ($check && ($doall || $cfg{'s'} !~ m/\?/)) {
+       if ($check && ($doall || $cfg->{'s'} !~ m/\?/)) {
            eval {
                if ($localonly && $cfg->{'s'} =~ m/f/) {
                    zone_warning("foreign zone specified with -l");
            eval {
                if ($localonly && $cfg->{'s'} =~ m/f/) {
                    zone_warning("foreign zone specified with -l");
@@ -334,7 +338,7 @@ sub zone_check_nsrrset ($$$$) {
                 $dig_rdata,
                 "$dig_owner, in glue from $ww",
                 1, 0;
                 $dig_rdata,
                 "$dig_owner, in glue from $ww",
                 1, 0;
-           zone_server_addr($dig_rdata,$dig_owner,"NS [$uaddr]");
+           zone_server_addr($dig_rdata,$dig_owner,"NS [$uaddr]",0);
            push @{ $s2g{$dig_owner} }, $dig_rdata;
        }
     },
            push @{ $s2g{$dig_owner} }, $dig_rdata;
        }
     },
@@ -363,13 +367,16 @@ sub zone_check_nsrrset ($$$$) {
 sub zone_server_addr ($$$$) {
     my ($addr,$name,$ww,$is_soa) = @_;
     $addr_is_ok{$addr}= "$name ($ww)"
 sub zone_server_addr ($$$$) {
     my ($addr,$name,$ww,$is_soa) = @_;
     $addr_is_ok{$addr}= "$name ($ww)"
-       if $is_soa || $cfg{'s'} =~ m/u/;
+       if $is_soa || $cfg->{'s'} =~ m/u/;
     zone_warning("configured as stealth but we [$addr]".
                 " are published ($name $ww)")
        if $cfg->{'s'} =~ m/u/ && grep { $_ eq $addr } @self_addr;
 
     zone_warning("configured as stealth but we [$addr]".
                 " are published ($name $ww)")
        if $cfg->{'s'} =~ m/u/ && grep { $_ eq $addr } @self_addr;
 
-    $name_is_self= grep { $_ eq $name } ($is_soa ? @self_soa : @self_ns);
-    $addr_is_self= grep { $_ eq $addr } @self_addr;
+    my ($name_is_self, $addr_is_self);
+    $name_is_self= grep { $_ eq $name }
+        @{ $cfg->{$is_soa ? 'self_soa' : 'self_ns'} };
+    $addr_is_self= grep { $_ eq $addr }
+        @{ $cfg->{'self_addr'} };
     if ($name_is_self && !$addr_is_self) {
        zone_warning("our name $name has wrong address $addr ($ww)");
     } elsif (!$name_is_self && $addr_is_self) {
     if ($name_is_self && !$addr_is_self) {
        zone_warning("our name $name has wrong address $addr ($ww)");
     } elsif (!$name_is_self && $addr_is_self) {
@@ -400,7 +407,7 @@ sub zone_check_soa ($$) {
     push @{ $soas{$got} }, $ww;
     ($rcode,@soa_addrs)= lookup($origin,'a','0');
     foreach $soa_addr (@soa_addrs) {
     push @{ $soas{$got} }, $ww;
     ($rcode,@soa_addrs)= lookup($origin,'a','0');
     foreach $soa_addr (@soa_addrs) {
-       zone_server_addr($addr,$origin,"SOA [$uaddr]"
+       zone_server_addr($soa_addr,$origin,"SOA [$uaddr]",1);
        push @to_check,
             $soa_addr,
              "$origin, SOA ORIGIN from $ww";
        push @to_check,
             $soa_addr,
              "$origin, SOA ORIGIN from $ww";
@@ -408,7 +415,7 @@ sub zone_check_soa ($$) {
 }
 
 sub zone_consistency() {
 }
 
 sub zone_consistency() {
-    my ($d, $org_ser, $origin, $a, $h);
+    my ($d, $org_ser, $origin, $a, $h, $self_soa);
     zone_consistency_set('delegations',\%delgs);
     foreach $d (keys %delgs) { delete $auths{$d}; }
     zone_consistency_set('zone nameserver rrset',\%auths);
     zone_consistency_set('delegations',\%delgs);
     foreach $d (keys %delgs) { delete $auths{$d}; }
     zone_consistency_set('zone nameserver rrset',\%auths);
@@ -416,12 +423,13 @@ sub zone_consistency() {
        zone_consistency_set("glue for $h", $glue{$h});
     }
     zone_consistency_set("SOA ORIGIN and SERIAL",\%soas);
        zone_consistency_set("glue for $h", $glue{$h});
     }
     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;
     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;
-           zone_warning("our name (@self_soa) not in SOA ORIGIN $origin,".
+           next if grep { $_ eq $origin } @$self_soa;
+           zone_warning("our name (@$self_soa) not in SOA ORIGIN $origin,".
                         " eg from ".((values %{ $soas{$org_ser} })[1]));
        }
     }
                         " eg from ".((values %{ $soas{$org_ser} })[1]));
        }
     }
@@ -464,19 +472,19 @@ sub zone_servers_simplefind () {
     my ($rcode,@nsnames,$ns,@soas,$origin);
 
     ($rcode,@nsnames)= lookup($zone,'ns-','0');
     my ($rcode,@nsnames,$ns,@soas,$origin);
 
     ($rcode,@nsnames)= lookup($zone,'ns-','0');
-    foreach $ns (@nsnames) { zone_server_simple($ns,'NS'); }
+    foreach $ns (@nsnames) { zone_server_simple($ns,'NS',0); }
 
     ($rcode,@soas)= lookup($zone,'soa','0');
     die "multiple SOA RRs in set!  @soas ?" if @soas!=1;
     $soas[0] =~ m/^(\S+)\s/ or die "SOA ? $_";
 
     ($rcode,@soas)= lookup($zone,'soa','0');
     die "multiple SOA RRs in set!  @soas ?" if @soas!=1;
     $soas[0] =~ m/^(\S+)\s/ or die "SOA ? $_";
-    zone_server_simple(domain_canon($1),'SOA');
+    zone_server_simple(domain_canon($1),'SOA',1);
 }
 
 }
 
-sub zone_server_simple ($$) {
-    my ($name,$why) = @_;
+sub zone_server_simple ($$$) {
+    my ($name,$why,$is_soa) = @_;
     my ($rcode,@addrs,$addr);
     ($rcode,@addrs)= lookup($name,'a','0');
     my ($rcode,@addrs,$addr);
     ($rcode,@addrs)= lookup($name,'a','0');
-    foreach $addr (@addrs) { zone_server_addr($addr,$name,$why); }
+    foreach $addr (@addrs) { zone_server_addr($addr,$name,$why,$is_soa); }
 }
 
 #-------------------- outputting
 }
 
 #-------------------- outputting
index 450c4c4142e9773f800630876aae49f2ea34936c..5b154694905652f72babaf71fd71dbeec8e631a0 100644 (file)
@@ -115,6 +115,10 @@ These directives specify general configuration details.  They should
 appear before directives specifying zones, as each will affect only
 later zone directives.
 .TP
 appear before directives specifying zones, as each will affect only
 later zone directives.
 .TP
+\fBself\-addr\fP \fIfqdn ...\fP
+Specifies the list of addresses that this server may be known by in
+A records.  There is no default.
+.TP
 \fBself\-ns\fP \fIfqdn ...\fP
 Specifies the list of names that this server may be known by in NS
 records.  There is no default.
 \fBself\-ns\fP \fIfqdn ...\fP
 Specifies the list of names that this server may be known by in NS
 records.  There is no default.