chiark
/
gitweb
/
~ian
/
chiark-utils.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Copyright notices. Say we check slaving details. Update manpage date.
[chiark-utils.git]
/
scripts
/
named-conf
diff --git
a/scripts/named-conf
b/scripts/named-conf
index 982d18c738b0c3135208929dc6b379393d756424..3c92ecec5dd099c491a1e95aa2264d250307fd6f 100755
(executable)
--- a/
scripts/named-conf
+++ b/
scripts/named-conf
@@
-19,7
+19,7
@@
$where= '<built-in>';
$debug= 0;
$needglue= 1;
$localonly= 0;
$debug= 0;
$needglue= 1;
$localonly= 0;
-$verbosity=
1
;
+$verbosity=
2
;
$repeat= 0;
use vars qw($dig_owner $dig_type $dig_rdata);
$repeat= 0;
use vars qw($dig_owner $dig_type $dig_rdata);
@@
-33,9
+33,9
@@
while (@ARGV && $ARGV[0] =~ m/^\-/) {
elsif (m/^config$/) { $etcfile= loarg(); $where= '--config option'; }
elsif (m/^glueless$/) { $needglue=0; }
elsif (m/^localonly$/) { $localonly=1; }
elsif (m/^config$/) { $etcfile= loarg(); $where= '--config option'; }
elsif (m/^glueless$/) { $needglue=0; }
elsif (m/^localonly$/) { $localonly=1; }
- elsif (m/^quiet$/) { $verbosity
=0
; }
+ elsif (m/^quiet$/) { $verbosity
--
; }
elsif (m/^repeat$/) { $repeat=1; }
elsif (m/^repeat$/) { $repeat=1; }
- elsif (m/^verbose$/) { $verbosity
=2
; }
+ elsif (m/^verbose$/) { $verbosity
++
; }
else { usageerr("unknown option --$_"); }
} else {
s/^\-//;
else { usageerr("unknown option --$_"); }
} else {
s/^\-//;
@@
-47,9
+47,9
@@
while (@ARGV && $ARGV[0] =~ m/^\-/) {
elsif (s/^D//) { $debug++; }
elsif (s/^g//) { $needglue=0; }
elsif (s/^l//) { $localonly=1; }
elsif (s/^D//) { $debug++; }
elsif (s/^g//) { $needglue=0; }
elsif (s/^l//) { $localonly=1; }
- elsif (s/^q//) { $verbosity
=0
; }
+ elsif (s/^q//) { $verbosity
--
; }
elsif (s/^r//) { $repeat=1; }
elsif (s/^r//) { $repeat=1; }
- elsif (s/^v//) { $verbosity
=2
; }
+ elsif (s/^v//) { $verbosity
++
; }
else { usageerr("unknown option -$&"); }
}
}
else { usageerr("unknown option -$&"); }
}
}
@@
-58,6
+58,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(); }
sub loarg() { usageerr("missing option value") if !@ARGV; return shift @ARGV; }
sub soarg() { my ($rv); $rv=$_; $_=''; return length $rv ? $rv : loarg(); }
+usageerr("-q may be specified at most twice") if $verbosity<0;
+usageerr("-v may be specified at most once") if $verbosity>3;
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;
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;
@@
-253,15
+255,13
@@
sub set_output($) {
use vars qw($zone $cfg $warnings %zone_warnings);
$warnings= 0;
use vars qw($zone $cfg $warnings %zone_warnings);
$warnings= 0;
-sub progress ($) {
- return if !$verbosity;
- print "$_[0]\n";
+sub progress ($$) {
+ my ($minv,$m) = @_;
+ return if $verbosity < $minv;
+ print "$m\n";
}
}
-sub verbose ($) {
- return if $verbosity<2;
- print " $_[0]\n";
-}
+sub verbose ($) { progress(3, ' ' . $_[0]); }
sub process_zones (@) {
my (@zones) = @_;
sub process_zones (@) {
my (@zones) = @_;
@@
-274,7
+274,7
@@
sub process_zones (@) {
's' => 'f',
'servers' => [ ],
};
's' => 'f',
'servers' => [ ],
};
- progress(
sprintf "%-4
0s %s", $zone, $$cfg{'style_p'});
+ progress(
1, sprintf "%-2
0s %s", $zone, $$cfg{'style_p'});
if ($check && ($doall || $cfg->{'s'} !~ m/\?/)) {
eval {
if ($localonly && $cfg->{'s'} =~ m/f/) {
if ($check && ($doall || $cfg->{'s'} !~ m/\?/)) {
eval {
if ($localonly && $cfg->{'s'} =~ m/f/) {
@@
-299,7
+299,7
@@
sub process_zones (@) {
scalar(keys %zone_warnings),
scalar(@zones - keys %zone_warnings));
} else {
scalar(keys %zone_warnings),
scalar(@zones - keys %zone_warnings));
} else {
- progress(sprintf "%d zone(s) checked ok", scalar @zones);
+ progress(
1,
sprintf "%d zone(s) checked ok", scalar @zones);
}
}
}
}
@@
-309,8
+309,8
@@
use vars qw(%glue); # $glue{$name}{$addr_list} = [ $whosaidandwhy ]
use vars qw(%soas); # $soa{"$serial $origin"} = [ $whosaidandwhy ]
use vars qw(%addr_is_ok %warned);
use vars qw($delg_to_us);
use vars qw(%soas); # $soa{"$serial $origin"} = [ $whosaidandwhy ]
use vars qw(%addr_is_ok %warned);
use vars qw($delg_to_us);
-use vars qw(@to_check); # ($addr,$whyask,$
is
_auth,$glueless_ok, ...)
-use vars qw(@to_check_soa); # ($addr,$whyask, ...)
+use vars qw(@to_check); # ($addr,$whyask,$
name_if
_auth,$glueless_ok, ...)
+use vars qw(@to_check_soa); # ($addr,$whyask,
$name,$is_ns,
...)
sub zone_warning ($$) {
my ($w,$o) = @_;
sub zone_warning ($$) {
my ($w,$o) = @_;
@@
-346,8
+346,9
@@
sub zone_reset() {
sub zone_investigate() {
my ($super_zone, @super_nsnames,
sub zone_investigate() {
my ($super_zone, @super_nsnames,
- $super_ns, @super_ns_addrs, $s, $wa, $is_auth,
- %nsrrset_checked, %soa_checked, $addr, $glueless_ok, $rcode);
+ $super_ns, @super_ns_addrs, $s, $wa, $name_if_auth,
+ %nsrrset_checked, %soa_checked, $addr, $glueless_ok,
+ $rcode, $name, $is_ns);
$super_zone= $zone;
for (;;) {
$super_zone= $zone;
for (;;) {
@@
-365,7
+366,7
@@
sub zone_investigate() {
push @to_check,
$addr,
"$super_ns, server for $super_zone",
push @to_check,
$addr,
"$super_ns, server for $super_zone",
-
0
, 0;
+
undef
, 0;
}
}
for (;;) {
}
}
for (;;) {
@@
-374,13
+375,14
@@
sub zone_investigate() {
# we might set nsrrset_checked due to a glueless_ok check,
# and then not check for gluefulness later.
debug_dump('@to_check @to_check_soa');
# we might set nsrrset_checked due to a glueless_ok check,
# and then not check for gluefulness later.
debug_dump('@to_check @to_check_soa');
- if (($addr,$wa,$is_auth,$glueless_ok,@to_check) = @to_check) {
- push @to_check_soa, $addr, $wa if $is_auth;
+ if (($addr,$wa,$name_if_auth,$glueless_ok,@to_check) = @to_check) {
+ push @to_check_soa, $addr, $wa, $name_if_auth, 1,
+ if defined $name_if_auth;
next if $nsrrset_checked{$addr}++;
next if $nsrrset_checked{$addr}++;
- zone_check_nsrrset($addr, $wa, $
is
_auth, $glueless_ok);
- } elsif (($addr,$wa,@to_check_soa) = @to_check_soa) {
+ zone_check_nsrrset($addr, $wa, $
name_if
_auth, $glueless_ok);
+ } elsif (($addr,$wa,
$name,$is_ns,
@to_check_soa) = @to_check_soa) {
next if $soa_checked{$addr}++;
next if $soa_checked{$addr}++;
- zone_check_soa($addr,
$wa, "NS [$addr]"
);
+ zone_check_soa($addr,
$wa,$name,$is_ns
);
} else {
last;
}
} else {
last;
}
@@
-388,8
+390,9
@@
sub zone_investigate() {
}
sub zone_check_nsrrset ($$$$) {
}
sub zone_check_nsrrset ($$$$) {
- my ($uaddr,$wa, $is_auth, $glueless_ok) = @_;
- my (@s, $s, %s2g, @glue, $glue, $delgs_or_auths, $wwn, $ww);
+ my ($uaddr,$wa, $name_if_auth, $glueless_ok) = @_;
+ my (@s, $s, $a, %s2g, @glue, $glue, $delgs_or_auths, $wwn, $ww);
+ my ($rcode);
$ww= "[$uaddr] $wa";
verbose("checking delegation by $ww");
dig(sub {
$ww= "[$uaddr] $wa";
verbose("checking delegation by $ww");
dig(sub {
@@
-397,7
+400,7
@@
sub zone_check_nsrrset ($$$$) {
$s2g{lc $dig_rdata} = [ ];
} elsif ($dig_type eq 'a' && exists $s2g{$dig_owner}) {
$wwn= "in glue from $ww";
$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",
1
, 0;
+ push @to_check, $dig_rdata, "$dig_owner, $wwn",
$dig_owner
, 0;
zone_server_addr($dig_rdata,$dig_owner,$wwn,"NS [$uaddr]",0);
push @{ $s2g{$dig_owner} }, $dig_rdata;
}
zone_server_addr($dig_rdata,$dig_owner,$wwn,"NS [$uaddr]",0);
push @{ $s2g{$dig_owner} }, $dig_rdata;
}
@@
-419,13
+422,18
@@
sub zone_check_nsrrset ($$$$) {
unless $glueless_ok || !$needglue ||
grep { has_suffix_of($s,".$_"); }
@{ $cfg->{'conv_glueless'} };
unless $glueless_ok || !$needglue ||
grep { has_suffix_of($s,".$_"); }
@{ $cfg->{'conv_glueless'} };
- next;
+ ($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);
+ }
}
$glue= join ' ', sort @glue;
push @{ $glue{$s}{$glue} }, $ww;
}
$s= join ' ', @s;
}
$glue= join ' ', sort @glue;
push @{ $glue{$s}{$glue} }, $ww;
}
$s= join ' ', @s;
- $delgs_or_auths=
$is_auth
? \%auths : \%delgs;
+ $delgs_or_auths=
defined($name_if_auth)
? \%auths : \%delgs;
push @{ $delgs_or_auths->{$s} }, $ww;
}
push @{ $delgs_or_auths->{$s} }, $ww;
}
@@
-476,10
+484,10
@@
sub zone_server_addr ($$$$$) {
$delg_to_us=1 if $addr_is_self && !$is_soa;
}
$delg_to_us=1 if $addr_is_self && !$is_soa;
}
-sub zone_check_soa ($$$) {
- my ($uaddr,$wa,$
waq
) = @_;
- my ($lame,$origin,$got,$rcode,@soa_addrs,$soa_addr,$ww,$wwn);
- verbose("checking service at [$uaddr] $
waq
");
+sub zone_check_soa ($$$
$
) {
+ my ($uaddr,$wa,$
name,$is_ns
) = @_;
+ my ($lame,$
serial,$
origin,$got,$rcode,@soa_addrs,$soa_addr,$ww,$wwn);
+ verbose("checking service at [$uaddr] $
name
");
$lame= 'dead or lame';
$ww= "[$uaddr] $wa";
dig(sub {
$lame= 'dead or lame';
$ww= "[$uaddr] $wa";
dig(sub {
@@
-488,19
+496,21
@@
sub zone_check_soa ($$$) {
} elsif ($dig_type eq 'soa' && $dig_owner eq $zone && !$lame) {
die "several SOAs ? $ww" if defined $origin;
$got= $dig_rdata;
} elsif ($dig_type eq 'soa' && $dig_owner eq $zone && !$lame) {
die "several SOAs ? $ww" if defined $origin;
$got= $dig_rdata;
- $got =~ m/^
\d+
(\S+)$/ or die "$got ?";
-
$origin= $1
;
+ $got =~ m/^
(\d+)
(\S+)$/ or die "$got ?";
+
($serial,$origin) = ($1,$2)
;
}
},
$zone,'soa',$uaddr);
$lame= 'broken' if !$lame && !defined $origin;
if ($lame) { zone_warning("$lame server [$uaddr]",$wa); return; }
}
},
$zone,'soa',$uaddr);
$lame= 'broken' if !$lame && !defined $origin;
if ($lame) { zone_warning("$lame server [$uaddr]",$wa); return; }
+ progress(2, sprintf "%-16s %46s has %s%s",
+ $zone, "$name [$uaddr]", $serial, $is_ns ? '' : '*');
push @{ $soas{$got} }, $ww;
($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 @{ $soas{$got} }, $ww;
($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",
1
, 1;
+ push @to_check, $soa_addr, "$origin, $wwn",
$origin
, 1;
}
}
}
}