diff --git a/perl-xCAT/xCAT/Usage.pm b/perl-xCAT/xCAT/Usage.pm index 3392e2668..efa72327e 100755 --- a/perl-xCAT/xCAT/Usage.pm +++ b/perl-xCAT/xCAT/Usage.pm @@ -85,7 +85,9 @@ my %usage = ( OpenPOWER (OpenBMC) specific: rvitals noderange [temp|voltage|wattage|fanspeed|power|altitude|all] MIC specific: - rvitals noderange {thermal|all}", + rvitals noderange {thermal|all} + pdu specific: + rvitals noderange ", "reventlog" => "Usage: reventlog [all [-s]|clear| [-s]] [-V|--verbose] reventlog [-h|--help|-v|--version]", diff --git a/xCAT-server/lib/xcat/plugins/pdu.pm b/xCAT-server/lib/xcat/plugins/pdu.pm index c4e71ef96..8fab55a0d 100644 --- a/xCAT-server/lib/xcat/plugins/pdu.pm +++ b/xCAT-server/lib/xcat/plugins/pdu.pm @@ -7,6 +7,7 @@ Supported command: rpower rinv + rvitals =cut @@ -63,6 +64,7 @@ sub handled_commands return { rpower => ["nodehm:mgt","pduoutlet:pdu=\.\*"], rinv => ["nodehm:mgt"], + rvitals => ["nodehm:mgt"], nodeset => ["nodehm:mgt"], rspconfig => ["nodehm:mgt"], pdudiscover => "pdu", @@ -138,11 +140,13 @@ sub process_request #fill in the total outlet count for each pdu $pdutab = xCAT::Table->new('pdu'); @pduents = $pdutab->getAllNodeAttribs(['node', 'outlet']); - fill_outletCount(\@pduents, $callback); + #fill_outletCount(\@pduents, $callback); if( $command eq "rinv") { #for higher performance, handle node in batch - return powerstat($noderange, $callback); + return showMFR($noderange, $callback); + }elsif ($command eq "rvitals") { + return showMonitorData($noderange, $callback); }elsif ($command eq "rpower") { my $subcmd = $exargs[0]; if (($subcmd eq 'pduoff') || ($subcmd eq 'pduon') || ($subcmd eq 'pdustat')|| ($subcmd eq 'pdureset') ){ @@ -177,6 +181,9 @@ sub process_request my $subcmd = $exargs[0]; if ($subcmd eq 'sshcfg') { process_sshcfg($noderange, $subcmd, $callback); + }elsif ($subcmd =~ /ip|netmask|hostname/) { + print "prcess_netcfg\n"; + process_netcfg($request, $subreq, $subcmd, $callback); } else { $callback->({ errorcode => [1],error => "The input $command $subcmd is not support for pdu"}); } @@ -467,11 +474,107 @@ sub connectTopdu { } +#------------------------------------------------------- + +=head3 process_netcfg + + Config hostname of PDU + Config ip/netmask of PDU via PduManager command + PduManager is a tool for CoralPdu to manager the PDU. + * /dev/shm/bin/PduManager -h + '-i' set PDU system IP + '-n' set system ip netmask. e.g.:PduManager -i xxx.xxx.xxx.xxx -n xxx.xxx.xxx.xxx + + example: rspconfig coralpdu hostname=coralpdu + rspconfig coralpdu ip=1.1.1.1 netmask=255.0.0.0 + +=cut + +#------------------------------------------------------- +sub process_netcfg { + my $request = shift; + my $subreq = shift; + my $subcmd = shift; + my $callback = shift; + my $hostname; + my $ip; + my $netmask; + my $args; + my $ret; + my $err; + + my $extrargs = $request->{arg}; + my @exargs = ($request->{arg}); + if (ref($extrargs)) { + @exargs = @$extrargs; + } + + my $nodes = $request->{node}; + my $pdu = @$nodes; + my $rsp = {}; + + my $nodetab = xCAT::Table->new('hosts'); + my $nodehash = $nodetab->getNodesAttribs($nodes,['ip','otherinterfaces']); + + # connect to PDU + my $static_ip = $nodehash->{$pdu}->[0]->{ip}; + my $discover_ip = $nodehash->{$pdu}->[0]->{otherinterfaces}; + my ($exp, $errstr) = session_connect($static_ip, $discover_ip); + + foreach my $cmd (@exargs) { + my ($key, $value) = split(/=/, $cmd); + if ($key =~ /hostname/) { + $hostname = $value; + ($ret, $err) = session_exec($exp, "echo $hostname > /etc/hostname;/etc/init.d/hostname.sh"); + if (defined $err) { + xCAT::SvrUtils::sendmsg("Failed to set hostname", $callback); + } + }elsif ($key =~ /ip/) { + $ip = $value; + } elsif ($key =~ /netmask/) { + $netmask = $value; + } else { + xCAT::SvrUtils::sendmsg("rspconfig $cmd is not support yet, ignored", $callback); + } + } + + $args = "/dev/shm/bin/PduManager "; + my $opt; + if ($ip) { + $opt = "-i $ip "; + } + if ($netmask) { + $opt = $opt . "-n $netmask"; + } + if ($opt) { + my $dshcmd = $args . $opt ; + xCAT::SvrUtils::sendmsg($dshcmd, $callback); + #comment this for now, coralPDU on the lab is not support PduManager yet + ($ret, $err) = session_exec($exp, $dshcmd); + if (defined $err) { + xCAT::SvrUtils::sendmsg("Failed to run $dshcmd", $callback); + } + } + $exp->hard_close(); +} + +#------------------------------------------------------- + +=head3 process_sshcfg + + Config passwordless for coralpdu + + example: rspconfig coralpdu sshcfg + +=cut + +#------------------------------------------------------- sub process_sshcfg { my $noderange = shift; my $subcmd = shift; my $callback = shift; + #this is default password for CoralPDU my $password = "password8"; my $userid = "root"; my $timeout = 10; @@ -492,20 +595,7 @@ sub process_sshcfg { my $static_ip = $nodehash->{$pdu}->[0]->{ip}; my $discover_ip = $nodehash->{$pdu}->[0]->{otherinterfaces}; - my $ssh_ip; - - my $p = Net::Ping->new(); - if ($p->ping($static_ip)) { - $ssh_ip = $static_ip; - } elsif ($p->ping($discover_ip)) { - $ssh_ip = $discover_ip; - } else { - $msg = " is not reachable"; - xCAT::SvrUtils::sendmsg($msg, $callback, $pdu, %allerrornodes); - next; - } - - my ($exp, $errstr) = session_connect($ssh_ip, $userid, $password, $timeout); + my ($exp, $errstr) = session_connect($static_ip, $discover_ip); if (!defined $exp) { $msg = " Failed to connect $errstr"; xCAT::SvrUtils::sendmsg($msg, $callback, $pdu, %allerrornodes); @@ -519,10 +609,6 @@ sub process_sshcfg { ($ret, $err) = session_exec($exp, "chmod 700 /home/root/.ssh"); ($ret, $err) = session_exec($exp, "echo \"$rootkey\" >/home/root/.ssh/authorized_keys"); ($ret, $err) = session_exec($exp, "chmod 644 /home/root/.ssh/authorized_keys"); - #config dhcp ip address to static - if ($ssh_ip eq $discover_ip) { - # ($ret, $err) = session_exec($exp, "ifconfig eth0 $static_ip"); - } $exp->hard_close(); } @@ -531,14 +617,27 @@ sub process_sshcfg { } sub session_connect { - my $server = shift; - my $userid = shift; - my $password = shift; - my $timeout = shift; + my $static_ip = shift; + my $discover_ip = shift; - my $ssh = Expect->new; - my $command = 'ssh'; - my @parameters = ($userid . "@" . $server); + #default password for coral pdu + my $password = "password8"; + my $userid = "root"; + my $timeout = 10; + + my $ssh_ip; + my $p = Net::Ping->new(); + if ($p->ping($static_ip)) { + $ssh_ip = $static_ip; + } elsif ($p->ping($discover_ip)) { + $ssh_ip = $discover_ip; + } else { + return(undef, " is not reachable\n"); + } + + my $ssh = Expect->new; + my $command = 'ssh'; + my @parameters = ($userid . "@" . $ssh_ip); $ssh->debug(0); $ssh->log_stdout(0); # suppress stdout output.. @@ -585,6 +684,18 @@ sub session_exec { return($mbmatch); } +#----------------------------------------------------------------- + +=head3 process_pdudiscover + + Discover the pdu for a given range of DHCP ip address + it will call switchdiscover command with -s snmp --pdu options + + example: pdudiscover --range iprange -w + +=cut + +#------------------------------------------------------------------ sub process_pdudiscover { my $request = shift; my $sub_req = shift; @@ -615,10 +726,96 @@ sub process_pdudiscover { my $rsp = {}; push @{ $rsp->{data} }, "$result"; xCAT::MsgUtils->message("I", $rsp, $callback); +} +#------------------------------------------------------- +=head3 showMFR + + show MFR information of PDU via PduManager command + PduManager is a tool for CoralPdu to manager the PDU. + * /dev/shm/bin/PduManager -h + '-m' show MFR info + + example: rinv coralpdu + +=cut + +#------------------------------------------------------- + +sub showMFR { + my $noderange = shift; + my $callback = shift; + my $output; + + my $nodetab = xCAT::Table->new('hosts'); + my $nodehash = $nodetab->getNodesAttribs($noderange,['ip','otherinterfaces']); + + foreach my $pdu (@$noderange) { + # connect to PDU + my $static_ip = $nodehash->{$pdu}->[0]->{ip}; + my $discover_ip = $nodehash->{$pdu}->[0]->{otherinterfaces}; + my ($exp, $errstr) = session_connect($static_ip, $discover_ip); + if (defined $errstr) { + xCAT::SvrUtils::sendmsg("Failed to connect: $errstr", $callback); + } + + my ($ret, $err) = session_exec($exp, "/dev/shm/bin/PduManager -m"); + if (defined $err) { + xCAT::SvrUtils::sendmsg("Failed to list MFR information: $err", $callback); + } + if (defined $ret) { + xCAT::SvrUtils::sendmsg("$ret", $callback); + } + + $exp->hard_close(); + } } +#------------------------------------------------------- + +=head3 showMonitorData + + Show realtime monitor data(input voltage, current, power) + of PDU via PduManager command + PduManager is a tool for CoralPdu to manager the PDU. + * /dev/shm/bin/PduManager -h + '-d' show realtime monitor data(input voltage, current, power) + + example: rvitals coralpdu + +=cut + +#------------------------------------------------------- +sub showMonitorData { + my $noderange = shift; + my $callback = shift; + my $output; + + my $nodetab = xCAT::Table->new('hosts'); + my $nodehash = $nodetab->getNodesAttribs($noderange,['ip','otherinterfaces']); + + foreach my $pdu (@$noderange) { + # connect to PDU + my $static_ip = $nodehash->{$pdu}->[0]->{ip}; + my $discover_ip = $nodehash->{$pdu}->[0]->{otherinterfaces}; + my ($exp, $errstr) = session_connect($static_ip, $discover_ip); + + my $ret; + my $err; + + ($ret, $err) = session_exec($exp, "/dev/shm/bin/PduManager -d"); + if (defined $err) { + xCAT::SvrUtils::sendmsg("Failed to show monitor data: $err", $callback); + } + if (defined $ret) { + xCAT::SvrUtils::sendmsg("$ret", $callback,$pdu); + } + + $exp->hard_close(); + } +} + 1; diff --git a/xCAT-server/lib/xcat/plugins/switchdiscover.pm b/xCAT-server/lib/xcat/plugins/switchdiscover.pm index f39141092..edf5ce5ae 100644 --- a/xCAT-server/lib/xcat/plugins/switchdiscover.pm +++ b/xCAT-server/lib/xcat/plugins/switchdiscover.pm @@ -407,7 +407,7 @@ sub process_request { } if (!($result)) { - send_msg( \%request, 0, " No switch found "); + send_msg( \%request, 0, " No $device found "); return; } @@ -1404,15 +1404,18 @@ sub matchPredefineSwitch { } my $stype = get_switchtype($vendor); + if (exists($globalopt{pdu})) { + $stype="pdu"; + } send_msg($request, 0, "$device discovered and matched: $dswitch to $node" ); # only write to xcatdb if -w or --setup option specified if ( (exists($globalopt{w})) || (exists($globalopt{setup})) ) { if (exists($globalopt{pdu})) { - xCAT::Utils->runxcmd({ command => ['chdef'], arg => ['-t','node','-o',$node,"otherinterfaces=$ip",'status=Matched',"mac=$mac","switchtype=$stype","usercomment=$vendor"] }, $sub_req, 0, 1); + xCAT::Utils->runxcmd({ command => ['chdef'], arg => ['-t','node','-o',$node,"otherinterfaces=$ip",'status=Matched',"mac=$mac","usercomment=$vendor"] }, $sub_req, 0, 1); } else { - xCAT::Utils->runxcmd({ command => ['chdef'], arg => ['-t','node','-o',$node,"otherinterfaces=$ip",'status=Matched',"mac=$mac","switchtype=$stype","usercomment=$vendor","switchtype=$stype"] }, $sub_req, 0, 1); + xCAT::Utils->runxcmd({ command => ['chdef'], arg => ['-t','node','-o',$node,"otherinterfaces=$ip",'status=Matched',"mac=$mac","switchtype=$stype","usercomment=$vendor"] }, $sub_req, 0, 1); } } @@ -1436,6 +1439,35 @@ sub switchsetup { my $request = shift; my $sub_req = shift; if (exists($globalopt{pdu})) { + my $mytype = "pdu"; + my $nodetab = xCAT::Table->new('hosts'); + my $nodehash = $nodetab->getNodesAttribs(\@{${nodes_to_config}->{$mytype}},['ip','otherinterfaces']); + # get netmask from network table + my $nettab = xCAT::Table->new("networks"); + my @nets; + if ($nettab) { + @nets = $nettab->getAllAttribs('net','mask'); + } + + foreach my $pdu(@{${nodes_to_config}->{$mytype}}) { + my $cmd = "rspconfig $pdu sshcfg"; + xCAT::Utils->runcmd($cmd, 0); + my $ip = $nodehash->{$pdu}->[0]->{ip}; + my $mask; + foreach my $net (@nets) { + if (xCAT::NetworkUtils::isInSameSubnet( $net->{'net'}, $ip, $net->{'mask'}, 0)) { + $mask=$net->{'mask'}; + } + } + $cmd = "rspconfig $pdu hostname=$pdu ip=$ip netmask=$mask"; + xCAT::Utils->runcmd($cmd, 0); + if ($::RUNCMD_RC == 0) { + xCAT::Utils->runxcmd({ command => ['chdef'], arg => ['-t','node','-o',$pdu,"ip=$ip","otherinterfaces="] }, $sub_req, 0, 1); + } else { + send_msg($request, 0, "Failed to run rspconfig command to set ip/netmask\n"); + } + + } return; }