App-ipchgmon

 view release on metacpan or  search on metacpan

META.yml  view on Meta::CPAN

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 )