Fix 3052 and add sudo for dcp and fix 3380

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/branches/2.8@15302 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
lissav 2013-02-28 20:37:19 +00:00
parent be9f165796
commit 102c33be71

View File

@ -101,6 +101,10 @@ sub preprocess_request
my @cmd = split(/ /, $value); # split off args, if any
$::dshexecute = $cmd[0]; # This is the executable file
}
if ($var eq "DSH_ENVIRONMENT") # from xdsh -E flag
{
$::dshenvfile = $value; # Name of file with env variables
}
}
# if xdcp need to make sure request has full path to input files
if ($command eq "xdcp") {
@ -154,8 +158,9 @@ sub preprocess_request
if (@snodes) # service nodes
{
# if xdcp and not pull function or xdsh -e
if ((($command eq "xdcp") && ($::dcppull == 0)) or ($::dshexecute))
# if xdcp and not pull function or xdsh -e or xdsh -E
if ((($command eq "xdcp") && ($::dcppull == 0)) or (($::dshexecute)
or ($::dshenvfile)))
{
# get the directory on the servicenode to put the files in
@ -181,7 +186,7 @@ sub preprocess_request
{
return;
}
} else { # xdsh -e
} else { # xdsh -e or -E
$rc =
&process_servicenodes_xdsh($req, $cb, $sub_req, \@snodes,
\@snoderange, $synfiledir);
@ -306,6 +311,7 @@ sub parse_xdcp_cmd
'T|trace' => \$options{'trace'},
'V|version' => \$options{'version'},
'nodestatus|nodestatus' => \$options{'nodestatus'},
'sudo|sudo' => \$options{'sudo'},
'X:s' => \$options{'ignore_env'}
)
)
@ -704,10 +710,12 @@ sub process_servicenodes_xdcp
#-------------------------------------------------------
=head3 process_servicenodes_xdsh
Build the xdsh command to send the -e file
The executable must be copied into /var/xcat/syncfiles, and then
the command modified so that the xdsh running on the SN will cp the file
from /var/xcat/syncfiles to the compute node /tmp directory and run it.
Build the xdsh command to sync the -e file or the -E file
to the servicenodes.
The executable (-e) or the environment file (-E)
must be copied into /var/xcat/syncfiles (SNsyncfiledir attribute), and then
the command modified so that the xdsh running on the SN will use the file
from /var/xcat/syncfiles (default) for the compute nodes.
Return an array of servicenodes that do not have errors
Returns error code:
if = 0, good return continue to process the
@ -732,30 +740,52 @@ sub process_servicenodes_xdsh
$::RUNCMD_RC = 0;
my $cmd = $req->{command}->[0];
# if xdsh -e <executable> command, service nodes first need
# to be rsync with the executable file to the $synfiledir
if ($::dshexecute)
# if xdsh -e <executable> command or xdsh -E <environment file>
# service nodes first need
# to be rsync with the executable or environment file to the $synfiledir
if (($::dshexecute) or ($::dshenvfile))
{
if (!-f $::dshexecute)
if (defined($::dshexecute) && (!-f $::dshexecute))
{ # -e file does not exist, quit
my $rsp = {};
$rsp->{error}->[0] = "File:$::dshexecute does not exist.";
xCAT::MsgUtils->message("E", $rsp, $callback, 1);
return (1); # process no service nodes
}
if (defined($::dshenvfile) && (!-f $::dshenvfile))
{ # -E file does not exist, quit
my $rsp = {};
$rsp->{error}->[0] = "File:$::dshenvfile does not exist.";
xCAT::MsgUtils->message("E", $rsp, $callback, 1);
return (1); # process no service nodes
}
# xdcp the executable from the xdsh -e to the service node first
# xdcp (-F) the executable from the xdsh -e and/or
# xdcp (-F) the environment file from the xdsh -E
# to the service node
# change noderange to the service nodes
# sync to each SN and check for error
# if error do not add to good_SN array, add to bad_SN
# /.../excutable -> $syncdir/..../executable
# /.../envfile -> $syncdir/...../envfile
# build a tmp syncfile with
# $::dshexecute -> $synfiledir . $::dshexecute
# $::dshenvfile -> $synfiledir . $::dshenvfile
my $tmpsyncfile = POSIX::tmpnam . ".dsh";
my $destination=$synfiledir . $::dshexecute;
# if -E option
my $envfile;
my $execfile;
open(TMPFILE, "> $tmpsyncfile")
or die "can not open file $tmpsyncfile";
print TMPFILE "$::dshexecute -> $destination\n";
if (defined($::dshenvfile)) {
$envfile=$synfiledir . $::dshenvfile;
print TMPFILE "$::dshenvfile -> $envfile\n";
}
if (defined($::dshexecute)) {
$execfile=$synfiledir . $::dshexecute;
print TMPFILE "$::dshexecute -> $execfile\n";
}
close TMPFILE;
chmod 0755, $tmpsyncfile;
@ -815,7 +845,7 @@ sub process_servicenodes_xdsh
# remove the tmp syncfile
`/bin/rm $tmpsyncfile`;
} # end xdsh -E
} # end xdsh -e or -E
# report bad service nodes]
if (@::bad_SN)