All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.emc.esu.sysmgmt.SysMgmtApi Maven / Gradle / Ivy

There is a newer version: 2.2.2
Show newest version
/*
 * Copyright 2013 EMC Corporation. 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.
 * A copy of the License is located at
 *
 * http://www.apache.org/licenses/LICENSE-2.0.txt
 *
 * or in the "license" file accompanying this file. This file 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.emc.esu.sysmgmt;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.X509TrustManager;
import javax.net.ssl.TrustManager;

import org.apache.log4j.Logger;

import com.emc.esu.sysmgmt.pox.GetUidRequest;
import com.emc.esu.sysmgmt.pox.GetUidResponse;
import com.emc.esu.sysmgmt.pox.ListRmgRequestPox;
import com.emc.esu.sysmgmt.pox.ListRmgResponsePox;

import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLEncoder;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Main Façade for the Atmos system management API.
 * 
 * @author cwikj
 */
public class SysMgmtApi {
	private static final Logger l4j = Logger.getLogger(SysMgmtApi.class);
	
	private String proto;
	private String host;
	private int port;
	private String username;
	private String password;
	private String poxCookie;

	/**
	 * Default constructor
	 */
	public SysMgmtApi() {
		port = 443;
		proto = "https";
	}

	/**
	 * Constructs a new SysMgmtApi connection
	 * 
	 * @param proto
	 *            The protocol to use, generally "https"
	 * @param host
	 *            The host to connect to. Can be any Atmos host.
	 * @param port
	 *            The port to connect to. Generally 443 for https.
	 * @param username
	 *            Your SysAdmin user.
	 * @param password
	 *            Your SysAdmin password.
	 */
	public SysMgmtApi(String proto, String host, int port, String username,
			String password) {
		this.proto = proto;
		this.host = host;
		this.port = port;
		this.username = username;
		this.password = password;
	}

	/**
	 * Lists all of the RMGs in your cloud.
	 * 
	 * @return a ListRmgResponse
	 */
	public ListRmgResponse listRmgs() {
		ListRmgRequest req = new ListRmgRequest(this);
		return req.call();
	}
	
	public ListRmgResponsePox listRmgsPox() throws Exception {
		if(poxCookie == null) {
			throw new RuntimeException("Not logged in to POX");
		}
		ListRmgRequestPox req = new ListRmgRequestPox(this);
		return req.call();
	}

	/**
	 * Lists all of the hosts in the given RMG.
	 * 
	 * @param rmgName
	 *            the name of the RMG to list
	 * @return a ListHostsResponse
	 */
	public ListHostsResponse listHosts(String rmgName) {
		ListHostsRequest req = new ListHostsRequest(this, rmgName);
		return req.call();
	}

	/**
	 * Returns the current connection protocol
	 * 
	 * @return the proto
	 */
	public String getProto() {
		return proto;
	}

	/**
	 * Sets the current connection protocol.
	 * 
	 * @param proto
	 *            the proto to set
	 */
	public void setProto(String proto) {
		this.proto = proto;
	}

	/**
	 * Gets the current hostname
	 * 
	 * @return the host
	 */
	public String getHost() {
		return host;
	}

	/**
	 * Sets the hostname to connect to
	 * 
	 * @param host
	 *            the host to set
	 */
	public void setHost(String host) {
		this.host = host;
	}

	/**
	 * Gets the current connection port
	 * 
	 * @return the port
	 */
	public int getPort() {
		return port;
	}

	/**
	 * @param port
	 *            the port to set
	 */
	public void setPort(int port) {
		this.port = port;
	}

	/**
	 * Gets the current SysAdmin username
	 * 
	 * @return the username
	 */
	public String getUsername() {
		return username;
	}

	/**
	 * Sets the SysAdmin username to connect with
	 * 
	 * @param username
	 *            the username to set
	 */
	public void setUsername(String username) {
		this.username = username;
	}

	/**
	 * Sets the SysAdmin password to use.
	 * 
	 * @param password
	 *            the password to set
	 */
	public void setPassword(String password) {
		this.password = password;
	}
	
	/**
	 * Returns the current SysAdmin password.  Note that this method is only
	 * package-level access for security reasons.
	 * 
	 * @return the password
	 */
	String getPassword() {
		return this.password;
	}

