xcat-core/xCAT-client/bin/updatenode

181 lines
4.6 KiB
Plaintext
Raw Normal View History

#!/usr/bin/env perl
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
BEGIN { $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : -d '/opt/xcat' ? '/opt/xcat' : '/usr'; }
use Getopt::Long;
use lib "$::XCATROOT/lib/perl";
use Cwd;
use File::Basename;
use xCAT::Client;
use xCAT::MsgUtils;
use xCAT::Usage;
use strict;
sub updatenode_usage
{
my $usage_string = xCAT::Usage->getUsage("updatenode");
print "$usage_string\n";
}
my $bname = basename($0);
my $cmdref;
$cmdref->{command}->[0] = $bname;
$cmdref->{cwd}->[0] = cwd();
my $data;
# allows our plugins to get the stdin of the cmd that invoked the plugin
if ( (($^O =~ /^linux/i) && ($ENV{'SHELL'} =~ /\/ksh$/)) || !defined($ENV{'TERM'}) )
{
my $rin="";
my $rout;
vec($rin,fileno(STDIN),1)=1;
my $nfound=select($rout=$rin,"","",1);
if ($nfound)
{
while ( <STDIN> ) { $data.=$_; }
$cmdref->{stdin}->[0]=$data;
}
}
else
{
if (-p STDIN) {
while ( <STDIN> ) { $data.=$_; }
$cmdref->{stdin}->[0]=$data;
}
}
Getopt::Long::Configure("posix_default");
Getopt::Long::Configure("no_gnu_compat");
Getopt::Long::Configure("bundling");
my $tmp=" ".join(' ', @ARGV);
if (!($tmp =~ / (--help|-h|-v|--version)/)) {
my $arg=shift(@ARGV);
# Set the noderange
if ($arg !~ /^-/) {
my @tempnr = ();
foreach my $nr (split(/,/, $arg)) {
if ($nr =~ /^\^(.*)$/) {
my $nrf = $1;
if ($nrf !~ /^\//) { #relative path
$nrf = Cwd::abs_path($nrf);
}
$nrf = "\^" . $nrf;
push @tempnr, $nrf;
} else {
push @tempnr, $nr;
}
}
$arg = join(',',@tempnr);
$cmdref->{noderange}->[0]=$arg;
} else {
&updatenode_usage();
print "The noderange should be the first argument.\n";
exit 1;
}
}
push (@{$cmdref->{arg}}, @ARGV);
# check the syntax
if (
!GetOptions(
'A|updateallsw' => \$::ALLSW,
'c|cmdlineonly' => \$::CMDLINE,
'd=s' => \$::ALTSRC,
'h|help' => \$::HELP,
'v|version' => \$::VERSION,
'V|verbose' => \$::VERBOSE,
'F|sync' => \$::FILESYNC,
'f|snsync' => \$::SNFILESYNC,
'l|user:s' => \$::USER,
'S|sw' => \$::SWMAINTENANCE,
's|sn' => \$::SETSERVER,
'P|scripts:s' => \$::RERUNPS,
'k|security' => \$::SECURITY,
'o|os:s' => \$::OS,
)
) {
&updatenode_usage();
exit 1;
}
if ($::HELP)
{
&updatenode_usage();
exit 0;
}
# disable -l option for now
if ($::USER)
{
my $msg = "-l option is not currently supported.";
xCAT::MsgUtils->message("E", $msg);
exit 1;
}
# display the version statement if -v or --verison is specified
if ($::VERSION)
{
my $version = xCAT::Utils->Version();
print "$version\n";
exit 0;
}
if (($::FILESYNC) && ($::SNFILESYNC)){ # only one
my $msg = "Choose either -f to sync the service nodes, or -F to sync the nodes not both.";
xCAT::MsgUtils->message("E", $msg);
exit 1;
}
# determine who is running the command on the client and who we will run as
# on the node
my $current_userid = getpwuid($>);
$ENV{DSH_FROM_USERID} = $current_userid;
my $to_userid;
if ($::USER) # entered -l
{
$to_userid = $::USER;
}
else
{
$to_userid = $current_userid;
}
$ENV{DSH_TO_USERID} = $to_userid;
# if -k then we have to get the password
if ($::SECURITY) {
my $msg;
if (!($ENV{'DSH_REMOTE_PASSWORD'}))
{ # if not already set
# prompt for the password for the userid on the node that will be setup
my $userpw;
$msg =
"Enter the password for the userid: $to_userid on the node where the ssh keys \nwill be updated:\n";
xCAT::MsgUtils->message("I", $msg);
system("stty -echo"); # turn off keyboard
chop($userpw = <STDIN>);
system("stty echo"); # turn on keyboard
if ($userpw eq "")
{ # did not enter a password
$msg = "Did not enter a password will abort the security update.";
xCAT::MsgUtils->message("E", $msg);
exit 2;
}
else
{ # password entered pass to the server
$ENV{DSH_REMOTE_PASSWORD} = $userpw;
}
}
}
foreach (keys %ENV) {
if (/^DSH_/ || /^XCAT/) {
push @{$cmdref->{environment}}, "$_=$ENV{$_}";
}
}
xCAT::Client::submit_request($cmdref,\&xCAT::Client::handle_response);
exit $xCAT::Client::EXITCODE;