Newer
Older
*
* created: Aug 2005
*
* This file is part of Artemis
*
* Copyright(C) 2005 Genome Research Limited
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or(at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
**/
package uk.ac.sanger.artemis.j2ssh;
import uk.ac.sanger.artemis.components.MessageDialog;
import javax.swing.JFileChooser;
import java.io.File;
import java.io.FileReader;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Vector;
import java.util.Properties;
import com.sshtools.j2ssh.SshClient;
import com.sshtools.j2ssh.session.SessionChannelClient;
import com.sshtools.j2ssh.sftp.SftpFile;
import com.sshtools.j2ssh.SftpClient;
import com.sshtools.j2ssh.configuration.ConfigurationLoader;
/**
*
* Client to use ssh connection to server to run blast/fasta
* remotely.
*
*/
public static org.apache.log4j.Logger logger4j =
org.apache.log4j.Logger.getLogger(SshPSUClient.class);
private String listfilepath = null;
private String cmd = null;
private String bsub = null;
private String logfile = null;
private String db = null;
//
private SshClient ssh;
private String user;
//
StdoutStdErrHandler stdouth;
StdoutStdErrHandler stderrh;
public SshPSUClient(String args[])
{
// process arguments
if(args != null && args.length > 0)
{
for(int i=0; i<args.length; i++)
{
listfilepath = args[i+1];
else if(args[i].equals("-cmd") && i < args.length-1)
cmd = args[i+1];
else if(args[i].equals("-bsub") && i < args.length-1)
bsub = args[i+1];
else if(args[i].equals("-l") && i < args.length-1)
logfile = args[i+1];
else if(args[i].equals("-d") && i < args.length-1)
db = args[i+1];
else if(args[i].equals("-wdir") && i < args.length-1)
wdir = args[i+1];
SshLogin sshLogin = new SshLogin();
ssh = sshLogin.getSshClient();
user = sshLogin.getUser();
public SshPSUClient(final String cmd)
{
this.cmd = cmd;
SshLogin sshLogin = new SshLogin();
ssh = sshLogin.getSshClient();
justProg = true;
}
try
{
ssh.disconnect();
SshLogin sshLogin = new SshLogin();
ssh = sshLogin.getSshClient();
}
catch(Exception exp)
{
if(justProg)
runProgram();
else
completed = runBlastOrFasta(program);
new MessageDialog(null,
"Finished \n" + program,
/**
*
* Read the sequence filenames in a list file
* @param String file list filename
* @return the sequence filename collection
*
*/
private Vector readListFile(String file)
{
Vector seqfiles = new Vector();
try
{
String line;
BufferedReader in = new BufferedReader(new FileReader(file));
while((line = in.readLine()) != null )
{
File seq = new File(line);
if(seq.exists())
{
seqfiles.add(seq.getAbsolutePath());
}
}
/**
*
* Wait until a file appears on the server.
*
*/
for(int i=0; i < 500; i++)
logger4j.debug("waitUntilFileAppears() "+file);
Thread.sleep(1000);
rescue();
continue;
} catch(Exception exp) {}
private boolean fileExists(SftpClient sftp, String file)
throws SshException, IOException
{
Object list[] = null;
try
{
list = sftp.ls(wdir).toArray();
}
catch(SshException sshe)
{
sftp = getSftpClient();
list = sftp.ls(wdir).toArray();
}
for(int j=0; j<list.length;j++)
{
if( ((SftpFile)list[j]).getFilename().equals(file) )
return true;
}
return false;
}
/**
*
* Get the properties from the j2ssh.properties file.
*
*/
private Properties getProperties()
{
Properties settings = new Properties();
ClassLoader cl = this.getClass().getClassLoader();
// try out of the classpath
try
{
settings.load(cl.getResourceAsStream("j2ssh.properties"));
}
catch (Exception e)
{
}
if(bsub == null && settings.getProperty("bsub") != null)
bsub = settings.getProperty("bsub");
if(db == null)
{
if(settings.getProperty("default_db") != null)
db = settings.getProperty("default_db");
else
db = "%uniprot";
}
if(wdir == null && settings.getProperty("wdir") != null)
if(cmd != null)
{
if(cmd.equals("blastp") && settings.getProperty("blastp") != null)
cmd = settings.getProperty("blastp");
else if(cmd.equals("blastn") && settings.getProperty("blastn") != null)
cmd = settings.getProperty("blastn");
else if(cmd.equals("blastx") && settings.getProperty("blastx") != null)
cmd = settings.getProperty("blastx");
else if(cmd.equals("tblastx") && settings.getProperty("tblastx") != null)
cmd = settings.getProperty("tblastx");
else if(cmd.equals("fasta") && settings.getProperty("fasta") != null)
cmd = settings.getProperty("fasta");
else if(cmd.equals("fastx") && settings.getProperty("fastx") != null)
cmd = settings.getProperty("fastx");
}
/**
*
* Run fasta or blast on the server ssh'ed into
*
*/
// prompt for local listfile
if(listfilepath == null)
{
JFileChooser chooser = new JFileChooser();
int returnVal = chooser.showOpenDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION)
listfilepath = chooser.getSelectedFile().getAbsolutePath();
else
return false;
}
// loop over sequence files in the listfile
Vector seqfile = readListFile(listfilepath);
for(int i=0; i<seqfile.size();i++)
{
String filepath = (String)seqfile.get(i);
int index = filepath.lastIndexOf(System.getProperty("file.separator"));
String filename = filepath;
if(index > -1)
filename = filename.substring(index+1);
if(!keep)
wdir = wdir + "/" + user;
sftp.mkdir(wdir);
wdir = wdir + "/" + program + "/";
sftp.mkdir(wdir);
logger4j.debug("mkdir() " + wdir);
// sftp.put(filepath, wdir+filename);
}
catch(SshException sshe)
{
logger4j.debug("runBlastOrFasta()");
if(System.getProperty("debug") != null)
{
sshe.printStackTrace();
}
rescue();
sftp = getSftpClient();
if(!wdir.endsWith(program + "/"))
wdir = wdir + "/" + program + "/";
}
catch(IOException ioe)
{
// directory already created
try
{
sftp.put(filepath, wdir+filename);
if(System.getProperty("debug") != null)
{
ioe.printStackTrace();
}
SessionChannelClient session = null;
try
{
if(!ssh.isConnected())
rescue();
session = ssh.openSessionChannel();
}
catch(IOException exp)
{
logger4j.debug("NOT STARTED runBlastOrFasta() ----- 3 "+filename);
if(System.getProperty("debug") != null)
{
exp.printStackTrace();
}
String outputfile = wdir+filename+".out";
final String actualCMD;
if( ((cmd.indexOf("fasta3") > -1) || (cmd.indexOf("fastx3") > -1))
&& settings.getProperty(db) != null)
else if(db.startsWith("%"))
db = db.substring(1,db.length());
if( (cmd.indexOf("fasta3") > -1) ||
(cmd.indexOf("fastx3") > -1) )
actualCMD = cmd+" "+wdir+filename+" "+db+" > "+outputfile;
else
actualCMD = cmd+" -d "+db+" -i "+wdir+filename+" -o "+outputfile;
{
if( (cmd.indexOf("fasta3") > -1) ||
(cmd.indexOf("fastx3") > -1) )
{
if(settings.getProperty(db) != null)
db = settings.getProperty(db);
actualCMD = bsub+" -o "+ outputfile +" -e "+ outputfile + ".err " +
cmd+" "+wdir+filename+" "+db;
}
else
actualCMD = bsub+" -o "+ outputfile +" -e "+ outputfile + ".err " +
try
{
session.executeCommand(actualCMD);
}
catch(IOException exp)
{
if(System.getProperty("debug") != null)
{
exp.printStackTrace();
}
}
// Reading from the session InputStream
StdoutStdErrHandler stdouth = new StdoutStdErrHandler(session, true);
StdoutStdErrHandler stderrh = new StdoutStdErrHandler(session, false);
stdouth.start();
stderrh.start();
boolean isFile = false;
try
{
// make sure we hang around for stdout
while(stdouth.isAlive() || stderrh.isAlive())
}
catch(InterruptedException ie)
{
ie.printStackTrace();
}
// stdout & stderr
logger4j.debug("STDOUT "+filename+"\n"+stdouth.getOutput());
logger4j.debug("STDERR "+filename+"\n"+stderrh.getOutput());
sftp.get(outputfile, filepath+".out");
}
catch(Exception ioe)
{
if(System.getProperty("debug") != null)
{
ioe.printStackTrace();
}
sftp.get(outputfile, filepath+".out");
}
if(!keep)
{
sftp.rm(outputfile);
sftp.rm(wdir+filename);
}
/**
*
* Run fasta or blast on the server ssh'ed into
*
*/
private boolean runProgram()
throws IOException
{
SessionChannelClient session = null;
try
{
if(!ssh.isConnected())
rescue();
session = ssh.openSessionChannel();
}
catch(IOException exp)
{
if(System.getProperty("debug") != null)
{
exp.printStackTrace();
}
rescue();
}
// run the application
try
{
session.executeCommand(cmd);
}
catch(IOException exp)
{
logger4j.warn("session : "+cmd);
logger4j.warn("runProgram: "+exp.getMessage());
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
if(System.getProperty("debug") != null)
{
exp.printStackTrace();
}
}
logger4j.debug("STARTED session "+cmd);
// Reading from the session InputStream
stdouth = new StdoutStdErrHandler(session, true);
stderrh = new StdoutStdErrHandler(session, false);
stdouth.start();
stderrh.start();
try
{
// make sure we hang around for stdout
while(stdouth.isAlive() || stderrh.isAlive())
Thread.sleep(5);
}
catch(InterruptedException ie)
{
ie.printStackTrace();
}
// stdout & stderr
//logger4j.debug("STDOUT \n"+stdouth.getOutput());
if(!stderrh.getOutput().equals(""))
logger4j.debug("STDERR :"+stderrh.getOutput());
session.close();
return true;
}
public String getStdOut()
{
return stdouth.getOutput();
}
public String getStdErr()
{
return stderrh.getOutput();
}
/**
*
* Return an active SftpClient object
*
*/
catch(SshException sshe)
{
try
{
sftp = ssh.openSftpClient();
return sftp;
}
catch(IOException ioe)
{
if(System.getProperty("debug") != null)
{
ioe.printStackTrace();
}
rescue();
}
}
catch(IOException ioe2)
/**
*
* Thread to handle stdout/stderr reading without blocking.
*
*/
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
class StdoutStdErrHandler extends Thread
{
private SessionChannelClient session;
private boolean isStdout;
private StringBuffer buff = new StringBuffer();
protected StdoutStdErrHandler(SessionChannelClient session,
boolean isStdout)
{
this.session = session;
this.isStdout = isStdout;
}
public void run()
{
try
{
final InputStream in;
if(isStdout)
in = session.getInputStream();
else
in = session.getStderrInputStream();
byte buffer[] = new byte[100];
int read;
while((read = in.read(buffer)) > 0)
buff.append(new String(buffer, 0, read));
in.close();
}
catch(Exception ioe)
{
ioe.printStackTrace();