From 6ab7c3bf277f2b4700a69d1145ed9aa3e1a450e0 Mon Sep 17 00:00:00 2001 From: jbjohnso Date: Sat, 6 Sep 2008 16:17:01 +0000 Subject: [PATCH] -IPMI reventlog 'all' now returns data as collected rather than all at the end -IPMI reventlog reads are no longer susceptible to 'Invalid or cancelled reservation ID', only writes git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@2077 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-server/lib/xcat/plugins/ipmi.pm | 169 ++++++++++++++++----------- 1 file changed, 101 insertions(+), 68 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/ipmi.pm b/xCAT-server/lib/xcat/plugins/ipmi.pm index ccf486edd..0b5b04b04 100644 --- a/xCAT-server/lib/xcat/plugins/ipmi.pm +++ b/xCAT-server/lib/xcat/plugins/ipmi.pm @@ -55,6 +55,9 @@ my $seqlun = 0x00; my @session_id = (0,0,0,0); my @challenge = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); my @seqnum = (0,0,0,0); +my $outfd; #File descriptor for children to send messages to parent +my $currnode; #string to describe current node, presumably nodename +my $globrc=0; my $userid; my $passwd; my $timeout; @@ -2441,6 +2444,7 @@ sub eventlog { my @output; my $num; my $entry; + my $skiptail=0; my @sel; #my $ipmisensoreventtab = "$ENV{XCATROOT}/lib/GUMI/ipmisensorevent.tab"; #my $ipmigenericeventtab = "$ENV{XCATROOT}/lib/GUMI/ipmigenericevent.tab"; @@ -2454,6 +2458,8 @@ sub eventlog { $subcommand = 'all'; } if($subcommand eq "all") { + $skiptail=1; + $num = 0x100 * 0x100; } elsif($subcommand eq "clear") { @@ -2536,41 +2542,46 @@ sub eventlog { return($rc,$text); } - @cmd=(0x42); - $error = docmd( - $netfun, - \@cmd, - \@returnd - ); + my $res_id_ls=0; + my $res_id_ms=0; + if ($subcommand =~ /clear/) { #Don't bother with a reservation unless a clear is involved + #atomic SEL retrieval need not require it, so an event during retrieval will not kill reventlog effort off + @cmd=(0x42); + $error = docmd( + $netfun, + \@cmd, + \@returnd + ); + + if($error) { + $rc = 1; + $text = $error; + return($rc,$text); + } + + $code = $returnd[36-$authoffset]; + + if($code == 0x00) { + } + elsif($code == 0x81) { + $rc = 1; + $text = "cannot execute command, SEL erase in progress"; + } + else { + $rc = 1; + $text = $codes{$code}; + } + + if($rc != 0) { + if(!$text) { + $text = sprintf("unknown response %02x",$code); + } + return($rc,$text); + } - if($error) { - $rc = 1; - $text = $error; - return($rc,$text); - } - - $code = $returnd[36-$authoffset]; - - if($code == 0x00) { - } - elsif($code == 0x81) { - $rc = 1; - $text = "cannot execute command, SEL erase in progress"; - } - else { - $rc = 1; - $text = $codes{$code}; - } - - if($rc != 0) { - if(!$text) { - $text = sprintf("unknown response %02x",$code); - } - return($rc,$text); - } - - my $res_id_ls = $returnd[37-$authoffset]; - my $res_id_ms = $returnd[38-$authoffset]; + $res_id_ls = $returnd[37-$authoffset]; + $res_id_ms = $returnd[38-$authoffset]; + } if($subcommand eq "clear") { @cmd=(0x47,$res_id_ls,$res_id_ms,0x43,0x4c,0x52,0xaa); @@ -2659,7 +2670,11 @@ sub eventlog { if($error) { $rc = 1; $text = $error; - push(@output,$text); + if ($skiptail) { + sendoutput($rc,$text); + return; + } + push(@output,$text); return($rc,@output); } @@ -2680,7 +2695,11 @@ sub eventlog { if(!$text) { $text = sprintf("unknown response %02x",$code); } - push(@output,$text); + if ($skiptail) { + sendoutput($rc,$text); + return; + } + push(@output,$text); return($rc,@output); } @@ -2690,10 +2709,10 @@ sub eventlog { @cmd=(0x43,$res_id_ls,$res_id_ms,$next_rec_ls,$next_rec_ms,0x00,0xFF); $entry++; - if($debug) { + if ($debug) { print "$entry: "; hexdump(\@sel_data); - } + } my $record_id = $sel_data[0] + $sel_data[1]*256; my $record_type = $sel_data[2]; @@ -2702,7 +2721,11 @@ sub eventlog { } else { $text=getoemevent($record_type,$mfg_id,\@sel_data); - push(@output,$text); + if ($skiptail) { + sendoutput($rc,$text); + } else { + push(@output,$text); + } if($next_rec_ms == 0xFF && $next_rec_ls == 0xFF) { last; } @@ -2710,8 +2733,8 @@ sub eventlog { } my $timestamp = ($sel_data[3] | $sel_data[4]<<8 | $sel_data[5]<<16 | $sel_data[6]<<24); - unless ($timestamp < 0x20000000) { - $timestamp -= $tfactor; + unless ($timestamp < 0x20000000) { #IPMI Spec says below this is effectively BMC uptime, not correctable + $timestamp -= $tfactor; #apply correction factor based on how off the current BMC clock is from management server } my ($seldate,$seltime) = timestamp2datetime($timestamp); # $text = "$entry: $seldate $seltime"; @@ -2814,7 +2837,11 @@ sub eventlog { $text = "$text - Recovered"; } - push(@output,$text); + if ($skiptail) { + sendoutput($rc,$text); + } else { + push(@output,$text); + } if($next_rec_ms == 0xFF && $next_rec_ls == 0xFF) { last; @@ -4826,8 +4853,9 @@ sub forward_data { #unserialize data from pipe, chunk at a time, use magic to de } sub donode { - my $outfd = shift; + $outfd = shift; my $node = shift; + $currnode=$node; my $bmcip = shift; my $user = shift; my $pass = shift; @@ -4840,34 +4868,39 @@ sub donode { my @exargs=@$extra; my ($rc,@output) = ipmicmd($bmcip,623,$user,$pass,$timeout,$retries,0,$command,@exargs); my @outhashes; - foreach(@output) { - my %output; - (my $desc,my $text) = split(/:/,$_,2); - unless ($text) { - $text=$desc; - } else { - $desc =~ s/^\s+//; - $desc =~ s/\s+$//; - if ($desc) { - $output{node}->[0]->{data}->[0]->{desc}->[0]=$desc; - } - } - $text =~ s/^\s+//; - $text =~ s/\s+$//; - $output{node}->[0]->{name}->[0]=$node; - $output{node}->[0]->{data}->[0]->{contents}->[0]=$text; - if ($rc) { - $output{node}->[0]->{errorcode}=$rc; - } - #push @outhashes,\%output; #Save everything for the end, don't know how to be slicker with Storable and a pipe - print $outfd freeze([\%output]); - print $outfd "\nENDOFFREEZE6sK4ci\n"; - yield; - waitforack($outfd); - } + sendoutput($rc,@output); yield; #my $msgtoparent=freeze(\@outhashes); # print $outfd $msgtoparent; } +sub sendoutput { + my $rc=shift; + foreach (@_) { + my %output; + (my $desc,my $text) = split(/:/,$_,2); + unless ($text) { + $text=$desc; + } else { + $desc =~ s/^\s+//; + $desc =~ s/\s+$//; + if ($desc) { + $output{node}->[0]->{data}->[0]->{desc}->[0]=$desc; + } + } + $text =~ s/^\s+//; + $text =~ s/\s+$//; + $output{node}->[0]->{name}->[0]=$currnode; + $output{node}->[0]->{data}->[0]->{contents}->[0]=$text; + if ($rc) { + $output{node}->[0]->{errorcode}=[$rc]; + } + #push @outhashes,\%output; #Save everything for the end, don't know how to be slicker with Storable and a pipe + print $outfd freeze([\%output]); + print $outfd "\nENDOFFREEZE6sK4ci\n"; + yield; + waitforack($outfd); + } +} + 1;