mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-04 05:12:30 +00:00 
			
		
		
		
	* 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
		
			
				
	
	
		
			138 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
 | 
						|
#-------------------------------------------------------
 | 
						|
 | 
						|
=head1
 | 
						|
  xCAT plugin package to handle syncfiles command
 | 
						|
 | 
						|
=cut
 | 
						|
 | 
						|
#-------------------------------------------------------
 | 
						|
package xCAT_plugin::syncfiles;
 | 
						|
use xCAT::Utils;
 | 
						|
use xCAT::MsgUtils;
 | 
						|
use xCAT::SvrUtils;
 | 
						|
use xCAT::NodeRange;
 | 
						|
use Data::Dumper;
 | 
						|
use Getopt::Long;
 | 
						|
1;
 | 
						|
 | 
						|
#-------------------------------------------------------
 | 
						|
 | 
						|
=head3  handled_commands
 | 
						|
 | 
						|
Return list of commands handled by this plugin
 | 
						|
 | 
						|
=cut
 | 
						|
 | 
						|
#-------------------------------------------------------
 | 
						|
 | 
						|
sub handled_commands
 | 
						|
{
 | 
						|
    return { 'syncfiles' => "syncfiles" };
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
#-------------------------------------------------------
 | 
						|
 | 
						|
=head3  process_request
 | 
						|
 | 
						|
  Process the command
 | 
						|
 | 
						|
=cut
 | 
						|
 | 
						|
#-------------------------------------------------------
 | 
						|
sub process_request
 | 
						|
{
 | 
						|
    my $request  = shift;
 | 
						|
    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?)");
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    require xCAT::Postage;
 | 
						|
    &syncfiles($client, $callback, $subreq);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
 | 
						|
=head3  syncfiles
 | 
						|
 | 
						|
        Use the xdcp command to sync files from Management node/Service node t
 | 
						|
o the Compute node
 | 
						|
 | 
						|
        Arguments:
 | 
						|
        Returns: 0 - failed; 1 - succeeded;
 | 
						|
        Example:
 | 
						|
                syncfiles($node, $callback);
 | 
						|
 | 
						|
        Comments:
 | 
						|
 | 
						|
=cut
 | 
						|
 | 
						|
#-----------------------------------------------------------------------------
 | 
						|
 | 
						|
sub syncfiles {
 | 
						|
    my $node = shift;
 | 
						|
    if ($node =~ /xCAT::Postage/) {
 | 
						|
        $node = shift;
 | 
						|
    }
 | 
						|
    my $callback = shift;
 | 
						|
    my $subreq   = shift;
 | 
						|
 | 
						|
    #get the sync file base on the node type
 | 
						|
    my $synclist = xCAT::SvrUtils->getsynclistfile([$node]);
 | 
						|
    if (!$synclist) {
 | 
						|
        xCAT::MsgUtils->message("S", "Cannot find synclist file for the $node");
 | 
						|
        return 0;
 | 
						|
    }
 | 
						|
 | 
						|
    # this can be a comma separated list of multiple
 | 
						|
    # syncfiles
 | 
						|
    my @sl = split(',', $$synclist{$node});
 | 
						|
    foreach my $synclistfile (@sl) {
 | 
						|
 | 
						|
        # call the xdcp plugin to handle the syncfile operation
 | 
						|
        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);
 | 
						|
    }
 | 
						|
    return 1;
 | 
						|
}
 | 
						|
 | 
						|
1;
 |