#!/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; }