162 lines
5.1 KiB
Plaintext
162 lines
5.1 KiB
Plaintext
|
#!/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 user id 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 $logfn = join(' ', @ARGV);
|
||
|
my $delete=0;
|
||
|
if ($logfn =~ /-d/) {
|
||
|
$delete=1;
|
||
|
}
|
||
|
|
||
|
$logfn =~ s/-d//; #remove -d
|
||
|
|
||
|
# 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="===================================================================\n";;
|
||
|
$msg .= " Event Time: " . convertTime($EventTime) . "\n";
|
||
|
$msg .= " Condition name: $ENV{ERRM_COND_NAME}\n";
|
||
|
$msg .= " Event Type: $type\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;
|
||
|
my $isHMC=0;
|
||
|
if ($filename =~ /\/home\/hscroot\/tmp/) {
|
||
|
$isHMC=1;
|
||
|
$cmd="scp hscroot\@$sn_name:$filename $dirname/$bn";
|
||
|
}
|
||
|
else {
|
||
|
$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;
|
||
|
}
|
||
|
|
||
|
#log the events
|
||
|
if (open (FILE, ">>$logfn")) {
|
||
|
print FILE "$msg\n";
|
||
|
close (FILE);
|
||
|
}
|
||
|
#delete the batch file on the mn
|
||
|
`rm $dirname/$bn`;
|
||
|
|
||
|
#remove the batch file on the sn if needed
|
||
|
if ($delete) {
|
||
|
if ($isHMC) {
|
||
|
`ssh -l hscroot $sn_name "rm $filename"`;
|
||
|
} else {
|
||
|
`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));
|
||
|
}
|