This is checksoa.pl in view mode; [Download] [Up]
#!/usr/bin/perl -w
# checksoa.pl - check SOA serial numbers given a local(?) named.boot file
# vix 19sep95 [original]
#
# $Id:$
$Dig = 'dig';
$, = ' ';
$| = 1;
sub usage {
print STDERR <<":EOF:";
usage: $0 [-d] -i priaddr {-a aliasaddr}... {-n servname}... bootfile...
(i.e.: $0 -i 127.0.0.1 -a 192.5.5.1 -a 192.5.5.2 -n gw.home.vix.com named.boot
:EOF:
exit(1);
}
$something = 0;
$Debug = 0;
while ($_ = shift) {
if (/\-/) {
$_ = $';
if ($_ eq 'i') {
($_ = shift) =~ tr/A-Z/a-z/;
delete $MyServerA{$MyServer};
$MyServer = $_;
} elsif ($_ eq 'a') {
($_ = shift) =~ tr/A-Z/a-z/;
$MyServerA{$_} = '';
} elsif ($_ eq 'n') {
($_ = shift) =~ tr/A-Z/a-z/;
$MyServerN{$_} = '';
} elsif ($_ eq 'd') {
$Debug++;
} else {
&usage();
}
} else {
&usage() unless $MyServer;
print "<myserv $MyServer,",
"A(",keys(%MyServerA),"),",
"N(",keys(%MyServerN),")\n" if $Debug;
&bootfile($_);
$something++;
}
}
&usage() unless $something;
exit(0);
sub bootfile {
local($bootfile) = @_;
local(*f, $_, $zone, $server, @servers);
open(f, "<$bootfile") || die "$bootfile: $!";
while (<f>) {
chop; split;
$_ = shift(@_);
$Output = '';
if ($_ eq 'primary') {
$zone = shift(@_);
@servers = &getnsaddrs($zone, $MyServer);
} elsif ($_ eq 'secondary') {
$zone = shift(@_);
@servers = ();
while (defined($_ = shift(@_)) && /^(\d+\.){3}\d+$/) {
push(@servers, $_);
}
} else {
next;
}
next unless length($zone) && $#servers >= $[;
$okservers = 0;
$serial = &getserial($zone, $MyServer);
print "<servers @servers>\n" if $Debug;
foreach $server (@servers) {
$_ = &getserial($zone, $server);
if ($_ != $serial) {
$Output .= sprintf("\t%-16s %s\n", $server,
"has wrong serial ($_)");
} else {
$okservers++;
}
}
if ($Output || $Debug) {
print "[$zone]: serial $serial," .
" $okservers good server(s)\n" .
$Output;
}
}
close(f);
return;
}
sub getserial {
local($zone, $server) = @_;
local(*dig, $serial, $_, $isauth);
$isauth = 0;
$serial = 0;
print "<$Dig @$server $zone soa>\n" if $Debug;
open(dig, "$Dig @$server $zone soa 2>&1 |") || die "dig: $!";
while (<dig>) {
chop;
$Output .= sprintf("\t%-16s %s\n", $server, $_) if /res_send/;
$isauth = 't' if /\bflags\:.*\Waa\b/io;
next unless $isauth;
$serial = $1 if !$serial && /^\s+(\d+)\s*\;\s*serial\s*/io;
}
close(dig);
return ($serial);
}
sub getnsaddrs {
local($zone, $server) = @_;
local(*dig, @ns, %a, @nsaddrs, $_, $isauth);
# vix.com. 3600 NS ns.uu.net.
# ns.uu.net. 52647 A 137.39.1.3
$isauth = 0;
@ns = ();
%a = ();
print "<$Dig @$server $zone soa>\n" if $Debug;
open(dig, "$Dig @$server $zone ns 2>&1 |") || die "dig: $!";
while (<dig>) {
chop; tr/A-Z/a-z/;
$Output .= sprintf("\t%-16s %s\n", $server, $_) if /res_send/;
$isauth = 't' if /\bflags\:.*\Waa\b/io;
next unless $isauth;
if (/^[\w\_\.\-]+\s+\d+\s+NS\s+([\w\_\-\.]+)$/io) {
next if defined $MyServerN{$1};
push(@ns, $1);
}
if (/^([\w\_\.\-]+)\s+\d+\s+A\s+((\d+\.){3}\d+)$/io) {
next if $2 eq $MyServer;
next if defined $MyServerA{$2};
$a{$1} = $2;
}
}
close(dig);
@nsaddrs = ();
foreach (@ns) {
push(@nsaddrs, $a{$_}) if defined $a{$_};
}
print "<getnsaddrs($zone, $server) -> (@nsaddrs)>\n" if $Debug;
return (@nsaddrs);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.