diff options
author | Balaji, Ramya (rb111y) <rb111y@att.com> | 2018-04-03 22:30:22 -0400 |
---|---|---|
committer | Takamune Cho <tc012c@att.com> | 2018-04-04 16:05:53 +0000 |
commit | 12800890db0f5922d6108920036df850d92ed930 (patch) | |
tree | 67bf17fac21f6b04588b042bae1d1d08b6ee0e9a /appc-config/appc-config-adaptor/provider/src/main | |
parent | 68c95691b62a334e4d98ca32c6fbd1046e3270a6 (diff) |
Restoring to previous known working version
Discovered muliple issues in the refactored code in these files
that has caused failure in existing flow and blocks regression
and new feature testing.Reverted class files and UT case files.
Issue-ID: APPC-827
Change-Id: I2bdd7f54ab919d0e16c79820ebe0ee4e13dbba03
Signed-off-by: Balaji, Ramya (rb111y) <rb111y@att.com>
Diffstat (limited to 'appc-config/appc-config-adaptor/provider/src/main')
3 files changed, 1606 insertions, 1249 deletions
diff --git a/appc-config/appc-config-adaptor/provider/src/main/java/org/onap/appc/ccadaptor/ConfigComponentAdaptor.java b/appc-config/appc-config-adaptor/provider/src/main/java/org/onap/appc/ccadaptor/ConfigComponentAdaptor.java index 415642521..f433fc0b1 100644 --- a/appc-config/appc-config-adaptor/provider/src/main/java/org/onap/appc/ccadaptor/ConfigComponentAdaptor.java +++ b/appc-config/appc-config-adaptor/provider/src/main/java/org/onap/appc/ccadaptor/ConfigComponentAdaptor.java @@ -2,7 +2,7 @@ * ============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. * ============================================================================= * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ * 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========================================================= */ @@ -47,798 +46,790 @@ import org.onap.ccsdk.sli.core.sli.SvcLogicContext; public class ConfigComponentAdaptor implements SvcLogicAdaptor { - private static final EELFLogger log = EELFManager.getInstance().getLogger(ConfigComponentAdaptor.class); - - private static final String ACTION_PARAM = "action"; - private static final String ACTION_PREPARE = "prepare"; - private static final String ACTION_ACTIVATE = "activate"; - - private static final String KEY_PUT = "put"; - private static final String KEY_GET = "get"; - private static final String KEY_CLI = "cli"; - private static final String KEY_ESCAPE_SQL = "escapeSql"; - private static final String KEY_XML_DOWNLOAD = "xml-download"; - private static final String KEY_XML_GET_RUNNING_CONF = "xml-getrunningconfig"; - private static final String KEY_DOWNLOAD_CLI_CONFIG = "DownloadCliConfig"; - private static final String KEY_GET_CLI_RUNNING_CONFIG = "GetCliRunningConfig"; - - private static final String OPERATION_CREATE = "create"; - private static final String OPERATION_CHANGE = "change"; - private static final String OPERATION_SCALE = "scale"; - - static final String USERNAME_PARAM = "User_name"; - static final String PASSWORD_PARAM = "Password"; - static final String HOST_IP_PARAM = "Host_ip_address"; - static final String PORT_NUMBER_PARAM = "Port_number"; - static final String GET_CONFIG_TEMPLATE_PARAM = "Get_config_template"; - - private static final String CLI_OUTPUT_PARAM = "cliOutput"; - private static final String REQUEST_ID_PARAM = "request-id"; - private static final String CALLBACK_URL_PARAM = "callback-url"; - private static final String EQUIPMENT_NAME_PARAM = "equipment-name"; - - private static final String XML_BUILDING_ERR_STR = "Error building the XML request: "; - private static final String TEMPLATE_ERR_STR = "Template error: Matching \"}\" not found"; - private static final String SSH_JCRAFT_WRAPPER_ERR_STR = "Exception occurred while using sshJcraftWrapper"; - private static final String PROMPT_STR = "]]>]]>"; - private static final String RESPONSE_STR = "response=\n{}\n"; - - private static final String SERVICE_INSTANCE_ID_ATTR = "service-data.service-information.service-instance-id"; - private static final String SVC_REQUEST_ID_ATTR = "service-data.appc-request-header.svc-request-id"; - - private static final String RPC_REPLY_END_TAG = "</rpc-reply>"; - private static final String BASE_REQUEST = "BASE"; - - private String configUrl; - private String configUser; - private String configPassword; - private String auditUrl; - private String auditUser; - private String auditPassword; - private String configCallbackUrl; - private String auditCallbackUrl; - - public ConfigComponentAdaptor(Properties props) { - if (props != null) { - configUrl = props.getProperty("configComponent.url", ""); - configUser = props.getProperty("configComponent.user", ""); - configPassword = props.getProperty("configComponent.passwd", ""); - auditUrl = props.getProperty("auditComponent.url", ""); - auditUser = props.getProperty("auditComponent.user", ""); - auditPassword = props.getProperty("auditComponent.passwd", ""); - configCallbackUrl = props.getProperty("service-configuration-notification-url", ""); - auditCallbackUrl = props.getProperty("audit-configuration-notification-url", ""); - } +private static final EELFLogger log = EELFManager.getInstance().getLogger(ConfigComponentAdaptor.class); +DebugLog debugLog = new DebugLog(); +private String configUrl = null; +private String configUser = null; +private String configPassword = null; +private String auditUrl = null; +private String auditUser = null; +private String auditPassword = null; +private String configCallbackUrl = null; +private String auditCallbackUrl = null; + +public ConfigComponentAdaptor(Properties props) { + if (props != null) { + configUrl = props.getProperty("configComponent.url", ""); + configUser = props.getProperty("configComponent.user", ""); + configPassword = props.getProperty("configComponent.passwd", ""); + auditUrl = props.getProperty("auditComponent.url", ""); + auditUser = props.getProperty("auditComponent.user", ""); + auditPassword = props.getProperty("auditComponent.passwd", ""); + configCallbackUrl = props.getProperty("service-configuration-notification-url", ""); + auditCallbackUrl = props.getProperty("audit-configuration-notification-url", ""); + } else { + configUrl = ""; + configUser = ""; + configPassword = ""; + auditUrl = ""; + auditUser = ""; + auditPassword = ""; + configCallbackUrl = ""; + auditCallbackUrl = ""; } +} - @Override - public ConfigStatus configure(String key, Map<String, String> parameters, SvcLogicContext ctx) { - HttpResponse r = new HttpResponse(); - r.code = 200; - log.debug("ConfigComponentAdaptor.configure - key = " + key); - log.debug("key = {}", key); - log.debug("Parameters:"); - for (Entry<String, String> paramEntrySet : parameters.entrySet()) { - log.debug(" {} = {}", paramEntrySet.getKey(), paramEntrySet.getValue()); - } - - String parmval = parameters.get("config-component-configUrl"); - if (!nullOrEmpty(parmval)) { - log.debug("Overwriting URL with {}", parmval); - configUrl = parmval; - } +@Override +public ConfigStatus configure(String key, Map<String, String> parameters, SvcLogicContext ctx) { + String fnName = "ConfigComponentAdaptor.configure"; + HttpResponse r = new HttpResponse(); + r.code = 200; + log.debug("ConfigComponentAdaptor.configure - key = " + key); + debugLog.printRTAriDebug(fnName, "key = " + key); + log.debug("Parameters:"); + debugLog.printRTAriDebug(fnName, "Parameters:"); + for (String parmName : parameters.keySet()) { + log.debug(" " + parmName + " = " + parameters.get(parmName)); + debugLog.printRTAriDebug(fnName, " " + parmName + " = " + parameters.get(parmName)); + } - parmval = parameters.get("config-component-configPassword"); - if (!nullOrEmpty(parmval)) { - log.debug("Overwriting configPassword with {}", parmval); - configPassword = parmval; - } + String parmval = parameters.get("config-component-configUrl"); + if ((parmval != null) && (parmval.length() > 0)) { + log.debug("Overwriting URL with " + parmval); + configUrl = parmval; + } - parmval = parameters.get("config-component-configUser"); - if (!nullOrEmpty(parmval)) { - log.debug("Overwriting configUser id with {}", parmval); - configUser = parmval; - } + parmval = parameters.get("config-component-configPassword"); + if ((parmval != null) && (parmval.length() > 0)) { + log.debug("Overwriting configPassword with " + parmval); + configPassword = parmval; + } - String action = parameters.get(ACTION_PARAM); + parmval = parameters.get("config-component-configUser"); + if ((parmval != null) && (parmval.length() > 0)) { + log.debug("Overwriting configUser id with " + parmval); + configUser = parmval; + } - String chg = ctx.getAttribute( - "service-data.vnf-config-parameters-list.vnf-config-parameters[0].update-configuration[0].block-key-name"); - if (chg != null && areEqual(action, ACTION_PREPARE)) { - return prepare(ctx, "CHANGE", OPERATION_CHANGE); - } - if (chg != null && areEqual(action, ACTION_ACTIVATE)) { - return activate(ctx, true); - } + String action = parameters.get("action"); - String scale = ctx.getAttribute( - "service-data.vnf-config-parameters-list.vnf-config-parameters[0].scale-configuration[0].network-type"); - if (scale != null && areEqual(action, ACTION_PREPARE)) { - return prepare(ctx, "CHANGE", OPERATION_SCALE); - } - if (scale != null && areEqual(action, ACTION_ACTIVATE)) { - return activate(ctx, true); - } - - if (areEqual(action, ACTION_PREPARE)) { - return prepare(ctx, BASE_REQUEST, OPERATION_CREATE); - } - if (areEqual(action, ACTION_ACTIVATE)) { - return activate(ctx, false); - } + String chg = ctx.getAttribute( + "service-data.vnf-config-parameters-list.vnf-config-parameters[0].update-configuration[0].block-key-name"); + if (chg != null && "prepare".equalsIgnoreCase(action)) { + return prepare(ctx, "CHANGE", "change"); + } + if (chg != null && "activate".equalsIgnoreCase(action)) { + return activate(ctx, true); + } - if ("backup".equalsIgnoreCase(action)) { - return prepare(ctx, "BACKUP", "backup"); - } - if ("restorebackup".equalsIgnoreCase(action)) { - return prepare(ctx, "RESTOREBACKUP", "restorebackup"); - } - if ("deletebackup".equalsIgnoreCase(action)) { - return prepare(ctx, "DELETEBACKUP", "deletebackup"); - } - if ("audit".equalsIgnoreCase(action)) { - return audit(ctx, "FULL"); - } - if ("getrunningconfig".equalsIgnoreCase(action)) { - return audit(ctx, "RUNNING"); - } + String scale = ctx.getAttribute( + "service-data.vnf-config-parameters-list.vnf-config-parameters[0].scale-configuration[0].network-type"); + if (scale != null && "prepare".equalsIgnoreCase(action)) { + return prepare(ctx, "CHANGE", "scale"); + } + if (scale != null && "activate".equalsIgnoreCase(action)) { + return activate(ctx, true); + } - if ((key.equals(KEY_PUT)) || (key.equals(KEY_GET))) { - String loginId = parameters.get("loginId"); - String host = parameters.get("host"); - String password = parameters.get("password"); - password = EncryptionTool.getInstance().decrypt(password); - String fullPathFileName = parameters.get("fullPathFileName"); + if ("prepare".equalsIgnoreCase(action)) { + return prepare(ctx, "BASE", "create"); + } + if ("activate".equalsIgnoreCase(action)) { + return activate(ctx, false); + } - SshJcraftWrapper sshJcraftWrapper = new SshJcraftWrapper(); - log.debug("SCP: SshJcraftWrapper has been instantiated"); + if ("backup".equalsIgnoreCase(action)) { + return prepare(ctx, "BACKUP", "backup"); + } + if ("restorebackup".equalsIgnoreCase(action)) { + return prepare(ctx, "RESTOREBACKUP", "restorebackup"); + } + if ("deletebackup".equalsIgnoreCase(action)) { + return prepare(ctx, "DELETEBACKUP", "deletebackup"); + } + if ("audit".equalsIgnoreCase(action)) { + return audit(ctx, "FULL"); + } + if ("getrunningconfig".equalsIgnoreCase(action)) { + return audit(ctx, "RUNNING"); + } - try { - if (key.equals(KEY_PUT)) { - String data = parameters.get("data"); - log.debug("Command is for put: Length of data is: {}", data.length()); + if ((key.equals("put")) || (key.equals("get"))) { + String loginId = parameters.get("loginId"); + String host = parameters.get("host"); + String password = parameters.get("password"); + password = EncryptionTool.getInstance().decrypt(password); + String fullPathFileName = parameters.get("fullPathFileName"); + String data = null; + + SshJcraftWrapper sshJcraftWrapper = new SshJcraftWrapper(); + log.debug("SCP: SshJcraftWrapper has been instantiated"); + debugLog.printRTAriDebug(fnName, "SCP: SshJcraftWrapper has been instantiated"); + try { + if (key.equals("put")) { + data = parameters.get("data"); + if (data != null) { + debugLog.printRTAriDebug(fnName, "Command is for put: Length of data is: " + data.length()); InputStream is = new ByteArrayInputStream(data.getBytes()); - log.debug("SCP: Doing a put: fullPathFileName={}", fullPathFileName); + log.debug("SCP: Doing a put: fullPathFileName=" + fullPathFileName); + debugLog.printRTAriDebug(fnName, "SCP: Doing a put: fullPathFileName=" + fullPathFileName); sshJcraftWrapper.put(is, fullPathFileName, host, loginId, password); - trySleepFor(1000L * 180); - } else { // Must be a get - log.debug("SCP: Doing a get: fullPathFileName={}", fullPathFileName); - String response = sshJcraftWrapper.get(fullPathFileName, host, loginId, password); - log.debug("Got the response and putting into the ctx object"); - ctx.setAttribute("fileContents", response); - log.debug("SCP: Closing the SFTP connection"); + try { + debugLog.printRTAriDebug(fnName, "Sleeping for 180 seconds...."); + Thread.sleep(1000 * 180); + debugLog.printRTAriDebug(fnName, "Woke up...."); + } catch (java.lang.InterruptedException ee) { + boolean ignore = true; + } + } else { + r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; + log.debug(fnName + " Command is for put: data is null"); } - return setResponseStatus(ctx, r); - } catch (IOException e) { - log.error(SSH_JCRAFT_WRAPPER_ERR_STR, e); - r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; - r.message = e.getMessage(); - return setResponseStatus(ctx, r); - } - } - if (key.equals(KEY_CLI)) { - String loginId = parameters.get("loginId"); - String host = parameters.get("host"); - String password = parameters.get("password"); - password = EncryptionTool.getInstance().decrypt(password); - String portNumber = parameters.get("portNumber"); - SshJcraftWrapper sshJcraftWrapper = new SshJcraftWrapper(); - try { - log.debug("CLI: Attempting to login: host={} loginId={} password={} portNumber={}", host, loginId, - password, portNumber); - sshJcraftWrapper.connect(host, loginId, password); //what about portNum? - - log.debug("Sending 'sdc'"); - sshJcraftWrapper.send("sdc", ":"); - log.debug("Sending 1"); - sshJcraftWrapper.send("1", ":"); - log.debug("Sending 1, the second time"); - sshJcraftWrapper.send("1", "#"); - log.debug("Sending paging-options disable"); - sshJcraftWrapper.send("paging-options disable", "#"); - log.debug("Sending show config"); - String response = sshJcraftWrapper.send("show config", "#"); - - log.debug("response is now:'{}'", response); - log.debug("Populating the ctx object with the response"); - ctx.setAttribute(CLI_OUTPUT_PARAM, response); - sshJcraftWrapper.closeConnection(); - r.code = 200; - return setResponseStatus(ctx, r); - } catch (IOException e) { - log.error(SSH_JCRAFT_WRAPPER_ERR_STR, e); - sshJcraftWrapper.closeConnection(); - r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; - r.message = e.getMessage(); - return setResponseStatus(ctx, r); + } else // Must be a get + { + log.debug("SCP: Doing a get: fullPathFileName=" + fullPathFileName); + debugLog.printRTAriDebug(fnName, "SCP: Doing a get: fullPathFileName=" + fullPathFileName); + String response = sshJcraftWrapper.get(fullPathFileName, host, loginId, password); + debugLog.printRTAriDebug(fnName, "Got the response and putting into the ctx object"); + ctx.setAttribute("fileContents", response); + log.debug("SCP: Closing the SFTP connection"); } + sshJcraftWrapper = null; + return (setResponseStatus(ctx, r)); + } catch (IOException e) { + DebugLog.printAriDebug(fnName, "Caught a IOException e=" + e); + log.debug(fnName + " : Caught a IOException e=" + e); + r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; + r.message = e.getMessage(); + sshJcraftWrapper = null; + return (setResponseStatus(ctx, r)); } - if (key.equals(KEY_ESCAPE_SQL)) { - String data = parameters.get("artifactContents"); - log.debug("ConfigComponentAdaptor.configure - escapeSql"); - data = escapeMySql(data); - ctx.setAttribute("escapedData", data); - return setResponseStatus(ctx, r); + } + if (key.equals("cli")) { + String loginId = parameters.get("loginId"); + String host = parameters.get("host"); + String password = parameters.get("password"); + password = EncryptionTool.getInstance().decrypt(password); + String cliCommand = parameters.get("cli"); + String portNumber = parameters.get("portNumber"); + SshJcraftWrapper sshJcraftWrapper = new SshJcraftWrapper(); + try { + log.debug("CLI: Attempting to login: host=" + host + " loginId=" + loginId + + " portNumber=" + portNumber); + debugLog.printRTAriDebug(fnName, "CLI: Attempting to login: host=" + host + " loginId=" + loginId + + " portNumber=" + portNumber); + sshJcraftWrapper.connect(host, loginId, password, Integer.parseInt(portNumber)); + + DebugLog.printAriDebug(fnName, "Sending 'sdc'"); + String response = sshJcraftWrapper.send("sdc", ":"); + DebugLog.printAriDebug(fnName, "Sending 1"); + response = sshJcraftWrapper.send("1", ":"); + DebugLog.printAriDebug(fnName, "Sending 1, the second time"); + response = sshJcraftWrapper.send("1", "#"); + DebugLog.printAriDebug(fnName, "Sending paging-options disable"); + response = sshJcraftWrapper.send("paging-options disable", "#"); + DebugLog.printAriDebug(fnName, "Sending show config"); + response = sshJcraftWrapper.send("show config", "#"); + + DebugLog.printAriDebug(fnName, "response is now:'" + response + "'"); + DebugLog.printAriDebug(fnName, "Populating the ctx object with the response"); + ctx.setAttribute("cliOutput", response); + sshJcraftWrapper.closeConnection(); + r.code = 200; + sshJcraftWrapper = null; + return (setResponseStatus(ctx, r)); + } catch (IOException e) { + DebugLog.printAriDebug(fnName, "Caught a IOException e=" + e); + log.debug(fnName + " : Caught a IOException e=" + e); + sshJcraftWrapper.closeConnection(); + r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; + r.message = e.getMessage(); + sshJcraftWrapper = null; + DebugLog.printAriDebug(fnName, "Returning error message"); + return (setResponseStatus(ctx, r)); } - if (key.equals(KEY_GET_CLI_RUNNING_CONFIG)) { - log.debug("key was: " + KEY_GET_CLI_RUNNING_CONFIG); - String username = parameters.get(USERNAME_PARAM); - String hostIpAddress = parameters.get(HOST_IP_PARAM); - String password = parameters.get(PASSWORD_PARAM); - password = EncryptionTool.getInstance().decrypt(password); - String portNumber = parameters.get(PORT_NUMBER_PARAM); - String getConfigTemplate = parameters.get(GET_CONFIG_TEMPLATE_PARAM); - SshJcraftWrapper sshJcraftWrapper = new SshJcraftWrapper(); - log.debug("GetCliRunningConfig: sshJcraftWrapper was instantiated"); + } + if (key.equals("escapeSql")) { + String data = parameters.get("artifactContents"); + log.debug("ConfigComponentAdaptor.configure - escapeSql"); + data = escapeMySql(data); + ctx.setAttribute("escapedData", data); + return (setResponseStatus(ctx, r)); + } + if (key.equals("GetCliRunningConfig")) { + debugLog.printRTAriDebug(fnName, "key was: GetCliRunningConfig: "); + log.debug("key was: GetCliRunningConfig: "); + String User_name = parameters.get("User_name"); + String Host_ip_address = parameters.get("Host_ip_address"); + String Password = parameters.get("Password"); + Password = EncryptionTool.getInstance().decrypt(Password); + String Port_number = parameters.get("Port_number"); + String Get_config_template = parameters.get("Get_config_template"); + SshJcraftWrapper sshJcraftWrapper = new SshJcraftWrapper(); + log.debug("GetCliRunningConfig: sshJcraftWrapper was instantiated"); + debugLog.printRTAriDebug(fnName, "GetCliRunningConfig: sshJcraftWrapper was instantiated"); + try { + DebugLog.printAriDebug(fnName, "GetCliRunningConfig: User_name=" + User_name + + " Host_ip_address=" + Host_ip_address + " Port_number=" + + Port_number); + log.debug("GetCliRunningConfig: Attempting to login: Host_ip_address=" + Host_ip_address + + " User_name=" + User_name + " Port_number=" + Port_number); + StringBuffer sb = new StringBuffer(); + String response = ""; + String CliResponse = ""; + boolean showConfigFlag = false; + sshJcraftWrapper.connect(Host_ip_address, + User_name, + Password, + "", + 30000, + Integer.parseInt(Port_number)); + DebugLog.printAriDebug(fnName, "GetCliRunningConfig: On the VNF device"); + StringTokenizer st = new StringTokenizer(Get_config_template, "\n"); + String command = null; try { - log.debug("GetCliRunningConfig: Attempting to login: Host_ip_address=" + hostIpAddress + " User_name=" - + username + " Password=" + password + " Port_number=" + portNumber); - - boolean showConfigFlag = false; - sshJcraftWrapper - .connect(hostIpAddress, username, password, "", 30000, Integer.parseInt(portNumber)); - log.debug("GetCliRunningConfig: On the VNF device"); - StringTokenizer st = new StringTokenizer(getConfigTemplate, "\n"); - String command = null; - - StringBuilder cliResponse = new StringBuilder(); - - // shouldn't this be used somewhere? - StringBuilder response = new StringBuilder(); - - try { - while (st.hasMoreTokens()) { - String line = st.nextToken(); - log.debug("line={}", line); - if (line.contains("Request:")) { - log.debug("Found a Request line: line={}", line); - command = getStringBetweenQuotes(line); - log.debug("Sending command={}", command); - sshJcraftWrapper.send(command); - log.debug("command has been sent"); - if (line.contains("show config")) { - showConfigFlag = true; - log.debug("GetCliRunningConfig: GetCliRunningConfig: setting 'showConfigFlag' to true"); - } + while (st.hasMoreTokens()) { + String line = st.nextToken(); + DebugLog.printAriDebug(fnName, "line=" + line); + if (line.indexOf("Request:") != -1) { + DebugLog.printAriDebug(fnName, "Found a Request line: line=" + line); + command = getStringBetweenQuotes(line); + DebugLog.printAriDebug(fnName, "Sending command=" + command); + sshJcraftWrapper.send(command); + DebugLog.printAriDebug(fnName, "command has been sent"); + if (line.indexOf("show config") != -1) { + showConfigFlag = true; + DebugLog.printAriDebug(fnName, "GetCliRunningConfig: setting 'showConfigFlag' to true"); + log.debug("GetCliRunningConfig: GetCliRunningConfig: setting 'showConfigFlag' to true"); } - if (line.contains("Response: Ends_With")) { - log.debug("Found a Response line: line={}", line); - String delemeter = getStringBetweenQuotes(line); - log.debug("The delemeter={}", delemeter); - String tmpResponse = sshJcraftWrapper.receiveUntil(delemeter, 120 * 1000, command); - response.append(tmpResponse); - if (showConfigFlag) { - showConfigFlag = false; - StringTokenizer st2 = new StringTokenizer(tmpResponse, "\n"); - while (st2.hasMoreTokens()) { - String line2 = st2.nextToken(); - if (!line2.contains("#")) { - cliResponse.append(line2).append('\n'); - } + } + if (line.indexOf("Response: Ends_With") != -1) { + DebugLog.printAriDebug(fnName, "Found a Response line: line=" + line); + String delemeter = getStringBetweenQuotes(line); + DebugLog.printAriDebug(fnName, "The delemeter=" + delemeter); + String tmpResponse = sshJcraftWrapper.receiveUntil(delemeter, 30 * 1000, command); + response += tmpResponse; + if (showConfigFlag) { + showConfigFlag = false; + StringTokenizer st2 = new StringTokenizer(tmpResponse, "\n"); + // Strip off the last line which is the command prompt from the VNF device. + while (st2.hasMoreTokens()) { + String line2 = st2.nextToken(); + if (line2.indexOf("#") == -1) { + CliResponse += line2 + "\n"; } } } } - } catch (NoSuchElementException e) { - log.error(e.getMessage(), e); } - log.debug("CliResponse=\n{}", cliResponse.toString()); - ctx.setAttribute(CLI_OUTPUT_PARAM, cliResponse.toString()); - sshJcraftWrapper.closeConnection(); - r.code = 200; - return setResponseStatus(ctx, r); - } catch (IOException e) { - log.error(SSH_JCRAFT_WRAPPER_ERR_STR, e); - sshJcraftWrapper.closeConnection(); - r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; - r.message = e.getMessage(); - return setResponseStatus(ctx, r); + } catch (NoSuchElementException e) { + DebugLog.printAriDebug(fnName, "Caught a NoSuchElementException: e=" + e); } + DebugLog.printAriDebug(fnName, "CliResponse=\n" + CliResponse); + ctx.setAttribute("cliOutput", CliResponse); + sshJcraftWrapper.closeConnection(); + r.code = 200; + sshJcraftWrapper = null; + return (setResponseStatus(ctx, r)); + } catch (IOException e) { + DebugLog.printAriDebug(fnName, "GetCliRunningConfig: Caught a IOException e=" + e); + log.debug(fnName + " : GetCliRunningConfig: Caught a IOException e=" + e); + sshJcraftWrapper.closeConnection(); + r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; + r.message = e.getMessage(); + sshJcraftWrapper = null; + DebugLog.printAriDebug(fnName, "GetCliRunningConfig: Returning error message"); + return (setResponseStatus(ctx, r)); } - if (key.equals(KEY_XML_DOWNLOAD)) { - log.debug("key was: " + KEY_XML_DOWNLOAD); - String userName = parameters.get(USERNAME_PARAM); - String hostIpAddress = parameters.get(HOST_IP_PARAM); - String password = parameters.get(PASSWORD_PARAM); - password = EncryptionTool.getInstance().decrypt(password); - String portNumber = parameters.get(PORT_NUMBER_PARAM); - String contents = parameters.get("Contents"); - String netconfHelloCmd = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <hello xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n <capabilities>\n <capability>urn:ietf:params:netconf:base:1.0</capability>\n <capability>urn:com:ericsson:ebase:1.1.0</capability> </capabilities>\n </hello>"; - String terminateConnectionCmd = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <rpc message-id=\"terminateConnection\" xmlns:netconf=\"urn:ietf:params:xml:ns:netconf:base:1.0\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n <close-session/> \n </rpc>\n ]]>]]>"; - String commitCmd = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <rpc> <commit/> </rpc>\n ]]>]]>"; - - log.debug("xml-download: User_name={} Host_ip_address={} Password={} Port_number={}", userName, - hostIpAddress, password, portNumber); - SshJcraftWrapper sshJcraftWrapper = new SshJcraftWrapper(); - try { - // what about prompt "]]>]]>"? - sshJcraftWrapper - .connect(hostIpAddress, userName, password, 30000, Integer.parseInt(portNumber), "netconf"); - - netconfHelloCmd += PROMPT_STR; - log.debug("Sending the hello command"); - sshJcraftWrapper.send(netconfHelloCmd); - String response; - log.debug("Sending xmlCmd cmd"); - String messageId = "1"; - messageId = "\"" + messageId + "\""; - String loadConfigurationString = - "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=" - + messageId - + "> <edit-config> <target> <candidate /> </target> <default-operation>merge</default-operation> <config xmlns:xc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">" - + contents + "</config> </edit-config> </rpc>"; - loadConfigurationString = loadConfigurationString + PROMPT_STR; - sshJcraftWrapper.send(loadConfigurationString); - log.debug("After sending loadConfigurationString"); - response = sshJcraftWrapper.receiveUntil(RPC_REPLY_END_TAG, 600000, ""); - if (response.contains("rpc-error")) { - log.debug("Error from device: Response from device had 'rpc-error'"); - log.debug(RESPONSE_STR, response); + } + if (key.equals("xml-download")) { + log(fnName, "key was: xml-download"); + String User_name = parameters.get("User_name"); + String Host_ip_address = parameters.get("Host_ip_address"); + String Password = parameters.get("Password"); + Password = EncryptionTool.getInstance().decrypt(Password); + String Port_number = parameters.get("Port_number"); + String Contents = parameters.get("Contents"); + String netconfHelloCmd = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <hello xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n <capabilities>\n <capability>urn:ietf:params:netconf:base:1.0</capability>\n <capability>urn:com:ericsson:ebase:1.1.0</capability> </capabilities>\n </hello>"; + String terminateConnectionCmd = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <rpc message-id=\"terminateConnection\" xmlns:netconf=\"urn:ietf:params:xml:ns:netconf:base:1.0\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n <close-session/> \n </rpc>\n ]]>]]>"; + String commitCmd = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <rpc> <commit/> </rpc>\n ]]>]]>"; + + log(fnName, + "xml-download: User_name=" + User_name + " Host_ip_address=" + Host_ip_address + + " Port_number=" + Port_number); + SshJcraftWrapper sshJcraftWrapper = new SshJcraftWrapper(); + try { + sshJcraftWrapper.connect(Host_ip_address, + User_name, + Password, + "]]>]]>", + 30000, + Integer.parseInt(Port_number), + "netconf"); + String NetconfHelloCmd = netconfHelloCmd; + NetconfHelloCmd = NetconfHelloCmd + "]]>]]>"; + log(fnName, "Sending the hello command"); + sshJcraftWrapper.send(NetconfHelloCmd); + String response = sshJcraftWrapper.receiveUntil("]]>]]>", 10000, ""); + log(fnName, "Sending xmlCmd cmd"); + String xmlCmd = Contents; + String messageId = "1"; + messageId = "\"" + messageId + "\""; + String loadConfigurationString = + "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=" + + messageId + + "> <edit-config> <target> <candidate /> </target> <default-operation>merge</default-operation> <config xmlns:xc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">" + + xmlCmd + "</config> </edit-config> </rpc>"; + loadConfigurationString = loadConfigurationString + "]]>]]>"; + sshJcraftWrapper.send(loadConfigurationString); + DebugLog.printAriDebug(fnName, ":After sending loadConfigurationString"); + response = sshJcraftWrapper.receiveUntil("</rpc-reply>", 600000, ""); + if (response.indexOf("rpc-error") != -1) { + DebugLog.printAriDebug(fnName, "Error from device: Response from device had 'rpc-error'"); + DebugLog.printAriDebug(fnName, "response=\n" + response + "\n"); + r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; + r.message = response; + } else { + DebugLog.printAriDebug(fnName, ":LoadConfiguration was a success, sending commit cmd"); + sshJcraftWrapper.send(commitCmd); + DebugLog.printAriDebug(fnName, ":After sending commitCmd"); + response = sshJcraftWrapper.receiveUntil("</rpc-reply>", 180000, ""); + if (response.indexOf("rpc-error") != -1) { + DebugLog.printAriDebug(fnName, "Error from device: Response from device had 'rpc-error'"); + DebugLog.printAriDebug(fnName, "response=\n" + response + "\n"); r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; r.message = response; } else { - log.debug(":LoadConfiguration was a success, sending commit cmd"); - sshJcraftWrapper.send(commitCmd); - log.debug(":After sending commitCmd"); - response = sshJcraftWrapper.receiveUntil(RPC_REPLY_END_TAG, 180000, ""); - handleRpcError(r, response); + DebugLog.printAriDebug(fnName, ":Looks like a success"); + DebugLog.printAriDebug(fnName, "response=\n" + response + "\n"); + r.code = 200; } - sshJcraftWrapper.send(terminateConnectionCmd); - sshJcraftWrapper.closeConnection(); - return setResponseStatus(ctx, r); - } catch (Exception e) { - log.error("Caught an Exception", e); - sshJcraftWrapper.closeConnection(); - r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; - r.message = e.getMessage(); - log.debug("Returning error message"); - return setResponseStatus(ctx, r); } + sshJcraftWrapper.send(terminateConnectionCmd); + sshJcraftWrapper.closeConnection(); + sshJcraftWrapper = null; + return (setResponseStatus(ctx, r)); + } catch (Exception e) { + log(fnName, "Caught an Exception, e=" + e); + log(fnName, "StackTrace=" + DebugLog.getStackTraceString(e)); + sshJcraftWrapper.closeConnection(); + r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; + r.message = e.getMessage(); + sshJcraftWrapper = null; + log(fnName, "Returning error message"); + return (setResponseStatus(ctx, r)); } - if (key.equals(KEY_XML_GET_RUNNING_CONF)) { - log.debug("key was: : xml-getrunningconfig"); - String xmlGetRunningConfigCmd = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"1\"> <get-config> <source> <running /> </source> </get-config> </rpc>\n"; - String hostIpAddress = parameters.get(HOST_IP_PARAM); - String username = parameters.get(USERNAME_PARAM); - String password = parameters.get(PASSWORD_PARAM); - password = EncryptionTool.getInstance().decrypt(password); - String portNumber = parameters.get(PORT_NUMBER_PARAM); - String netconfHelloCmd = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <hello xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n <capabilities>\n <capability>urn:ietf:params:netconf:base:1.0</capability>\n <capability>urn:com:ericsson:ebase:1.1.0</capability> </capabilities>\n </hello>"; - String terminateConnectionCmd = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <rpc message-id=\"terminateConnection\" xmlns:netconf=\"urn:ietf:params:xml:ns:netconf:base:1.0\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n <close-session/> \n </rpc>\n ]]>]]>"; - log.debug("xml-getrunningconfig: User_name={} Host_ip_address={} Password={} Port_number={}", username, - hostIpAddress, password, portNumber); - SshJcraftWrapper sshJcraftWrapper = new SshJcraftWrapper(); - try { - - sshJcraftWrapper - .connect(hostIpAddress, username, password, 30000, Integer.parseInt(portNumber), - "netconf"); //What about prompt "]]>]]>" here? - netconfHelloCmd += PROMPT_STR; - log.debug(":Sending the hello command"); - sshJcraftWrapper.send(netconfHelloCmd); - String response; - log.debug("Sending get running config command"); - sshJcraftWrapper.send(xmlGetRunningConfigCmd + "]]>]]>\n"); - response = sshJcraftWrapper.receiveUntil(RPC_REPLY_END_TAG, 180000, ""); - log.debug("Response from getRunningconfigCmd={}", response); - response = trimResponse(response); - ctx.setAttribute("xmlRunningConfigOutput", response); - sshJcraftWrapper.send(terminateConnectionCmd); - sshJcraftWrapper.closeConnection(); - r.code = 200; - return setResponseStatus(ctx, r); - } catch (Exception e) { - log.error("Caught an Exception", e); - sshJcraftWrapper.closeConnection(); - r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; - r.message = e.getMessage(); - log.debug("Returning error message"); - return setResponseStatus(ctx, r); - } + } + if (key.equals("xml-getrunningconfig")) { + log(fnName, "key was: : xml-getrunningconfig"); + String xmlGetRunningConfigCmd = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"1\"> <get-config> <source> <running /> </source> </get-config> </rpc>\n"; + String Host_ip_address = parameters.get("Host_ip_address"); + String User_name = parameters.get("User_name"); + String Password = parameters.get("Password"); + Password = EncryptionTool.getInstance().decrypt(Password); + String Port_number = parameters.get("Port_number"); + String Protocol = parameters.get("Protocol"); + String netconfHelloCmd = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <hello xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n <capabilities>\n <capability>urn:ietf:params:netconf:base:1.0</capability>\n <capability>urn:com:ericsson:ebase:1.1.0</capability> </capabilities>\n </hello>"; + String terminateConnectionCmd = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <rpc message-id=\"terminateConnection\" xmlns:netconf=\"urn:ietf:params:xml:ns:netconf:base:1.0\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n <close-session/> \n </rpc>\n ]]>]]>"; + log(fnName, + "xml-getrunningconfig: User_name=" + User_name + " Host_ip_address=" + Host_ip_address + + " Port_number=" + Port_number); + SshJcraftWrapper sshJcraftWrapper = new SshJcraftWrapper(); + try { + String NetconfHelloCmd = netconfHelloCmd; + sshJcraftWrapper.connect(Host_ip_address, + User_name, + Password, + "]]>]]>", + 30000, + Integer.parseInt(Port_number), + "netconf"); + NetconfHelloCmd = NetconfHelloCmd + "]]>]]>"; + log(fnName, ":Sending the hello command"); + sshJcraftWrapper.send(NetconfHelloCmd); + String response = sshJcraftWrapper.receiveUntil("]]>]]>", 10000, ""); + log(fnName, "Sending get running config command"); + sshJcraftWrapper.send(xmlGetRunningConfigCmd + "]]>]]>\n"); + response = sshJcraftWrapper.receiveUntil("</rpc-reply>", 180000, ""); + DebugLog.printAriDebug(fnName, "Response from getRunningconfigCmd=" + response); + response = trimResponse(response); + ctx.setAttribute("xmlRunningConfigOutput", response); + sshJcraftWrapper.send(terminateConnectionCmd); + sshJcraftWrapper.closeConnection(); + r.code = 200; + sshJcraftWrapper = null; + return (setResponseStatus(ctx, r)); + } catch (Exception e) { + log(fnName, "Caught an Exception, e=" + e); + log(fnName, "StackTrace=" + DebugLog.getStackTraceString(e)); + sshJcraftWrapper.closeConnection(); + r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; + r.message = e.getMessage(); + sshJcraftWrapper = null; + log(fnName, "Returning error message"); + return (setResponseStatus(ctx, r)); } - if (key.equals(KEY_DOWNLOAD_CLI_CONFIG)) { - log.debug("key was: DownloadCliConfig: "); - String username = parameters.get(USERNAME_PARAM); - String hostIpAddress = parameters.get(HOST_IP_PARAM); - String password = parameters.get(PASSWORD_PARAM); - password = EncryptionTool.getInstance().decrypt(password); - String portNumber = parameters.get(PORT_NUMBER_PARAM); - String downloadConfigTemplate = parameters.get("Download_config_template"); - String configContents = parameters.get("Config_contents"); - log.debug("Contents of the 'Config_contents' are: {}", configContents); - SshJcraftWrapper sshJcraftWrapper = new SshJcraftWrapper(); - log.debug("DownloadCliConfig: sshJcraftWrapper was instantiated"); - int timeout = 4 * 60 * 1000; + } + if (key.equals("DownloadCliConfig")) { + debugLog.printRTAriDebug(fnName, "key was: DownloadCliConfig: "); + log.debug("key was: DownloadCliConfig: "); + String User_name = parameters.get("User_name"); + String Host_ip_address = parameters.get("Host_ip_address"); + String Password = parameters.get("Password"); + Password = EncryptionTool.getInstance().decrypt(Password); + String Port_number = parameters.get("Port_number"); + String Download_config_template = parameters.get("Download_config_template"); + String Config_contents = parameters.get("Config_contents"); + DebugLog.printAriDebug(fnName, "Contents of the 'Config_contents' are: " + Config_contents); + SshJcraftWrapper sshJcraftWrapper = new SshJcraftWrapper(); + log.debug("DownloadCliConfig: sshJcraftWrapper was instantiated"); + debugLog.printRTAriDebug(fnName, "DownloadCliConfig: sshJcraftWrapper was instantiated"); + int timeout = 4 * 60 * 1000; + try { + DebugLog.printAriDebug(fnName, "DownloadCliConfig: User_name=" + User_name + + " Host_ip_address=" + Host_ip_address + " Port_number=" + + Port_number); + log.debug("DownloadCliConfig: Attempting to login: Host_ip_address=" + Host_ip_address + + " User_name=" + User_name + " Port_number=" + Port_number); + StringBuffer sb = new StringBuffer(); + String response = ""; + String CliResponse = ""; + sshJcraftWrapper.connect(Host_ip_address, + User_name, + Password, + "", + 30000, + Integer.parseInt(Port_number)); + DebugLog.printAriDebug(fnName, "DownloadCliConfig: On the VNF device"); + StringTokenizer st = new StringTokenizer(Download_config_template, "\n"); + String command = null; + String executeConfigContentsDelemeter = null; try { - log.debug("DownloadCliConfig: Attempting to login: Host_ip_address=" + hostIpAddress + " User_name=" - + username + " Password=" + password + " Port_number=" + portNumber); - - StringBuilder cliResponse = new StringBuilder(); - - // shouldn't this be used somewhere? - StringBuilder response = new StringBuilder(); - - sshJcraftWrapper - .connect(hostIpAddress, username, password, "", 30000, Integer.parseInt(portNumber)); - log.debug("DownloadCliConfig: On the VNF device"); - StringTokenizer st = new StringTokenizer(downloadConfigTemplate, "\n"); - String command = null; - String executeConfigContentsDelimiter; - try { - while (st.hasMoreTokens()) { - String line = st.nextToken(); - log.debug("line={}", line); - if (line.contains("Request:")) { - log.debug("Found a Request line: line={}", line); - command = getStringBetweenQuotes(line); - log.debug("Sending command={}", command); - sshJcraftWrapper.send(command); - log.debug("command has been sent"); - } else if ((line.contains("Response: Ends_With")) && ( - !line.contains("Execute_config_contents Response: Ends_With"))) { - log.debug("Found a Response line: line={}", line); - String delimiter = getStringBetweenQuotes(line); - log.debug("The delimiter={}", delimiter); - String tmpResponse = sshJcraftWrapper.receiveUntil(delimiter, timeout, command); - response.append(tmpResponse); - cliResponse.append(tmpResponse); - } else if (line.contains("Execute_config_contents Response: Ends_With")) { - log.debug("Found a 'Execute_config_contents Response:' line={}", line); - executeConfigContentsDelimiter = getStringBetweenQuotes(line); - log.debug("executeConfigContentsDelemeter={}", executeConfigContentsDelimiter); - StringTokenizer st2 = new StringTokenizer(configContents, "\n"); - while (st2.hasMoreTokens()) { - String cmd = st2.nextToken(); - log.debug("Config_contents: cmd={}", cmd); - sshJcraftWrapper.send(cmd); - String tmpResponse = sshJcraftWrapper - .receiveUntil(executeConfigContentsDelimiter, timeout, command); - cliResponse.append(tmpResponse); - } + while (st.hasMoreTokens()) { + String line = st.nextToken(); + DebugLog.printAriDebug(fnName, "line=" + line); + if (line.indexOf("Request:") != -1) { + DebugLog.printAriDebug(fnName, "Found a Request line: line=" + line); + command = getStringBetweenQuotes(line); + DebugLog.printAriDebug(fnName, "Sending command=" + command); + sshJcraftWrapper.send(command); + DebugLog.printAriDebug(fnName, "command has been sent"); + } else if ((line.indexOf("Response: Ends_With") != -1) && ( + line.indexOf("Execute_config_contents Response: Ends_With") == -1)) { + DebugLog.printAriDebug(fnName, "Found a Response line: line=" + line); + String delemeter = getStringBetweenQuotes(line); + DebugLog.printAriDebug(fnName, "The delemeter=" + delemeter); + String tmpResponse = sshJcraftWrapper.receiveUntil(delemeter, timeout, command); + response += tmpResponse; + CliResponse += tmpResponse; + } else if (line.indexOf("Execute_config_contents Response: Ends_With") != -1) { + DebugLog.printAriDebug(fnName, "Found a 'Execute_config_contents Response:' line=" + line); + executeConfigContentsDelemeter = getStringBetweenQuotes(line); + DebugLog.printAriDebug(fnName, + "executeConfigContentsDelemeter=" + executeConfigContentsDelemeter); + StringTokenizer st2 = new StringTokenizer(Config_contents, "\n"); + while (st2.hasMoreTokens()) { + String cmd = st2.nextToken(); + DebugLog.printAriDebug(fnName, "Config_contents: cmd=" + cmd); + sshJcraftWrapper.send(cmd); + String tmpResponse = sshJcraftWrapper.receiveUntil(executeConfigContentsDelemeter, + timeout, + command); + CliResponse += tmpResponse; } } - } catch (NoSuchElementException e) { - log.error(e.getMessage(), e); } - sshJcraftWrapper.closeConnection(); - log.debug(":Escaping all the single and double quotes in the response"); - - String escapedCliResponse = cliResponse - .toString() - .replaceAll("\"", "\\\\\"") - .replaceAll("\'", "\\\\'"); - - log.debug("CliResponse=\n{}" + escapedCliResponse); - ctx.setAttribute(CLI_OUTPUT_PARAM, escapedCliResponse); - r.code = 200; - return setResponseStatus(ctx, r); - } catch (IOException e) { - log.error(e.getMessage() + e); - sshJcraftWrapper.closeConnection(); - r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; - r.message = e.getMessage(); - log.debug("DownloadCliConfig: Returning error message"); - return setResponseStatus(ctx, r); + } catch (NoSuchElementException e) { + DebugLog.printAriDebug(fnName, "Caught a NoSuchElementException: e=" + e); } + sshJcraftWrapper.closeConnection(); + sshJcraftWrapper = null; + DebugLog.printAriDebug(fnName, ":Escaping all the single and double quotes in the response"); + CliResponse = CliResponse.replaceAll("\"", "\\\\\""); + CliResponse = CliResponse.replaceAll("\'", "\\\\'"); + DebugLog.printAriDebug(fnName, "CliResponse=\n" + CliResponse); + ctx.setAttribute("cliOutput", CliResponse); + r.code = 200; + return (setResponseStatus(ctx, r)); + } catch (IOException e) { + DebugLog.printAriDebug(fnName, "DownloadCliConfig: Caught a IOException e=" + e); + log.debug(fnName + " : DownloadCliConfig: Caught a IOException e=" + e); + sshJcraftWrapper.closeConnection(); + r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; + r.message = e.getMessage(); + sshJcraftWrapper = null; + DebugLog.printAriDebug(fnName, "DownloadCliConfig: Returning error message"); + return (setResponseStatus(ctx, r)); } - log.debug("Unsupported action - {}", action); - return ConfigStatus.FAILURE; } - private boolean areEqual(String action, String actionPrepare) { - return action != null && action.equalsIgnoreCase(actionPrepare); - } + debugLog.printRTAriDebug(fnName, "Unsupported action - " + action); + log.error("Unsupported action - " + action); + return ConfigStatus.FAILURE; +} - private boolean nullOrEmpty(String parmval) { - return parmval != null && parmval.length() > 0; - } +private void log(String fileName, String messg) { + debugLog.printRTAriDebug(fileName, messg); + log.debug(fileName + ": " + messg); +} - private void handleRpcError(HttpResponse r, String response) { - if (response.contains("rpc-error")) { - log.debug("Error from device: Response from device had 'rpc-error'"); - log.debug(RESPONSE_STR, response); - r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; - r.message = response; - } else { - log.debug(":Looks like a success"); - log.debug(RESPONSE_STR, response); - r.code = 200; - } +private ConfigStatus prepare(SvcLogicContext ctx, String requestType, String operation) { + String templateName = requestType.equals("BASE") ? "/config-base.xml" : "/config-data.xml"; + String ndTemplate = readFile(templateName); + String nd = buildNetworkData2(ctx, ndTemplate, operation); + + String reqTemplate = readFile("/config-request.xml"); + Map<String, String> param = new HashMap<String, String>(); + param.put("request-id", ctx.getAttribute("service-data.appc-request-header.svc-request-id")); + param.put("request-type", requestType); + param.put("callback-url", configCallbackUrl); + if (operation.equals("create") || operation.equals("change") || operation.equals("scale")) { + param.put("action", "GenerateOnly"); } + param.put("equipment-name", ctx.getAttribute("service-data.service-information.service-instance-id")); + param.put("equipment-ip-address", ctx.getAttribute("service-data.vnf-config-information.vnf-host-ip-address")); + param.put("vendor", ctx.getAttribute("service-data.vnf-config-information.vendor")); + param.put("network-data", nd); - private void trySleepFor(long length) { - try { - log.debug("Sleeping for 180 seconds...."); - Thread.sleep(length); - log.debug("Woke up...."); - } catch (InterruptedException ee) { - log.error("Sleep interrupted", ee); - Thread.currentThread().interrupt(); - } - } + String req = null; + try { + req = buildXmlRequest(param, reqTemplate); + } catch (Exception e) { + log.error("Error building the XML request: ", e); - private ConfigStatus prepare(SvcLogicContext ctx, String requestType, String operation) { - String templateName = requestType.equals(BASE_REQUEST) ? "/config-base.xml" : "/config-data.xml"; - String ndTemplate = expandRepeats(ctx, readFile(templateName), 1); - String nd = buildNetworkData2(ctx, ndTemplate, operation); + HttpResponse r = new HttpResponse(); + r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; + r.message = e.getMessage(); + return setResponseStatus(ctx, r); + } - String reqTemplate = readFile("/config-request.xml"); - Map<String, String> param = new HashMap<>(); - param.put(REQUEST_ID_PARAM, ctx.getAttribute(SVC_REQUEST_ID_ATTR)); - param.put("request-type", requestType); - param.put(CALLBACK_URL_PARAM, configCallbackUrl); - if (operation.equals(OPERATION_CREATE) || operation.equals(OPERATION_CHANGE) - || operation.equals(OPERATION_SCALE)) { - param.put(ACTION_PARAM, "GenerateOnly"); - } - param.put(EQUIPMENT_NAME_PARAM, ctx.getAttribute(SERVICE_INSTANCE_ID_ATTR)); - param.put("equipment-ip-address", ctx.getAttribute("service-data.vnf-config-information.vnf-host-ip-address")); - param.put("vendor", ctx.getAttribute("service-data.vnf-config-information.vendor")); - param.put("network-data", nd); + HttpResponse r = sendXmlRequest(req, configUrl, configUser, configPassword); + return setResponseStatus(ctx, r); +} - String req; - try { - req = buildXmlRequest(param, reqTemplate); - } catch (Exception e) { - log.error(XML_BUILDING_ERR_STR, e); +private ConfigStatus activate(SvcLogicContext ctx, boolean change) { + String reqTemplate = readFile("/config-request.xml"); + Map<String, String> param = new HashMap<String, String>(); + param.put("request-id", ctx.getAttribute("service-data.appc-request-header.svc-request-id")); + param.put("callback-url", configCallbackUrl); + param.put("action", change ? "DownloadChange" : "DownloadBase"); + param.put("equipment-name", ctx.getAttribute("service-data.service-information.service-instance-id")); - HttpResponse r = new HttpResponse(); - r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; - r.message = e.getMessage(); - return setResponseStatus(ctx, r); - } + String req = null; + try { + req = buildXmlRequest(param, reqTemplate); + } catch (Exception e) { + log.error("Error building the XML request: ", e); - HttpResponse r = sendXmlRequest(req, configUrl, configUser, configPassword); + HttpResponse r = new HttpResponse(); + r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; + r.message = e.getMessage(); return setResponseStatus(ctx, r); } - private ConfigStatus activate(SvcLogicContext ctx, boolean change) { - String reqTemplate = readFile("/config-request.xml"); - Map<String, String> param = new HashMap<>(); - param.put(REQUEST_ID_PARAM, ctx.getAttribute(SVC_REQUEST_ID_ATTR)); - param.put(CALLBACK_URL_PARAM, configCallbackUrl); - param.put(ACTION_PARAM, change ? "DownloadChange" : "DownloadBase"); - param.put(EQUIPMENT_NAME_PARAM, ctx.getAttribute(SERVICE_INSTANCE_ID_ATTR)); + HttpResponse r = sendXmlRequest(req, configUrl, configUser, configPassword); + return setResponseStatus(ctx, r); +} - String req; - try { - req = buildXmlRequest(param, reqTemplate); - } catch (Exception e) { - log.error(XML_BUILDING_ERR_STR, e); +private ConfigStatus audit(SvcLogicContext ctx, String auditLevel) { + String reqTemplate = readFile("/audit-request.xml"); + Map<String, String> param = new HashMap<String, String>(); + param.put("request-id", ctx.getAttribute("service-data.appc-request-header.svc-request-id")); + param.put("callback-url", auditCallbackUrl); + param.put("equipment-name", ctx.getAttribute("service-data.service-information.service-instance-id")); + param.put("audit-level", auditLevel); - HttpResponse r = new HttpResponse(); - r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; - r.message = e.getMessage(); - return setResponseStatus(ctx, r); - } + String req = null; + try { + req = buildXmlRequest(param, reqTemplate); + } catch (Exception e) { + log.error("Error building the XML request: ", e); - HttpResponse r = sendXmlRequest(req, configUrl, configUser, configPassword); + HttpResponse r = new HttpResponse(); + r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; + r.message = e.getMessage(); return setResponseStatus(ctx, r); } - private ConfigStatus audit(SvcLogicContext ctx, String auditLevel) { - String reqTemplate = readFile("/audit-request.xml"); - Map<String, String> param = new HashMap<>(); - param.put(REQUEST_ID_PARAM, ctx.getAttribute(SVC_REQUEST_ID_ATTR)); - param.put(CALLBACK_URL_PARAM, auditCallbackUrl); - param.put(EQUIPMENT_NAME_PARAM, ctx.getAttribute(SERVICE_INSTANCE_ID_ATTR)); - param.put("audit-level", auditLevel); - String req; + HttpResponse r = sendXmlRequest(req, auditUrl, auditUser, auditPassword); + return setResponseStatus(ctx, r); +} - try { - req = buildXmlRequest(param, reqTemplate); - } catch (Exception e) { - log.error(XML_BUILDING_ERR_STR, e); +@Override +public ConfigStatus activate(String key, SvcLogicContext ctx) { + return ConfigStatus.SUCCESS; +} - HttpResponse r = new HttpResponse(); - r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; - r.message = e.getMessage(); - return setResponseStatus(ctx, r); - } +@Override +public ConfigStatus deactivate(String key, SvcLogicContext ctx) { + return ConfigStatus.SUCCESS; +} - HttpResponse r = sendXmlRequest(req, auditUrl, auditUser, auditPassword); - return setResponseStatus(ctx, r); +private String escapeMySql(String input) { + if (input == null) { + return null; } - @Override - public ConfigStatus activate(String key, SvcLogicContext ctx) { - return ConfigStatus.SUCCESS; - } + input = input.replace("\\", "\\\\"); + input = input.replace("\'", "\\'"); + + return input; +} - @Override - public ConfigStatus deactivate(String key, SvcLogicContext ctx) { - return ConfigStatus.SUCCESS; +private String readFile(String fileName) { + InputStream is = getClass().getResourceAsStream(fileName); + InputStreamReader isr = new InputStreamReader(is); + BufferedReader in = new BufferedReader(isr); + StringBuilder ss = new StringBuilder(); + try { + String s = in.readLine(); + while (s != null) { + ss.append(s).append('\n'); + s = in.readLine(); + } + } catch (IOException e) { + System.out.println("Error reading " + fileName + ": " + e.getMessage()); + throw new RuntimeException("Error reading " + fileName + ": " + e.getMessage(), e); + } finally { + try { + in.close(); + } catch (Exception e) { + log.warn("Could not close BufferedReader", e); + } + try { + isr.close(); + } catch (Exception e) { + log.warn("Could not close InputStreamReader", e); + } + try { + is.close(); + } catch (Exception e) { + log.warn("Could not close InputStream", e); + } } + return ss.toString(); +} - private String escapeMySql(String input) { - if (input == null) { - return null; +private String buildXmlRequest(Map<String, String> param, String template) { + StringBuilder ss = new StringBuilder(); + int i = 0; + while (i < template.length()) { + int i1 = template.indexOf("${", i); + if (i1 < 0) { + ss.append(template.substring(i)); + break; } - return input - .replace("\\", "\\\\") - .replace("\'", "\\'"); - } + int i2 = template.indexOf('}', i1 + 2); + if (i2 < 0) { + throw new RuntimeException("Template error: Matching } not found"); + } - private String readFile(String fileName) { - InputStream is = getClass().getResourceAsStream(fileName); - InputStreamReader isr = new InputStreamReader(is); - BufferedReader in = new BufferedReader(isr); - StringBuilder builder = new StringBuilder(); - try { - String s = in.readLine(); - while (s != null) { - builder.append(s).append('\n'); - s = in.readLine(); - } - } catch (IOException e) { - throw new UncheckedIOException("Error reading " + fileName, e); - } finally { - try { - in.close(); - } catch (Exception e) { - log.warn("Could not close BufferedReader", e); + String var1 = template.substring(i1 + 2, i2); + String value1 = param.get(var1); + if (value1 == null || value1.trim().length() == 0) { + // delete the whole element (line) + int i3 = template.lastIndexOf('\n', i1); + if (i3 < 0) { + i3 = 0; } - try { - isr.close(); - } catch (Exception e) { - log.warn("Could not close InputStreamReader", e); + int i4 = template.indexOf('\n', i1); + if (i4 < 0) { + i4 = template.length(); } - try { - is.close(); - } catch (Exception e) { - log.warn("Could not close InputStream", e); + + if (i < i3) { + ss.append(template.substring(i, i3)); } + i = i4; + } else { + ss.append(template.substring(i, i1)).append(value1); + i = i2 + 1; } - return builder.toString(); } - private String buildXmlRequest(Map<String, String> param, String template) { - StringBuilder ss = new StringBuilder(); - int i = 0; - while (i < template.length()) { - int i1 = template.indexOf("${", i); - if (i1 < 0) { - ss.append(template.substring(i)); - break; - } - - int i2 = template.indexOf('}', i1 + 2); - if (i2 < 0) { - throw new TemplateException(TEMPLATE_ERR_STR); - } + return ss.toString(); +} - String var1 = template.substring(i1 + 2, i2); - String value1 = param.get(var1); - if (emptyOrNull(value1)) { - // delete the whole element (line) - int i3 = template.lastIndexOf('\n', i1); - if (i3 < 0) { - i3 = 0; - } - int i4 = template.indexOf('\n', i1); - if (i4 < 0) { - i4 = template.length(); - } +private String buildNetworkData2(SvcLogicContext ctx, String template, String operation) { + log.info("Building XML started"); + long t1 = System.currentTimeMillis(); - if (i < i3) { - ss.append(template.substring(i, i3)); - } - i = i4; - } else { - ss.append(template.substring(i, i1)).append(value1); - i = i2 + 1; - } - } + template = expandRepeats(ctx, template, 1); - return ss.toString(); + Map<String, String> mm = new HashMap<>(); + for (String s : ctx.getAttributeKeySet()) { + mm.put(s, ctx.getAttribute(s)); } + mm.put("operation", operation); - private String buildNetworkData2(SvcLogicContext ctx, String template, String operation) { - log.info("Building XML started"); - long t1 = System.currentTimeMillis(); + StringBuilder ss = new StringBuilder(); + int i = 0; + while (i < template.length()) { + int i1 = template.indexOf("${", i); + if (i1 < 0) { + ss.append(template.substring(i)); + break; + } - Map<String, String> mm = new HashMap<>(); - for (String s : ctx.getAttributeKeySet()) { - mm.put(s, ctx.getAttribute(s)); + int i2 = template.indexOf('}', i1 + 2); + if (i2 < 0) { + throw new RuntimeException("Template error: Matching } not found"); } - mm.put("operation", operation); - - StringBuilder ss = new StringBuilder(); - int i = 0; - while (i < template.length()) { - int i1 = template.indexOf("${", i); - if (i1 < 0) { - ss.append(template.substring(i)); - break; - } - int i2 = template.indexOf('}', i1 + 2); - if (i2 < 0) { - throw new TemplateException(TEMPLATE_ERR_STR); + String var1 = template.substring(i1 + 2, i2); + String value1 = XmlUtil.getXml(mm, var1); + if (value1 == null || value1.trim().length() == 0) { + // delete the whole element (line) + int i3 = template.lastIndexOf('\n', i1); + if (i3 < 0) { + i3 = 0; + } + int i4 = template.indexOf('\n', i1); + if (i4 < 0) { + i4 = template.length(); } - String var1 = template.substring(i1 + 2, i2); - String value1 = XmlUtil.getXml(mm, var1); - if (emptyOrNull(value1)) { - int i3 = template.lastIndexOf('\n', i1); - if (i3 < 0) { - i3 = 0; - } - int i4 = template.indexOf('\n', i1); - if (i4 < 0) { - i4 = template.length(); - } - - if (i < i3) { - ss.append(template.substring(i, i3)); - } - i = i4; - } else { - ss.append(template.substring(i, i1)).append(value1); - i = i2 + 1; + if (i < i3) { + ss.append(template.substring(i, i3)); } + i = i4; + } else { + ss.append(template.substring(i, i1)).append(value1); + i = i2 + 1; } - - long t2 = System.currentTimeMillis(); - log.info("Building XML completed. Time: " + (t2 - t1)); - - return ss.toString(); } - private boolean emptyOrNull(String value1) { - return value1 == null || value1.trim().length() == 0; - } + long t2 = System.currentTimeMillis(); + log.info("Building XML completed. Time: " + (t2 - t1)); - private String expandRepeats(SvcLogicContext ctx, String template, int level) { - StringBuilder newTemplate = new StringBuilder(); - int k = 0; - while (k < template.length()) { - int i1 = template.indexOf("${repeat:", k); - if (i1 < 0) { - newTemplate.append(template.substring(k)); - break; - } - - int i2 = template.indexOf(':', i1 + 9); - if (i2 < 0) { - throw new TemplateException( - "Template error: Context variable name followed by \":\" is required after repeat"); - } - - // Find the closing "}", store in i3 - int i3 = findLastBracketIndex(template, i2); - - String var1 = template.substring(i1 + 9, i2); - String value1 = ctx.getAttribute(var1); - log.info(" " + var1 + ": " + value1); - int n = tryParseValue(value1); - - newTemplate.append(template.substring(k, i1)); - - String rpt = template.substring(i2 + 1, i3); + return ss.toString(); +} - for (int ii = 0; ii < n; ii++) { - String ss = rpt.replaceAll("\\[\\$\\{" + level + "\\}\\]", "[" + ii + "]"); - newTemplate.append(ss); - } - k = i3 + 1; +private String expandRepeats(SvcLogicContext ctx, String template, int level) { + StringBuilder newTemplate = new StringBuilder(); + int k = 0; + while (k < template.length()) { + int i1 = template.indexOf("${repeat:", k); + if (i1 < 0) { + newTemplate.append(template.substring(k)); + break; } - if (k == 0) { - return newTemplate.toString(); + int i2 = template.indexOf(':', i1 + 9); + if (i2 < 0) { + throw new RuntimeException( + "Template error: Context variable name followed by : is required after repeat"); } - return expandRepeats(ctx, newTemplate.toString(), level + 1); - } - private int findLastBracketIndex(String template, int i2) { + // Find the closing }, store in i3 + int nn = 1; int i3 = -1; int i = i2; - int nn = 1; while (nn > 0 && i < template.length()) { i3 = template.indexOf('}', i); if (i3 < 0) { - throw new TemplateException(TEMPLATE_ERR_STR); + throw new RuntimeException("Template error: Matching } not found"); } int i32 = template.indexOf('{', i); if (i32 >= 0 && i32 < i3) { @@ -849,132 +840,150 @@ public class ConfigComponentAdaptor implements SvcLogicAdaptor { i = i3 + 1; } } - return i3; - } - private int tryParseValue(String value1) { - int n; + String var1 = template.substring(i1 + 9, i2); + String value1 = ctx.getAttribute(var1); + log.info(" " + var1 + ": " + value1); + int n = 0; try { n = Integer.parseInt(value1); } catch (Exception e) { - log.error("Failed to parse value. Using default (0).", e); n = 0; } - return n; + + newTemplate.append(template.substring(k, i1)); + + String rpt = template.substring(i2 + 1, i3); + + for (int ii = 0; ii < n; ii++) { + String ss = rpt.replaceAll("\\[\\$\\{" + level + "\\}\\]", "[" + ii + "]"); + newTemplate.append(ss); + } + + k = i3 + 1; } - private HttpResponse sendXmlRequest(String xmlRequest, String url, String user, String password) { - try { - Client client = Client.create(); - client.setConnectTimeout(5000); - WebResource webResource = client.resource(url); + if (k == 0) { + return newTemplate.toString(); + } - log.info("SENDING..............."); - log.info(xmlRequest); + return expandRepeats(ctx, newTemplate.toString(), level + 1); +} - String authString = user + ":" + password; - byte[] authEncBytes = Base64.encode(authString); - String authStringEnc = new String(authEncBytes); - authString = "Basic " + authStringEnc; +private HttpResponse sendXmlRequest(String xmlRequest, String url, String user, String password) { + try { + Client client = Client.create(); + client.setConnectTimeout(5000); + WebResource webResource = client.resource(url); - ClientResponse response = - webResource.header("Authorization", authString).accept("UTF-8").type("application/xml").post( - ClientResponse.class, xmlRequest); + log.info("SENDING..............."); + log.info(xmlRequest); - int code = response.getStatus(); - String message = null; + String authString = user + ":" + password; + byte[] authEncBytes = Base64.encode(authString); + String authStringEnc = new String(authEncBytes); + authString = "Basic " + authStringEnc; - log.info("RESPONSE..............."); - log.info("HTTP response code: " + code); - log.info("HTTP response message: " + message); - log.info(""); + ClientResponse response = + webResource.header("Authorization", authString).accept("UTF-8").type("application/xml").post( + ClientResponse.class, xmlRequest); - HttpResponse r = new HttpResponse(); - r.code = code; - r.message = message; - return r; + int code = response.getStatus(); + String message = null; - } catch (Exception e) { - log.error("Error sending the request: ", e); + log.info("RESPONSE..............."); + log.info("HTTP response code: " + code); + log.info("HTTP response message: " + message); + log.info(""); - HttpResponse r = new HttpResponse(); - r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; - r.message = e.getMessage(); - return r; - } - } + HttpResponse r = new HttpResponse(); + r.code = code; + r.message = message; + return r; - private static class HttpResponse { + } catch (Exception e) { + log.error("Error sending the request: ", e); - public int code; - public String message; + HttpResponse r = new HttpResponse(); + r.code = HttpURLConnection.HTTP_INTERNAL_ERROR; + r.message = e.getMessage(); + return r; } +} - private ConfigStatus setResponseStatus(SvcLogicContext ctx, HttpResponse r) { - ctx.setAttribute("error-code", String.valueOf(r.code)); - ctx.setAttribute("error-message", r.message); +private static class HttpResponse { - return r.code > 299 ? ConfigStatus.FAILURE : ConfigStatus.SUCCESS; - } + public int code; - private String getStringBetweenQuotes(String string) { - log.debug("string=" + string); - String retString; - int start = string.indexOf('\"'); - int end = string.lastIndexOf('\"'); - retString = string.substring(start + 1, end); - log.debug("retString=" + retString); - return retString; - } + public String message; +} - public static String _readFile(String fileName) { - StringBuilder builder = new StringBuilder(); - String line; - try { - BufferedReader in = new BufferedReader(new FileReader(fileName)); - while ((line = in.readLine()) != null) { - builder.append(line).append('\n'); - } - in.close(); - } catch (IOException e) { - log.error("Caught an IOException in method readFile()", e); +private ConfigStatus setResponseStatus(SvcLogicContext ctx, HttpResponse r) { + ctx.setAttribute("error-code", String.valueOf(r.code)); + ctx.setAttribute("error-message", r.message); + + return r.code > 299 ? ConfigStatus.FAILURE : ConfigStatus.SUCCESS; +} + +private String getStringBetweenQuotes(String string) { + String fnName = "ConfigComponentAdaptor.getStringBetweenQuotes"; + DebugLog.printAriDebug(fnName, "string=" + string); + String retString = null; + int start = string.indexOf("\""); + int end = string.lastIndexOf("\""); + retString = string.substring(start + 1, end); + DebugLog.printAriDebug(fnName, "retString=" + retString); + return (retString); +} + +public static String _readFile(String fileName) { + StringBuffer strBuff = new StringBuffer(); + String line; + try (BufferedReader in = new BufferedReader(new FileReader(fileName))) { + while ((line = in.readLine()) != null) { + strBuff.append(line + "\n"); } - return builder.toString(); + } catch (IOException e) { + System.out.println("Caught an IOException in method readFile(): e=" + e.toString()); } + return (strBuff.toString()); +} - private String trimResponse(String response) { - StringTokenizer line = new StringTokenizer(response, "\n"); - StringBuilder builder = new StringBuilder(); - boolean captureText = false; - while (line.hasMoreTokens()) { - String token = line.nextToken(); - if (token.contains("<configuration xmlns=")) { - captureText = true; - } - if (captureText) { - builder.append(token).append('\n'); - } - if (token.contains("</configuration>")) { - captureText = false; - } +private String trimResponse(String response) { + StringTokenizer line = new StringTokenizer(response, "\n"); + StringBuffer sb = new StringBuffer(); + boolean captureText = false; + while (line.hasMoreTokens()) { + String token = line.nextToken(); + if (token.indexOf("<configuration xmlns=") != -1) { + captureText = true; + } + if (captureText) { + sb.append(token + "\n"); + } + if (token.indexOf("</configuration>") != -1) { + captureText = false; } - return builder.toString(); - } - - public static void main(String[] args) throws Exception { - Properties props = null; - log.info("*************************Hello*****************************"); - ConfigComponentAdaptor cca = new ConfigComponentAdaptor(props); - String getConfigTemplate = _readFile("/home/userID/data/Get_config_template"); - String key = "GetCliRunningConfig"; - Map<String, String> parameters = new HashMap<>(); - parameters.put(HOST_IP_PARAM, "000.00.000.00"); - parameters.put(USERNAME_PARAM, "root"); - parameters.put(PASSWORD_PARAM, "!bootstrap"); - parameters.put(PORT_NUMBER_PARAM, "22"); - parameters.put(GET_CONFIG_TEMPLATE_PARAM, getConfigTemplate); - SvcLogicContext ctx = null; - log.info("*************************TRACE 1*****************************"); - cca.configure(key, parameters, ctx); } + return (sb.toString()); +} + +public static void main(String args[]) throws Exception { + Properties props = null; + System.out.println("*************************Hello*****************************"); + ConfigComponentAdaptor cca = new ConfigComponentAdaptor(props); + String Get_config_template = _readFile("/home/userID/data/Get_config_template"); + String Download_config_template = _readFile("/home/userID/data/Download_config_template_2"); + String key = "GetCliRunningConfig"; + Map<String, String> parameters = new HashMap(); + parameters.put("Host_ip_address", "000.00.000.00"); + parameters.put("User_name", "root"); + parameters.put("Password", "!bootstrap"); + parameters.put("Port_number", "22"); + parameters.put("Get_config_template", Get_config_template); + + SvcLogicContext ctx = null; + System.out.println("*************************TRACE 1*****************************"); + cca.configure(key, parameters, ctx); +} } diff --git a/appc-config/appc-config-adaptor/provider/src/main/java/org/onap/appc/ccadaptor/DebugLog.java b/appc-config/appc-config-adaptor/provider/src/main/java/org/onap/appc/ccadaptor/DebugLog.java new file mode 100644 index 000000000..fb9d7a392 --- /dev/null +++ b/appc-config/appc-config-adaptor/provider/src/main/java/org/onap/appc/ccadaptor/DebugLog.java @@ -0,0 +1,100 @@ +/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.appc.ccadaptor;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+
+public class DebugLog {
+
+ private static String fileName = "/tmp/rt.log";
+
+ public static void main(String args[]) {
+ DebugLog debugLog = new DebugLog();
+ debugLog.printAriDebug("DebugLog", "The Message");
+ }
+
+ public static void printAriDebug(String fn, String messg) {
+ String logMessg = getDateTime() + " " + fn + " " + messg;
+ appendToFile(logMessg + "\n");
+
+ }
+
+ public static void printRTAriDebug(String fn, String messg) {
+ // System.out.println (getDateTime() +" " +fn +" " + messg);
+ String logMessg = getDateTime() + " " + fn + " " + messg;
+ appendToFile(logMessg + "\n");
+ }
+
+ public static String getDateTime() {
+ DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+ // DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
+ Date date = new Date();
+ return dateFormat.format(date);
+ }
+
+ public static void appendToFile(String dataToWrite) {
+ String fn = "DebugLog.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()) {
+ BufferedWriter out = new BufferedWriter(new FileWriter(fileName, true));
+ out.write(dataToWrite);
+ out.close();
+ }
+ } catch (IOException e) {
+ DebugLog.printRTAriDebug(fn, "writeToFile() exception: " + e);
+ //System.err.println("writeToFile() exception: " + e);
+ e.printStackTrace();
+ }
+ }
+
+ public void outputStackTrace(Exception e) {
+ String fn = "DebugLog.outputStackTrace";
+ StringWriter sw = new StringWriter();
+ e.printStackTrace(new PrintWriter(sw));
+ String stackTrace = sw.toString();
+ DebugLog.printRTAriDebug(fn, "Stack trace::: " + stackTrace);
+ }
+
+ public static String getStackTraceString(Exception e) {
+ String fn = "DebugLog.outputStackTrace";
+ StringWriter sw = new StringWriter();
+ e.printStackTrace(new PrintWriter(sw));
+ String stackTrace = sw.toString();
+ return (stackTrace);
+ }
+
+}
+
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 081f0814f..9aa5f9fbf 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,7 +2,7 @@ * ============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 * ============================================================================= @@ -18,7 +18,6 @@ * 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========================================================= */ @@ -62,75 +61,81 @@ import org.onap.appc.i18n.Msg; public class SshJcraftWrapper { - private static final EELFLogger log = EELFManager.getInstance().getLogger(SshJcraftWrapper.class); - static final int DEFAULT_PORT = 22; - static final String EOL = "\n"; - static final String CHANNEL_SHELL_TYPE = "shell"; - static final String CHANNEL_SUBSYSTEM_TYPE = "subsystem"; - static final String CHANNEL_SFTP_TYPE = "sftp"; - private static final String TERMINAL_BASIC_MODE = "vt102"; - static final String STRICT_HOST_CHECK_KEY = "StrictHostKeyChecking"; - static final String STRICT_HOST_CHECK_VALUE = "no"; - static final String DELIMITERS_SEPARATOR = "|"; - + 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 int BUFFER_SIZE = 512000; + char[] charBuffer = new char[BUFFER_SIZE]; + // private int BUFFER_SIZE = 4000000; + 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"; private String routerFileName = null; private File jcraftReadSwConfigFileFromDisk = new File("/tmp/jcraftReadSwConfigFileFromDisk"); private String equipNameCode = null; - private String routerName = null; private String hostName = null; private String userName = null; private String passWord = null; - private int readIntervalMs = 500; - private int readBufferSizeBytes = 512_000; - private int charsChunkSize = 300_000; - private int sessionTimeoutMs = 9_000; - private char[] charBuffer; + private StringBuffer charactersFromBufferFlush = new StringBuffer(); private Runtime runtime = Runtime.getRuntime(); + private DebugLog dbLog = new DebugLog(); - public SshJcraftWrapper() { - this.jsch = new JSch(); - this.charBuffer = new char[readBufferSizeBytes]; - } - - SshJcraftWrapper(JSch jsch, int readIntervalMs, int readBufferSizeBytes) { - this.readIntervalMs = readIntervalMs; - this.jsch = jsch; - this.readBufferSizeBytes = readBufferSizeBytes; - this.charBuffer = new char[readBufferSizeBytes]; + public void SshJcraftWrapper() { + String fn = "SshJcraftWrapper.SshJcraftWrapper"; + debugLog.printRTAriDebug(fn, "SshJcraftWrapper has been instantated"); + routerLogFileName = "/tmp/" + host; + this.host = 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); - routerName = hostname; + String fn = "SshJcraftWrapper.connect"; + jsch = new JSch(); + 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())), - readBufferSizeBytes); + session = jsch.getSession(username, hostname, 22); + UserInfo ui = new MyUserInfo(); + session.setPassword(password); + session.setUserInfo(ui); + session.connect(timeOut); + channel = session.openChannel("shell"); + session.setServerAliveCountMax( + 0); // If this is not set to '0', then socket timeout on all reads will not work!!!! + ((ChannelShell) channel).setPtyType("vt102"); + inputStream = channel.getInputStream(); + dis = new DataInputStream(inputStream); + reader = new BufferedReader(new InputStreamReader(dis), BUFFER_SIZE); channel.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(Msg.CANNOT_ESTABLISH_CONNECTION, hostname, String.valueOf(DEFAULT_PORT), username); + } catch (Exception e) { + debugLog.printRTAriDebug(fn, "Caught an Exception. e=" + e); + // dbLog.storeData("ErrorMsg= Exception trying to connect to "+hostname +" "+e); throw new IOException(e.toString()); } } @@ -138,42 +143,66 @@ 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); - routerName = hostname; + 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 = new JSch(); try { - channel = provideSessionChannel(CHANNEL_SHELL_TYPE, portNum, timeOut); - ((ChannelShell) channel).setPtyType(TERMINAL_BASIC_MODE); - reader = new BufferedReader(new InputStreamReader(new DataInputStream(channel.getInputStream())), - readBufferSizeBytes); + 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), BUFFER_SIZE); 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(Msg.CANNOT_ESTABLISH_CONNECTION, hostname, String.valueOf(portNum), username); + } catch (Exception e) { + debugLog.printRTAriDebug(fn, ":Caught an Exception. e=" + e); + dbLog.outputStackTrace(e); + + // dbLog.storeData("ErrorMsg= Exception trying to connect to "+hostname +" "+e); throw new IOException(e.toString()); } } - public String receiveUntil(String delimeters, int timeout, String cmdThatWasSent) throws IOException { - checkConnection(); + 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; @@ -183,16 +212,22 @@ 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(Msg.SSH_CONNECTION_TIMEOUT, 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"); } - sleep(readIntervalMs); - int len = reader.read(charBuffer, 0, readBufferSizeBytes); - log.trace("After reader. Read command len={0}", len); + try { + Thread.sleep(500); + } catch (java.lang.InterruptedException ee) { + boolean ignore = true; + } + int len = reader.read(charBuffer, 0, BUFFER_SIZE); + appendToFile(debugLogFileName, fn + " After reader.read cmd: len=" + len + "\n"); if (len <= 0) { - log.error(Msg.SSH_CONNECTION_TIMEOUT, routerName, cmdThatWasSent); - 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) { @@ -200,24 +235,26 @@ 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(); fileWriter = new FileWriter(routerFileName); out = new BufferedWriter(fileWriter); - routerLogFileName = "/tmp/" + routerName; - tmpFile = new File(routerLogFileName); - log.debug("Prepared for writing swConfigFile to disk, routerFileName=" + routerFileName); + 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(); - log.debug("{0} bytes has been written to the disk", len); - if (tmpFile.exists()) { + 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; @@ -225,96 +262,93 @@ 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); + 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); + debugLog.printRTAriDebug(fn, "cliPromptCmd, Trace 2"); + sb2.setLength(0); for (int i = 0; i < len; i++) { - sbReceive.append(charBuffer[i]); - sb.append(charBuffer[i]); + sbReceive.append((char) charBuffer[i]); + sb2.append((char) charBuffer[i]); } - appendToRouterFile("/tmp/" + routerName, sb); + appendToRouterFile("/tmp/" + RouterName, sb2); if (listener != null) { - listener.receivedString(sb.toString()); + listener.receivedString(sb2.toString()); } - log.debug("sb2={0} delimiters={1}", sb.toString(), delimeters); - if (sb.toString().contains("\nariPrompt>")) { - log.debug("Found ari prompt"); + debugLog.printRTAriDebug(fn, "sb2='" + sb2.toString() + "' delimeters='" + delimeters + "'"); + if (sb2.toString().indexOf("\nariPrompt>") != -1) { + debugLog.printRTAriDebug(fn, "Found our prompt"); + match = true; break; } } } - } catch (JSchException | IOException e) { - log.error(Msg.SSH_DATA_EXCEPTION, e.getMessage()); - throw new TimedOutException(e.getMessage()); + } catch (JSchException e) { + 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); - } - } - return stripOffCmdFromRouterResponse(sbReceive.toString()); - } - - private void sleep(long timeoutMs) { - try { - TimeUnit.MILLISECONDS.sleep(timeoutMs); - } catch (java.lang.InterruptedException ee) { - Thread.currentThread().interrupt(); - } - } - - private void checkConnection() { - try { - if (!isConnected() || !reader.ready()) { - throw new IllegalStateException("Connection not established. Cannot perform action."); + } catch(IOException ex) { + debugLog.printRTAriDebug(fn, "Failed to close fileWriter output stream: ex=" + ex); } - } catch (IOException e) { - throw new IllegalStateException("Reader stream is closed. Cannot perform action.", e); } + 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); - StringTokenizer st = new StringTokenizer(delimeters, DELIMITERS_SEPARATOR); + 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 " #". @@ -323,172 +357,217 @@ 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); + e.printStackTrace(); } } else { + // DebugLog.printAriDebug(fnName, "TRACE 1: ******************************"); // 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); + e.printStackTrace(); } } } - 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)) { - String command = enhanceCommandWithEOL(cmd); - int length = command.length(); - log.debug("Sending ssh command: length={0}, payload: {1}", command.length(), command); - if(isCmdLengthEnoughToSendInChunks(length, charsChunkSize)) { - sendSshCommandInChunks(command, dos); + 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 { - sendSshCommand(command, dos); + 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(Msg.SSH_DATA_EXCEPTION, e.getMessage()); - 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 = new DataOutputStream(out); + try { + debugLog.printRTAriDebug(fn, "Sending: '" + v + "'"); dos.writeChar(v); dos.flush(); } catch (IOException e) { - log.error(Msg.SSH_DATA_EXCEPTION, e.getMessage()); - 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 = new DataOutputStream(out); + try { dos.write(b, off, len); dos.flush(); } catch (IOException e) { - log.error(Msg.SSH_DATA_EXCEPTION, e.getMessage()); - 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; } } @@ -496,103 +575,184 @@ 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.warn("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()) { + BufferedWriter out = new BufferedWriter(new FileWriter(fileName, true)); + // out.write(dataToWrite); + // out.write(getTheDate() +": " +Thread.currentThread().getName() +": "+dataToWrite); + out.write(getTheDate() + ": " + tId + ": " + dataToWrite); + out.close(); + } + } 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()) { + BufferedWriter out = new BufferedWriter(new FileWriter(fileName, true)); + out.write(dataToWrite); + out.close(); } + } 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 df1 = DateFormat.getDateInstance(); + 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()) && (tmpFile.setWritable(true, true))) + if (tmpFile.exists()) { + BufferedWriter out = new BufferedWriter(new FileWriter(fileName, true)); + // out.write("<!-- "+getTheDate() +": " +tId +" -->\n"); + out.write(dataToWrite.toString()); + out.close(); + } + } + } catch (IOException e) { + System.err.println("writeToFile() exception: " + e); + e.printStackTrace(); + } } 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.warn("Could not write data to router file:" + fileName, e); + String fnName = "SshJcraftWrapper.appendToFile"; + // 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. + File tmpFile = new File(fileName); + // if ((tmpFile.exists()) && (tmpFile.setWritable(true, true))) + if (tmpFile.exists()) { + BufferedWriter out = new BufferedWriter(new FileWriter(fileName, true)); + // out.write("<!-- "+getTheDate() +": " +tId +" -->\n"); + out.write(charBuffer, 0, len); + out.close(); } + } catch (IOException e) { + System.err.println("writeToFile() exception: " + e); + e.printStackTrace(); } } public String removeWhiteSpaceAndNewLineCharactersAroundString(String str) { - if (str != null && !StringUtils.EMPTY.equals(str)) { - StringTokenizer strTok = new StringTokenizer(str, EOL); - StringBuilder sb = new StringBuilder(); + if (str != null) { + StringTokenizer strTok = new StringTokenizer(str, "\n"); + 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) { + String fn = "SshJcraftWrapper.stripOffCmdFromRouterResponse"; + // appendToFile(debugLogFileName, fn+": routerResponse='"+routerResponse +"'\n"); + // 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. - String[] responseTokens = routerResponse.split(EOL, 2); - return responseTokens[responseTokens.length - 1]; + StringTokenizer rr = new StringTokenizer(routerResponse, "\n"); + StringBuffer sb = new StringBuffer(); + + int numTokens = rr.countTokens(); + // 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()) { + sb.append(rr.nextToken() + '\n'); + } + } + 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 { + public String getLastFewLinesOfFile(File file, int linesToRead) throws IOException { + String fn = "SshJcraftWrapper.getLastFewLinesOfFile"; + RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r"); + int lines = 0; + StringBuilder builder = new StringBuilder(); String tail = ""; - 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.append(tail).toString(); - lines++; - builder.setLength(0); - if (lines == linesToRead) { - break; - } + 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(); + // System.out.println(builder.toString()); + tail = builder.toString() + tail; + lines++; + builder.setLength(0); + if (lines == linesToRead) { + break; } } } - if (log.isDebugEnabled()) { - log.debug("Content read from file={0} was tail={1}", file.getName(), tail); + randomAccessFile.close(); + 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) { @@ -600,15 +760,20 @@ public class SshJcraftWrapper { } public String getRouterName() { - return routerName; + return (RouterName); } // Routine does reads until it has read 'nchars' or times out. - public String receiveUntilBufferFlush(int ncharsSent, int timeout, String command) throws IOException { - log.debug("ncharsSent={0}, timeout={1}, message={2}", ncharsSent, timeout, command); + public void receiveUntilBufferFlush(int ncharsSent, int timeout, String message) + throws TimedOutException, IOException { + String fn = "SshJcraftWrapper.receiveUntilBufferFlush"; + StringBuffer sb2 = new StringBuffer(); + StringBuffer sbReceive = new StringBuffer(); + debugLog.printRTAriDebug(fn, "ncharsSent=" + ncharsSent + " timeout=" + timeout + " " + message); int ncharsTotalReceived = 0; int ncharsRead = 0; - StringBuilder received = new StringBuilder(); + boolean flag = false; + charactersFromBufferFlush.setLength(0); long deadline = new Date().getTime() + timeout; logMemoryUsage(); @@ -616,65 +781,120 @@ public class SshJcraftWrapper { session.setTimeout(timeout); // This is the socket timeout value. while (true) { if (new Date().getTime() > deadline) { - log.error(Msg.SSH_CONNECTION_TIMEOUT, routerName, command); - throw new TimedOutException("Routine has timed out"); - } - ncharsRead = reader.read(charBuffer, 0, readBufferSizeBytes); - if(ncharsRead >=0) { - received.append(charBuffer, 0, ncharsRead); + debugLog.printRTAriDebug(fn, + "Throwing a TimedOutException: time in routine has exceed our deadline: ncharsSent=" + + ncharsSent + " ncharsTotalReceived=" + ncharsTotalReceived); + flag = true; + throw new TimedOutException("Timeout: time in routine has exceed our deadline"); } + ncharsRead = reader.read(charBuffer, 0, BUFFER_SIZE); 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); 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 received.toString(); + return; } } } catch (JSchException e) { - log.error(Msg.SSH_SESSION_CONFIG_ERROR, e.getMessage()); - 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 sftpPut(String sourcePath, String destDirectory) throws IOException { + String fn = "SshJcraftWrapper.sftp"; + try { + 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(); + debugLog.printRTAriDebug(fn, "Sending " + sourcePath + " --> " + destDirectory); + sftp.put(sourcePath, destDirectory, ChannelSftp.OVERWRITE); + debugLog.printRTAriDebug(fn, "Sent successfully"); + sftpSession.disconnect(); + } catch (Exception e) { + debugLog.printRTAriDebug(fn, "Caught an Exception, e=" + e); + // dbLog.storeData("ErrorMsg= sftp threw an Exception. error is:"+e); + throw new IOException(e.toString()); + } } - public void sftpPutStringData(String stringOfData, String fullPathDest) throws IOException { - ChannelSftp sftp = null; + + public void SftpPut(String stringOfData, String fullPathDest) throws IOException { + String fn = "SshJcraftWrapper.Sftp"; try { + 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()); - sftp = getSftpConnection(hostName, userName, passWord); - log.debug("Sending via sftp stringOfData to destination: {0}", fullPathDest); + debugLog.printRTAriDebug(fn, "Sending stringOfData --> " + fullPathDest); sftp.put(is, fullPathDest, ChannelSftp.OVERWRITE); - } catch (JSchException ex) { - log.error(Msg.CANNOT_ESTABLISH_CONNECTION, hostName, String.valueOf(DEFAULT_PORT), userName); - throw new IOException(ex.getMessage()); - } catch (SftpException ex) { - log.error(Msg.SFTP_TRANSFER_FAILED, hostName, userName, "PUT", ex.getMessage()); - throw new IOException(ex.getMessage()); - } finally { - disconnectSftp(sftp); + debugLog.printRTAriDebug(fn, "Sent successfully"); + sftpSession.disconnect(); + } catch (Exception e) { + debugLog.printRTAriDebug(fn, "Caught an Exception, e=" + e); + // dbLog.storeData("ErrorMsg= sftp threw an Exception. error is:"+e); + throw new IOException(e.toString()); } } public String sftpGet(String fullFilePathName) throws IOException { - return get(fullFilePathName, hostName, userName, passWord); + String fn = "SshJcraftWrapper.Sftp"; + try { + 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 = null; + in = sftp.get(fullFilePathName); + String sftpFileString = readInputStreamAsString(in); + 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); + throw new IOException(e.toString()); + } } public static String readInputStreamAsString(InputStream in) throws IOException { @@ -689,238 +909,266 @@ public class SshJcraftWrapper { return buf.toString(); } + 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 = new JSch(); 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())), - readBufferSizeBytes); - channel.connect(5000); - } catch (JSchException e) { - log.error(Msg.CANNOT_ESTABLISH_CONNECTION, hostname, String.valueOf(portNum), username); - throw new IOException(e.getMessage()); + // ((ChannelSubsystem)channel).setPtyType("vt102"); + ((ChannelSubsystem) channel).setPty(true); + + inputStream = channel.getInputStream(); + 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...."); + try { + Thread.sleep(5000); + } catch (java.lang.InterruptedException ee) { + boolean ignore = true; + } + } 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 = new JSch(); + 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())), - readBufferSizeBytes); + 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); + session.setUserInfo(ui); + session.connect(30000); + channel = session.openChannel("shell"); + session.setServerAliveCountMax( + 0); // If this is not set to '0', then socket timeout on all reads will not work!!!! + ((ChannelShell) channel).setPtyType("vt102"); + inputStream = channel.getInputStream(); + dis = new DataInputStream(inputStream); + reader = new BufferedReader(new InputStreamReader(dis), BUFFER_SIZE); channel.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(Msg.CANNOT_ESTABLISH_CONNECTION, hostName, String.valueOf(DEFAULT_PORT), username); - throw new IOException(e.getMessage()); + } catch (Exception e) { + debugLog.printRTAriDebug(fn, "Caught an Exception. e=" + e); + // dbLog.storeData("ErrorMsg= Exception trying to connect to "+hostName +" "+e); + throw new IOException(e.toString()); } } public void put(String sourcePath, String destDirectory) throws IOException { - ChannelSftp sftp = null; + String fn = "SshJcraftWrapper.sftp"; try { - sftp = getSftpConnection(hostName, userName, passWord); - log.debug("Sending via sftp from source: {0} to destination: {1}", sourcePath, destDirectory); + 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(); + debugLog.printRTAriDebug(fn, "Sending " + sourcePath + " --> " + destDirectory); sftp.put(sourcePath, destDirectory, ChannelSftp.OVERWRITE); - } catch (JSchException ex) { - log.error(Msg.CANNOT_ESTABLISH_CONNECTION, hostName, String.valueOf(DEFAULT_PORT), userName); - throw new IOException(ex.getMessage()); - } catch (SftpException ex) { - log.error(Msg.SFTP_TRANSFER_FAILED, hostName, userName, "PUT", ex.getMessage()); - throw new IOException(ex.getMessage()); - } finally { - disconnectSftp(sftp); + debugLog.printRTAriDebug(fn, "Sent successfully"); + sftpSession.disconnect(); + } catch (Exception e) { + debugLog.printRTAriDebug(fn, "Caught an Exception, e=" + e); + // dbLog.storeData("ErrorMsg= sftp threw an Exception. error is:"+e); + throw new IOException(e.toString()); } } public void put(InputStream is, String fullPathDest, String hostName, String userName, String passWord) throws IOException { - ChannelSftp sftp = null; + String fn = "SshJcraftWrapper.put"; + Session sftpSession = null; try { - log.debug("Sftp put invoked, connection details: username={1} hostname={2}", userName, hostName); - sftp = getSftpConnection(hostName, userName, passWord); + debugLog.printRTAriDebug(fn, "userName=" + userName + " hostName=" + hostName); + jsch = new JSch(); + java.util.Properties config = new java.util.Properties(); + config.put("StrictHostKeyChecking", "no"); + 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); - removeOldFiles(sftp, oldFiles, hostName, userName); - log.debug("Sending stringOfData to destination {0}", fullPathDest); + debugLog.printRTAriDebug(fn, "Deleting old files --> " + oldFiles); + try { + sftp.rm(oldFiles); + 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"); + } else { + debugLog.printRTAriDebug(fn, "Exception while sftp.rm " + sft.getMessage()); + sft.printStackTrace(); + throw sft; + } + } sftp.put(is, fullPathDest, ChannelSftp.OVERWRITE); - } catch (JSchException ex) { - log.error(Msg.CANNOT_ESTABLISH_CONNECTION, hostName, String.valueOf(DEFAULT_PORT), userName); - throw new IOException(ex.getMessage()); - } catch (SftpException ex) { - log.error(Msg.SFTP_TRANSFER_FAILED, hostName, userName, "PUT", ex.getMessage()); - 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 { - disconnectSftp(sftp); - } - } - - private void removeOldFiles(ChannelSftp sftp, String oldFiles, String hostname, String username) throws SftpException { - try { - sftp.rm(oldFiles); - } catch (SftpException ex) { - if (ChannelSftp.SSH_FX_NO_SUCH_FILE == ex.id) { - log.warn("No files found, continue"); - } else { - log.error(Msg.SFTP_TRANSFER_FAILED, hostname, username, "RM", ex.getMessage()); - throw ex; + if(sftpSession != null) { + sftpSession.disconnect(); } } } + public String get(String fullFilePathName, String hostName, String userName, String passWord) throws IOException { - ChannelSftp sftp = null; + String fn = "SshJcraftWrapper.get"; + Session sftpSession = null; try { - log.debug("Sftp get invoked, connection details: username={1} hostname={2}", - userName, hostName); - sftp = getSftpConnection(hostName, userName, passWord); + debugLog.printRTAriDebug(fn, "userName=" + userName + " hostName=" + hostName); + jsch = new JSch(); + sftpSession = jsch.getSession(userName, hostName, 22); + java.util.Properties config = new java.util.Properties(); + config.put("StrictHostKeyChecking", "no"); + 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(); InputStream in = sftp.get(fullFilePathName); - return readInputStreamAsString(in); - } catch (JSchException ex) { - log.error(Msg.CANNOT_ESTABLISH_CONNECTION, hostName, String.valueOf(DEFAULT_PORT), userName); - throw new IOException(ex.getMessage()); - } catch (SftpException ex) { - log.error(Msg.SFTP_TRANSFER_FAILED, hostName, userName, "GET", ex.getMessage()); - 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 { - disconnectSftp(sftp); - } - } - - private void disconnectSftp (ChannelSftp sftp) { - if (sftp != null) { - sftp.disconnect(); - } - if (session != null) { - session.disconnect(); - session = null; + if(sftpSession != null) { + sftpSession.disconnect(); + } } } - ChannelSftp getSftpConnection(String hostname, String username, String password) throws JSchException { - connectSession(hostname, username, password, DEFAULT_PORT, 30_000); - ChannelSftp sftp = openSftpChannel(session); - sftp.connect(); - return sftp; - } - - ChannelSftp openSftpChannel(Session sftpSession) throws JSchException { - return (ChannelSftp) sftpSession.openChannel(CHANNEL_SFTP_TYPE); - } - public String send(String cmd, String delimiter) throws IOException { - try (OutputStream os = channel.getOutputStream(); DataOutputStream dos = new DataOutputStream(os)) { - String command = enhanceCommandWithEOL(cmd); - int length = command.length(); - log.debug("Sending ssh command: length={0}, payload: {1}", command.length(), command); - if(isCmdLengthEnoughToSendInChunks(length, charsChunkSize)) { - return sendSshCommandInChunks(command, dos); - } else { - sendSshCommand(command, dos); - return receiveUntil(delimiter, 300000, cmd); - } - } - } + String fn = "SshJcraftWrapper.send"; + OutputStream out = channel.getOutputStream(); + DataOutputStream dos = new DataOutputStream(out); - private void sendSshCommand(@Nonnull String command, @Nonnull DataOutputStream channelOutputStream) - throws IOException { - channelOutputStream.writeBytes(command); - channelOutputStream.flush(); - } - - private String sendSshCommandInChunks(@Nonnull String command, @Nonnull DataOutputStream channelOutputStream) throws IOException { - StringBuilder received = new StringBuilder(); - int charsTotalSent = 0; - int length = command.length(); - 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) { - received.append(receiveUntilBufferFlush(numCharsSentInChunk, sessionTimeoutMs, command)); - } else { - log.trace("i={0}, flush immediately", i); - channelOutputStream.flush(); + 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; + + 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."); + } } - } catch (IOException ex) { - log.warn("IOException occurred: nothing to flush out", ex); + } 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()); } - return received.toString(); - } - - public void setSessionTimeoutMs(int sessionTimeoutMs) { - this.sessionTimeoutMs = sessionTimeoutMs; - } - - void setCharsChunkSize(int charsChunkSize) { - this.charsChunkSize = charsChunkSize; - } - - 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 + EOL; - } - return originalCommand; - } - - private Channel provideSessionChannel(String channelType, int port, int timeout) throws JSchException { - connectSession(this.hostName, this.userName, this.passWord, port, timeout); - session.setServerAliveCountMax( - 0); // If this is not set to '0', then socket timeout on all reads will not work!!!! - return session.openChannel(channelType); } - private void connectSession(String hostname, String username, String password, int port, int timeout) throws JSchException { - session = jsch.getSession(username, hostname, port); - session.setPassword(password); - session.setUserInfo(new MyUserInfo()); //needed? - session.setConfig(STRICT_HOST_CHECK_KEY, STRICT_HOST_CHECK_VALUE); - session.connect(timeout); - } } |