From 3cbb8bc198685a44247e5127db4f133be7cf8faa Mon Sep 17 00:00:00 2001 From: Rajesh Battala Date: Tue, 10 Apr 2012 18:01:56 +0530 Subject: [PATCH] Xenserver Secure Console Proxy Phase I --- .../ConsoleProxyAjaxImageHandler.java | 4 +- .../xen/resource/CitrixResourceBase.java | 47 ++++++++++++++++++- .../cloud/servlet/ConsoleProxyServlet.java | 25 +++++++++- 3 files changed, 72 insertions(+), 4 deletions(-) diff --git a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxImageHandler.java b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxImageHandler.java index 3b5d726b67d..e26a3ddb4a0 100644 --- a/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxImageHandler.java +++ b/console-proxy/src/com/cloud/consoleproxy/ConsoleProxyAjaxImageHandler.java @@ -61,7 +61,9 @@ public class ConsoleProxyAjaxImageHandler implements HttpHandler { String sid = queryMap.get("sid"); String tag = queryMap.get("tag"); String ticket = queryMap.get("ticket"); - String keyStr = queryMap.get("key"); + String keyStr = queryMap.get("key"); + String console_url = queryMap.get("consoleurl"); + String console_host_session = queryMap.get("sessionref"); int key = 0; if(tag == null) diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 784ce3ccd0b..f148d3bc3f8 100755 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -1709,7 +1709,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe try { Set vms = VM.getByNameLabel(conn, cmd.getName()); if(vms.size() == 1) { - return new GetVncPortAnswer(cmd, getVncPort(conn, vms.iterator().next())); + int vncport = getVncPort(conn, vms.iterator().next()); + String consoleurl; + consoleurl = "consoleurl=" +getVncUrl(conn, vms.iterator().next()) + "&" +"sessionref="+ conn.getSessionReference(); + return new GetVncPortAnswer(cmd, consoleurl, vncport); } else { return new GetVncPortAnswer(cmd, "There are " + vms.size() + " VMs named " + cmd.getName()); } @@ -2612,6 +2615,12 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe VM.Record record; try { record = vm.getRecord(conn); + Set consoles = record.consoles; + if (consoles.isEmpty()) { + s_logger.warn("There are no Consoles available to the vm : " + record.nameDescription); + return -1; + } + Iterator i = consoles.iterator(); } catch (XenAPIException e) { String msg = "Unable to get vnc-port due to " + e.toString(); s_logger.warn(msg, e); @@ -2634,6 +2643,42 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe vncport = vncport.replace("\n", ""); return NumbersUtil.parseInt(vncport, -1); } + + protected String getVncUrl(Connection conn, VM vm) { + VM.Record record; + Console c; + String consoleurl; + try { + record = vm.getRecord(conn); + Set consoles = record.consoles; + if (consoles.isEmpty()) { + s_logger.warn("There are no Consoles available to the vm : " + record.nameDescription); + return null; + } + Iterator i = consoles.iterator(); + c = i.next(); + consoleurl = c.getLocation(conn); + } catch (XenAPIException e) { + String msg = "Unable to get console url due to " + e.toString(); + s_logger.warn(msg, e); + return null; + } catch (XmlRpcException e) { + String msg = "Unable to get console url due to " + e.getMessage(); + s_logger.warn(msg, e); + return null; + } + + if (consoleurl.isEmpty()) + return null; + else + return consoleurl; + + + + } + + + @Override public RebootAnswer execute(RebootCommand cmd) { diff --git a/server/src/com/cloud/servlet/ConsoleProxyServlet.java b/server/src/com/cloud/servlet/ConsoleProxyServlet.java index da55a9e0202..d8353cdc59d 100644 --- a/server/src/com/cloud/servlet/ConsoleProxyServlet.java +++ b/server/src/com/cloud/servlet/ConsoleProxyServlet.java @@ -245,6 +245,7 @@ public class ConsoleProxyServlet extends HttpServlet { StringBuffer sb = new StringBuffer(); sb.append("").append(escapeHTML(vmName)).append(""); + s_logger.debug("the console url is :: " + sb.toString()); sendResponse(resp, sb.toString()); } @@ -310,12 +311,26 @@ public class ConsoleProxyServlet extends HttpServlet { private String composeConsoleAccessUrl(String rootUrl, VMInstanceVO vm, HostVO hostVo) { StringBuffer sb = new StringBuffer(rootUrl); - + String[] console_session = null; + String console_url = null; String host = hostVo.getPrivateIpAddress(); Pair portInfo = _ms.getVncPort(vm); + + s_logger.debug("Port info " + portInfo.first()); + if(portInfo.first() != null) { - host = portInfo.first(); + console_url = host = portInfo.first(); } + + System.out.println("Port info " + portInfo.first()); + if ( console_url !=null && console_url.startsWith("consoleurl")) { + console_session = console_url.split("&"); + host = console_url.substring(19,console_url.indexOf('/', 19)).trim(); + } + + + + String sid = vm.getVncPassword(); String tag = String.valueOf(vm.getId()); tag = _identityService.getIdentityUuid("vm_instance", tag); @@ -326,6 +341,12 @@ public class ConsoleProxyServlet extends HttpServlet { sb.append("&sid=").append(sid); sb.append("&tag=").append(tag); sb.append("&ticket=").append(ticket); + System.out.println("Port info " + portInfo.first()); + + if ( console_session !=null && console_session.length == 2){ + sb.append("&").append(console_session[0]); + sb.append("&").append(console_session[1]); + } // for console access, we need guest OS type to help implement keyboard long guestOs = vm.getGuestOSId();