From be9f1657968de0a5020198a0b46ea52c8d248071 Mon Sep 17 00:00:00 2001 From: lissav Date: Thu, 28 Feb 2013 20:35:42 +0000 Subject: [PATCH] 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@15301 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- perl-xCAT/xCAT/DSHCLI.pm | 76 +++++++++++++++++++++++++++------------- 1 file changed, 52 insertions(+), 24 deletions(-) diff --git a/perl-xCAT/xCAT/DSHCLI.pm b/perl-xCAT/xCAT/DSHCLI.pm index 0ab10d35f..b94294c07 100644 --- a/perl-xCAT/xCAT/DSHCLI.pm +++ b/perl-xCAT/xCAT/DSHCLI.pm @@ -592,6 +592,7 @@ sub _execute_dsh xCAT::MsgUtils->message("D", $rsp, $::CALLBACK); $rsp = {}; push @{$rsp->{error}}, @{$error_buffers{$user_target}}; + $rsp->{NoErrorPrefix} = 1; xCAT::MsgUtils->message("E", $rsp, $::CALLBACK,0); } } @@ -607,6 +608,7 @@ sub _execute_dsh xCAT::MsgUtils->message("D", $rsp, $::CALLBACK); $rsp = {}; push @{$rsp->{error}}, @{$error_buffers{$user_target}}; + $rsp->{NoErrorPrefix} = 1; xCAT::MsgUtils->message("E", $rsp, $::CALLBACK,0); } @@ -815,7 +817,7 @@ sub fork_fanout_dcp my @dcp_command; my $rsyncfile; - if (!$$target_properties{'localhost'}) + if (!$$target_properties{'localhost'}) # this is to a remote host { my $target_type = $$target_properties{'type'}; @@ -869,21 +871,25 @@ sub fork_fanout_dcp my $localhost=0; # this is from the MN to another node @dcp_command = $remoteshell->remote_copy_command(\%rcp_config, $remote_copy); + # add sudo for non-root users + if ($$options{'sudo'}) { + unshift (@dcp_command,'sudo'); + } } else # this is the local host ( running on the Management Node) { if ($$options{'destDir_srcFile'}{$user_target}) { - my $target_type = $$target_properties{'type'}; + my $target_type = $$target_properties{'type'}; - my %rcp_config = (); + my %rcp_config = (); - my $remote_copy; - my $rsh_extension = 'RSH'; + my $remote_copy; + my $rsh_extension = 'RSH'; - if ($target_type eq 'node') - { + if ($target_type eq 'node') + { $remote_copy = $$options{'node-rcp'}{$$target_properties{'context'}} || $$target_properties{'remote-copy'}; @@ -891,10 +897,10 @@ sub fork_fanout_dcp ($remote_copy =~ /\/rsync$/) && ($rsh_extension = 'RSYNC'); $rcp_config{'options'} = $$options{'node-options'}{$$target_properties{'context'}}; - } + } - $rcp_config{'preserve'} = $$options{'preserve'}; - $rcp_config{'recursive'} = $$options{'recursive'}; + $rcp_config{'preserve'} = $$options{'preserve'}; + $rcp_config{'recursive'} = $$options{'recursive'}; $rcp_config{'src-file'} = $$options{'source'}; @@ -905,20 +911,19 @@ sub fork_fanout_dcp $rcp_config{'destDir_srcFile'} = $$options{'destDir_srcFile'}{$user_target}; - #eval "require RemoteShell::$rsh_extension"; - eval "require xCAT::$rsh_extension"; - my $remoteshell = "xCAT::$rsh_extension"; - # HERE: Build the dcp command based on the arguments - my $localhost=1; # this is on the MN to the MN - @dcp_command = + eval "require xCAT::$rsh_extension"; + my $remoteshell = "xCAT::$rsh_extension"; + # HERE: Build the dcp command based on the arguments + my $localhost=1; # this is on the MN to the MN + @dcp_command = $remoteshell->remote_copy_command(\%rcp_config, $remote_copy,$localhost); - } - else # just a copy not a sync - { + } + else # just a copy not a sync + { @dcp_command = ('/bin/cp', '-r', $$options{'source'}, $$options{'target'}); - } + } } my $rsp = {}; @@ -1034,6 +1039,28 @@ sub fork_fanout_dsh if ($$options{'environment'}) { + # if we are on a servicenode need to get the environment file + # from the SNsyncfiledir, not local + if (xCAT::Utils->isServiceNode()) { + my $newenvfile; + my $synfiledir = "/var/xcat/syncfiles"; #default + + # get the directory on the servicenode to and add to filepath + my @syndir= xCAT::TableUtils->get_site_attribute("SNsyncfiledir"); + if ($syndir[0]) + { + $synfiledir = $syndir[0]; + } + $newenvfile = $synfiledir; + $newenvfile .= $$options{'environment'}; + $$options{'environment'} = $newenvfile; + } + if (!(-e $$options{'environment'})) + { + my $rsp={}; + $rsp->{error}->[0] = "File $$options{'environment'} does not exist"; + xCAT::MsgUtils->message("E", $rsp, $::CALLBACK); + } push @dsh_command, "$$options{'pre-command'} . $$options{'environment'} ; $$options{'command'}$$options{'post-command'}"; } @@ -1163,13 +1190,13 @@ sub fork_fanout_dsh if ($$options{'execute'}) { # first build the scp command to copy the file to execute - # down to the node into /tmp/*.dsh + # down to the node into /tmp/*.dsh my $rsp = {}; $rsp->{data}->[0] = "TRACE: Execute option specified."; $dsh_trace && (xCAT::MsgUtils->message("I", $rsp, $::CALLBACK)); my %exe_rcp_config = (); - $tmp_cmd_file = POSIX::tmpnam . ".dsh"; + $tmp_cmd_file = POSIX::tmpnam . ".dsh"; my ($exe_cmd, @args) = @{$$options{'execute'}}; my $chmod_cmd = ""; @@ -4216,7 +4243,7 @@ sub usage_dcp { ### usage message my $usagemsg1 = " xdcp -h \n xdcp -q\n xdcp -V \n xdcp \n"; - my $usagemsg2 = " [-B bypass] [-c] [-f fanout] [-l user_ID]\n"; + my $usagemsg2 = " [-B bypass] [-c] [-f fanout] [-l user_ID] [--sudo]\n"; my $usagemsg3 = " [-m] [-o options] [-p] [-P] [-q] [-Q] [-r node_remote_copy]\n"; my $usagemsg4 = @@ -4325,7 +4352,8 @@ sub parse_and_run_dcp 'T|trace' => \$options{'trace'}, 'V|version' => \$options{'version'}, 'devicetype=s' => \$options{'devicetype'}, - 'nodestatus|nodestatus' => \$options{'nodestatus'}, + 'nodestatus|nodestatus' => \$options{'nodestatus'}, + 'sudo|sudo' => \$options{'sudo'}, 'X:s' => \$options{'ignore_env'} ) )