mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-04 05:12:30 +00:00 
			
		
		
		
	The change to fix hierarchical failed when the request did not go through XML serialization. Fix by putting into the proper structure.
		
			
				
	
	
		
			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'], username => ['root'], node => [$node], arg => $args, env => $env }, $callback);
 | 
						|
    }
 | 
						|
    return 1;
 | 
						|
}
 | 
						|
 | 
						|
1;
 |