From d38271aea2d700f67ab2dcad6cc0b8723da951b5 Mon Sep 17 00:00:00 2001
From: lissav <lissav@8638fb3e-16cb-4fca-ae20-7b5d299a9bcd>
Date: Wed, 12 Dec 2007 13:41:20 +0000
Subject: [PATCH] Support xdsh api interface,

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@167 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
---
 perl-xCAT-2.0/xCAT/RSYNC.pm | 139 ++++++++++++++++++++++++++++++++++++
 1 file changed, 139 insertions(+)
 create mode 100644 perl-xCAT-2.0/xCAT/RSYNC.pm

diff --git a/perl-xCAT-2.0/xCAT/RSYNC.pm b/perl-xCAT-2.0/xCAT/RSYNC.pm
new file mode 100644
index 000000000..2c39e63fa
--- /dev/null
+++ b/perl-xCAT-2.0/xCAT/RSYNC.pm
@@ -0,0 +1,139 @@
+#!/usr/bin/perl
+# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
+
+package xCAT::RSYNC;
+
+use base xCAT::DSHRemoteShell;
+
+# Determine if OS is AIX or Linux
+# Configure standard locations of commands based on OS
+
+if ( $^O eq 'aix' ) {
+	our $RSYNC_CMD = '/usr/bin/rsync';
+}
+
+if ( $^O eq 'linux' ) {
+	our $RSYNC_CMD = '/usr/bin/rsync';
+}
+
+
+=head3
+        remote_copy_command
+
+        This routine constructs an rsync remote copy command using the
+        given arguments
+
+        Arguments:
+        	$class - Calling module name (discarded)
+        	$config - Reference to copy command configuration hash table
+        	$exec_path - Path to rsync executable
+
+        Returns:
+        	A command array for the rsync command with the appropriate
+        	arguments as defined in the $config hash table
+                
+        Globals:
+        	None
+    
+        Error:
+        	None        	
+    
+        Example:
+        	xCAT::RSYNC->remote_copy_command($config_hash, '/usr/bin/rsync');
+
+        Comments:
+        	$config hash table contents:
+        	
+        		$config{'dest-file'} - path to file on destination host
+        		$config{'dest-host'} - destination hostname where file will be copied
+        		$config{'dest-user'} - user ID of destination host
+        		$config{'options'} - custom options string to include in scp command
+        		$config{'preserve'} - configure the preserve attributes on scp command
+        		$config{'recursive'} - configure the recursive option on scp command        	
+        		$config{'src-file'} - path to file on source host
+        		$config{'src-host'} - hostname where source file is located
+        		$config{'src-user'} - user ID of source host
+
+=cut
+
+sub remote_copy_command {
+	my ( $class, $config, $exec_path ) = @_;
+
+	$exec_path || ( $exec_path = $RSYNC_CMD );
+
+	my @command   = ();
+
+        if($$config{'destDir_srcFile'}){
+
+                my $rsync_opt;
+                $sync_opt = '-L ';
+                $sync_opt .= '-p -t ' if $$config{'preserve'};
+                $sync_opt .= '-r ' if $$config{'recursive'};
+                $sync_opt .= $$config{'options'};
+
+                open RSCYCCMDFILE, "> /tmp/rsync_$$config{'dest-host'}"
+                        or die "Can not open file /tmp/rsync_$$config{'dest-host'}";
+                my $dest_dir_list = join ' ', keys %{$$config{'destDir_srcFile'}};
+                my $dest_user_host = $$config{'dest-host'};
+                if($$config{'dest-user'}){
+                        $dest_user_host = "$$config{'dest-user'}@" . "$$config{'dest-host'}";
+                }
+                print RSCYCCMDFILE "/opt/csm/bin/dsh -n $dest_user_host '/bin/mkdir -p $dest_dir_list'\n";
+
+                foreach my $dest_dir (keys %{$$config{'destDir_srcFile'}}){
+                        my @src_file = @{$$config{'destDir_srcFile'}{$dest_dir}{'same_dest_name'}};
+                        @src_file = map{ $_ if -e $_; } @src_file;
+                        my $src_file_list = join ' ' , @src_file;
+                        if($src_file_list){
+                                print RSCYCCMDFILE "$exec_path $sync_opt $src_file_list $dest_user_host:$dest_dir\n";
+                        }
+                        my %diff_dest_hash = %{$$config{'destDir_srcFile'}{$dest_dir}{'diff_dest_name'}};
+                        foreach my $src_file_diff_dest ( keys %diff_dest_hash){
+                                next  if !-e $src_file_diff_dest;
+                                my $diff_basename = $diff_dest_hash{$src_file_diff_dest};
+                                print RSCYCCMDFILE "$exec_path $sync_opt $src_file_diff_dest $dest_user_host:$dest_dir/$diff_basename\n";
+                        }
+
+                }
+                print RSCYCCMDFILE "/bin/rm -f /tmp/rsync_$$config{'dest-host'}\n";
+                close RSCYCCMDFILE;
+                chmod 0755, "/tmp/rsync_$$config{'dest-host'}";
+                @command = ('/bin/sh','-c',"/tmp/rsync_$$config{'dest-host'}");
+
+        }
+	else{
+		my @src_files = ();
+		my @dest_file = ();
+
+		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', '-t' );
+		$$config{'recursive'} && push @command, '-r';
+
+		if ( $$config{'options'} ) {
+			my @options = split ' ', $$config{'options'};
+			push @command, @options;
+		}
+
+		push @command, @src_files;
+		push @command, ( join '', @dest_file );
+	
+	}
+
+	return @command;
+}
+
+1;