2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-06-13 01:40:26 +00:00

Merge pull request #3145 from whowutwut/rinv_firm

Enhancements to rinv code to complete development
This commit is contained in:
zet809
2017-06-19 16:54:13 +08:00
committed by GitHub
4 changed files with 74 additions and 73 deletions

View File

@ -28,18 +28,18 @@ BMC/MPA specific:
\ **rinv**\ \ *noderange*\ {\ **pci | model | serial | asset | vpd | mprom | deviceid | guid | firm | diag | dimm | bios | mparom | mac | all**\ }
OpenPOWER (using ipmi) server specific:
=======================================
OpenPOWER (IPMI) server specific:
=================================
\ **rinv**\ \ *noderange*\ [\ **model | serial | deviceid | uuid | guid | vpd | mprom | firm | all**\ ]
OpenPOWER (using openbmc) server specific:
==========================================
OpenPOWER (OpenBMC) server specific:
====================================
\ **rinv**\ \ *noderange*\ [\ **model | serial | deviceid | uuid | guid | vpd | mprom | firm | cpu | dimm | all**\ ]
\ **rinv**\ \ *noderange*\ [\ **model | serial | firm | cpu | dimm | all**\ ]
PPC (with HMC) specific:
@ -195,25 +195,25 @@ Calling \ **rinv**\ for VMware will display the UUID/GUID, number of CPUs, amou
\ **mprom**\
Retrieves mprom firmware level
Retrieves mprom firmware level.
\ **deviceid**\
Retrieves device identification. Usually device, manufacturing and product ids.
Retrieves device identification. Usually device, manufacturing and product IDs.
\ **uuid**\
Retrieves the universally unique identifier
Retrieves the universally unique identifier.
\ **guid**\
Retrieves the global unique identifier
Retrieves the global unique identifier .

View File

