xcat-core/xCAT-rmc/scripts/msg-hierarchical-event

112 lines
4.6 KiB
Plaintext
Raw Normal View History

#!/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.
# 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:
# $Occurred
# $ErrNum
# ...
# $NodeName --> Leaf Node:
# $ResourceName --> Resource
# $Attribute 1 --> Attr 1
# $Attribute 2 --> Attr 2
use strict;
use Getopt::Std;
use POSIX qw(strftime);
# 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 }];
my $where = join(' ', @ARGV);
# 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:
$Occurred, # One if the condition has been triggered
$ErrNum, # Non-zero if there was in error in the event registration
$ErrMsg, # The string msg related to ErrNum
$EventFlags, # Bit mask giving some additional info about the event
$EventTime, # Time of event expressed in seconds since 1/1/1970
$EventTimeMicros, # Number of microseconds past EventTime
$ResourceHandle, # Binary address of the RMC resource that caused the condition to be triggered
$NodeName, # The node on which the event occurred. For conditions that use the management domain scope (4),
# this will be the leaf node. For conditions that use the local scope (e.g. NodeReachability),
# this will be the FMS.
$NumAttrs, # Number of attr values from the resource returned in this event
$NumAttrsInExpr, # How many of the above were attributes in the event expression
$IndexForAttrs, # The starting index of the array of values. Until new fixed fields are added
# to LastEvent, this will be the element right after this one.
$AttrArray # This list of attribute names, types, and values
) = split(/,/, $event, 12);
my @attrArray = split(/,/, $AttrArray); # Note: parsing this way does not support SDs or SD Arrays that may be in this list
my ($ResourceName, $valuesMsg);
my $j = 0; # index into attrArray
for (my $i=0; $i<$NumAttrs; $i++) {
my $attrName = $attrArray[$j++];
my $attrType = $attrArray[$j++]; # Types <= 8 are "simple" types. Types > 8 are SDs and arrays.
my $attrValue = $attrArray[$j++];
if ($attrName eq '"Name"') { $ResourceName = $attrValue; }
$valuesMsg .= " Attribute Value $i: $attrName = $attrValue\n";
}
if (!length($ResourceName)) { $ResourceName = '(unknown)'; }
my $msg;
$msg .= "$severity $type occurred:\n";
$msg .= " MN Condition: $ENV{ERRM_COND_NAME}\n";
$msg .= " SN Condition: $ENV{ERRM_RSRC_NAME}\n";
$msg .= " SN: $ENV{ERRM_NODE_NAME}\n"; # do we have to use $ERRM_NODE_NAMELIST here?
$msg .= " Node: $NodeName\n";
$msg .= " Resource Name: $ResourceName\n";
$msg .= " Time: " . convertTime($EventTime) . " \n";
if (length($valuesMsg)) {
$msg .= " Attributes:\n";
$msg .= $valuesMsg;
}
# Skipped the following: $ERRM_EXPR $ERRM_RSRC_CLASS_PNAME $ERRM_DATA_TYPE $ERRM_NODE_NAMELIST $ERRM_RSRC_TYPE
#$str = escape_chars($str);
my $rc = system(qq(echo "$msg" | write $where)) >> 8;
exit $rc;
#open(CMD, "| wall") || die "Error: can not start wall command.\n";
#print CMD $msg;
#close(CMD);
# convert time string
sub convertTime {
my ($seconds, $micro) = split(/\./, $_[0]);
return strftime("%A %D %T", localtime($seconds));
}