#!/usr/local/bin/perl use warnings; use strict; use GDBM_File; use Fcntl qw(O_CREAT O_RDWR); use Mail::Mailer; tie my %history, 'GDBM_File', "$ENV{HOME}/pinger/history", O_CREAT|O_RDWR, 0600; my $ping=`ping -c 5 195.112.4.4|grep received`; $ping =~ /(\d+)%/; my $packet_loss = $1; chomp($packet_loss); if($packet_loss != 0) { $history{time()} = $packet_loss; } if(!defined($history{prev_state})) { $history{prev_state}=100; $history{most_recent} = time; } if($packet_loss == 100 && $history{prev_state} != 100) { # connection gone down email( "Connection died at ".scalar(localtime) ); $history{prev_state} = $packet_loss; $history{most_recent} = time; } elsif($history{prev_state} == 100) { # previous was 100% loss if($packet_loss != 100) { # ... and we're back up email( "Connection came back up with $packet_loss% packet\n". "loss at ".scalar(localtime).".\n\n". "It went down at ". scalar(localtime($history{most_recent})) ); $history{prev_state} = $packet_loss; $history{most_recent} = time; } } elsif($history{prev_state} == 0) { # previous was 0% loss if($packet_loss != 0) { # ... now we have lossage email("$packet_loss% packet loss on connection at ".scalar(local time)); $history{prev_state} = $packet_loss; $history{most_recent} = time; } } sub email { my $body=shift; my $mailer=new Mail::Mailer; $mailer->open({ To => 'david@cantrell.org.uk', Subject => 'LINEMONITOR report from '.`hostname` }); print $mailer $body; $mailer->close; } #### #!/usr/local/bin/perl use warnings; use strict; use GDBM_File; use Fcntl qw(O_CREAT O_RDWR); use Data::Dumper; tie my %history, 'GDBM_File', "$ENV{HOME}/pinger/history", O_CREAT|O_RDWR, 0600; print "Loss%\tTime\n"; foreach my $key (sort { $a <=> $b } grep { /^\d+$/ } keys %history) { print "$history{$key}\t".scalar(localtime($key))."\n"; }