Code: Select all
[root@dozer ~]# more /usr/local/bin/check_pri.pl
#!/usr/bin/perl
use warnings;
use strict;
use Asterisk::AMI;
use Data::Dumper;
use XML::Dumper;
my @ALERT_EMAIL = ('[email protected]');
my @EMAIL = ('[email protected]');
my @SYSOP_PHONE = ('8300326', # justin work cell
'4535893', # carlos work cell
'7578034', # gene work cell
);
#my @ALERT_EMAIL = ('[email protected]');
#my @EMAIL = ('[email protected]');
#my @SYSOP_PHONE = ('8300326');
my $PERSIST_FILE = '/var/check_pri_persist.xml';
my $telco_contact_info = "Telepacific Premium Support: 888-611-8722, Acct# 13460
7";
my $aggplant_info = "Agg Plant: (951) 736-7680, backup: (951) 736-7661";
my $CALLFILE_TEMP_DIR = '/var/tmp';
my $ASTERISK_OUTGOING_DIR = '/var/spool/asterisk/outgoing';
my $CALLALERT = 0;
# ALERT:
# 1 = ten minute alert to ALERT_EMAIL
# 2 = one minute alert to EMAIL
# 3 = 1 and 2
# VARIABLES YOU SHOULD EDIT.
my %dests = (
'Hq Span 7' => { ALERT => 3, SERVER => 'tank', USE
R => 'pri_checker', SECRET => 'Wjm8A4C2n2379kq3', SPAN => 7, ALERTINTERVAL => 10
, ALERTTHRESHOLD => 5, CIRCUIT => '842641', PHONE => '', FAX => '' },
'Hq Span 8' => { ALERT => 3, SERVER => 'tank', USE
R => 'pri_checker', SECRET => 'Wjm8A4C2n2379kq3', SPAN => 8, ALERTINTERVAL => 10
, ALERTTHRESHOLD => 5, CIRCUIT => '842635', PHONE => '', FAX => '' },
'Yard Span 7' => { ALERT => 3, SERVER => 'ernestine', USE
R => 'pri_checker', SECRET => 'Wjm8A4C2n2379kq3', SPAN => 7, ALERTINTERVAL => 10
, ALERTTHRESHOLD => 5, CIRCUIT => '13/HCGS/848840//PT', PHONE => '', FAX => '' }
,
'Yard Span 8' => { ALERT => 3, SERVER => 'ernestine', USE
R => 'pri_checker', SECRET => 'Wjm8A4C2n2379kq3', SPAN => 8, ALERTINTERVAL => 10
, ALERTTHRESHOLD => 5, CIRCUIT => '537994003.1 ????', PHONE => '', FAX => '' },
);
my $persist = ();
if(-e $PERSIST_FILE)
{
$persist = xml2pl($PERSIST_FILE);
}
foreach((keys %dests))
{
my $dest = $_;
my $astman = Asterisk::AMI->new(PeerAddr => $dests{$dest}{SERVER},
Username => $dests{$dest}{USER},
Secret => $dests{$dest}{SECRET},
Events => 'off',
);
my $response = $astman->action({ Action => 'Command',
Command => 'pri show span ' . $dests{$dest}{SPAN},
});
# print Dumper(\$response);
my $subject = '';
my $body = '';
my $var = undef;
my @cmdnode = $response->{CMD};
foreach my $cmds (@cmdnode)
{
foreach my $cmd (@{$cmds})
{
# print "cmd: $cmd\n";
if($cmd =~ /Status: (.*)/) {
$var = $1;
}
}
}
# print "dest: $dest, status: $var\n";
unless(defined $var) {
$var = 'Error: Unable to parse response';
$subject = "Subject: Script Error - Pri Outage $dest\n\n";
$body = localtime(time) . " Unable to parse response.\nLooking for 'Status:' in: \n\n" . Dumper(@cmdnode);
}
else
{
if($var ne 'Up, Active')
{
$subject = "Subject: Pri Outage $dest\n\n";
$body = localtime(time) . " $dest (SPAN: $dests{$dest}{SPAN}) = $var\n\n";
}
}
if($subject ne '' && $dests{$dest}{ALERT} & 2)
{
open(SENDMAIL, "|/usr/lib/sendmail -oi -t -odq") or die "Can't fork for sendmail: $!\n";
print SENDMAIL "From: Dozer Pri checker <prichecker\@allamericanasphalt.com>\n";
foreach my $EMAIL (@EMAIL)
{
print SENDMAIL "To: $EMAIL\n";
}
print SENDMAIL $subject;
print SENDMAIL $body;
print SENDMAIL $telco_contact_info;
print SENDMAIL "\ntelco circuit ID: $dests{$dest}{CIRCUIT}";
close(SENDMAIL) or warn "sendmail didn't close nicely";
}
push(@{$persist->{$dest}->{'StatusArray'}}, $var);
my $arraylength = @{$persist->{$dest}->{'StatusArray'}};
while($arraylength > $dests{$dest}{ALERTINTERVAL})
{
shift(@{$persist->{$dest}->{'StatusArray'}});
$arraylength = @{$persist->{$dest}->{'StatusArray'}};
}
if($dests{$dest}{ALERT} & 1)
{
my $last_email = $persist->{$dest}->{LastEmail};
if(!defined($last_email))
{
$last_email = 0;
}
my $cutoff_time = $dests{$dest}{'ALERTINTERVAL'} * 60 + $last_email;
if(time() >= $cutoff_time)
{
# see if it's time to send an alert email...
my $non_up_count = 0;
foreach my $status (@{$persist->{$dest}->{'StatusArray'}})
{
if($status ne 'Up, Active' && $status ne 'testing')
{
$non_up_count++;
}
}
if($non_up_count >= $dests{$dest}{ALERTTHRESHOLD})
{
# send email...
open(SENDMAIL, "|/usr/lib/sendmail -oi -t -odq") or die "Can't fork for sendmail: $!\n";
print SENDMAIL "From: Dozer Pri checker <prichecker\@allamericanasphalt.com>\n";
foreach my $EMAIL (@ALERT_EMAIL)
{
print SENDMAIL "To: $EMAIL\n";
}
print SENDMAIL "Subject: Quantum Pri Outage $dest\n\n";
print SENDMAIL localtime(time) . "\n$dest span $dests{$dest}{SPAN} has been down >= $dests{$dest}{ALERTTHRESHOLD} times in t
he last $dests{$dest}{ALERTINTERVAL}\n\n" . Dumper(\$persist->{$dest});
print SENDMAIL $telco_contact_info;
print SENDMAIL "\ntelco circuit ID: $dests{$dest}{CIRCUIT}";
close(SENDMAIL) or warn "sendmail didn't close nicely";
$persist->{$dest}->{'LastEmail'} = time();
if($CALLALERT == 1)
{
# create a call file...
foreach my $sysop (@SYSOP_PHONE)
{
my $tmp_call_file = "$CALLFILE_TEMP_DIR/$dest-$sysop";
$tmp_call_file =~ s/ /_/g;
open(TMPFILE, ">", $tmp_call_file) or warn "couldn't open temp call file: $!";
print TMPFILE "Channel: Local/$sysop\@mis-phone/n\n";
print TMPFILE "MaxRetries: 50\n";
print TMPFILE "RetryTime: 5\n";
print TMPFILE "WaitTime: 5\n";
print TMPFILE "Archive: yes\n";
print TMPFILE "Extension: Dozer Pri monitor failure for $dest\n";
print TMPFILE "Context: outbound-swift\n";
close(TMPFILE);
`mv $tmp_call_file $ASTERISK_OUTGOING_DIR`;
}
}
}
}
}
}
# serialize this structure to disk...
pl2xml($persist, $PERSIST_FILE);
exit;
[root@dozer ~]#