From 200ba613862c52dade88e358dfb0d71a1480a926 Mon Sep 17 00:00:00 2001 From: lissav Date: Wed, 12 Dec 2007 13:41:43 +0000 Subject: [PATCH] Support xdsh api interface git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@168 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- perl-xCAT-2.0/xCAT/SSH.pm | 202 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 perl-xCAT-2.0/xCAT/SSH.pm diff --git a/perl-xCAT-2.0/xCAT/SSH.pm b/perl-xCAT-2.0/xCAT/SSH.pm new file mode 100644 index 000000000..5f3624860 --- /dev/null +++ b/perl-xCAT-2.0/xCAT/SSH.pm @@ -0,0 +1,202 @@ +#!/usr/bin/perl +# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html + +package xCAT::SSH; + +use base xCAT::DSHRemoteShell; + +# Determine if OS is AIX or Linux +# Configure standard locations of commands based on OS + +if ( $^O eq 'aix' ) { + our $SCP_CMD = '/usr/bin/scp'; + our $SSH_CMD = '/usr/bin/ssh'; +} + +if ( $^O eq 'linux' ) { + our $SCP_CMD = '/usr/bin/scp'; + our $SSH_CMD = '/usr/bin/ssh'; +} + +# Store the version string of SSH + +our $ssh_version = xCAT::SSH->validate_ssh_version; + +=head3 + remote_shell_command + + This routine constructs an ssh remote shell command using the + given arguments + + Arguments: + $class - Calling module name (discarded) + $config - Reference to remote shell command configuration hash table + $exec_path - Path to ssh executable + + Returns: + A command array for the ssh command with the appropriate + arguments as defined in the $config hash table + + Globals: + $ssh_version + $SSH_CMD + + Error: + None + + Example: + xCAT::SSH->remote_shell_command($config_hash, '/usr/bin/ssh'); + + Comments: + $config hash table contents: + + $config{'command'} - command to execute on destination host + $config{'hostname'} - destination hostname where command will be executed + $config{'options'} - user ID of destination host + $config{'user'} - user ID of destination host +=cut + +sub remote_shell_command { + my ( $class, $config, $exec_path ) = @_; + + $exec_path || ( $exec_path = $SSH_CMD ); + $exec_path = '/usr/hmcrbin/ssh' if $$config{'ishmc'}; + + my @command = (); + + push @command, $exec_path; + + if ( $$config{'options'} ) { + my @options = split ' ', $$config{'options'}; + push @command, @options; + } + + if ( $ssh_version eq 'OpenSSH' ) { + push @command, '-o'; + push @command, 'BatchMode=yes'; + + ( $$config{'options'} !~ /-X/ ) && push @command, '-x'; + } + + $$config{'user'} && ( $$config{'user'} .= '@' ); + push @command, "$$config{'user'}$$config{'hostname'}"; + push @command, $$config{'command'}; + + return @command; +} + +=head3 + remote_copy_command + + This routine constructs an scp 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 scp executable + + Returns: + A command array for the scp command with the appropriate + arguments as defined in the $config hash table + + Globals: + $ssh_version + $SCP_CMD + + Error: + None + + Example: + xCAT::SSH->remote_copy_command($config_hash, '/usr/bin/scp'); + + 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 = $SCP_CMD ); + $exec_path = '/usr/hmcrbin/scp' if $$config{'ishmc'}; + + my @command = (); + 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'; + $$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; +} + +=head3 + validate_ssh_version + + This subroutine determines if OpenSSH is the version of the SSH command + defined in $SSH_CMD + + Arguments: + None + + Returns: + The string 'OpenSSH' if OpenSSH is used + undef otherwise + + Globals: + $SSH_CMD + + Error: + None + + Example: + $ssh_version = xCAT::SSH->validate_ssh_version; + + Comments: + +=cut + +sub validate_ssh_version { + my $command = "$SSH_CMD -V 2>&1"; + my @output = `$command`; + + ( $output[0] =~ /OpenSSH/ ) && return 'OpenSSH'; + return undef; +} + +1;