mirror of
https://github.com/xcat2/xcat-core.git
synced 2025-05-29 17:23:08 +00:00
Fix issue 3497, make sense for reventlog msg
This commit is contained in:
parent
6315852abd
commit
e1e108ea6d
3491
perl-xCAT/xCAT/data/openbmcevents.pm
Normal file
3491
perl-xCAT/xCAT/data/openbmcevents.pm
Normal file
File diff suppressed because it is too large
Load Diff
@ -36,6 +36,8 @@ use xCAT_monitoring::monitorctrl;
|
||||
use POSIX qw(WNOHANG);
|
||||
use xCAT::Utils qw/natural_sort_cmp/;
|
||||
|
||||
use xCAT::data::openbmcevents;
|
||||
|
||||
$::VERBOSE = 0;
|
||||
# String constants for rbeacon states
|
||||
$::BEACON_STATE_OFF = "off";
|
||||
@ -429,6 +431,8 @@ my $flag_debug = "[openbmc_debug]";
|
||||
|
||||
my %login_pid_node; # used in process_request, record login fork pid map
|
||||
|
||||
my $event_mapping = "";
|
||||
|
||||
#-------------------------------------------------------
|
||||
|
||||
=head3 preprocess_request
|
||||
@ -672,6 +676,9 @@ rmdir \"/tmp/\$userid\" \n";
|
||||
|
||||
while (1) {
|
||||
unless ($wait_node_num) {
|
||||
if ($event_mapping and (ref($event_mapping) ne "HASH")) {
|
||||
xCAT::SvrUtils::sendmsg("$event_mapping, all event messages above are original", $callback);
|
||||
}
|
||||
if ($next_status{LOGIN_RESPONSE} eq "RSPCONFIG_SSHCFG_REQUEST") {
|
||||
my $home = xCAT::Utils->getHomeDir("root");
|
||||
unlink "$home/.ssh/copy.sh";
|
||||
@ -751,7 +758,7 @@ sub parse_args {
|
||||
return ([ 1, "Error parsing arguments." ]) if ($option !~ /V|verbose/);
|
||||
}
|
||||
|
||||
if (scalar(@ARGV) >= 2 and ($command =~ /rpower|rinv|rvitals/)) {
|
||||
if (scalar(@ARGV) >= 2 and ($command =~ /rpower|rinv|rvitals|reventlog/)) {
|
||||
return ([ 1, "Only one option is supported at the same time for $command" ]);
|
||||
} elsif (scalar(@ARGV) == 0 and $command =~ /rpower|rspconfig|rflash/) {
|
||||
return ([ 1, "No option specified for $command" ]);
|
||||
@ -780,10 +787,6 @@ sub parse_args {
|
||||
return ([ 1, "Unsupported command: $command $subcommand" ]);
|
||||
}
|
||||
} elsif ($command eq "reventlog") {
|
||||
my $option_s = 0;
|
||||
unless (GetOptions("s" => \$option_s,)) {
|
||||
return ([1, "Error parsing arguments." ]);
|
||||
}
|
||||
$subcommand = "all" if (!defined($ARGV[0]));
|
||||
unless ($subcommand =~ /^\d$|^\d+$|^all$|^clear$/) {
|
||||
return ([ 1, "Unsupported command: $command $subcommand" ]);
|
||||
@ -1064,12 +1067,6 @@ sub parse_command_status {
|
||||
}
|
||||
|
||||
if ($command eq "reventlog") {
|
||||
my $option_s = 0;
|
||||
if ($$subcommands[-1] and $$subcommands[-1] eq "-s") {
|
||||
$option_s = 1;
|
||||
pop(@$subcommands);
|
||||
}
|
||||
|
||||
if (defined($$subcommands[0])) {
|
||||
$subcommand = $$subcommands[0];
|
||||
} else {
|
||||
@ -1083,7 +1080,21 @@ sub parse_command_status {
|
||||
$next_status{LOGIN_RESPONSE} = "REVENTLOG_REQUEST";
|
||||
$next_status{REVENTLOG_REQUEST} = "REVENTLOG_RESPONSE";
|
||||
$status_info{REVENTLOG_RESPONSE}{argv} = "$subcommand";
|
||||
$status_info{REVENTLOG_RESPONSE}{argv} .= ",s" if ($option_s);
|
||||
my $policy_table = "/opt/ibm/ras/lib/policyTable.json";
|
||||
my $policy_mapping = "/opt/xcat/lib/perl/xCAT/data/openbmcevents.pm";
|
||||
if (-e "$policy_table") {
|
||||
my $policy_json = `cat $policy_table`;
|
||||
if ($policy_json) {
|
||||
my $policy_hash = decode_json $policy_json;
|
||||
$event_mapping = $policy_hash->{events};
|
||||
} else {
|
||||
$event_mapping = "No data in $policy_table";
|
||||
}
|
||||
} elsif (-e "$policy_mapping") {
|
||||
$event_mapping = $xCAT::data::openbmcevents::openbmc_event_mapping{events};
|
||||
} else {
|
||||
$event_mapping = "Could not found '$policy_mapping'";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -2147,42 +2158,26 @@ sub reventlog_response {
|
||||
xCAT::SvrUtils::sendmsg("clear", $callback, $node);
|
||||
}
|
||||
} else {
|
||||
my ($entry_string, $option_s) = split(",", $status_info{REVENTLOG_RESPONSE}{argv});
|
||||
my $entry_string = $status_info{REVENTLOG_RESPONSE}{argv};
|
||||
my $content_info;
|
||||
my %output = ();
|
||||
my $entry_num = 0;
|
||||
$entry_string = "all" if ($entry_string eq "0");
|
||||
$entry_num = 0 + $entry_string if ($entry_string ne "all");
|
||||
my $max_entry = 0;
|
||||
|
||||
foreach my $key_url (keys %{$response_info->{data}}) {
|
||||
my %content = %{ ${ $response_info->{data} }{$key_url} };
|
||||
my $timestamp = $content{Timestamp};
|
||||
my $id_num = 0 + $content{Id} if ($content{Id});
|
||||
if ($content{Message}) {
|
||||
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($content{Timestamp}/1000);
|
||||
$mon += 1;
|
||||
$year += 1900;
|
||||
my $UTC_time = sprintf ("%02d/%02d/%04d %02d:%02d:%02d", $mon, $mday, $year, $hour, $min, $sec);
|
||||
my $content_info = $UTC_time . " [$content{Id}] " . $content{Message};
|
||||
$output{$timestamp} = $content_info;
|
||||
}
|
||||
next unless ($content{Id});
|
||||
my $id_num = 0 + $content{Id};
|
||||
my $event_msg = parse_event_data(\%content);
|
||||
$output{$id_num} = $event_msg if ($event_msg);
|
||||
$max_entry = $id_num if ($id_num > $max_entry);
|
||||
}
|
||||
|
||||
my $count = 0;
|
||||
if ($option_s) {
|
||||
xCAT::SvrUtils::sendmsg("$::NO_ATTRIBUTES_RETURNED", $callback, $node) if (!%output);
|
||||
foreach my $key ( sort { $b <=> $a } keys %output) {
|
||||
xCAT::MsgUtils->message("I", { data => ["$node: $output{$key}"] }, $callback) if ($output{$key});
|
||||
$count++;
|
||||
last if ($entry_string ne "all" and $count >= $entry_num);
|
||||
}
|
||||
} else {
|
||||
xCAT::SvrUtils::sendmsg("$::NO_ATTRIBUTES_RETURNED", $callback, $node) if (!%output);
|
||||
foreach my $key (sort keys %output) {
|
||||
xCAT::MsgUtils->message("I", { data => ["$node: $output{$key}"] }, $callback) if ($output{$key});
|
||||
$count++;
|
||||
last if ($entry_string ne "all" and $count >= $entry_num);
|
||||
}
|
||||
xCAT::SvrUtils::sendmsg("$::NO_ATTRIBUTES_RETURNED", $callback, $node) if (!%output);
|
||||
foreach my $key ( sort { $a <=> $b } keys %output) {
|
||||
xCAT::MsgUtils->message("I", { data => ["$node: $output{$key}"] }, $callback) if ($entry_string eq "all" or $key > ($max_entry - $entry_num));
|
||||
}
|
||||
}
|
||||
|
||||
@ -2196,6 +2191,82 @@ sub reventlog_response {
|
||||
|
||||
#-------------------------------------------------------
|
||||
|
||||
=head3 parse_event_data
|
||||
|
||||
Parse reventlog data
|
||||
Input:
|
||||
$content: data for single entry
|
||||
|
||||
=cut
|
||||
|
||||
#-------------------------------------------------------
|
||||
sub parse_event_data {
|
||||
my $content = shift;
|
||||
my $content_info = "";
|
||||
|
||||
my $timestamp = $$content{Timestamp};
|
||||
my $id_num = $$content{Id};
|
||||
if ($$content{Message}) {
|
||||
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($$content{Timestamp}/1000);
|
||||
$mon += 1;
|
||||
$year += 1900;
|
||||
my $UTC_time = sprintf ("%02d/%02d/%04d %02d:%02d:%02d", $mon, $mday, $year, $hour, $min, $sec);
|
||||
my $messgae = $$content{Message};
|
||||
my $callout;
|
||||
my $msg_pid;
|
||||
my $i2c_device;
|
||||
my $esel;
|
||||
|
||||
if (defined $$content{AdditionalData} and $$content{AdditionalData}) {
|
||||
foreach my $addition (@{ $$content{AdditionalData} }) {
|
||||
if ($addition =~ /CALLOUT_INVENTORY_PATH=(.+)/) {
|
||||
$callout = $1;
|
||||
}
|
||||
if ($addition =~ /CALLOUT_DEVICE_PATH/) {
|
||||
$callout = "I2C";
|
||||
my @info = split("=", $addition);
|
||||
my $tmp = $info[1];
|
||||
my @tmp_data = split("/", $tmp);
|
||||
my $data_num = @tmp_data;
|
||||
$i2c_device = join("/", @tmp_data[($data_num-4)..($data_num-1)])
|
||||
}
|
||||
if ($addition =~ /ESEL/) {
|
||||
my @info = split("=", $addition);
|
||||
$esel = $info[1];
|
||||
# maybe useful, so leave it here
|
||||
}
|
||||
if ($addition =~ /GPU/) {
|
||||
my @info = split(" ", $addition);
|
||||
$callout = "/xyz/openbmc_project/inventory/system/chassis/motherboard/gpu" . $info[-1];
|
||||
}
|
||||
if ($addition =~ /PID=(\d*)/) {
|
||||
$msg_pid = $1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$messgae .= "||$callout" if ($callout);
|
||||
|
||||
if (ref($event_mapping) eq "HASH") {
|
||||
if ($event_mapping->{$messgae}) {
|
||||
my $event_type = $event_mapping->{$messgae}{EventType};
|
||||
my $event_message = $event_mapping->{$messgae}{Message};
|
||||
my $severity = $event_mapping->{$messgae}{Severity};
|
||||
my $affect = $event_mapping->{$messgae}{AffectedSubsystem};
|
||||
$content_info = "$UTC_time [$id_num]: $event_type, ($severity) $event_message (AffectedSubsystem: $affect, PID: $msg_pid), Resolved: $$content{Resolved}";
|
||||
} else {
|
||||
$content_info = "$UTC_time [$id_num]: Not found in policy table: $messgae (PID: $msg_pid), Resolved: $$content{Resolved}";
|
||||
}
|
||||
} else {
|
||||
$content_info = "$UTC_time [$id_num]: $messgae (PID: $msg_pid), Resolved: $$content{Resolved}";
|
||||
}
|
||||
}
|
||||
|
||||
return $content_info;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------
|
||||
|
||||
=head3 rspconfig_response
|
||||
|
||||
Deal with response of rspconfig command
|
||||
|
Loading…
x
Reference in New Issue
Block a user