X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=appc-config%2Fappc-config-adaptor%2Fprovider%2Fsrc%2Fmain%2Fjava%2Forg%2Fonap%2Fappc%2Fccadaptor%2FSshJcraftWrapper.java;h=82133876828a78d63f292f004d79cbeb5aeed168;hb=refs%2Fheads%2Fmaster;hp=acdb87b90635f82af9415f9ae47d28e23a5957dc;hpb=31b71128c229a12845e94139108a1696ec26de61;p=appc.git 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 acdb87b90..821338768 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 @@ -2,10 +2,14 @@ * ============LICENSE_START======================================================= * ONAP : APPC * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Copyright (C) 2017 Amdocs - * ============================================================================= + * ================================================================================ + * Modifications Copyright (C) 2018 Ericsson + * ================================================================================ + * Modifications Copyright (c) 2019 IBM + * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -18,14 +22,11 @@ * See the License for the specific language governing permissions and * limitations under the License. * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. * ============LICENSE_END========================================================= */ package org.onap.appc.ccadaptor; -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.ChannelShell; @@ -55,31 +56,30 @@ 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 { - private static final EELFLogger log = EELFManager.getInstance().getLogger(SshJcraftWrapper.class); - - private static final int BUFFER_SIZE = 512000; - 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"; + InputStream inputStream = null; + OutputStream outputStream = null; + DebugLog debugLog = new DebugLog(); + private String debugLogFileName = "/tmp/sshJcraftWrapperDebug"; private TelnetListener listener = null; private String routerLogFileName = null; + private String host = null; private String routerName = null; - private char[] charBuffer = new char[BUFFER_SIZE]; + private int bufferSize = 512000; + char[] charBuffer = new char[bufferSize]; + private DataInputStream dis = null; private BufferedReader reader = null; private BufferedWriter out = 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"; private String routerFileName = null; private File jcraftReadSwConfigFileFromDisk = new File("/tmp/jcraftReadSwConfigFileFromDisk"); @@ -87,38 +87,51 @@ 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 SshJcraftWrapper() { - this.jsch = new JSch(); - } - - SshJcraftWrapper(JSch jsch) { - this.jsch = jsch; + String fn = "SshJcraftWrapper.SshJcraftWrapper"; + DebugLog.printRTAriDebug(fn, "SshJcraftWrapper has been instantated"); + routerLogFileName = "/tmp/" + host; } public void connect(String hostname, String username, String password, String prompt, int timeOut) throws IOException { - log.debug("Attempting to connect to {0} username={1} prompt='{2}' timeOut={3}", - hostname, username, prompt, timeOut); + String fn = "SshJcraftWrapper.connect"; + jsch = getJSch(); + DebugLog.printRTAriDebug(fn, + "Attempting to connect to " + hostname + " username=" + username + " prompt='" + + prompt + "' timeOut=" + timeOut); + DebugLog.printRTAriDebug(fn, "Trace A"); routerName = hostname; hostName = hostname; userName = username; passWord = password; try { - 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); + 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), bufferSize); channel.connect(); - log.info("Successfully connected. 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 (IOException e) { - log.warn("Caught an Exception: Nothing to flush out.", e); + } catch (Exception e) { + DebugLog.printRTAriDebug(fn, "Caught an Exception: Nothing to flush out."); } - } catch (JSchException e) { - log.error("Could not connect to host=" + hostname, e); + } catch (Exception e) { + DebugLog.printRTAriDebug(fn, "Caught an Exception. e=" + e); throw new IOException(e.toString()); } } @@ -126,40 +139,65 @@ public class SshJcraftWrapper { // User specifies the port number. public void connect(String hostname, String username, String password, String prompt, int timeOut, int portNum) throws IOException { - log.debug("Attempting to connect to {0} username={1} prompt='{2}' timeOut={3} portNum={4}", - hostname, username, prompt, timeOut, portNum); + String fn = "SshJcraftWrapper.connect"; + DebugLog.printRTAriDebug(fn, + ":Attempting to connect to " + hostname + " username=" + username + " prompt='" + + prompt + "' timeOut=" + timeOut + " portNum=" + portNum); routerName = hostname; hostName = hostname; userName = username; passWord = password; + routerName = hostname; + jsch = getJSch(); try { - channel = provideSessionChannel(CHANNEL_SHELL_TYPE, portNum, timeOut); - ((ChannelShell) channel).setPtyType(TERMINAL_BASIC_MODE); - reader = new BufferedReader(new InputStreamReader(new DataInputStream(channel.getInputStream())), BUFFER_SIZE); + session = jsch.getSession(username, hostname, portNum); + UserInfo ui = new MyUserInfo(); + session.setPassword(password); + session.setUserInfo(ui); + session.setConfig("StrictHostKeyChecking", "no"); + DebugLog.printRTAriDebug(fn, ":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), bufferSize); channel.connect(); - log.info("Successfully connected. Flushing input buffer."); + DebugLog.printRTAriDebug(fn, ":Successfully connected."); + DebugLog.printRTAriDebug(fn, ":Flushing input buffer"); try { - if ("]]>]]>".equals(prompt)) { + if (prompt.equals("]]>]]>")) { receiveUntil("]]>]]>", 10000, "No cmd was sent, just waiting"); } else { receiveUntil(":~#", 5000, "No cmd was sent, just waiting"); } - } catch (IOException e) { - log.warn("Caught an Exception: Nothing to flush out.", e); + } catch (Exception e) { + DebugLog.printRTAriDebug(fn, "Caught an Exception::: Nothing to flush out."); } - } catch (JSchException e) { - log.error("Could not connect to host=" + hostname, e); + } catch (Exception e) { + DebugLog.printRTAriDebug(fn, ":Caught an Exception. e=" + e); + dbLog.outputStackTrace(e); + throw new IOException(e.toString()); } } - public String receiveUntil(String delimeters, int timeout, String cmdThatWasSent) throws IOException { + public String receiveUntil(String delimeters, int timeout, String cmdThatWasSent) + throws TimedOutException, IOException { + String fn = "SshJcraftWrapper.receiveUntil"; boolean match = false; boolean cliPromptCmd = false; - StringBuilder sb = new StringBuilder(); - StringBuilder sbReceive = new StringBuilder(); - log.debug("delimeters='{0}' timeout={1} cmdThatWasSent='{2}'", delimeters, timeout, cmdThatWasSent); + StringBuffer sb2 = new StringBuffer(); + StringBuffer sbReceive = new StringBuffer(); + DebugLog.printRTAriDebug(fn, + "delimeters='" + delimeters + "' timeout=" + timeout + " cmdThatWasSent='" + cmdThatWasSent + "'"); + appendToFile(debugLogFileName, + fn + " delimeters='" + delimeters + "' timeout=" + timeout + " cmdThatWasSent='" + cmdThatWasSent + "'\n"); + String CmdThatWasSent = removeWhiteSpaceAndNewLineCharactersAroundString(cmdThatWasSent); int readCounts = 0; aggregatedReceivedString = ""; FileWriter fileWriter = null; @@ -169,19 +207,21 @@ public class SshJcraftWrapper { session.setTimeout(timeout); // This is the socket timeout value. while (!match) { if (new Date().getTime() > deadline) { - String formattedCmd = removeWhiteSpaceAndNewLineCharactersAroundString(cmdThatWasSent); - log.error("Routine has timed out: routerName={0} CmdThatWasSent={1}", routerName, formattedCmd); - throw new TimedOutException("Routine has timed out"); + 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 { - Thread.sleep(500); + delay(500); } catch (java.lang.InterruptedException ee) { Thread.currentThread().interrupt(); } - int len = reader.read(charBuffer, 0, BUFFER_SIZE); - log.trace("After reader. Read command len={0}", len); + int len = reader.read(charBuffer, 0, bufferSize); + appendToFile(debugLogFileName, fn + " After reader.read cmd: len=" + len + "\n"); if (len <= 0) { - log.error("Reader failed to read any bytes. Suspected socket timeout, router={0}", 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) { @@ -190,7 +230,7 @@ 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; - log.debug("IOS XR upload for software config: timeout={0}", timeout); + DebugLog.printRTAriDebug(fn, "IOS XR upload for software config: timeout=" + timeout); StringTokenizer st = new StringTokenizer(cmdThatWasSent); st.nextToken(); routerFileName = st.nextToken(); @@ -198,16 +238,17 @@ public class SshJcraftWrapper { out = new BufferedWriter(fileWriter); routerLogFileName = "/tmp/" + routerName; tmpFile = new File(routerLogFileName); - log.debug("Prepared for writing swConfigFile to disk, routerFileName=" + routerFileName); + DebugLog.printRTAriDebug(fn, + "Will write the swConfigFile to disk, routerFileName=" + routerFileName); } out.write(charBuffer, 0, len); out.flush(); - log.debug("{0} bytes has been written to the disk", len); + appendToFile(debugLogFileName, fn + " Wrote " + len + " bytes to the disk\n"); if (tmpFile.exists()) { appendToRouterFile(routerLogFileName, len); } match = checkIfReceivedStringMatchesDelimeter(len, "\nXML>"); - if (match) { + if (match == true) { out.flush(); out.close(); out = null; @@ -215,81 +256,76 @@ public class SshJcraftWrapper { } } else { readCounts++; - log.debug("Reader read {0} of data within {1} read iteration", len, readCounts); + appendToFile(debugLogFileName, + fn + " readCounts=" + readCounts + " Reader read " + len + " of data\n"); int c; - sb.setLength(0); + sb2.setLength(0); for (int i = 0; i < len; i++) { c = charBuffer[i]; if ((c != 7) && (c != 13) && (c != 0) && (c != 27)) { - sbReceive.append(charBuffer[i]); - sb.append(charBuffer[i]); + sbReceive.append((char) charBuffer[i]); + sb2.append((char) charBuffer[i]); } } appendToRouterFile("/tmp/" + routerName, len); if (listener != null) { - listener.receivedString(sb.toString()); + listener.receivedString(sb2.toString()); } - match = checkIfReceivedStringMatchesDelimeter(delimeters, sb.toString(), cmdThatWasSent); - if (match) { - log.trace("Match was true, breaking the loop."); + + appendToFile(debugLogFileName, fn + " Trace 1\n"); + match = checkIfReceivedStringMatchesDelimeter(delimeters, sb2.toString(), cmdThatWasSent); + appendToFile(debugLogFileName, fn + " Trace 2\n"); + if (match == true) { + appendToFile(debugLogFileName, fn + " Match was true, breaking...\n"); break; } } - } else { - log.trace("cliPromptCmd"); - sb.setLength(0); - for (int i = 0; i < len; i++) { - sbReceive.append(charBuffer[i]); - sb.append(charBuffer[i]); - } - appendToRouterFile("/tmp/" + routerName, sb); - if (listener != null) { - listener.receivedString(sb.toString()); - } - log.debug("sb2={0} delimiters={1}", sb.toString(), delimeters); - if (sb.toString().contains("\nariPrompt>")) { - log.debug("Found ari prompt"); - break; - } } } } catch (JSchException e) { - log.error("JSchException occurred", e); - throw new TimedOutException(e.getMessage()); - } catch (IOException e) { - log.error("IOException occurred", e); - throw new TimedOutException(e.getMessage()); + 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()); + dbLog.outputStackTrace(ee); + throw new TimedOutException(ee.toString()); } finally { try { if (fileWriter != null) { fileWriter.close(); } - } catch (IOException ex) { - log.warn("Failed to close fileWriter output stream", ex); + } catch(IOException ex) { + DebugLog.printRTAriDebug(fn, "Failed to close fileWriter output stream: ex=" + ex); } } - return stripOffCmdFromRouterResponse(sbReceive.toString()); + String result = stripOffCmdFromRouterResponse(sbReceive.toString()); + DebugLog.printRTAriDebug(fn, "Leaving method successfully"); + return result; } public boolean checkIfReceivedStringMatchesDelimeter(String delimeters, String receivedString, String cmdThatWasSent) { // The delimeters are in a '|' seperated string. Return true on the first match. - log.debug("Entered checkIfReceivedStringMatchesDelimeter: delimeters={0} cmdThatWasSent={1} receivedString={2}", - delimeters, cmdThatWasSent, receivedString); + String fn = "SshJcraftWrapper.checkIfReceivedStringMatchesDelimeter"; + appendToFile(debugLogFileName, + fn + " Entered: delimeters='" + delimeters + " cmdThatWasSent='" + cmdThatWasSent + "' receivedString='" + + receivedString + "'\n"); StringTokenizer st = new StringTokenizer(delimeters, "|"); - if ((delimeters.contains("#$")) || ("CLI".equals(routerCmdType))) // This would be an IOS XR, CLI command. + if ((delimeters.indexOf("#$") != -1) || (routerCmdType.equals("CLI"))) // This would be an IOS XR, CLI command. { - int x = receivedString.lastIndexOf('#'); + int x = receivedString.lastIndexOf("#"); int y = receivedString.length() - 1; - log.debug("IOS XR, CLI command"); - if (log.isTraceEnabled()) { - log.trace("cmdThatWasSent={0}, lastIndexOf hash delimiter={1}, maxIndexNum={2}", cmdThatWasSent, x, y); + appendToFile(debugLogFileName, fn + " IOS XR, CLI command\n"); + if (extraDebugFile.exists()) { + appendToFile(debugLogFileName, + fn + " :::cmdThatWasSent='" + cmdThatWasSent + "' x=" + x + " y=" + y + "\n"); } return (x != -1) && (y == x); } - if (cmdThatWasSent.contains("show config")) { - log.trace("In the block for 'show config'"); + if (cmdThatWasSent.indexOf("show config") != -1) { + appendToFile(debugLogFileName, fn + "In the block for 'show config'\n"); while (st.hasMoreTokens()) { String delimeter = st.nextToken(); // Make sure we don't get faked out by a response of " #". @@ -298,165 +334,212 @@ public class SshJcraftWrapper { // LAAR2# int x = receivedString.lastIndexOf(delimeter); if ((receivedString.lastIndexOf(delimeter) != -1) && (receivedString.lastIndexOf(" #") != x - 1)) { - log.debug("receivedString={0}", receivedString); - log.trace("Found ending for 'show config' command, exiting."); - return true; + appendToFile(debugLogFileName, fn + "receivedString=\n'" + receivedString + "'\n"); + appendToFile(debugLogFileName, + fn + "Returning true for the 'show config' command. We found our real delmeter. \n\n"); + return (true); } } } else { aggregatedReceivedString = aggregatedReceivedString + receivedString; - appendToFile("/tmp/aggregatedReceivedString.debug", aggregatedReceivedString); + _appendToFile("/tmp/aggregatedReceivedString.debug", aggregatedReceivedString); - log.debug("receivedString={0}", receivedString); while (st.hasMoreTokens()) { String delimeter = st.nextToken(); - log.debug("Looking for an delimiter of:{0}", delimeter); + appendToFile(debugLogFileName, fn + " Looking for an delimeter of:'" + delimeter + "'\n"); + appendToFile(debugLogFileName, fn + " receivedString='" + receivedString); if (aggregatedReceivedString.indexOf(delimeter) != -1) { - log.debug("Found delimiter={0}, exiting", delimeter); + DebugLog.printRTAriDebug(fn, "Found our delimeter, which was: '" + delimeter + "'"); aggregatedReceivedString = ""; - return true; + return (true); } } } - return false; + return (false); } public boolean checkIfReceivedStringMatchesDelimeter(int len, String delimeter) { + String fnName = "SshJcraftWrapper.checkIfReceivedStringMatchesDelimeter:::"; int x; int c; String str = StringUtils.EMPTY; if (jcraftReadSwConfigFileFromDisk()) { - log.trace("jcraftReadSwConfigFileFromDisk block"); + DebugLog.printAriDebug(fnName, "jcraftReadSwConfigFileFromDisk block"); File fileName = new File(routerFileName); - log.debug("jcraftReadSwConfigFileFromDisk::: Will read the tail end of the file from the disk"); + appendToFile(debugLogFileName, + fnName + " jcraftReadSwConfigFileFromDisk::: Will read the tail end of the file from the disk"); try { str = getLastFewLinesOfFile(fileName, 3); } catch (IOException e) { - log.warn("IOException occurred, while reading file=" + fileName, e); + DebugLog.printAriDebug(fnName, "Caught an Exception, e=" + e); + dbLog.outputStackTrace(e); } } else { // When looking at the end of the charBuffer, don't include any linefeeds or spaces. We only want to make the smallest string possible. for (x = len - 1; x >= 0; x--) { c = charBuffer[x]; + if (extraDebugFile.exists()) { + appendToFile(debugLogFileName, fnName + " x=" + x + " c=" + c + "\n"); + } if ((c != 10) && (c != 32)) // Not a line feed nor a space. { break; } } if ((x + 1 - 13) >= 0) { - str = new String(charBuffer, x + 1 - 13, 13); - log.debug("str:{0}", str); + str = new String(charBuffer, (x + 1 - 13), 13); + appendToFile(debugLogFileName, fnName + " str:'" + str + "'\n"); } else { File fileName = new File(routerFileName); - log.debug("Will read the tail end of the file from the disk, x={0} len={1} str={2} routerFileName={3}", - x, len, str, routerFileName); + appendToFile(debugLogFileName, + fnName + " Will read the tail end of the file from the disk, x=" + x + " len=" + len + " str::'" + + str + "' routerFileName='" + routerFileName + "'\n"); + DebugLog.printAriDebug(fnName, + "Will read the tail end of the file from the disk, x=" + x + " len=" + len + " str::'" + str + + "' routerFileName='" + routerFileName + "'"); try { str = getLastFewLinesOfFile(fileName, 3); } catch (IOException e) { - log.warn("IOException occurred, while reading file=" + fileName, e); + DebugLog.printAriDebug(fnName, "Caught an Exception, e=" + e); + dbLog.outputStackTrace(e); } } } - log.debug("Parsed string was str='{0}', searched delimiter was {1}"); - return str.contains(delimeter); - } - - public void closeConnection() { - log.info("Closing connection"); - 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; + if (str.indexOf(delimeter) != -1) { + DebugLog.printAriDebug(fnName, "str in break is:'" + str + "'" + " delimeter='" + delimeter + "'"); + appendToFile(debugLogFileName, + fnName + " str in break is:'" + str + " delimeter='" + delimeter + "'" + "'\n"); + return (true); + } else { + appendToFile(debugLogFileName, fnName + " Returning false"); + return (false); } + } - boolean isConnected() { - return (channel != null && session != null); + public void closeConnection() { + String fn = "SshJcraftWrapper.closeConnection"; + DebugLog.printRTAriDebug(fn, "Executing the closeConnection...."); + inputStream = null; + outputStream = null; + dis = null; + charBuffer = null; + session.disconnect(); + session = null; } public void send(String cmd) throws IOException { - try (OutputStream os = channel.getOutputStream(); DataOutputStream dos = new DataOutputStream(os)) { - sendSshCommand(cmd, dos); + String fn = "SshJcraftWrapper.send"; + OutputStream out = channel.getOutputStream(); + DataOutputStream dos = getDataOutputStream(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, "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"); } catch (IOException e) { - log.error("IOException occurred while sending command=" + cmd, e); - throw e; + DebugLog.printRTAriDebug(fn, "Caught an IOException. e=" + e); + dbLog.outputStackTrace(e); + throw new IOException(e.toString()); } } + public void sendChar(int v) throws IOException { - try (OutputStream os = channel.getOutputStream(); DataOutputStream dos = new DataOutputStream(os)) { - if (log.isTraceEnabled()) { - log.trace("Sending charCode: {0}", v); - } + String fn = "SshJcraftWrapper.sendChar"; + OutputStream out = channel.getOutputStream(); + DataOutputStream dos = getDataOutputStream(out); + try { + DebugLog.printRTAriDebug(fn, "Sending: '" + v + "'"); dos.writeChar(v); dos.flush(); } catch (IOException e) { - log.error("IOException occurred while writing char to channel output stream", e); - throw e; + DebugLog.printRTAriDebug(fn, "Caught an IOException. e=" + e); + throw new IOException(e.toString()); } } public void send(byte[] b, int off, int len) throws IOException { - try (OutputStream os = channel.getOutputStream(); DataOutputStream dos = new DataOutputStream(os)) { + String fn = "SshJcraftWrapper.send:byte[]"; + OutputStream out = channel.getOutputStream(); + DataOutputStream dos = getDataOutputStream(out); + try { dos.write(b, off, len); dos.flush(); } catch (IOException e) { - log.error("IOException occurred while writing bytes to channel output stream", e); - throw e; + DebugLog.printRTAriDebug(fn, "Caught an IOException. e=" + e); + throw new IOException(e.toString()); } } public static class MyUserInfo implements UserInfo, UIKeyboardInteractive { - @Override public String getPassword() { return null; } - @Override public boolean promptYesNo(String str) { return false; } - @Override public String getPassphrase() { return null; } - @Override public boolean promptPassphrase(String message) { return false; } - @Override public boolean promptPassword(String message) { return false; } - @Override public void showMessage(String message) { - //stub } - @Override public String[] promptKeyboardInteractive(String destination, String name, String instruction, String[] prompt, boolean[] echo) { - return new String[0]; + return null; } } @@ -464,111 +547,168 @@ public class SshJcraftWrapper { this.listener = listener; } - private void appendToFile(String fileName, String dataToWrite) { - File outputFile = new File(fileName); - if (outputFile.exists()) { - try (FileWriter fw = new FileWriter(fileName, true); BufferedWriter ow = new BufferedWriter(fw)) { - ow.write(dataToWrite); - ow.close(); - } catch (IOException e) { - log.error("IOException occurred while writing to file=" + fileName, e); + public void appendToFile(String fileName, String dataToWrite) { + String fn = "SshJcraftWrapper.appendToFile"; + + 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. + File tmpFile = new File(fileName); + if (tmpFile.exists()) { + try(BufferedWriter out = new BufferedWriter(new FileWriter(fileName, true))) { + out.write(getTheDate() + ": " + tId + ": " + dataToWrite); + } } + } catch (IOException e) { + DebugLog.printRTAriDebug(fn, "Caught an IOException: e=" + e); + } catch (Exception e) { + DebugLog.printRTAriDebug(fn, "Caught an Exception: e=" + e); } } + public void _appendToFile(String fileName, String dataToWrite) { + String fn = "SshJcraftWrapper.appendToFile"; + + 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. + File tmpFile = new File(fileName); + if (tmpFile.exists()) { + try(BufferedWriter out = new BufferedWriter(new FileWriter(fileName, true))) { + out.write(dataToWrite); + } + } + } catch (IOException e) { + DebugLog.printRTAriDebug(fn, "Caught an IOException: e=" + e); + } catch (Exception e) { + DebugLog.printRTAriDebug(fn, "Caught an Exception: e=" + e); + } + } + + public String getTheDate() { - DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy H:mm:ss "); - return dateFormat.format(Calendar.getInstance().getTime()); + Calendar cal = Calendar.getInstance(); + java.util.Date today = cal.getTime(); + DateFormat df3 = new SimpleDateFormat("MM/dd/yyyy H:mm:ss "); + return (df3.format(today)); } - public void appendToRouterFile(String fileName, StringBuilder dataToWrite) { - appendToFile(fileName, dataToWrite.toString()); + public void appendToRouterFile(String fileName, StringBuffer dataToWrite) { + String fnName = "SshJcraftWrapper.appendToRouterFile"; + 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. + File tmpFile = new File(fileName); + { + if (tmpFile.exists()) { + try(BufferedWriter out = new BufferedWriter(new FileWriter(fileName, true))) { + out.write(dataToWrite.toString()); + } + } + } + } catch (IOException e) { + DebugLog.printAriDebug(fnName, "writeToFile() exception:, e=" + e); + dbLog.outputStackTrace(e); + } } public void appendToRouterFile(String fileName, int len) { - File outputFile = new File(fileName); - if (outputFile.exists()) { - try (FileWriter fw = new FileWriter(fileName, true); BufferedWriter ow = new BufferedWriter(fw)) { - ow.write(charBuffer, 0, len); - ow.close(); - } catch (IOException e) { - log.error("IOException occurred while writing to router file=" + fileName, e); + 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. + File tmpFile = new File(fileName); + if (tmpFile.exists()) { + try(BufferedWriter out = new BufferedWriter(new FileWriter(fileName, true))) { + out.write(charBuffer, 0, len); + } } + } catch (IOException e) { + dbLog.outputStackTrace(e); } } public String removeWhiteSpaceAndNewLineCharactersAroundString(String str) { - if (str != null && !StringUtils.EMPTY.equals(str)) { + if (str != null) { StringTokenizer strTok = new StringTokenizer(str, "\n"); - StringBuilder sb = new StringBuilder(); + StringBuffer sb = new StringBuffer(); while (strTok.hasMoreTokens()) { String line = strTok.nextToken(); sb.append(line); } - return sb.toString().trim(); + return (sb.toString().trim()); + } else { + return (str); } - return StringUtils.EMPTY; } public String stripOffCmdFromRouterResponse(String routerResponse) { // The session of SSH will echo the command sent to the router, in the router's response. // Since all our commands are terminated by a '\n', strip off the first line - // of the response from the router. This first line contains the orginal command. + // of the response from the router. This first line contains the original command. + StringTokenizer rr = new StringTokenizer(routerResponse, "\n"); - StringBuilder sb = new StringBuilder(); + StringBuffer sb = new StringBuffer(); int numTokens = rr.countTokens(); if (numTokens > 1) { - rr.nextToken(); //Skip the first line. while (rr.hasMoreTokens()) { - sb.append(rr.nextToken()).append("\n"); + sb.append(rr.nextToken() + '\n'); } } - return sb.toString(); + return (sb.toString()); } public void setRouterCommandType(String type) { + String fn = "SshJcraftWrapper.setRouterCommandType"; this.routerCmdType = type; - log.debug("Router command type is set to: {0}", type); + DebugLog.printRTAriDebug(fn, "Setting routerCmdType to a value of '" + type + "'"); } public String getLastFewLinesOfFile(File file, int linesToRead) throws IOException { - RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r"); - int lines = 0; - StringBuilder builder = new StringBuilder(); + String fn = "SshJcraftWrapper.getLastFewLinesOfFile"; String tail = ""; - long length = file.length(); - length--; - randomAccessFile.seek(length); - for (long seek = length; seek >= 0; --seek) { - randomAccessFile.seek(seek); - char c = (char) randomAccessFile.read(); - builder.append(c); - if (c == '\n') { - builder = builder.reverse(); - tail = builder.toString() + tail; - lines++; - builder.setLength(0); - if (lines == linesToRead) { - break; + try(RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r")) { + int lines = 0; + StringBuilder builder = new StringBuilder(); + long length = file.length(); + length--; + randomAccessFile.seek(length); + for (long seek = length; seek >= 0; --seek) { + randomAccessFile.seek(seek); + char c = (char) randomAccessFile.read(); + builder.append(c); + if (c == '\n') { + builder = builder.reverse(); + tail = builder.toString() + tail; + lines++; + builder.setLength(0); + if (lines == linesToRead) { + break; + } } } } - randomAccessFile.close(); - if (log.isDebugEnabled()) { - log.debug("Content read from file={0} was tail={1}", file.getName(), tail); + if (!jcraftReadSwConfigFileFromDisk()) { + DebugLog.printRTAriDebug(fn, "tail='" + tail + "'"); } + appendToFile(debugLogFileName, "tail='" + tail + "'\n"); return tail; } public boolean jcraftReadSwConfigFileFromDisk() { - return jcraftReadSwConfigFileFromDisk.exists(); + if (jcraftReadSwConfigFileFromDisk.exists()) { + return (true); + } else { + return (false); + } } public String getEquipNameCode() { - return equipNameCode; + return (equipNameCode); + } public void setEquipNameCode(String equipNameCode) { @@ -576,14 +716,17 @@ public class SshJcraftWrapper { } public String getRouterName() { - return routerName; + return (routerName); } // Routine does reads until it has read 'nchars' or times out. - public void receiveUntilBufferFlush(int ncharsSent, int timeout, String message) throws IOException { - log.debug("ncharsSent={0}, timeout={1}, message={2}", ncharsSent, timeout, message); + public void receiveUntilBufferFlush(int ncharsSent, int timeout, String message) + throws TimedOutException, IOException { + String fn = "SshJcraftWrapper.receiveUntilBufferFlush"; + DebugLog.printRTAriDebug(fn, "ncharsSent=" + ncharsSent + " timeout=" + timeout + " " + message); int ncharsTotalReceived = 0; int ncharsRead = 0; + charactersFromBufferFlush.setLength(0); long deadline = new Date().getTime() + timeout; logMemoryUsage(); @@ -591,107 +734,96 @@ public class SshJcraftWrapper { session.setTimeout(timeout); // This is the socket timeout value. while (true) { if (new Date().getTime() > deadline) { - log.error("Routine has timed out: ncharsSent={0}, ncharsTotalReceived={1}", ncharsSent, - ncharsTotalReceived); - throw new TimedOutException("Routine has timed out"); + DebugLog.printRTAriDebug(fn, + "Throwing a TimedOutException: time in routine has exceed our deadline: ncharsSent=" + + ncharsSent + " ncharsTotalReceived=" + ncharsTotalReceived); + throw new TimedOutException("Timeout: time in routine has exceed our deadline"); } - ncharsRead = reader.read(charBuffer, 0, BUFFER_SIZE); + ncharsRead = reader.read(charBuffer, 0, bufferSize); if (listener != null) { listener.receivedString(String.copyValueOf(charBuffer, 0, ncharsRead)); } appendToRouterFile("/tmp/" + routerName, ncharsRead); ncharsTotalReceived = ncharsTotalReceived + ncharsRead; if (ncharsTotalReceived >= ncharsSent) { - log.debug("Received the correct number of characters, ncharsSent={0}, ncharsTotalReceived={1}", - ncharsSent, ncharsTotalReceived); + DebugLog.printRTAriDebug(fn, + "Received the correct number of characters, ncharsSent=" + ncharsSent + " ncharsTotalReceived=" + + ncharsTotalReceived); logMemoryUsage(); return; } } } catch (JSchException e) { - log.error("JSchException occurred while command sending", e); - log.debug("ncharsSent={0}, ncharsTotalReceived={1}, ncharsRead={2} until error occurred", - ncharsSent, ncharsTotalReceived, ncharsRead); - throw new TimedOutException(e.getMessage()); + DebugLog.printRTAriDebug(fn, "Caught an JSchException e=" + e); + DebugLog.printRTAriDebug(fn, + "ncharsSent=" + ncharsSent + " ncharsTotalReceived=" + ncharsTotalReceived + " ncharsRead=" + + ncharsRead); + throw new TimedOutException(e.toString()); } } public String getHostName() { - return hostName; + return (hostName); } public String getUserName() { - return userName; + return (userName); } public String getPassWord() { - return passWord; + return (passWord); } - public void sftpPutFile(String sourcePath, String destDirectory) throws IOException { - try { - Session sftpSession = jsch.getSession(userName, hostName, DEFAULT_PORT); - UserInfo ui = new MyUserInfo(); - sftpSession.setPassword(passWord); - sftpSession.setUserInfo(ui); - sftpSession.connect(30 * 1000); - ChannelSftp sftp = (ChannelSftp) sftpSession.openChannel("sftp"); - sftp.connect(); - log.debug("Sending via sftp from source: {0} to destination: {1}", sourcePath, destDirectory); - sftp.put(sourcePath, destDirectory, ChannelSftp.OVERWRITE); - sftpSession.disconnect(); - } catch (JSchException ex) { - log.error("JSchException occurred while handling sftp session", ex); - throw new IOException(ex.getMessage()); - } catch (SftpException ex) { - log.error("SftpException occurred during file transfer", ex); - throw new IOException(ex.getMessage()); - } + public void sftpPut(String sourcePath, String destDirectory) throws IOException { + // delegate to duplicate method + put(sourcePath, destDirectory); } - public void sftpPutStringData(String stringOfData, String fullPathDest) throws IOException { + + public void SftpPut(String stringOfData, String fullPathDest) throws IOException { + String fn = "SshJcraftWrapper.Sftp"; try { - Session sftpSession = jsch.getSession(userName, hostName, DEFAULT_PORT); + Session sftpSession = jsch.getSession(userName, hostName, 22); UserInfo ui = new MyUserInfo(); sftpSession.setPassword(passWord); sftpSession.setUserInfo(ui); sftpSession.connect(30 * 1000); + DebugLog.printRTAriDebug(fn, "Opening up an sftp channel...."); ChannelSftp sftp = (ChannelSftp) sftpSession.openChannel("sftp"); + DebugLog.printRTAriDebug(fn, "Connecting...."); sftp.connect(); InputStream is = new ByteArrayInputStream(stringOfData.getBytes()); - log.debug("Sending via sftp stringOfData to destination: {0}", fullPathDest); + DebugLog.printRTAriDebug(fn, "Sending stringOfData --> " + fullPathDest); sftp.put(is, fullPathDest, ChannelSftp.OVERWRITE); + DebugLog.printRTAriDebug(fn, "Sent successfully"); sftpSession.disconnect(); - } catch (JSchException ex) { - log.error("JSchException occurred while handling sftp session", ex); - throw new IOException(ex.getMessage()); - } catch (SftpException ex) { - log.error("SftpException occurred during data transfer", ex); - throw new IOException(ex.getMessage()); + } catch (Exception e) { + DebugLog.printRTAriDebug(fn, "Caught an Exception, e=" + e); + throw new IOException(e.toString()); } } public String sftpGet(String fullFilePathName) throws IOException { + String fn = "SshJcraftWrapper.Sftp"; try { - Session sftpSession = jsch.getSession(userName, hostName, DEFAULT_PORT); + Session sftpSession = jsch.getSession(userName, hostName, 22); UserInfo ui = new MyUserInfo(); sftpSession.setPassword(passWord); sftpSession.setUserInfo(ui); sftpSession.connect(30 * 1000); + DebugLog.printRTAriDebug(fn, "Opening up an sftp channel...."); ChannelSftp sftp = (ChannelSftp) sftpSession.openChannel("sftp"); + DebugLog.printRTAriDebug(fn, "Connecting...."); sftp.connect(); - InputStream in = sftp.get(fullFilePathName); + InputStream in = null; + in = sftp.get(fullFilePathName); String sftpFileString = readInputStreamAsString(in); - log.debug("Received data via sftp connection sftpFileString={0} from fullFilePathName={1}", - sftpFileString, fullFilePathName); + DebugLog.printRTAriDebug(fn, "Retreived successfully"); sftpSession.disconnect(); - return sftpFileString; - } catch (JSchException ex) { - log.error("JSchException occurred while handling sftp session", ex); - throw new IOException(ex.getMessage()); - } catch (SftpException ex) { - log.error("SftpException occurred during data transfer", ex); - throw new IOException(ex.getMessage()); + return (sftpFileString); + } catch (Exception e) { + DebugLog.printRTAriDebug(fn, "Caught an Exception, e=" + e); + throw new IOException(e.toString()); } } @@ -709,138 +841,182 @@ public class SshJcraftWrapper { public void logMemoryUsage() { + String fn = "SshJcraftWrapper.logMemoryUsage"; int mb = 1024 * 1024; long usedMemory; - long maxMemoryAvailable; - long memoryLeftOnHeap; - maxMemoryAvailable =runtime.maxMemory() / mb; - usedMemory = (runtime.totalMemory() / mb) - (runtime.freeMemory() / mb); - memoryLeftOnHeap = maxMemoryAvailable - usedMemory; - log.info("Memory usage: maxMemoryAvailable={0}, usedMemory={1}, memoryLeftOnHeap={2}", - maxMemoryAvailable, usedMemory, memoryLeftOnHeap); + long maxMemoryAdvailable; + long memoryLetfOnHeap; + maxMemoryAdvailable = (runtime.maxMemory() / mb); + usedMemory = ((runtime.totalMemory() / mb) - (runtime.freeMemory() / mb)); + memoryLetfOnHeap = maxMemoryAdvailable - usedMemory; + DebugLog.printAriDebug(fn, + "maxMemoryAdvailable=" + maxMemoryAdvailable + " usedMemory=" + usedMemory + " memoryLetfOnHeap=" + + memoryLetfOnHeap); } - public void connect(String hostname, String username, String password, int timeOut, int portNum, + // ---------------------------------------------------------------------------- + // ---------------------------------------------------------------------------- + // ---------------------------------------------------------------------------- + // ---------------------------------------------------------------------------- + + + // 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"; - if (log.isDebugEnabled()) { - log.debug( - "Attempting to connect to {0} username={1} timeOut={2} portNum={3} subsystem={4}", - hostname, username, timeOut, portNum, subsystem); - } - this.routerName = hostname; - this.hostName = hostname; - this.userName = username; - this.passWord = password; + DebugLog.printRTAriDebug(fn, + ":::Attempting to connect to " + hostname + " username=" + username + " prompt='" + + prompt + "' timeOut=" + timeOut + " portNum=" + portNum + " subsystem=" + subsystem); + routerName = hostname; + jsch = getJSch(); try { - channel = provideSessionChannel(CHANNEL_SUBSYSTEM_TYPE, portNum, timeOut); + 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"); ((ChannelSubsystem) channel).setSubsystem(subsystem); - ((ChannelSubsystem) channel).setPty(true); //expected ptyType vt102 - 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()); + ((ChannelSubsystem) channel).setPty(true); + + inputStream = channel.getInputStream(); + dis = new DataInputStream(inputStream); + reader = new BufferedReader(new InputStreamReader(dis), bufferSize); + channel.connect(); + DebugLog.printRTAriDebug(fn, "Successfully connected."); + DebugLog.printRTAriDebug(fn, "Five second sleep...."); + try { + delay(5000); + } catch (java.lang.InterruptedException ee) { + Thread.currentThread().interrupt(); + } + } catch (Exception e) { + DebugLog.printRTAriDebug(fn, "Caught an Exception. e=" + e); + throw new IOException(e.toString()); } } - 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; + public void connect(String hostName, String username, String password, int portNumber) throws IOException { + String fn = "SshJcraftWrapper.connect"; + jsch = getJSch(); + DebugLog.printRTAriDebug(fn, + "::Attempting to connect to " + hostName + " username=" + username + " portNumber=" + portNumber); + DebugLog.printRTAriDebug(fn, "Trace C"); + routerName = hostName; this.hostName = hostName; - this.userName = username; - this.passWord = password; + userName = username; + passWord = password; try { - 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); + 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), bufferSize); channel.connect(); + 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) { - log.warn("Caught an Exception: Nothing to flush out.", e); + DebugLog.printRTAriDebug(fn, "Caught an Exception::: Nothing to flush out."); } - } catch (JSchException e) { - log.error("JschException occurred ", e); - throw new IOException(e.getMessage()); + } catch (Exception e) { + DebugLog.printRTAriDebug(fn, "Caught an Exception. e=" + e); + throw new IOException(e.toString()); } } public void put(String sourcePath, String destDirectory) throws IOException { + String fn = "SshJcraftWrapper.sftp"; try { - Session sftpSession = jsch.getSession(userName, hostName, DEFAULT_PORT); + Session sftpSession = jsch.getSession(userName, hostName, 22); UserInfo ui = new MyUserInfo(); sftpSession.setPassword(passWord); sftpSession.setUserInfo(ui); sftpSession.connect(30 * 1000); + DebugLog.printRTAriDebug(fn, "Opening up an sftp channel...."); ChannelSftp sftp = (ChannelSftp) sftpSession.openChannel("sftp"); + DebugLog.printRTAriDebug(fn, "Connecting...."); sftp.connect(); - log.debug("Sending via sftp from source: {0} to destination: {1}", sourcePath, destDirectory); + DebugLog.printRTAriDebug(fn, "Sending " + sourcePath + " --> " + destDirectory); sftp.put(sourcePath, destDirectory, ChannelSftp.OVERWRITE); + DebugLog.printRTAriDebug(fn, "Sent successfully"); sftpSession.disconnect(); - } catch (JSchException ex) { - log.error("JSchException occurred while handling sftp session", ex); - throw new IOException(ex.getMessage()); - } catch (SftpException ex) { - log.error("SftpException occurred during file transfer", ex); - throw new IOException(ex.getMessage()); + } catch (Exception e) { + DebugLog.printRTAriDebug(fn, "Caught an Exception, e=" + e); + throw new IOException(e.toString()); } } public void put(InputStream is, String fullPathDest, String hostName, String userName, String passWord) throws IOException { + String fn = "SshJcraftWrapper.put"; Session sftpSession = null; try { - log.debug("Sftp put invoked, connection details: username={1} hostname={2}", - userName, hostName); - jsch = new JSch(); + DebugLog.printRTAriDebug(fn, "userName=" + userName + " hostName=" + hostName); + jsch = getJSch(); java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking", "no"); - sftpSession = jsch.getSession(userName, hostName, DEFAULT_PORT); + sftpSession = jsch.getSession(userName, hostName, 22); UserInfo ui = new MyUserInfo(); sftpSession.setPassword(passWord); sftpSession.setUserInfo(ui); sftpSession.setConfig(config); sftpSession.connect(30 * 1000); + DebugLog.printRTAriDebug(fn, "Opening up an sftp channel...."); ChannelSftp sftp = (ChannelSftp) sftpSession.openChannel("sftp"); + DebugLog.printRTAriDebug(fn, "Connecting...."); sftp.connect(); String oldFiles = fullPathDest + "*"; - log.debug("Deleting old files: {0}", oldFiles); + DebugLog.printRTAriDebug(fn, "Deleting old files --> " + oldFiles); try { sftp.rm(oldFiles); - } catch (SftpException ex) { + DebugLog.printRTAriDebug(fn, "Sending stringOfData --> " + fullPathDest); + } catch (SftpException sft) { String exp = "No such file"; - if (ex.getMessage() != null && ex.getMessage().contains(exp)) { - log.warn("No files found, continue"); + if (sft.getMessage() != null && sft.getMessage().contains(exp)) { + DebugLog.printRTAriDebug(fn, "No files found -- Continue"); } else { - log.error("SftpException while invoking rm command over sftp", ex); - throw ex; + DebugLog.printRTAriDebug(fn, "Exception while sftp.rm " + sft.getMessage()); + throw sft; } } - log.debug("Sending stringOfData to destination {0}", fullPathDest); sftp.put(is, fullPathDest, ChannelSftp.OVERWRITE); - } catch (JSchException ex) { - log.error("JSchException occurred while handling sftp session", ex); - throw new IOException(ex.getMessage()); - } catch (SftpException ex) { - log.error("SftpException occurred during file transfer", ex); - throw new IOException(ex.getMessage()); + DebugLog.printRTAriDebug(fn, "Sent successfully"); + } catch (Exception e) { + DebugLog.printRTAriDebug(fn, "Caught an Exception, e=" + e); + throw new IOException(e.toString()); } finally { - if (sftpSession != null) { + if(sftpSession != null) { sftpSession.disconnect(); } } } + public String get(String fullFilePathName, String hostName, String userName, String passWord) throws IOException { + String fn = "SshJcraftWrapper.get"; 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, DEFAULT_PORT); + DebugLog.printRTAriDebug(fn, "userName=" + userName + " hostName=" + hostName); + jsch = getJSch(); + sftpSession = jsch.getSession(userName, hostName, 22); java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking", "no"); UserInfo ui = new MyUserInfo(); @@ -848,87 +1024,85 @@ public class SshJcraftWrapper { sftpSession.setUserInfo(ui); sftpSession.setConfig(config); sftpSession.connect(30 * 1000); + DebugLog.printRTAriDebug(fn, "Opening up an sftp channel...."); ChannelSftp sftp = (ChannelSftp) sftpSession.openChannel("sftp"); + DebugLog.printRTAriDebug(fn, "Connecting...."); sftp.connect(); InputStream in = sftp.get(fullFilePathName); - return readInputStreamAsString(in); - } catch (JSchException ex) { - log.error("JSchException occurred while handling sftp session", ex); - throw new IOException(ex.getMessage()); - } catch (SftpException ex) { - log.error("SftpException occurred during file transfer", ex); - throw new IOException(ex.getMessage()); + String sftpFileString = readInputStreamAsString(in); + DebugLog.printRTAriDebug(fn, "Retreived successfully"); + return sftpFileString; + } catch (Exception e) { + DebugLog.printRTAriDebug(fn, "Caught an Exception, e=" + e); + throw new IOException(e.toString()); } finally { - if (sftpSession != null) { + if(sftpSession != null) { sftpSession.disconnect(); } } } public String send(String cmd, String delimiter) throws IOException { - try (OutputStream os = channel.getOutputStream(); DataOutputStream dos = new DataOutputStream(os)) { - sendSshCommand(cmd, dos); - return receiveUntil(delimiter, 300000, cmd); - } catch (IOException ex) { - log.error("IOException occurred", ex); - throw new IOException(ex.getMessage()); + String fn = "SshJcraftWrapper.send"; + OutputStream out = channel.getOutputStream(); + DataOutputStream dos = getDataOutputStream(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; - private void sendSshCommand(@Nonnull String originalCommand, @Nonnull DataOutputStream channelOutputStream) - throws IOException { - String command = enhanceCommandWithEOL(originalCommand); - int length = command.length(); // 2,937,706 - int charsChunkSize = 300000; - int charsTotalSent = 0; - - log.debug("Sending ssh command: length={0}, payload: {1}", length, command); - 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(); - log.debug("Iteration nr:{0}, sending command chunk: {1}", i, numCharsSentInChunk); - channelOutputStream.writeBytes(commandChunk); - channelOutputStream.flush(); - try { - if (numCharsSentInChunk < length) { - receiveUntilBufferFlush(numCharsSentInChunk, timeout, "buffer flush i=" + i); - } else { - log.trace("i={0}, flush immediately", i); - channelOutputStream.flush(); + 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."); } - } catch (IOException ex) { - log.warn("IOException occurred: nothing to flush out", ex); } + } else { + DebugLog.printRTAriDebug(fn, "Before executing the dos.writeBytes"); + dos.writeBytes(cmd); } - } else { - channelOutputStream.writeBytes(command); + 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()); } - channelOutputStream.flush(); } - private boolean isCmdLengthEnoughToSendInChunks(int length, int chunkSize) { - return length > 2 * chunkSize; + protected JSch getJSch() { + return new JSch(); } - private String enhanceCommandWithEOL(@Nonnull String originalCommand) { - char commandEnding = originalCommand.charAt(originalCommand.length() - 1); - if (commandEnding != '\n' && commandEnding != '\r') { - return originalCommand + "\n"; - } - return originalCommand; + protected DataOutputStream getDataOutputStream(OutputStream out) { + return new DataOutputStream(out); } - 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); + protected void delay(int milliseconds) throws InterruptedException { + Thread.sleep(5000); } }