App-ipchgmon
view release on metacpan or search on metacpan
lib/App/ipchgmon.pm view on Meta::CPAN
#!/usr/bin/perl
package App::ipchgmon;
use strict;
use warnings;
use Getopt::Long;
use Pod::Usage;
use DateTime;
use DateTime::Format::Strptime;
use Data::Dumper;
use Data::Validate::Email qw(is_email);
use Data::Validate::IP;
use Email::Sender::Transport::SMTP;
use Email::Stuffer;
use LWP::Online 'online';
use LWP::UserAgent;
use Socket qw(:addrinfo SOCK_RAW);
use Text::CSV qw(csv);
use feature 'say';
our $VERSION = '1.0.7';
my $TIMEFORMAT = '%FT%T%z';
my $strp = DateTime::Format::Strptime->new(on_error => 'croak',
pattern => $TIMEFORMAT,
);
our ($opt_help, $opt_man, $opt_versions,
$opt_debug, $opt_singleemail, $opt_4, $opt_6,
$opt_email, $opt_file, $opt_mailserver, $opt_mailport, $opt_leeway,
$opt_mailfrom, $opt_mailsubject, $opt_server, $opt_dnsname,
);
GetOptions(
'help!' => \$opt_help,
'man!' => \$opt_man,
'versions!' => \$opt_versions,
'debug!' => \$opt_debug,
'singleemail!' => \$opt_singleemail,
'4!' => \$opt_4,
'6!' => \$opt_6,
'email|mailto=s@' => \$opt_email,
'file=s' => \$opt_file,
'server=s' => \$opt_server,
'mailserver=s' => \$opt_mailserver,
'mailport=i' => \$opt_mailport,
'leeway=i' => \$opt_leeway,
'mailfrom=s' => \$opt_mailfrom,
'mailsubject=s' => \$opt_mailsubject,
'dnsname=s' => \$opt_dnsname,
) or pod2usage(-verbose => 1) && exit;
pod2usage(-verbose => 1) && exit if defined $opt_help;
pod2usage(-verbose => 2) && exit if defined $opt_man;
unless (caller()) {
if (!defined $opt_file and !$opt_debug) {
pod2usage(-verbose => 1);
exit;
}
if (!defined $opt_server and !$opt_debug) {
pod2usage(-verbose => 1);
exit;
}
main();
}
sub main {
dump_options() if $opt_debug;
validate_email() if defined $opt_email and scalar @$opt_email;
validate_transport() if defined $opt_mailport or defined $opt_mailserver;
$opt_4 ||= 0;
$opt_6 ||= 0;
unless (online) {
$opt_mailsubject = "Internet connection lost for $opt_server";
send_email($opt_server, 'No internet connection');
exit;
}
my $aoaref;
$aoaref = read_file() if -e $opt_file;
my $ip4 = get_ip4();
check_changes($ip4, $aoaref) if $ip4 and ($opt_4 or !$opt_6);
my $ip6 = get_ip6();
check_changes($ip6, $aoaref) if $ip6 and ($opt_6 or !$opt_4);
$aoaref = read_file();
check_dns($opt_dnsname, $aoaref) if $opt_dnsname;
exit;
}
sub check_dns {
my ($dnsname, $aoaref) = @_;
my ($ip4, $ip6) = nslookup($dnsname);
my @list;
if ($opt_4 == $opt_6) {
push @list, $ip4, $ip6;
} elsif ($opt_4) {
push @list, $ip4;
} else {
push @list, $ip6;
}
for my $ip (@list) {
my ($latest, $overdue) = last_ip($ip, $aoaref);
if (!$latest or $overdue) {
send_email($ip, "$dnsname has moved to $ip")
if defined $opt_email and scalar @$opt_email;
}
}
}
sub check_changes {
my ($ip, $aoaref) = @_;
my ($latest, $overdue) = last_ip($ip, $aoaref);
new_ip($ip) if !$latest;
}
# Returns two booleans. The first indicates whether the IP address passed in
( run in 1.497 second using v1.01-cache-2.11-cpan-97f6503c9c8 )