Java tutorial
// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you 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. package com.cloud.network.resource; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.security.KeyManagementException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import javax.naming.ConfigurationException; import org.apache.commons.lang.StringEscapeUtils; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.AllowAllHostnameVerifier; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.conn.ssl.TrustStrategy; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.BasicClientConnectionManager; import org.apache.http.util.EntityUtils; import org.apache.log4j.Logger; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import com.google.gson.Gson; import com.cloud.agent.IAgentControl; import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; import com.cloud.agent.api.ExternalNetworkResourceUsageAnswer; import com.cloud.agent.api.ExternalNetworkResourceUsageCommand; import com.cloud.agent.api.MaintainAnswer; import com.cloud.agent.api.MaintainCommand; import com.cloud.agent.api.NetScalerImplementNetworkCommand; import com.cloud.agent.api.PingCommand; import com.cloud.agent.api.ReadyAnswer; import com.cloud.agent.api.ReadyCommand; import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupExternalLoadBalancerCommand; import com.cloud.agent.api.UnsupportedAnswer; import com.cloud.agent.api.routing.DestroyLoadBalancerApplianceCommand; import com.cloud.agent.api.routing.GlobalLoadBalancerConfigCommand; import com.cloud.agent.api.routing.HealthCheckLBConfigAnswer; import com.cloud.agent.api.routing.HealthCheckLBConfigCommand; import com.cloud.agent.api.routing.IpAssocAnswer; import com.cloud.agent.api.routing.IpAssocCommand; import com.cloud.agent.api.routing.LoadBalancerConfigCommand; import com.cloud.agent.api.routing.SetStaticNatRulesCommand; import com.cloud.agent.api.to.IpAddressTO; import com.cloud.agent.api.to.LoadBalancerTO; import com.cloud.agent.api.to.LoadBalancerTO.DestinationTO; import com.cloud.agent.api.to.LoadBalancerTO.StickinessPolicyTO; import com.cloud.host.Host; import com.cloud.host.Host.Type; import com.cloud.network.rules.LbStickinessMethod.StickinessMethodType; import com.cloud.resource.ServerResource; import com.cloud.serializer.GsonHelper; import com.cloud.utils.NumbersUtil; import com.cloud.utils.StringUtils; import com.cloud.utils.exception.ExecutionException; import com.cloud.utils.net.NetUtils; class NccHttpCode { static final String INTERNAL_ERROR = "INTERNAL ERROR"; static final String NOT_FOUND = "NOT FOUND"; static final String JOB_ID = "Job_id"; static final String UNAUTHORIZED = "UNAUTHORIZED"; } public class NetScalerControlCenterResource implements ServerResource { // deployment configuration private String _name; private String _zoneId; private String _ip; private String _username; private String _password; private String _publicInterface; private String _privateInterface; private Integer _numRetries; private Long _nccCmdTimeout; private String _guid; private boolean _inline; private String _deviceName; private String _sessionid; public static final int DEFAULT_PORT = 443; private static final Gson s_gson = GsonHelper.getGson(); private static final Logger s_logger = Logger.getLogger(NetScalerControlCenterResource.class); protected Gson _gson; private final String _objectNamePathSep = "-"; final String protocol = "https"; private static String nccsession; private int pingCount = 0; public NetScalerControlCenterResource() { _gson = GsonHelper.getGsonLogger(); } public static String get_nccsession() { return nccsession; } public static void set_nccsession(String nccsession) { NetScalerControlCenterResource.nccsession = nccsession; } @Override public boolean configure(String name, Map<String, Object> params) throws ConfigurationException { JSONObject jsonResponse = null; try { _name = (String) params.get("name"); if (_name == null) { throw new ConfigurationException("Unable to find name in the configuration parameters"); } _zoneId = (String) params.get("zoneId"); if (_zoneId == null) { throw new ConfigurationException("Unable to find zone Id in the configuration parameters"); } _ip = (String) params.get("ip"); if (_ip == null) { throw new ConfigurationException("Unable to find IP address in the configuration parameters"); } _username = (String) params.get("username"); if (_username == null) { throw new ConfigurationException("Unable to find username in the configuration parameters"); } _password = (String) params.get("password"); if (_password == null) { throw new ConfigurationException("Unable to find password in the configuration parameters"); } _numRetries = NumbersUtil.parseInt((String) params.get("numretries"), 2); _guid = (String) params.get("guid"); if (_guid == null) { throw new ConfigurationException("Unable to find the guid in the configuration parameters"); } _deviceName = (String) params.get("deviceName"); if (_deviceName == null) { throw new ConfigurationException("Unable to find the device name in the configuration parameters"); } _nccCmdTimeout = NumbersUtil.parseLong((String) params.get("numretries"), 600000); // validate device configuration parameters login(); return true; } catch (ConfigurationException e) { throw new ConfigurationException(e.getMessage()); } catch (ExecutionException e) { s_logger.debug("Execution Exception :" + e.getMessage()); throw new ConfigurationException( "Failed to add the device. Please check the device is NCC and It is reachable from Management Server."); } } public void getServicePackages() throws ExecutionException { String result = null; try { URI agentUri = null; agentUri = new URI("https", null, _ip, DEFAULT_PORT, "/admin/v1/servicepackages", null, null); org.json.JSONObject jsonBody = new JSONObject(); org.json.JSONObject jsonCredentials = new JSONObject(); result = getHttpRequest(jsonBody.toString(), agentUri, _sessionid); s_logger.debug("List of Service Packages in NCC:: " + result); } catch (URISyntaxException e) { String errMsg = "Could not generate URI for Hyper-V agent"; s_logger.error(errMsg, e); } catch (Exception e) { throw new ExecutionException("Failed to log in to NCC device at " + _ip + " due to " + e.getMessage()); } } private synchronized String login() throws ExecutionException { String result = null; JSONObject jsonResponse = null; try { URI agentUri = null; agentUri = new URI("https", null, _ip, DEFAULT_PORT, "/nitro/v2/config/" + "login", null, null); org.json.JSONObject jsonBody = new JSONObject(); org.json.JSONObject jsonCredentials = new JSONObject(); jsonCredentials.put("username", _username); jsonCredentials.put("password", _password); jsonBody.put("login", jsonCredentials); result = postHttpRequest(jsonBody.toString(), agentUri, _sessionid); if (result == null) { throw new ConfigurationException("No Response Received from the NetScalerControlCenter Device"); } else { jsonResponse = new JSONObject(result); org.json.JSONArray loginResponse = jsonResponse.getJSONArray("login"); _sessionid = jsonResponse.getJSONArray("login").getJSONObject(0).getString("sessionid"); s_logger.debug("New Session id from NCC :" + _sessionid); set_nccsession(_sessionid); s_logger.debug("session on Static Session variable" + get_nccsession()); } s_logger.debug("Login to NCC Device response :: " + result); return result; } catch (URISyntaxException e) { String errMsg = "Could not generate URI for Hyper-V agent"; s_logger.error(errMsg, e); } catch (JSONException e) { s_logger.debug("JSON Exception :" + e.getMessage()); throw new ExecutionException("Failed to log in to NCC device at " + _ip + " due to " + e.getMessage()); } catch (Exception e) { throw new ExecutionException("Failed to log in to NCC device at " + _ip + " due to " + e.getMessage()); } return result; } @Override public StartupCommand[] initialize() { StartupExternalLoadBalancerCommand cmd = new StartupExternalLoadBalancerCommand( Host.Type.NetScalerControlCenter); cmd.setName(_name); cmd.setDataCenter(_zoneId); cmd.setPod(""); cmd.setPrivateIpAddress(_ip); cmd.setStorageIpAddress(""); cmd.setVersion(NetScalerControlCenterResource.class.getPackage().getImplementationVersion()); cmd.setGuid(_guid); return new StartupCommand[] { cmd }; } @Override public Answer executeRequest(Command cmd) { return executeRequest(cmd, _numRetries); } private Answer executeRequest(Command cmd, int numRetries) { if (cmd instanceof ReadyCommand) { return execute((ReadyCommand) cmd); } else if (cmd instanceof MaintainCommand) { return execute((MaintainCommand) cmd); } else if (cmd instanceof IpAssocCommand) { return execute((IpAssocCommand) cmd, numRetries); } else if (cmd instanceof LoadBalancerConfigCommand) { return execute((LoadBalancerConfigCommand) cmd, numRetries); } else if (cmd instanceof ExternalNetworkResourceUsageCommand) { return execute((ExternalNetworkResourceUsageCommand) cmd, numRetries); } else if (cmd instanceof DestroyLoadBalancerApplianceCommand) { return Answer.createUnsupportedCommandAnswer(cmd); } else if (cmd instanceof SetStaticNatRulesCommand) { return execute((SetStaticNatRulesCommand) cmd, numRetries); } else if (cmd instanceof GlobalLoadBalancerConfigCommand) { return Answer.createUnsupportedCommandAnswer(cmd); } else if (cmd instanceof HealthCheckLBConfigCommand) { return execute((HealthCheckLBConfigCommand) cmd, numRetries); } else if (cmd instanceof NetScalerImplementNetworkCommand) { return execute((NetScalerImplementNetworkCommand) cmd, numRetries); } else { return Answer.createUnsupportedCommandAnswer(cmd); } } private Answer execute(ReadyCommand cmd) { return new ReadyAnswer(cmd); } protected Answer execute(MaintainCommand cmd) { return new MaintainAnswer(cmd); } private void keepSessionAlive() throws ExecutionException { URI agentUri = null; try { agentUri = new URI("https", null, _ip, DEFAULT_PORT, "/cs/cca/v1/cloudstacks", null, null); org.json.JSONObject jsonBody = new JSONObject(); getHttpRequest(jsonBody.toString(), agentUri, _sessionid); s_logger.debug("Keeping Session Alive"); } catch (URISyntaxException e) { e.printStackTrace(); } } private String queryAsyncJob(String jobId) throws ExecutionException { String result = null; try { URI agentUri = null; agentUri = new URI("https", null, _ip, DEFAULT_PORT, "/admin/v1/journalcontexts/" + jobId, null, null); org.json.JSONObject jsonBody = new JSONObject(); long startTick = System.currentTimeMillis(); while (System.currentTimeMillis() - startTick < _nccCmdTimeout) { result = getHttpRequest(jsonBody.toString(), agentUri, _sessionid); JSONObject response = new JSONObject(result); if (response != null) { s_logger.debug("Job Status result for [" + jobId + "]:: " + result + " Tick and currentTime :" + System.currentTimeMillis() + " -" + startTick + "job cmd timeout :" + _nccCmdTimeout); String status = response.getJSONObject("journalcontext").getString("status").toUpperCase(); String message = response.getJSONObject("journalcontext").getString("message"); s_logger.debug("Job Status Progress Status [" + jobId + "]:: " + status); switch (status) { case "FINISHED": return status; case "IN PROGRESS": break; case "ERROR, ROLLBACK IN PROGRESS": break; case "ERROR, ROLLBACK COMPLETED": throw new ExecutionException("ERROR, ROLLBACK COMPLETED " + message); case "ERROR, ROLLBACK FAILED": throw new ExecutionException("ERROR, ROLLBACK FAILED " + message); } } } } catch (URISyntaxException e) { String errMsg = "Could not generate URI for NetScaler ControlCenter"; s_logger.error(errMsg, e); } catch (JSONException e) { e.printStackTrace(); } return result; } private synchronized Answer execute(NetScalerImplementNetworkCommand cmd, int numRetries) { String result = null; try { URI agentUri = null; agentUri = new URI("https", null, _ip, DEFAULT_PORT, "/cs/adcaas/v1/networks", null, null); org.json.JSONObject jsonBody = new JSONObject(cmd.getDetails()); s_logger.debug("Sending Network Implement to NCC:: " + jsonBody); result = postHttpRequest(jsonBody.toString(), agentUri, _sessionid); s_logger.debug("Result of Network Implement to NCC:: " + result); result = queryAsyncJob(result); s_logger.debug("Done query async of network implement request :: " + result); return new Answer(cmd, true, "Successfully allocated device"); } catch (URISyntaxException e) { String errMsg = "Could not generate URI for NetScaler ControlCenter "; s_logger.error(errMsg, e); } catch (ExecutionException e) { if (e.getMessage().equalsIgnoreCase(NccHttpCode.NOT_FOUND)) { return new Answer(cmd, true, "Successfully unallocated the device"); } else if (e.getMessage().startsWith("ERROR, ROLLBACK")) { s_logger.error(e.getMessage()); return new Answer(cmd, false, e.getMessage()); } else { if (shouldRetry(numRetries)) { s_logger.debug( "Retrying the command NetScalerImplementNetworkCommand retry count: " + numRetries); return retry(cmd, numRetries); } else { return new Answer(cmd, false, e.getMessage()); } } } catch (Exception e) { if (shouldRetry(numRetries)) { s_logger.debug("Retrying the command NetScalerImplementNetworkCommand retry count: " + numRetries); return retry(cmd, numRetries); } else { return new Answer(cmd, false, e.getMessage()); } } return Answer.createUnsupportedCommandAnswer(cmd); } private synchronized Answer execute(IpAssocCommand cmd, int numRetries) { String[] results = new String[cmd.getIpAddresses().length]; int i = 0; IpAddressTO[] ips = cmd.getIpAddresses(); for (IpAddressTO ip : ips) { results[i++] = ip.getPublicIp() + " - success"; } return new IpAssocAnswer(cmd, results); } private Answer execute(HealthCheckLBConfigCommand cmd, int numRetries) { List<LoadBalancerTO> hcLB = new ArrayList<LoadBalancerTO>(); try { LoadBalancerTO[] loadBalancers = cmd.getLoadBalancers(); if (loadBalancers == null) { return new HealthCheckLBConfigAnswer(hcLB); } String result = getLBHealthChecks(cmd.getNetworkId()); JSONObject res = new JSONObject(result); JSONArray lbstatus = res.getJSONArray("lbhealthstatus"); for (int i = 0; i < lbstatus.length(); i++) { JSONObject lbstat = lbstatus.getJSONObject(i); LoadBalancerTO loadBalancer = null; JSONArray dest = lbstat.getJSONArray("destinations"); List<DestinationTO> listDestTo = new ArrayList<DestinationTO>(); for (int d = 0; d < dest.length(); d++) { JSONObject dt = dest.getJSONObject(d); if (dt != null) { DestinationTO destTO = new DestinationTO(dt.getString("destIp"), dt.getInt("destPort"), dt.getString("monitorState")); listDestTo.add(destTO); } } loadBalancer = new LoadBalancerTO(lbstat.getString("lb_uuid"), listDestTo); hcLB.add(loadBalancer); } } catch (ExecutionException e) { s_logger.error("Failed to execute HealthCheckLBConfigCommand due to ", e); if (shouldRetry(numRetries)) { return retry(cmd, numRetries); } else { return new HealthCheckLBConfigAnswer(hcLB); } } catch (Exception e) { s_logger.error("Failed to execute HealthCheckLBConfigCommand due to ", e); if (shouldRetry(numRetries)) { return retry(cmd, numRetries); } else { return new HealthCheckLBConfigAnswer(hcLB); } } return new HealthCheckLBConfigAnswer(hcLB); } private String getLBHealthChecks(long networkid) throws ExecutionException { URI agentUri = null; String response = null; try { agentUri = new URI("https", null, _ip, DEFAULT_PORT, "/cs/adcaas/v1/networks/" + networkid + "/lbhealthstatus", null, null); org.json.JSONObject jsonBody = new JSONObject(); response = getHttpRequest(jsonBody.toString(), agentUri, _sessionid); s_logger.debug("LBHealthcheck Response :" + response); } catch (URISyntaxException e) { e.printStackTrace(); } return response; } private synchronized Answer execute(LoadBalancerConfigCommand cmd, int numRetries) { try { LoadBalancerTO[] loadBalancers = cmd.getLoadBalancers(); if (loadBalancers == null) { return new Answer(cmd); } JSONObject lbConfigPaylod = new JSONObject(cmd); String gsonLBConfig = _gson.toJson(cmd); URI agentUri = null; agentUri = new URI("https", null, _ip, DEFAULT_PORT, "/cs/adcaas/v1/loadbalancerCmds", null, null); JSONObject lbConfigCmd = new JSONObject(); JSONObject lbcmd = new JSONObject(gsonLBConfig); s_logger.debug("LB config from gsonstring to JSONObject : " + lbcmd.toString() + "\n" + "gson cmd is :: \t" + gsonLBConfig); lbConfigCmd.put("LoadBalancerConfigCommand", lbcmd.getJSONArray("loadBalancers")); s_logger.debug("LB config paylod : " + lbConfigCmd.toString()); String result = postHttpRequest(lbConfigCmd.toString(), agentUri, _sessionid); s_logger.debug("Result of lbconfigcmg is " + result); result = queryAsyncJob(result); s_logger.debug("Done query async of LB ConfigCmd implement request and result:: " + result); return new Answer(cmd); } catch (ExecutionException e) { s_logger.error("Failed to execute LoadBalancerConfigCommand due to ", e); if (e.getMessage().equalsIgnoreCase(NccHttpCode.NOT_FOUND)) { return new Answer(cmd, true, "LB Rule is not present in NS device. So returning as removed the LB Rule"); } else if (e.getMessage().startsWith("ERROR, ROLLBACK COMPLETED") || e.getMessage().startsWith("ERROR, ROLLBACK FAILED")) { s_logger.error("Failed to execute LoadBalancerConfigCommand due to : " + e.getMessage()); return new Answer(cmd, false, e.getMessage()); } else if (e.getMessage().startsWith(NccHttpCode.INTERNAL_ERROR)) { s_logger.error( "Failed to execute LoadBalancerConfigCommand as Internal Error returning Internal error ::" + e.getMessage()); return new Answer(cmd, false, e.getMessage()); } if (shouldRetry(numRetries)) { return retry(cmd, numRetries); } else { return new Answer(cmd, false, e.getMessage()); } } catch (Exception e) { s_logger.error("Failed to execute LoadBalancerConfigCommand due to ", e); if (shouldRetry(numRetries)) { return retry(cmd, numRetries); } else { return new Answer(cmd, false, e.getMessage()); } } } private synchronized Answer execute(SetStaticNatRulesCommand cmd, int numRetries) { return Answer.createUnsupportedCommandAnswer(cmd); } private synchronized Answer execute(ExternalNetworkResourceUsageCommand cmd, int numRetries) { try { return getPublicIpBytesSentAndReceived(cmd); } catch (ExecutionException e) { if (shouldRetry(numRetries)) { return retry(cmd, numRetries); } else { return new ExternalNetworkResourceUsageAnswer(cmd, e); } } } private String getNetScalerProtocol(LoadBalancerTO loadBalancer) throws ExecutionException { String port = Integer.toString(loadBalancer.getSrcPort()); String lbProtocol = loadBalancer.getLbProtocol(); StickinessPolicyTO[] stickyPolicies = loadBalancer.getStickinessPolicies(); String nsProtocol = "TCP"; if (lbProtocol == null) lbProtocol = loadBalancer.getProtocol(); if ((stickyPolicies != null) && (stickyPolicies.length > 0) && (stickyPolicies[0] != null)) { StickinessPolicyTO stickinessPolicy = stickyPolicies[0]; if (StickinessMethodType.LBCookieBased.getName().equalsIgnoreCase(stickinessPolicy.getMethodName()) || (StickinessMethodType.AppCookieBased.getName() .equalsIgnoreCase(stickinessPolicy.getMethodName()))) { nsProtocol = "HTTP"; return nsProtocol; } } if (lbProtocol.equalsIgnoreCase(NetUtils.SSL_PROTO) || lbProtocol.equalsIgnoreCase(NetUtils.HTTP_PROTO)) return lbProtocol.toUpperCase(); if (port.equals(NetUtils.HTTP_PORT)) { nsProtocol = "HTTP"; } else if (NetUtils.TCP_PROTO.equalsIgnoreCase(lbProtocol)) { nsProtocol = "TCP"; } else if (NetUtils.UDP_PROTO.equalsIgnoreCase(lbProtocol)) { nsProtocol = "UDP"; } return nsProtocol; } private ExternalNetworkResourceUsageAnswer getPublicIpBytesSentAndReceived( ExternalNetworkResourceUsageCommand cmd) throws ExecutionException { ExternalNetworkResourceUsageAnswer answer = new ExternalNetworkResourceUsageAnswer(cmd); long networkid = cmd.getNetworkid(); try { //TODO send GET cmd to get the network stats URI agentUri = null; String response = null; try { agentUri = new URI("https", null, _ip, DEFAULT_PORT, "/cs/adcaas/v1/networks/" + networkid + "/ipStats", null, null); org.json.JSONObject jsonBody = new JSONObject(); response = getHttpRequest(jsonBody.toString(), agentUri, _sessionid); JSONArray statsIPList = null; if (response != null) { statsIPList = new JSONObject(response).getJSONObject("stats").getJSONArray("ipBytes"); } if (statsIPList != null) { for (int i = 0; i < statsIPList.length(); i++) { JSONObject ipstat = statsIPList.getJSONObject(i); JSONObject ipvalues = ipstat.getJSONObject("ipstats"); if (ipstat != null) { long[] bytesSentAndReceived = new long[] { 0, 0 }; bytesSentAndReceived[0] = ipvalues.getLong("received"); bytesSentAndReceived[1] = ipvalues.getLong("sent"); if (bytesSentAndReceived[0] >= 0 && bytesSentAndReceived[1] >= 0) { answer.ipBytes.put(ipstat.getString("ip"), bytesSentAndReceived); } } } } s_logger.debug("IPStats Response :" + response); } catch (URISyntaxException e) { e.printStackTrace(); } catch (ExecutionException e) { s_logger.debug("Seesion Alive" + e.getMessage()); e.printStackTrace(); } } catch (Exception e) { s_logger.error("Failed to get bytes sent and recived statistics due to " + e); throw new ExecutionException(e.getMessage()); } return answer; } private Answer retry(Command cmd, int numRetries) { int numRetriesRemaining = numRetries - 1; s_logger.warn("Retrying " + cmd.getClass().getSimpleName() + ". Number of retries remaining: " + numRetriesRemaining); return executeRequest(cmd, numRetriesRemaining); } private boolean shouldRetry(int numRetries) { try { if (numRetries > 0) { login(); return true; } } catch (Exception e) { s_logger.error( "Failed to log in to Netscaler ControlCenter device at " + _ip + " due to " + e.getMessage()); return false; } return false; } @Override public IAgentControl getAgentControl() { return null; } private boolean refreshNCCConnection() { boolean ret = false; try { keepSessionAlive(); return true; } catch (ExecutionException ex) { s_logger.debug("Failed to keep up the session alive ", ex); } return ret; } @Override public PingCommand getCurrentStatus(long id) { pingCount++; if (pingCount > 10 && refreshNCCConnection()) { pingCount = 0; } return new PingCommand(Host.Type.NetScalerControlCenter, id); } @Override public Type getType() { return Host.Type.NetScalerControlCenter; } @Override public void setAgentControl(IAgentControl agentControl) { return; } @Override public String getName() { return _name; } @Override public void setName(String name) { } @Override public boolean start() { return true; } @Override public boolean stop() { return true; } @Override public void disconnected() { return; } @Override public void setConfigParams(Map<String, Object> params) { } @Override public Map<String, Object> getConfigParams() { return null; } @Override public int getRunLevel() { return 0; } @Override public void setRunLevel(int level) { } public String getSessionID() { return _sessionid; } public static String cleanPassword(String logString) { String cleanLogString = null; if (logString != null) { cleanLogString = logString; String[] temp = logString.split(","); int i = 0; if (temp != null) { while (i < temp.length) { temp[i] = StringUtils.cleanString(temp[i]); i++; } List<String> stringList = new ArrayList<String>(); Collections.addAll(stringList, temp); cleanLogString = StringUtils.join(stringList, ","); } } return cleanLogString; } public static HttpClient getHttpClient() { HttpClient httpClient = null; TrustStrategy easyStrategy = new TrustStrategy() { @Override public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { return true; } }; try { SSLSocketFactory sf = new SSLSocketFactory(easyStrategy, new AllowAllHostnameVerifier()); SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme("https", DEFAULT_PORT, sf)); ClientConnectionManager ccm = new BasicClientConnectionManager(registry); httpClient = new DefaultHttpClient(ccm); } catch (KeyManagementException e) { s_logger.error("failed to initialize http client " + e.getMessage()); } catch (UnrecoverableKeyException e) { s_logger.error("failed to initialize http client " + e.getMessage()); } catch (NoSuchAlgorithmException e) { s_logger.error("failed to initialize http client " + e.getMessage()); } catch (KeyStoreException e) { s_logger.error("failed to initialize http client " + e.getMessage()); } return httpClient; } public static String getHttpRequest(final String jsonCmd, final URI agentUri, String sessionID) throws ExecutionException { // Using Apache's HttpClient for HTTP POST // Java-only approach discussed at on StackOverflow concludes with // comment to use Apache HttpClient // http://stackoverflow.com/a/2793153/939250, but final comment is to // use Apache. String logMessage = StringEscapeUtils.unescapeJava(jsonCmd); logMessage = cleanPassword(logMessage); s_logger.debug("POST request to " + agentUri.toString() + " with contents " + logMessage); // Create request HttpClient httpClient = getHttpClient(); String result = null; // TODO: are there timeout settings and worker thread settings to tweak? try { HttpGet request = new HttpGet(agentUri); // JSON encode command // Assumes command sits comfortably in a string, i.e. not used for // large data transfers StringEntity cmdJson = new StringEntity(jsonCmd); request.addHeader("content-type", "application/json"); request.addHeader("Cookie", "SessId=" + sessionID); s_logger.debug("Sending cmd to " + agentUri.toString() + " cmd data:" + logMessage); HttpResponse response = httpClient.execute(request); // Unsupported commands will not route. if (response.getStatusLine().getStatusCode() == HttpStatus.SC_NOT_FOUND) { String errMsg = "Failed to send : HTTP error code : " + response.getStatusLine().getStatusCode(); s_logger.error(errMsg); String unsupportMsg = "Unsupported command " + agentUri.getPath() + ". Are you sure you got the right f of" + " server?"; Answer ans = new UnsupportedAnswer(null, unsupportMsg); s_logger.error(ans); result = s_gson.toJson(new Answer[] { ans }); } else if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { String errMsg = "Failed send to " + agentUri.toString() + " : HTTP error code : " + response.getStatusLine().getStatusCode(); s_logger.error(errMsg); throw new ExecutionException("UNAUTHORIZED"); } else { result = EntityUtils.toString(response.getEntity()); String logResult = cleanPassword(StringEscapeUtils.unescapeJava(result)); s_logger.debug("Get response is " + logResult); } } catch (ClientProtocolException protocolEx) { // Problem with HTTP message exchange s_logger.error(protocolEx); } catch (IOException connEx) { // Problem with underlying communications s_logger.error(connEx); } finally { httpClient.getConnectionManager().shutdown(); } return result; } public static String postHttpRequest(final String jsonCmd, final URI agentUri, String sessionID) throws ExecutionException { // Using Apache's HttpClient for HTTP POST // Java-only approach discussed at on StackOverflow concludes with // comment to use Apache HttpClient // http://stackoverflow.com/a/2793153/939250, but final comment is to // use Apache. String logMessage = StringEscapeUtils.unescapeJava(jsonCmd); logMessage = cleanPassword(logMessage); s_logger.debug("POST request to " + agentUri.toString() + " with contents " + logMessage); // Create request HttpClient httpClient = getHttpClient(); TrustStrategy easyStrategy = new TrustStrategy() { @Override public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { return true; } }; try { SSLSocketFactory sf = new SSLSocketFactory(easyStrategy, new AllowAllHostnameVerifier()); SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme("https", DEFAULT_PORT, sf)); ClientConnectionManager ccm = new BasicClientConnectionManager(registry); httpClient = new DefaultHttpClient(ccm); } catch (KeyManagementException e) { s_logger.error("failed to initialize http client " + e.getMessage()); } catch (UnrecoverableKeyException e) { s_logger.error("failed to initialize http client " + e.getMessage()); } catch (NoSuchAlgorithmException e) { s_logger.error("failed to initialize http client " + e.getMessage()); } catch (KeyStoreException e) { s_logger.error("failed to initialize http client " + e.getMessage()); } String result = null; // TODO: are there timeout settings and worker thread settings to tweak? try { HttpPost request = new HttpPost(agentUri); // JSON encode command // Assumes command sits comfortably in a string, i.e. not used for // large data transfers StringEntity cmdJson = new StringEntity(jsonCmd); request.addHeader("content-type", "application/json"); request.addHeader("Cookie", "SessId=" + sessionID); request.setEntity(cmdJson); s_logger.debug("Sending cmd to " + agentUri.toString() + " cmd data:" + logMessage + "SEssion id: " + sessionID); HttpResponse response = httpClient.execute(request); // Unsupported commands will not route. if (response.getStatusLine().getStatusCode() == HttpStatus.SC_NOT_FOUND) { String errMsg = "Failed : HTTP error code : " + response.getStatusLine().getStatusCode(); throw new ExecutionException(NccHttpCode.NOT_FOUND); } else if ((response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) && (response.getStatusLine().getStatusCode() != HttpStatus.SC_CREATED)) { String errMsg = "Command Not Success " + agentUri.toString() + " : HTTP error code : " + response.getStatusLine().getStatusCode(); s_logger.error(errMsg); throw new ExecutionException(NccHttpCode.INTERNAL_ERROR + " " + errMsg); } else if (response.getStatusLine().getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { //Successfully created the resource in the NCC, Now get the Job ID and send to the response // make login request and store new session id throw new ExecutionException(NccHttpCode.UNAUTHORIZED); } else if (response.getStatusLine().getStatusCode() == HttpStatus.SC_CREATED) { //Successfully created the resource in the NCC, Now get the Job ID and send to the response result = response.getFirstHeader(NccHttpCode.JOB_ID).getValue(); } else { result = EntityUtils.toString(response.getEntity()); String logResult = cleanPassword(StringEscapeUtils.unescapeJava(result)); s_logger.debug("POST response is " + logResult); } } catch (ClientProtocolException protocolEx) { // Problem with HTTP message exchange s_logger.error(protocolEx); } catch (IOException connEx) { // Problem with underlying communications s_logger.error(connEx); } finally { httpClient.getConnectionManager().shutdown(); } return result; } }