diff --git a/xCAT-server/lib/xcat/plugins/hpblade.pm b/xCAT-server/lib/xcat/plugins/hpblade.pm
deleted file mode 100755
index 5d927f80e..000000000
--- a/xCAT-server/lib/xcat/plugins/hpblade.pm
+++ /dev/null
@@ -1,1880 +0,0 @@
-#!/usr/bin/env perl
-#
-# © Copyright 2009 Hewlett-Packard Development Company, L.P.
-# EPL license http://www.eclipse.org/legal/epl-v10.html
-#
-# Revision history:
-# August, 2009 blade.pm adapted to generate hpblade.pm
-#
-package xCAT_plugin::hpblade;
-BEGIN
-{
- $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
-}
-use lib "$::XCATROOT/lib/perl";
-
-use strict;
-use xCAT::Table;
-use xCAT::Utils;
-use xCAT::Usage;
-use IO::Socket;
-use Thread 'yield';
-use Storable qw(freeze thaw);
-use XML::Simple;
-use Net::SSLeay qw(die_now die_if_ssl_error);
-
-
-use Data::Dumper;
-use POSIX "WNOHANG";
-use Getopt::Long;
-use xCAT_plugin::hpoa;
-
-sub handled_commands {
- return {
- findme => 'blade',
- getmacs => 'nodehm:getmac,mgt',
- rscan => 'nodehm:mgt',
- rpower => 'nodehm:power,mgt',
- gethpbladecons => 'hpblade',
- getrvidparms => 'nodehm:mgt',
- rvitals => 'nodehm:mgt',
- rinv => 'nodehm:mgt',
- rbeacon => 'nodehm:mgt',
- rspreset => 'nodehm:mgt',
- rspconfig => 'nodehm:mgt',
- rbootseq => 'nodehm:mgt',
- reventlog => 'nodehm:mgt',
- switchblade => 'nodehm:mgt',
- };
-}
-
-my $hpoa;
-my $activeOABay;
-my $slot;
-my ($username, $password);
-my %mm_comm_pids;
-my %macmap; #Store responses from rinv for discovery
-my $macmaptimestamp; #reflect freshness of cache
-my %oahash;
-my $curn;
-my $oa;
-my $getBladeStatusResponse; # Make this a global here so we can re-use the result
-my $status_noop="XXXno-opXXX";
-my $eventHash;
-my $globalDebug = 0;
-my $ctx;
-my @cfgtext;
-
-my %bootdevices = (
- 0 => 'IPL_NO_OP',
- 1 => 'CD',
- 2 => 'FLOPPY',
- 3 => 'USB',
- 4 => 'HDD',
- 5 => 'PXE_NIC1',
- 6 => 'PXE_NIC2' ,
- 7 => 'PXE_NIC3',
- 8 => 'PXE_NIC4'
-);
-
-my %bootnumbers = (
- 'none' => 0,
- 'c' => 1,
- 'cd' => 1,
- 'dvd' => 1,
- 'cdrom' => 1,
- 'dvdrom' => 1,
- 'f' => 2,
- 'floppy' => 2,
- 'usb' => 3,
- 'h' => 4,
- 'hd' => 4,
- 'hdd' => 4,
- 'harddisk' => 4,
- 'eth0' => 5,
- 'nic1' => 5,
- 'pxe_nic1' => 5,
- 'eth1' => 6,
- 'nic2' => 6,
- 'pxe_nic2' => 6,
- 'eth2' => 7,
- 'nic3' => 7,
- 'pxe_nic3' => 7,
- 'eth3' => 8,
- 'nic4' => 8,
- 'pxe_nic4' => 8
-);
-
-my @rscan_attribs = qw(nodetype name id mtm serial mpa groups mgt);
-my @rscan_header = (
-["type", "%-8s" ],
-["name", "" ],
-["id", "%-8s" ],
-["type-model", "%-12s" ],
-["serial-number", "%-15s" ],
-["address", "%s\n" ]);
-
-sub waitforack {
- my $sock = shift;
- my $select = new IO::Select;
- $select->add($sock);
- my $str;
- if ($select->can_read(10)) { # Continue after 10 seconds, even if not acked...
- if ($str = <$sock>) {
- } else {
- $select->remove($sock); #Block until parent acks data
- }
- }
-}
-
-
-# Login to the OA using credentials found in the database.
-sub oaLogin {
- my $oaName = shift;
- my $result = "";
- my $hopa = "";
- my $errHash;
-
- # we need to get the info on the OA. If the specfied OA is NOT the
- # ACTIVE OA then we return failure because we can't get the desired
- # info from a STANDBY OA.
-
- my ($username, $passwd, $encinfo);
-
- my $mpatab = xCAT::Table->new('mpa');
- my $ent;
- if(defined($mpatab)) {
- ($ent) = $mpatab->getAttribs({'mpa'=>$oaName}, 'username', 'password');
- if (defined($ent->{password})) {$password = $ent->{password}; }
- if (defined($ent->{username})) {$username = $ent->{username}; }
- }
-
-
- $hpoa = hpoa->new('oaAddress' => $oaName);
- my $loginResponse = $hpoa->userLogIn('username' => $username, 'password' => $password);
- if($loginResponse->fault) {
- $errHash = $loginResponse->fault;
- print Dumper($errHash);
- $result = $loginResponse->oaErrorText;
- if($loginResponse->fault) {
- return(1, "Error on login attempt");
- }
- }
-
- my $response = $hpoa->getEnclosureInfo();
- if($response->fault) {
- return(1, "Error on get Enclosure Info call");
- }
- my $numOABays = $response->result->{oaBays};
-
- # OK We now know how many oaBays we have in this enclosure. Ask the OAs in each bay
- # if they are active. If they are not, then leave since we can't get what we want
- # from a standby OA
- $activeOABay = 0;
-
- for (my $oaBay = 1; $oaBay <= $numOABays; $oaBay++) {
- $response = $hpoa->getOaInfo(bayNumber=>$oaBay);
- if(!defined $response->result() || $response->result()->{oaRole} eq "OA_ABSENT" ||
- $response->result->{youAreHere} eq "false") {
- # either there is no OA here or this is not the one I am currently
- # communicating with
- next;
- } elsif ($response->result->{youAreHere} eq "true") {
- $activeOABay = $oaBay;
- last;
- }
- }
-
- if(! $activeOABay ) {
- return(1, "Cannot determine active OnBoard Administrator");
- }
-
- # Last thing. Need to determine if this is the active OA. If not, then we
- # just tell the caller, and they can make the decision as to what they want
- # to do.
-
- $response = $hpoa->getOaStatus(bayNumber=>$activeOABay);
- if($response->result->{oaRole} ne "ACTIVE") {
- return (-1);
- }
-
- return ($hpoa);
-}
-
-sub oaLogout
-{
- my $hpoa = shift;
-
- my $response = $hpoa->userLogOut();
-}
-
-sub convertSlot {
- my $origSlot = shift;
-
- if($origSlot =~ /\D/) {
- my $slotNum = $origSlot;
- my $slotAlpha = $slotNum;
-
- $slotNum =~ s/\D//;
- $slotAlpha =~ s/\d//;
-
- my $side;
- if ($slotAlpha eq "a" or $slotAlpha eq "A") {
- $side = 1;
- } elsif ($slotAlpha eq "b" or $slotAlpha eq "B") {
- $side = 2;
- } else {
- return(-1);
- }
-
- my $returnSlot = $side * 16 + $slotNum;
- return($returnSlot);
- }
- return($origSlot);
-}
-
-sub gethpbladecons {
- my $noderange = shift;
- my $callback=shift;
- my $mpatab = xCAT::Table->new('mpa');
- my $passtab = xCAT::Table->new('passwd');
- my $tmp;
- my $user="USERID";
-
- if ($passtab) {
- ($tmp)=$passtab->getAttribs({'key'=>'blade'},'username');
- if (defined($tmp)) {
- $user = $tmp->{username};
- }
- }
- my $mptab=xCAT::Table->new('mp');
- my $mptabhash = $mptab->getNodesAttribs($noderange,['mpa','id']);
- foreach my $node (@$noderange) {
- my $rsp = {node=>[{name=>[$node]}]};
- my $ent=$mptabhash->{$node}->[0]; #$mptab->getNodeAttribs($node,['mpa', 'id']);
- if (defined($ent->{mpa})) {
- $oa = $ent->{mpa};
- $slot = convertSlot($ent->{id});
- if($slot == 0) { # want to open a console on the OA
- $rsp->{node}->[0]->{mm} = $oa;
- } else {
- $hpoa = oaLogin($oa);
- my $mpInfoResp = $hpoa->getBladeMpInfo("bayNumber"=>$slot);
- if($mpInfoResp->fault) {
- $rsp->{node}->[0]->{error}= ["Error getting MP info"];
- $rsp->{node}->[0]->{errorcode} = [1];
- $callback->($rsp);
- next;
- }
- my $ipaddress = $mpInfoResp->result->{ipAddress};
- $rsp->{node}->[0]->{mm} = $ipaddress;
- }
- ($tmp) = $mpatab->getAttribs({'mpa'=>$oa}, 'username');
- $user = [$tmp->{username}];
- $rsp->{node}->[0]->{username} = $user;
- } else {
- $rsp->{node}->[0]->{error}=["no mpa defined"];
- $rsp->{node}->[0]->{errorcode}=[1];
- $callback->($rsp);
- next;
- }
- if (defined($ent->{id})) {
- $rsp->{node}->[0]->{slot}=$ent->{id};
- } else {
- $rsp->{node}->[0]->{slot}="";
- }
-
- $callback->($rsp);
- }
-}
-
-
-sub preprocess_request {
- my $request = shift;
- if ($request->{_xcatdest}) { return [$request]; } #exit if preprocessed
- my $callback=shift;
- my @requests;
-
- #display usage statement if -h is present or no noderage is specified
- my $noderange = $request->{node}; #Should be arrayref
- my $command = $request->{command}->[0];
- my $extrargs = $request->{arg};
- my @exargs=($request->{arg});
- if (ref($extrargs)) {
- @exargs=@$extrargs;
- }
-
- my $usage_string=xCAT::Usage->parseCommand($command, @exargs);
- if ($usage_string) {
- $callback->({data=>$usage_string});
- $request = {};
- return;
- }
-
- if (!$noderange) {
- $usage_string=xCAT::Usage->getUsage($command);
- $callback->({data=>$usage_string});
- $request = {};
- return;
- }
-
- #get the MMs for the nodes for the nodes in order to figure out which service nodes to send the requests to
- my $mptab = xCAT::Table->new("mp");
- unless ($mptab) {
- $callback->({data=>["Cannot open mp table"]});
- $request = {};
- return;
- }
- my %mpa_hash=();
- my $mptabhash = $mptab->getNodesAttribs($noderange,['mpa','id']);
- if ($request->{command}->[0] eq "gethpbladecons") { #Can handle it here and now
- gethpbladecons($noderange,$callback);
- return ();
- }
-
-
- foreach my $node (@$noderange) {
- my $ent=$mptabhash->{$node}->[0]; #$mptab->getNodeAttribs($node,['mpa', 'id']);
- if (defined($ent->{mpa})) { push @{$mpa_hash{$ent->{mpa}}{nodes}}, $node;}
- else {
- $callback->({data=>["no mpa defined for node $node"]});
- $request = {};
- return;
- }
- my $tempid;
- if (defined($ent->{id})) {
- #if the ide is defined, we need to see if there is a letter embedded in it. If there is,
- #then we need to convert the id to the correct slot
- $tempid = convertSlot($ent->{id});
- push @{$mpa_hash{$ent->{mpa}}{ids}}, $tempid;
- } else {
- push @{$mpa_hash{$ent->{mpa}}{ids}}, "";
- }
- }
-
- # find service nodes for the MMs
- # build an individual request for each service node
- my $service = "xcat";
- my @mms=keys(%mpa_hash);
- my $sn = xCAT::Utils->get_ServiceNode(\@mms, $service, "MN");
-
- # build each request for each service node
- foreach my $snkey (keys %$sn)
- {
- #print "snkey=$snkey\n";
- my $reqcopy = {%$request};
- $reqcopy->{'_xcatdest'} = $snkey;
- my $mms1=$sn->{$snkey};
- my @moreinfo=();
- my @nodes=();
- foreach (@$mms1) {
- push @nodes, @{$mpa_hash{$_}{nodes}};
- push @moreinfo, "\[$_\]\[" . join(',',@{$mpa_hash{$_}{nodes}}) ."\]\[" . join(',',@{$mpa_hash{$_}{ids}}) . "\]";
- }
- $reqcopy->{node} = \@nodes;
- #print "nodes=@nodes\n";
- $reqcopy->{moreinfo}=\@moreinfo;
- push @requests, $reqcopy;
- }
- return \@requests;
-}
-
-sub build_more_info{
- my $noderange=shift;
- my $callback=shift;
- my $mptab = xCAT::Table->new("mp");
- my @moreinfo=();
- unless ($mptab) {
- $callback->({data=>["Cannot open mp table"]});
- return @moreinfo;
- }
- my %mpa_hash=();
- my $mptabhash = $mptab->getNodesAttribs($noderange,['mpa','id']);
- foreach my $node (@$noderange) {
- my $ent=$mptabhash->{$node}->[0]; #$mptab->getNodeAttribs($node,['mpa', 'id']);
- if (defined($ent->{mpa})) { push @{$mpa_hash{$ent->{mpa}}{nodes}}, $node;}
- else {
- $callback->({data=>["no mpa defined for node $node"]});
- return @moreinfo;;
- }
- if (defined($ent->{id})) { push @{$mpa_hash{$ent->{mpa}}{ids}}, $ent->{id};}
- else { push @{$mpa_hash{$ent->{mpa}}{ids}}, "";}
- }
-
- foreach (keys %mpa_hash) {
- push @moreinfo, "\[$_\]\[" . join(',',@{$mpa_hash{$_}{nodes}}) ."\]\[" . join(',',@{$mpa_hash{$_}{ids}}) . "\]";
-
- }
-
- return \@moreinfo;
-}
-
-sub handle_depend {
- my $request = shift;
- my $callback = shift;
- my $doreq = shift;
- my $dp = shift;
- my %node = ();
- my $dep = @$dp[0];
- my $dep_hash = @$dp[1];
-
- # send all dependencies (along w/ those dependent on nothing)
- # build moreinfo for dependencies
- my %mpa_hash = ();
- my @moreinfo=();
- my $reqcopy = {%$request};
- my @nodes=();
-
- foreach my $node (keys %$dep) {
- my $mpa = @{$dep_hash->{$node}}[0];
- push @{$mpa_hash{$mpa}{nodes}},$node;
- push @{$mpa_hash{$mpa}{ids}}, @{$dep_hash->{$node}}[1];
- }
- foreach (keys %mpa_hash) {
- push @nodes, @{$mpa_hash{$_}{nodes}};
- push @moreinfo, "\[$_\]\[" . join(',',@{$mpa_hash{$_}{nodes}}) ."\]\[" . join(',',@{$mpa_hash{$_}{ids}}) . "\]";
- }
- $reqcopy->{node} = \@nodes;
- $reqcopy->{moreinfo}=\@moreinfo;
- process_request($reqcopy,$callback,$doreq,1);
-
- my $start = Time::HiRes::gettimeofday();
-
- # build list of dependent nodes w/delays
- while(my ($name,$h) = each(%$dep) ) {
- foreach ( keys %$h ) {
- if ( $h->{$_} =~ /(^\d+$)/ ) {
- $node{$_} = $1/1000.0;
- }
- }
- }
- # send each dependent node as its delay expires
- while (%node) {
- my @noderange = ();
- my $delay = 0.1;
- my $elapsed = Time::HiRes::gettimeofday()-$start;
-
- # sort in ascending delay order
- foreach (sort {$node{$a} <=> $node{$b}} keys %node) {
- if ($elapsed < $node{$_}) {
- $delay = $node{$_}-$elapsed;
- last;
- }
- push @noderange,$_;
- delete $node{$_};
- }
- if (@noderange) {
- %mpa_hash=();
- foreach my $node (@noderange) {
- my $mpa = @{$dep_hash->{$node}}[0];
- push @{$mpa_hash{$mpa}{nodes}},$node;
- push @{$mpa_hash{$mpa}{ids}}, @{$dep_hash->{$node}}[1];
- }
-
- @moreinfo=();
- $reqcopy = {%$request};
- @nodes=();
-
- foreach (keys %mpa_hash) {
- push @nodes, @{$mpa_hash{$_}{nodes}};
- push @moreinfo, "\[$_\]\[" . join(',',@{$mpa_hash{$_}{nodes}}) ."\]\[" . join(',',@{$mpa_hash{$_}{ids}}) . "\]";
- }
- $reqcopy->{node} = \@nodes;
- $reqcopy->{moreinfo}=\@moreinfo;
-
- # clear global hash variable
- %oahash = ();
- process_request($reqcopy,$callback,$doreq,1);
- }
- # millisecond sleep
- Time::HiRes::sleep($delay);
- }
- return 0;
-}
-
-sub build_depend {
- my $noderange = shift;
- my $exargs = shift;
- my $depstab = xCAT::Table->new('deps');
- my $mptab = xCAT::Table->new('mp');
- my %dp = ();
- my %no_dp = ();
- my %mpa_hash;
-
- if (!defined($depstab)) {
- return([\%dp]);
- }
- unless ($mptab) {
- return("Cannot open mp table");
- }
-
- my $depset = $depstab->getNodesAttribs($noderange,[qw(nodedep msdelay cmd)]);
- foreach my $node (@$noderange) {
- my $delay = 0;
- my $dep;
-
- my @ent = @{$depset->{$node}}; #$depstab->getNodeAttribs($node,[qw(nodedep msdelay cmd)]);
- foreach my $h ( @ent ) {
- if ( grep(/^@$exargs[0]$/, split /,/, $h->{cmd} )) {
- if (exists($h->{nodedep})) { $dep=$h->{nodedep}; }
- if (exists($h->{msdelay})) { $delay=$h->{msdelay}; }
- last;
- }
- }
- if (!defined($dep)) {
- $no_dp{$node} = 1;
- }
- else {
- foreach my $n (split /,/,$dep ) {
- if ( !grep( /^$n$/, @$noderange )) {
- return( "Missing dependency on command-line: $node -> $n" );
- } elsif ( $n eq $node ) {
- next; # ignore multiple levels
- }
- $dp{$n}{$node} = $delay;
- }
- }
- }
- # if there are dependencies, add any non-dependent nodes
- if (scalar(%dp)) {
- foreach (keys %no_dp) {
- if (!exists( $dp{$_} )) {
- $dp{$_}{$_} = -1;
- }
- }
- # build hash of all nodes in preprocess_request() format
- my @namelist = keys %dp;
- my $mphash = $mptab->getNodesAttribs(\@namelist,['mpa','id']);
- while(my ($name,$h) = each(%dp) ) {
- my $ent=$mphash->{$name}->[0]; #$mptab->getNodeAttribs($name,['mpa', 'id']);
- if (!defined($ent->{mpa})) {
- return("no mpa defined for node $name");
- }
- my $id = (defined($ent->{id})) ? $ent->{id} : "";
- push @{$mpa_hash{$name}},$ent->{mpa};
- push @{$mpa_hash{$name}},$id;
-
- @namelist = keys %$h;
- my $mpsubhash = $mptab->getNodesAttribs(\@namelist,['mpa','id']);
- foreach ( keys %$h ) {
- if ( $h->{$_} =~ /(^\d+$)/ ) {
- my $ent=$mpsubhash->{$_}->[0]; #$mptab->getNodeAttribs($_,['mpa', 'id']);
- if (!defined($ent->{mpa})) {
- return("no mpa defined for node $_");
- }
- my $id = (defined($ent->{id})) ? $ent->{id} : "";
- push @{$mpa_hash{$_}},$ent->{mpa};
- push @{$mpa_hash{$_}},$id;
- }
- }
- }
- }
- return( [\%dp,\%mpa_hash] );
-}
-
-
-sub process_request {
- $SIG{INT} = $SIG{TERM} = sub {
- foreach (keys %mm_comm_pids) {
- kill 2, $_;
- }
- exit 0;
- };
-
- my $request = shift;
- my $callback = shift;
- my $doreq = shift;
- my $level = shift;
- my $noderange = $request->{node};
- my $command = $request->{command}->[0];
- my @exargs;
- unless ($command) {
- return; #Empty request
- }
- if (ref($request->{arg})) {
- @exargs = @{$request->{arg}};
- } else {
- @exargs = ($request->{arg});
- }
-
- my $moreinfo;
- if ($request->{moreinfo}) { $moreinfo=$request->{moreinfo}; }
- else { $moreinfo=build_more_info($noderange,$callback);}
-
- if ($command eq "rpower" and grep(/^on|off|boot|reset|cycle$/, @exargs)) {
-
- if ( my ($index) = grep($exargs[$_]=~ /^--nodeps$/, 0..$#exargs )) {
- splice(@exargs, $index, 1);
- } else {
- # handles 1 level of dependencies only
- if (!defined($level)) {
- my $dep = build_depend($noderange,\@exargs);
- if ( ref($dep) ne 'ARRAY' ) {
- $callback->({data=>[$dep],errorcode=>1});
- return;
- }
- if (scalar(%{@$dep[0]})) {
- handle_depend( $request, $callback, $doreq, $dep );
- return 0;
- }
- }
- }
- }
- # only 1 node when changing textid to something other than '*'
- if ($command eq "rspconfig" and grep(/^textid=[^*]/,@exargs)) {
- if ( @$noderange > 1 ) {
- $callback->({data=>["Single node required when changing textid"],
- errorcode=>1});
- return;
- }
- }
- my $bladeuser = 'USERID';
- my $bladepass = 'PASSW0RD';
- my $blademaxp = 64;
- my $sitetab = xCAT::Table->new('site');
- my $mpatab = xCAT::Table->new('mpa');
- my $mptab = xCAT::Table->new('mp');
- my $tmp;
- if ($sitetab) {
- ($tmp)=$sitetab->getAttribs({'key'=>'blademaxp'},'value');
- if (defined($tmp)) { $blademaxp=$tmp->{value}; }
- }
- my $passtab = xCAT::Table->new('passwd');
- if ($passtab) {
- ($tmp)=$passtab->getAttribs({'key'=>'blade'},'username','password');
- if (defined($tmp)) {
- $bladeuser = $tmp->{username};
- $bladepass = $tmp->{password};
- }
- }
- if ($request->{command}->[0] eq "findme") {
- my $mptab = xCAT::Table->new("mp");
- unless ($mptab) { return 2; }
- my @bladents = $mptab->getAllNodeAttribs([qw(node)]);
- my @blades;
- foreach (@bladents) {
- push @blades,$_->{node};
- }
- my %invreq;
- $invreq{node} = \@blades;
- $invreq{arg} = ['mac'];
- $invreq{command} = ['rinv'];
- my $mac;
- my $ip = $request->{'_xcat_clientip'};
- my $arptable = `/sbin/arp -n`;
- my @arpents = split /\n/,$arptable;
- foreach (@arpents) {
- if (m/^($ip)\s+\S+\s+(\S+)\s/) {
- $mac=$2;
- last;
- }
- }
- unless ($mac) { return };
-
- #Only refresh the the cache when the request permits and no useful answer
- if ($macmaptimestamp < (time() - 300)) { #after five minutes, invalidate cache
- %macmap = ();
- }
-
- unless ($request->{cacheonly}->[0] or $macmap{$mac} or $macmaptimestamp > (time() - 20)) { #do not refresh cache if requested not to, if it has an entry, or is recent
- %macmap = ();
- $macmaptimestamp=time();
- foreach (@{preprocess_request(\%invreq,\&fillresps)}) {
- %invreq = %$_;
- process_request(\%invreq,\&fillresps);
- }
- }
- unless ($macmap{$mac}) {
- return 1; #failure
- }
- my $mactab = xCAT::Table->new('mac',-create=>1);
- $mactab->setNodeAttribs($macmap{$mac},{mac=>$mac});
- $mactab->close();
- #my %request = (
- # command => ['makedhcp'],
- # node => [$macmap{$mac}]
- # );
- #$doreq->(\%request);
- $request->{command}=['discovered'];
- $request->{noderange} = [$macmap{$mac}];
- $doreq->($request);
- %{$request}=(); #Clear request. it is done
- undef $mactab;
- return 0;
- }
-
-
- my $children = 0;
- $SIG{CHLD} = sub { my $cpid; while ($cpid = waitpid(-1, WNOHANG) > 0) { delete $mm_comm_pids{$cpid}; $children--; } };
- my $inputs = new IO::Select;;
- foreach my $info (@$moreinfo) {
- $info=~/^\[(.*)\]\[(.*)\]\[(.*)\]/;
- my $mpa=$1;
- my @nodes=split(',', $2);
- my @ids=split(',', $3);
- #print "mpa=$mpa, nodes=@nodes, ids=@ids\n";
- my $user=$bladeuser;
- my $pass=$bladepass;
- my $ent;
- if (defined($mpatab)) {
- ($ent)=$mpatab->getAttribs({'mpa'=>$mpa},'username','password');
- if (defined($ent->{password})) { $pass = $ent->{password}; }
- if (defined($ent->{username})) { $user = $ent->{username}; }
- }
- $oahash{$mpa}->{username} = $user;
- $oahash{$mpa}->{password} = $pass;
- for (my $i=0; $i<@nodes; $i++) {
- my $node=$nodes[$i];;
- my $nodeid=$ids[$i];
- $oahash{$mpa}->{nodes}->{$node}=$nodeid;
-
-
- }
- }
- my $sub_fds = new IO::Select;
- foreach $oa (sort (keys %oahash)) {
- while ($children > $blademaxp) { forward_data($callback,$sub_fds); }
- $children++;
- my $cfd;
- my $pfd;
- socketpair($pfd, $cfd,AF_UNIX,SOCK_STREAM,PF_UNSPEC) or die "socketpair: $!";
- $cfd->autoflush(1);
- $pfd->autoflush(1);
- my $cpid = xCAT::Utils->xfork;
- unless (defined($cpid)) { die "Fork error"; }
- unless ($cpid) {
- close($cfd);
- eval {
- doblade($pfd,$oa,\%oahash,$command,-args=>\@exargs);
- exit(0);
- };
- if ($@) { die "$@"; }
- die "blade plugin encountered a general error while communication with $oa";
- }
- $mm_comm_pids{$cpid} = 1;
- close ($pfd);
- $sub_fds->add($cfd);
- }
- while ($sub_fds->count > 0 or $children > 0) {
- forward_data($callback,$sub_fds);
- }
- while (forward_data($callback,$sub_fds)) {}
-}
-
-my $IMPORT_SSH_KEY_HEADER = '
-
-
-
-
-
------BEGIN SSH KEY-----
-';
-
-my $IMPORT_SSH_KEY_FOOTER = '
------END SSH KEY-----
-
-
-
-';
-
-my $MOD_NETWORK_SETTINGS_HEADER = '
-
-
-
-
-
-';
-
-my $MOD_NETWORK_SETTINGS_FOOTER = '
-
-
-
-';
-
-my $GET_NETWORK_SETTINGS = '
-
-
-
-
-
-
-
-';
-
-
-Net::SSLeay::load_error_strings();
-Net::SSLeay::SSLeay_add_ssl_algorithms();
-Net::SSLeay::randomize();
-#
-# opens an ssl connection to port 443 of the passed host
-#
-sub openSSLconnection($)
-{
- my $host = shift;
- my ($ssl, $sin, $ip, $nip);
- if (not $ip = inet_aton($host))
- {
- print "$host is a DNS Name, performing lookup\n" if $globalDebug;
- $ip = gethostbyname($host) or die "ERROR: Host $host notfound. \n";
- }
- $nip = inet_ntoa($ip);
- #print STDERR "Connecting to $nip:443\n";
- $sin = sockaddr_in(443, $ip);
- socket (S, &AF_INET, &SOCK_STREAM, 0) or die "ERROR: socket: $!";
- connect (S, $sin) or die "connect: $!";
- $ctx = Net::SSLeay::CTX_new() or die_now("ERROR: Failed to create SSL_CTX $! ");
-
- Net::SSLeay::CTX_set_options($ctx, &Net::SSLeay::OP_ALL);
- die_if_ssl_error("ERROR: ssl ctx set options");
- $ssl = Net::SSLeay::new($ctx) or die_now("ERROR: Failed to create SSL $!");
-
- Net::SSLeay::set_fd($ssl, fileno(S));
- Net::SSLeay::connect($ssl) and die_if_ssl_error("ERROR: ssl connect");
- #print STDERR 'SSL Connected ';
- print 'Using Cipher: ' . Net::SSLeay::get_cipher($ssl) if $globalDebug;
- #print STDERR "\n\n";
- return $ssl;
-}
-
-sub closeSSLconnection($)
-{
- my $ssl = shift;
-
- Net::SSLeay::free ($ssl); # Tear down connection
- Net::SSLeay::CTX_free ($ctx);
- close S;
-}
-
-# usage: sendscript(host, script)
-# sends the xmlscript script to host, returns reply
-sub sendScript($$)
-{
- my $host = shift;
- my $script = shift;
- my ($ssl, $reply, $lastreply, $res, $n);
- $ssl = openSSLconnection($host);
- # write header
- $n = Net::SSLeay::ssl_write_all($ssl, ''."\r\n");
- print "Wrote $n\n" if $globalDebug;
- $n = Net::SSLeay::ssl_write_all($ssl, ''."\r\n");
- print "Wrote $n\n" if $globalDebug;
-
- # write script
- $n = Net::SSLeay::ssl_write_all($ssl, $script);
- print "Wrote $n\n$script\n" if $globalDebug;
- $reply = "";
- $lastreply = "";
- my $reply2return = "";
-READLOOP:
- while(1) {
- $n++;
- $lastreply = Net::SSLeay::read($ssl);
- die_if_ssl_error("ERROR: ssl read");
- if($lastreply eq "") {
- sleep(2); # wait 2 sec for more text.
- $lastreply = Net::SSLeay::read($ssl);
- die_if_ssl_error("ERROR: ssl read");
- last READLOOP if($lastreply eq "");
- }
- $reply .= $lastreply;
- print "lastreply $lastreply \b" if $globalDebug;
-
- # Check response to see if a error was returned.
- if($lastreply =~ m/STATUS="(0x[0-9A-F]+)"[\s]+MESSAGE='(.*)'[\s]+\/>[\s]*(([\s]|.)*?)<\/RIBCL>/) {
- if($1 eq "0x0000") {
- #print STDERR "$3\n" if $3;
- } else {
- $reply2return = "ERROR: STATUS: $1, MESSAGE: $2";
- }
- }
- }
- print "READ: $lastreply\n" if $globalDebug;
- if($lastreply =~ m/STATUS="(0x[0-9A-F]+)"[\s]+MESSAGE='(.*)'[\s]+\/>[\s]*(([\s]|.)*?)<\/RIBCL>/) {
- if($1 eq "0x0000") {
- #Sprint STDERR "$3\n" if $3;
- } else {
- $reply2return = "ERROR: STATUS: $1, MESSAGE: $2";
- }
- }
-
- closeSSLconnection($ssl);
- return $reply2return;
-}
-
-sub extractValue {
- my $inputString = shift;
- my $testString = shift;
-
- $testString = "<"."$testString"." VALUE=";
-
- my $start = index ($inputString, $testString) + length $testString;
- my $end = index $inputString, "\"", ($start + 1);
- return(substr($inputString, ($start + 1), ($end - $start - 1)));
-}
-
-
-
-sub iloconfig {
-
- my $oa=shift;
- my $user=shift;
- my $pass=shift;
- my $node=shift;
- my $nodeid=shift;
- my $parameter;
- my $value;
- my $assignment;
- my $returncode=0;
- my $textid=0;
- @cfgtext=();
-
- # Before we get going, lets get the info on the MP (iLO)
- $slot = convertSlot($nodeid);
- my $mpInfoResp = $hpoa->getBladeMpInfo("bayNumber"=>$slot);
- if($mpInfoResp->fault) {
- my $errorText ="Error getting MP info";
- next;
- }
- my $ipaddress = $mpInfoResp->result->{ipAddress};
-
- foreach $parameter (@_) {
- $assignment = 0;
- $value = undef;
- if ($parameter =~ /=/) {
- $assignment = 1;
- ($parameter,$value) = split /=/,$parameter,2;
- }
- if ($parameter =~ /^sshcfg$/) {
- my $fname = "/root/.ssh/id_dsa.pub";
- if ( ! -s $fname ) {
- # Key file specified does not exist. Error!
- push @cfgtext,"rspconfig:key file does not exist";
- next;
- }
- open (KEY, "$fname");
- my $key = readline(KEY);
- close(KEY);
- my $script = "$IMPORT_SSH_KEY_HEADER"."$key"."$IMPORT_SSH_KEY_FOOTER";
- $script =~ s/AdMiNnAmE/$user/;
- $script =~ s/PaSsWoRd/$pass/;
- my $reply = sendScript($ipaddress, $script);
- push @cfgtext,$reply;
- next;
- }
- if ($parameter =~ /^network$/) {
- if($value) {
- # If value is set, then the user wans us to set these values
- my ($newip,$newhostname,$newgateway,$newmask) = split /,/,$value;
- my $script = "$MOD_NETWORK_SETTINGS_HEADER";
- $script = $script."" if ($newip);
- $script = $script."" if($newgateway);
- $script = $script."" if($newmask);
- $script = $script."$MOD_NETWORK_SETTINGS_FOOTER";
- $script =~ s/AdMiNnAmE/$user/;
- $script =~ s/PaSsWoRd/$pass/;
- my $reply = sendScript($ipaddress, $script);
- if ($newip) { push @cfgtext,"iLO IP: $newip"; }
- if ($newgateway){ push @cfgtext,"Gateway: $newgateway"; }
- if ($newmask) { push @cfgtext,"Subnet Mask: $newmask"; }
- push @cfgtext, $reply;
-
- } else {
- my $script = "$GET_NETWORK_SETTINGS";
- $script =~ s/AdMiNnAmE/$user/;
- $script =~ s/PaSsWoRd/$pass/;
- my $reply = sendScript($ipaddress, $script);
- my $readipaddress = extractValue($reply, "IP_ADDRESS");
- my $gateway = extractValue($reply, "GATEWAY_IP_ADDRESS");
- my $netmask = extractValue($reply, "SUBNET_MASK");
- push @cfgtext,"iLO IP: $readipaddress";
- push @cfgtext, "Gateway: $gateway";
- push @cfgtext, "Subnet mask: $netmask";
- push @cfgtext, $reply;
- }
- }
- }
- return 0, @cfgtext;
-}
-
-sub getmacs
-{
- (my $code,my @macs)=inv('mac');
- my $mkey;
- my $nic2Find;
- my $nrtab = xCAT::Table->new('noderes');
- if ($nrtab) {
- my $nent = $nrtab->getNodeAttribs($curn,['primarynic','installnic']);
- if ($nent) {
- if (defined $nent->{installnic}) { #Prefer the install nic
- $mkey="installnic";
- } elsif (defined $nent->{primarynic}) { #see if primary nic was set
- $mkey="primarynic";
- }
- $nic2Find = $nent->{$mkey};
- }
- }
- # We now have the nic2Find, so we need to convert this to the NIC format
- # Strip away the "eth"
- my $interface = $nic2Find;
- $nic2Find =~ s/eth//;
- my $numberPxeNic = $nic2Find + 1;
- my $pxeNic = "NIC ".$numberPxeNic;
-
- if ($code==0) {
- my $mac;
- my @allmacs;
- foreach my $macEntry (@macs) {
- if ($macEntry =~ /MAC ADDRESS $pxeNic/) {
- $mac = $macEntry;
- $mac =~ s/MAC ADDRESS $pxeNic://;
- last;
- }
- }
- if (! $mac) {
- return 1,"Unable to retrieve MAC address for interface $pxeNic from OnBoard Administrator";
- }
-
- my $mactab = xCAT::Table->new('mac',-create=>1);
- $mactab->setNodeAttribs($curn,{mac=>$mac},{interface=>$interface});
- $mactab->close;
- return 0,":mac.mac set to $mac";
- } else {
- return $code,$macs[0];
- }
-}
-
-sub inv {
- my @invitems;
- my @output;
- foreach (@_) {
- push @invitems, split( /,/,$_);
- }
- my $item;
- unless(scalar(@invitems)) {
- @invitems = ("all");
- }
-
- # Before going off to handle the items, issue a getBladeInfo, getBladeMpInfo, and getOaInfo
- my $getBladeInfoResult = $hpoa->getBladeInfo("bayNumber" => $slot);
- if($getBladeInfoResult->fault) {
- return(1, "getBladeInfo on node $curn failed");
- }
- my $getBladeMpInfoResult = $hpoa->getBladeMpInfo("bayNumber" => $slot);
- if($getBladeMpInfoResult->fault) {
- return(1, "getBladeMpInfo on node $curn fault");
- }
- my $getOaInfoResult = $hpoa->getOaInfo("bayNumber" => $activeOABay);
- if($getOaInfoResult->fault) {
- my $errHash = $getOaInfoResult->fault;
- return(1, "getOaInfo failed");
- }
-
- while (my $item = shift @invitems) {
- if($item =~ /^all/) {
- push @invitems,(qw(mtm serial mac firm));
- next;
- }
-
- if($item =~ /^firm/) {
- push @invitems,(qw(bladerom mprom oarom));
- }
- if($item =~ /^bladerom/) {
- push @output,"BladeFW: ". $getBladeInfoResult->result->{romVersion};
- }
- if($item =~ /^mprom/) {
- push @output, "iLOFW: ". $getBladeMpInfoResult->result->{fwVersion};
- }
- if($item =~ /~oarom/) {
- push @output, "OA FW: ". $getOaInfoResult->result->{fwVersion};
- }
-
- if($item =~ /^model/ or $item =~ /^mtm/ ) {
- push @output,"Machine Type/Model: ". $getBladeInfoResult->result->{partNumber};
- }
- if($item =~ /^serial/) {
- push @output, "Serial Number: ". $getBladeInfoResult->result->{serialNumber};
- }
- if($item =~ /^mac/) {
- my $numberOfNics = $getBladeInfoResult->result->{numberOfNics};
- for (my $i = 0; $i < $numberOfNics; $i++) {
- my $mac = $getBladeInfoResult->result->{nics}->{bladeNicInfo}[$i]->{macAddress};
- my $port = $getBladeInfoResult->result->{nics}->{bladeNicInfo}[$i]->{port};
- push @output, "MAC ADDRESS ".$port.": ".$mac;
- #push@output, "MAC Address ".($_+1).": ".$getBladeInfoResult->result->{nics}->{bladeNicInfo}[$i]->{macAddress};
- }
- }
- }
- return(0, @output);
-}
-
-
-sub CtoF {
- my $Ctemp = shift;
- return((($Ctemp * 9) / 5) + 32);
-}
-
-my %chassiswidevitals;
-sub vitals {
- my @output;
- my $tmp;
- my @vitems;
-
- if ( $#_ == 0 && $_[0] eq '' ) { pop @_; push @_,"all" } #-- default is all if no argument given
-
- if ( defined $slot and $slot > 0 ) { #-- blade query
- foreach (@_) {
- if ($_ eq 'all') {
- # push @vitems,qw(temp voltage wattage summary fan);
- push @vitems,qw(cpu_temp memory_temp system_temp ambient_temp summary fanspeed);
- push @vitems,qw(led power);;
- } elsif ($_ =~ '^led') {
- push @vitems,qw(led);
- } else {
- push @vitems,split( /,/,$_);
- }
- }
- } else { #-- chassis query
- foreach (@_) {
- if ($_ eq 'all') {
- # push @vitems,qw(voltage wattage power summary);
- push @vitems,qw(cpu_temp memory_temp system_temp ambient_temp summary fanspeed);
- # push @vitems,qw(errorled beaconled infoled templed);
- push @vitems,qw(led power);
- } elsif ($_ =~ '^led') {
- push @vitems,qw(led);
- } elsif ($_ =~ '^cool') {
- push @vitems,qw(fanspeed);
- } elsif ($_ =~ '^temp') {
- push @vitems,qw(ambient_temp);
- } else {
- push @vitems,split( /,/,$_);
- }
- }
- }
-
- my @vitals;
- if ( defined $slot and $slot > 0) { #-- querying some blade
- if (grep /temp/, @vitems) {
- my $tempResponse = $hpoa->getBladeThermalInfoArray("bayNumber" => $slot);
-
- if($tempResponse->fault) {
- push @output, "Request to get Temperature info on slot $slot failed";
- }
- elsif (! $tempResponse->result) {
- # If is the case then the temperature data is not yet available.
- push @output, "Temperature data not available.";
- } else {
- # We have data so go process it....
- my @tempdata = $tempResponse->result->{bladeThermalInfo};
- my $lastElement = $tempResponse->result->{bladeThermalInfo}[-1]->{sensorNumber};
- if(grep /cpu_temp/, @vitems) {
- my $index = -1;
- do {
- $index++;
- if(grep /CPU/, $tempResponse->result->{bladeThermalInfo}[$index]->{description}) {
- my $Ctemp = $tempResponse->result->{bladeThermalInfo}[$index]->{temperatureC};
- my $desc = $tempResponse->result->{bladeThermalInfo}[$index]->{description};
- my $Ftemp = CtoF($Ctemp);
- push @output , "$desc Temperature: $Ctemp C \( $Ftemp F \)";
- }
- } until $tempResponse->result->{bladeThermalInfo}[$index]->{sensorNumber} eq $lastElement;
- }
- if(grep /memory_temp/, @vitems) {
- my $index = -1;
- do {
- $index++;
- if(grep /Memory/, $tempResponse->result->{bladeThermalInfo}[$index]->{description}) {
- my $Ctemp = $tempResponse->result->{bladeThermalInfo}[$index]->{temperatureC};
- my $desc = $tempResponse->result->{bladeThermalInfo}[$index]->{description};
- my $Ftemp = CtoF($Ctemp);
- push @output , "$desc Temperature: $Ctemp C \( $Ftemp F \)";
- }
- } until $tempResponse->result->{bladeThermalInfo}[$index]->{sensorNumber} eq $lastElement;
- }
- if(grep /system_temp/, @vitems) {
- my $index = -1;
- do {
- $index++;
- if(grep /System/, $tempResponse->result->{bladeThermalInfo}[$index]->{description}) {
- my $Ctemp = $tempResponse->result->{bladeThermalInfo}[$index]->{temperatureC};
- my $desc = $tempResponse->result->{bladeThermalInfo}[$index]->{description};
- my $Ftemp = CtoF($Ctemp);
- push @output , "$desc Temperature: $Ctemp C \( $Ftemp F \)";
- }
- } until $tempResponse->result->{bladeThermalInfo}[$index]->{sensorNumber} eq $lastElement;
- }
- if(grep /ambient_temp/, @vitems) {
- my $index = -1;
- do {
- $index++;
- if(grep /Ambient/, $tempResponse->result->{bladeThermalInfo}[$index]->{description}) {
- my $Ctemp = $tempResponse->result->{bladeThermalInfo}[$index]->{temperatureC};
- my $desc = $tempResponse->result->{bladeThermalInfo}[$index]->{description};
- my $Ftemp = CtoF($Ctemp);
- push @output , "$desc Temperature: $Ctemp C \( $Ftemp F \)";
- }
- } until $tempResponse->result->{bladeThermalInfo}[$index]->{sensorNumber} eq $lastElement;
- }
- }
- }
-
- if(grep /fanspeed/, @vitems) {
- my $fanInfoResponse = $hpoa->getFanInfo("bayNumber" => $slot);
- if($fanInfoResponse->fault) {
- push @output, "Request to get Fan Info from slot $slot failed ";
- } elsif (! $fanInfoResponse->result ) {
- push @output, "No Fan Information";
- } else {
- my $fanStatus = $fanInfoResponse->result->{operationalStatus};
- my $fanMax = $fanInfoResponse->result->{maxFanSpeed};
- my $fanCur = $fanInfoResponse->result->{fanSpeed};
- my $fanPercent = ($fanCur / $fanMax) * 100;
- push @output, "Fan status: $fanStatus Percent of max: $fanPercent\%";
- }
- }
-
- if(grep /led/, @vitems) {
- my $currstat = $getBladeStatusResponse->result->{uid};
-
- if ($currstat eq "UID_ON") {
- push @output, "Current UID Status On";
- } elsif ($currstat eq "UID_OFF") {
- push @output, "Current UID Status Off";
- } elsif ($currstat eq "UID_BLINK") {
- push @output, "Current UID Status Blinking";
- }
- }
-
- if(grep /power/, @vitems) {
- my $currPowerStat = $getBladeStatusResponse->result->{powered};
- if($currPowerStat eq "POWER_ON") {
- push @output , "Current Power Status On";
- } elsif ($currPowerStat eq "POWER_OFF") {
- push @output,"Current Power Status Off";
- }
- }
- }
- return(0, @output);
-}
-
-sub buildEventHash {
- my $logText = shift;
- my $eventLogFound = 0;
- my $eventFound = 0;
- my $eventNumber = 0;
-
- my @lines = split /^/, $logText;
- foreach my $line (@lines){
- if(! $eventLogFound ) {
- if(! $line =~ m/EVENT_LOG/) {
- next;
- } elsif ($line =~ m/EVENT_LOG/) {
- $eventLogFound = 1;
- next;
- }
- }
-
- if(! $eventFound && $line =~ m/\/) {
- $eventNumber++;
- $eventFound = 0;
- next;
- }
-
- # We have a good line. Need to split it up and build the hash.
- my ($desc, $value) = split /=/, $line;
- for ($desc) {
- s/^\s+//;
- s/\s+$//;
- s/\"//g;
- s/\\n//;
- }
- for ($value) {
- s/^\s+//;
- s/\"//g;
- s/\s+$//;
- s/\\n//;
- }
- $eventHash->{event}->{$eventNumber}->{$desc} = $value;
- next;
- }
- return;
-}
-
-sub eventlog {
- my $subcommand= shift;
-
- my @output;
-
- my $numEntries = $subcommand;
-
- if($subcommand eq "all" | $subcommand eq "clear" ) {
- return(1, "Command not supported");
- } elsif ($subcommand =~ /\D/) {
- return(1, "Command not supported");
- } else {
- my $mpEventLogResponse = $hpoa->getBladeMpEventLog("bayNumber"=>$slot, "maxsize"=>640000);
- if($mpEventLogResponse->fault) {
- return(1, "Attempt to retreive Event Log faulted");
- }
- my $logText = $mpEventLogResponse->result->{logContents};
- buildEventHash($logText, $numEntries);
-
- for (my $index = 0; $index < $numEntries; $index++) {
- my $class = $eventHash->{event}->{$index}->{CLASS};
- my $severity = $eventHash->{event}->{$index}->{SEVERITY};
- my $dateTime = $eventHash->{event}->{$index}->{LAST_UPDATE};
- my $desc = $eventHash->{event}->{$index}->{DESCRIPTION};
-
- unshift @output,"$class $severity:$dateTime $desc";
- }
- return(0, @output);
-
- }
-}
-
-
-sub rscan {
- my $args = shift;
- my @values;
- my $result;
- my %opt;
-
- @ARGV = @$args;
- $Getopt::Long::ignorecase = 0;
- Getopt::Long::Configure("bundling");
-
- local *usage = sub {
- my $usage_string=xCAT::Usage->getUsage("rscan");
- return( join('',($_[0],$usage_string)));
- };
-
- if ( !GetOptions(\%opt,qw(V|Verbose w x z))){
- return(1,usage());
- }
- if ( defined($ARGV[0]) ) {
- return(1,usage("Invalid argument: @ARGV\n"));
- }
- if (exists($opt{x}) and exists($opt{z})) {
- return(1,usage("-x and -z are mutually exclusive\n"));
- }
-
- my $encInfo = $hpoa->getEnclosureInfo();
- if( $encInfo->fault) {
- return(1, "Attempt tp get enclosure information has failed");
- }
-
- my $numBays = $encInfo->result->{bladeBays};
- my $calcBladeBays = $numBays * 3; # Need to worry aboyt casmir blades
-
- my $encName = $encInfo->result->{enclosureName};
- my $enctype = $encInfo->result->{name};
- my $encmodel = $encInfo->result->{partNumber};
- my $encserial = $encInfo->result->{serialNumber};
-
- push @values,join(",","hpoa",$encName,0,"$enctype-$encmodel",$encserial,$oa);
- my $max = length($encName);
-
- for( my $i = 1; $i <= $calcBladeBays; $i++) {
- my $bayInfo = $hpoa->getBladeInfo("bayNumber"=>$i);
- if($bayInfo->fault) {
- return(1, "Attempt to get blade info from bay $i has failed");
- }
- if($bayInfo->result->{presence} eq "ABSENT" ) {
- # no blade in the bya
- next;
- }
-
- my $name = $bayInfo->result->{serverName};
- my $bayNum = $i;
- my $type = $bayInfo->result->{bladeType};
- my $model = $bayInfo->result->{name};
- my $serial = $bayInfo->result->{serialNumber};
-
- push @values, join (",", "hpblade", $name, $bayNum, "$type-$model", $serial, "");
- }
-
- my $format = sprintf "%%-%ds",($max+2);
- $rscan_header[1][1] = $format;
-
- if (exists($opt{x})) {
- $result = rscan_xml($oa,\@values);
- }
- elsif ( exists( $opt{z} )) {
- $result = rscan_stanza($oa,\@values);
- }
- else {
- foreach ( @rscan_header ) {
- $result .= sprintf @$_[1],@$_[0];
- }
- foreach (@values ){
- my @data = split /,/;
- my $i = 0;
-
- foreach (@rscan_header) {
- $result .= sprintf @$_[1],$data[$i++];
- }
- }
- }
- if (!exists( $opt{w})) {
- return(0,$result);
- }
- my @tabs = qw(mp nodehm nodelist);
- my %db = ();
-
- foreach (@tabs) {
- $db{$_} = xCAT::Table->new( $_, -create=>1, -autocommit=>0 );
- if ( !$db{$_} ) {
- return(1,"Error opening '$_'" );
- }
- }
- foreach (@values) {
- my @data = split /,/;
- my $name = $data[1];
-
- my ($k1,$u1);
- $k1->{node} = $name;
- $u1->{mpa} = $oa;
- $u1->{id} = $data[2];
- $db{mp}->setAttribs($k1,$u1);
- $db{mp}{commit} = 1;
-
- my ($k2,$u2);
- $k2->{node} = $name;
- $u2->{mgt} = "hpblade";
- $db{nodehm}->setAttribs($k2,$u2);
- $db{nodehm}{commit} = 1;
-
- my ($k3,$u3);
- $k3->{node} = $name;
- $u3->{groups} = "blade,all";
- $db{nodelist}->setAttribs($k3,$u3);
- $db{nodelist}{commit} = 1;
- }
- foreach ( @tabs ) {
- if ( exists( $db{$_}{commit} )) {
- $db{$_}->commit;
- }
- }
- return (0,$result);
-}
-
-sub rscan_xml {
-
- my $mpa = shift;
- my $values = shift;
- my $xml;
-
- foreach (@$values) {
- my @data = split /,/;
- my $i = 0;
-
- my $href = {
- Node => { }
- };
- foreach ( @rscan_attribs ) {
- my $d = $data[$i++];
- my $type = $data[0];
-
- if ( /^name$/ ) {
- next;
- } elsif ( /^nodetype$/ ) {
- $d = $type;
- } elsif ( /^groups$/ ) {
- $d = "$type,all";
- } elsif ( /^mgt$/ ) {
- $d = "blade";
- } elsif ( /^mpa$/ ) {
- $d = $mpa;
- }
- $href->{Node}->{$_} = $d;
- }
- $xml.= XMLout($href,NoAttr=>1,KeyAttr=>[],RootName=>undef);
- }
- return( $xml );
-}
-
-sub rscan_stanza {
-
- my $mpa = shift;
- my $values = shift;
- my $result;
-
- foreach (@$values) {
- my @data = split /,/;
- my $i = 0;
- my $type = $data[0];
- $result .= "$data[1]:\n\tobjtype=node\n";
-
- foreach ( @rscan_attribs ) {
- my $d = $data[$i++];
-
- if ( /^name$/ ) {
- next;
- } elsif ( /^nodetype$/ ) {
- $d = $type;
- } elsif ( /^groups$/ ) {
- $d = "$type,all";
- } elsif ( /^mgt$/ ) {
- $d = "blade";
- } elsif ( /^mpa$/ ) {
- $d = $mpa;
- }
- $result .= "\t$_=$d\n";
- }
- }
- return( $result );
-}
-
-
-
-
-sub beacon {
- my $subcommand = shift;
-
- if($subcommand eq "stat" ) {
- my $currstat = $getBladeStatusResponse->result->{uid};
- if ($currstat eq "UID_ON") {
- return(0, "on");
- } elsif ($currstat eq "UID_OFF") {
- return(0, "off");
- } elsif ($currstat eq "UID_BLINK") {
- return(0, "blink");
- }
- }
- my $response;
- if($subcommand eq "on") {
- $response =$hpoa->setBladeUid('bayNumber' => $slot, 'uid' => "UID_CMD_ON");
- if($response->fault) {
- my $errHash = $response->fault;
- my $result = $response->oaErrorText;
- print "result is $result \n";
- return("1", "Uid On failed");
- } else {
- return("0", "");
- }
- } elsif ($subcommand eq "off") {
- $response = $hpoa->setBladeUid('bayNumber' => $slot ,'uid' => "UID_CMD_OFF");
- if($response->fault) {
- my $errHash = $response->fault;
- my $result = $response->oaErrorText;
- print "result is $result \n";
- return("1", "Uid Off failed");
- } else {
- return("0", "");
- }
- } elsif ($subcommand eq "blink") {
- $response = $hpoa->setBladeUid('bayNumber' => $slot, 'uid' => "UID_CMD_BLINK");
- if($response->fault) {
- my $errHash = $response->fault;
- my $result = $response->oaErrorText;
- print "result is $result \n";
- return("1", "Uid Blink failed");
- } else {
- return("0", "");
- }
- } else {
- return(1, "subcommand unsupported");
- }
-
- return(1, "subcommand unsupported");
-}
-
-sub bootseq {
- my @args=@_;
- my $data;
- my @order=();
-
- if ($args[0] eq "list" or $args[0] eq "stat") {
- # Before going off to handle the items, issue a getBladeInfo and getOaInfo
- my $getBladeBootInfoResult = $hpoa->getBladeBootInfo("bayNumber"=> $slot);
- if($getBladeBootInfoResult->fault) {
- return(1, "getBladeBootInfo on node $curn failed");
- }
- # Go through the the IPL Array from the last call to GetBladeStatus
- my $numberOfIpls = $getBladeBootInfoResult->result->{numberOfIpls};
- foreach (my $i = 0; $i < $numberOfIpls; $i++) {
- foreach (my $j = 0; $j <= 7; $j++) {
- if($getBladeBootInfoResult->result->{ipls}->{ipl}[$j]->{bootPriority} eq ($i + 1)) {
- push(@order, $getBladeBootInfoResult->result->{ipls}->{ipl}[$j]->{iplDevice});
- last;
- }
- }
- }
-
- return (0,join(',',@order));
- } else {
- foreach (@args) {
- my @neworder=(split /,/,$_);
- push @order,@neworder;
- }
- my $number=@order;
- if ($number > 5) {
- return (1,"Only five boot sequence entries allowed");
- }
- my $nonespecified=0;
- my $foundnic = 0;
- foreach (@order) {
- if(($bootnumbers{$_} > 4)) {
- if($foundnic == 1) {
- # only one nic allowed. error out
- return(1, "Only one Eth/Nic device permitted.");
- } else {
- $foundnic = 1;
- }
- }
- unless (defined($bootnumbers{$_})) { return (1,"Unsupported device $_"); }
- unless ($bootnumbers{$_}) { $nonespecified = 1; }
- if ($nonespecified and $bootnumbers{$_}) { return (1,"Error: cannot specify 'none' before a device"); }
- }
- unless ($bootnumbers{$order[0]}) {
- return (1,"Error: cannot specify 'none' as first device");
- }
-
- # Build array to be sent to the blade here
- my @ipl;
- my $i = 1;
- foreach my $dev (@order) {
- push @ipl, {"bootPriority"=>"$i", "iplDevice" => "$bootdevices{$bootnumbers{$order[$i - 1]}}"};
- $i++;
- }
-
- my $setiplResponse = $hpoa->setBladeIplBootPriority("bladeIplArray" => ['ipl', \@ipl, "" ], "bayNumber" => $slot);
- if($setiplResponse->fault) {
- my $errHash = $setiplResponse->fault;
- my $result = $setiplResponse->oaErrorText;
- print "result is $result \n";
- return(1, "Error on slot $slot setting ipl");
- }
-
- return bootseq('list');
- }
-}
-
-
-sub power {
- my $subcommand = shift;
- my $command2Send;
- my $currPowerStat;
-
- $currPowerStat = $getBladeStatusResponse->result->{powered};
-
- if($subcommand eq "stat" || $subcommand eq "state") {
- if($currPowerStat eq "POWER_ON") {
- return(0, "on");
- } elsif ($currPowerStat eq "POWER_OFF") {
- return(0, "off");
- }
- }
-
- if ($subcommand eq "on") {
- if($currPowerStat eq "POWER_OFF") {
- $command2Send = "MOMENTARY_PRESS";
- } else {
- return(0, "");
- }
- } elsif ($subcommand eq "off") {
- if($currPowerStat eq "POWER_ON") {
- $command2Send = "PRESS_AND_HOLD";
- } else {
- return(0, "");
- }
- } elsif ($subcommand eq "reset") {
- $command2Send = "RESET";
- } elsif ($subcommand eq "cycle") {
- if($currPowerStat eq "POWER_ON") {
- power("off");
- }
- $command2Send = "MOMENTARY_PRESS";
- } elsif ($subcommand eq "boot") {
- if($currPowerStat eq "POWER_OFF") {
- $command2Send = "MOMENTARY_PRESS";
- } else {
- $command2Send = "COLD_REBOOT";
- }
- } elsif ($subcommand eq "softoff") {
- if($currPowerStat eq "POWER_ON") {
- $command2Send = "MOMENTARY_PRESS";
- }
- }
-
- #If we got here with a command to send, do it, otherwise just return
- if($command2Send) {
- my $pwrResult = $hpoa->setBladePower('bayNumber' => $slot, 'power' => $command2Send);
- if($pwrResult->fault) {
- return(1, "Node $curn - Power command failed");
- }
- return(0, "");
- }
-}
-
-
-
-sub bladecmd {
- my $oa = shift;
- my $node = shift;
- $slot = shift;
- my $user = shift;
- my $pass = shift;
- my $command = shift;
- my @args = @_;
- my $error;
- if ($slot > 0) {
- $getBladeStatusResponse = $hpoa->getBladeStatus('bayNumber' => $slot);
- if($getBladeStatusResponse->fault) {
- my $errHash = $getBladeStatusResponse->fault;
- my $result = $getBladeStatusResponse->oaErrorText;
- }
- if ($getBladeStatusResponse->result->{presence} ne "PRESENT") {
- return (1, "Target bay empty");
- }
- }
-
- if ($command eq "rbeacon") {
- return beacon(@args);
- } elsif ($command eq "rpower") {
- return power(@args);
- } elsif ($command eq "rvitals") {
- return vitals(@args);
- } elsif ($command =~ /r[ms]preset/) {
- return resetmp(@args);
- } elsif ($command eq "rspconfig") {
- return iloconfig($oa,$user,$pass,$node,$slot,@args);
- } elsif ($command eq "rbootseq") {
- return bootseq(@args);
- } elsif ($command eq "switchblade") {
- return switchblade(@args);
- } elsif ($command eq "getmacs") {
- return getmacs(@args);
- } elsif ($command eq "rinv") {
- return inv(@args);
- } elsif ($command eq "reventlog") {
- return eventlog(@args);
- } elsif ($command eq "rscan") {
- return rscan(\@args);
- }
-
- return (1,"$command not a supported command by blade method");
-}
-
-
-sub forward_data {
- my $callback = shift;
- my $fds = shift;
- my @ready_fds = $fds->can_read(1);
- my $rfh;
- my $rc = @ready_fds;
- foreach $rfh (@ready_fds) {
- my $data;
- if ($data = <$rfh>) {
- while ($data !~ /ENDOFFREEZE6sK4ci/) {
- $data .= <$rfh>;
- }
- print $rfh "ACK\n";
- my $responses=thaw($data);
- foreach (@$responses) {
- $callback->($_);
- }
- } else {
- $fds->remove($rfh);
- close($rfh);
- }
- }
- yield; #Try to avoid useless iterations as much as possible
- return $rc;
-}
-
-
-
-sub doblade {
- my $out = shift;
- $oa = shift;
- my $oahash = shift;
- my $command = shift;
- my %namedargs = @_;
- my @exargs = @{$namedargs{-args}};
- my $node;
- my $args = \@exargs;
-
- $hpoa = oaLogin($oa);
-
- # We are now logged into the OA and have a pointer to the OA session. Process
- # the command.
-
- #get new node status
- my %nodestat=();
- my $check=0;
- my $nsh={};
-
- foreach $node (sort (keys %{$oahash->{$oa}->{nodes}})) {
- $curn = $node;
- my ($rc, @output) = bladecmd($oa, $node, $oahash->{$oa}->{nodes}->{$node}, $oahash->{$oa}->{username}, $oahash->{$oa}->{password}, $command, @$args);
-
- foreach(@output) {
- my %output;
-
- if ( $command eq "rscan" ) {
- $output{errorcode}=$rc;
- $output{data} = [$_];
- }
- else {
- (my $desc,my $text) = split (/:/,$_,2);
- unless ($text) {
- $text=$desc;
- } else {
- $desc =~ s/^\s+//;
- $desc =~ s/\s+$//;
- if ($desc) {
- $output{node}->[0]->{data}->[0]->{desc}->[0]=$desc;
- }
- }
- $text =~ s/^\s+//;
- $text =~ s/\s+$//;
- $output{node}->[0]->{errorcode} = $rc;
- $output{node}->[0]->{name}->[0]=$node;
- $output{node}->[0]->{data}->[0]->{contents}->[0]=$text;
- }
- print $out freeze([\%output]);
- print $out "\nENDOFFREEZE6sK4ci\n";
- yield;
- waitforack($out);
- }
- yield;
- }
-
- #update the node status to the nodelist.status table
- if ($check) {
- my %node_status=();
-
- #foreach (keys %nodestat) { print "node=$_,status=" . $nodestat{$_} ."\n"; } #Ling:remove
-
- foreach my $node (keys %nodestat) {
- my $stat=$nodestat{$node};
- if ($stat eq "no-op") { next; }
- if (exists($node_status{$stat})) {
- my $pa=$node_status{$stat};
- push(@$pa, $node);
- }
- else {
- $node_status{$stat}=[$node];
- }
- }
- xCAT_monitoring::monitorctrl::setNodeStatusAttributes(\%node_status, 1);
-
- }
- #my $msgtoparent=freeze(\@outhashes); # = XMLout(\%output,RootName => 'xcatresponse');
- #print $out $msgtoparent; #$node.": $_\n";
-}
-1;
-
-
-
-
-
-
-
-
-
-
diff --git a/xCAT-server/lib/xcat/plugins/hpilo.pm b/xCAT-server/lib/xcat/plugins/hpilo.pm
deleted file mode 100755
index 4cb29bb09..000000000
--- a/xCAT-server/lib/xcat/plugins/hpilo.pm
+++ /dev/null
@@ -1,836 +0,0 @@
-#
-# © Copyright 2009 Hewlett-Packard Development Company, L.P.
-# EPL license http://www.eclipse.org/legal/epl-v10.html
-#
-
-package xCAT_plugin::hpilo;
-BEGIN
-{
- $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
-}
-use lib "$::XCATROOT/lib/perl";
-use strict;
-use warnings "all";
-use xCAT::GlobalDef;
-
-use POSIX qw(ceil floor);
-use Storable qw(store_fd retrieve_fd thaw freeze);
-use xCAT::Utils;
-use xCAT::Usage;
-use Thread qw(yield);
-use Socket;
-use Net::SSLeay qw(die_now die_if_ssl_error);
-use POSIX "WNOHANG";
-my $tfactor = 0;
-my $vpdhash;
-my %bmc_comm_pids;
-my $globalDebug = 0;
-my $outfd;
-my $currnode;
-my $status_noop="XXXno-opXXX";
-
-require Exporter;
-our @ISA = qw(Exporter);
-our @EXPORT = qw(
- hpiloinit
- hpilocmd
-);
-
-sub handled_commands {
- return {
- rpower => 'nodehm:power,mgt',
- rvitals => 'nodehm:mgt',
- rbeacon => 'nodehm:mgt',
- reventlog => 'nodehm:mgt'
- }
-}
-
-
-# These commands do not map directly to iLO commands
-# boot:
-# if power is off
-# power the server on
-# else
-# issue a HARD BOOT to the server
-#
-# cycle:
-# Issue power off to server
-# Issue power on to server
-#
-
-
-
-my $INITIAL_HEADER = '
-
-
-';
-
-
-# Command Definitions
-my $GET_HOST_POWER_STATUS = '
-
-
-
-
-';
-
-# This command enables or disables the Virtual Power Button
-my $SET_HOST_POWER_YES = '
-
-
-
-
-';
-
-my $SET_HOST_POWER_NO = '
-
-
-
-
-';
-
-my $RESET_SERVER = '
-
-
-
-
-';
-
-my $PRESS_POWER_BUTTON = '
-
-
-
-
-';
-
-my $HOLD_POWER_BUTTON = '
-
-
-
-
-';
-
-my $COLD_BOOT_SERVER = '
-
-
-
-
-';
-
-my $WARM_BOOT_SERVER = '
-
-
-
-
-';
-
-my $GET_UID_STATUS = '
-
-
-
-
-';
-
-my $UID_CONTROL_ON = '
-
-
-
-
-';
-
-my $UID_CONTROL_OFF = '
-
-
-
-
-';
-
-my $GET_EMBEDDED_HEALTH = '
-
-
-
-
-';
-
-my $GET_EVENT_LOG = '
-
-
-
-
-';
-
-my $CLEAR_EVENT_LOG = '
-
-
-
-
-';
-
-my $IMPORT_SSH_KEY = '
-
-
------BEGIN SSH KEY -----';
-
-my $IMPORT_SSH_KEY_ENDING = '
-
-
-
- ';
-
-
-use Socket;
-use Net::SSLeay qw(die_now die_if_ssl_error) ;
-
-my $ctx; # Make this a global
-
-Net::SSLeay::load_error_strings();
-Net::SSLeay::SSLeay_add_ssl_algorithms();
-Net::SSLeay::randomize();
-#
-# opens an ssl connection to port 443 of the passed host
-#
-sub openSSLconnection($)
-{
- my $host = shift;
- my ($ssl, $sin, $ip, $nip);
- if (not $ip = inet_aton($host))
- {
- print "$host is a DNS Name, performing lookup\n" if $globalDebug;
- $ip = gethostbyname($host) or die "ERROR: Host $host notfound. \n";
- }
- $nip = inet_ntoa($ip);
- #print STDERR "Connecting to $nip:443\n";
- $sin = sockaddr_in(443, $ip);
- socket (S, &AF_INET, &SOCK_STREAM, 0) or die "ERROR: socket: $!";
- connect (S, $sin) or die "connect: $!";
- $ctx = Net::SSLeay::CTX_new() or die_now("ERROR: Failed to create SSL_CTX $! ");
-
- Net::SSLeay::CTX_set_options($ctx, &Net::SSLeay::OP_ALL);
- die_if_ssl_error("ERROR: ssl ctx set options");
- $ssl = Net::SSLeay::new($ctx) or die_now("ERROR: Failed to create SSL $!");
-
- Net::SSLeay::set_fd($ssl, fileno(S));
- Net::SSLeay::connect($ssl) and die_if_ssl_error("ERROR: ssl connect");
- #print STDERR 'SSL Connected ';
- print 'Using Cipher: ' . Net::SSLeay::get_cipher($ssl) if $globalDebug;
- #print STDERR "\n\n";
- return $ssl;
-}
-
-sub closeSSLconnection($)
-{
- my $ssl = shift;
-
- Net::SSLeay::free ($ssl); # Tear down connection
- Net::SSLeay::CTX_free ($ctx);
- close S;
-}
-
-sub waitforack {
- my $sock = shift;
- my $select = new IO::Select;
- $select->add($sock);
- my $str;
- if ($select->can_read(10)) { # Continue after 10 seconds, even if not acked...
- if ($str = <$sock>) {
- } else {
- $select->remove($sock); #Block until parent acks data
- }
- }
-}
-
-
-
-# usage: sendscript(host, script)
-# sends the xmlscript script to host, returns reply
-sub sendScript($$)
-{
- my $host = shift;
- my $script = shift;
- my ($ssl, $reply, $lastreply, $res, $n);
- $ssl = openSSLconnection($host);
- # write header
- $n = Net::SSLeay::ssl_write_all($ssl, ''."\r\n");
- print "Wrote $n\n" if $globalDebug;
- $n = Net::SSLeay::ssl_write_all($ssl, ''."\r\n");
- print "Wrote $n\n" if $globalDebug;
-
- # write script
- $n = Net::SSLeay::ssl_write_all($ssl, $script);
- print "Wrote $n\n$script\n" if $globalDebug;
- $reply = "";
- $lastreply = "";
- my $reply2return;
- READLOOP:
- while(1) {
- $n++;
- $lastreply = Net::SSLeay::read($ssl);
- die_if_ssl_error("ERROR: ssl read");
- if($lastreply eq "") {
- sleep(2); # wait 2 sec for more text.
- $lastreply = Net::SSLeay::read($ssl);
- die_if_ssl_error("ERROR: ssl read");
- last READLOOP if($lastreply eq "");
- }
- $reply .= $lastreply;
- print "lastreply $lastreply \b" if $globalDebug;
-
- # Check response to see if a error was returned.
- if($lastreply =~ m/STATUS="(0x[0-9A-F]+)"[\s]+MESSAGE='(.*)'[\s]+\/>[\s]*(([\s]|.)*?)<\/RIBCL>/) {
- if($1 eq "0x0000") {
- #print STDERR "$3\n" if $3;
- } else {
- $reply2return = "ERROR: STATUS: $1, MESSAGE: $2\n";
- }
- }
- }
- print "READ: $lastreply\n" if $globalDebug;
- if($lastreply =~ m/STATUS="(0x[0-9A-F]+)"[\s]+MESSAGE='(.*)'[\s]+\/>[\s]*(([\s]|.)*?)<\/RIBCL>/) {
- if($1 eq "0x0000") {
- #Sprint STDERR "$3\n" if $3;
- } else {
- $reply2return = "ERROR: STATUS: $1, MESSAGE: $2\n";
- }
- }
-
- closeSSLconnection($ssl);
- return $$reply2return;
-}
-
-sub process_request {
- my $request = shift;
- my $callback = shift;
- my $noderange = $request->{node}; #Should be arrayref
- my $command = $request->{command}->[0];
- my $extrargs = $request->{arg};
- my @exargs=($request->{arg});
- my $ipmimaxp = 64;
- if (ref($extrargs)) {
- @exargs=@$extrargs;
- }
- my $ipmitab = xCAT::Table->new('ipmi');
-
- my $ilouser = "USERID";
- my $ilopass = "PASSW0RD";
- # Go to the passwd table to see if usernames and passwords are defined
- my $passtab = xCAT::Table->new('passwd');
- if ($passtab) {
- my ($tmp)=$passtab->getAttribs({'key'=>'ipmi'},'username','password');
- if (defined($tmp)) {
- $ilouser = $tmp->{username};
- $ilopass = $tmp->{password};
- }
- }
-
- my @donargs = ();
- my $ipmihash = $ipmitab->getNodesAttribs($noderange,['bmc','username','password']);
- foreach(@$noderange) {
- my $node=$_;
- my $nodeuser=$ilouser;
- my $nodepass=$ilopass;
- my $nodeip = $node;
- my $ent;
- if (defined($ipmitab)) {
- $ent=$ipmihash->{$node}->[0];
- if (ref($ent) and defined $ent->{bmc}) { $nodeip = $ent->{bmc}; }
- if (ref($ent) and defined $ent->{username}) { $nodeuser = $ent->{username}; }
- if (ref($ent) and defined $ent->{password}) { $nodepass = $ent->{password}; }
- }
- push @donargs,[$node,$nodeip,$nodeuser,$nodepass];
- }
-
- #get new node status
- my %nodestat=();
- my $check=0;
- my $newstat;
- if ($command eq 'rpower') {
- if (($extrargs->[0] ne 'stat') && ($extrargs->[0] ne 'status') && ($extrargs->[0] ne 'state')) {
- $check=1;
- my @allnodes;
- foreach (@donargs) { push(@allnodes, $_->[0]); }
-
- if ($extrargs->[0] eq 'off') { $newstat=$::STATUS_POWERING_OFF; }
- else { $newstat=$::STATUS_BOOTING;}
-
- foreach (@allnodes) { $nodestat{$_}=$newstat; }
-
- if ($extrargs->[0] ne 'off') {
- #get the current nodeset stat
- if (@allnodes>0) {
- my $nsh={};
- my ($ret, $msg)=xCAT::Utils->getNodesetStates(\@allnodes, $nsh);
- if (!$ret) {
- foreach (keys %$nsh) {
- my $currstate=$nsh->{$_};
- $nodestat{$_}=xCAT_monitoring::monitorctrl->getNodeStatusFromNodesetState($currstate, "rpower");
- }
- }
- }
- }
- }
- }
-
- # fork off separate processes to handle the requested command on each node.
- my $children = 0;
- $SIG{CHLD} = sub {my $kpid; do { $kpid = waitpid(-1, &WNOHANG); if ($kpid > 0) { delete $bmc_comm_pids{$kpid}; $children--; } } while $kpid > 0; };
- my $sub_fds = new IO::Select;
- foreach (@donargs) {
- while ($children > $ipmimaxp) {
- my $errornodes={};
- forward_data($callback,$sub_fds,$errornodes);
- #update the node status to the nodelist.status table
- if ($check) {
- updateNodeStatus(\%nodestat, $errornodes);
- }
- }
- $children++;
- my $cfd;
- my $pfd;
- socketpair($pfd, $cfd,AF_UNIX,SOCK_STREAM,PF_UNSPEC) or die "socketpair: $!";
- $cfd->autoflush(1);
- $pfd->autoflush(1);
- my $child = xCAT::Utils->xfork();
- unless (defined $child) { die "Fork failed" };
- if ($child == 0) {
- close($cfd);
- my $rrc=execute_cmd($pfd,$_->[0],$_->[1],$_->[2],$_->[3],$command,-args=>\@exargs);
- close($pfd);
- exit(0);
- }
- $bmc_comm_pids{$child}=1;
- close ($pfd);
- $sub_fds->add($cfd)
- }
- while ($sub_fds->count > 0 and $children > 0) {
- my $errornodes={};
- forward_data($callback,$sub_fds,$errornodes);
- #update the node status to the nodelist.status table
- if ($check) {
- updateNodeStatus(\%nodestat, $errornodes);
- }
- }
-
- #Make sure they get drained, this probably is overkill but shouldn't hurt
- #my $rc=1;
- #while ( $rc > 0 ) {
- #my $errornodes={};
- #$rc=forward_data($callback,$sub_fds,$errornodes);
- #update the node status to the nodelist.status table
- #if ($check ) {
- #updateNodeStatus(\%nodestat, $errornodes);
- #}
- #}
-}
-
-sub updateNodeStatus {
- my $nodestat=shift;
- my $errornodes=shift;
- my %node_status=();
- foreach my $node (keys(%$errornodes)) {
- if ($errornodes->{$node} == -1) { next;} #has error, not updating status
- my $stat=$nodestat->{$node};
- if (exists($node_status{$stat})) {
- my $pa=$node_status{$stat};
- push(@$pa, $node);
- }else {
- $node_status{$stat}=[$node];
- }
- }
- xCAT_monitoring::monitorctrl::setNodeStatusAttributes(\%node_status, 1);
-}
-
-sub processReply
-{
-
-
- my $command = shift;
- my $subcommand = shift;
- my $reply = shift; # This is the returned xml string from the iLO that we will now parse
- my $replyToReturn = "";
- my $rc = 0;
-
- if ($command eq "power" ) {
- if($subcommand =~ m/stat/) {
- # Process power status command
- $replyToReturn = "ON" if $reply =~ m/HOST_POWER="ON"/;
- $replyToReturn = "OFF" if $reply =~ m/HOST_POWER="OFF"/;
- }
- } elsif ($command eq "beacon") {
- if($subcommand =~ m/stat/) {
- $replyToReturn = "ON" if $reply =~ /GET_UID_STATUS UID="ON"/;
- $replyToReturn = "OFF" if $reply =~ /GET_UID_STATUS UID="OFF"/;
- }
- }
-
- if (! $replyToReturn) {
- $rc = -1;
- }
-
- return ($rc, $replyToReturn);
-}
-
-sub makeGEHXML
-{
- my $inputreply = shift;
- # process response
- my $geh_output = "";
-
- my @lines = split/^/, $inputreply;
- my $capture = 0;
-
- foreach my $line (@lines) {
- if ($capture == 0 && $line =~ m/GET_EMBEDDED_HEALTH_DATA/) {
- $capture = 1;
- } elsif ($capture == 1 && $line =~ m/GET_EMBEDDED_HEALTH_DATA/) {
- $geh_output .= $line;
- last;
- }
- $geh_output .= $line if $capture;
- }
- return ($geh_output);
-}
-
-
-sub processGEHReply
-{
- my $subcommand = shift;
- my $reply = shift ;
-
- use XML::Simple;
-
- # Process the reply from the ilo. Parse out all the untereting
- # stuff so we then have some XML which represents only the output of the GEH command.
-
- my $gehXML = makeGEHXML($reply);
- my $gehOutput = "";
-
- # Now use XML::Simple to build a perl hash representation of the output
- my $gehHash =XMLin($gehXML);
-
- # We now have the reply in a format which is easy to parse. Now we
- # figure out what the user wants and return it.
-
- my $numoftemps = $#{$gehHash->{TEMPERATURE}->{TEMP}};
-
- if($subcommand eq "temp" || $subcommand eq "all") {
-
- for my $index (0 .. $numoftemps) {
- my $location = $gehHash->{TEMPERATURE}->{TEMP}[$index]->{LOCATION}->{VALUE};
- my $temperature = $gehHash->{TEMPERATURE}->{TEMP}[$index]->{CURRENTREADING}->{VALUE};
- my $unit = $gehHash->{TEMPERATURE}->{TEMP}[$index]->{CURRENTREADING}->{UNIT};
- $gehOutput .= "$location "."Temperature: "."$temperature $unit \n";
- }
- }
-
- if($subcommand eq "cputemp" || $subcommand eq "ambtemp") {
- my $temp2look4 = "CPU" if ($subcommand eq "cputemp");
- $temp2look4 = "Ambient" if ($subcommand eq "ambtemp");
- for my $index (0 .. $numoftemps) {
- if($gehHash->{TEMPERATURE}->{TEMP}[$index]->{LOCATION} =~ m/$temp2look4/) {
- my $location = $gehHash->{TEMPERATURE}->{TEMP}[$index]->{LOCATION}->{VALUE};
- my $temperature = $gehHash->{TEMPERATURE}->{TEMP}[$index]->{CURRENTREADING}->{VALUE};
- my $unit = $gehHash->{TEMPERATURE}->{TEMP}[$index]->{CURRENTREADING}->{UNIT};
- $gehOutput .= " $location "."Temperature: "."$temperature $unit \n";
- }
- }
- }
-
-
- if($subcommand eq "fanspeed" || $subcommand eq "all") {
- foreach my $fan (keys %{$gehHash->{FANS}}) {
- my $fanLabel = $gehHash->{FANS}->{$fan}->{LABEL}->{VALUE};
- my $fanStatus = $gehHash->{FANS}->{$fan}->{STATUS}->{VALUE};
- my $fanZone = $gehHash->{FANS}->{$fan}->{ZONE}->{VALUE};
- my $fanUnit = $gehHash->{FANS}->{$fan}->{SPEED}->{UNIT};
- my $fanSpeedValue = $gehHash->{FANS}->{$fan}->{SPEED}->{VALUE};
-
- if($fanUnit eq "Percentage") {
- $fanUnit = "%";
- }
-
- $gehOutput .= "Fan Status $fanStatus Fan Speed: $fanSpeedValue $fanUnit Label - $fanLabel Zone - $fanZone";
-
- }
- }
-
- return(0, $gehOutput);
-
-}
-
-
-sub execute_cmd {
- $outfd = shift;
- my $node = shift;
- $currnode= $node;
- my $iloip = shift;
- my $user = shift;
- my $pass = shift;
- my $command = shift;
- my %namedargs = @_;
- my $extra=$namedargs{-args};
- my @exargs=@$extra;
-
-
- my $subcommand = $exargs[0];
-
- my ($rc, @reply);
-
- if($command eq "rpower" ) { # THe almighty power command
-
- ($rc, @reply) = issuePowerCmd($iloip, $user, $pass, $subcommand);
-
- } elsif ($command eq "rvitals" ) {
-
- ($rc, @reply) = issueEmbHealthCmd($iloip, $user, $pass, $subcommand);
-
- } elsif ($command eq "rbeacon") {
-
- ($rc, @reply) = issueUIDCmd($iloip, $user, $pass, $subcommand);
-
- } elsif ($command eq "reventlog") {
-
- ($rc, @reply) = issueEventLogCmd($iloip, $user, $pass, $subcommand);
-
- }
-
- sendoutput($rc, @reply);
-
- return $rc;
-
-}
-
-sub issueUIDCmd
-{
- my $ipaddr = shift;
- my $username = shift;
- my $password = shift;
- my $subcommand = shift;
-
- my $cmdString;
-
- if($subcommand eq "on") {
- $cmdString = $UID_CONTROL_ON;
- } elsif ($subcommand eq "off") {
- $cmdString = $UID_CONTROL_OFF;
- } elsif ($subcommand eq "stat") {
- $cmdString = $GET_UID_STATUS;
- } else { # anything else is not supported by the ilo
- return(-1, "not supported");
- }
-
- # All figured out.... send the command
- my ($rc, $reply) = iloCmd($ipaddr, $username, $password, 0, $cmdString);
-
- my $condensedReply = processReply("beacon", $subcommand, $reply);
-
- return ($rc, $condensedReply);
-}
-
-sub issuePowerCmd {
- my $ipaddr = shift;
- my $username = shift;
- my $password = shift;
- my $subcommand = shift;
-
- my $cmdString = "";
- my ($rc, $reply);
-
- if ($subcommand eq "on") {
- $cmdString = $SET_HOST_POWER_YES;
- } elsif($subcommand eq "off") {
- # $cmdString = $SET_HOST_POWER_NO;
- $cmdString = $HOLD_POWER_BUTTON;
- } elsif ($subcommand eq "stat" || $subcommand eq "state") {
- $cmdString = $GET_HOST_POWER_STATUS;
- } elsif ($subcommand eq "reset") {
- $cmdString = $RESET_SERVER;
- } elsif ($subcommand eq "softoff") {
- $cmdString = $HOLD_POWER_BUTTON;
- # Handle two special cases here. For these commands we will need to issue a series of
- # commands to the ilo to emulate the desired operation
- } elsif ($subcommand eq "cycle") {
- ($rc, $reply) = iloCmd($ipaddr, $username, $password, 0, $SET_HOST_POWER_NO);
- sleep 15;
- if ($rc != 0) {
- print STDERR "issuePowerCmd:cycle Command to power down server failed. \n";
- return ($rc, $reply);
- }
- $cmdString = $SET_HOST_POWER_YES;
-
- } elsif ($subcommand eq "boot") {
- # Determine the current power status of the server
- ($rc, $reply) = iloCmd($ipaddr, $username, $password, 0, $GET_HOST_POWER_STATUS);
- if ($rc == 0) {
- my $powerstatus = processReply("power", "status", $reply);
-
- if ($reply eq "ON") {
- $cmdString = $RESET_SERVER;
- } else {
- $cmdString = $SET_HOST_POWER_YES;
- }
- } else {
- print STDERR "issuePowerCmd:boot Power status of server failed. \n";
- return ($rc, $reply);
- }
-
- }
- print "cmdstring is $cmdString \n";
-
- ($rc, $reply) = iloCmd($ipaddr, $username, $password, 0, $cmdString);
-
- my $condensedReply = processReply("power", $subcommand, $reply);
-
- return ($rc, $condensedReply);
-}
-
-
-sub issueEmbHealthCmd {
- my $ipaddr = shift;
- my $username = shift;
- my $password = shift;
- my $subcommand = shift;
-
- my ($rc, $reply) = iloCmd($ipaddr, $username, $password, 0, $GET_EMBEDDED_HEALTH);
-
- my $condensedReply = processGEHReply($subcommand, $reply);
-
- return ($rc, $condensedReply);
-}
-
-sub issueEventLogCmd {
- my $ipaddr = shift;
- my $username = shift;
- my $password = shift;
- my $subcommand = shift;
-
- my $numberOfEntries = "";
- my $errorLogOutput;
- my ($rc, $reply);
-
- if($subcommand eq "clear") {
- ($rc, $reply) = iloCmd($ipaddr, $username, $password, 0, $CLEAR_EVENT_LOG);
- return($rc, $reply);
- }
-
- if(! $subcommand =~ /\D/) {
- $numberOfEntries = $subcommand;
- }
-
- if($subcommand eq "all" || $numberOfEntries) {
- ($rc, $reply) = iloCmd($ipaddr, $username, $password, 0, $GET_EVENT_LOG);
-
- if ($rc != 0) {
- print STDERR "issueEventLogCmd: Failed get error log \n";
- }
- $errorLogOutput = processErrorLogReply($reply);
- }
-
- return ($rc, $errorLogOutput);
-}
-
-
-
-sub iloCmd {
- my $ipaddr = shift;
- my $username = shift;
- my $password = shift;
- my $localdebug = shift;
- my $command = shift;
-
- # Before we open the connection to the iLO, build the command we are going
- # to send
-
- my $cmdToSend = $INITIAL_HEADER;
- $cmdToSend =~ s/AdMiNnAmE/$username/;
- $cmdToSend =~ s/PaSsWoRd/$password/;
- $cmdToSend = "$cmdToSend"."$command";
-
- if($localdebug) {
- print STDERR "Command built. Command is $cmdToSend \n";
- }
-
- my $reply = sendScript($ipaddr, $cmdToSend);
-
- return(0, $reply);
-}
-
-sub forward_data { #unserialize data from pipe, chunk at a time, use magic to determine end of data structure
- my $callback = shift;
- my $fds = shift;
- my $errornodes=shift;
-
- my @ready_fds = $fds->can_read(1);
- my $rfh;
- my $rc = @ready_fds;
- foreach $rfh (@ready_fds) {
- my $data;
- if ($data = <$rfh>) {
- while ($data !~ /ENDOFFREEZE6sK4ci/) {
- $data .= <$rfh>;
- }
- print $rfh "ACK\n";
- my $responses=thaw($data);
- foreach (@$responses) {
- #save the nodes that has errors and the ones that has no-op for use by the node status monitoring
- my $no_op=0;
- if (exists($_->{node}->[0]->{errorcode})) { $no_op=1; }
- else {
- my $text=$_->{node}->[0]->{data}->[0]->{contents}->[0];
- #print "data:$text\n";
- if (($text) && ($text =~ /$status_noop/)) {
- $no_op=1;
- #remove the symbols that meant for use by node status
- $_->{node}->[0]->{data}->[0]->{contents}->[0] =~ s/ $status_noop//;
- }
- }
- #print "data:". $_->{node}->[0]->{data}->[0]->{contents}->[0] . "\n";
- if ($no_op) {
- if ($errornodes) { $errornodes->{$_->{node}->[0]->{name}->[0]}=-1; }
- } else {
- if ($errornodes) { $errornodes->{$_->{node}->[0]->{name}->[0]}=1; }
- }
- $callback->($_);
- }
- } else {
- $fds->remove($rfh);
- close($rfh);
- }
- }
-yield; #Avoid useless loop iterations by giving children a chance to fill pipes return $rc;
-}
-
-
-
-sub sendoutput {
- my $rc=shift;
- foreach (@_) {
- my %output;
- (my $desc,my $text) = split(/:/,$_,2);
- unless ($text) {
- $text=$desc;
- } else {
- $desc =~ s/^\s+//;
- $desc =~ s/\s+$//;
- if ($desc) {
- $output{node}->[0]->{data}->[0]->{desc}->[0]=$desc;
- }
- }
- $text =~ s/^\s+//;
- $text =~ s/\s+$//;
- $output{node}->[0]->{name}->[0]=$currnode;
- $output{node}->[0]->{data}->[0]->{contents}->[0]=$text;
- if ($rc) {
- $output{node}->[0]->{errorcode}=[$rc];
- }
- #push @outhashes,\%output; #Save everything for the end, don't know how to be slicker with Storable and a pipe
- print $outfd freeze([\%output]);
- print $outfd "\nENDOFFREEZE6sK4ci\n";
- yield;
- waitforack($outfd);
- }
-}
-
-1;
-
-
-
diff --git a/xCAT-server/lib/xcat/plugins/hpoa.pm b/xCAT-server/lib/xcat/plugins/hpoa.pm
deleted file mode 100755
index 5eb85e4ac..000000000
--- a/xCAT-server/lib/xcat/plugins/hpoa.pm
+++ /dev/null
@@ -1,374 +0,0 @@
-#
-# © Copyright 2009 Hewlett-Packard Development Company, L.P.
-# EPL license http://www.eclipse.org/legal/epl-v10.html
-#
-
-## API for talking to HP Onboard Administrator
-
-## NOTE:
-## All parameters are passed by name!
-## For example:
-## hpoa->new(oaAddress => '16.129.49.209');
-
-package xCAT_plugin::hpoa;
-
-use strict;
-
-use SOAP::Lite;
-use vars qw(@ISA);
-@ISA = qw(SOAP::Lite);
-
-# Constructor
-# Input: oaAddress, the IP address of the OA
-# Output: SOAP::SOM object (SOAP response)
-sub new {
- my $class = shift;
- return $class if ref $class;
-
- my $self = $class->SUPER::new();
-
- my %args = @_;
-
- die "oaAddress is a required parameter"
- unless defined $args{oaAddress};
-
- # Some info we'll need
- $self->{HPOA_HOST} = $args{oaAddress}; # OA IP address
- $self->{HPOA_KEY} = undef; # oaSessionKey returned by userLogIn
- $self->{HPOA_SECURITY_XML} = undef; # key placed in proper XML
- $self->{HPOA_SECURITY_HEADER} = undef; # XML translated to SOAP::Header obj
-
- bless($self, $class);
-
- # We contact the OA via this URL:
- my $proxy = "https://". $self->{HPOA_HOST} . ":443/hpoa";
-
- # One of the cool things about SOAP::Lite is that almost every
- # method returns $self. This allows you to string together
- # as many calls as you need, like this:
- $self
- # keep the XML formatted for human readability, in case
- # we ever have to look at it (unlikely)
- -> readable(1)
-
- # Need to tell SOAP about some namespaces. I don't know if they
- # are all necessary or not, but I got them from the hpoa.wsdl
- -> ns("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "wsu")
- -> ns('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', "wsse")
- -> ns('http://www.w3.org/2001/XMLSchema-instance', 'xsi')
- -> ns('http://www.w3.org/2003/05/soap-encoding', 'SOAP-ENC')
- -> ns('http://www.w3.org/2003/05/soap-envelope', 'SOAP-ENV')
- -> ns('http://www.w3.org/2001/XMLSchema', 'xsd')
- -> default_ns("hpoa.xsd", "hpoa")
-
- # Inform SOAP of the OA URL
- -> proxy($proxy);
-
- return $self;
-}
-
-# Method: call
-# Input: method and a hash of method's input params (see below)
-# Output: SOAP::SOM object (SOAP response)
-#
-# All methods in the OA API end up getting called by this routine,
-# even though the user invokes them directly using the method name.
-# For example, code that looks like this:
-# $hpoa->userLogIn(username=>$name, password=>$pass)
-# results in this call:
-# $hpoa->call('userLogIn', username=>$name, password=>$pass)
-sub call {
- my ($self, $method, %args) = @_;
-
- #
- # Each item of %args is of the form:
- # ($name => $value).
- #
- # $value is usually a scalar and SOAP::Lite infers a type.
- #
- # If the value needs to be explicitly typed, the $value should be a
- # reference to an array of the form:
- # [ $scalar, $type ]
- # This should work for any parameter that you want to explicitly
- # type, but for some reason the OA was not having any of it the
- # last time I tried.
- #
- # If the method calls for an array of values, the $value should be
- # a reference to an array of the form:
- # [ $itemName, $itemArrayRef, $itemType ]
- #
- # If the method calls for more complicated structure, the $value
- # should be a reference to a hash of the form:
- # { name1 => value1, name2 => value2 ... }
- # The values can themselves be scalars, array refs or hash refs,
- # which will themselves be processed recursively.
- #
-
- # Put the params in a form SOAP likes.
- my @soapargs = ();
- while (my ($k, $v) = each %args) {
- push @soapargs, $self->process_args($k, $v);
- }
- # This is required if there are no params, otherwise SOAP::Lite
- # makes an XML construct that the OA doesn't like.
- @soapargs = SOAP::Data->type('xml'=> undef)
- unless @soapargs;
-
- # Add the security header if it's not the login method.
- # I'm hoping that the header will be ignored by the few methods
- # that don't require security.
- push (@soapargs, $self->{HPOA_SECURITY_HEADER})
- unless ($method eq 'userLogIn') || !defined $self->{HPOA_SECURITY_HEADER};
-
- # Make sure we're using the correct version of SOAP, but
- # don't mess up packages that use a different version.
- my $version = hpoa->soapversion();
- hpoa->soapversion('1.2');
-
- # Call the method and put the response in $r
- my $r = $self->SUPER::call($method, @soapargs);
-
- # Reset the SOAP version
- hpoa->soapversion($version);
-
- # If this was the login method and it was successful, then extract
- # the session key and remember it for subsequent calls.
- if ($method eq 'userLogIn' && !$r->fault) {
-
- my $key = $r->result()->{oaSessionKey};
-
- # Got this XML code from the HP Insight Onboard Administrator SOAP
- # Interface Guide 0.9.7
- my $xml = '
-
-
- '
- . $key .
- '
-
-';
-
- $self->{HPOA_KEY} = $key;
- $self->{HPOA_SECURITY_XML} = $xml;
- $self->{HPOA_SECURITY_HEADER} = SOAP::Header->type('xml' => $xml);
- }
-
- # Return the response
- return $r;
-}
-
-## Create the correct SOAP::Data structure for the given args
-## $n is the argument name
-## $v is the value and can be of the following 4 forms:
-## $scalar
-## - A scalar value. No further processing takes place.
-## Produces: value
-## [ $scalar, $type ]
-## - An array ref containing a scalar value and type. No further
-## will take place.
-## Produces: value
-## [ $itemName, $aref, $type ]
-## - An array ref containing the name for the elements, the elements
-## themselves in an array ref, and the type for the elements. The
-## elements themselves can be processed.
-## Produces:
-## - value1
-## - value2
-##
-## { $n1 => $v1, $n2 => $v2 ... }
-## - A hash ref containing name value pairs that can themselves
-## be processed.
-## Produces:
-## v1
-## v2
-##
-
-sub process_args {
- my ($self, $n, $v, $t) = @_;
- print "process args: $n => $v\n" if 0;
-
- if (!ref $v) { # untyped scalar
- print "\nUNTYPED SCALAR: $n => $v\n" if 0;
- return SOAP::Data->new(name => $n, value => $v, type => '');
- }
-
- if (ref $v eq 'HASH') { # structure
- my ($nn, $vv, @ar);
- while (($nn, $vv) = each %$v) {
- print "\nSTRUCTURE $n: $nn => $vv\n" if 0;
- unshift @ar, $self->process_args($nn, $vv);
- }
- return SOAP::Data->name($n => \SOAP::Data->value(@ar));
- }
-
- if (ref $v eq 'ARRAY') {
-
- if (scalar @$v == 2) { # typed scalar
- my ($value, $type) = @$v;
- print "\nTYPED SCALAR: $n => $value ($type)\n" if 0;
- return SOAP::Data->new(name => $n, value => $value, type => $type);
- }
-
- # Else an array of values
- my ($itemName, $aref, $type) = @$v;
- my (@ar, $item);
- foreach $item (@$aref) {
- if (ref $item eq 'HASH') {
- print "\nSUB STRUCTURE $n: $itemName => $item ($type)\n" if 0;
- unshift @ar, $self->process_args("$itemName", $item);
- } else {
- print "\nARRAY $n: $itemName => $item ($type)\n" if 0;
- unshift @ar, $self->process_args($itemName, [$item, $type]);
- }
- }
- return SOAP::Data->name($n => \SOAP::Data->value(@ar));
- }
-
- die "Unexpected input parameter value: $n => $v\n";
-}
-
-###
-### Special fault info for OAs
-###
-
-# The OA uses it's own fault data structures. The simple
-# fault methods provided by SOAP::Lite are usually undef.
-# The OA's fault data looks like this:
-# {
-# 'Detail' => {
-# 'faultInfo' => {
-# 'operationName' => 'userLogIn',
-# 'errorText' => 'The user could not be authenticated.',
-# 'errorCode' => '150',
-# 'errorType' => 'USER_REQUEST'
-# }
-# },
-# 'Reason' => {
-# 'Text' => 'User Request Error'
-# },
-# 'Code' => {
-# 'Value' => 'SOAP-ENV:Sender'
-# }
-#}
-#
-# In your code, you should generally check that $response->fault
-# is defined, then print $response->oaErrorMessage.
-# If you know the codes, you can act on $response->oaErrorCode
-#
-
-# The OA's fault structure
-sub SOAP::SOM::oaFaultInfo {
- my ($self, @args) = @_;
-
- return $self->fault->{Detail}->{faultInfo}
- if (defined $self->fault &&
- defined $self->fault->{Detail} &&
- defined $self->fault->{Detail}->{faultInfo});
-
- return undef;
-}
-
-# The name of the method producing the fault
-sub SOAP::SOM::oaOperationName {
- my ($self, @args) = @_;
-
- my $oafi = $self->oaFaultInfo;
-
- return $oafi->{operationName}
- if defined $oafi &&
- defined $oafi->{operationName};
-
- return undef;
-}
-
-# Text of the OA fault
-sub SOAP::SOM::oaErrorText {
- my ($self, @args) = @_;
-
- my $oafi = $self->oaFaultInfo;
-
- return $oafi->{errorText}
- if defined $oafi &&
- defined $oafi->{errorText};
-
- return undef;
-}
-
-# Numeric code of the OA fault
-sub SOAP::SOM::oaErrorCode {
- my ($self, @args) = @_;
-
- my $oafi = $self->oaFaultInfo;
-
- if (defined $oafi) {
-
- return $oafi->{errorCode}
- if defined $oafi->{errorCode};
-
- return $oafi->{internalErrorCode}
- if defined $oafi->{internalErrorCode};
- }
-
- return undef;
-}
-
-# Bay Number of the OA fault
-sub SOAP::SOM::oaOperationBayNumber {
- my ($self, @args) = @_;
-
- my $oafi = $self->oaFaultInfo;
-
- return $oafi->{operationBayNumber}
- if defined $oafi &&
- defined $oafi->{operationBayNumber};
-
- return undef;
-}
-
-# Sometimes there's extra fault information
-# (Haven't seen any yet!)
-sub SOAP::SOM::oaExtraFaultData {
- my ($self, @args) = @_;
-
- my $oafi = $self->oaFaultInfo;
-
- return $oafi->{extraData}
- if defined $oafi &&
- defined $oafi->{extraData};
-
- return undef;
-}
-
-# Nicely formatted error message for human consumption.
-# Tries to use the oaErrorText and oaErrorCode, if defined,
-# else uses the reason text.
-sub SOAP::SOM::oaErrorMessage {
- my ($self, @args) = @_;
-
- my $errorText = $self->oaErrorText;
-
- # Reason text is either an error message from SOAP (as when
- # the method or argument doesn't exist), or it's a formatted
- # form of the faultInfo->errorType enumeration.
- my $reasonText = $self->fault->{Reason}->{Text};
-
- return $reasonText
- unless defined $errorText;
-
- my $operationName = $self->oaOperationName;
- my $operationBay = $self->oaOperationBayNumber;
- my $errorCode = $self->oaErrorCode;
- my $extraData = $self->oaExtraFaultData;
-
- my $operation = "'$operationName' call";
- $operation .= " on bay $operationBay"
- if $operationBay;
-
- my $completeText =
- "$reasonText $errorCode during $operation: $errorText";
- $completeText .= "\n\t$extraData" if $extraData;
-
- return $completeText;
-}
-
-1;
diff --git a/xCAT-server/share/xcat/cons/hpblade b/xCAT-server/share/xcat/cons/hpblade
deleted file mode 100755
index eb572075d..000000000
--- a/xCAT-server/share/xcat/cons/hpblade
+++ /dev/null
@@ -1,118 +0,0 @@
-#!/usr/bin/env perl
-#
-# © Copyright 2009 Hewlett-Packard Development Company, L.P.
-# EPL license http://www.eclipse.org/legal/epl-v10.html
-#
-# Revision history:
-# August, 2009 blade adapted to generate hpblade
-#
-use Fcntl qw(:DEFAULT :flock);
-sub get_lock {
- unless (flock(LOCKHANDLE,LOCK_EX|LOCK_NB)) {
- $| = 1;
- print "Acquiring startup lock...";
- flock(LOCKHANDLE,LOCK_EX) or die "Error trying to secure a startup lock";
- print "done\n";
- }
- truncate(LOCKHANDLE,0);
- print LOCKHANDLE $$."\n";
-}
-
-sub release_lock {
- truncate(LOCKHANDLE,0);
- flock(LOCKHANDLE,LOCK_UN);
-}
-
-BEGIN
-{
- use Time::HiRes qw(sleep);
- use File::Path;
- use Fcntl qw(:DEFAULT :flock);
- $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
- umask 0077;
- mkpath("/tmp/xcat/");
- unless (sysopen(LOCKHANDLE,"/tmp/xcat/consolelock",O_WRONLY | O_CREAT)) {
- sleep 15;
- print "Unable to open lock file";
- exit 0;
- }
- get_lock();
- #my $sleepint=int(rand(10)); #Stagger start to avoid overwhelming conserver/xCATd
- #print "Opening console in ".(2+(0.5*$sleepint))." seconds...\n";
- #sleep $sleepint;
-}
-my $sleepint=int(rand(10)); #Stagger start to avoid overwhelming conserver/xCATd
-use lib "$::XCATROOT/lib/perl";
-$ENV{HOME}='/root/';
-require xCAT::Client;
-
-require File::Basename;
-import File::Basename;
-my $scriptname = $0;
-
-#$mptab = xCAT::Table->new('mp');
-#unless ($mptab) {
- #sleep 5; #Try not to overwhelm logfiles...
-# die "mp table must be configured";
-#}
-#$mpatab = xCAT::Table->new('mpa');
-#$passtab = xCAT::Table->new('passwd');
-
-my $username = "admin";
-my $passsword = "PASSW0RD";
-my $mm;
-my $slot;
-#my $dba;
-#if ($passtab) {
-# ($dba) = $passtab->getAttribs({key=>blade},qw(username password));
-# if ($dba->{username}) {
-# $username = $dba->{username};
-# }
-# if ($dba->{password}) {
-# $password = $dba->{password};
-# }
-#}
-
-#$dba = $mptab->getNodeAttribs($ARGV[0],[qw(mpa id)]);
-#$mm = $dba->{mpa};
-#$slot = $dba->{id};
-#if ($mpatab) {
-# ($dba) = $mpatab->getAttribs({mpa=>$mm},qw(username password));
-# if ($dba) {
-# if ($dba->{username}) { $username = $dba->{username}; }
-# if ($dba->{password}) { $password = $dba->{password}; }
-# }
-#}
-#xCAT::Utils::close_all_dbhs;
-#sleep 5; #Slow start, I know, but with exec, can't return
-sub getans {
- my $rsp = shift;
- if ($rsp->{node}) {
- $mm = $rsp->{node}->[0]->{mm}->[0];
- $username = $rsp->{node}->[0]->{username}->[0];
- $slot = $rsp->{node}->[0]->{slot}->[0];
- }
-}
-my $cmdref={
- command=>"gethpbladecons",
- arg=>"text",
- noderange=>$ARGV[0]
-};
-xCAT::Client::submit_request($cmdref,\&getans);
-until ($mm and $username and $slot) {
- release_lock(); #Let other clients have a go
- $sleepint=10+int(rand(20)); #Stagger to minimize lock collisions, but no big deal when it does happen
- print "Console not ready, retrying in $sleepint seconds (Hit Ctrl-E,c,o to skip delay)\n";
- sleep $sleepint;
- get_lock();
- xCAT::Client::submit_request($cmdref,\&getans);
-}
-release_lock(); #done with xcatd, can run with near impunity
-$sleepint=10+int(rand(30)); #Stagger sleep to take it easy on AMM/hosting server
-exec "ssh -t $username"."@"."$mm";
-my $pathtochild= dirname($scriptname). "/";
-#exec $pathtochild."hpblade.expect";
-
-#SECURITY: In this case, the authentication is expected to be done using the script user's ssh keys. As such,
-#this script does not receive any particularly sensitive data from the xCAT server.
-
diff --git a/xCAT-server/share/xcat/cons/hpblade.expect b/xCAT-server/share/xcat/cons/hpblade.expect
deleted file mode 100755
index 99ff947bb..000000000
--- a/xCAT-server/share/xcat/cons/hpblade.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/expect -f
-#
-# © Copyright 2009 Hewlett-Packard Development Company, L.P.
-# EPL license http://www.eclipse.org/legal/epl-v10.html
-#
-
-set send_slow {1 0.02}
-
-expect ""
-sleep 5
-
-send -s "vsp"
-sleep 1
-
-send "\r"
-
-exit 0