mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-04 05:12:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			189 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env perl
 | 
						|
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
 | 
						|
 | 
						|
# This script is used by UpdatexCATNodeStatus event response to handle the node
 | 
						|
# status changes from the condition NodeReachability and NodeReachability_H
 | 
						|
 | 
						|
BEGIN
 | 
						|
{
 | 
						|
    $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
 | 
						|
}
 | 
						|
 | 
						|
use strict;
 | 
						|
use Getopt::Std;
 | 
						|
use POSIX qw(strftime);
 | 
						|
 | 
						|
my $respname  = $ENV{ERRM_ER_NAME};
 | 
						|
my $cond_name = $ENV{ERRM_COND_NAME};
 | 
						|
my $batch     = 0;
 | 
						|
if (exists($ENV{ERRM_COND_BATCH})) { $batch = $ENV{ERRM_COND_BATCH}; }
 | 
						|
my $currtime;
 | 
						|
 | 
						|
if (!$batch) {
 | 
						|
    my $node;
 | 
						|
    my $status;
 | 
						|
    if ($cond_name eq "NodeReachability") {
 | 
						|
        $node   = $ENV{ERRM_RSRC_NAME};
 | 
						|
        $status = $ENV{ERRM_VALUE};
 | 
						|
    } elsif ($cond_name eq "NodeReachability_H") {
 | 
						|
 | 
						|
        # Parse the ERRM_VALUE attribute, which will contain the
 | 
						|
        # LastEvent 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 $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"')   { $node   = $attrValue; }
 | 
						|
            if ($attrName eq '"Status"') { $status = $attrValue; }
 | 
						|
        }
 | 
						|
    } else {
 | 
						|
`logger -t xcat -p local4.err  "[mon]: updatexcatnodestatus: This script does not handle condition $cond_name"`;
 | 
						|
        exit 1;
 | 
						|
    }
 | 
						|
    my $status_string;
 | 
						|
    if   ($status == 1) { $status_string = "alive"; }
 | 
						|
    else                { $status_string = "unreachable"; }
 | 
						|
 | 
						|
    if (!$currtime) {
 | 
						|
        my (
 | 
						|
            $sec, $min, $hour, $mday, $mon,
 | 
						|
            $year, $wday, $yday, $isdst
 | 
						|
          )
 | 
						|
          = localtime(time);
 | 
						|
        $currtime = sprintf("%02d-%02d-%04d %02d:%02d:%02d",
 | 
						|
            $mon + 1, $mday, $year + 1900,
 | 
						|
            $hour, $min, $sec);
 | 
						|
    }
 | 
						|
    my $result = `$::XCATROOT/sbin/chtab node=$node nodelist.status=$status_string nodelist.statustime="$currtime" 2>&1`;
 | 
						|
    my $code = $?;
 | 
						|
    if ($code) {
 | 
						|
`logger -t xcat -p local4.err "[mon]: Error saving node status ($node,$status_string) to xCAT:$result"`;
 | 
						|
        exit $code;
 | 
						|
    }
 | 
						|
} else {    #batch event
 | 
						|
    if ($cond_name ne "NodeReachability_Batch") {
 | 
						|
`logger -t xcat -p local4.err  "[mon]: updatexcatnodestatus: This script does not handle condition $cond_name"`;
 | 
						|
        exit 1;
 | 
						|
    }
 | 
						|
    if ($ENV{ERRM_COND_BATCH_NUM} > 0) {
 | 
						|
 | 
						|
        #check if event detail file exist
 | 
						|
        if (!exists($ENV{ERRM_EVENT_DETAIL_FILE})) {
 | 
						|
            xCAT::MsgUtils->message('S', "logeventtoxcat: no event detail file specified in the response $respname for condition $cond_name.\n");
 | 
						|
            exit(1);
 | 
						|
        }
 | 
						|
 | 
						|
        my $filename = $ENV{ERRM_EVENT_DETAIL_FILE};
 | 
						|
        if (!-f $filename) {
 | 
						|
            xCAT::MsgUtils->message('S', "logeventtoxcat: cannot find event detail file $filename in response $respname for condition $cond_name.\n");
 | 
						|
            exit(1);
 | 
						|
        }
 | 
						|
 | 
						|
        open(FILE1, "<$filename");
 | 
						|
        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;
 | 
						|
        my @active    = ();
 | 
						|
        my @inactive  = ();
 | 
						|
        my %new_value = ();
 | 
						|
        for ($count = 1 ; $count <= $num_events ; $count++) {
 | 
						|
            my $content = `sed -n "/Event $count:/,/ERRM_COND_BATCH/ p" $filename`;
 | 
						|
 | 
						|
            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 $node;
 | 
						|
            my $status;
 | 
						|
            my $status_string;
 | 
						|
            $node   = $content_hash{ERRM_RSRC_NAME};
 | 
						|
            $status = $content_hash{ERRM_VALUE};
 | 
						|
 | 
						|
            if   ($status == 1) { $new_value{$node} = 1; }
 | 
						|
            else                { $new_value{$node} = 0; }
 | 
						|
        }    #end for
 | 
						|
        foreach my $node (keys %new_value) {
 | 
						|
            if   ($new_value{$node} == 1) { push(@active,   $node); }
 | 
						|
            else                          { push(@inactive, $node); }
 | 
						|
        }    #end foreach
 | 
						|
 | 
						|
        if (@active > 0) {
 | 
						|
            if (!$currtime) {
 | 
						|
                my (
 | 
						|
                    $sec, $min, $hour, $mday, $mon,
 | 
						|
                    $year, $wday, $yday, $isdst
 | 
						|
                  )
 | 
						|
                  = localtime(time);
 | 
						|
                $currtime = sprintf("%02d-%02d-%04d %02d:%02d:%02d",
 | 
						|
                    $mon + 1, $mday, $year + 1900,
 | 
						|
                    $hour, $min, $sec);
 | 
						|
            }
 | 
						|
            my $node_string = join(',', @active);
 | 
						|
            my $result = `XCATBYPASS=Y $::XCATROOT/bin/nodech $node_string nodelist.status=active nodelist.statustime="$currtime" 2>&1`;
 | 
						|
            my $code = $?;
 | 
						|
            if ($code) {
 | 
						|
`logger -t xcat -p local4.warning "[mon]: Error saving node status ($node_string,active) to xCAT:$result"`;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        if (@inactive > 0) {
 | 
						|
            if (!$currtime) {
 | 
						|
                my (
 | 
						|
                    $sec, $min, $hour, $mday, $mon,
 | 
						|
                    $year, $wday, $yday, $isdst
 | 
						|
                  )
 | 
						|
                  = localtime(time);
 | 
						|
                $currtime = sprintf("%02d-%02d-%04d %02d:%02d:%02d",
 | 
						|
                    $mon + 1, $mday, $year + 1900,
 | 
						|
                    $hour, $min, $sec);
 | 
						|
            }
 | 
						|
            my $node_string = join(',', @inactive);
 | 
						|
            my $result = `XCATBYPASS=Y $::XCATROOT/bin/nodech $node_string nodelist.status=inactive nodelist.statustime="$currtime" 2>&1`;
 | 
						|
 | 
						|
            my $code = $?;
 | 
						|
            if ($code) {
 | 
						|
`logger -t xcat -p local4.warning  "[mon]: Error saving node status ($node_string,inactive) to xCAT:$result"`;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
exit 0
 | 
						|
 | 
						|
 |