diff options
-rw-r--r-- | appc-config/appc-config-adaptor/provider/src/main/java/org/onap/appc/ccadaptor/SshJcraftWrapper.java | 391 |
1 files changed, 174 insertions, 217 deletions
diff --git a/appc-config/appc-config-adaptor/provider/src/main/java/org/onap/appc/ccadaptor/SshJcraftWrapper.java b/appc-config/appc-config-adaptor/provider/src/main/java/org/onap/appc/ccadaptor/SshJcraftWrapper.java index 4ef81ef1b..7494f4395 100644 --- a/appc-config/appc-config-adaptor/provider/src/main/java/org/onap/appc/ccadaptor/SshJcraftWrapper.java +++ b/appc-config/appc-config-adaptor/provider/src/main/java/org/onap/appc/ccadaptor/SshJcraftWrapper.java @@ -54,29 +54,26 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.StringTokenizer; +import javax.annotation.Nonnull; import org.apache.commons.lang.StringUtils; public class SshJcraftWrapper { - InputStream inputStream = null; - OutputStream outputStream = null; - DebugLog debugLog = new DebugLog(); + private static final int BUFFER_SIZE = 512000; + private InputStream inputStream = null; private String debugLogFileName = "/tmp/sshJcraftWrapperDebug"; private TelnetListener listener = null; private String routerLogFileName = null; private String host = null; - private String RouterName = null; - private int BUFFER_SIZE = 512000; - char[] charBuffer = new char[BUFFER_SIZE]; - // private int BUFFER_SIZE = 4000000; + 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 File tmpFile = null; private JSch jsch = null; private Session session = null; private Channel channel = null; - private String tId = ""; private String aggregatedReceivedString = ""; private File extraDebugFile = new File("/tmp/sshJcraftWrapperDEBUG"); private String routerCmdType = "XML"; @@ -86,13 +83,12 @@ public class SshJcraftWrapper { private String hostName = null; private String userName = null; private String passWord = null; - private StringBuffer charactersFromBufferFlush = new StringBuffer(); private Runtime runtime = Runtime.getRuntime(); private DebugLog dbLog = new DebugLog(); public void SshJcraftWrapper() { String fn = "SshJcraftWrapper.SshJcraftWrapper"; - debugLog.printRTAriDebug(fn, "SshJcraftWrapper has been instantated"); + DebugLog.printRTAriDebug(fn, "SshJcraftWrapper has been instantated"); routerLogFileName = "/tmp/" + host; this.host = host; } @@ -101,11 +97,11 @@ public class SshJcraftWrapper { throws IOException { String fn = "SshJcraftWrapper.connect"; jsch = new JSch(); - debugLog.printRTAriDebug(fn, + DebugLog.printRTAriDebug(fn, "Attempting to connect to " + hostname + " username=" + username + " password=" + password + " prompt='" + prompt + "' timeOut=" + timeOut); - debugLog.printRTAriDebug(fn, "Trace A"); - RouterName = hostname; + DebugLog.printRTAriDebug(fn, "Trace A"); + routerName = hostname; hostName = hostname; userName = username; passWord = password; @@ -123,15 +119,15 @@ public class SshJcraftWrapper { dis = new DataInputStream(inputStream); reader = new BufferedReader(new InputStreamReader(dis), BUFFER_SIZE); channel.connect(); - debugLog.printRTAriDebug(fn, "Successfully connected."); - debugLog.printRTAriDebug(fn, "Flushing input buffer"); + DebugLog.printRTAriDebug(fn, "Successfully connected."); + DebugLog.printRTAriDebug(fn, "Flushing input buffer"); try { receiveUntil(prompt, 3000, "No cmd was sent, just waiting"); } catch (Exception e) { - debugLog.printRTAriDebug(fn, "Caught an Exception: Nothing to flush out."); + DebugLog.printRTAriDebug(fn, "Caught an Exception: Nothing to flush out."); } } catch (Exception e) { - debugLog.printRTAriDebug(fn, "Caught an Exception. e=" + e); + DebugLog.printRTAriDebug(fn, "Caught an Exception. e=" + e); // dbLog.storeData("ErrorMsg= Exception trying to connect to "+hostname +" "+e); throw new IOException(e.toString()); } @@ -141,14 +137,14 @@ public class SshJcraftWrapper { public void connect(String hostname, String username, String password, String prompt, int timeOut, int portNum) throws IOException { String fn = "SshJcraftWrapper.connect"; - debugLog.printRTAriDebug(fn, + DebugLog.printRTAriDebug(fn, ":Attempting to connect to " + hostname + " username=" + username + " password=" + password + " prompt='" + prompt + "' timeOut=" + timeOut + " portNum=" + portNum); - RouterName = hostname; + routerName = hostname; hostName = hostname; userName = username; passWord = password; - RouterName = hostname; + routerName = hostname; jsch = new JSch(); try { session = jsch.getSession(username, hostname, portNum); @@ -156,7 +152,7 @@ public class SshJcraftWrapper { session.setPassword(password); session.setUserInfo(ui); session.setConfig("StrictHostKeyChecking", "no"); - debugLog.printRTAriDebug(fn, ":StrictHostKeyChecking set to 'no'"); + DebugLog.printRTAriDebug(fn, ":StrictHostKeyChecking set to 'no'"); session.connect(timeOut); session.setServerAliveCountMax( @@ -167,8 +163,8 @@ public class SshJcraftWrapper { dis = new DataInputStream(inputStream); reader = new BufferedReader(new InputStreamReader(dis), BUFFER_SIZE); channel.connect(); - debugLog.printRTAriDebug(fn, ":Successfully connected."); - debugLog.printRTAriDebug(fn, ":Flushing input buffer"); + DebugLog.printRTAriDebug(fn, ":Successfully connected."); + DebugLog.printRTAriDebug(fn, ":Flushing input buffer"); try { if (prompt.equals("]]>]]>")) { receiveUntil("]]>]]>", 10000, "No cmd was sent, just waiting"); @@ -176,10 +172,10 @@ public class SshJcraftWrapper { receiveUntil(":~#", 5000, "No cmd was sent, just waiting"); } } catch (Exception e) { - debugLog.printRTAriDebug(fn, "Caught an Exception::: Nothing to flush out."); + DebugLog.printRTAriDebug(fn, "Caught an Exception::: Nothing to flush out."); } } catch (Exception e) { - debugLog.printRTAriDebug(fn, ":Caught an Exception. e=" + e); + DebugLog.printRTAriDebug(fn, ":Caught an Exception. e=" + e); dbLog.outputStackTrace(e); // dbLog.storeData("ErrorMsg= Exception trying to connect to "+hostname +" "+e); @@ -188,14 +184,13 @@ public class SshJcraftWrapper { } - public String receiveUntil(String delimeters, int timeout, String cmdThatWasSent) - throws TimedOutException, IOException { + public String receiveUntil(String delimeters, int timeout, String cmdThatWasSent) throws IOException { String fn = "SshJcraftWrapper.receiveUntil"; boolean match = false; boolean cliPromptCmd = false; StringBuffer sb2 = new StringBuffer(); StringBuffer sbReceive = new StringBuffer(); - debugLog.printRTAriDebug(fn, + DebugLog.printRTAriDebug(fn, "delimeters='" + delimeters + "' timeout=" + timeout + " cmdThatWasSent='" + cmdThatWasSent + "'"); appendToFile(debugLogFileName, fn + " delimeters='" + delimeters + "' timeout=" + timeout + " cmdThatWasSent='" + cmdThatWasSent + "'\n"); @@ -209,9 +204,9 @@ public class SshJcraftWrapper { session.setTimeout(timeout); // This is the socket timeout value. while (!match) { if (new Date().getTime() > deadline) { - debugLog.printRTAriDebug(fn, - "Throwing a TimedOutException: time in routine has exceed our deadline: RouterName:" - + RouterName + " CmdThatWasSent=" + CmdThatWasSent); + DebugLog.printRTAriDebug(fn, + "Throwing a TimedOutException: time in routine has exceed our deadline: routerName:" + + routerName + " CmdThatWasSent=" + CmdThatWasSent); throw new TimedOutException("Timeout: time in routine has exceed our deadline"); } try { @@ -222,9 +217,9 @@ public class SshJcraftWrapper { int len = reader.read(charBuffer, 0, BUFFER_SIZE); appendToFile(debugLogFileName, fn + " After reader.read cmd: len=" + len + "\n"); if (len <= 0) { - debugLog.printRTAriDebug(fn, - "Reader read " + len + " bytes. Looks like we timed out, router=" + RouterName); - throw new TimedOutException("Received a SocketTimeoutException router=" + RouterName); + DebugLog.printRTAriDebug(fn, + "Reader read " + len + " bytes. Looks like we timed out, router=" + routerName); + throw new TimedOutException("Received a SocketTimeoutException router=" + routerName); } if (!cliPromptCmd) { if (cmdThatWasSent.indexOf("IOS_XR_uploadedSwConfigCmd") != -1) { @@ -232,22 +227,22 @@ public class SshJcraftWrapper { // This is a IOS XR sw config file. We will write it to the disk. timeout = timeout * 2; deadline = new Date().getTime() + timeout; - debugLog.printRTAriDebug(fn, "IOS XR upload for software config: timeout=" + timeout); + DebugLog.printRTAriDebug(fn, "IOS XR upload for software config: timeout=" + timeout); StringTokenizer st = new StringTokenizer(cmdThatWasSent); st.nextToken(); routerFileName = st.nextToken(); fileWriter = new FileWriter(routerFileName); out = new BufferedWriter(fileWriter); - routerLogFileName = "/tmp/" + RouterName; - _tmpFile = new File(routerLogFileName); - debugLog.printRTAriDebug(fn, + routerLogFileName = "/tmp/" + routerName; + tmpFile = new File(routerLogFileName); + DebugLog.printRTAriDebug(fn, "Will write the swConfigFile to disk, routerFileName=" + routerFileName); } int c; out.write(charBuffer, 0, len); out.flush(); appendToFile(debugLogFileName, fn + " Wrote " + len + " bytes to the disk\n"); - if (_tmpFile.exists()) { + if (tmpFile.exists()) { appendToRouterFile(routerLogFileName, len); } match = checkIfReceivedStringMatchesDelimeter(len, "\nXML>"); @@ -270,7 +265,7 @@ public class SshJcraftWrapper { sb2.append((char) charBuffer[i]); } } - appendToRouterFile("/tmp/" + RouterName, len); + appendToRouterFile("/tmp/" + routerName, len); if (listener != null) { listener.receivedString(sb2.toString()); } @@ -284,30 +279,30 @@ public class SshJcraftWrapper { } } } else { - debugLog.printRTAriDebug(fn, "cliPromptCmd, Trace 2"); + DebugLog.printRTAriDebug(fn, "cliPromptCmd, Trace 2"); sb2.setLength(0); for (int i = 0; i < len; i++) { sbReceive.append((char) charBuffer[i]); sb2.append((char) charBuffer[i]); } - appendToRouterFile("/tmp/" + RouterName, sb2); + appendToRouterFile("/tmp/" + routerName, sb2); if (listener != null) { listener.receivedString(sb2.toString()); } - debugLog.printRTAriDebug(fn, "sb2='" + sb2.toString() + "' delimeters='" + delimeters + "'"); + DebugLog.printRTAriDebug(fn, "sb2='" + sb2.toString() + "' delimeters='" + delimeters + "'"); if (sb2.toString().indexOf("\nariPrompt>") != -1) { - debugLog.printRTAriDebug(fn, "Found our prompt"); + DebugLog.printRTAriDebug(fn, "Found our prompt"); match = true; break; } } } } catch (JSchException e) { - debugLog.printRTAriDebug(fn, "Caught an JSchException e=" + e.toString()); + DebugLog.printRTAriDebug(fn, "Caught an JSchException e=" + e.toString()); dbLog.outputStackTrace(e); throw new TimedOutException(e.toString()); } catch (IOException ee) { - debugLog.printRTAriDebug(fn, "Caught an IOException: ee=" + ee.toString()); + DebugLog.printRTAriDebug(fn, "Caught an IOException: ee=" + ee.toString()); dbLog.outputStackTrace(ee); throw new TimedOutException(ee.toString()); } finally { @@ -315,12 +310,12 @@ public class SshJcraftWrapper { if (fileWriter != null) { fileWriter.close(); } - } catch(IOException ex) { - debugLog.printRTAriDebug(fn, "Failed to close fileWriter output stream: ex=" + ex); + } catch (IOException ex) { + DebugLog.printRTAriDebug(fn, "Failed to close fileWriter output stream: ex=" + ex); } } String result = stripOffCmdFromRouterResponse(sbReceive.toString()); - debugLog.printRTAriDebug(fn, "Leaving method successfully"); + DebugLog.printRTAriDebug(fn, "Leaving method successfully"); return result; } @@ -369,7 +364,7 @@ public class SshJcraftWrapper { appendToFile(debugLogFileName, fn + " Looking for an delimeter of:'" + delimeter + "'\n"); appendToFile(debugLogFileName, fn + " receivedString='" + receivedString); if (aggregatedReceivedString.indexOf(delimeter) != -1) { - debugLog.printRTAriDebug(fn, "Found our delimeter, which was: '" + delimeter + "'"); + DebugLog.printRTAriDebug(fn, "Found our delimeter, which was: '" + delimeter + "'"); aggregatedReceivedString = ""; return (true); } @@ -444,9 +439,8 @@ public class SshJcraftWrapper { public void closeConnection() { String fn = "SshJcraftWrapper.closeConnection"; - debugLog.printRTAriDebug(fn, "Executing the closeConnection...."); + DebugLog.printRTAriDebug(fn, "Executing the closeConnection...."); inputStream = null; - outputStream = null; dis = null; charBuffer = null; session.disconnect(); @@ -455,52 +449,11 @@ public class SshJcraftWrapper { public void send(String cmd) throws IOException { String fn = "SshJcraftWrapper.send"; - OutputStream out = channel.getOutputStream(); - DataOutputStream dos = new DataOutputStream(out); - if ((cmd.charAt(cmd.length() - 1) != '\n') && (cmd.charAt(cmd.length() - 1) != '\r')) { - cmd += "\n"; - } - int length = cmd.length(); - int i = -1; - int nchars = 300000; - int ncharsTotalSent = 0; - int ncharsSent = 0; - - appendToFile(debugLogFileName, fn + ": Sending: '" + cmd); - // debugLog.printRTAriDebug (fn, "cmd = "+cmd); - debugLog.printRTAriDebug(fn, "Length of cmd is:" + length); // 2,937,706 - try { - if (length > 600000) { - int timeout = 9000; - for (i = 0; i < length; i += nchars) { - String Cmd = cmd.substring(i, Math.min(length, i + nchars)); - ncharsSent = Cmd.length(); - ncharsTotalSent = ncharsTotalSent + Cmd.length(); - debugLog.printRTAriDebug(fn, "i=" + i + " Sending Cmd: ncharsSent=" + ncharsSent); - dos.writeBytes(Cmd); - dos.flush(); - try { - debugLog.printRTAriDebug(fn, ":::i=" + i + " length=" + length); - if (ncharsSent < length) { - receiveUntilBufferFlush(ncharsSent, timeout, "buffer flush i=" + i); - } else { - debugLog.printRTAriDebug(fn, "i=" + i + " No Waiting this time...."); - dos.flush(); - } - } catch (Exception e) { - debugLog.printRTAriDebug(fn, "Caught an Exception: Nothing to flush out."); - } - } - } else { - debugLog.printRTAriDebug(fn, "Before executing the dos.writeBytes"); - dos.writeBytes(cmd); - } - dos.flush(); - debugLog.printRTAriDebug(fn, "Leaving method"); - appendToFile(debugLogFileName, fn + ": Leaving method\n"); + try (OutputStream os = channel.getOutputStream(); DataOutputStream dos = new DataOutputStream(os)) { + sendSshCommand(cmd, dos); } catch (IOException e) { - debugLog.printRTAriDebug(fn, "Caught an IOException. e=" + e); + DebugLog.printRTAriDebug(fn, "Caught an IOException. e=" + e); dbLog.outputStackTrace(e); throw new IOException(e.toString()); } @@ -512,11 +465,11 @@ public class SshJcraftWrapper { OutputStream out = channel.getOutputStream(); DataOutputStream dos = new DataOutputStream(out); try { - debugLog.printRTAriDebug(fn, "Sending: '" + v + "'"); + DebugLog.printRTAriDebug(fn, "Sending: '" + v + "'"); dos.writeChar(v); dos.flush(); } catch (IOException e) { - debugLog.printRTAriDebug(fn, "Caught an IOException. e=" + e); + DebugLog.printRTAriDebug(fn, "Caught an IOException. e=" + e); throw new IOException(e.toString()); } } @@ -529,7 +482,7 @@ public class SshJcraftWrapper { dos.write(b, off, len); dos.flush(); } catch (IOException e) { - debugLog.printRTAriDebug(fn, "Caught an IOException. e=" + e); + DebugLog.printRTAriDebug(fn, "Caught an IOException. e=" + e); throw new IOException(e.toString()); } } @@ -583,13 +536,14 @@ public class SshJcraftWrapper { BufferedWriter out = new BufferedWriter(new FileWriter(fileName, true)); // out.write(dataToWrite); // out.write(getTheDate() +": " +Thread.currentThread().getName() +": "+dataToWrite); + String tId = ""; out.write(getTheDate() + ": " + tId + ": " + dataToWrite); out.close(); } } catch (IOException e) { - debugLog.printRTAriDebug(fn, "Caught an IOException: e=" + e); + DebugLog.printRTAriDebug(fn, "Caught an IOException: e=" + e); } catch (Exception e) { - debugLog.printRTAriDebug(fn, "Caught an Exception: e=" + e); + DebugLog.printRTAriDebug(fn, "Caught an Exception: e=" + e); } } @@ -606,9 +560,9 @@ public class SshJcraftWrapper { out.close(); } } catch (IOException e) { - debugLog.printRTAriDebug(fn, "Caught an IOException: e=" + e); + DebugLog.printRTAriDebug(fn, "Caught an IOException: e=" + e); } catch (Exception e) { - debugLog.printRTAriDebug(fn, "Caught an Exception: e=" + e); + DebugLog.printRTAriDebug(fn, "Caught an Exception: e=" + e); } } @@ -624,7 +578,7 @@ public class SshJcraftWrapper { public void appendToRouterFile(String fileName, StringBuffer dataToWrite) { String fnName = "SshJcraftWrapper.appendToRouterFile"; - debugLog.printRTAriDebug(fnName, "Entered.... "); + DebugLog.printRTAriDebug(fnName, "Entered.... "); try { // First check to see if a file 'fileName' exist, if it does // write to it. If it does not exist, don't write to it. @@ -646,7 +600,7 @@ public class SshJcraftWrapper { public void appendToRouterFile(String fileName, int len) { String fnName = "SshJcraftWrapper.appendToFile"; - // debugLog.printRTAriDebug (fnName, "Entered.... len="+len); + // DebugLog.printRTAriDebug (fnName, "Entered.... len="+len); try { // First check to see if a file 'fileName' exist, if it does // write to it. If it does not exist, don't write to it. @@ -691,7 +645,7 @@ public class SshJcraftWrapper { StringBuffer sb = new StringBuffer(); int numTokens = rr.countTokens(); - // debugLog.printRTAriDebug (fn, "Number of lines in the response from the router is:" +numTokens); + // DebugLog.printRTAriDebug (fn, "Number of lines in the response from the router is:" +numTokens); if (numTokens > 1) { rr.nextToken(); //Skip the first line. while (rr.hasMoreTokens()) { @@ -704,7 +658,7 @@ public class SshJcraftWrapper { public void setRouterCommandType(String type) { String fn = "SshJcraftWrapper.setRouterCommandType"; this.routerCmdType = type; - debugLog.printRTAriDebug(fn, "Setting routerCmdType to a value of '" + type + "'"); + DebugLog.printRTAriDebug(fn, "Setting routerCmdType to a value of '" + type + "'"); } public String getLastFewLinesOfFile(File file, int linesToRead) throws FileNotFoundException, IOException { @@ -733,7 +687,7 @@ public class SshJcraftWrapper { } randomAccessFile.close(); if (!jcraftReadSwConfigFileFromDisk()) { - debugLog.printRTAriDebug(fn, "tail='" + tail + "'"); + DebugLog.printRTAriDebug(fn, "tail='" + tail + "'"); } appendToFile(debugLogFileName, "tail='" + tail + "'\n"); return tail; @@ -757,7 +711,7 @@ public class SshJcraftWrapper { } public String getRouterName() { - return (RouterName); + return (routerName); } // Routine does reads until it has read 'nchars' or times out. @@ -766,11 +720,10 @@ public class SshJcraftWrapper { String fn = "SshJcraftWrapper.receiveUntilBufferFlush"; StringBuffer sb2 = new StringBuffer(); StringBuffer sbReceive = new StringBuffer(); - debugLog.printRTAriDebug(fn, "ncharsSent=" + ncharsSent + " timeout=" + timeout + " " + message); + DebugLog.printRTAriDebug(fn, "ncharsSent=" + ncharsSent + " timeout=" + timeout + " " + message); int ncharsTotalReceived = 0; int ncharsRead = 0; boolean flag = false; - charactersFromBufferFlush.setLength(0); long deadline = new Date().getTime() + timeout; logMemoryUsage(); @@ -778,7 +731,7 @@ public class SshJcraftWrapper { session.setTimeout(timeout); // This is the socket timeout value. while (true) { if (new Date().getTime() > deadline) { - debugLog.printRTAriDebug(fn, + DebugLog.printRTAriDebug(fn, "Throwing a TimedOutException: time in routine has exceed our deadline: ncharsSent=" + ncharsSent + " ncharsTotalReceived=" + ncharsTotalReceived); flag = true; @@ -788,11 +741,11 @@ public class SshJcraftWrapper { if (listener != null) { listener.receivedString(String.copyValueOf(charBuffer, 0, ncharsRead)); } - appendToRouterFile("/tmp/" + RouterName, ncharsRead); + appendToRouterFile("/tmp/" + routerName, ncharsRead); ncharsTotalReceived = ncharsTotalReceived + ncharsRead; - // debugLog.printRTAriDebug (fn, "::ncharsSent="+ncharsSent+" ncharsTotalReceived="+ncharsTotalReceived +" ncharsRead="+ncharsRead); + // DebugLog.printRTAriDebug (fn, "::ncharsSent="+ncharsSent+" ncharsTotalReceived="+ncharsTotalReceived +" ncharsRead="+ncharsRead); if (ncharsTotalReceived >= ncharsSent) { - debugLog.printRTAriDebug(fn, + DebugLog.printRTAriDebug(fn, "Received the correct number of characters, ncharsSent=" + ncharsSent + " ncharsTotalReceived=" + ncharsTotalReceived); logMemoryUsage(); @@ -800,8 +753,8 @@ public class SshJcraftWrapper { } } } catch (JSchException e) { - debugLog.printRTAriDebug(fn, "Caught an JSchException e=" + e); - debugLog.printRTAriDebug(fn, + DebugLog.printRTAriDebug(fn, "Caught an JSchException e=" + e); + DebugLog.printRTAriDebug(fn, "ncharsSent=" + ncharsSent + " ncharsTotalReceived=" + ncharsTotalReceived + " ncharsRead=" + ncharsRead); throw new TimedOutException(e.toString()); @@ -828,16 +781,16 @@ public class SshJcraftWrapper { sftpSession.setPassword(passWord); sftpSession.setUserInfo(ui); sftpSession.connect(30 * 1000); - debugLog.printRTAriDebug(fn, "Opening up an sftp channel...."); + DebugLog.printRTAriDebug(fn, "Opening up an sftp channel...."); ChannelSftp sftp = (ChannelSftp) sftpSession.openChannel("sftp"); - debugLog.printRTAriDebug(fn, "Connecting...."); + DebugLog.printRTAriDebug(fn, "Connecting...."); sftp.connect(); - debugLog.printRTAriDebug(fn, "Sending " + sourcePath + " --> " + destDirectory); + DebugLog.printRTAriDebug(fn, "Sending " + sourcePath + " --> " + destDirectory); sftp.put(sourcePath, destDirectory, ChannelSftp.OVERWRITE); - debugLog.printRTAriDebug(fn, "Sent successfully"); + DebugLog.printRTAriDebug(fn, "Sent successfully"); sftpSession.disconnect(); } catch (Exception e) { - debugLog.printRTAriDebug(fn, "Caught an Exception, e=" + e); + DebugLog.printRTAriDebug(fn, "Caught an Exception, e=" + e); // dbLog.storeData("ErrorMsg= sftp threw an Exception. error is:"+e); throw new IOException(e.toString()); } @@ -852,17 +805,17 @@ public class SshJcraftWrapper { sftpSession.setPassword(passWord); sftpSession.setUserInfo(ui); sftpSession.connect(30 * 1000); - debugLog.printRTAriDebug(fn, "Opening up an sftp channel...."); + DebugLog.printRTAriDebug(fn, "Opening up an sftp channel...."); ChannelSftp sftp = (ChannelSftp) sftpSession.openChannel("sftp"); - debugLog.printRTAriDebug(fn, "Connecting...."); + DebugLog.printRTAriDebug(fn, "Connecting...."); sftp.connect(); InputStream is = new ByteArrayInputStream(stringOfData.getBytes()); - debugLog.printRTAriDebug(fn, "Sending stringOfData --> " + fullPathDest); + DebugLog.printRTAriDebug(fn, "Sending stringOfData --> " + fullPathDest); sftp.put(is, fullPathDest, ChannelSftp.OVERWRITE); - debugLog.printRTAriDebug(fn, "Sent successfully"); + DebugLog.printRTAriDebug(fn, "Sent successfully"); sftpSession.disconnect(); } catch (Exception e) { - debugLog.printRTAriDebug(fn, "Caught an Exception, e=" + e); + DebugLog.printRTAriDebug(fn, "Caught an Exception, e=" + e); // dbLog.storeData("ErrorMsg= sftp threw an Exception. error is:"+e); throw new IOException(e.toString()); } @@ -876,20 +829,19 @@ public class SshJcraftWrapper { sftpSession.setPassword(passWord); sftpSession.setUserInfo(ui); sftpSession.connect(30 * 1000); - debugLog.printRTAriDebug(fn, "Opening up an sftp channel...."); + DebugLog.printRTAriDebug(fn, "Opening up an sftp channel...."); ChannelSftp sftp = (ChannelSftp) sftpSession.openChannel("sftp"); - debugLog.printRTAriDebug(fn, "Connecting...."); + DebugLog.printRTAriDebug(fn, "Connecting...."); sftp.connect(); InputStream in = null; in = sftp.get(fullFilePathName); String sftpFileString = readInputStreamAsString(in); - debugLog.printRTAriDebug(fn, "Retreived successfully"); - // debugLog.printRTAriDebug (fn, "sftpFileString="+sftpFileString); + DebugLog.printRTAriDebug(fn, "Retreived successfully"); + // DebugLog.printRTAriDebug (fn, "sftpFileString="+sftpFileString); sftpSession.disconnect(); return (sftpFileString); } catch (Exception e) { - debugLog.printRTAriDebug(fn, "Caught an Exception, e=" + e); - // dbLog.storeData("ErrorMsg= sftp threw an Exception. error is:"+e); + DebugLog.printRTAriDebug(fn, "Caught an Exception, e=" + e); throw new IOException(e.toString()); } } @@ -921,21 +873,15 @@ public class SshJcraftWrapper { + memoryLetfOnHeap); } - // ---------------------------------------------------------------------------- - // ---------------------------------------------------------------------------- - // ---------------------------------------------------------------------------- - // ---------------------------------------------------------------------------- - - // User specifies the port number, and the subsystem public void connect(String hostname, String username, String password, String prompt, int timeOut, int portNum, String subsystem) throws IOException { String fn = "SshJcraftWrapper.connect"; - debugLog.printRTAriDebug(fn, + DebugLog.printRTAriDebug(fn, ":::Attempting to connect to " + hostname + " username=" + username + " password=" + password + " prompt='" + prompt + "' timeOut=" + timeOut + " portNum=" + portNum + " subsystem=" + subsystem); - RouterName = hostname; + routerName = hostname; jsch = new JSch(); try { session = jsch.getSession(username, hostname, portNum); @@ -955,15 +901,15 @@ public class SshJcraftWrapper { dis = new DataInputStream(inputStream); reader = new BufferedReader(new InputStreamReader(dis), BUFFER_SIZE); channel.connect(); - debugLog.printRTAriDebug(fn, "Successfully connected."); - debugLog.printRTAriDebug(fn, "Five second sleep...."); + DebugLog.printRTAriDebug(fn, "Successfully connected."); + DebugLog.printRTAriDebug(fn, "Five second sleep...."); try { Thread.sleep(5000); } catch (java.lang.InterruptedException ee) { boolean ignore = true; } } catch (Exception e) { - debugLog.printRTAriDebug(fn, "Caught an Exception. e=" + e); + DebugLog.printRTAriDebug(fn, "Caught an Exception. e=" + e); throw new IOException(e.toString()); } } @@ -971,11 +917,11 @@ public class SshJcraftWrapper { public void connect(String hostName, String username, String password, int portNumber) throws IOException { String fn = "SshJcraftWrapper.connect"; jsch = new JSch(); - debugLog.printRTAriDebug(fn, + DebugLog.printRTAriDebug(fn, "::Attempting to connect to " + hostName + " username=" + username + " password=" + password + " portNumber=" + portNumber); - debugLog.printRTAriDebug(fn, "Trace C"); - RouterName = hostName; + DebugLog.printRTAriDebug(fn, "Trace C"); + routerName = hostName; this.hostName = hostName; userName = username; passWord = password; @@ -983,7 +929,6 @@ public class SshJcraftWrapper { java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking", "no"); session = jsch.getSession(username, hostName, 22); - // session = jsch.getSession(username, hostName, portNumber); UserInfo ui = new MyUserInfo(); session.setConfig(config); session.setPassword(password); @@ -997,16 +942,16 @@ public class SshJcraftWrapper { dis = new DataInputStream(inputStream); reader = new BufferedReader(new InputStreamReader(dis), BUFFER_SIZE); channel.connect(); - debugLog.printRTAriDebug(fn, "::Successfully connected."); - debugLog.printRTAriDebug(fn, "::Flushing input buffer"); + DebugLog.printRTAriDebug(fn, "::Successfully connected."); + DebugLog.printRTAriDebug(fn, "::Flushing input buffer"); try { receiveUntil(":~#", 9000, "No cmd was sent, just waiting, but we can stop on a '~#'"); } catch (Exception e) { - debugLog.printRTAriDebug(fn, "Caught an Exception::: Nothing to flush out."); + DebugLog.printRTAriDebug(fn, "Caught an Exception::: Nothing to flush out."); } } catch (Exception e) { - debugLog.printRTAriDebug(fn, "Caught an Exception. e=" + e); + DebugLog.printRTAriDebug(fn, "Caught an Exception. e=" + e); // dbLog.storeData("ErrorMsg= Exception trying to connect to "+hostName +" "+e); throw new IOException(e.toString()); } @@ -1021,16 +966,16 @@ public class SshJcraftWrapper { sftpSession.setPassword(passWord); sftpSession.setUserInfo(ui); sftpSession.connect(30 * 1000); - debugLog.printRTAriDebug(fn, "Opening up an sftp channel...."); + DebugLog.printRTAriDebug(fn, "Opening up an sftp channel...."); ChannelSftp sftp = (ChannelSftp) sftpSession.openChannel("sftp"); - debugLog.printRTAriDebug(fn, "Connecting...."); + DebugLog.printRTAriDebug(fn, "Connecting...."); sftp.connect(); - debugLog.printRTAriDebug(fn, "Sending " + sourcePath + " --> " + destDirectory); + DebugLog.printRTAriDebug(fn, "Sending " + sourcePath + " --> " + destDirectory); sftp.put(sourcePath, destDirectory, ChannelSftp.OVERWRITE); - debugLog.printRTAriDebug(fn, "Sent successfully"); + DebugLog.printRTAriDebug(fn, "Sent successfully"); sftpSession.disconnect(); } catch (Exception e) { - debugLog.printRTAriDebug(fn, "Caught an Exception, e=" + e); + DebugLog.printRTAriDebug(fn, "Caught an Exception, e=" + e); // dbLog.storeData("ErrorMsg= sftp threw an Exception. error is:"+e); throw new IOException(e.toString()); } @@ -1041,7 +986,7 @@ public class SshJcraftWrapper { String fn = "SshJcraftWrapper.put"; Session sftpSession = null; try { - debugLog.printRTAriDebug(fn, "userName=" + userName + " hostName=" + hostName + " passWord=" + passWord); + DebugLog.printRTAriDebug(fn, "userName=" + userName + " hostName=" + hostName + " passWord=" + passWord); jsch = new JSch(); java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking", "no"); @@ -1051,32 +996,32 @@ public class SshJcraftWrapper { sftpSession.setUserInfo(ui); sftpSession.setConfig(config); sftpSession.connect(30 * 1000); - debugLog.printRTAriDebug(fn, "Opening up an sftp channel...."); + DebugLog.printRTAriDebug(fn, "Opening up an sftp channel...."); ChannelSftp sftp = (ChannelSftp) sftpSession.openChannel("sftp"); - debugLog.printRTAriDebug(fn, "Connecting...."); + DebugLog.printRTAriDebug(fn, "Connecting...."); sftp.connect(); String oldFiles = fullPathDest + "*"; - debugLog.printRTAriDebug(fn, "Deleting old files --> " + oldFiles); + DebugLog.printRTAriDebug(fn, "Deleting old files --> " + oldFiles); try { sftp.rm(oldFiles); - debugLog.printRTAriDebug(fn, "Sending stringOfData --> " + fullPathDest); + DebugLog.printRTAriDebug(fn, "Sending stringOfData --> " + fullPathDest); } catch (SftpException sft) { String exp = "No such file"; if (sft.getMessage() != null && sft.getMessage().contains(exp)) { - debugLog.printRTAriDebug(fn, "No files found -- Continue"); + DebugLog.printRTAriDebug(fn, "No files found -- Continue"); } else { - debugLog.printRTAriDebug(fn, "Exception while sftp.rm " + sft.getMessage()); + DebugLog.printRTAriDebug(fn, "Exception while sftp.rm " + sft.getMessage()); sft.printStackTrace(); throw sft; } } sftp.put(is, fullPathDest, ChannelSftp.OVERWRITE); - debugLog.printRTAriDebug(fn, "Sent successfully"); + DebugLog.printRTAriDebug(fn, "Sent successfully"); } catch (Exception e) { - debugLog.printRTAriDebug(fn, "Caught an Exception, e=" + e); + DebugLog.printRTAriDebug(fn, "Caught an Exception, e=" + e); throw new IOException(e.toString()); } finally { - if(sftpSession != null) { + if (sftpSession != null) { sftpSession.disconnect(); } } @@ -1087,7 +1032,7 @@ public class SshJcraftWrapper { String fn = "SshJcraftWrapper.get"; Session sftpSession = null; try { - debugLog.printRTAriDebug(fn, "userName=" + userName + " hostName=" + hostName + " passWord=" + passWord); + DebugLog.printRTAriDebug(fn, "userName=" + userName + " hostName=" + hostName + " passWord=" + passWord); jsch = new JSch(); sftpSession = jsch.getSession(userName, hostName, 22); java.util.Properties config = new java.util.Properties(); @@ -1097,19 +1042,19 @@ public class SshJcraftWrapper { sftpSession.setUserInfo(ui); sftpSession.setConfig(config); sftpSession.connect(30 * 1000); - debugLog.printRTAriDebug(fn, "Opening up an sftp channel...."); + DebugLog.printRTAriDebug(fn, "Opening up an sftp channel...."); ChannelSftp sftp = (ChannelSftp) sftpSession.openChannel("sftp"); - debugLog.printRTAriDebug(fn, "Connecting...."); + DebugLog.printRTAriDebug(fn, "Connecting...."); sftp.connect(); InputStream in = sftp.get(fullFilePathName); String sftpFileString = readInputStreamAsString(in); - debugLog.printRTAriDebug(fn, "Retreived successfully"); + DebugLog.printRTAriDebug(fn, "Retreived successfully"); return sftpFileString; } catch (Exception e) { - debugLog.printRTAriDebug(fn, "Caught an Exception, e=" + e); + DebugLog.printRTAriDebug(fn, "Caught an Exception, e=" + e); throw new IOException(e.toString()); } finally { - if(sftpSession != null) { + if (sftpSession != null) { sftpSession.disconnect(); } } @@ -1117,56 +1062,68 @@ public class SshJcraftWrapper { public String send(String cmd, String delimiter) throws IOException { String fn = "SshJcraftWrapper.send"; - OutputStream out = channel.getOutputStream(); - DataOutputStream dos = new DataOutputStream(out); - if ((cmd.charAt(cmd.length() - 1) != '\n') && (cmd.charAt(cmd.length() - 1) != '\r')) { - cmd += "\n"; + try (OutputStream os = channel.getOutputStream(); DataOutputStream dos = new DataOutputStream(os)) { + sendSshCommand(cmd, dos); + String response = receiveUntil(delimiter, 300000, cmd); + DebugLog.printRTAriDebug(fn, "Leaving method"); + return response; + } catch (IOException e) { + DebugLog.printRTAriDebug(fn, "Caught an IOException. e=" + e); + dbLog.outputStackTrace(e); + throw new IOException(e.toString()); } - int length = cmd.length(); - int i = -1; - int nchars = 300000; - int ncharsTotalSent = 0; - int ncharsSent = 0; - - debugLog.printRTAriDebug(fn, "Length of cmd is:" + length); // 2,937,706 - debugLog.printRTAriDebug(fn, "Length of cmd is:" + length); // 2,937,706 - try { - if (length > 600000) { - int timeout = 9000; - for (i = 0; i < length; i += nchars) { - String Cmd = cmd.substring(i, Math.min(length, i + nchars)); - ncharsSent = Cmd.length(); - ncharsTotalSent = ncharsTotalSent + Cmd.length(); - debugLog.printRTAriDebug(fn, "i=" + i + " Sending Cmd: ncharsSent=" + ncharsSent); - dos.writeBytes(Cmd); - dos.flush(); - try { - debugLog.printRTAriDebug(fn, ":::i=" + i + " length=" + length); - if (ncharsSent < length) { - receiveUntilBufferFlush(ncharsSent, timeout, "buffer flush i=" + i); - } else { - debugLog.printRTAriDebug(fn, "i=" + i + " No Waiting this time...."); - dos.flush(); - } - } catch (Exception e) { - debugLog.printRTAriDebug(fn, "Caught an Exception: Nothing to flush out."); + } + + private void sendSshCommand(@Nonnull String originalCommand, @Nonnull DataOutputStream channelOutputStream) + throws IOException { + String fn = "SshJcraftWrapper.sendSshCommand"; + String command = enhanceCommandWithEOL(originalCommand); + int length = command.length(); + int charsChunkSize = 300000; + int charsTotalSent = 0; + + appendToFile(debugLogFileName, fn + ": Sending: '" + command); + DebugLog.printRTAriDebug(fn, "Length of command is:" + length); // 2,937,706 + if (isCmdLengthEnoughToSendInChunks(length, charsChunkSize)) { + int timeout = 9000; + for (int i = 0; i < length; i += charsChunkSize) { + String commandChunk = command.substring(i, Math.min(length, i + charsChunkSize)); + int numCharsSentInChunk = commandChunk.length(); + charsTotalSent = charsTotalSent + commandChunk.length(); + DebugLog.printRTAriDebug(fn, "i=" + i + " Sending command: ncharsSent=" + numCharsSentInChunk); + channelOutputStream.writeBytes(commandChunk); + channelOutputStream.flush(); + try { + DebugLog.printRTAriDebug(fn, ":::i=" + i + " length=" + length); + if (numCharsSentInChunk < length) { + receiveUntilBufferFlush(numCharsSentInChunk, timeout, "buffer flush i=" + i); + } else { + DebugLog.printRTAriDebug(fn, "i=" + i + " No Waiting this time...."); + channelOutputStream.flush(); } + } catch (Exception e) { + DebugLog.printRTAriDebug(fn, "Caught an Exception: Nothing to flush out."); } - } else { - debugLog.printRTAriDebug(fn, "Before executing the dos.writeBytes"); - dos.writeBytes(cmd); } - dos.flush(); - // Now lets get the response. - String response = receiveUntil(delimiter, 300000, cmd); - debugLog.printRTAriDebug(fn, "Leaving method"); - return (response); - } catch (IOException e) { - debugLog.printRTAriDebug(fn, "Caught an IOException. e=" + e); - throw new IOException(e.toString()); + } else { + DebugLog.printRTAriDebug(fn, "Before executing the channelOutputStream.writeBytes"); + channelOutputStream.writeBytes(command); } + channelOutputStream.flush(); + DebugLog.printRTAriDebug(fn, "Leaving method"); + appendToFile(debugLogFileName, fn + ": Leaving method\n"); } + private boolean isCmdLengthEnoughToSendInChunks(int length, int chunkSize) { + return length > 2 * chunkSize; + } + private String enhanceCommandWithEOL(@Nonnull String originalCommand) { + char commandEnding = originalCommand.charAt(originalCommand.length() - 1); + if (commandEnding != '\n' && commandEnding != '\r') { + return originalCommand + "\n"; + } + return originalCommand; + } } |