In de achterliggende jaren heb ik een aantal scripts geschreven om mijn IT services te monitoren. Een script ontstaat door een behoefte om iets te berekenen of te testen. Ik gebruik daarvoor stukjes code , die ik van het internet haal, de zogenoemde opensource code, en aanpassingen of aanvullingen van mezelf.
Een ervan is een script om te testen of de twee DNS servers hetzelfde ip-nummer geven en om te testen of de serie-nummers van de SOA regel gelijk zijn aan elkaar.
In mijn geval is dat eigenlijk een test of de slave server de configuratie van de master heeft overgenomen.
Het gebruik en de documentatie van het script zit in het script zelf verankerd. Dan komt hier het script:
#!/usr/bin/perl
#--------------------------------------------------------------------------
#
# Script: dns_check.pl
# Doel: Het testen of de 2 dns servers hetzelfde resultaat geven.
# Versie / Datum: 1.0 / 25 januari 2023
# Auteur: H.J.F. Boschker email:
#
#--------------------------------------------------------------------------
#
# procedural interfaces ---------------------------------------------------
use Data::Dumper;
use Net::DNS;
use Mail::Sendmail;
#
# Global variables --------------------------------------------------------
my $hostname = $ARGV[0]; # argument should be the domainname
my @servers = qw(xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy); # ip-numbers of the dns servers to check
my %results;
my @records = qw(A SOA);
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdt) = localtime(time);
#
# Mail ---------------------------------------------------------------------
my $message;
my %mail;
my $mailfrom = "boschker\@boschker\.net";
my $mailto = "henk\@boschker\.net";
my $subject;
my $DATUM;
# USAGE --------------------------------------------------------------------
#
my $USAGE =<<USAGE;
Usage:
script should be called as:
dns-check.pl domainname
where:
domainname: domain to be compared for A-record and SOA serialnumber
on its domainname servers.
USAGE
#
# End USAGE ----------------------------------------------------------------
#
# SUBROUTINES --------------------------------------------------------------
sub lookup {
my ( $hostname, $server, $rcrd ) = @_;
my $res = new Net::DNS::Resolver;
$res->nameservers($server);
my $packet = $res->query($hostname, $rcrd);
if ( !$packet ) {
warn "$server not returning any data for $hostname!\n";
return;
}
my (@results);
if ($rcrd eq "A") {
foreach my $rr ( $packet->answer ) {
next unless $rr->type =~ "A";
push ( @results, $rr->address );
}
} else {
foreach my $rr ( $packet->answer ) {
next unless $rr->type =~ "SOA";
push ( @results, ($packet->answer)[0]->serial);
}
}
return join( ', ', sort @results );
}
sub mail_result() {
$subject = $DATUM." DNS check";
%mail = ( To => $mailto,
From => $mailfrom,
Subject => $subject,
Message => $message
);
sendmail(%mail) or die $Mail::Sendmail::error;
};
#
# MAINPROG -----------------------------------------------------------------
if ( ! $hostname ) { # This means script called without an argument
print "$USAGE\n";
exit 0;
}
foreach my $rec (@records) {
foreach my $server (@servers) {
$results{$server}
= lookup( $hostname, $server, $rec );
}
my %inv = reverse %results; # invert results - it should have one key if all
# are the same
if (scalar keys %inv > 1) { # if it has more than one key
$message = $message."The results are different for $rec record:\n";
$message = $message.Data::Dumper->Dump( [ \%results ], ['results'] ), "\n";
}
}
if ( $message) {
mail_result;
}