From 02c82d4a0411a7344a086114b4adeb4660ca8c39 Mon Sep 17 00:00:00 2001 From: Casandra Qiu Date: Mon, 7 Aug 2017 21:00:50 -0400 Subject: [PATCH] Support rspconfig command to change PDU's ip address, netmask and hostname --- xCAT-server/lib/xcat/plugins/pdu.pm | 97 ++++++++++++++++++- .../lib/xcat/plugins/switchdiscover.pm | 36 ++++++- 2 files changed, 129 insertions(+), 4 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/pdu.pm b/xCAT-server/lib/xcat/plugins/pdu.pm index c4e71ef96..2372152f5 100644 --- a/xCAT-server/lib/xcat/plugins/pdu.pm +++ b/xCAT-server/lib/xcat/plugins/pdu.pm @@ -177,6 +177,8 @@ sub process_request my $subcmd = $exargs[0]; if ($subcmd eq 'sshcfg') { process_sshcfg($noderange, $subcmd, $callback); + }elsif ($subcmd =~ /=/) { + process_netcfg($request, $subreq, $subcmd, $callback); } else { $callback->({ errorcode => [1],error => "The input $command $subcmd is not support for pdu"}); } @@ -467,6 +469,87 @@ 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 $nodes = $request->{node}; + my $rsp = {}; + + xCAT::MsgUtils->message("I", "set hostname "); + my @cmds = split(/,/,$subcmd); + foreach my $cmd (@cmds) { + my ($key, $value) = split(/=/, $cmd); + if ($key =~ /hostname/) { + $hostname = $value; + $args = "echo $hostname > /etc/hostname;/etc/init.d/hostname.sh"; + xCAT::Utils->runxcmd({ command => ['xdsh'], + node => $nodes, + arg => [ $args ] }, $subreq, 0, 1); + if ($::RUNCMD_RC != 0) { + xCAT::MsgUtils->message("I", "xdsh command to set hostname failed"); + } + }elsif ($key =~ /ip/) { + $ip = $value; + } elsif ($key =~ /netmask/) { + $netmask = $value; + } else { + xCAT::MsgUtils->message("I", "rspconfig $cmd is not support yet"); + } + } + + $args = "/dev/shm/bin/PduManager "; + my $opt; + if ($ip) { + $opt = "-i $ip "; + } + if ($netmask) { + $opt = $opt . "-n $netmask"; + } + if ($opt) { + my $dshcmd = $args . $opt ; + #comment this for now, coralPDU on the lab is not support PduManager yet + my $output = xCAT::Utils->runxcmd({ command => ['xdsh'], node => $nodes, arg => [ $dshcmd ] }, $subreq, 0, 1); + if ($::RUNCMD_RC != 0) { + xCAT::SvrUtils::sendmsg("@$output", $callback); + } + } +} + +#------------------------------------------------------- + +=head3 process_sshcfg + + Config passwordless for coralpdu + + example: rspconfig coralpdu sshcfg + +=cut + +#------------------------------------------------------- sub process_sshcfg { my $noderange = shift; my $subcmd = shift; @@ -585,6 +668,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,8 +710,6 @@ sub process_pdudiscover { my $rsp = {}; push @{ $rsp->{data} }, "$result"; xCAT::MsgUtils->message("I", $rsp, $callback); - - } diff --git a/xCAT-server/lib/xcat/plugins/switchdiscover.pm b/xCAT-server/lib/xcat/plugins/switchdiscover.pm index f39141092..a22b9d1a8 100644 --- a/xCAT-server/lib/xcat/plugins/switchdiscover.pm +++ b/xCAT-server/lib/xcat/plugins/switchdiscover.pm @@ -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]->{otherinterfaces}; + 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=$otherinterfaces,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; }