App-ipchgmon
view release on metacpan or search on metacpan
generated_by: 'Dist::Zilla version 6.025, CPAN::Meta::Converter version 2.150010'
license: perl
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.4.html
version: '1.4'
name: App-ipchgmon
requires:
Data::Dumper: '0'
Data::Validate::Email: '0'
Data::Validate::IP: '0'
DateTime: '0'
DateTime::Format::Strptime: '0'
Email::Sender::Transport::SMTP: '0'
Email::Stuffer: '0'
File::Find: '0'
FindBin: '0'
Getopt::Long: '0'
LWP::Online: '0'
LWP::UserAgent: '0'
Pod::Usage: '0'
Socket: '0'
Text::CSV: '0'
Makefile.PL view on Meta::CPAN
"DISTNAME" => "App-ipchgmon",
"EXE_FILES" => [
"bin/ipchgmon"
],
"LICENSE" => "perl",
"NAME" => "App::ipchgmon",
"PREREQ_PM" => {
"Data::Dumper" => 0,
"Data::Validate::Email" => 0,
"Data::Validate::IP" => 0,
"DateTime" => 0,
"DateTime::Format::Strptime" => 0,
"Email::Sender::Transport::SMTP" => 0,
"Email::Stuffer" => 0,
"File::Find" => 0,
"FindBin" => 0,
"Getopt::Long" => 0,
"LWP::Online" => 0,
"LWP::UserAgent" => 0,
"Pod::Usage" => 0,
"Socket" => 0,
"Text::CSV" => 0,
Makefile.PL view on Meta::CPAN
"test" => {
"TESTS" => "t/*.t"
}
);
my %FallbackPrereqs = (
"Data::Dumper" => 0,
"Data::Validate::Email" => 0,
"Data::Validate::IP" => 0,
"DateTime" => 0,
"DateTime::Format::Strptime" => 0,
"Email::Sender::Transport::SMTP" => 0,
"Email::Stuffer" => 0,
"File::Find" => 0,
"FindBin" => 0,
"Getopt::Long" => 0,
"LWP::Online" => 0,
"LWP::UserAgent" => 0,
"Pod::Usage" => 0,
"Regexp::Common" => 0,
"Socket" => 0,
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(
lib/App/ipchgmon.pm view on Meta::CPAN
if ((valid4($$line[0]) and $v4)
or (valid6($$line[0]) and !$v4)) {
$lastip = $$line[0];
$lasttime = $strp->parse_datetime($$line[1]);
last;
}
}
if ($lastip eq $ip) {
# This is the latest IP address of its type
$opt_leeway //= 0;
my $dt = DateTime->now;
my $overdue = $dt->epoch > ($lasttime->epoch + $opt_leeway);
return 1, $overdue;
} else {
return 0, 0;
}
}
sub new_ip {
my ($ip) = @_;
open my $fh, '>>:encoding(utf8)', $opt_file
or die "Unable to append to $opt_file: $!";
my $dt = DateTime->now;
my $timestamp = $dt->rfc3339;
my $csv = Text::CSV->new();
my @fields = ($ip, $timestamp);
$csv->say($fh, \@fields);
close $fh or die "Unable to close $opt_file: $!";
send_email($ip) if defined $opt_email and scalar @$opt_email;
}
sub read_file {
return csv (in => $opt_file);
lib/App/ipchgmon.pm view on Meta::CPAN
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",
t/00-modulino.t view on Meta::CPAN
unlike $rtn, qr/=pod/m, 'Pod directive missing - if it appears, you may need to install perldoc';
};
subtest 'Versions gives sane output' => sub {
my $rtn = qx($invoke --versions 2>&1);
like $rtn, qr/Pod::Usage/m, 'Pod::Usage found';
like $rtn, qr/Getopt::Long/m, 'Getopt::Long found';
like $rtn, qr/Data::Dumper/m, 'Data::Dumper found';
like $rtn, qr/Data::Validate::IP/m, 'Data::Validate::IP found';
like $rtn, qr/Data::Validate::Email/m, 'Data::Validate::Email found';
like $rtn, qr/DateTime/m, 'DateTime found';
like $rtn, qr/DateTime::Format::Strptime/m, 'DateTime::Format::Strptime found';
like $rtn, qr/Email::Sender::Transport::SMTP/m, 'Email::Sender::Transport::SMTP found';
like $rtn, qr/Email::Stuffer/m, 'Email::Stuffer found';
like $rtn, qr/LWP::Online/m, 'LWP::Online found';
like $rtn, qr/LWP::UserAgent/m, 'LWP::UserAgent found';
like $rtn, qr/Socket/m, 'Socket found';
like $rtn, qr/Text::CSV/m, 'Text::CSV found';
like $rtn, qr/strict/m, 'strict found';
like $rtn, qr/Perl/m, 'Perl found';
like $rtn, qr/OS/m, 'OS found';
like $rtn, qr/$NAME.pm/m, 'Modulino name found';
t/32-check-dns.t view on Meta::CPAN
push @$aoaref, [@fields];
# Run the tests in a simple case
my $dnsname = 'example.com';
App::ipchgmon::check_dns($dnsname, $aoaref);
test_email_sent();
## No leeway, so an immediate recheck should re-send.
undef $aoaref;
my ($ip4, $ip6) = App::ipchgmon::nslookup('example.com');
my $dt = DateTime->now;
my $timestamp = $dt->rfc3339;
$csv->combine($timestamp);
my $ts_elt = $csv->string();
for my $ip ($ip4, $ip6) {
$csv->combine($ip);
push @$aoaref, [$csv->string(), $ts_elt];
}
sleep 2; # Make sure timestamp changes
$rtn = '';
App::ipchgmon::check_dns($dnsname, $aoaref);
( run in 0.333 second using v1.01-cache-2.11-cpan-05444aca049 )