App-ipchgmon
view release on metacpan or search on metacpan
lib/App/ipchgmon.pm view on Meta::CPAN
my ($ip, $body) = @_;
my $transport;
$transport = build_transport if defined $opt_mailserver;
$opt_server ||= '';
$opt_mailsubject ||= $opt_server . ' has a new address';
$body ||= "$opt_server is now at $ip";
my %params;
$params{'from'} = $opt_mailfrom;
$params{'subject'} = $opt_mailsubject;
$params{'text_body'} = $body;
$params{'transport'} = $transport if defined $transport;
if ($opt_singleemail or 1 == scalar(@$opt_email)) {
for my $address (@$opt_email) {
$params{'to'} = $address;
my $stuffer = Email::Stuffer->new(\%params);
$stuffer->send;
}
} else {
$params{'to'} = $opt_email;
my $stuffer = Email::Stuffer->new(\%params);
$stuffer->send;
}
}
sub valid4 {
my $ip = shift;
return 0 if is_unroutable_ipv4($ip);
return 0 if is_private_ipv4($ip);
return 0 if is_loopback_ipv4($ip);
return 0 if is_linklocal_ipv4($ip);
return 0 if is_testnet_ipv4($ip);
return 0 if is_anycast_ipv4($ip);
return 0 if is_multicast_ipv4($ip);
return 1 if is_ipv4($ip);
}
sub valid6 {
my $ip = shift;
return 0 if is_private_ipv6($ip);
return 0 if is_loopback_ipv6($ip);
return 0 if is_linklocal_ipv6($ip);
return 0 if is_multicast_ipv6($ip);
return 0 if is_ipv4_mapped_ipv6($ip);
return 0 if is_discard_ipv6($ip);
return 0 if is_special_ipv6($ip);
return 0 if is_documentation_ipv6($ip);
return 1 if is_ipv6($ip);
}
sub get_ip6 {
return get_ip('http://ip6only.me/api/');
}
sub get_ip4 {
return get_ip('http://ip4only.me/api/');
}
sub get_ip {
my $url = shift;
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => $url);
my $res = $ua->request($req);
my $csv = $res->content;
my $aoa = csv(in => \$csv);
return $$aoa[0][1];
}
sub nslookup {
my $hostname = shift;
my ($err, $v1, $v2) = getaddrinfo($hostname, "", { socktype => SOCK_RAW });
my (undef, $ip1) = getnameinfo($v1->{addr}, NI_NUMERICHOST, NIx_NOSERV);
my (undef, $ip2) = getnameinfo($v2->{addr}, NI_NUMERICHOST, NIx_NOSERV);
if (valid4($ip1)) {
return $ip1, $ip2;
} else {
return $ip2, $ip1;
}
}
END {
if(defined $opt_versions){
print
"\nModules, Perl, OS, Program info:\n",
" Getopt::Long $Getopt::Long::VERSION\n",
" Pod::Usage $Pod::Usage::VERSION\n",
" Data::Dumper $Data::Dumper::VERSION\n",
" Data::Validate::Email $Data::Validate::Email::VERSION\n",
" Data::Validate::IP $Data::Validate::IP::VERSION\n",
" DateTime $DateTime::VERSION\n",
" DateTime::Format::Strptime $DateTime::Format::Strptime::VERSION\n",
" Email::Sender::Transport::SMTP $Email::Sender::Transport::SMTP::VERSION\n",
" Email::Stuffer $Email::Stuffer::VERSION\n",
" LWP::Online $LWP::Online::VERSION\n",
" LWP::UserAgent $LWP::UserAgent::VERSION\n",
" Socket $Socket::VERSION\n",
" Text::CSV $Text::CSV::VERSION\n",
" strict $strict::VERSION\n",
" Perl $]\n",
" OS $^O\n",
" $0 $VERSION\n",
"\n\n";
}
}
1;
=pod
=head1 NAME
ipchgmon.pm - Watches for changes to public facing IP addresses
=head1 SYNOPSIS
perl ipchgmon.pm --file c:\data\log.txt --server example.com
Who knows? It might even work. More usually, in a cron job:
perl ipchgmon --file ~/log.txt \
--server back_office_top_shelf \
--dnsname example.com \
( run in 0.815 second using v1.01-cache-2.11-cpan-acf6aa7dc9e )