Monitor DNS Changes for Hostname
#!/bin/env perl
use strict;
## Check to see if IP Address or CNAME has changed for a host
## If it has chagned, send message using mail function
require Net::DNS;
require MIME::Lite;
my %hostname = (
'cdn.djtunez.net' => [ "ns1.lithiumfox.com", "ns1.lithiumfox.com"],
);
for (keys %hostname){
my $record;
my $res = Net::DNS::Resolver->new(
nameservers => $hostname{$_},
recurse => 0,
debug => 0,
);
my $request = $res->query("$_");
if ($request){
foreach my $rr ($request->answer){
if ($rr-> type eq "CNAME"){
$record = $rr->cname;
}
elsif ($rr->type eq "A"){
$record = $rr->address;
}
}
}
checkDifference($record,$_);
}
sub checkDifference {
my ($record, $hostname) = @_;
my $statepath = "/var/run/dnscheck";
my $state = "$hostname.state";
open STATE, "<$statepath/$state" or die $!;
while (<STATE>){
chomp;
my $sstate = $_;
close STATE;
if ($sstate ne $record){
print "$hostname DNS record has changed from $sstate -> $record\n";
my $msgbody = "$hostname DNS record has changed from $sstate -> $record\n";
mail($msgbody, $hostname);
open STATE, ">$statepath/$state" or die $!;
print STATE $record;
close STATE;
}
}
}
sub mail {
my ($msgbody, $hostname) = @_;
my $subject = "$hostname DNS Record Changed!";
my @mailto = [ 'jthomas@lithiumfox.com' ];
my $msg = MIME::Lite->new(
Subject => $subject,
To => @mailto,
Type => 'text/html',
Data => $msgbody,
);
$msg->send();
}