#!/usr/bin/perl ############################################################################# # $Id: $ ############################################################################# #use strict; use MIME::Lite; use Time::Local; use Date::Parse; use DateTime; use DateTime::TimeZone; use DateTime::Format::Duration; use DateTime::Format::Strptime; use Time::Piece; use File::Copy; use Sys::Hostname; # Date setup my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime time; $mon += 1; $MON=sprintf("%2d",$mon); $DAY=sprintf("%2d",$mday); $HOUR=sprintf("%2d",$hour); $MIN=sprintf("%2d",$min); $year += 1900; $MON=~ tr/ /0/; $DAY=~ tr/ /0/; $HOUR=~ tr/ /0/; $MIN=~ tr/ /0/; $EMAIL=0; $COUNT=0; $HOSTNAME = hostname; # Open the acknowledge.log file open ACKLOG, "> /home/xymon/logs/ack_watch.log") || die("can't open bb_email.log: $!"); open(OUTEMAIL,"> /home/xymon/server/tmp/ack_watch.email") || die("can't open bb_email.log: $!"); $CURTIME=time; print OUTFILE "\n----- ${MON}/${DAY}/${year} ${HOUR}:${MIN} -----\n"; print OUTEMAIL "
/head>";
print OUTEMAIL "Report Time: ${MON}/${DAY}/${year} ${HOUR}:${MIN}\n";
print OUTEMAIL "Xymon Server: $HOSTNAME\n";
print OUTEMAIL "The following alert(s) were recently acknowledged.\n\n";
while () {
# input file example
# np_filename_not_used .
chomp;
@LINE=split(/\t/,$_);
$ACKTIME=$LINE[0];
shift @LINE;
$ALERTID=$LINE[0];
shift @LINE;
$ACKDUR=$LINE[0];
shift @LINE;
shift @LINE;
shift @LINE;
$ACKHOST=$LINE[0];
shift @LINE;
$ACKCOLOR=$LINE[0];
shift @LINE;
$ACKREASON=@LINE;
$COUNT++;
$ACKFILE="/home/xymon/server/tmp/ACK_WATCH/${ACKTIME}.${ALERTID}";
if ( -e ${ACKFILE} ) {
next;
} else {
open HANDLE, ">${ACKFILE}" or die "touch ${ACKFILE}: $!\n";
close HANDLE;
}
$ACKSECONDS=$ACKDUR*60;
$ACKEND=$ACKTIME+$ACKSECONDS;
my ($ack_sec,$ack_min,$ack_hour,$ack_mday,$ack_mon,$ack_year,$ack_wday,$ack_yday,$ack_isdst) = localtime $ACKTIME;
$ack_mon += 1;
$ack_MON=sprintf("%2d",$ack_mon);
$ack_DAY=sprintf("%2d",$ack_mday);
$ack_HOUR=sprintf("%2d",$ack_hour);
$ack_MIN=sprintf("%2d",$ack_min);
$ack_year += 1900;
$ack_MON=~ tr/ /0/;
$ack_DAY=~ tr/ /0/;
$ack_HOUR=~ tr/ /0/;
$ack_MIN=~ tr/ /0/;
my ($end_sec,$end_min,$end_hour,$end_mday,$end_mon,$end_year,$end_wday,$end_yday,$end_isdst) = localtime $ACKEND;
$end_mon += 1;
$end_MON=sprintf("%2d",$end_mon);
$end_DAY=sprintf("%2d",$end_mday);
$end_HOUR=sprintf("%2d",$end_hour);
$end_MIN=sprintf("%2d",$end_min);
$end_year += 1900;
$end_MON=~ tr/ /0/;
$end_DAY=~ tr/ /0/;
$end_HOUR=~ tr/ /0/;
$end_MIN=~ tr/ /0/;
$cnv_acktime=convert_time($ACKSECONDS);
print OUTFILE "Server/Test: $ACKHOST\n";
if ( $ACKEND > $CURTIME ) {
print OUTEMAIL "Server/Test: $ACKHOST\n";
print OUTEMAIL " Ack at: ${ack_MON}/${ack_DAY}/${ack_year} ${ack_HOUR}:${ack_MIN}\n";
print OUTEMAIL " Ack ends: ${end_MON}/${end_DAY}/${end_year} ${end_HOUR}:${end_MIN}\n";
print OUTEMAIL " Ack duration: $cnv_acktime\n";
print OUTEMAIL " Alert color: $ACKCOLOR\n";
print OUTEMAIL " Ack reason: @LINE\n\n";
$EMAIL=1;
print OUTFILE " Ack at: ${ack_MON}/${ack_DAY}/${ack_year} ${ack_HOUR}:${ack_MIN}\n";
print OUTFILE " Ack ends: ${end_MON}/${end_DAY}/${end_year} ${end_HOUR}:${end_MIN}\n";
print OUTFILE " Ack duration: $cnv_acktime\n";
print OUTFILE " Alert color: $ACKCOLOR\n";
print OUTFILE " Ack reason: @LINE\n";
print OUTFILE " ACKEND: $ACKEND\n";
print OUTFILE " CURTIME: $CURTIME\n";
print OUTFILE " *** ACK ACTIVE ***\n\n";
} else {
print OUTFILE " Ack ended at: ${end_MON}/${end_DAY}/${end_year} ${end_HOUR}:${end_MIN}\n";
print OUTFILE " *** ACK EXPIRED ***\n\n";
}
}
close OUTEMAIL;
close ACKLOG;
open EMAILIN, ") {
$message .= $_;
}
$message .= "/pre>/tt>
/body>
/html>";
if ( $EMAIL > 0 ) {
my $mime_msg = MIME::Lite->new(
From => '@.com',
To => '@.com',
Subject => "Xymon recently ack'd alerts ${MON}/${DAY}/$year ${HOUR}:${MIN} on $HOSTNAME",
Type => 'text/html',
Data => $message
)
or die "Error Sending: $!\n";
my $message_body = $mime_msg->body_as_string();
$mime_msg->send() or die "Error sending message: $!\n";
} else {
print OUTFILE "*** ACK COUNT $COUNT ***\n\n";
if ( $COUNT > 10 ) {
move("/home/xymon/logs/acknowledge.log","/home/xymon/logs/archive/acknowledge.log.${MON}${DAY}${year}.${HOUR}${MIN}");
move("/home/xymon/logs/ack_watch.log","/home/xymon/logs/archive/ack_watch.log.${MON}${DAY}${year}.${HOUR}${MIN}");
open HANDLE, ">/home/xymon/logs/acknowledge.log" or die "touch /home/xymon/logs/acknowledge.log: $!\n";
close HANDLE;
unlink glob('/home/xymon/server/tmp/ACK_WATCH/*');
}
}
close OUTFILE;
close EMAILIN;
sub convert_time {
my $cnv_time = shift;
my $cnv_days = int($cnv_time / 86400);
$cnv_time -= ($cnv_days * 86400);
my $cnv_hours = int($cnv_time / 3600);
$cnv_time -= ($cnv_hours * 3600);
my $cnv_minutes = int($cnv_time / 60);
$cnv_days = $cnv_days < 1 ? '' : $cnv_days .' days ';
$cnv_hours = $cnv_hours < 1 ? '' : $cnv_hours .' hours ';
$cnv_minutes = $cnv_minutes < 1 ? '' : $cnv_minutes . ' minutes ';
$cnv_time = $cnv_days . $cnv_hours . $cnv_minutes;
return $cnv_time;
}
"ack_watch.pl.scrubbed" 184 lines, 5784 characters written
xymon@attmon:~/bin$
xymon@attmon:~/bin$
xymon@attmon:~/bin$ cat ack_watch.pl.scrubbed
#!/usr/bin/perl
#############################################################################
# $Id: $
#############################################################################
#use strict;
use MIME::Lite;
use Time::Local;
use Date::Parse;
use DateTime;
use DateTime::TimeZone;
use DateTime::Format::Duration;
use DateTime::Format::Strptime;
use Time::Piece;
use File::Copy;
# Date setup
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime time;
$mon += 1;
$MON=sprintf("%2d",$mon);
$DAY=sprintf("%2d",$mday);
$HOUR=sprintf("%2d",$hour);
$MIN=sprintf("%2d",$min);
$year += 1900;
$MON=~ tr/ /0/;
$DAY=~ tr/ /0/;
$HOUR=~ tr/ /0/;
$MIN=~ tr/ /0/;
$EMAIL=0;
$COUNT=0;
$HOSTNAME =(grep {chomp;} system ('hostname -s'))[0];
# Open the acknowledge.log file
open ACKLOG, "> /home/xymon/logs/ack_watch.log") || die("can't open bb_email.log: $!");
open(OUTEMAIL,"> /home/xymon/server/tmp/ack_watch.email") || die("can't open bb_email.log: $!");
$CURTIME=time;
print OUTFILE "\n----- ${MON}/${DAY}/${year} ${HOUR}:${MIN} -----\n";
print OUTEMAIL "/head>
";
print OUTEMAIL "Report Time: ${MON}/${DAY}/${year} ${HOUR}:${MIN}\n";
print OUTEMAIL "Xymon Server: $HOSTNAME\n";
print OUTEMAIL "The following alert(s) were recently acknowledged.\n\n";
while () {
# input file example
# np_filename_not_used .
chomp;
@LINE=split(/\t/,$_);
$ACKTIME=$LINE[0];
shift @LINE;
$ALERTID=$LINE[0];
shift @LINE;
$ACKDUR=$LINE[0];
shift @LINE;
shift @LINE;
shift @LINE;
$ACKHOST=$LINE[0];
shift @LINE;
$ACKCOLOR=$LINE[0];
shift @LINE;
$ACKREASON=@LINE;
$COUNT++;
$ACKFILE="/home/xymon/server/tmp/ACK_WATCH/${ACKTIME}.${ALERTID}";
if ( -e ${ACKFILE} ) {
next;
} else {
open HANDLE, ">${ACKFILE}" or die "touch ${ACKFILE}: $!\n";
close HANDLE;
}
$ACKSECONDS=$ACKDUR*60;
$ACKEND=$ACKTIME+$ACKSECONDS;
my ($ack_sec,$ack_min,$ack_hour,$ack_mday,$ack_mon,$ack_year,$ack_wday,$ack_yday,$ack_isdst) = localtime $ACKTIME;
$ack_mon += 1;
$ack_MON=sprintf("%2d",$ack_mon);
$ack_DAY=sprintf("%2d",$ack_mday);
$ack_HOUR=sprintf("%2d",$ack_hour);
$ack_MIN=sprintf("%2d",$ack_min);
$ack_year += 1900;
$ack_MON=~ tr/ /0/;
$ack_DAY=~ tr/ /0/;
$ack_HOUR=~ tr/ /0/;
$ack_MIN=~ tr/ /0/;
my ($end_sec,$end_min,$end_hour,$end_mday,$end_mon,$end_year,$end_wday,$end_yday,$end_isdst) = localtime $ACKEND;
$end_mon += 1;
$end_MON=sprintf("%2d",$end_mon);
$end_DAY=sprintf("%2d",$end_mday);
$end_HOUR=sprintf("%2d",$end_hour);
$end_MIN=sprintf("%2d",$end_min);
$end_year += 1900;
$end_MON=~ tr/ /0/;
$end_DAY=~ tr/ /0/;
$end_HOUR=~ tr/ /0/;
$end_MIN=~ tr/ /0/;
$cnv_acktime=convert_time($ACKSECONDS);
print OUTFILE "Server/Test: $ACKHOST\n";
if ( $ACKEND > $CURTIME ) {
print OUTEMAIL "Server/Test: $ACKHOST\n";
print OUTEMAIL " Ack at: ${ack_MON}/${ack_DAY}/${ack_year} ${ack_HOUR}:${ack_MIN}\n";
print OUTEMAIL " Ack ends: ${end_MON}/${end_DAY}/${end_year} ${end_HOUR}:${end_MIN}\n";
print OUTEMAIL " Ack duration: $cnv_acktime\n";
print OUTEMAIL " Alert color: $ACKCOLOR\n";
print OUTEMAIL " Ack reason: @LINE\n\n";
$EMAIL=1;
print OUTFILE " Ack at: ${ack_MON}/${ack_DAY}/${ack_year} ${ack_HOUR}:${ack_MIN}\n";
print OUTFILE " Ack ends: ${end_MON}/${end_DAY}/${end_year} ${end_HOUR}:${end_MIN}\n";
print OUTFILE " Ack duration: $cnv_acktime\n";
print OUTFILE " Alert color: $ACKCOLOR\n";
print OUTFILE " Ack reason: @LINE\n";
print OUTFILE " ACKEND: $ACKEND\n";
print OUTFILE " CURTIME: $CURTIME\n";
print OUTFILE " *** ACK ACTIVE ***\n\n";
} else {
print OUTFILE " Ack ended at: ${end_MON}/${end_DAY}/${end_year} ${end_HOUR}:${end_MIN}\n";
print OUTFILE " *** ACK EXPIRED ***\n\n";
}
}
close OUTEMAIL;
close ACKLOG;
open EMAILIN, ") {
$message .= $_;
}
$message .= "/pre>/tt>
/body>
/html>";
if ( $EMAIL > 0 ) {
my $mime_msg = MIME::Lite->new(
From => '@.com',
To => '@.com',
Subject => "Xymon recently ack'd alerts ${MON}/${DAY}/$year ${HOUR}:${MIN} on $HOSTNAME",
Type => 'text/html',
Data => $message
)
or die "Error Sending: $!\n";
my $message_body = $mime_msg->body_as_string();
$mime_msg->send() or die "Error sending message: $!\n";
} else {
print OUTFILE "*** ACK COUNT $COUNT ***\n\n";
if ( $COUNT > 10 ) {
move("/home/xymon/logs/acknowledge.log","/home/xymon/logs/archive/acknowledge.log.${MON}${DAY}${year}.${HOUR}${MIN}");
move("/home/xymon/logs/ack_watch.log","/home/xymon/logs/archive/ack_watch.log.${MON}${DAY}${year}.${HOUR}${MIN}");
open HANDLE, ">/home/xymon/logs/acknowledge.log" or die "touch /home/xymon/logs/acknowledge.log: $!\n";
close HANDLE;
unlink glob('/home/xymon/server/tmp/ACK_WATCH/*');
}
}
close OUTFILE;
close EMAILIN;
sub convert_time {
my $cnv_time = shift;
my $cnv_days = int($cnv_time / 86400);
$cnv_time -= ($cnv_days * 86400);
my $cnv_hours = int($cnv_time / 3600);
$cnv_time -= ($cnv_hours * 3600);
my $cnv_minutes = int($cnv_time / 60);
$cnv_days = $cnv_days < 1 ? '' : $cnv_days .' days ';
$cnv_hours = $cnv_hours < 1 ? '' : $cnv_hours .' hours ';
$cnv_minutes = $cnv_minutes < 1 ? '' : $cnv_minutes . ' minutes ';
$cnv_time = $cnv_days . $cnv_hours . $cnv_minutes;
return $cnv_time;
}