diff --git a/xCAT-rmc/resources/mn/IBM.EventResponse/EmailRootBatchEvents_H.pm b/xCAT-rmc/resources/mn/IBM.EventResponse/EmailRootBatchEvents_H.pm new file mode 100644 index 000000000..db3a87e9a --- /dev/null +++ b/xCAT-rmc/resources/mn/IBM.EventResponse/EmailRootBatchEvents_H.pm @@ -0,0 +1,8 @@ +#!/usr/bin/perl + +$RES::EventResponse{'EmailRootBatchEvents_H'} = { + Name => q(EmailRootBatchEvents_H), + Locked => q(0), + Actions => q({[emailEvent,{127},{0},{86400},/opt/xcat/sbin/rmcmon/email-hierarchical-batch-event root -d,3,0,0,0,{},0]}), +}; +1; diff --git a/xCAT-rmc/scripts/email-hierarchical-batch-event b/xCAT-rmc/scripts/email-hierarchical-batch-event new file mode 100755 index 000000000..622716210 --- /dev/null +++ b/xCAT-rmc/scripts/email-hierarchical-batch-event @@ -0,0 +1,146 @@ +#!/usr/bin/env perl +# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html + +# Script to demonstrate how to parse out the event info that comes from a +# Condition that is watching another Condition in a hierarchical cluster environment. +# The condition that is being watched is a batch event. This script will go th the +# node that has the watched condition, get the event batch file. And parse the file +# and then send email to a user with the detailed info of the events in the batch file. +# The batch file will be then deleted if -d flag is set. + +# To use this script, create a Response that invokes this script with email address as the input. +# Then associate the Response with a Condition that is watching Conditions on other +# nodes. When the Conditions occur, this script will wall the relevant event information. + +# This info that is passed into this sample is structured as follows: +# EMS Condition/Event: +# $ENV{ERRM_COND_NAME} +# $ENV{ERRM_TYPEID} +# ... +# $ENV{ERRM_NODE_NAME} --> SN +# $ENV{ERRM_RSRC_NAME} --> SN Condition +# $ENV{ERRM_VALUE} --> SN Event: LastBatchedEventFile +# $Saved +# $FileName +# $Size + +use strict; +use Getopt::Std; +use POSIX qw(strftime); +use File::Basename; +use File::Path; + +my $user=shift; +my $delete=shift; +if (($delete) && ($delete eq '-d')) { + $delete=1; +} else { + $delete=0; +} + +# Convert Severity and Type environment variables from integers to strings +my @COND_SEVERITY = qw(Informational Warning Critical); +my @TYPE = ('event', 'rearm event'); +my $severity=$COND_SEVERITY[$ENV{ERRM_COND_SEVERITYID}]; +my $type=$TYPE[$ENV{ERRM_TYPEID }]; + + +# Parse the ERRM_VALUE attribute, which will contain the EventOccurred structured data variable from the Condition class +# The fields in this structured data variable are documented below where we parse them out. +my $event = $ENV{ERRM_VALUE}; +$event =~ s/^\[(.*)\]$/$1/; # SD variables have square brackets around them + +# This parse the LastEvent +my ( # split the SD into the following fields: + $Saved, # batch file has been saved + $filename, # location of the batch file + $Size, # The size of the batch file + ) = split(/,/, $event); + +my $sn_condname=$ENV{ERRM_RSRC_NAME}; +my $sn_name=$ENV{ERRM_NODE_NAME}; + +my ( + $EventTime, # Time of event expressed in seconds since 1/1/1970 + $EventTimeMicros, # Number of microseconds past EventTime + ) = split(/,/, $ENV{ERRM_TIME}); + +my $msg; +$msg .= "The following $type occurred:\n"; +$msg .= " Event Time: " . convertTime($EventTime) . "\n"; +$msg .= " Condition name: $ENV{ERRM_COND_NAME}\n"; +$msg .= " Severiry: $severity\n"; +$msg .= " Condition being monitored: $sn_condname\n"; +$msg .= " Node where the condition was monitored: $sn_name\n"; # do we have to use $ERRM_NODE_NAMELIST here? +$msg .= " SN batch files name: $filename\n"; + +#copy the batch file from sn to mn +$filename =~ s/"//g; +my $bn=basename($filename); + +#printf stderr "ful path :$filename\n"; +#printf stderr "base name:$bn\n"; + +my $dirname="/tmp/batch_process/"; +if (! -d $dirname) { + mkdir($dirname); +} +my $cmd="scp $sn_name:$filename $dirname/$bn"; +my $rc=`$cmd 2>&1`; +if ($? != 0) { + $msg .= "$rc\n"; +} + +#now process the batch file +open(FILE1, "<$dirname/$bn"); +readline(FILE1);#skip first 2 lines +readline(FILE1); +my $line1=readline(FILE1); +my @aTemp=split(/=/, $line1); +my $num_events=$aTemp[1]; +close(FILE1); + +my $count; +for ($count = 1; $count <= $num_events; $count++) { + my $content=`sed -n "/Event $count:/,/ERRM_COND_BATCH/ p" $dirname/$bn`; + + my @content_array=split(/\n/, $content); + pop(@content_array); #get rid of last line + shift(@content_array); #get rid of firt line + + my %content_hash=(); + foreach(@content_array) { + /([^\=]+)\=(.*)/; + $content_hash{$1}=$2; + } + + my $event = "Event count: $count\n"; + #$event .= " Event time: " . $content_hash{ERRM_TIME} . "\n"; + $event .= " Node where the event occurred: " . $content_hash{ERRM_NODE_NAMELIST} . "\n"; + $event .= " Resource class: " . $content_hash{ERRM_RSRC_CLASS_PNAME} . "\n"; + $event .= " Resource name: " . $content_hash{ERRM_RSRC_NAME} . "\n"; + $event .= " Attribute name: " . $content_hash{ERRM_ATTR_PNAME} . "\n"; + $event .= " Attribute value: " . $content_hash{ERRM_VALUE} . "\n\n"; + + $msg .= $event; +} + +#send the mail out +`echo "$msg"| mail -s "$severity $type: $ENV{ERRM_COND_NAME}" $user`; + +#delete the batch file on the mn +`rm $dirname/$bn`; + +#remove the batch file on the sn if needed +if ($delete) { + `ssh -l root $sn_name "rm $filename"`; +} + +exit; + + +# convert time string +sub convertTime { + my ($seconds, $micro) = split(/\./, $_[0]); + return strftime("%A %D %T", localtime($seconds)); +}