@ -97,10 +97,10 @@ my %usage = (
rinv [-h|--help|-v|--version]
BMC specific:
rinv <noderange> [mprom|deviceid|uuid|guid|vpd|dimm|all]
OpenPOWER (using ipmi) server specific:
OpenPOWER (IPMI) server specific:
rinv <noderange> [model|serial|deviceid|uuid|guid|vpd|mprom|firm|all]
OpenPOWER (using openbmc) server specific:
rinv <noderange> [model|serial|deviceid|uuid|guid|vpd|mprom|firm|cpu|dimm|all]
OpenPOWER (OpenBMC) server specific:
rinv <noderange> [model|serial|firm|cpu|dimm|all]
MPA specific:
rinv <noderange> [firm|bios|diag|mprom|sprom|mparom|mac|mtm]
PPC specific(with HMC):

View File

@ -10,13 +10,13 @@ B<rinv> [B<-h>|B<--help>|B<-v>|B<--version>]
B<rinv> I<noderange> {B<pci>|B<model>|B<serial>|B<asset>|B<vpd>|B<mprom>|B<deviceid>|B<guid>|B<firm>|B<diag>|B<dimm>|B<bios>|B<mparom>|B<mac>|B<all>}
=head2 OpenPOWER (using ipmi) server specific:
=head2 OpenPOWER (IPMI) server specific:
B<rinv> I<noderange> [B<model>|B<serial>|B<deviceid>|B<uuid>|B<guid>|B<vpd>|B<mprom>|B<firm>|B<all>]
=head2 OpenPOWER (using openbmc) server specific:
=head2 OpenPOWER (OpenBMC) server specific:
B<rinv> I<noderange> [B<model>|B<serial>|B<deviceid>|B<uuid>|B<guid>|B<vpd>|B<mprom>|B<firm>|B<cpu>|B<dimm>|B<all>]
B<rinv> I<noderange> [B<model>|B<serial>|B<firm>|B<cpu>|B<dimm>|B<all>]
=head2 PPC (with HMC) specific:
@ -125,19 +125,19 @@ Diagnostics information of firmware.
=item B<mprom>
Retrieves mprom firmware level
Retrieves mprom firmware level.
=item B<deviceid>
Retrieves device identification. Usually device, manufacturing and product ids.
Retrieves device identification. Usually device, manufacturing and product IDs.
=item B<uuid>
Retrieves the universally unique identifier
Retrieves the universally unique identifier.
=item B<guid>
Retrieves the global unique identifier
Retrieves the global unique identifier .
=item B<all>

View File

@ -416,7 +416,7 @@ sub parse_args {
}
} elsif ($command eq "rinv") {
$subcommand = "all" if (!defined($ARGV[0]));
unless ($subcommand =~ /^cpu$|^dimm$|^model$|^serial$|^firm$|^mac$|^vpd$|^mprom$|^deviceid$|^guid$|^uuid$|^all$/) {
unless ($subcommand =~ /^model$|^serial$|^firm$|^cpu$|^dimm$|^all$/) {
return ([ 1, "Unsupported command: $command $subcommand" ]);
}
} elsif ($command eq "getopenbmccons") {
@ -1018,10 +1018,10 @@ sub rinv_response {
my $grep_string;
if ($node_info{$node}{cur_status} eq "RINV_FIRM_RESPONSE") {
$grep_string = "firm";
} else {
$grep_string = $status_info{RINV_RESPONSE}{argv};
}
$grep_string = "firm";
} else {
$grep_string = $status_info{RINV_RESPONSE}{argv};
}
my $src;
my $content_info;
@ -1031,52 +1031,45 @@ sub rinv_response {
my %content = %{ ${ $response_info->{data} }{$key_url} };
if ($grep_string eq "firm") {
# This handles the data from the /xyz/openbmc_project/Software endpoint.
#
# Handle printing out all posssible Software values in a generic format:
# node: <Purpose> Software: <version> (<Activation>)
#
if (defined($content{Version}) and $content{Version}) {
my $firm_ver = "System Firmware Product Version: " . "$content{Version}";
xCAT::SvrUtils::sendmsg("$firm_ver", $callback, $node);
my $purpose_value = uc ((split(/\./, $content{Purpose}))[-1]);
my $activation_value = (split(/\./, $content{Activation}))[-1];
#
# The space below between "SOFTWARE:" and $content{Version} is intentional
# to cause the sorting of this line before any additional info lines
#
$content_info = "$purpose_value SOFTWARE: $content{Version} ($activation_value)";
push (@sorted_output, $content_info);
if ($content{ExtendedVersion} ne "") {
# ExtendedVersion is going to be a comma separated list of additional software
my @versions = split(',', $content{ExtendedVersion});
foreach my $ver (@versions) {
$content_info = "$purpose_value SOFTWARE: -- additional info: $ver";
push (@sorted_output, $content_info);
}
}
next;
}
}
} else {
if (! defined $content{Present}) {
# This should never happen, but if we find this, contact firmware team to fix...
xCAT::SvrUtils::sendmsg("ERROR: Invalid data for $key_url, contact firmware team!", $callback, $node);
next;
}
if (($grep_string eq "vpd" or $grep_string eq "model") and $key_url =~ /\/motherboard$/) {
my $partnumber = "BOARD Part Number: " . "$content{PartNumber}";
xCAT::SvrUtils::sendmsg("$partnumber", $callback, $node);
next if ($grep_string eq "model");
}
# SPECIAL CASE: If 'serial' or 'model' is specified, only return the system level information
if ($grep_string eq "serial" or $grep_string eq "model") {
if ($key_url ne "$openbmc_project_url/inventory/system") {
next;
}
}
if (($grep_string eq "vpd" or $grep_string eq "serial") and $key_url =~ /\/motherboard$/) {
my $serialnumber = "BOARD Serial Number: " . "$content{SerialNumber}";
xCAT::SvrUtils::sendmsg("$serialnumber", $callback, $node);
next if ($grep_string eq "serial");
}
if (($grep_string eq "vpd" or $grep_string eq "mprom") and $key_url =~ /\/motherboard$/) {
xCAT::SvrUtils::sendmsg("No mprom information is available", $callback, $node);
next if ($grep_string eq "mprom");
}
if (($grep_string eq "vpd" or $grep_string eq "deviceid") and $key_url =~ /\/motherboard$/) {
xCAT::SvrUtils::sendmsg("No deviceid information is available", $callback, $node);
next if ($grep_string eq "deviceid");
}
if ($grep_string eq "uuid") {
xCAT::SvrUtils::sendmsg("No uuid information is available", $callback, $node);
last;
}
if ($grep_string eq "guid") {
xCAT::SvrUtils::sendmsg("No guid information is available", $callback, $node);
last;
}
if ($grep_string eq "mac" and $key_url =~ /\/ethernet/) {
my $macaddress = "MAC: " . $content{MACAddress};
xCAT::SvrUtils::sendmsg("$macaddress", $callback, $node);
next;
}
if ($grep_string eq "all" or $key_url =~ /\/$grep_string/) {
if ($key_url =~ /\/(cpu\d*)\/(\w+)/) {
$src = "$1 $2";
} else {
@ -1084,17 +1077,25 @@ sub rinv_response {
}
foreach my $key (keys %content) {
# If not all options is specified, check whether the key string contains
# the keyword option. If so, add it to the return data
if ($grep_string ne "all" and ((lc($key) !~ m/$grep_string/i) and ($key_url !~ m/$grep_string/i)) ) {
next;
}
$content_info = uc ($src) . " " . $key . " : " . $content{$key};
push (@sorted_output, $node . ": ". $content_info); #Save output in array
push (@sorted_output, $content_info); #Save output in array
}
}
}
# If sorted array has any contents, sort it and print it
if (scalar @sorted_output > 0) {
@sorted_output = sort @sorted_output; #Sort all output
my $result = join "\n", @sorted_output; #Join into a single string for easier display
xCAT::SvrUtils::sendmsg("$result", $callback);
}
}
# If sorted array has any contents, sort it and print it
if (scalar @sorted_output > 0) {
# sort alpha, then numeric
my @sorted_output = grep {s/(^|\D)0+(\d)/$1$2/g,1} sort
grep {s/(\d+)/sprintf"%06.6d",$1/ge,1} @sorted_output;
xCAT::SvrUtils::sendmsg("$_", $callback, $node) foreach (@sorted_output);
} else {
xCAT::SvrUtils::sendmsg("$::NO_ATTRIBUTES_RETURNED", $callback, $node);
}
if ($next_status{ $node_info{$node}{cur_status} }) {
$node_info{$node}{cur_status} = $next_status{ $node_info{$node}{cur_status} };