mirror of
https://github.com/xcat2/xcat-core.git
synced 2025-06-02 03:27:07 +00:00
503 lines
15 KiB
Perl
503 lines
15 KiB
Perl
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
|
|
|
|
package xCAT::FSPvitals;
|
|
use strict;
|
|
use Getopt::Long;
|
|
use xCAT::PPCcli qw(SUCCESS EXPECT_ERROR RC_ERROR NR_ERROR);
|
|
use xCAT::FSPpower;
|
|
use xCAT::Usage;
|
|
use xCAT::PPCvitals;
|
|
use xCAT::FSPUtils;
|
|
|
|
#use Data::Dumper;
|
|
|
|
|
|
##########################################################################
|
|
# Parse the command line for options and operands
|
|
##########################################################################
|
|
sub parse_args {
|
|
xCAT::PPCvitals::parse_args(@_);
|
|
}
|
|
|
|
##########################################################################
|
|
# Returns Frame voltages/currents
|
|
##########################################################################
|
|
sub enumerate_volt {
|
|
|
|
my $exp = shift;
|
|
my $d = shift;
|
|
|
|
my $mtms = @$d[2];
|
|
|
|
#my $volt = xCAT::PPCcli::lshwinfo( $exp, "frame", $mtms );
|
|
#my $Rc = shift(@$volt);
|
|
my $value = "Not supported by FSPvitals";
|
|
####################################
|
|
# Return error
|
|
####################################
|
|
#if ( $Rc != SUCCESS ) {
|
|
# return( [RC_ERROR, $value] );
|
|
#}
|
|
####################################
|
|
# Success - return voltages
|
|
####################################
|
|
return ([ SUCCESS, $value ]);
|
|
}
|
|
|
|
|
|
|
|
|
|
##########################################################################
|
|
# Returns cage temperatures
|
|
##########################################################################
|
|
sub enumerate_temp {
|
|
|
|
my $exp = shift;
|
|
my $frame = shift;
|
|
my %outhash = ();
|
|
}
|
|
|
|
##########################################################################
|
|
# Returns refcode ; In DFM, it will get both the LCD value and the Current Power status Value
|
|
##########################################################################
|
|
sub enumerate_lcds {
|
|
|
|
my $request = shift;
|
|
my $name = shift;
|
|
my $d = shift;
|
|
my $action = shift;
|
|
my $only_lcds = shift;
|
|
my $prefix = "Current LCD:";
|
|
my $power_status_prefix = "Current Power Status:";
|
|
my $Rc;
|
|
my @refcode;
|
|
my $c = 0;
|
|
|
|
my $values = xCAT::FSPUtils::fsp_api_action($request, $name, $d, $action);
|
|
$Rc = @$values[2];
|
|
my $data = @$values[1];
|
|
my $t_n = @$values[0];
|
|
if ($Rc != 0) {
|
|
my @names = split(/,/, $t_n);
|
|
my @t_data = split(/\n/, $data);
|
|
foreach my $n (@names) {
|
|
if ($data =~ /$n/) {
|
|
chomp $t_data[$c];
|
|
|
|
#push @refcode,[$n, "$prefix $t_data[$c]", $Rc];
|
|
if ($t_data[$c] =~ /Error/) {
|
|
if ($only_lcds == 0) {
|
|
push @refcode, [ $n, "$power_status_prefix $t_data[$c]", $Rc ];
|
|
}
|
|
push @refcode, [ $n, "$prefix $t_data[$c]", $Rc ];
|
|
} else {
|
|
if ($only_lcds == 0) {
|
|
|
|
# get power status
|
|
if ($data =~ /1\|/) {
|
|
push @refcode, [ $n, "$power_status_prefix on", $Rc ];
|
|
} else {
|
|
push @refcode, [ $n, "$power_status_prefix off", $Rc ];
|
|
}
|
|
}
|
|
|
|
# get lcd value
|
|
if ($t_data[$c] =~ /1\|(\w[\w\s]*)/) {
|
|
push @refcode, [ $n, "$prefix $1", $Rc ];
|
|
} else {
|
|
push @refcode, [ $n, "$prefix blank", $Rc ];
|
|
}
|
|
}
|
|
$c++;
|
|
} else {
|
|
push @refcode, [ $n, "$prefix $data", $Rc ];
|
|
if ($only_lcds == 0) {
|
|
push @refcode, [ $n, "$power_status_prefix $data", $Rc ];
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
my @array = split(/\n/, $data);
|
|
foreach my $a (@array) {
|
|
if ($a !~ /:\s?[^\s]*\s?[0|1]/) {
|
|
next;
|
|
}
|
|
my @t = split(/:/, $a);
|
|
my $name = $t[0];
|
|
$data = $t[1];
|
|
## it will not parse the power status if only lcds.
|
|
# $only_lcds = 0, it will get the power status
|
|
# $only_lcds = 0, not get the power status.
|
|
if ($only_lcds == 0) {
|
|
|
|
# get power status
|
|
if ($data =~ /1\|/) {
|
|
push @refcode, [ $name, "$power_status_prefix on", $Rc ];
|
|
} else {
|
|
push @refcode, [ $name, "$power_status_prefix off", $Rc ];
|
|
}
|
|
}
|
|
|
|
# get lcd value
|
|
if ($data =~ /1\|(\w[\w\s]*)/) {
|
|
push @refcode, [ $name, "$prefix $1", $Rc ];
|
|
} else {
|
|
push @refcode, [ $name, "$prefix blank", $Rc ];
|
|
}
|
|
}
|
|
}
|
|
return \@refcode;
|
|
}
|
|
|
|
##########################################################################
|
|
# Returns rack environmentals
|
|
##########################################################################
|
|
sub enumerate_rackenv {
|
|
|
|
my $request = shift;
|
|
my $name = shift;
|
|
my $d = shift;
|
|
|
|
#my $mtms = @$d[2];
|
|
my $Rc;
|
|
my $attr;
|
|
my $value;
|
|
my %outhash = ();
|
|
my $action = "get_rack_env";
|
|
|
|
my $values = xCAT::FSPUtils::fsp_api_action($request, $name, $d, $action);
|
|
$Rc = @$values[2];
|
|
my $data = @$values[1];
|
|
if ($Rc != 0) {
|
|
return ([ $Rc, @$values[1] ]);
|
|
}
|
|
|
|
my $i = 0;
|
|
my @t = split(/\n/, $data);
|
|
foreach my $td (@t) {
|
|
my ($attr, $value) = split(/:/, $td);
|
|
$outhash{$attr} = $value;
|
|
$outhash{$i}{$attr} = $value;
|
|
$i++;
|
|
}
|
|
|
|
return ([ 0, \%outhash ]);
|
|
}
|
|
|
|
|
|
|
|
##########################################################################
|
|
# Returns voltages/currents
|
|
##########################################################################
|
|
sub voltage {
|
|
|
|
my $request = shift;
|
|
my $hash = shift;
|
|
my $exp = shift;
|
|
my $hwtype = @$exp[2];
|
|
my @result = ();
|
|
my $text = "Frame Voltages: ";
|
|
my @prefix = (
|
|
"Frame Voltage (Vab): %sV",
|
|
"Frame Voltage (Vbc): %sV",
|
|
"Frame Voltage (Vca): %sV",
|
|
"Frame Current (Ia): %sA",
|
|
"Frame Current (Ib): %sA",
|
|
"Frame Current (Ic): %sA",
|
|
);
|
|
|
|
while (my ($mtms, $h) = each(%$hash)) {
|
|
while (my ($name, $d) = each(%$h)) {
|
|
|
|
#################################
|
|
# Voltages available in frame
|
|
#################################
|
|
#if ( @$d[4] ne "bpa" && @$d[4] ne "frame") {
|
|
# push @result, [$name,"$text Only available for BPA/Frame",1];
|
|
# next;
|
|
#}
|
|
#my $volt = enumerate_volt( $exp, $d );
|
|
#my $Rc = shift(@$volt);
|
|
|
|
#################################
|
|
# Output error
|
|
#################################
|
|
#if ( $Rc != SUCCESS ) {
|
|
# push @result, [$name,"$text @$volt[0]",$Rc];
|
|
# next;
|
|
#}
|
|
#################################
|
|
# Output value
|
|
#################################
|
|
#my @values = split /,/, @$volt[0];
|
|
#my $i = 0;
|
|
|
|
#foreach ( @prefix ) {
|
|
# my $value = sprintf($_, $values[$i++]);
|
|
# push @result, [$name,$value,$Rc];
|
|
#}
|
|
push @result, [ $name, "$text: Not supported in Direct FSP Management", 1 ];
|
|
}
|
|
}
|
|
return (\@result);
|
|
}
|
|
|
|
|
|
##########################################################################
|
|
# Returns temperatures for CEC
|
|
##########################################################################
|
|
sub temp {
|
|
|
|
my $request = shift;
|
|
my $hash = shift;
|
|
my $exp = shift;
|
|
my $hwtype = @$exp[2];
|
|
my @result = ();
|
|
my %frame = ();
|
|
my $prefix = "System Temperature:";
|
|
|
|
#########################################
|
|
# Group by frame
|
|
#########################################
|
|
while (my ($mtms, $h) = each(%$hash)) {
|
|
while (my ($name, $d) = each(%$h)) {
|
|
my $mtms = @$d[5];
|
|
|
|
push @result, [ $name, "System Temperature Not support in Direct FSP Management", -1 ];
|
|
|
|
#################################
|
|
# No frame commands for IVM
|
|
#################################
|
|
if ($hwtype eq "ivm") {
|
|
push @result, [ $name, "$prefix Not available (No BPA)", 0 ];
|
|
next;
|
|
}
|
|
#################################
|
|
# Temperatures not available
|
|
#################################
|
|
if (@$d[4] !~ /^(fsp|lpar|cec)$/) {
|
|
my $text = "$prefix Only available for CEC/LPAR";
|
|
push @result, [ $name, $text, 0 ];
|
|
next;
|
|
}
|
|
#################################
|
|
# Error - No frame
|
|
#################################
|
|
if ($mtms eq "0") {
|
|
push @result, [ $name, "$prefix Not available (No BPA)", 0 ];
|
|
next;
|
|
}
|
|
#################################
|
|
# Save node
|
|
#################################
|
|
$frame{$mtms}{$name} = $d;
|
|
}
|
|
}
|
|
|
|
return (\@result);
|
|
|
|
while (my ($mtms, $h) = each(%frame)) {
|
|
#################################
|
|
# Get temperatures this frame
|
|
#################################
|
|
my $temp = enumerate_temp($exp, $mtms);
|
|
my $Rc = shift(@$temp);
|
|
my $data = @$temp[0];
|
|
|
|
while (my ($name, $d) = each(%$h)) {
|
|
my $mtms = @$d[2];
|
|
|
|
#############################
|
|
# Output error
|
|
#############################
|
|
if ($Rc != SUCCESS) {
|
|
push @result, [ $name, "$prefix $data", $Rc ];
|
|
next;
|
|
}
|
|
#############################
|
|
# CEC not in frame
|
|
#############################
|
|
if (!exists($data->{$mtms})) {
|
|
push @result, [ $name, "$prefix CEC '$mtms' not found", 1 ];
|
|
next;
|
|
}
|
|
#############################
|
|
# Output value
|
|
#############################
|
|
my $cel = $data->{$mtms};
|
|
my $fah = ($cel * 1.8) + 32;
|
|
my $value = "$prefix $cel C ($fah F)";
|
|
push @result, [ $name, $value, $Rc ];
|
|
}
|
|
}
|
|
return (\@result);
|
|
}
|
|
|
|
##########################################################################
|
|
# Returns rack environmentals
|
|
##########################################################################
|
|
sub rackenv {
|
|
|
|
my $request = shift;
|
|
my $hash = shift;
|
|
my @result = ();
|
|
my %frame = ();
|
|
my $prefix = "Rack Environmentals:";
|
|
|
|
#########################################
|
|
# Group by frame
|
|
#########################################
|
|
while (my ($mtms, $h) = each(%$hash)) {
|
|
while (my ($name, $d) = each(%$h)) {
|
|
my $mtms = @$d[5];
|
|
|
|
|
|
#################################
|
|
# Temperatures not available
|
|
#################################
|
|
if (@$d[4] !~ /^(bpa|frame)$/) {
|
|
my $text = "$prefix Only available for BPA/Frame";
|
|
push @result, [ $name, $text, 0 ];
|
|
next;
|
|
}
|
|
|
|
my $action = "get_rack_env";
|
|
my $values = xCAT::FSPUtils::fsp_api_action($request, $name, $d, $action);
|
|
my $Rc = @$values[2];
|
|
my $data = @$values[1];
|
|
if ($Rc != 0) {
|
|
push @result, [ $name, $data, $Rc ];
|
|
next;
|
|
}
|
|
|
|
my @t = split(/\n/, $data);
|
|
foreach my $td (@t) {
|
|
push @result, [ $name, $td, $Rc ];
|
|
if (!exists($request->{verbose})) {
|
|
|
|
#if( $td =~ /^Rack altitude in meters/ ) {
|
|
if ($td =~ /^BPA-B total output in watts/) {
|
|
last;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
return (\@result);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
##########################################################################
|
|
# Returns system power status (on or off)
|
|
# This subroutine will not be used in DFM
|
|
# And the power status will be returned with lcds
|
|
##########################################################################
|
|
sub power {
|
|
return (xCAT::FSPpower::state(@_, "Current Power Status: ", 1));
|
|
}
|
|
|
|
##########################################################################
|
|
# Returns system state
|
|
##########################################################################
|
|
sub state {
|
|
return (xCAT::FSPpower::state(@_, "System State: "));
|
|
}
|
|
###########################################################################
|
|
# Returns system LCD status and the power status
|
|
##########################################################################
|
|
sub lcds {
|
|
my $request = shift;
|
|
my $hash = shift;
|
|
my $exp = shift;
|
|
my $result;
|
|
my $newids;
|
|
my $newnames;
|
|
my $newd;
|
|
my $action;
|
|
my $type;
|
|
my $only_lcds;
|
|
|
|
if ($request->{method} =~ /^lcds$/) {
|
|
$only_lcds = 1;
|
|
}
|
|
while (my ($mtms, $h) = each(%$hash)) {
|
|
while (my ($name, $d) = each(%$h)) {
|
|
$newids .= "$$d[0],";
|
|
$newnames .= "$name,";
|
|
$newd = $d;
|
|
if (defined($type) && $type ne $$d[4]) {
|
|
push @$result, [ $name, "$name\'s type is $$d[4]. Please get the lcds for $type and $$d[4] seperately", -1 ];
|
|
return $result;
|
|
}
|
|
$type = $$d[4];
|
|
}
|
|
}
|
|
|
|
if ($type eq "lpar") {
|
|
$action = "query_lcds";
|
|
} elsif ($type eq "blade") {
|
|
$action = "pblade_query_lcds";
|
|
} else {
|
|
$action = "cec_query_lcds";
|
|
}
|
|
|
|
$$newd[0] = $newids;
|
|
$result = enumerate_lcds($request, $newnames, $newd, $action, $only_lcds);
|
|
|
|
return $result;
|
|
}
|
|
|
|
sub lcds_orig {
|
|
my $request = shift;
|
|
my $hash = shift;
|
|
my $exp = shift;
|
|
my $hwtype = @$exp[2];
|
|
my @result = ();
|
|
my $text = "Current LCD:";
|
|
my $prefix = "Current LCD%d: %s";
|
|
my $rcode = undef;
|
|
my $refcodes = undef;
|
|
my $Rc = undef;
|
|
my $num = undef;
|
|
my $value = undef;
|
|
|
|
while (my ($mtms, $h) = each(%$hash)) {
|
|
while (my ($name, $d) = each(%$h)) {
|
|
$refcodes = enumerate_lcds($request, $name, $d);
|
|
$num = 1;
|
|
foreach $rcode (@$refcodes) {
|
|
$Rc = shift(@$rcode);
|
|
$value = sprintf($prefix, $num, @$rcode[0]);
|
|
push @result, [ $name, $value, $Rc ];
|
|
$num = $num + 1;
|
|
}
|
|
}
|
|
}
|
|
return \@result;
|
|
}
|
|
|
|
##########################################################################
|
|
# Returns all vitals
|
|
##########################################################################
|
|
sub all {
|
|
|
|
my @values = (
|
|
@{ rackenv(@_) },
|
|
@{ state(@_) },
|
|
@{ lcds(@_) },
|
|
);
|
|
|
|
my @sorted_values = sort { $a->[0] cmp $b->[0] } @values;
|
|
return (\@sorted_values);
|
|
}
|
|
|
|
|
|
1;
|
|
|