diff --git a/xCAT-client/bin/rinstall b/xCAT-client/bin/rinstall index eeaa87b86..9b793bbe1 100755 --- a/xCAT-client/bin/rinstall +++ b/xCAT-client/bin/rinstall @@ -1,20 +1,48 @@ #!/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] +# to make ease of node OS provision + +# To use this, sym link your cmd name to this script. + use strict; -use Getopt::Long; + +BEGIN +{ + $::XCATROOT = + $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} + : -d '/opt/xcat' ? '/opt/xcat' + : '/usr'; +} + +use lib "$::XCATROOT/lib/perl"; use File::Basename; +use Getopt::Long; +use xCAT::MsgUtils; +use xCAT::Table; +use xCAT::NodeRange; + + sub usage { print basename($0)." usage:\n"; - print " ".basename($0)." [-o|--osver [-p|--profile] [-a|--arch] [-c|--console] \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; @@ -31,32 +59,145 @@ if ($arraysize == 0) { usage; exit 1; } + my $noderange=@ARGV[0]; +my $rc=0; +my %pnhash; +my @allnodes; +#use Data::Dumper; -my $nodechline = ""; -if ($OSVER) { - $nodechline = "nodetype.os=$OSVER"; -} -if ($PROFILE) { - $nodechline .= " nodetype.profile=$PROFILE"; -} -if ($ARCH) { - $nodechline .= " nodetype.arch=$ARCH"; +# 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"}; } -my $rc; -if ($nodechline) { - $rc=system("nodech $noderange $nodechline"); + +@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 +{ + +# 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=$key"); + if ($rclocal) { + print "nodeset $nodes failure\n"; + $rc=$rclocal; + } + } + + } } -if ($rc) { die "nodech failure" }; -$rc=system("nodeset $noderange install"); -if ($rc) { die "nodeset failure" }; + +if($rc){ + xCAT::MsgUtils->message("E","nodeset failure"); + exit 1; +} + +# 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"); + +# call "rpower" to start the node provision process $rc=system("rpower $noderange boot"); -if ($rc) { die "rpower failure" }; +if ($rc) { + xCAT::MsgUtils->message("E","rpower failure"); + exit 1; +}; + + 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 + exec("wcons $noderange"); } diff --git a/xCAT-client/pods/man8/rinstall.8.pod b/xCAT-client/pods/man8/rinstall.8.pod index 7c0f7cd3e..1988ace26 100644 --- a/xCAT-client/pods/man8/rinstall.8.pod +++ b/xCAT-client/pods/man8/rinstall.8.pod @@ -1,15 +1,18 @@ =head1 Name -B - Begin installation on a noderange +B - Begin OS provision on a noderange =head1 B -B [I<-o>|I<--osver>] [I<-p>|I<--profile>] [I<-a>|I<--arch>] [I<-c>|I<--console>] [I] +B [I<-o>|I<--osver>] [I<-p>|I<--profile>] [I<-a>|I<--arch>] [I<-O>|I<--osimage>] [I<-c>|I<--console>] [I] =head1 B -B is a convience command that will change tables as requested for operating system version, profile, and architecture, call nodeset to modify the network boot configuration, and rpower to begin a boot cycle. If -c is specified, it will then become the -text console of the node. If wanting consoles on multiple nodes with a similar command, see L. +B is a convience command that will change tables as requested for operating system version, profile, and architecture, call B to modify the network boot configuration, call B net to set the next boot over network (only support nodes with "nodetype.mgt=ipmi", for other nodes, make sure the correct boot order has been set before B), and B to begin a boot cycle. + +If [I<-O>|I<--osimage>] is specified or nodetype.provmethod=I is set, provision the noderange with the osimage specified/configured, ignore the table change options if specified. + +If -c is specified, it will then become the text console of the node. If wanting consoles on multiple nodes with a similar command, see L. =head1 B @@ -17,21 +20,24 @@ text console of the node. If wanting consoles on multiple nodes with a similar =item B<-o>|B<--osver> -Specifies which os version to install. If unspecified, the current table values are used. +Specifies which os version to provision. If unspecified, the current table values are used. Will be ignored if [I<-O>|I<--osimage>] is specified or nodetype.provmethod=I. =item B<-p>|B<--profile> -Specifies what profile should be used of the operating system. If not specified the tables are used as is. +Specifies what profile should be used of the operating system. If not specified the tables are used as is. Will be ignored if [I<-O>|I<--osimage>] is specified or nodetype.provmethod=I. =item B<-a>|B<--arch> -Specifies what architecture of the OS to install. Typically this is unneeded, but if provisioning betweer x86_64 and x86 frequently, this may be a useful flag. +Specifies what architecture of the OS to provision. Typically this is unneeded, but if provisioning betweer x86_64 and x86 frequently, this may be a useful flag. Will be ignored if [I<-O>|I<--osimage>] is specified or nodetype.provmethod=I. + +=item B<-O>|B<--osimage> + +Specifies the osimage to provision. =item B<-c>|B<--console> - -Requests that rinstall become rcons once the install commences. This will only work if there is only one node in the noderange. See L for consoles on multiple systems. +Requests that rinstall become rcons once the provision commences. This will only work if there is only one node in the noderange. See L for consoles on multiple systems. =back @@ -40,21 +46,21 @@ Requests that rinstall become rcons once the install commences. This will only B I -Install nodes 1 through 20, using configuration as is from tables. +Provison nodes 1 through 20, using configuration as is from tables. B -o rhels5.1 -p compute I -Install nodes 1 through 20, forcing rhels5.1 and compute profile. +Provision nodes 1 through 20, forcing rhels5.1 and compute profile. + +B -O rhels6.4-ppc64-netboot-compute I + +Provision nodes 1 through 20 with the osimage rhels6.4-ppc64-netboot-compute. B -c I -Install node1 and start a console to monitor the process +Provisoon node1 and start a console to monitor the process. -=head1 B - -Jarrod B Johnson - =head1 B B L, L, L