mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-30 10:52:31 +00:00 
			
		
		
		
	add support for syncfiles with scp (#5123)
* add support for syncfiles with scp * refine logic of EXECTUTE support message non rsync filesync * refine syncfiles * add startsyncfile script for cumulus * refine format, fix updatenode without options causes command to crash #5142
This commit is contained in:
		| @@ -19,7 +19,7 @@ SYNOPSIS | ||||
| ******** | ||||
|  | ||||
|  | ||||
| \ **updatenode**\  \ *noderange*\  [\ **-V | -**\ **-verbose**\ ] [\ **-F | -**\ **-sync**\ ] [\ **-f | -**\ **-snsync**\ ] [\ **-S | -**\ **-sw**\ ]  [\ **-l**\   \ *userID*\ ]  [\ **-P | -**\ **-scripts**\  [\ *script1,script2...*\ ]] [\ **-s | -**\ **-sn**\ ] [\ **-A | -**\ **-updateallsw**\ ] [\ **-c | -**\ **-cmdlineonly**\ ] [\ **-d**\  \ *alt_source_dir*\ ] [\ **-**\ **-fanout**\ =\ *fanout_value*\ ] [\ **-t**\  \ *timeout*\ } [\ *attr=val*\  [\ *attr=val...*\ ]] [\ **-n | -**\ **-noverify**\ ] | ||||
| \ **updatenode**\  \ *noderange*\  [\ **-V | -**\ **-verbose**\ ] [\ **-F | -**\ **-sync**\ ] [\ **-f | -**\ **-snsync**\ ] [\ **-r | -**\ **-node-rcp**\  [\ *full_path_to_remote_copy_command*\ ]]  [\ **-S | -**\ **-sw**\ ]  [\ **-l**\   \ *userID*\ ]  [\ **-P | -**\ **-scripts**\  [\ *script1,script2...*\ ]] [\ **-s | -**\ **-sn**\ ] [\ **-A | -**\ **-updateallsw**\ ] [\ **-c | -**\ **-cmdlineonly**\ ] [\ **-d**\  \ *alt_source_dir*\ ] [\ **-**\ **-fanout**\ =\ *fanout_value*\ ] [\ **-t**\  \ *timeout*\ } [\ *attr=val*\  [\ *attr=val...*\ ]] [\ **-n | -**\ **-noverify**\ ] | ||||
|  | ||||
| \ **updatenode**\  \ **noderange**\  [\ **-k | -**\ **-security**\ ] [\ **-t**\  \ *timeout*\ ] | ||||
|  | ||||
| @@ -382,7 +382,7 @@ OPTIONS | ||||
| \ **-F|-**\ **-sync**\  | ||||
|   | ||||
|  Specifies that file synchronization should be | ||||
|  performed on the nodes.  rsync and ssh must | ||||
|  performed on the nodes.  rsync/scp and ssh must | ||||
|  be installed and configured on the nodes.  | ||||
|  The function is not supported for NFS-based statelite installations. | ||||
|  For NFS-based statelite installations to sync files, you should use the | ||||
| @@ -396,7 +396,7 @@ OPTIONS | ||||
|  Specifies that file synchronization should be | ||||
|  performed to the service nodes that service the | ||||
|  nodes in the noderange. This updates the service | ||||
|  nodes with the data to sync to the nodes. rsync and ssh must | ||||
|  nodes with the data to sync to the nodes. rsync/scp and ssh must | ||||
|  be installed and configured on the service nodes. | ||||
|  For hierarchy, this optionally can  be done before syncing the files | ||||
|  to the nodes with the -F flag.  If the -f flag is not used, then | ||||
| @@ -412,6 +412,12 @@ OPTIONS | ||||
|   | ||||
|  | ||||
|  | ||||
| [\ **-r | -**\ **-node-rcp**\  [\ *full_path_to_remote_copy_command*\ ]] | ||||
|   | ||||
|  Specifies  the  full  path of the remote copy command used for syncing files to node targets, such as "/usr/bin/rsync" or "/usr/bin/scp". If not specified, rsync will be used by default. | ||||
|   | ||||
|  | ||||
|  | ||||
| \ **-g|-**\ **-genmypost**\  | ||||
|   | ||||
|  Will generate a new mypostscript file for the | ||||
|   | ||||
| @@ -22,6 +22,8 @@ use xCAT::MsgUtils; | ||||
| use xCAT::Utils; | ||||
| use xCAT::TableUtils; | ||||
| use xCAT::NodeRange; | ||||
| use xCAT::DSHCLI; | ||||
| use Data::Dumper; | ||||
| use lib '/opt/xcat/xdsh'; | ||||
| our @dsh_available_contexts = (); | ||||
| our @dsh_valid_contexts     = (); | ||||
| @@ -922,6 +924,7 @@ sub fork_fanout_dcp | ||||
|         $dsh_trace | ||||
|           && (xCAT::MsgUtils->message("I", $rsp, $::CALLBACK)); | ||||
|  | ||||
|  | ||||
|         my @process_info = | ||||
|           xCAT::DSHCore->fork_output($user_target, @dcp_command); | ||||
|         vec($$outfh_targets{'bitmap'}, fileno($process_info[1]), 1) = 1; | ||||
| @@ -1329,7 +1332,7 @@ sub fork_fanout_dsh | ||||
|         #print "Command=@dsh_command\n"; | ||||
|  | ||||
|         #@process_info = xCAT::DSHCore->fork_output($user_target, @dsh_command); | ||||
|         push(@commands, \@dsh_command);    #print Dumper(\@commands); | ||||
|         push(@commands, \@dsh_command);     | ||||
|         @process_info = xCAT::DSHCore->fork_output_for_commands($user_target, @commands); | ||||
|         if ($process_info[0] == -2) | ||||
|         { | ||||
| @@ -4531,15 +4534,6 @@ sub parse_and_run_dcp | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     # invalid to put the -F  with the -r flag | ||||
|     if ($options{'File'} && $options{'node-rcp'}) | ||||
|     { | ||||
|         my $rsp = {}; | ||||
|         $rsp->{error}->[0] = | ||||
| "If -F option is use, then -r is invalid. The command will always the rsync using ssh."; | ||||
|         xCAT::MsgUtils->message("E", $rsp, $::CALLBACK, 1); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     # invalid to put the -s  without the -F flag | ||||
|     if (!($options{'File'}) && $options{'rsyncSN'}) | ||||
| @@ -4566,22 +4560,31 @@ sub parse_and_run_dcp | ||||
|             } | ||||
|  | ||||
|         } | ||||
|         elsif ($^O eq 'linux') | ||||
|         elsif (($^O eq 'linux') and !$options{'node-rcp'}) | ||||
|         { | ||||
|             $options{'node-rcp'} = '/usr/bin/rsync'; | ||||
|         } | ||||
|     } | ||||
|     my $remotecopycommand = $options{'node-rcp'}; | ||||
|     if ($options{'node-rcp'} | ||||
|         && (!-f $options{'node-rcp'} || !-x $options{'node-rcp'})) | ||||
|     { | ||||
|         my $rsp = {}; | ||||
|         $rsp->{error}->[0] = | ||||
| "Remote command: $remotecopycommand does not exist or is not executable."; | ||||
|         xCAT::MsgUtils->message("E", $rsp, $::CALLBACK, 1); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     my $remotecopycommand = $options{'node-rcp'}; | ||||
|     if ($options{'node-rcp'}) { | ||||
|         if (!-f $options{'node-rcp'} || !-x $options{'node-rcp'}) | ||||
|         { | ||||
|              my $rsp = {}; | ||||
|              $rsp->{error}->[0] = | ||||
|                  "Remote command: $remotecopycommand does not exist or is not executable."; | ||||
|              xCAT::MsgUtils->message("E", $rsp, $::CALLBACK, 1); | ||||
|              return; | ||||
|         } | ||||
|      | ||||
|         if ($remotecopycommand !~ /\/(rcp|scp|rsync)$/){ | ||||
|              my $rsp = {}; | ||||
|              $rsp->{error}->[0] = | ||||
|                  "Remote command: $remotecopycommand is invalid, the support remote commands: scp,rcp,rsync."; | ||||
|              xCAT::MsgUtils->message("E", $rsp, $::CALLBACK, 1); | ||||
|              return; | ||||
|         } | ||||
|     } | ||||
|     # | ||||
|     # build list of nodes | ||||
|     my @nodelist; | ||||
| @@ -4673,6 +4676,7 @@ sub parse_and_run_dcp | ||||
|         { | ||||
|             $::SYNCSN = 1; | ||||
|         } | ||||
|          | ||||
|  | ||||
|         # the parsing of the file will fill in an array of postscripts | ||||
|         # need to be run if the associated file is updated | ||||
| @@ -4726,6 +4730,7 @@ sub parse_and_run_dcp | ||||
|             my $rsp = {}; | ||||
|             $rsp->{error}->[0] = "Error parsing the rsync file:$syncfile."; | ||||
|             xCAT::MsgUtils->message("E", $rsp, $::CALLBACK, 1); | ||||
|             $::FAILED_NODES=scalar @nodelist; | ||||
|             return; | ||||
|         } | ||||
|  | ||||
| @@ -5067,6 +5072,7 @@ sub parse_rsync_input_file_on_MN | ||||
|     my $addappendscript = 0; | ||||
|     open(INPUTFILE, "< $input_file") || die "File $input_file does not exist\n"; | ||||
|  | ||||
|  | ||||
|     while (my $line = <INPUTFILE>) | ||||
|     { | ||||
|         chomp $line; | ||||
| @@ -5284,6 +5290,15 @@ sub parse_rsync_input_file_on_MN | ||||
|     { | ||||
|         $$options{'nodes'} = join ',', keys %{ $$options{'destDir_srcFile'} }; | ||||
|     } | ||||
|  | ||||
|     my $remotecopycommand=$$options{'node-rcp'}; | ||||
|     if($remotecopycommand !~ /\/rsync$/ and @::postscripts){ | ||||
|         my $rsp = {}; | ||||
|         $rsp->{error}->[0] ="key word 'EXECUTE' is unavailable when the remote copy command specified by '-r|--node-rcp' is $remotecopycommand. Does 'EXECUTEALWAYS' work for you?"; | ||||
|         xCAT::MsgUtils->message("E", $rsp, $::CALLBACK, 1);          | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| @@ -5780,6 +5795,15 @@ sub parse_rsync_input_file_on_SN | ||||
|     { | ||||
|         $$options{'nodes'} = join ',', keys %{ $$options{'destDir_srcFile'} }; | ||||
|     } | ||||
|  | ||||
|     my $remotecopycommand=$$options{'node-rcp'}; | ||||
|     if($remotecopycommand !~ /\/rsync$/ and @::postscripts){ | ||||
|         my $rsp = {}; | ||||
|         $rsp->{error}->[0] ="key word 'EXECUTE' is unavailable when the remote copy command specified by '-r|--node-rcp' is $remotecopycommand. Does 'EXECUTEALWAYS' work for you?"; | ||||
|         xCAT::MsgUtils->message("E", $rsp, $::CALLBACK, 1);          | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -5,7 +5,6 @@ package xCAT::SSH; | ||||
|  | ||||
| # cannot use strict | ||||
| use base xCAT::DSHRemoteShell; | ||||
|  | ||||
| # Determine if OS is AIX or Linux | ||||
| # Configure standard locations of commands based on OS | ||||
|  | ||||
| @@ -136,33 +135,87 @@ sub remote_copy_command { | ||||
|     my @src_files = (); | ||||
|     my @dest_file = (); | ||||
|  | ||||
|     my @src_file_list = split $::__DCP_DELIM, $$config{'src-file'}; | ||||
|     if ($$config{'destDir_srcFile'}){ | ||||
|         my $dest_dir_list = join ' ', keys %{ $$config{'destDir_srcFile'} }; | ||||
|         my $dest_user_host = $$config{'dest-host'}; | ||||
|         if ($::SYNCSN == 1) | ||||
|         {                                                 # syncing service node | ||||
|             #todo | ||||
|             $scpfile = "/tmp/scp_$$config{'dest-host'}"; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             $scpfile = "/tmp/scp_$$config{'dest-host'}"; | ||||
|         } | ||||
|         | ||||
|         open SCPCMDFILE, "> $scpfile" | ||||
|           or die "Can not open file $scpfile"; | ||||
|         if ($$config{'dest-user'}) | ||||
|         { | ||||
|             $dest_user_host = | ||||
|               "$$config{'dest-user'}@" . "$$config{'dest-host'}"; | ||||
|         } | ||||
|         if ($$config{'trace'}) { | ||||
|             print SCPCMDFILE "#!/bin/sh -x\n"; | ||||
|         } else { | ||||
|             print SCPCMDFILE "#!/bin/sh\n"; | ||||
|         } | ||||
|  | ||||
|     foreach $src_file (@src_file_list) { | ||||
|         my @src_path = (); | ||||
|         $$config{'src-user'} && push @src_path, "$$config{'src-user'}@"; | ||||
|         $$config{'src-host'} && push @src_path, "$$config{'src-host'}:"; | ||||
|         $$config{'src-file'} && push @src_path, $src_file; | ||||
|         push @src_files, (join '', @src_path); | ||||
|         print SCPCMDFILE | ||||
|             "/usr/bin/ssh  $dest_user_host '/bin/mkdir -p $dest_dir_list'\n"; | ||||
|  | ||||
|         foreach my $dest_dir (keys %{ $$config{'destDir_srcFile'} }){ | ||||
|             if($$config{'destDir_srcFile'}{$dest_dir}{'same_dest_name'}){ | ||||
|                 my @src_file = | ||||
|                   @{ $$config{'destDir_srcFile'}{$dest_dir}{'same_dest_name'} }; | ||||
|                 my $src_file_list = join ' ', @src_file; | ||||
|                 print SCPCMDFILE | ||||
|                     "$exec_path -p -r $src_file_list $dest_user_host:$dest_dir\n"; | ||||
|             } | ||||
|  | ||||
|             if($$config{'destDir_srcFile'}{$dest_dir}{'diff_dest_name'}){ | ||||
|                 my %diff_dest_hash = | ||||
|                     %{ $$config{'destDir_srcFile'}{$dest_dir}{'diff_dest_name'} }; | ||||
|                 foreach my $src_file_diff_dest (keys %diff_dest_hash) | ||||
|                 { | ||||
|                     my $diff_basename = $diff_dest_hash{$src_file_diff_dest}; | ||||
|                     print SCPCMDFILE | ||||
|                         "$exec_path -p -r $src_file_diff_dest $dest_user_host:$dest_dir/$diff_basename\n"; | ||||
|                 } | ||||
|             } | ||||
|         }         | ||||
|  | ||||
|         close SCPCMDFILE; | ||||
|         chmod 0755, $scpfile; | ||||
|         @command = ('/bin/sh', '-c', $scpfile); | ||||
|     }else{ | ||||
|         my @src_file_list = split $::__DCP_DELIM, $$config{'src-file'}; | ||||
|  | ||||
|         foreach $src_file (@src_file_list) { | ||||
|             my @src_path = (); | ||||
|             $$config{'src-user'} && push @src_path, "$$config{'src-user'}@"; | ||||
|             $$config{'src-host'} && push @src_path, "$$config{'src-host'}:"; | ||||
|             $$config{'src-file'} && push @src_path, $src_file; | ||||
|             push @src_files, (join '', @src_path); | ||||
|         } | ||||
|  | ||||
|         $$config{'dest-user'} && push @dest_file, "$$config{'dest-user'}@"; | ||||
|         $$config{'dest-host'} && push @dest_file, "$$config{'dest-host'}:"; | ||||
|         $$config{'dest-file'} && push @dest_file, $$config{'dest-file'}; | ||||
|  | ||||
|         push @command, $exec_path; | ||||
|         $$config{'preserve'}  && push @command, '-p'; | ||||
|         $$config{'recursive'} && push @command, '-r'; | ||||
|  | ||||
|         if ($$config{'options'}) { | ||||
|             my @options = split ' ', $$config{'options'}; | ||||
|             push @command, @options; | ||||
|         } | ||||
|  | ||||
|         ($ssh_version eq 'OpenSSH') && push @command, '-B'; | ||||
|         push @command, @src_files; | ||||
|         push @command, (join '', @dest_file); | ||||
|     } | ||||
|  | ||||
|     $$config{'dest-user'} && push @dest_file, "$$config{'dest-user'}@"; | ||||
|     $$config{'dest-host'} && push @dest_file, "$$config{'dest-host'}:"; | ||||
|     $$config{'dest-file'} && push @dest_file, $$config{'dest-file'}; | ||||
|  | ||||
|     push @command, $exec_path; | ||||
|     $$config{'preserve'}  && push @command, '-p'; | ||||
|     $$config{'recursive'} && push @command, '-r'; | ||||
|  | ||||
|     if ($$config{'options'}) { | ||||
|         my @options = split ' ', $$config{'options'}; | ||||
|         push @command, @options; | ||||
|     } | ||||
|  | ||||
|     ($ssh_version eq 'OpenSSH') && push @command, '-B'; | ||||
|     push @command, @src_files; | ||||
|     push @command, (join '', @dest_file); | ||||
|  | ||||
|     return @command; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -500,7 +500,7 @@ my %usage = ( | ||||
|     or | ||||
|     updatenode <noderange> [-V|--verbose] [-k|--security] [-s|--sn] [-t <timeout>] | ||||
|     or | ||||
|     updatenode <noderange> [-V|--verbose] [-F|--sync | -f|--snsync] [-l|--user[username]] [--fanout=[fanout value]] [-S|--sw] [-t <timeout>] | ||||
|     updatenode <noderange> [-V|--verbose] [-F|--sync | -f|--snsync] [-r|--node-rcp <node_remote_copy>] [-l|--user[username]] [--fanout=[fanout value]] [-S|--sw] [-t <timeout>] | ||||
|         [-P|--scripts [script1,script2,...]] [-s|--sn]  | ||||
|         [-A|--updateallsw] [-c|--cmdlineonly] [-d alt_source_dir] | ||||
|         [attr=val [attr=val...]] | ||||
| @@ -520,7 +520,9 @@ Options: | ||||
|  | ||||
|     [-f|--snsync] Performs File Syncing to the service nodes that service  | ||||
|         the nodes in the noderange. | ||||
|  | ||||
|   | ||||
|     [-r|--node-rcp] Specifies  the  full  path of the remote copy command used for sync files to node targets, such as /usr/bin/rsync and /usr/bin/scp | ||||
|     | ||||
|     [-g|--genmypost] Will generate a new mypostscript file for the | ||||
|         the nodes in the noderange, if site precreatemypostscripts is 1 or YES. | ||||
|  | ||||
|   | ||||
| @@ -56,7 +56,7 @@ if (!($tmp =~ / (--help|-h|-v|--version)/)) { | ||||
|     my $arg = shift(@ARGV); | ||||
|  | ||||
|     # Set the noderange | ||||
|     if ($arg !~ /^-/) { | ||||
|     if ($arg and $arg !~ /^-/) { | ||||
|         my @tempnr = (); | ||||
|         foreach my $nr (split(/,/, $arg)) { | ||||
|             if ($nr =~ /^\^(.*)$/) { | ||||
| @@ -82,7 +82,7 @@ if (!($tmp =~ / (--help|-h|-v|--version)/)) { | ||||
| push(@{ $cmdref->{arg} }, @ARGV); | ||||
|  | ||||
| # check the syntax | ||||
| my ($ALLSW, $CMDLINE, $ALTSRC, $HELP, $VERSION, $VERBOSE, $FILESYNC, $GENMYPOST, $USER, $SNFILESYNC, $SWMAINTENANCE, $SETSERVER, $RERUNPS, $SECURITY, $OS, $fanout, $timeout, $NOVERIFY); | ||||
| my ($ALLSW, $CMDLINE, $ALTSRC, $HELP, $VERSION, $VERBOSE, $FILESYNC, $GENMYPOST, $USER, $SNFILESYNC, $SWMAINTENANCE, $SETSERVER, $RERUNPS, $SECURITY, $OS, $fanout, $timeout, $NOVERIFY,$RCP); | ||||
| if ( | ||||
|     !GetOptions( | ||||
|         'A|updateallsw' => \$ALLSW, | ||||
| @@ -103,6 +103,7 @@ if ( | ||||
|         'fanout=i'      => \$fanout, | ||||
|         't|timetout=i'  => \$timeout, | ||||
|         'n|noverify'    => \$NOVERIFY, | ||||
|         'r|node-rcp'    => \$RCP, | ||||
|     ) | ||||
|   ) { | ||||
|     &updatenode_usage(); | ||||
|   | ||||
| @@ -4,7 +4,7 @@ B<updatenode> - Update nodes in an xCAT cluster environment. | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
| B<updatenode> I<noderange> [B<-V>|B<--verbose>] [B<-F>|B<--sync>] [B<-f>|B<--snsync>] [B<-S>|B<--sw>]  [B<-l>  I<userID>]  [B<-P>|B<--scripts> [I<script1,script2...>]] [B<-s>|B<--sn>] [B<-A>|B<--updateallsw>] [B<-c>|B<--cmdlineonly>] [B<-d> I<alt_source_dir>] [B<--fanout>=I<fanout_value>] [B<-t> I<timeout>} [I<attr=val> [I<attr=val...>]] [B<-n>|B<--noverify>] | ||||
| B<updatenode> I<noderange> [B<-V>|B<--verbose>] [B<-F>|B<--sync>] [B<-f>|B<--snsync>] [B<-r>|B<--node-rcp> [I<full_path_to_remote_copy_command>]]  [B<-S>|B<--sw>]  [B<-l>  I<userID>]  [B<-P>|B<--scripts> [I<script1,script2...>]] [B<-s>|B<--sn>] [B<-A>|B<--updateallsw>] [B<-c>|B<--cmdlineonly>] [B<-d> I<alt_source_dir>] [B<--fanout>=I<fanout_value>] [B<-t> I<timeout>} [I<attr=val> [I<attr=val...>]] [B<-n>|B<--noverify>] | ||||
|  | ||||
| B<updatenode> B<noderange> [B<-k>|B<--security>] [B<-t> I<timeout>] | ||||
|  | ||||
| @@ -289,7 +289,7 @@ Used to specify a source directory other than the standard lpp_source directory | ||||
| =item B<-F|--sync> | ||||
|  | ||||
| Specifies that file synchronization should be | ||||
| performed on the nodes.  rsync and ssh must | ||||
| performed on the nodes.  rsync/scp and ssh must | ||||
| be installed and configured on the nodes.  | ||||
| The function is not supported for NFS-based statelite installations. | ||||
| For NFS-based statelite installations to sync files, you should use the | ||||
| @@ -302,7 +302,7 @@ litefile table with source location specified in the litetree table. | ||||
| Specifies that file synchronization should be | ||||
| performed to the service nodes that service the | ||||
| nodes in the noderange. This updates the service | ||||
| nodes with the data to sync to the nodes. rsync and ssh must | ||||
| nodes with the data to sync to the nodes. rsync/scp and ssh must | ||||
| be installed and configured on the service nodes. | ||||
| For hierarchy, this optionally can  be done before syncing the files | ||||
| to the nodes with the -F flag.  If the -f flag is not used, then | ||||
| @@ -316,6 +316,12 @@ For statelite installations to sync files, you should use the | ||||
| read-only option for files/directories listed in | ||||
| litefile table with source location specified in the litetree table. | ||||
|  | ||||
|  | ||||
| =item [B<-r>|B<--node-rcp> [I<full_path_to_remote_copy_command>]] | ||||
|  | ||||
| Specifies  the  full  path of the remote copy command used for syncing files to node targets, such as "/usr/bin/rsync" or "/usr/bin/scp". If not specified, rsync will be used by default. | ||||
|  | ||||
|  | ||||
| =item B<-g|--genmypost> | ||||
|  | ||||
| Will generate a new mypostscript file for the | ||||
|   | ||||
| @@ -12,7 +12,8 @@ use xCAT::Utils; | ||||
| use xCAT::MsgUtils; | ||||
| use xCAT::SvrUtils; | ||||
| use xCAT::NodeRange; | ||||
|  | ||||
| use Data::Dumper; | ||||
| use Getopt::Long; | ||||
| 1; | ||||
|  | ||||
| #------------------------------------------------------- | ||||
| @@ -46,11 +47,32 @@ sub process_request | ||||
|     my $callback = shift; | ||||
|     my $subreq   = shift; | ||||
|  | ||||
|     my $args= $request->{arg};    # argument | ||||
|     @ARGV = @{$args}; | ||||
|     my $client; | ||||
|     if ($request->{'_xcat_clienthost'}) { | ||||
|         $client = $request->{'_xcat_clienthost'}->[0]; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     my %options  = (); | ||||
|     Getopt::Long::Configure("posix_default"); | ||||
|     Getopt::Long::Configure("no_gnu_compat"); | ||||
|     Getopt::Long::Configure("bundling"); | ||||
|     if ( | ||||
|         !GetOptions( | ||||
|             'r|c|node-rcp=s'        => \$options{'node-rcp'}, | ||||
|         ) | ||||
|       ) | ||||
|     { | ||||
|         xCAT::MsgUtils->message("S", "Received syncfiles from $client, with invalid options @ARGV"); | ||||
|         return;     | ||||
|     } | ||||
|  | ||||
|     if ($options{'node-rcp'}){ | ||||
|          $::RCP=$options{'node-rcp'}; | ||||
|     } | ||||
|  | ||||
|     if ($client) { ($client) = noderange($client) } | ||||
|     unless ($client) {    #Not able to do identify the host in question | ||||
|         xCAT::MsgUtils->message("S", "Received syncfiles from $client, which couldn't be correlated to a node (domain mismatch?)"); | ||||
| @@ -101,7 +123,11 @@ sub syncfiles { | ||||
|     foreach my $synclistfile (@sl) { | ||||
|  | ||||
|         # call the xdcp plugin to handle the syncfile operation | ||||
|         my $args = [ "-F", "$synclistfile" ]; | ||||
|         my $args = [ "-F", "$synclistfile"]; | ||||
|         if($::RCP){ | ||||
|             push @$args,"-r";  | ||||
|             push @$args, "$::RCP"; | ||||
|         } | ||||
|         my $env = ["DSH_RSYNC_FILE=$synclistfile"]; | ||||
|         $subreq->({ command => ['xdcp'], node => [$node], arg => $args, env => $env }, $callback); | ||||
|     } | ||||
|   | ||||
| @@ -11,7 +11,6 @@ use lib "$::XCATROOT/lib/perl"; | ||||
|  | ||||
| use xCAT::Table; | ||||
| use xCAT::Schema; | ||||
| use Data::Dumper; | ||||
| use xCAT::Utils; | ||||
| use xCAT::SvrUtils; | ||||
| use xCAT::Scope; | ||||
| @@ -30,6 +29,7 @@ use File::Basename; | ||||
| use xCAT::GlobalDef; | ||||
| use xCAT_monitoring::monitorctrl; | ||||
| use Socket; | ||||
| use Data::Dumper; | ||||
|  | ||||
| use strict; | ||||
| my $CALLBACK; | ||||
| @@ -209,7 +209,7 @@ sub preprocess_updatenode | ||||
|     } | ||||
|  | ||||
|     # parse the options | ||||
|     my ($ALLSW, $CMDLINE, $ALTSRC, $HELP, $VERSION, $VERBOSE, $FILESYNC, $GENMYPOST, $USER, $SNFILESYNC, $SWMAINTENANCE, $SETSERVER, $RERUNPS, $SECURITY, $OS, $fanout, $timeout, $NOVERIFY); | ||||
|     my ($ALLSW, $CMDLINE, $ALTSRC, $HELP, $VERSION, $VERBOSE, $FILESYNC, $GENMYPOST, $USER, $SNFILESYNC, $SWMAINTENANCE, $SETSERVER, $RERUNPS, $SECURITY, $OS, $fanout, $timeout, $NOVERIFY, $RCP); | ||||
|     Getopt::Long::Configure("bundling"); | ||||
|     Getopt::Long::Configure("no_pass_through"); | ||||
|     if ( | ||||
| @@ -232,6 +232,7 @@ sub preprocess_updatenode | ||||
|             'fanout=i'      => \$fanout, | ||||
|             't|timetout=i'  => \$timeout, | ||||
|             'n|noverify'    => \$NOVERIFY, | ||||
|             'r|node-rcp=s'  =>\$RCP, | ||||
|  | ||||
|         ) | ||||
|       ) | ||||
| @@ -289,6 +290,11 @@ sub preprocess_updatenode | ||||
|     } else { | ||||
|         undef $::OS; | ||||
|     } | ||||
|     if (defined($RCP)) { | ||||
|         $::RCP = $RCP; | ||||
|     } else { | ||||
|         undef $::RCP; | ||||
|     } | ||||
|  | ||||
|     # display the usage if -h or --help is specified | ||||
|     if ($HELP) | ||||
| @@ -428,6 +434,15 @@ sub preprocess_updatenode | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     if (($RCP) and (!$FILESYNC) and (!$SNFILESYNC)){ | ||||
|         my $rsp = {}; | ||||
|         $rsp->{data}->[0] = "-r|--node-rcp option is valid when option -f or -F is specified"; | ||||
|         $rsp->{errorcode}->[0] = 1; | ||||
|         $callback->($rsp); | ||||
|         return;         | ||||
|     } | ||||
|      | ||||
|  | ||||
|     # -f must not be with any other flag, this updates service nodes syncfiles | ||||
|     if ($SNFILESYNC && ($SWMAINTENANCE || $RERUNPS || defined($RERUNPS) || $SECURITY || $FILESYNC)) | ||||
|     { | ||||
| @@ -658,7 +673,11 @@ sub preprocess_updatenode | ||||
|     { | ||||
|         $request->{SNFileSyncing}->[0] = "yes"; | ||||
|     } | ||||
|  | ||||
|     | ||||
|     if ($RCP){ | ||||
|         $request->{rcp}->[0]=$RCP; | ||||
|     } | ||||
|     | ||||
|     # If -F  or -f then,  call CFMUtils  to check if any PCM CFM data is to be | ||||
|     # built for the node.   This will also create the synclists attribute in | ||||
|     # the osimage for each node in the noderange | ||||
| @@ -685,6 +704,7 @@ sub preprocess_updatenode | ||||
|     } | ||||
|  | ||||
|  | ||||
|  | ||||
|     #  - need to consider the mixed cluster case | ||||
|     #		- can't depend on the os of the MN - need to split out the AIX nodes | ||||
|     my ($rc, $AIXnodes, $Linuxnodes) = xCAT::InstUtils->getOSnodes($nodes); | ||||
| @@ -752,6 +772,7 @@ sub preprocess_updatenode | ||||
|     # process the -F or -f flags | ||||
|     if (($FILESYNC) || ($SNFILESYNC)) | ||||
|     { | ||||
|  | ||||
|         # If it is only -F or -f  in the command, which are always run on the MN, | ||||
|         # then run it now and you are | ||||
|         # finished. | ||||
| @@ -821,6 +842,7 @@ sub preprocess_updatenode | ||||
|     } | ||||
|  | ||||
|  | ||||
|  | ||||
|     # | ||||
|     # if hierarchy,  then build the request for the service nodes | ||||
|     # | ||||
| @@ -1078,7 +1100,6 @@ sub updatenode | ||||
|     @::SUCCESSFULLNODES = (); | ||||
|     @::FAILEDNODES      = (); | ||||
|  | ||||
|     #print Dumper($request); | ||||
|     my $nodes = $request->{node}; | ||||
|  | ||||
|     #$request->{status}= "yes";  # for testing | ||||
| @@ -1135,7 +1156,7 @@ sub updatenode | ||||
|     chomp $nimprime; | ||||
|  | ||||
|     # parse the options | ||||
|     my ($ALLSW, $CMDLINE, $ALTSRC, $HELP, $VERSION, $VERBOSE, $FILESYNC, $GENMYPOST, $USER, $SNFILESYNC, $SWMAINTENANCE, $SETSERVER, $RERUNPS, $SECURITY, $OS, $fanout, $timeout, $NOVERIFY); | ||||
|     my ($ALLSW, $CMDLINE, $ALTSRC, $HELP, $VERSION, $VERBOSE, $FILESYNC, $GENMYPOST, $USER, $SNFILESYNC, $SWMAINTENANCE, $SETSERVER, $RERUNPS, $SECURITY, $OS, $fanout, $timeout, $NOVERIFY, $RCP); | ||||
|     Getopt::Long::Configure("bundling"); | ||||
|     Getopt::Long::Configure("no_pass_through"); | ||||
|     if ( | ||||
| @@ -1158,6 +1179,7 @@ sub updatenode | ||||
|             'fanout=i'      => \$fanout, | ||||
|             't|timetout=i'  => \$timeout, | ||||
|             'n|noverify'    => \$NOVERIFY, | ||||
|             'r|node-rcp=s'   => \$RCP, | ||||
|         ) | ||||
|       ) | ||||
|     { | ||||
| @@ -1211,6 +1233,11 @@ sub updatenode | ||||
|     } else { | ||||
|         undef $::OS; | ||||
|     } | ||||
|     if (defined($RCP)) { | ||||
|         $::RCP = $RCP; | ||||
|     } else { | ||||
|         undef $::RCP; | ||||
|     } | ||||
|  | ||||
|     # | ||||
|     # process @ARGV | ||||
| @@ -1712,6 +1739,7 @@ sub updatenodesyncfiles | ||||
|     my %syncfile_node      = (); | ||||
|     my %syncfile_rootimage = (); | ||||
|  | ||||
|  | ||||
|     # $::NOSYNCFILE default value is 0 | ||||
|     # if there is no syncfiles, set $::NOSYNCFILE=1 | ||||
|     $::NOSYNCFILE = 0; | ||||
| @@ -1828,6 +1856,10 @@ sub updatenodesyncfiles | ||||
|             $CALLBACK = $callback; | ||||
|  | ||||
|  | ||||
|             if($::RCP){ | ||||
|                 push @$args, "--node-rcp"; | ||||
|                 push @$args, "$::RCP"; | ||||
|             } | ||||
|             $output = | ||||
|               xCAT::Utils->runxcmd( | ||||
|                 { | ||||
| @@ -1841,21 +1873,32 @@ sub updatenodesyncfiles | ||||
|  | ||||
|             # build the list of good and bad nodes | ||||
|             &buildnodestatus(\@$output, $callback); | ||||
|             if($::RUNCMD_RC and !@::FAILEDNODES){ | ||||
|                  push @::FAILEDNODES,@{$syncfile_node{$synclist}}; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if ($request->{SNFileSyncing}->[0] eq "yes") { | ||||
|             my $rsp = {}; | ||||
|             $rsp->{data}->[0] = "File synchronization has completed for service nodes."; | ||||
|             if(@::SUCCESSFULLNODES){ | ||||
|                 $rsp->{data}->[0] = "File synchronization has completed for service nodes: \"".join(',',@::SUCCESSFULLNODES)."\""; | ||||
|             } | ||||
|             if (@::FAILEDNODES) { | ||||
|                 $rsp->{errorcode}->[0] = 1; | ||||
|                 $rsp->{data}->[0] = "File synchronization failed for service nodes: \"".join(',',@::FAILEDNODES)."\""; | ||||
|             } | ||||
|             $callback->($rsp); | ||||
|         } | ||||
|  | ||||
|         if ($request->{FileSyncing}->[0] eq "yes") { | ||||
|             my $rsp = {}; | ||||
|             $rsp->{data}->[0] = "File synchronization has completed for nodes."; | ||||
|             if(@::SUCCESSFULLNODES){ | ||||
|                 $rsp->{data}->[0] = "File synchronization has completed for nodes: \"".join(',',@::SUCCESSFULLNODES)."\""; | ||||
|             } | ||||
|  | ||||
|             if (@::FAILEDNODES) { | ||||
|                 $rsp->{errorcode}->[0] = 1; | ||||
|                 $rsp->{data}->[0] = "File synchronization failed for nodes: \"".join(',',@::FAILEDNODES)."\""; | ||||
|             } | ||||
|             $callback->($rsp); | ||||
|         } | ||||
|   | ||||
| @@ -17,13 +17,15 @@ use File::Basename; | ||||
| use File::Path; | ||||
| use POSIX; | ||||
| require xCAT::Table; | ||||
|  | ||||
| use Data::Dumper; | ||||
| require xCAT::Utils; | ||||
| require xCAT::Zone; | ||||
| require xCAT::TableUtils; | ||||
| require xCAT::ServiceNodeUtils; | ||||
| require xCAT::MsgUtils; | ||||
| use Getopt::Long; | ||||
|  | ||||
|  | ||||
| require xCAT::DSHCLI; | ||||
| 1; | ||||
|  | ||||
| @@ -63,6 +65,7 @@ sub preprocess_request | ||||
|     my $sn; | ||||
|     my $rc = 0; | ||||
|  | ||||
|  | ||||
|     #if already preprocessed, go straight to request | ||||
|     if ((defined($req->{_xcatpreprocessed})) | ||||
|         && ($req->{_xcatpreprocessed}->[0] == 1)) | ||||
| @@ -331,6 +334,11 @@ sub parse_xdcp_cmd | ||||
|     } | ||||
|     my $changedfile = 0; | ||||
|  | ||||
|     if ($options{'node-rcp'}){ | ||||
|         $::RCP=$options{'node-rcp'}; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     # check to see if -F option and if there is, is the | ||||
|     # input file fully defined path | ||||
|     my $newfile; | ||||
| @@ -658,6 +666,10 @@ sub process_servicenodes_xdcp | ||||
|         $addreq->{command}->[0] = $cmd; | ||||
|         $addreq->{cwd}->[0]     = $req->{cwd}->[0]; | ||||
|         $addreq->{env}          = $req->{env}; | ||||
|         if($::RCP){ | ||||
|             push(@{ $addreq->{arg} }, "-r"); | ||||
|             push(@{ $addreq->{arg} }, "$::RCP"); | ||||
|         } | ||||
|         &process_request($addreq, $callback, $sub_req); | ||||
|  | ||||
|         if ($::FAILED_NODES == 0) | ||||
|   | ||||
							
								
								
									
										48
									
								
								xCAT/postscripts/startsyncfiles
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										48
									
								
								xCAT/postscripts/startsyncfiles
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| #!/bin/bash | ||||
| log_label="xcat" | ||||
| #mkdir -p /etc/xcat | ||||
| #mkdir -p /etc/pki/tls | ||||
| #if [ ! -f /etc/xcat/privkey.pem ]; then | ||||
| #    echo "[ req ] | ||||
| #distinguished_name = nodedn | ||||
|  | ||||
| #[ nodedn ]" > /etc/pki/tls/openssl.cnf | ||||
| #    logger -s -t $log_label -p local4.info "Generating private key..." | ||||
| #    openssl genrsa -out /etc/xcat/privkey.pem 1024 >& /dev/null | ||||
| #    logger -s -t $log_label -p local4.info "Done" | ||||
| #fi | ||||
|  | ||||
| #PUBKEY=`openssl rsa -in /etc/xcat/privkey.pem -pubout 2> /dev/null|grep -v "PUBLIC KEY"` | ||||
| #PUBKEY=`echo $PUBKEY|sed -e 's/ //g'` | ||||
| #export PUBKEY | ||||
|  | ||||
|  | ||||
|  | ||||
| REQUEST="<xcatrequest>" | ||||
| REQUEST=${REQUEST}"<command>syncfiles</command>" | ||||
| #REQUEST=${REQUEST}"<xcatpubkey>$PUBKEY</xcatpubkey>" | ||||
| #REQUEST=${REQUEST}"<sha512sig></sha512sig>" | ||||
|  | ||||
| if [ -n "$RCP" ]; then | ||||
|     REQUEST=${REQUEST}"<arg>-r</arg>" | ||||
|     REQUEST=${REQUEST}"<arg>"${RCP}"</arg>" | ||||
| fi | ||||
|  | ||||
| REQUEST=${REQUEST}"</xcatrequest>" | ||||
| RETCODE=0 | ||||
|  | ||||
| while read LINE;do | ||||
|     echo $LINE | ||||
|     if echo $LINE| grep '<serverdone>' >/dev/null 2>&1; then | ||||
|         rm -rf $RESPFILE | ||||
|         exit $RETCODE | ||||
|     fi | ||||
|     if echo $LINE|grep '<errorcode>' >/dev/null 2>&1; then | ||||
|         RET=${LINE#*>} | ||||
|         RET=${RET%<*} | ||||
|         [ "$RET" != "0" ] && RETCODE=1 | ||||
|     fi | ||||
| done < <(openssl s_client -no_ssl3 -no_ssl2 -connect $MASTER_IP:$XCATDPORT -ign_eof -quiet <<<$REQUEST) | ||||
|  | ||||
| rm -rf $RESPFILE | ||||
| exit $RETCODE | ||||
| @@ -11,6 +11,10 @@ BEGIN { | ||||
|  | ||||
|   print "<xcatrequest>" |& server | ||||
|   print "   <command>syncfiles</command>" |& server | ||||
|   if(RCP){ | ||||
|       print "   <arg>-r</arg>" |& server | ||||
|       print "   <arg>"RCP"</arg>" |& server | ||||
|   } | ||||
|   print "</xcatrequest>" |& server | ||||
|  | ||||
|   while (server |& getline) { | ||||
|   | ||||
| @@ -14,13 +14,6 @@ if [ -d /.statelite ]; then | ||||
|    exit 0 | ||||
| fi | ||||
|  | ||||
| if [ -f /etc/os-release ] && cat /etc/os-release |grep -i -e "^NAME=[ \"']*Cumulus Linux[ \"']*$" >/dev/null 2>&1 ; then | ||||
|    #TODO | ||||
|    echo "Cumulus OS is not supported yet, nothing to do..." | ||||
|    logger -t xcat -p local4.info "Cumulus OS is not supported yet, nothing to do..." | ||||
|    exit 0 | ||||
| fi | ||||
|  | ||||
| # do nothing when UPDATENODE=1 because it is done from the top down | ||||
| if [ -n "$UPDATENODE" ] && [ $UPDATENODE -eq 1 ]; then | ||||
|    #echo "  Did not sync any files. Use updatenode -F to sync the files." | ||||
| @@ -36,6 +29,11 @@ if [ -n "$NOSYNCFILES" ] && [ $NOSYNCFILES -eq 1 ]; then | ||||
|    exit 0 | ||||
| fi | ||||
|  | ||||
| RCP= | ||||
| if [ ! -e "/usr/bin/rsync" ]; then | ||||
|    [ -e "/usr/bin/scp" ] && RCP="/usr/bin/scp"  | ||||
| fi | ||||
|  | ||||
| logger -t xcat -p local4.info "Performing syncfiles postscript" | ||||
|  | ||||
| osname=`uname` | ||||
| @@ -47,9 +45,12 @@ quit="no" | ||||
| count=5 | ||||
| returncode=0 | ||||
| while [ $quit = "no" ]; do | ||||
|   if [ $osname = "Linux" ] | ||||
|   if cat /etc/os-release |grep -i cumulus >/dev/null 2>&1; then | ||||
|     RCP=$RCP $xcatpostdir/startsyncfiles | ||||
|     returncode=$? | ||||
|   elif [ $osname = "Linux" ] | ||||
|   then | ||||
|     `$xcatpostdir/startsyncfiles.awk` | ||||
|     `$xcatpostdir/startsyncfiles.awk -v RCP=$RCP` | ||||
|     returncode=$? | ||||
|   elif [ $osname = "AIX" ] | ||||
|   then | ||||
|   | ||||
		Reference in New Issue
	
	Block a user