mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-03 21:02:34 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			127 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			4.3 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 LogEventToTealEventLog response to put RMC events into
 | 
						|
# the TEAL's x_tealeventlog table.  It handles both batch and non-batching events.
 | 
						|
 | 
						|
BEGIN
 | 
						|
{
 | 
						|
    $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
 | 
						|
}
 | 
						|
use lib "$::XCATROOT/lib/perl";
 | 
						|
use strict;
 | 
						|
use Getopt::Std;
 | 
						|
use POSIX qw(strftime);
 | 
						|
use xCAT::Utils;
 | 
						|
use xCAT::TableUtils;
 | 
						|
use xCAT::MsgUtils;
 | 
						|
use IO::File;
 | 
						|
use TEAL::Semaphore;
 | 
						|
use TEAL::event_id;
 | 
						|
 | 
						|
my $batch = 0;
 | 
						|
if (exists($ENV{ERRM_COND_BATCH})) { $batch = $ENV{ERRM_COND_BATCH}; }
 | 
						|
my @a        = ();
 | 
						|
my $condname = $ENV{ERRM_COND_NAME};
 | 
						|
my $respname = $ENV{ERRM_ER_NAME};
 | 
						|
my $eventid  = $TEAL::event_id::tabeventid{$condname};
 | 
						|
 | 
						|
if (!$batch) {    #handle single event
 | 
						|
    my $time         = $ENV{ERRM_TIME};
 | 
						|
    my $nodenamelist = $ENV{ERRM_NODE_NAMELIST};
 | 
						|
    $nodenamelist =~ s/\{(.*)\}/$1/;
 | 
						|
 | 
						|
    my $event = {
 | 
						|
        event_id      => $eventid,
 | 
						|
        time_occurred => convertTime($time),
 | 
						|
        src_comp      => $ENV{ERRM_RSRC_CLASS_PNAME},
 | 
						|
        src_loc_type  => "A",
 | 
						|
        src_loc       => "$nodenamelist##" . $ENV{ERRM_RSRC_NAME},
 | 
						|
        rpt_comp      => 'IBM.Condition',
 | 
						|
        rpt_loc_type  => "A",
 | 
						|
        rpt_loc       => $ENV{ERRM_NODE_NAME} . "##" . $ENV{ERRM_COND_NAME},
 | 
						|
        raw_data_fmt  => "0",
 | 
						|
        raw_data      => $ENV{ERRM_ATTR_PNAME} . "=" . $ENV{ERRM_VALUE},
 | 
						|
    };
 | 
						|
 | 
						|
    push(@a, $event);
 | 
						|
} else {    #handle event batching
 | 
						|
    if ($ENV{ERRM_COND_BATCH_NUM} > 0) {
 | 
						|
 | 
						|
        #check if event detail file exist
 | 
						|
        if (!exists($ENV{ERRM_EVENT_DETAIL_FILE})) {
 | 
						|
            xCAT::MsgUtils->message('S', "logeventtoteal: no event detail file specified in the response $respname for condition $condname.\n");
 | 
						|
            exit(1);
 | 
						|
        }
 | 
						|
 | 
						|
        my $filename = $ENV{ERRM_EVENT_DETAIL_FILE};
 | 
						|
        if (!-f $filename) {
 | 
						|
            xCAT::MsgUtils->message('S', "logeventtoteal: cannot find event detail file $filename in response $respname for condition $condname.\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;
 | 
						|
        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 $time         = $content_hash{ERRM_TIME};
 | 
						|
            my $nodenamelist = $content_hash{ERRM_NODE_NAMELIST};
 | 
						|
            $nodenamelist =~ s/\{(.*)\}/$1/;
 | 
						|
            my $event = {
 | 
						|
                event_id      => $eventid,
 | 
						|
                time_occurred => convertTime($time),
 | 
						|
                src_comp      => $content_hash{ERRM_RSRC_CLASS_PNAME},
 | 
						|
                src_loc_type  => "A",
 | 
						|
                src_loc => $nodenamelist . "##" . $content_hash{ERRM_RSRC_NAME},
 | 
						|
                rpt_comp     => "IBM.Condition",
 | 
						|
                rpt_loc_type => "A",
 | 
						|
                rpt_loc => $content_hash{ERRM_NODE_NAME} . "##" . $content_hash{ERRM_COND_NAME},
 | 
						|
                raw_data_fmt => "0",
 | 
						|
                raw_data => $content_hash{ERRM_ATTR_PNAME} . "=" . $content_hash{ERRM_VALUE},
 | 
						|
            };
 | 
						|
            push(@a, $event);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
my ($rc, $msg) = xCAT::TableUtils->logEventsToTealDatabase(\@a);
 | 
						|
if ($rc) {
 | 
						|
    xCAT::MsgUtils->message('S', "logeventtoteal:$msg. The condition is $condname. The response is $respname.\n");
 | 
						|
} else {
 | 
						|
    my $s = TEAL::Semaphore->new();
 | 
						|
    $s->post()
 | 
						|
}
 | 
						|
 | 
						|
# convert time string that can be used for timestamp datatype for db
 | 
						|
sub convertTime {
 | 
						|
    my ($seconds, $micro) = split(/\,/, $_[0]);
 | 
						|
 | 
						|
    #return strftime("%A %D %T", localtime($seconds));
 | 
						|
    my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($seconds);
 | 
						|
    my $result = sprintf("%4d-%02d-%02d %02d:%02d:%02d.%06d", $year + 1900, $mon + 1, $mday, $hour, $min, $sec, $micro);
 | 
						|
    return $result;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
exit $rc;
 | 
						|
 | 
						|
 |