edu.sdsc.inca.agent.access
Class Ssh

java.lang.Object
  extended by edu.sdsc.inca.agent.AccessMethod
      extended by edu.sdsc.inca.agent.access.Ssh

public class Ssh
extends AccessMethod

A class that implements AccessMethod using the SSH protocol for transferring files and running processes on remote resources. Important note: stop() does not kill the remote process currently

Author:
Shava Smallen <ssmallen@sdsc.edu>

Field Summary
static int CHECK_PERIOD
           
static java.lang.String[] SSH_IDENTITY_FILENAMES
           
 
Constructor Summary
Ssh(java.lang.String resource, edu.sdsc.inca.util.ResourcesWrapper resources)
          Create a new remote process controlling it via SSH.
 
Method Summary
 void get(java.lang.String[] remoteFiles, java.lang.String localDir)
          Transfer a list of remote files to a directory on the local machine using SSH.
 boolean isActive()
          Checks to see if the current ssh session is active.
 java.lang.String prependHome(java.lang.String path)
          Given a path relative to the home directory, prepend the home directory to the path and return the new string.
 void put(java.lang.String[] localFiles, java.lang.String remoteDir)
          Transfer a list of local files to a directory on a remote machine using SSH.
 AccessMethodOutput run(java.lang.String executable, java.lang.String[] arguments, java.lang.String stdin, java.lang.String directory)
          Execute the specified process on the remote resource.
 void start(java.lang.String executable, java.lang.String[] arguments, java.lang.String stdin, java.lang.String directory)
          Start a process on a remote machine.
 void stop()
          This call should kill the remote process that was started by the start() call.
 
Methods inherited from class edu.sdsc.inca.agent.AccessMethod
create, get, put, run, run, start, start
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

CHECK_PERIOD

public static final int CHECK_PERIOD
See Also:
Constant Field Values

SSH_IDENTITY_FILENAMES

public static final java.lang.String[] SSH_IDENTITY_FILENAMES
Constructor Detail

Ssh

public Ssh(java.lang.String resource,
           edu.sdsc.inca.util.ResourcesWrapper resources)
    throws edu.sdsc.inca.ConfigurationException
Create a new remote process controlling it via SSH. The given resource should exist in the resource configuration file and the following fields can be optionally defined: sshServer - the remote hostname [default: resource name] sshPort - alternative port of SSH server [default: SSHClient's default] sshUsername - username on remote machine [default: user.home from Java] sshPrivateKeyFile - identity to use to authenticate [default: ~/.ssh/id_dsa, ~/.ssh/id_rsa]

Parameters:
resource - The name of the resource to start the process on
resources - The resource configuration information.
Throws:
edu.sdsc.inca.ConfigurationException - if problem configuring ssh connection
Method Detail

get

public void get(java.lang.String[] remoteFiles,
                java.lang.String localDir)
         throws AccessMethodException
Transfer a list of remote files to a directory on the local machine using SSH.

Overrides:
get in class AccessMethod
Parameters:
remoteFiles - List of paths to remote files that will be transfered
localDir - Path to the directory on the local machine where the remote files will be placed
Throws:
AccessMethodException

isActive

public boolean isActive()
                 throws AccessMethodException
Checks to see if the current ssh session is active. Does not indicate whether the remote process is alive (for now).

Specified by:
isActive in class AccessMethod
Returns:
true if the SSH session is alive; false otherwise.
Throws:
AccessMethodException - if unable to determine if process is active

prependHome

public java.lang.String prependHome(java.lang.String path)
Given a path relative to the home directory, prepend the home directory to the path and return the new string.

Overrides:
prependHome in class AccessMethod
Parameters:
path - A path relative to the user's home directory
Returns:
A new string that contains the home directory prepended to the provided path.

run

public AccessMethodOutput run(java.lang.String executable,
                              java.lang.String[] arguments,
                              java.lang.String stdin,
                              java.lang.String directory)
                       throws AccessMethodException,
                              java.lang.InterruptedException
Execute the specified process on the remote resource. This call will block until the process has completed.

Specified by:
run in class AccessMethod
Parameters:
executable - Path to the remote executable.
arguments - Contains the arguments that should be passed to the executable
stdin - A string that will be passedd in as stdin to the process when it is started
directory - Path to the directory where the process will be executed from
Returns:
The stdout and stderr of the executed process in AccessMethodOutput
Throws:
AccessMethodException - if unable to execute remote process
java.lang.InterruptedException - if interrupted while running remote process

start

public void start(java.lang.String executable,
                  java.lang.String[] arguments,
                  java.lang.String stdin,
                  java.lang.String directory)
           throws AccessMethodException
Start a process on a remote machine. This is a non-blocking call. Important note: this process will not be killed on call to stop()

Specified by:
start in class AccessMethod
Parameters:
executable - Path to the remote executable.
arguments - Contains the arguments that should be passed to the executable
directory - Path to the directory where the process will be executed
stdin - A string that will be passedd in as stdin to the process when it is started
Throws:
AccessMethodException

stop

public void stop()
          throws AccessMethodException
This call should kill the remote process that was started by the start() call. However, since a remote process won't be killed when the ssh client session is closed, the remote process will persist. Will try to figure out if there is a SSH configuration mechanism that can be turned on so that the process will be killed upon disconnect. This call does disconnect the active SSH session.

Specified by:
stop in class AccessMethod
Throws:
AccessMethodException

put

public void put(java.lang.String[] localFiles,
                java.lang.String remoteDir)
         throws AccessMethodException
Transfer a list of local files to a directory on a remote machine using SSH.

Overrides:
put in class AccessMethod
Parameters:
localFiles - List of paths to local files that will be transfered
remoteDir - Path to the directory on the remote machine where the local files will be placed
Throws:
AccessMethodException