diff options
Diffstat (limited to 'appc-config/appc-config-adaptor')
6 files changed, 1753 insertions, 2350 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); - } } diff --git a/appc-config/appc-config-adaptor/provider/src/test/java/org/onap/appc/ccadaptor/ConfigComponentAdaptorTest.java b/appc-config/appc-config-adaptor/provider/src/test/java/org/onap/appc/ccadaptor/ConfigComponentAdaptorTest.java index 3e41664da..534606670 100644 --- a/appc-config/appc-config-adaptor/provider/src/test/java/org/onap/appc/ccadaptor/ConfigComponentAdaptorTest.java +++ b/appc-config/appc-config-adaptor/provider/src/test/java/org/onap/appc/ccadaptor/ConfigComponentAdaptorTest.java @@ -2,34 +2,27 @@ * ============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 * ============================================================================= * 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. - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * * ============LICENSE_END========================================================= */ package org.onap.appc.ccadaptor; -import static org.onap.appc.ccadaptor.ConfigComponentAdaptor.GET_CONFIG_TEMPLATE_PARAM; -import static org.onap.appc.ccadaptor.ConfigComponentAdaptor.HOST_IP_PARAM; -import static org.onap.appc.ccadaptor.ConfigComponentAdaptor.PASSWORD_PARAM; -import static org.onap.appc.ccadaptor.ConfigComponentAdaptor.PORT_NUMBER_PARAM; -import static org.onap.appc.ccadaptor.ConfigComponentAdaptor.USERNAME_PARAM; - import java.util.HashMap; import java.util.Map; import java.util.Properties; @@ -48,11 +41,11 @@ public class ConfigComponentAdaptorTest { String Get_config_template = ("get_config_template"); String key = "GetCliRunningConfig"; Map<String, String> parameters = new HashMap<>(); - parameters.put(HOST_IP_PARAM, "test"); - parameters.put(USERNAME_PARAM, "test"); - parameters.put(PASSWORD_PARAM, "password"); - parameters.put(PORT_NUMBER_PARAM, "22"); - parameters.put(GET_CONFIG_TEMPLATE_PARAM, Get_config_template); + parameters.put("Host_ip_address", "test"); + parameters.put("User_name", "test"); + parameters.put("Password", "password"); + parameters.put("Port_number", "22"); + parameters.put("Get_config_template", Get_config_template); SvcLogicContext ctx = new SvcLogicContext(); ctx.setAttribute( @@ -68,11 +61,11 @@ public class ConfigComponentAdaptorTest { String Get_config_template = ("get_config_template"); String key = "DownloadCliConfig"; Map<String, String> parameters = new HashMap<>(); - parameters.put(HOST_IP_PARAM, "test"); - parameters.put(USERNAME_PARAM, "test"); - parameters.put(PASSWORD_PARAM, "password"); - parameters.put(PORT_NUMBER_PARAM, "22"); - parameters.put(GET_CONFIG_TEMPLATE_PARAM, Get_config_template); + parameters.put("Host_ip_address", "test"); + parameters.put("User_name", "test"); + parameters.put("Password", "password"); + parameters.put("Port_number", "22"); + parameters.put("Get_config_template", Get_config_template); SvcLogicContext ctx = new SvcLogicContext(); ctx.setAttribute( @@ -88,11 +81,11 @@ public class ConfigComponentAdaptorTest { String Get_config_template = ("get_config_template"); String key = "xml-download"; Map<String, String> parameters = new HashMap<>(); - parameters.put(HOST_IP_PARAM, "test"); - parameters.put(USERNAME_PARAM, "test"); - parameters.put(PASSWORD_PARAM, "password"); - parameters.put(PORT_NUMBER_PARAM, "22"); - parameters.put(GET_CONFIG_TEMPLATE_PARAM, Get_config_template); + parameters.put("Host_ip_address", "test"); + parameters.put("User_name", "test"); + parameters.put("Password", "password"); + parameters.put("Port_number", "22"); + parameters.put("Get_config_template", Get_config_template); SvcLogicContext ctx = new SvcLogicContext(); ctx.setAttribute( @@ -108,11 +101,11 @@ public class ConfigComponentAdaptorTest { String Get_config_template = ("get_config_template"); String key = "xml-getrunningconfig"; Map<String, String> parameters = new HashMap<>(); - parameters.put(HOST_IP_PARAM, "test"); - parameters.put(USERNAME_PARAM, "test"); - parameters.put(PASSWORD_PARAM, "password"); - parameters.put(PORT_NUMBER_PARAM, "22"); - parameters.put(GET_CONFIG_TEMPLATE_PARAM, Get_config_template); + parameters.put("Host_ip_address", "test"); + parameters.put("User_name", "test"); + parameters.put("Password", "password"); + parameters.put("Port_number", "22"); + parameters.put("Get_config_template", Get_config_template); SvcLogicContext ctx = new SvcLogicContext(); ctx.setAttribute( @@ -128,11 +121,11 @@ public class ConfigComponentAdaptorTest { String Get_config_template = ("get_config_template"); String key = "escapeSql"; Map<String, String> parameters = new HashMap<>(); - parameters.put(HOST_IP_PARAM, "test"); - parameters.put(USERNAME_PARAM, "test"); - parameters.put(PASSWORD_PARAM, "password"); - parameters.put(PORT_NUMBER_PARAM, "22"); - parameters.put(GET_CONFIG_TEMPLATE_PARAM, Get_config_template); + parameters.put("Host_ip_address", "test"); + parameters.put("User_name", "test"); + parameters.put("Password", "password"); + parameters.put("Port_number", "22"); + parameters.put("Get_config_template", Get_config_template); SvcLogicContext ctx = new SvcLogicContext(); ctx.setAttribute( @@ -149,13 +142,13 @@ public class ConfigComponentAdaptorTest { String Download_config_template = ("test"); String key = "GetCliRunningConfig"; Map<String, String> parameters = new HashMap<>(); - parameters.put(HOST_IP_PARAM, "test"); - parameters.put(USERNAME_PARAM, "test"); - parameters.put(PASSWORD_PARAM, "password"); - parameters.put(PORT_NUMBER_PARAM, "22"); + parameters.put("Host_ip_address", "test"); + parameters.put("User_name", "test"); + parameters.put("Password", "password"); + parameters.put("Port_number", "22"); + parameters.put("Get_config_template", Get_config_template); parameters.put("Protocol", "netconf"); parameters.put("Contents", "Contents"); - parameters.put(GET_CONFIG_TEMPLATE_PARAM, Get_config_template); parameters.put("Download_config_template", Download_config_template); parameters.put("Config_contents", "test"); @@ -180,7 +173,7 @@ public class ConfigComponentAdaptorTest { cca.configure(key, parameters, ctx); } - @Test + //@Test public void testAll2() { Properties props = null; ConfigComponentAdaptor cca = new ConfigComponentAdaptor(props); @@ -269,4 +262,5 @@ public class ConfigComponentAdaptorTest { String result = Whitebox.invokeMethod(cca, "prepare", ctx, "test", "test"); Assert.assertEquals("template", result); } + } diff --git a/appc-config/appc-config-adaptor/provider/src/test/java/org/onap/appc/ccadaptor/DebugLogTest.java b/appc-config/appc-config-adaptor/provider/src/test/java/org/onap/appc/ccadaptor/DebugLogTest.java new file mode 100644 index 000000000..2c86cbb9a --- /dev/null +++ b/appc-config/appc-config-adaptor/provider/src/test/java/org/onap/appc/ccadaptor/DebugLogTest.java @@ -0,0 +1,91 @@ +/*-
+ * ============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 static junit.framework.TestCase.assertTrue;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class DebugLogTest {
+
+ @BeforeClass
+ public static void createEmptyLogFile() throws IOException {
+ Path logPath = Paths.get(buildTestResourcePath("rt.log"));
+ Files.createFile(logPath);
+ }
+
+ @AfterClass
+ public static void removeLog() throws IOException {
+ Path existingLogPath = Paths.get(buildTestResourcePath("rt.log"));
+ Files.delete(existingLogPath);
+ }
+
+ //@Test
+ public void printRTAriDebug_shouldNotDoAnything_whenLogFileDoesNotExist() {
+ // GIVEN
+ Path nonExistingLogPath = Paths.get(buildTestResourcePath("nonExisting.log"));
+
+ // WHEN
+ // DebugLog debugLog = new DebugLog(nonExistingLogPath);
+ DebugLog debugLog = new DebugLog();
+ debugLog.printRTAriDebug("testMethod", "Custom Debug Message");
+
+ // THEN
+ assertTrue(Files.notExists(nonExistingLogPath));
+ }
+
+ //@Test
+ public void printRTAriDebug_shouldWriteMessageToLogWithDate_whenLogFileExists() throws IOException {
+ // GIVEN
+ Path existingLogPath = Paths.get(buildTestResourcePath("rt.log"));
+
+ // WHEN
+ //DebugLog debugLog = new DebugLog(existingLogPath);
+ DebugLog debugLog = new DebugLog();
+ debugLog.printRTAriDebug("testMethod", "Custom Debug Message");
+
+ // THEN
+ String logEntry = readLogEntry(existingLogPath);
+ assertTrue(logEntry.matches("\\d{4}/\\d{2}/\\d{2} \\d{2}:\\d{2}:\\d{2} testMethod Custom Debug Message"));
+ }
+
+ private static String buildTestResourcePath(String resourceName) {
+ String path = DebugLogTest.class.getClassLoader().getResource("./").getPath();
+ return path + resourceName;
+ }
+
+ private String readLogEntry(Path path) throws IOException {
+ try (BufferedReader br = new BufferedReader(new FileReader(path.toFile()))) {
+ return br.readLine();
+ }
+ }
+}
diff --git a/appc-config/appc-config-adaptor/provider/src/test/java/org/onap/appc/ccadaptor/SshJcraftWrapperTest.java b/appc-config/appc-config-adaptor/provider/src/test/java/org/onap/appc/ccadaptor/SshJcraftWrapperTest.java index 305f7f5a9..ce2b385b2 100644 --- a/appc-config/appc-config-adaptor/provider/src/test/java/org/onap/appc/ccadaptor/SshJcraftWrapperTest.java +++ b/appc-config/appc-config-adaptor/provider/src/test/java/org/onap/appc/ccadaptor/SshJcraftWrapperTest.java @@ -2,23 +2,22 @@ * ============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 * ============================================================================= * 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. - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * * ============LICENSE_END========================================================= */ @@ -71,98 +70,50 @@ import org.apache.commons.io.IOUtils; @RunWith(MockitoJUnitRunner.class) public class SshJcraftWrapperTest { - - private static final String USER = "username"; - private static final String PASS = "pass"; - private static final String HOST = "hostname"; - private static final String SUBSYSTEM = "netconf"; - private static final String PROMPT = "]]>]]>"; - private static final String SEARCH_STR = "</rpc-reply>"; - private static final String REMOTE_PATH = "/var/tmp/path/"; - private static final String SOURCE_PATH = "/tmp/local/path/"; - private static final String IO_EXCEPTION_MSG = "IOException should be thrown"; - private static final int READ_TIMEOUT = 180_000; - private static final int PORT_NUM = 23; - private static final int SESSION_TIMEOUT = 30_000; - private static final int READ_INTERVAL_MS = 1; - private static final int READ_BUFFER_SIZE = 10; - - private SshJcraftWrapper cut; - @Mock - private JSch jSchMock; - @Mock - private Session session; - @Mock - private ChannelShell channelShell; - @Mock - private ChannelSubsystem channelSubsystem; - @Mock - private InputStream channelIs; - @Mock - private OutputStream channelOs; - @Mock - private ChannelSftp channelSftp; - - @Before - public void setUpTest() throws Exception { - InputStream is = IOUtils.toInputStream("test input stream:~#", "UTF-8"); - given(channelShell.getInputStream()).willReturn(is); - given(channelSubsystem.getInputStream()).willReturn(is); - given(session.openChannel(SshJcraftWrapper.CHANNEL_SHELL_TYPE)).willReturn(channelShell); - given(session.openChannel(SshJcraftWrapper.CHANNEL_SUBSYSTEM_TYPE)).willReturn(channelSubsystem); - given(jSchMock.getSession(anyString(), anyString(), anyInt())).willReturn(session); - cut = new SshJcraftWrapper(jSchMock, READ_INTERVAL_MS, READ_BUFFER_SIZE); - } - - @Ignore @Test - public void TestCheckIfReceivedStringMatchesDelimeter() { + public void TestCheckIfReceivedStringMatchesDelimeter(){ SshJcraftWrapper wrapper = new SshJcraftWrapper(); wrapper.getTheDate(); boolean result = wrapper.checkIfReceivedStringMatchesDelimeter("#", "test#", "test#"); Assert.assertEquals(true, result); } - @Ignore @Test - public void testRemoveWhiteSpaceAndNewLineCharactersAroundString() { + public void testRemoveWhiteSpaceAndNewLineCharactersAroundString(){ SshJcraftWrapper wrapper = new SshJcraftWrapper(); String nameSpace = wrapper.removeWhiteSpaceAndNewLineCharactersAroundString("namespace "); Assert.assertEquals("namespace", nameSpace); } - @Ignore @Test - public void testStripOffCmdFromRouterResponse() { + public void testStripOffCmdFromRouterResponse(){ SshJcraftWrapper wrapper = new SshJcraftWrapper(); String result = wrapper.stripOffCmdFromRouterResponse("test\nsuccess"); Assert.assertEquals("success\n", result); } //@Test - public void testGetLastFewLinesOfFile() throws FileNotFoundException, IOException { + public void testGetLastFewLinesOfFile() throws FileNotFoundException, IOException{ SshJcraftWrapper wrapper = new SshJcraftWrapper(); URL path = SshJcraftWrapperTest.class.getResource("Test"); File file = new File(path.getFile()); - String value = wrapper.getLastFewLinesOfFile(file, 1); + String value = wrapper.getLastFewLinesOfFile(file,1); Assert.assertEquals("\nTest data 3", value); } - @Ignore - @Test(expected = Exception.class) - public void testSetRouterCommandType() throws IOException { + @Test(expected=Exception.class) + public void testSetRouterCommandType() throws IOException{ SshJcraftWrapper wrapper = new SshJcraftWrapper(); wrapper.setRouterCommandType("test"); wrapper.receiveUntil("test", 2, "test"); } - @Ignore @Test - public void testValues() throws IOException { + public void testValues() throws IOException{ SshJcraftWrapper wrapper = new SshJcraftWrapper(); wrapper.setEquipNameCode("testcode"); wrapper.setRouterCommandType("testcommand"); - String equipName = wrapper.getEquipNameCode(); + String equipName =wrapper.getEquipNameCode(); wrapper.getHostName(); wrapper.getPassWord(); wrapper.getRouterName(); @@ -171,1009 +122,19 @@ public class SshJcraftWrapperTest { Assert.assertEquals("testcode", equipName); } - @Ignore - @Test(expected = Exception.class) - public void testSetRouterCommandType2() throws IOException { + @Test(expected=Exception.class) + public void testSetRouterCommandType2() throws IOException{ SshJcraftWrapper wrapper = new SshJcraftWrapper(); wrapper.appendToRouterFile("test", 2); - StringBuilder sb = new StringBuilder(); - sb.append("test"); - wrapper.appendToRouterFile("Test.txt", sb); + StringBuffer buffer = new StringBuffer(); + buffer.append("test"); + wrapper.appendToRouterFile("Test.txt", buffer); wrapper.receiveUntilBufferFlush(3, 4, "test"); } - @Ignore - @Test(expected = Exception.class) - public void testSetRouterCommandType3() throws IOException { + @Test(expected=Exception.class) + public void testSetRouterCommandType3() throws IOException{ SshJcraftWrapper wrapper = new SshJcraftWrapper(); wrapper.checkIfReceivedStringMatchesDelimeter(3, "test"); } - - //real jUnits - @Test(expected = IOException.class) - public void connect_shouldThrowIOException_whenJSchFails() throws Exception { - //given - given(jSchMock.getSession(anyString(), anyString(), anyInt())).willThrow(new JSchException()); - - //when - cut.connect(HOST, USER, PASS); - - //then - fail(IO_EXCEPTION_MSG); - } - - @Test - public void connect_shouldSetVariables() throws Exception { - //when - cut.connect(HOST, USER, PASS); - - //then - assertEquals(HOST, cut.getHostName()); - assertEquals(HOST, cut.getRouterName()); - assertEquals(USER, cut.getUserName()); - assertEquals(PASS, cut.getPassWord()); - } - - @Test - public void connect_shouldSetUpSessionWithProperInvocationOrder() throws Exception { - //given - InOrder inOrder = inOrder(session, channelShell); - - //when - cut.connect(HOST, USER, PASS); - - //then - verifySessionConfigurationOrderForChannelShellOpening( - inOrder, USER, HOST, PASS, SshJcraftWrapper.DEFAULT_PORT, SESSION_TIMEOUT); - } - - @Test - public void connect_shouldFinishSuccessfully_whenExceptionThrownDuringReceivingPhase() throws Exception { - //given - doThrow(new JSchException()).when(session).setTimeout(anyInt()); - - //when - cut.connect(HOST, USER, PASS); - - //then - verify(session).setTimeout(anyInt()); - } - - @Test(expected = IOException.class) - public void connect_withSubsystem_shouldThrowIOException_whenJSchFails() throws Exception { - //given - given(jSchMock.getSession(anyString(), anyString(), anyInt())).willThrow(new JSchException()); - - //when - cut.connect(HOST, USER, PASS, SESSION_TIMEOUT, PORT_NUM, SUBSYSTEM); - - //then - fail(IO_EXCEPTION_MSG); - } - - @Test - public void connect_withSubsystem_shouldSetRouterName() throws Exception { - //when - cut.connect(HOST, USER, PASS, SESSION_TIMEOUT, PORT_NUM, SUBSYSTEM); - - //then - assertEquals(HOST, cut.getRouterName()); - } - - @Test - public void connect_withSubsystem_shouldSetUpSessionWithProperInvocationOrder() throws Exception { - //given - InOrder inOrder = inOrder(session, channelSubsystem); - - //when - cut.connect(HOST, USER, PASS, SESSION_TIMEOUT, PORT_NUM, SUBSYSTEM); - - //then - verify(jSchMock).getSession(USER, HOST, PORT_NUM); - inOrder.verify(session).setPassword(PASS); - inOrder.verify(session).setUserInfo(any(UserInfo.class)); - inOrder.verify(session) - .setConfig(SshJcraftWrapper.STRICT_HOST_CHECK_KEY, SshJcraftWrapper.STRICT_HOST_CHECK_VALUE); - inOrder.verify(session).connect(SESSION_TIMEOUT); - inOrder.verify(session).setServerAliveCountMax(0); - inOrder.verify(session).openChannel(SshJcraftWrapper.CHANNEL_SUBSYSTEM_TYPE); - inOrder.verify(channelSubsystem).getInputStream(); - inOrder.verify(channelSubsystem).connect(anyInt()); - inOrder.verifyNoMoreInteractions(); - verifyNoMoreInteractions(jSchMock); - } - - @Test(expected = IOException.class) - public void connect_withPrompt_shouldThrowIOException_whenJSchFails() throws Exception { - //given - given(jSchMock.getSession(anyString(), anyString(), anyInt())).willThrow(new JSchException()); - - //when - cut.connect(HOST, USER, PASS, PROMPT, SESSION_TIMEOUT); - - //then - fail(IO_EXCEPTION_MSG); - } - - @Test - public void connect_withPrompt_shouldSetVariables() throws Exception { - //when - cut.connect(HOST, USER, PASS, PROMPT, SESSION_TIMEOUT); - - //then - assertEquals(HOST, cut.getHostName()); - assertEquals(HOST, cut.getRouterName()); - assertEquals(USER, cut.getUserName()); - assertEquals(PASS, cut.getPassWord()); - } - - @Test - public void connect_withPrompt_shouldFinishSuccessfully_whenExceptionThrownDuringReceivingPhase() throws Exception { - //given - doThrow(new JSchException()).when(session).setTimeout(anyInt()); - - //when - cut.connect(HOST, USER, PASS, PROMPT, SESSION_TIMEOUT); - - //then - verify(session).setTimeout(anyInt()); - } - - @Test - public void connect_withPrompt_shouldSetUpSessionWithProperInvocationOrder() throws Exception { - //given - InOrder inOrder = inOrder(session, channelShell); - - //when - cut.connect(HOST, USER, PASS, PROMPT, SESSION_TIMEOUT); - - //then - verifySessionConfigurationOrderForChannelShellOpening( - inOrder, USER, HOST, PASS, SshJcraftWrapper.DEFAULT_PORT, SESSION_TIMEOUT); - } - - @Test(expected = IOException.class) - public void connect_withPort_shouldThrowIOException_whenJSchFails() throws Exception { - //given - given(jSchMock.getSession(anyString(), anyString(), anyInt())).willThrow(new JSchException()); - - //when - cut.connect(HOST, USER, PASS, PROMPT, SESSION_TIMEOUT, PORT_NUM); - - //then - fail(IO_EXCEPTION_MSG); - } - - @Test - public void connect_withPort_shouldSetVariables() throws Exception { - //when - cut.connect(HOST, USER, PASS, PROMPT, SESSION_TIMEOUT, PORT_NUM); - - //then - assertEquals(HOST, cut.getHostName()); - assertEquals(HOST, cut.getRouterName()); - assertEquals(USER, cut.getUserName()); - assertEquals(PASS, cut.getPassWord()); - } - - @Test - public void connect_withPort_shouldFinishSuccessfully_whenExceptionThrownDuringReceivingPhase() throws Exception { - //given - doThrow(new JSchException()).when(session).setTimeout(anyInt()); - - //when - cut.connect(HOST, USER, PASS, PROMPT, SESSION_TIMEOUT, PORT_NUM); - - //then - verify(session).setTimeout(anyInt()); - } - - @Test - public void connect_withPort_shouldSetUpSessionWithProperInvocationOrder() throws Exception { - //given - InOrder inOrder = inOrder(session, channelShell); - - //when - cut.connect(HOST, USER, PASS, PROMPT, SESSION_TIMEOUT, PORT_NUM); - - //then - verifySessionConfigurationOrderForChannelShellOpening(inOrder, USER, HOST, PASS, PORT_NUM, SESSION_TIMEOUT); - } - - private void verifySessionConfigurationOrderForChannelShellOpening(InOrder inOrder, String user, String host, - String pass, int port, int sessionTimeout) throws Exception { - verify(jSchMock).getSession(user, host, port); - inOrder.verify(session).setPassword(pass); - inOrder.verify(session).setUserInfo(any(UserInfo.class)); - inOrder.verify(session) - .setConfig(SshJcraftWrapper.STRICT_HOST_CHECK_KEY, SshJcraftWrapper.STRICT_HOST_CHECK_VALUE); - inOrder.verify(session).connect(sessionTimeout); - inOrder.verify(session).setServerAliveCountMax(0); - inOrder.verify(session).openChannel(SshJcraftWrapper.CHANNEL_SHELL_TYPE); - inOrder.verify(channelShell).getInputStream(); - inOrder.verify(channelShell).connect(); - inOrder.verify(session).setTimeout(anyInt()); - inOrder.verifyNoMoreInteractions(); - verifyNoMoreInteractions(jSchMock); - } - - @Test - public void closeConnection_shouldCloseReaderChannelAndSession_inAGivenOrder() throws Exception { - //given - provideConnectedSubsystemInstance(); - InOrder inOrder = inOrder(channelIs, channelSubsystem, session); - - //when - cut.closeConnection(); - - //then - inOrder.verify(channelIs).close(); - inOrder.verify(channelSubsystem).disconnect(); - inOrder.verify(session).disconnect(); - inOrder.verifyNoMoreInteractions(); - } - - @Test - public void closeConnection_shouldCloseChannelAndSession_whenClosingReaderFails() throws Exception { - //given - doThrow(new IOException("failed to close reader")).when(channelIs).close(); - provideConnectedSubsystemInstance(); - - //when - cut.closeConnection(); - - //then - verify(channelIs).close(); - verify(channelSubsystem).disconnect(); - verify(session).disconnect(); - } - - @Test - public void closeConnection_shouldBeIdempotent_whenRunOnNewInstance() throws Exception { - //given - assertFalse(cut.isConnected()); - - //when - cut.closeConnection(); - - //then - assertFalse(cut.isConnected()); - } - - @Test - public void closeConnection_shouldBeIdempotent_whenRunTwiceOnConnectedInstance() throws Exception { - //given - provideConnectedSubsystemInstance(); - - //when - cut.closeConnection(); - cut.closeConnection(); - - //then - assertFalse(cut.isConnected()); - } - - @Test - public void closeConnection_shouldCloseResourcesOnce_whenRunTwiceOnConnectedInstance() throws Exception { - //given - provideConnectedSubsystemInstance(); - - //when - cut.closeConnection(); - cut.closeConnection(); - - //then - verify(channelIs, times(1)).close(); - verify(channelSubsystem, times(1)).disconnect(); - verify(session, times(1)).disconnect(); - } - - private void provideConnectedSubsystemInstance() throws Exception { - given(channelSubsystem.getInputStream()).willReturn(channelIs); - cut.connect(HOST, USER, PASS, SESSION_TIMEOUT, PORT_NUM, SUBSYSTEM); - assertTrue(cut.isConnected()); - } - - //receiveUntil tests begin - @Test(expected = IllegalStateException.class) - public void receiveUntil_shouldThrowIllegalStateException_whenInstanceIsNotConnected() throws Exception { - //given - assertFalse(cut.isConnected()); - - //when - cut.receiveUntil(SEARCH_STR, READ_TIMEOUT, ""); - - //then - fail("IllegalStateException should be thrown"); - } - - @Test(expected = IllegalStateException.class) - public void receiveUntil_shouldThrowIllegalStateException_whenJschReaderStreamIsNotAvailable() throws Exception { - //given - provideConnectedSubsystemInstance(); - given(channelIs.available()).willReturn(0); - - //when - cut.receiveUntil(SEARCH_STR, READ_TIMEOUT, ""); - - //then - fail("IllegalStateException should be thrown"); - } - - @Test(expected = TimedOutException.class) - public void receiveUntil_shouldThrowTimedOutException_whenSessionFails() throws Exception { - //given - given(channelSubsystem.getInputStream()).willReturn(IOUtils.toInputStream("test input stream:~#", "UTF-8")); - cut.connect(HOST, USER, PASS, SESSION_TIMEOUT, PORT_NUM, SUBSYSTEM); - assertTrue(cut.isConnected()); - doThrow(new JSchException("Session is not available")).when(session).setTimeout(anyInt()); - - //when - cut.receiveUntil(SEARCH_STR, READ_TIMEOUT, ""); - - //then - fail("TimedOutException should be thrown"); - } - - @Test(expected = TimedOutException.class) - public void receiveUntil_shouldThrowTimedOutException_whenReadFails() throws Exception { - //given - provideConnectedSubsystemInstance(); - given(channelIs.available()).willReturn(1); - given(channelIs.read(any(), anyInt(), anyInt())).willThrow(new IOException("Could not read stream")); - - //when - cut.receiveUntil(SEARCH_STR, READ_TIMEOUT, ""); - - //then - fail("TimedOutException should be thrown"); - } - - @Test(expected = TimedOutException.class) - public void receiveUntil_shouldThrowException_whenTimeoutIsReached() throws Exception { - //given - String streamContent = "test input stream:~#"; - provideConnectedSubsystemInstanceWithStreamContent(streamContent); - - //when - cut.receiveUntil(SEARCH_STR, -1000, " Some fake command\n"); - - //then - fail("TimedOutException should be thrown"); - } - - @Test(expected = TimedOutException.class) - public void receiveUntil_shouldThrowException_whenReachedEndOfStream_andCouldNotReadMoreBytes() throws Exception { - //given - provideConnectedSubsystemInstance(); - given(channelIs.available()).willReturn(1); - given(channelIs.read(any(), anyInt(), anyInt())).willReturn(-1); - - //when - cut.receiveUntil(SEARCH_STR, READ_TIMEOUT, ""); - - //then - fail("TimedOutException should be thrown"); - } - - @Test - public void receiveUntil_shouldReadUnderlyingStream_andStripOffFirstLine() throws Exception { - //given - String command = "Command" + SshJcraftWrapper.EOL; - String reply = "Reply" + SshJcraftWrapper.EOL; - String streamContent = command + reply + PROMPT; - provideConnectedSubsystemInstanceWithStreamContent(streamContent); - - //when - String result = cut.receiveUntil(PROMPT, SESSION_TIMEOUT, command); - - //then - assertEquals(reply + PROMPT, result); - } - - @Test - public void receiveUntil_shouldReadUnderlyingStream_andReturnWholeReadString() throws Exception { - //given - String streamContent = "Command and Reply in just one line" + PROMPT; - provideConnectedSubsystemInstanceWithStreamContent(streamContent); - - //when - String result = cut.receiveUntil(PROMPT, SESSION_TIMEOUT, streamContent); - - //then - assertEquals(streamContent, result); - } - - @Test - public void receiveUntil_shouldCutOffSpecialCharactersFromStream() throws Exception { - //given - char special1 = Character.UNASSIGNED; - char special2 = Character.ENCLOSING_MARK; - char special3 = Character.LINE_SEPARATOR; - char special4 = Character.MODIFIER_SYMBOL; - StringBuilder sb = new StringBuilder("Command"); - sb.append(special1).append("With").append(special2).append("Special") - .append(special3).append("Characters").append(special4).append("Set").append(PROMPT); - - provideConnectedSubsystemInstanceWithStreamContent(sb.toString()); - - //when - String result = cut.receiveUntil(PROMPT, SESSION_TIMEOUT, ""); - - //then - assertEquals("CommandWithSpecialCharactersSet" + PROMPT, result); - } - - @Test - public void receiveUntil_shouldReadUnderlyingStream_untilCLIDelimiterFound_whenProperDelimiterSet() - throws Exception { - //given - String cliDelimiter = "#$"; - String delimiters = PROMPT + SshJcraftWrapper.DELIMITERS_SEPARATOR + cliDelimiter; - String streamContent = "Command for CLI invocation #"; - provideConnectedSubsystemInstanceWithStreamContent(streamContent); - - //when - String result = cut.receiveUntil(delimiters, SESSION_TIMEOUT, streamContent); - - //then - assertEquals(streamContent, result); - } - - @Test - public void receiveUntil_shouldReadUnderlyingStream_untilCLIDelimiterFound_whenCLICommandSet() throws Exception { - //given - String streamContent = "Command for CLI invocation #"; - provideConnectedSubsystemInstanceWithStreamContent(streamContent); - cut.setRouterCommandType("CLI"); - - //when - String result = cut.receiveUntil("", SESSION_TIMEOUT, streamContent); - - //then - assertEquals(streamContent, result); - } - - @Test - public void receiveUntil_shouldReadUnderlyingStream_untilCLIDelimiterFound_forShowConfigCommand() throws Exception { - //given - String streamContent = "show config\nconfig content#"; - provideConnectedSubsystemInstanceWithStreamContent(streamContent); - - //when - String result = cut.receiveUntil("#", SESSION_TIMEOUT, streamContent); - - //then - assertEquals("config content#", result); - } - - @Test - public void receiveUntil_shouldWriteOutputToRouterFile_whenReadingIOSXRswConfigFile_confirmFromFile() - throws Exception { - receiveUntil_shouldWriteOutputToRouterFile_whenReadingIOSXRswConfigFile(); - } - - @Test - public void receiveUntil_shouldWriteOutputToRouterFile_whenReadingIOSXRswConfigFile_confirmFromBuffer() - throws Exception { - //given - int biggerBufferSize = 32; - cut = new SshJcraftWrapper(jSchMock, READ_INTERVAL_MS, biggerBufferSize); - - receiveUntil_shouldWriteOutputToRouterFile_whenReadingIOSXRswConfigFile(); - } - - private void receiveUntil_shouldWriteOutputToRouterFile_whenReadingIOSXRswConfigFile() throws Exception { - //given - String routerName = "router"; - String command = "RP/0/RP0/CPU0: " + routerName + " #IOS_XR_uploadedSwConfigCmd"; - String configFileEnding = "\nXML>"; - String streamContent = "Config file\ncontent" + configFileEnding; - provideConnectedSubsystemInstanceWithStreamContent(streamContent); - - //when - String result = cut.receiveUntil("", SESSION_TIMEOUT, command); - - //then - assertNull(result); //TO-DO: it would be better to return empty string in this situation - assertFileExist(routerName); - - //after - teardownFile(routerName); - } - - private void provideConnectedSubsystemInstanceWithStreamContent(String streamContent) throws Exception { - given(channelSubsystem.getInputStream()).willReturn(IOUtils.toInputStream(streamContent, "UTF-8")); - cut.connect(HOST, USER, PASS, SESSION_TIMEOUT, PORT_NUM, SUBSYSTEM); - assertTrue(cut.isConnected()); - } - - private void teardownFile(String routerName) { - File file = new File(routerName); - if (file.exists() && file.isFile()) { - file.delete(); - } - } - - private void assertFileExist(String fileName) { - File file = new File(fileName); - assertTrue(file.exists()); - assertTrue(file.isFile()); - } - - @Test - public void send_withReceive_shouldWriteCommandToChannelOutputStream_andReturnReceivedCommand() throws Exception { - //given - String command = "sdc"; - String delimiter = ":"; - InOrder inOrder = inOrder(channelOs); - provideConnectedSubsystemInstanceWithStreamContent(command + delimiter); - given(channelSubsystem.getOutputStream()).willReturn(channelOs); - - //when - String result = cut.send(command, delimiter); - - //then - verifySdcCommandSent(inOrder); - assertEquals(command + delimiter, result); - } - - @Test - public void send_shouldWriteCommandToChannelOutputStream() throws Exception { - //given - String command = "sdc"; - InOrder inOrder = inOrder(channelOs); - provideConnectedSubsystemInstance(); - given(channelSubsystem.getOutputStream()).willReturn(channelOs); - - //when - cut.send(command); - - //then - verifySdcCommandSent(inOrder); - } - - private void verifySdcCommandSent(InOrder inOrder) throws IOException { - inOrder.verify(channelOs).write('s'); - inOrder.verify(channelOs).write('d'); - inOrder.verify(channelOs).write('c'); - inOrder.verify(channelOs, atLeastOnce()).flush(); - inOrder.verify(channelOs, atLeastOnce()).close(); - inOrder.verifyNoMoreInteractions(); - } - - @Test - public void send_withReceive_shouldWriteCommandInChunksToChannelOutputStream_andReturnReceivedCommand() - throws Exception { - //given - cut = new SshJcraftWrapper(jSchMock, READ_INTERVAL_MS, 1); - cut.setCharsChunkSize(1); - String command = "sdc"; - String delimiter = ":"; - int timeout = 9000; - provideConnectedSubsystemInstanceWithStreamContent(command + delimiter + SshJcraftWrapper.EOL); - given(channelSubsystem.getOutputStream()).willReturn(channelOs); - InOrder inOrder = inOrder(channelOs, session); - - //when - String result = cut.send(command, delimiter); - - //then - verifySdcCommandSentInChunk(inOrder, timeout); - assertEquals(command + delimiter, result); - } - - @Test - public void send_shouldWriteCommandInChunksToChannelOutputStream() throws Exception { - //given - cut = new SshJcraftWrapper(jSchMock, READ_INTERVAL_MS, 1); - cut.setCharsChunkSize(1); - String command = "sdc"; - int timeout = 9000; - provideConnectedSubsystemInstanceWithStreamContent(command + SshJcraftWrapper.EOL); - given(channelSubsystem.getOutputStream()).willReturn(channelOs); - InOrder inOrder = inOrder(channelOs, session); - - //when - cut.send(command); - - //then - verifySdcCommandSentInChunk(inOrder, timeout); - } - - private void verifySdcCommandSentInChunk(InOrder inOrder, int timeout) throws Exception { - inOrder.verify(channelOs).write('s'); - inOrder.verify(channelOs).flush(); - inOrder.verify(session).setTimeout(timeout); - inOrder.verify(channelOs).write('d'); - inOrder.verify(channelOs).flush(); - inOrder.verify(session).setTimeout(timeout); - inOrder.verify(channelOs).write('c'); - inOrder.verify(channelOs).flush(); - inOrder.verify(session).setTimeout(timeout); - inOrder.verify(channelOs, atLeastOnce()).flush(); - inOrder.verify(channelOs, atLeastOnce()).close(); - inOrder.verifyNoMoreInteractions(); - } - - @Test - public void send_withReceive_shouldReturnActualResult_whenTimeoutReached() throws Exception { - //given - cut = new SshJcraftWrapper(jSchMock, READ_INTERVAL_MS, 1); - cut.setCharsChunkSize(1); - cut.setSessionTimeoutMs(-1); - String command = "sdc"; - String delimiter = ":"; - provideConnectedSubsystemInstanceWithStreamContent(command + SshJcraftWrapper.EOL); - given(channelSubsystem.getOutputStream()).willReturn(channelOs); - - //when - String result = cut.send(command, delimiter); - - //then - assertEquals(StringUtils.EMPTY, result); - } - - @Test - public void send_withReceive_shouldReturnActualResult_whenCouldNotSetSessionTimeout() throws Exception { - //given - cut = new SshJcraftWrapper(jSchMock, READ_INTERVAL_MS, 1); - cut.setCharsChunkSize(1); - String command = "sdc"; - String delimiter = ":"; - provideConnectedSubsystemInstanceWithStreamContent(command + SshJcraftWrapper.EOL); - given(channelSubsystem.getOutputStream()).willReturn(channelOs); - doThrow(new JSchException("failed to set session timeout")).when(session).setTimeout(anyInt()); - - //when - String result = cut.send(command, delimiter); - - //then - assertEquals(StringUtils.EMPTY, result); - } - - @Test - public void sendChar_shouldWriteCharacterToChannelOutputStream() throws Exception { - //given - int charNum = 100; - provideConnectedSubsystemInstance(); - given(channelSubsystem.getOutputStream()).willReturn(channelOs); - InOrder inOrder = inOrder(channelOs); - - //when - cut.sendChar(charNum); - - //then - inOrder.verify(channelOs).write(charNum); - inOrder.verify(channelOs, atLeastOnce()).flush(); - inOrder.verify(channelOs, atLeastOnce()).close(); - inOrder.verifyNoMoreInteractions(); - } - - @Test(expected = IOException.class) - public void sendChar_shouldRethrowIOException_whenOccurs() throws Exception { - //given - int charNum = 100; - provideConnectedSubsystemInstance(); - given(channelSubsystem.getOutputStream()).willReturn(channelOs); - doThrow(new IOException()).when(channelOs).write(charNum); - - //when - cut.sendChar(charNum); - - //then - fail(IO_EXCEPTION_MSG); - } - - @Test - public void send_withByteBuffer_shouldWriteBufferToChannelOutputStream() throws Exception { - //given - byte[] buffer = "Command".getBytes(); - int offset = 5; - provideConnectedSubsystemInstance(); - given(channelSubsystem.getOutputStream()).willReturn(channelOs); - InOrder inOrder = inOrder(channelOs); - - //when - cut.send(buffer, offset, buffer.length); - - //then - inOrder.verify(channelOs).write(buffer, offset, buffer.length); - inOrder.verify(channelOs, atLeastOnce()).flush(); - inOrder.verify(channelOs, atLeastOnce()).close(); - inOrder.verifyNoMoreInteractions(); - } - - @Test(expected = IOException.class) - public void send_withByteBuffer_shouldRethrowIOException_whenOccurs() throws Exception { - //given - byte[] buffer = "Command".getBytes(); - int offset = 5; - provideConnectedSubsystemInstance(); - given(channelSubsystem.getOutputStream()).willReturn(channelOs); - doThrow(new IOException()).when(channelOs).write(buffer, offset, buffer.length); - - //when - cut.send(buffer, offset, buffer.length); - - //then - fail(IO_EXCEPTION_MSG); - } - - @Test - public void getSftpConnection_shouldSetupSessionWithProperInvocationOrder() throws Exception { - //given - SshJcraftWrapper instance = spy(cut); - given(instance.openSftpChannel(session)).willReturn(channelSftp); - InOrder inOrder = inOrder(session, channelSftp, instance); - - //when - ChannelSftp result = instance.getSftpConnection(HOST, USER, PASS); - - //then - verify(jSchMock).getSession(USER, HOST, SshJcraftWrapper.DEFAULT_PORT); - inOrder.verify(session).setPassword(PASS); - inOrder.verify(session).setUserInfo(any(UserInfo.class)); - inOrder.verify(session) - .setConfig(SshJcraftWrapper.STRICT_HOST_CHECK_KEY, SshJcraftWrapper.STRICT_HOST_CHECK_VALUE); - inOrder.verify(session).connect(SESSION_TIMEOUT); - inOrder.verify(instance).openSftpChannel(session); - inOrder.verify(channelSftp).connect(); - inOrder.verifyNoMoreInteractions(); - assertEquals(channelSftp, result); - } - - @Test - public void sftp_get_shouldReadFromChannelInputStream_andCloseConnection() throws Exception { - //given - String streamContent = "test input stream content"; - SshJcraftWrapper spyInstance = spy(cut); - given(spyInstance.openSftpChannel(session)).willReturn(channelSftp); - given(channelSftp.get(REMOTE_PATH)).willReturn(IOUtils.toInputStream(streamContent, "UTF-8")); - - //when - String result = spyInstance.get(REMOTE_PATH, HOST, USER, PASS); - - //then - assertEquals(streamContent, result); - verify(channelSftp).disconnect(); - verify(session).disconnect(); - } - - @Test(expected = IOException.class) - public void sftp_get_shouldThrowIOException_whenJschFails() throws Exception { - //given - SshJcraftWrapper spyInstance = spy(cut); - doThrow(new JSchException()).when(spyInstance).openSftpChannel(session); - - //when - spyInstance.get(REMOTE_PATH, HOST, USER, PASS); - - //then - fail(IO_EXCEPTION_MSG); - } - - @Test(expected = IOException.class) - public void sftp_get_shouldThrowIOException_whenSftpOperationFails() throws Exception { - //given - SshJcraftWrapper spyInstance = spy(cut); - given(spyInstance.openSftpChannel(session)).willReturn(channelSftp); - doThrow(new SftpException(0, "sftp error")).when(channelSftp).get(REMOTE_PATH); - - //when - spyInstance.get(REMOTE_PATH, HOST, USER, PASS); - - //then - fail(IO_EXCEPTION_MSG); - } - - @Test - public void sftp_get_shouldCloseSessionAndChannel_whenExceptionOccursOnConnectedInstance() throws Exception { - //given - SshJcraftWrapper spyInstance = spy(cut); - given(spyInstance.openSftpChannel(session)).willReturn(channelSftp); - doThrow(new SftpException(0, "sftp error")).when(channelSftp).get(REMOTE_PATH); - boolean ioException = false; - - //when - try { - spyInstance.get(REMOTE_PATH, HOST, USER, PASS); - } catch (IOException e) { - ioException = true; - } - - //then - assertTrue(ioException); - verify(channelSftp).disconnect(); - verify(session).disconnect(); - } - - @Test - public void sftp_get_shouldSkipClosingSessionAndChannel_whenExceptionOccursOnNotConnectedInstance() throws Exception { - //given - doThrow(new JSchException()).when(jSchMock).getSession(anyString(), anyString(), anyInt()); - boolean ioException = false; - - //when - try { - cut.get(REMOTE_PATH, HOST, USER, PASS); - } catch (IOException e) { - ioException = true; - } - - //then - assertTrue(ioException); - verify(channelSftp, never()).disconnect(); - verify(session, never()).disconnect(); - } - - @Test - public void sftp_put_withIs_shouldRemoveOldFilesFromDestinationPath_andPutNewData() throws Exception { - //given - InputStream is = IOUtils.toInputStream("test input stream content", "UTF-8"); - SshJcraftWrapper spyInstance = spy(cut); - given(spyInstance.openSftpChannel(session)).willReturn(channelSftp); - InOrder inOrder = inOrder(channelSftp, session); - - //when - spyInstance.put(is, REMOTE_PATH, HOST, USER, PASS); - - //then - inOrder.verify(channelSftp).rm(REMOTE_PATH + "*"); - inOrder.verify(channelSftp).put(is, REMOTE_PATH, ChannelSftp.OVERWRITE); - inOrder.verify(channelSftp).disconnect(); - inOrder.verify(session).disconnect(); - inOrder.verifyNoMoreInteractions(); - } - - @Test - public void sftp_put_withIs_shouldContinueInsertingNewData_whenFileNotFoundDuringRemoval() throws Exception { - //given - InputStream is = IOUtils.toInputStream("test input stream content", "UTF-8"); - SshJcraftWrapper spyInstance = spy(cut); - given(spyInstance.openSftpChannel(session)).willReturn(channelSftp); - doThrow(new SftpException(ChannelSftp.SSH_FX_NO_SUCH_FILE, "No such file/dir")) - .when(channelSftp).rm(REMOTE_PATH + "*"); - - //when - spyInstance.put(is, REMOTE_PATH, HOST, USER, PASS); - - //then - verify(channelSftp).rm(REMOTE_PATH + "*"); - verify(channelSftp).put(is, REMOTE_PATH, ChannelSftp.OVERWRITE); - } - - @Test(expected = IOException.class) - public void sftp_put_withIs_shouldThrowIOException_whenSftpFails() throws Exception { - //given - InputStream is = IOUtils.toInputStream("test input stream content", "UTF-8"); - SshJcraftWrapper spyInstance = spy(cut); - given(spyInstance.openSftpChannel(session)).willReturn(channelSftp); - doThrow(new SftpException(ChannelSftp.SSH_FX_FAILURE, "general error")) - .when(channelSftp).rm(anyString()); - - //when - spyInstance.put(is, REMOTE_PATH, HOST, USER, PASS); - - //then - fail(IO_EXCEPTION_MSG); - } - - @Test(expected = IOException.class) - public void sftp_put_withIs_shouldThrowIOException_whenJschFails() throws Exception { - //given - InputStream is = IOUtils.toInputStream("test input stream content", "UTF-8"); - SshJcraftWrapper spyInstance = spy(cut); - doThrow(new JSchException()).when(spyInstance).openSftpChannel(session); - - //when - spyInstance.put(is, REMOTE_PATH, HOST, USER, PASS); - - //then - fail(IO_EXCEPTION_MSG); - } - - @Test - public void sftp_put_withSourcePath_shouldPutSrcPathToDestinationPath_andDisconnectAfterwards() throws Exception { - //given - SshJcraftWrapper spyInstance = spy(cut); - given(spyInstance.openSftpChannel(session)).willReturn(channelSftp); - - //when - spyInstance.put(SOURCE_PATH, REMOTE_PATH); - - //then - verify(channelSftp).put(SOURCE_PATH, REMOTE_PATH, ChannelSftp.OVERWRITE); - verify(channelSftp).disconnect(); - verify(session).disconnect(); - } - - @Test(expected = IOException.class) - public void sftp_put_withSourcePath_shouldThrowIOException_whenSftpFails() throws Exception { - //given - SshJcraftWrapper spyInstance = spy(cut); - given(spyInstance.openSftpChannel(session)).willReturn(channelSftp); - doThrow(new SftpException(ChannelSftp.SSH_FX_FAILURE, "general error")) - .when(channelSftp).put(anyString(), anyString(), anyInt()); - - //when - spyInstance.put(SOURCE_PATH, REMOTE_PATH); - - //then - fail(IO_EXCEPTION_MSG); - } - - @Test(expected = IOException.class) - public void sftp_put_withSourcePath_shouldThrowIOException_whenJschFails() throws Exception { - //given - SshJcraftWrapper spyInstance = spy(cut); - doThrow(new JSchException()).when(spyInstance).openSftpChannel(session); - - //when - spyInstance.put(SOURCE_PATH, REMOTE_PATH); - - //then - fail(IO_EXCEPTION_MSG); - } - - @Test - public void sftpPutStringData_shouldPutInputStreamToRemotePath() throws Exception { - //given - String inputData = "Test data"; - SshJcraftWrapper spyInstance = spy(cut); - given(spyInstance.openSftpChannel(session)).willReturn(channelSftp); - - //when - spyInstance.sftpPutStringData(inputData, REMOTE_PATH); - - //then - verify(channelSftp).put(any(InputStream.class), eq(REMOTE_PATH), eq(ChannelSftp.OVERWRITE)); - verify(channelSftp).disconnect(); - verify(session).disconnect(); - } - - @Test(expected = IOException.class) - public void sftpPutStringData_shouldThrowIOException_whenJschFails() throws Exception { - //given - String inputData = "Test data"; - SshJcraftWrapper spyInstance = spy(cut); - doThrow(new JSchException()).when(spyInstance).openSftpChannel(session); - - //when - spyInstance.sftpPutStringData(inputData, REMOTE_PATH); - - //then - fail(IO_EXCEPTION_MSG); - } - - @Test(expected = IOException.class) - public void sftpPutStringData_shouldThrowIOException_whenSftpFails() throws Exception { - //given - String inputData = "Test data"; - SshJcraftWrapper spyInstance = spy(cut); - given(spyInstance.openSftpChannel(session)).willReturn(channelSftp); - doThrow(new SftpException(ChannelSftp.SSH_FX_FAILURE, "general error")) - .when(channelSftp).put(any(InputStream.class), anyString(), anyInt()); - - //when - spyInstance.sftpPutStringData(inputData, REMOTE_PATH); - - //then - fail(IO_EXCEPTION_MSG); - } - - @Test - public void sftpGet_shouldReadFromChannelInputStream_withInstanceCredentials() throws Exception { - //given - String remoteStreamContent = "test input stream content"; - SshJcraftWrapper spyInstance = spy(cut); - given(spyInstance.openSftpChannel(session)).willReturn(channelSftp); - given(channelSftp.get(REMOTE_PATH)).willReturn(IOUtils.toInputStream(remoteStreamContent, "UTF-8")); - - //when - String result = spyInstance.sftpGet(REMOTE_PATH); - - //then - assertEquals(remoteStreamContent, result); - } } |