import java.util.Calendar;
import java.util.Date;
import java.util.StringTokenizer;
-import java.util.concurrent.TimeUnit;
import javax.annotation.Nonnull;
import org.apache.commons.lang.StringUtils;
private static final EELFLogger log = EELFManager.getInstance().getLogger(SshJcraftWrapper.class);
private static final int BUFFER_SIZE = 512000;
- private InputStream inputStream = null;
+ static final int DEFAULT_PORT = 22;
+ static final String CHANNEL_SHELL_TYPE = "shell";
+ static final String CHANNEL_SUBSYSTEM_TYPE = "subsystem";
+ private static final String TERMINAL_BASIC_MODE = "vt102";
+ static final String STRICT_HOST_CHECK_KEY = "StrictHostKeyChecking";
+ static final String STRICT_HOST_CHECK_VALUE = "no";
private TelnetListener listener = null;
private String routerLogFileName = null;
private String routerName = null;
private char[] charBuffer = new char[BUFFER_SIZE];
- private DataInputStream dis = null;
private BufferedReader reader = null;
private BufferedWriter out = null;
private File tmpFile = null;
private String passWord = null;
private Runtime runtime = Runtime.getRuntime();
+
+ public SshJcraftWrapper() {
+ this.jsch = new JSch();
+ }
+
+ SshJcraftWrapper(JSch jsch) {
+ this.jsch = jsch;
+ }
+
public void connect(String hostname, String username, String password, String prompt, int timeOut)
throws IOException {
- jsch = new JSch();
log.debug("Attempting to connect to {0} username={1} prompt='{2}' timeOut={3}",
hostname, username, prompt, timeOut);
routerName = hostname;
userName = username;
passWord = password;
try {
- session = jsch.getSession(username, hostname, 22);
- UserInfo ui = new MyUserInfo();
- session.setPassword(password);
- session.setUserInfo(ui);
- session.connect(timeOut);
- channel = session.openChannel("shell");
- session.setServerAliveCountMax(
- 0); // If this is not set to '0', then socket timeout on all reads will not work!!!!
- ((ChannelShell) channel).setPtyType("vt102");
- inputStream = channel.getInputStream();
- dis = new DataInputStream(inputStream);
- reader = new BufferedReader(new InputStreamReader(dis), BUFFER_SIZE);
+ channel = provideSessionChannel(CHANNEL_SHELL_TYPE, DEFAULT_PORT, timeOut);
+ ((ChannelShell) channel).setPtyType(TERMINAL_BASIC_MODE);
+ reader = new BufferedReader(new InputStreamReader(new DataInputStream(channel.getInputStream())), BUFFER_SIZE);
channel.connect();
log.info("Successfully connected. Flushing input buffer.");
try {
receiveUntil(prompt, 3000, "No cmd was sent, just waiting");
- } catch (Exception e) {
+ } catch (IOException e) {
log.warn("Caught an Exception: Nothing to flush out.", e);
}
- } catch (Exception e) {
+ } catch (JSchException e) {
log.error("Could not connect to host=" + hostname, e);
throw new IOException(e.toString());
}
hostName = hostname;
userName = username;
passWord = password;
- jsch = new JSch();
try {
- session = jsch.getSession(username, hostname, portNum);
- UserInfo ui = new MyUserInfo();
- session.setPassword(password);
- session.setUserInfo(ui);
- session.setConfig("StrictHostKeyChecking", "no");
- log.debug("StrictHostKeyChecking set to 'no'");
-
- session.connect(timeOut);
- session.setServerAliveCountMax(
- 0); // If this is not set to '0', then socket timeout on all reads will not work!!!!
- channel = session.openChannel("shell");
- ((ChannelShell) channel).setPtyType("vt102");
- inputStream = channel.getInputStream();
- dis = new DataInputStream(inputStream);
- reader = new BufferedReader(new InputStreamReader(dis), BUFFER_SIZE);
+ channel = provideSessionChannel(CHANNEL_SHELL_TYPE, portNum, timeOut);
+ ((ChannelShell) channel).setPtyType(TERMINAL_BASIC_MODE);
+ reader = new BufferedReader(new InputStreamReader(new DataInputStream(channel.getInputStream())), BUFFER_SIZE);
channel.connect();
log.info("Successfully connected. Flushing input buffer.");
try {
} else {
receiveUntil(":~#", 5000, "No cmd was sent, just waiting");
}
- } catch (Exception e) {
+ } catch (IOException e) {
log.warn("Caught an Exception: Nothing to flush out.", e);
}
- } catch (Exception e) {
+ } catch (JSchException e) {
log.error("Could not connect to host=" + hostname, e);
throw new IOException(e.toString());
}
public void closeConnection() {
log.info("Closing connection");
- inputStream = null;
- dis = null;
- charBuffer = null;
- session.disconnect();
- session = null;
+ try {
+ if (reader != null) {
+ reader.close();
+ }
+ } catch(IOException ex) {
+ log.warn("Could not close reader instance", ex);
+ } finally {
+ if(isConnected()) {
+ channel.disconnect();
+ session.disconnect();
+ channel = null;
+ session = null;
+ }
+ reader = null;
+ }
+ }
+
+ boolean isConnected() {
+ return (channel != null && session != null);
}
public void send(String cmd) throws IOException {
public void sftpPutFile(String sourcePath, String destDirectory) throws IOException {
try {
- Session sftpSession = jsch.getSession(userName, hostName, 22);
+ Session sftpSession = jsch.getSession(userName, hostName, DEFAULT_PORT);
UserInfo ui = new MyUserInfo();
sftpSession.setPassword(passWord);
sftpSession.setUserInfo(ui);
public void sftpPutStringData(String stringOfData, String fullPathDest) throws IOException {
try {
- Session sftpSession = jsch.getSession(userName, hostName, 22);
+ Session sftpSession = jsch.getSession(userName, hostName, DEFAULT_PORT);
UserInfo ui = new MyUserInfo();
sftpSession.setPassword(passWord);
sftpSession.setUserInfo(ui);
public String sftpGet(String fullFilePathName) throws IOException {
try {
- Session sftpSession = jsch.getSession(userName, hostName, 22);
+ Session sftpSession = jsch.getSession(userName, hostName, DEFAULT_PORT);
UserInfo ui = new MyUserInfo();
sftpSession.setPassword(passWord);
sftpSession.setUserInfo(ui);
maxMemoryAvailable, usedMemory, memoryLeftOnHeap);
}
- // User specifies the port number, and the subsystem
- public void connect(String hostname, String username, String password, String prompt, int timeOut, int portNum,
+ public void connect(String hostname, String username, String password, int timeOut, int portNum,
String subsystem) throws IOException {
if (log.isDebugEnabled()) {
log.debug(
- "Attempting to connect to {0} username={1} prompt='{2}' timeOut={3} portNum={4} subsystem={5}",
- hostname, username, prompt, timeOut, portNum, subsystem);
+ "Attempting to connect to {0} username={1} timeOut={2} portNum={3} subsystem={4}",
+ hostname, username, timeOut, portNum, subsystem);
}
- routerName = hostname;
- jsch = new JSch();
+ this.routerName = hostname;
+ this.hostName = hostname;
+ this.userName = username;
+ this.passWord = password;
try {
- session = jsch.getSession(username, hostname, portNum);
- UserInfo ui = new MyUserInfo();
- session.setPassword(password);
- session.setUserInfo(ui);
- session.setConfig("StrictHostKeyChecking", "no");
- session.connect(timeOut);
- session.setServerAliveCountMax(
- 0); // If this is not set to '0', then socket timeout on all reads will not work!!!!
- channel = session.openChannel("subsystem");
+ channel = provideSessionChannel(CHANNEL_SUBSYSTEM_TYPE, portNum, timeOut);
((ChannelSubsystem) channel).setSubsystem(subsystem);
((ChannelSubsystem) channel).setPty(true); //expected ptyType vt102
-
- inputStream = channel.getInputStream();
- dis = new DataInputStream(inputStream);
- reader = new BufferedReader(new InputStreamReader(dis), BUFFER_SIZE);
+ reader = new BufferedReader(new InputStreamReader(new DataInputStream(channel.getInputStream())), BUFFER_SIZE);
channel.connect(5000);
} catch (JSchException e) {
log.error("JschException occurred ", e);
throw new IOException(e.getMessage());
- } catch (TimedOutException e) {
- log.error("TimedOutException occurred", e);
- throw new IOException(e.getMessage());
}
}
- public void connect(String hostName, String username, String password, int portNumber) throws IOException {
- jsch = new JSch();
- log.debug("Attempting to connect to {0} username={1} portNumber={2}", hostName, username, portNumber);
- routerName = hostName;
+ public void connect(String hostName, String username, String password) throws IOException {
+ log.debug("Attempting to connect to {0} username={1} portNumber={2}", hostName, username, DEFAULT_PORT);
+ this.routerName = hostName;
this.hostName = hostName;
- userName = username;
- passWord = password;
+ this.userName = username;
+ this.passWord = password;
try {
- java.util.Properties config = new java.util.Properties();
- config.put("StrictHostKeyChecking", "no");
- session = jsch.getSession(username, hostName, 22);
- UserInfo ui = new MyUserInfo();
- session.setConfig(config);
- session.setPassword(password);
- session.setUserInfo(ui);
- session.connect(30000);
- channel = session.openChannel("shell");
- session.setServerAliveCountMax(
- 0); // If this is not set to '0', then socket timeout on all reads will not work!!!!
- ((ChannelShell) channel).setPtyType("vt102");
- inputStream = channel.getInputStream();
- dis = new DataInputStream(inputStream);
- reader = new BufferedReader(new InputStreamReader(dis), BUFFER_SIZE);
+ channel = provideSessionChannel(CHANNEL_SHELL_TYPE, DEFAULT_PORT, 30000);
+ ((ChannelShell) channel).setPtyType(TERMINAL_BASIC_MODE);
+ reader = new BufferedReader(new InputStreamReader(new DataInputStream(channel.getInputStream())), BUFFER_SIZE);
channel.connect();
try {
receiveUntil(":~#", 9000, "No cmd was sent, just waiting, but we can stop on a '~#'");
public void put(String sourcePath, String destDirectory) throws IOException {
try {
- Session sftpSession = jsch.getSession(userName, hostName, 22);
+ Session sftpSession = jsch.getSession(userName, hostName, DEFAULT_PORT);
UserInfo ui = new MyUserInfo();
sftpSession.setPassword(passWord);
sftpSession.setUserInfo(ui);
jsch = new JSch();
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
- sftpSession = jsch.getSession(userName, hostName, 22);
+ sftpSession = jsch.getSession(userName, hostName, DEFAULT_PORT);
UserInfo ui = new MyUserInfo();
sftpSession.setPassword(passWord);
sftpSession.setUserInfo(ui);
}
}
-
public String get(String fullFilePathName, String hostName, String userName, String passWord) throws IOException {
Session sftpSession = null;
try {
log.debug("Sftp get invoked, connection details: username={1} hostname={2}",
userName, hostName);
jsch = new JSch();
- sftpSession = jsch.getSession(userName, hostName, 22);
+ sftpSession = jsch.getSession(userName, hostName, DEFAULT_PORT);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
UserInfo ui = new MyUserInfo();
}
return originalCommand;
}
+
+ private Channel provideSessionChannel(String channelType, int port, int timeout) throws JSchException {
+ session = jsch.getSession(this.userName, this.hostName, port);
+ session.setPassword(this.passWord);
+ session.setUserInfo(new MyUserInfo()); //needed?
+ session.setConfig(STRICT_HOST_CHECK_KEY, STRICT_HOST_CHECK_VALUE);
+ session.connect(timeout);
+ session.setServerAliveCountMax(
+ 0); // If this is not set to '0', then socket timeout on all reads will not work!!!!
+ return session.openChannel(channelType);
+ }
}