/********************************************************* begin of preamble
**
** Copyright (C) 2003-2010 Software- und Organisations-Service GmbH.
** All rights reserved.
**
** This file may be used under the terms of either the
**
** GNU General Public License version 2.0 (GPL)
**
** as published by the Free Software Foundation
** http://www.gnu.org/licenses/gpl-2.0.txt and appearing in the file
** LICENSE.GPL included in the packaging of this file.
**
** or the
**
** Agreement for Purchase and Licensing
**
** as offered by Software- und Organisations-Service GmbH
** in the respective terms of supply that ship with this file.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
** IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
** BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
** POSSIBILITY OF SUCH DAMAGE.
********************************************************** end of preamble*/
package sos.scheduler.job;
import com.trilead.ssh2.Connection;
import com.trilead.ssh2.HTTPProxyData;
import com.trilead.ssh2.SFTPv3Client;
import com.trilead.ssh2.SFTPv3FileAttributes;
import com.trilead.ssh2.Session;
import java.io.File;
import sos.spooler.Job_impl;
import sos.spooler.Order;
import sos.spooler.Variable_set;
/**
* @author andreas.pueschel@sos-berlin.com
* @author ghassan.beydoun@sos-berlin.com
* $Id: JobSchedulerSSHBaseJob.java 3178 2008-01-04 13:49:31Z al $
* Base Class for jobs using ssh, sftp, scp
*/
public class JobSchedulerSSHBaseJob extends Job_impl {
/** remote host name or ip address */
protected String host = "";
/** remote ssh2 port */
protected int port = 0;
/** user name on remote host */
protected String user = "";
/** for publickey authentication this password secures the authentication file, for password authentication this is the password */
protected String password = "";
/** optional proxy configuration */
protected String proxyHost = "";
protected int proxyPort = 0;
protected String proxyUser = "";
protected String proxyPassword = "";
/** authentication method: publickey, password */
protected String authenticationMethod = "publickey";
/** key file: ~/.ssh/id_rsa or ~/.ssh/id_dsa */
protected String authenticationFilename = "";
/** ssh connection object */
protected Connection sshConnection = null;
/** ssh session object */
protected Session sshSession = null;
/**
* Parameter-Processing
*
*/
public void getBaseParameters() throws Exception {
Order order = null;
Variable_set params = null;
try { // to fetch parameters, order parameters have precedence to job parameters
params = spooler_task.params();
if (spooler_task.job().order_queue() != null) {
order = spooler_task.order();
if ( order.params() != null)
params.merge(order.params());
}
if (params.value("host") != null && params.value("host").toString().length() > 0) {
this.setHost(params.value("host"));
spooler_log.info(".. parameter [host]: " + this.getHost());
} else {
throw new Exception("no host name or ip address was specified as parameter [host]");
}
if (params.value("port") != null && params.value("port").length() > 0) {
try {
this.setPort(Integer.parseInt(params.value("port")));
spooler_log.info(".. parameter [port]: " + this.getPort());
} catch (Exception ex) {
throw new Exception("illegal non-numeric value for parameter [port]: " + params.value("port"));
}
} else {
this.setPort(22);
}
if (params.value("user") != null && params.value("user").length() > 0) {
this.setUser(params.value("user"));
spooler_log.info(".. parameter [user]: " + this.getUser());
} else {
throw new Exception("no user name was specified as parameter [user]");
}
if (params.value("password") != null && params.value("password").length() > 0) {
this.setPassword(params.value("password"));
spooler_log.info(".. parameter [password]: ********");
} else {
this.setPassword("");
}
if (params.value("proxy_host") != null && params.value("proxy_host").toString().length() > 0) {
this.setProxyHost(params.value("proxy_host"));
spooler_log.info(".. parameter [proxy_host]: " + this.getProxyHost());
} else {
this.setProxyHost("");
}
if (params.value("proxy_port") != null && params.value("proxy_port").length() > 0) {
try {
this.setProxyPort(Integer.parseInt(params.value("proxy_port")));
spooler_log.info(".. parameter [proxy_port]: " + this.getProxyPort());
} catch (Exception ex) {
throw new Exception("illegal non-numeric value for parameter [proxy_port]: " + params.value("proxy_port"));
}
} else {
this.setProxyPort(3128);
}
if (params.value("proxy_user") != null && params.value("proxy_user").length() > 0) {
this.setProxyUser(params.value("proxy_user"));
spooler_log.info(".. parameter [proxy_user]: " + this.getProxyUser());
} else {
this.setProxyUser("");
}
if (params.value("proxy_password") != null && params.value("proxy_password").length() > 0) {
this.setProxyPassword(params.value("proxy_password"));
spooler_log.info(".. parameter [proxy_password]: ********");
} else {
this.setProxyPassword("");
}
if (params.value("auth_method") != null && params.value("auth_method").length() > 0) {
if (params.value("auth_method").equalsIgnoreCase("publickey") || params.value("auth_method").equalsIgnoreCase("password")) {
this.setAuthenticationMethod(params.value("auth_method"));
spooler_log.info(".. parameter [auth_method]: " + this.getAuthenticationMethod());
} else {
throw new Exception("invalid authentication method [publickey, password] specified: " + params.value("auth_method"));
}
} else {
this.setAuthenticationMethod("publickey");
}
if (params.value("auth_file") != null && params.value("auth_file").length() > 0) {
this.setAuthenticationFilename(params.value("auth_file"));
spooler_log.info(".. parameter [auth_file]: " + this.getAuthenticationFilename());
} else {
if (this.getAuthenticationMethod().equalsIgnoreCase("publickey"))
throw new Exception("no authentication filename was specified as parameter [auth_file");
}
} catch (Exception e) {
throw new Exception("error occurred processing parameters: " + e.getMessage());
}
}
/**
* Authentication-Processing
*
*/
public Connection getBaseAuthentication() throws Exception {
try { // to connect and authenticate
boolean isAuthenticated = false;
this.setSshConnection(new Connection(this.getHost(), this.getPort()));
if (this.getProxyHost() != null && this.getProxyHost().length() > 0) {
if (this.getProxyUser() != null && this.getProxyUser().length() > 0) {
this.getSshConnection().setProxyData(new HTTPProxyData(this.getProxyHost(), this.getProxyPort()));
} else {
this.getSshConnection().setProxyData(new HTTPProxyData(this.getProxyHost(), this.getProxyPort(), this.getProxyUser(), this.getProxyPassword()));
}
}
this.getSshConnection().connect();
if (this.getAuthenticationMethod().equalsIgnoreCase("publickey")) {
File authenticationFile = new File(this.getAuthenticationFilename());
if (!authenticationFile.exists()) throw new Exception("authentication file does not exist: " + authenticationFile.getCanonicalPath());
if (!authenticationFile.canRead()) throw new Exception("authentication file not accessible: " + authenticationFile.getCanonicalPath());
isAuthenticated = this.getSshConnection().authenticateWithPublicKey(this.getUser(), authenticationFile, this.getPassword());
} else if (this.getAuthenticationMethod().equalsIgnoreCase("password")) {
isAuthenticated = this.getSshConnection().authenticateWithPassword(this.getUser(), this.getPassword());
}
if (!isAuthenticated) throw new Exception("authentication failed [host=" + this.getHost() + ", port=" + this.getPort() + ", user:" + this.getUser()
+ ", auth_method=" + this.getAuthenticationMethod() + ", auth_file=" + this.getAuthenticationFilename());
return this.getSshConnection();
} catch (Exception e) {
if (this.getSshConnection() != null) try { this.getSshConnection().close(); this.setSshConnection(null); } catch (Exception ex) {} // gracefully ignore this error
throw new Exception(e.getMessage());
}
}
/**
* Check existence of a file or directory
*
* @param sftpClient
* @param filename
* @return true, if file exists
* @throws Exception
*/
public boolean sshFileExists(SFTPv3Client sftpClient, String filename) {
try {
SFTPv3FileAttributes attributes = sftpClient.stat(filename);
if (attributes != null) {
return (attributes.isRegularFile() || attributes.isDirectory());
} else {
return false;
}
} catch (Exception e) {
return false;
}
}
/**
* Checks if file is a directory
*
* @param sftpClient
* @param filename
* @return true, if filename is a directory
*/
public boolean isDirectory(SFTPv3Client sftpClient, String filename) {
try {
return sftpClient.stat(filename).isDirectory();
} catch(Exception e) {}
return false;
}
/**
* Returns the file size of a file
*
* @param sftpClient
* @param filename
* @return the size of the file
* @throws Exception
*/
public long getFileSize(SFTPv3Client sftpClient, String filename) throws Exception {
return sftpClient.stat(filename).size.longValue();
}
/**
* Check existence of a file or directory
*
* @param sftpClient
* @param filename
* @return integer representation of file permissions
* @throws Exception
*/
public int sshFilePermissions(SFTPv3Client sftpClient, String filename) {
try {
SFTPv3FileAttributes attributes = sftpClient.stat(filename);
if (attributes != null) {
return attributes.permissions.intValue();
} else {
return 0;
}
} catch (Exception e) {
return 0;
}
}
/**
* normalize / to \ and remove trailing slashes from a path
*
* @param path
* @return normalized path
* @throws Exception
*/
public String normalizePath(String path) throws Exception {
String normalizedPath = path.replaceAll("\\\\", "/");
while (normalizedPath.endsWith("\\") || normalizedPath.endsWith("/")) {
normalizedPath = normalizedPath.substring(0, normalizedPath.length()-1);
}
return normalizedPath;
}
/**
* @return Returns the host.
*/
public String getHost() {
return host;
}
/**
* @param host The host to set.
*/
public void setHost(String host) {
this.host = host;
}
/**
* @return Returns the port.
*/
public int getPort() {
return port;
}
/**
* @param port The port to set.
*/
public void setPort(int port) {
this.port = port;
}
/**
* @return Returns the authenticationMethod.
*/
public String getAuthenticationMethod() {
return authenticationMethod;
}
/**
* @param authenticationMethod The authenticationMethod to set.
*/
public void setAuthenticationMethod(String authenticationMethod) {
this.authenticationMethod = authenticationMethod;
}
/**
* @return Returns the password.
*/
public String getPassword() {
return password;
}
/**
* @param password The password to set.
*/
public void setPassword(String password) {
this.password = password;
}
/**
* @return Returns the user.
*/
public String getUser() {
return user;
}
/**
* @param user The user to set.
*/
public void setUser(String user) {
this.user = user;
}
/**
* @return Returns the authenticationFilename.
*/
public String getAuthenticationFilename() {
return authenticationFilename;
}
/**
* @param authenticationFilename The authenticationFilename to set.
*/
public void setAuthenticationFilename(String authenticationFilename) {
this.authenticationFilename = authenticationFilename;
}
/**
* @return Returns the proxyPassword.
*/
private String getProxyPassword() {
return proxyPassword;
}
/**
* @param proxyPassword The proxyPassword to set.
*/
private void setProxyPassword(String proxyPassword) {
this.proxyPassword = proxyPassword;
}
/**
* @return Returns the proxyHost.
*/
private String getProxyHost() {
return proxyHost;
}
/**
* @param proxyHost The proxyHost to set.
*/
private void setProxyHost(String proxyHost) {
this.proxyHost = proxyHost;
}
/**
* @return Returns the proxyPort.
*/
private int getProxyPort() {
return proxyPort;
}
/**
* @param proxyPort The proxyPort to set.
*/
private void setProxyPort(int proxyPort) {
this.proxyPort = proxyPort;
}
/**
* @return Returns the proxyUser.
*/
private String getProxyUser() {
return proxyUser;
}
/**
* @param proxyUser The proxyUser to set.
*/
private void setProxyUser(String proxyUser) {
this.proxyUser = proxyUser;
}
/**
* @return Returns the sshConnection.
*/
public Connection getSshConnection() {
return sshConnection;
}
/**
* @param sshConnection The sshConnection to set.
*/
public void setSshConnection(Connection sshConnection) {
this.sshConnection = sshConnection;
}
/**
* @return Returns the sshSession.
*/
public Session getSshSession() {
return sshSession;
}
/**
* @param sshSession The sshSession to set.
*/
public void setSshSession(Session sshSession) {
this.sshSession = sshSession;
}
}