#!/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 ( ) { $data.=$_; } $cmdref->{stdin}->[0]=$data; } } else { if (-p STDIN) { while ( ) { $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, 'fanout=i' => \$::fanout, ) ) { &updatenode_usage(); exit 1; } if ($::HELP) { &updatenode_usage(); exit 0; } if (($::USER) && ($::SECURITY)) { my $msg = "-l option is not allowed with -k option."; xCAT::MsgUtils->message("E", $msg); exit 1; } if (($::USER) && ($::SNFILESYNC)) { my $msg = "-l option is not allowed with -f options."; 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 = ); 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;