chiark / gitweb /
really: Document -R option in the manpage. Closes:#693354.
[chiark-utils.git] / scripts / named-conf
index 53d6a75300184f80d804356471a881d4d7662cca..120f2b7a78f0fd1bbce7aea63bc3485c50384a88 100755 (executable)
@@ -224,7 +224,11 @@ sub read_config ($) {
        $mod,$dir,$prefix,$suffix,$subfile,$lprefix,$lsuffix,$zf);
     local ($_);
 
-    $fh= new IO::File $if,'r' or cfg_fail("open $if:\n $!");
+    $fh= new IO::File $if,'r';
+    unless ($fh) {
+       return if $! == &ENOENT;
+       cfg_fail("open $if:\n $!");
+    }
     $before= '';
     for (;;) {
        if (!defined($_= <$fh>)) {
@@ -350,9 +354,23 @@ sub bad_modifiers ($) {
     return 0;
 }
 
+sub zone_conf_settings ($$) {
+    my ($cfg,$zone) = @_;
+    my ($sfx,$aref);
+    foreach $sfx (qw(self_soa self_ns self_addr forbid_addr forbid_slave
+                    conv_glueless indirect_glue)) {
+       { no strict 'refs'; $aref= [ @$sfx ]; }
+       @$aref or cfg_fail("failed to specify $sfx before zone")
+           if $sfx =~ m/^self/;
+       $cfg->{$sfx}= $aref;
+    }
+    foreach $sfx (qw(self_soa self_ns)) {
+       map { s/\*$/$zone/ } @{ $zone_cfg{$zone}{$sfx} };
+    }
+}
+
 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) {
@@ -378,16 +396,7 @@ sub zone_conf ($$$$$@) {
        $zone_cfg{$zone}{'maildir'}= qualify($mail_state_dir);
        $zone_cfg{$zone}{'mailmwarn'}= $mail_max_warnfreq;
     }
-    foreach $sfx (qw(self_soa self_ns self_addr forbid_addr forbid_slave
-                    conv_glueless indirect_glue)) {
-       { no strict 'refs'; $aref= [ @$sfx ]; }
-       @$aref or cfg_fail("failed to specify $sfx before zone")
-           if $sfx =~ m/^self/;
-       $zone_cfg{$zone}{$sfx}= $aref;
-    }
-    foreach $sfx (qw(self_soa self_ns)) {
-       map { s/\*$/$zone/ } @{ $zone_cfg{$zone}{$sfx} };
-    }
+    zone_conf_settings($zone_cfg{$zone}, $zone);
     $zone_cfg{$zone}{'output'}= $output;
     push @zone_cfg_list, $zone;
 }
@@ -416,11 +425,20 @@ sub process_zones (@) {
     local ($zone,$cfg);
 
     foreach $zone (@zones) {
-       $cfg= $zone_cfg{$zone} || {
-           'style_p' => 'foreign',
-           's' => "f $group2modcmd{'foreign'}",
-           'servers' => [ ],
+       if ($zone =~ m/\.$/) {
+           zone_warning("zone specified with trailing dot -".
+                        " will not work", '');
+       }
+
+       $cfg= $zone_cfg{$zone};
+       if (!$cfg) {
+           $cfg= {
+               'style_p' => 'foreign',
+               's' => "f $group2modcmd{'foreign'}",
+               'servers' => [ ],
            };
+           zone_conf_settings($cfg, $zone);
+       }
 
        mail_zone_before() or next
            if $domail;
@@ -550,7 +568,7 @@ sub zone_investigate() {
 
 sub zone_check_nsrrset ($$$$) {
     my ($uaddr,$wa, $name_if_auth, $glueless_ok) = @_;
-    my (@s, $s, $a, %s2g, @glue, $glue, $delgs_or_auths, $wwn, $ww);
+    my (@s, $s, $a, %s2g, @glue, $glue, $delgs_or_auths, $wwn, $ww, $cg);
     my ($rcode);
     $ww= "[$uaddr] $wa";
     verbose("checking delegation by $ww");
@@ -585,6 +603,11 @@ sub zone_check_nsrrset ($$$$) {
                           @{ $cfg->{'indirect_glue'} }) and
                         !(grep { has_suffix_of($zone,".$_"); }
                           @{ $cfg->{'indirect_glue'} }));
+           foreach $cg (@{ $cfg->{'conv_glueless'} }) {
+               zone_warning("nameserver $s (glueless) in".
+                            " serverless-glueless namespace area $cg", $ww)
+                   if has_suffix_of(".$s",".$cg");
+           }
            ($rcode,@glue)= lookup($s,'a','0',"glueless NS from $ww");
            foreach $a (@glue) {
                $wwn= "glueless NS from $ww";
@@ -601,14 +624,7 @@ sub zone_check_nsrrset ($$$$) {
 
 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/ &&
@@ -1098,7 +1114,7 @@ sub dig (&$$$) {
     if (!$c) {
        open STDERR, ">&STDOUT" or die $!;
        exec ('dig',
-             '+nodef','+nosea','+nodebug','+norecurse',
+             '+nodef','+nosea','+norecurse',
              "\@$qaddr",'-t',$qtype,$qowner);
        die "$quis: exec dig:\n $!\n";
     }