2008-05-19 19:05:54 +00:00
#!/usr/bin/env perl
2013-06-01 12:13:14 +00:00
# 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.
2008-05-19 19:05:54 +00:00
use strict;
2013-05-31 10:33:15 +00:00
BEGIN
{
$::XCATROOT =
$ENV{'XCATROOT'} ? $ENV{'XCATROOT'}
: -d '/opt/xcat' ? '/opt/xcat'
: '/usr';
}
use lib "$::XCATROOT/lib/perl";
2008-05-19 19:05:54 +00:00
use File::Basename;
2013-05-31 10:33:15 +00:00
use Getopt::Long;
2013-08-02 02:26:14 +00:00
use xCAT::MsgUtils;
2013-05-31 10:33:15 +00:00
use xCAT::Table;
use xCAT::NodeRange;
2013-08-02 02:26:14 +00:00
2008-05-19 19:05:54 +00:00
sub usage {
print basename($0)." usage:\n";
2013-05-31 10:33:15 +00:00
print " ".basename($0)." [-o|--osver] [-p|--profile] [-a|--arch] [-O|--osimage] [-c|--console] <noderange>\n"
2008-05-19 19:05:54 +00:00
}
2013-05-31 10:33:15 +00:00
2008-05-19 19:05:54 +00:00
my $OSVER;
my $PROFILE;
my $ARCH;
my $CONSOLE;
2013-05-31 10:33:15 +00:00
my $OSIMAGE;
Getopt::Long::Configure("bundling");
2008-05-19 19:05:54 +00:00
unless (GetOptions(
'o|osver=s' => \$OSVER,
'p|profile=s' => \$PROFILE,
'a|arch=s' => \$ARCH,
2013-05-31 10:33:15 +00:00
'O|osimage=s' => \$OSIMAGE,
2008-05-19 19:05:54 +00:00
'c|console' => \$CONSOLE
)) {
usage;
exit 1;
}
2010-04-26 17:53:32 +00:00
my $arraysize=@ARGV;
if ($arraysize > 1) {
print "noderange invalid\n";
usage;
exit 1;
}
if ($arraysize == 0) {
print "noderange not supplied\n";
usage;
exit 1;
}
2013-05-31 10:33:15 +00:00
2010-04-26 17:53:32 +00:00
my $noderange=@ARGV[0];
2013-05-31 10:33:15 +00:00
my $rc=0;
my %pnhash;
my @allnodes;
#use Data::Dumper;
2010-04-26 17:53:32 +00:00
2013-06-01 12:13:14 +00:00
# check and complain about the invalid combination of the options,
# called when -O is specified or nodetype.provmethod=<osimage>,
# ignore -o,-p and -a options and prompt a warning message
2013-05-31 10:33:15 +00:00
sub checkoption{
my $optstring=shift;
2013-06-01 12:13:14 +00:00
if($OSVER) {print 'warning: "'.$optstring.'" specified, "[-o|--osver] '.$OSVER."\" ignored\n"};
2013-05-31 10:33:15 +00:00
if($PROFILE) {print 'warning: "'.$optstring.'" specified, "[-p|--profile] '.$PROFILE."\" ignored\n"};
2013-06-01 12:13:14 +00:00
if($ARCH) {print 'warning: "'.$optstring.'" specified, "[-a|--arch] '.$OSVER."\" ignored\n"};
2008-05-19 19:05:54 +00:00
}
2013-05-31 10:33:15 +00:00
if($OSIMAGE){
2013-06-01 12:13:14 +00:00
# -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
2013-05-31 10:33:15 +00:00
&checkoption("[-O|--osimage] $OSIMAGE");
$rc=system("nodeset $noderange osimage=$OSIMAGE");
2013-08-02 02:26:14 +00:00
if ($rc) {
xCAT::MsgUtils->message("E","nodeset failure");
exit 1;
};
2013-05-31 10:33:15 +00:00
}else
{
2013-06-01 12:13:14 +00:00
# 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 = <osimage>, 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]"
2013-06-06 03:14:34 +00:00
# 3) if nodetype.provmethod is not set, use 'install' as the default value
2013-06-01 12:13:14 +00:00
# group the nodes according to the nodetype.provmethod
2013-05-31 10:33:15 +00:00
@allnodes=noderange($noderange);
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
{
2013-06-06 03:14:34 +00:00
#if nodetype.provmethod is not specified,
push(@{$pnhash{'install'}},$_);
2013-05-31 10:33:15 +00:00
}
}
foreach my $key (keys %pnhash)
{
my $rclocal=0;
my $nodes=join(',',@{$pnhash{$key}});
if($key =~ /^(install|netboot|statelite)$/)
2013-06-01 12:13:14 +00:00
{
2013-06-06 03:14:34 +00:00
# nodetype.provmethod = [install|netboot|statelite]
2013-05-31 10:33:15 +00:00
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
{
2013-06-01 12:13:14 +00:00
2013-06-06 03:14:34 +00:00
# nodetype.provmethod = <osimage>
2013-05-31 10:33:15 +00:00
&checkoption("nodetype.provmethod=$key");
$rclocal=system("nodeset $nodes osimage");
if ($rclocal) {
print "nodeset $nodes failure\n";
$rc=$rclocal;
}
}
}
2008-05-19 19:05:54 +00:00
}
2013-05-31 10:33:15 +00:00
if($rc){
2013-08-02 02:26:14 +00:00
xCAT::MsgUtils->message("E","nodeset failure");
exit 1;
2008-05-19 19:05:54 +00:00
}
2013-05-31 10:33:15 +00:00
2013-06-06 03:14:34 +00:00
# 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");
2013-06-01 12:13:14 +00:00
# call "rpower" to start the node provision process
2008-05-19 19:05:54 +00:00
$rc=system("rpower $noderange boot");
2013-08-02 02:26:14 +00:00
if ($rc) {
xCAT::MsgUtils->message("E","rpower failure");
exit 1;
};
2013-05-31 10:33:15 +00:00
2013-06-01 12:13:14 +00:00
2008-05-19 19:05:54 +00:00
if (basename($0) =~ /rinstall/) {
2013-06-01 12:13:14 +00:00
# for rinstall, the -c|--console option can provide the remote console for only 1 node
2008-05-19 19:05:54 +00:00
if ($CONSOLE) {
2013-05-31 10:33:15 +00:00
if(scalar @allnodes ne 1){
2013-08-02 02:26:14 +00:00
xCAT::MsgUtils->message("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;
2013-05-31 10:33:15 +00:00
}
2008-05-19 19:05:54 +00:00
exec("rcons $noderange");
}
} elsif (basename($0) =~ /winstall/) {
2013-06-01 12:13:14 +00:00
# winstall can commence a wcons command to the noderange for monitoring the provision cycle
2008-05-19 19:05:54 +00:00
exec("wcons $noderange");
}