#!/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 "
";
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 .= "

";

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 "

";
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 .= "

";

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;
}