	/**
	 * Many Atmos systems have self-signed certificates for their system admin
	 * consoles. If so, you will need to call this method to install a special
	 * certificate validator and hostname verifier so an Exception is not thrown
	 * when connecting to the server. NOTE currently, this installs a
	 * default verifier for ALL connections, even non-Atmos systems.
	 * 
	 * @throws NoSuchAlgorithmException
	 * @throws KeyManagementException
	 */
	public static void disableCertificateValidation()
			throws NoSuchAlgorithmException, KeyManagementException {
		// TODO make this only apply to the current hostname.

		// Create a trust manager that does not validate certificate chains
		TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
			public java.security.cert.X509Certificate[] getAcceptedIssuers() {
				return null;
			}

			public void checkClientTrusted(X509Certificate[] certs,
					String authType) {
			}

			public void checkServerTrusted(X509Certificate[] certs,
					String authType) {
			}
		} };

		// Install the all-trusting trust manager
		SSLContext sc = SSLContext.getInstance("SSL");
		sc.init(null, trustAllCerts, new java.security.SecureRandom());
		HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

		// Create all-trusting host name verifier
		HostnameVerifier allHostsValid = new HostnameVerifier() {
			public boolean verify(String hostname, SSLSession session) {
				return true;
			}
		};

		// Install the all-trusting host verifier
		HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
	}

	/**
	 * @return the poxCookie
	 */
	public String getPoxCookie() {
		return poxCookie;
	}
	
	public void poxLogin(String tenantName, String tenantAdmin, String tenantAdminPassword) throws IOException, URISyntaxException {
        URI uri = new URI( proto, null, host, 
        		port, "/user/verify", null, null );
        l4j.debug("URI: " + uri);
        URL u = new URL(uri.toASCIIString());
        l4j.debug( "URL: " + u );

        HttpURLConnection con = (HttpURLConnection) u.openConnection();
        
        con.addRequestProperty("Accept", "application/xml");
        con.setRequestMethod("POST");
        con.setDoOutput(true);
        con.connect();
        OutputStream out = con.getOutputStream();
        String urlTenantName = URLEncoder.encode(tenantName, "UTF-8");
        String urluser = URLEncoder.encode(tenantAdmin, "UTF-8");
        String urlpass = URLEncoder.encode(tenantAdminPassword, "UTF-8");
        String requestBody = "tenant_name=" + urlTenantName + "&username=" + 
        		urluser + "&password=" + urlpass;
        out.write(requestBody.getBytes("US-ASCII"));
        out.close();
        
		int code = con.getResponseCode();
		if(code != 200) {
			throw new RuntimeException("Login failed with HTTP code " + code);
		}
		
		// Extract cookie
		String cookies = con.getHeaderField("Set-Cookie");
		
        Pattern cookiePattern = Pattern.compile("_gui_session_id=([^;]+);.*");
		Matcher m = cookiePattern.matcher(cookies);
		if(!m.find()) {
			throw new RuntimeException("Could not parse session cookie from " + cookies);
		}
		poxCookie = m.group(1);
		
	}
	
	public void poxLogin() throws IOException, URISyntaxException {
        URI uri = new URI( proto, null, host, 
        		port, "/mgmt_login/verify", null, null );
        l4j.debug("URI: " + uri);
        URL u = new URL(uri.toASCIIString());
        l4j.debug( "URL: " + u );

        HttpURLConnection con = (HttpURLConnection) u.openConnection();
        
        con.addRequestProperty("Accept", "application/xml");
        con.setRequestMethod("POST");
        con.setDoOutput(true);
        con.connect();
        OutputStream out = con.getOutputStream();
        String urluser = URLEncoder.encode(username, "UTF-8");
        String urlpass = URLEncoder.encode(password, "UTF-8");
        String requestBody = "auth_type=local&auth_addr=&username=" + 
        		urluser + "&password=" + urlpass;
        out.write(requestBody.getBytes("US-ASCII"));
        out.close();
        
		int code = con.getResponseCode();
		if(code != 200) {
			throw new RuntimeException("Login failed with HTTP code " + code);
		}
		
		// Extract cookie
		String cookies = con.getHeaderField("Set-Cookie");
		
		Pattern cookiePattern = Pattern.compile("_gui_session_id=([^;]+);.*");
		Matcher m = cookiePattern.matcher(cookies);
		if(!m.find()) {
			throw new RuntimeException("Could not parse session cookie from " + cookies);
		}
		poxCookie = m.group(1);
	}

	public GetUidResponse getUidPox(String subTenantName, String uid) throws Exception {
		GetUidRequest req = new GetUidRequest(this);
		req.setUid(uid);
		req.setSubTenantName(subTenantName);
		
		return req.call();
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy