diff --git a/xCAT-client/bin/rinstall b/xCAT-client/bin/rinstall index fad798fdb..48ce9b1a1 100755 --- a/xCAT-client/bin/rinstall +++ b/xCAT-client/bin/rinstall @@ -1,12 +1,11 @@ #!/usr/bin/env perl # IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html -# Used as a convience command combined of [nodech]-nodeset-rpower-[rcons/wcons] +# Used as a convience command combined of [nodech]-nodeset-rsetboot-rpower-[rcons/wcons] # to make ease of node OS provision -# To use this, sym link your cmd name to this script. +# This is the client front-end to rinstall/winstall commands -use strict; BEGIN { @@ -20,180 +19,69 @@ use lib "$::XCATROOT/lib/perl"; use File::Basename; use Getopt::Long; use xCAT::MsgUtils; -use xCAT::Table; -use xCAT::NodeRange; +use xCAT::Utils; +use xCAT::Client; +use Cwd; +use strict; - -sub usage { - print basename($0)." usage:\n"; - print " ".basename($0)." [-o|--osver] [-p|--profile] [-a|--arch] [-O|--osimage] [-c|--console] \n" -} - - - -my $OSVER; -my $PROFILE; -my $ARCH; -my $CONSOLE; -my $OSIMAGE; - -Getopt::Long::Configure("bundling"); -unless (GetOptions( - 'o|osver=s' => \$OSVER, - 'p|profile=s' => \$PROFILE, - 'a|arch=s' => \$ARCH, - 'O|osimage=s' => \$OSIMAGE, - 'c|console' => \$CONSOLE - )) { - usage; - exit 1; -} -my $arraysize=@ARGV; -if ($arraysize > 1) { - print "noderange invalid\n"; - usage; - exit 1; -} -if ($arraysize == 0) { - print "noderange not supplied\n"; - usage; - exit 1; -} - -my $noderange=@ARGV[0]; -my $rc=0; -my %pnhash; -my @allnodes; -#use Data::Dumper; - -# check and complain about the invalid combination of the options, -# called when -O is specified or nodetype.provmethod=, -# ignore -o,-p and -a options and prompt a warning message -sub checkoption{ - my $optstring=shift; - if($OSVER) {print 'warning: "'.$optstring.'" specified, "[-o|--osver] '.$OSVER."\" ignored\n"}; - if($PROFILE) {print 'warning: "'.$optstring.'" specified, "[-p|--profile] '.$PROFILE."\" ignored\n"}; - if($ARCH) {print 'warning: "'.$optstring.'" specified, "[-a|--arch] '.$OSVER."\" ignored\n"}; -} - - -@allnodes=noderange($noderange); -if($OSIMAGE){ - -# -O|--osimage is specified, ignore any -a,-p,-o options, -# call "nodeset ... osimage= ..." to set the boot state of the noderange to the specified osimage, -# "nodeset" will handle the updating of node attributes such as os,arch,profile,provmethod - - &checkoption("[-O|--osimage] $OSIMAGE"); - $rc=system("nodeset $noderange osimage=$OSIMAGE"); - if ($rc) { - xCAT::MsgUtils->message("E","nodeset failure"); - exit 1; - }; -}else +# build a request to go the rinstall plugin +my $bname = basename($0); +my $cmdref; +$cmdref->{command}->[0] = $bname; +$cmdref->{cwd}->[0] = cwd(); +# allows our plugins to get the stdin of the cmd that invoked the plugin +my $data; +if ( (($^O =~ /^linux/i) && ($ENV{'SHELL'} =~ /\/ksh$/)) || !defined($ENV{'TERM'}) ) { - -# no osimage specified, update the node attributes specified by -a,-p,-o options thru "nodech", -# then set the boot state of each node based on the nodetype.provmethod: -# 1) if nodetype.provmethod = , ignore any -p,-o,-a option, then call "nodeset ... osimage" -# 2) if nodetype.provmethod = [install/netboot/statelite], update the node attributes specified by -a,-p,-o options thru "nodech", call "nodeset ... [install/netboot/statelite]" -# 3) if nodetype.provmethod is not set, use 'install' as the default value - -# group the nodes according to the nodetype.provmethod - - foreach(@allnodes){ - my $tab=xCAT::Table->new("nodetype"); - my $nthash=$tab->getNodeAttribs($_,['provmethod']); - $tab->close(); - if(defined($nthash) and defined($nthash->{'provmethod'})) - { - push(@{$pnhash{$nthash->{'provmethod'}}},$_); - } - else - { - #if nodetype.provmethod is not specified, - push(@{$pnhash{'install'}},$_); - } - } - - - foreach my $key (keys %pnhash) - { - my $rclocal=0; - my $nodes=join(',',@{$pnhash{$key}}); - if($key =~ /^(install|netboot|statelite)$/) - { - - # nodetype.provmethod = [install|netboot|statelite] - my $nodechline = ""; - if ($OSVER) { - $nodechline = "nodetype.os=$OSVER"; - } - if ($PROFILE) { - $nodechline .= " nodetype.profile=$PROFILE"; - } - if ($ARCH) { - $nodechline .= " nodetype.arch=$ARCH"; - } - if ($nodechline) { - $rclocal=system("nodech $nodes $nodechline"); - if ($rclocal) { - print "nodech failure\n"; - $rc=$rclocal; - } - } - - unless($rc){ - $rclocal=system("nodeset $nodes $key"); - if ($rclocal) { - print "nodeset $nodes failure\n"; - $rc=$rclocal; - } - } - } - else - { - - # nodetype.provmethod = - &checkoption("nodetype.provmethod=$key"); - $rclocal=system("nodeset $nodes osimage"); - if ($rclocal) { - print "nodeset $nodes failure\n"; - $rc=$rclocal; - } - } - - } + my $rin=""; + my $rout; + vec($rin,fileno(STDIN),1)=1; + my $nfound=select($rout=$rin,"","",1); + if ($nfound) + { + while ( ) { $data.=$_; } + $cmdref->{stdin}->[0]=$data; + } } - -if($rc){ - xCAT::MsgUtils->message("E","nodeset failure"); - exit 1; +else +{ + if (-p STDIN) { + while ( ) { $data.=$_; } + $cmdref->{stdin}->[0]=$data; + } } +my $arg; +my @tmpargv = @ARGV; +# first +$arg=shift(@ARGV); +# first 1st non-hyphen arg is the noderange +while ($arg =~ /^-/) { + push (@{$cmdref->{arg}}, $arg); + $arg=shift(@ARGV); +} +$cmdref->{noderange}->[0]=$arg; +push (@{$cmdref->{arg}}, @ARGV); -# call "rsetboot" to set the boot order of the nodehm.mgt=ipmi nodes,for others, assume user has set the correct boot order before "rinstall" -system("rsetboot $noderange net"); +my $noderange=$cmdref->{noderange}->[0]; # save the noderange -# call "rpower" to start the node provision process -$rc=system("rpower $noderange boot"); -if ($rc) { - xCAT::MsgUtils->message("E","rpower failure"); - exit 1; -}; +# ok call Client to run the plugin rinstall.pm +xCAT::Client::submit_request($cmdref,\&xCAT::Client::handle_response); +if ($xCAT::Client::EXITCODE == 0) # no errors +{ + my $startconsole=$cmdref->{startconsole}->[0]; + # if startconsole requested ( -c flag) for rinstall always for winstall + # This is set in the rinstall plugin + if ($startconsole == 1) { + if (basename($0) =~ /rinstall/) { -if (basename($0) =~ /rinstall/) { - -# for rinstall, the -c|--console option can provide the remote console for only 1 node - if ($CONSOLE) { - if(scalar @allnodes ne 1){ - xCAT::MsgUtils->message("E","rinstall [-c|--console] will only work if there is only one node in the noderange. See winstall(8) for consoles on multiple systems"); - exit 1; - } exec("rcons $noderange"); } -} elsif (basename($0) =~ /winstall/) { -# winstall can commence a wcons command to the noderange for monitoring the provision cycle + elsif (basename($0) =~ /winstall/) { + # winstall can commence a wcons command to the noderange for monitoring the provision cycle - exec("wcons $noderange"); + exec("wcons $noderange"); + } + } } +exit $xCAT::Client::EXITCODE;