Skip to content

Commit ec9c29d

Browse files
committed
novnc console squashed commit
1 parent be8ae98 commit ec9c29d

43 files changed

Lines changed: 12655 additions & 377 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

server/src/com/cloud/servlet/ConsoleProxyServlet.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,12 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
181181
return;
182182
}
183183

184+
String websocketConsole = req.getParameter("websocketconsole");
185+
184186
if (cmd.equalsIgnoreCase("thumbnail")) {
185187
handleThumbnailRequest(req, resp, vmId);
186188
} else if (cmd.equalsIgnoreCase("access")) {
187-
handleAccessRequest(req, resp, vmId);
189+
handleAccessRequest(req, resp, vmId, Boolean.valueOf(websocketConsole));
188190
} else {
189191
handleAuthRequest(req, resp, vmId);
190192
}
@@ -245,7 +247,7 @@ private void handleThumbnailRequest(HttpServletRequest req, HttpServletResponse
245247
}
246248
}
247249

248-
private void handleAccessRequest(HttpServletRequest req, HttpServletResponse resp, long vmId) {
250+
private void handleAccessRequest(HttpServletRequest req, HttpServletResponse resp, long vmId,Boolean webSocketRequest) {
249251
VirtualMachine vm = _vmMgr.findById(vmId);
250252
if (vm == null) {
251253
s_logger.warn("VM " + vmId + " does not exist, sending blank response for console access request");
@@ -287,7 +289,7 @@ private void handleAccessRequest(HttpServletRequest req, HttpServletResponse res
287289
}
288290

289291
StringBuffer sb = new StringBuffer();
290-
sb.append("<html><title>").append(escapeHTML(vmName)).append("</title><frameset><frame src=\"").append(composeConsoleAccessUrl(rootUrl, vm, host));
292+
sb.append("<html><title>").append(escapeHTML(vmName)).append("</title><frameset><frame src=\"").append(composeConsoleAccessUrl(rootUrl, vm, host, webSocketRequest));
291293
sb.append("\"></frame></frameset></html>");
292294
s_logger.debug("the console url is :: " + sb.toString());
293295
sendResponse(resp, sb.toString());
@@ -405,7 +407,7 @@ private String composeThumbnailUrl(String rootUrl, VirtualMachine vm, HostVO hos
405407
param.setClientTunnelSession(parsedHostInfo.third());
406408
}
407409

408-
sb.append("/ajaximg?token=" + encryptor.encryptObject(ConsoleProxyClientParam.class, param));
410+
sb.append("/ajaximg/?token=" + encryptor.encryptObject(ConsoleProxyClientParam.class, param));
409411
sb.append("&w=").append(w).append("&h=").append(h).append("&key=0");
410412

411413
if (s_logger.isDebugEnabled()) {
@@ -414,7 +416,7 @@ private String composeThumbnailUrl(String rootUrl, VirtualMachine vm, HostVO hos
414416
return sb.toString();
415417
}
416418

417-
private String composeConsoleAccessUrl(String rootUrl, VirtualMachine vm, HostVO hostVo) {
419+
private String composeConsoleAccessUrl(String rootUrl, VirtualMachine vm, HostVO hostVo, Boolean webSocketRequest) {
418420
StringBuffer sb = new StringBuffer(rootUrl);
419421
String host = hostVo.getPrivateIpAddress();
420422

@@ -461,7 +463,12 @@ private String composeConsoleAccessUrl(String rootUrl, VirtualMachine vm, HostVO
461463
param.setClientTunnelSession(parsedHostInfo.third());
462464
}
463465

464-
sb.append("/ajax?token=" + encryptor.encryptObject(ConsoleProxyClientParam.class, param));
466+
467+
if(webSocketRequest){
468+
sb.append("/novnc/?token=" + encryptor.encryptObject(ConsoleProxyClientParam.class, param));
469+
}else {
470+
sb.append("/ajax/?token=" + encryptor.encryptObject(ConsoleProxyClientParam.class, param));
471+
}
465472

466473
// for console access, we need guest OS type to help implement keyboard
467474
long guestOs = vm.getGuestOSId();

services/console-proxy/server/pom.xml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,16 @@
4949
<artifactId>cloudstack-service-console-proxy-rdpclient</artifactId>
5050
<version>${project.version}</version>
5151
</dependency>
52+
<dependency>
53+
<groupId>org.eclipse.jetty</groupId>
54+
<artifactId>jetty-server</artifactId>
55+
<version>9.2.20.v20161216</version>
56+
</dependency>
57+
<dependency>
58+
<groupId>org.eclipse.jetty.websocket</groupId>
59+
<artifactId>websocket-server</artifactId>
60+
<version>9.2.20.v20161216</version>
61+
</dependency>
5262
</dependencies>
5363
<build>
5464
<resources>
@@ -60,4 +70,4 @@
6070
</resource>
6171
</resources>
6272
</build>
63-
</project>
73+
</project>

services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxy.java

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141

4242
import com.cloud.consoleproxy.util.Logger;
4343
import com.cloud.utils.PropertiesUtil;
44+
import org.eclipse.jetty.server.Server;
4445

4546
/**
4647
*
@@ -141,6 +142,9 @@ private static void configProxy(Properties conf) {
141142
factoryClzName = ConsoleProxyBaseServerFactoryImpl.class.getName();
142143
}
143144

145+
httpListenPort = 443;
146+
factoryClzName = "com.cloud.consoleproxy.ConsoleProxySecureServerFactoryImpl";
147+
144148
s = conf.getProperty("consoleproxy.httpCmdListenPort");
145149
if (s != null) {
146150
httpCmdListenPort = Integer.parseInt(s);
@@ -328,7 +332,8 @@ public static void start(Properties conf) {
328332
}
329333

330334
if (httpListenPort != 0) {
331-
startupHttpMain();
335+
// startupHttpMain();
336+
startServerForNoVNC();
332337
} else {
333338
s_logger.error("A valid HTTP server port is required to be specified, please check your consoleproxy.httpListenPort settings");
334339
System.exit(1);
@@ -354,10 +359,11 @@ private static void startupHttpMain() {
354359
}
355360

356361
HttpServer server = factory.createHttpServerInstance(httpListenPort);
357-
server.createContext("/getscreen", new ConsoleProxyThumbnailHandler());
358-
server.createContext("/resource/", new ConsoleProxyResourceHandler());
359-
server.createContext("/ajax", new ConsoleProxyAjaxHandler());
360-
server.createContext("/ajaximg", new ConsoleProxyAjaxImageHandler());
362+
// server.createContext("/getscreen", new ConsoleProxyThumbnailHandler());
363+
// server.createContext("/resource/", new ConsoleProxyResourceHandler());
364+
// server.createContext("/ajax", new ConsoleProxyAjaxHandler());
365+
// server.createContext("/ajaximg", new ConsoleProxyAjaxImageHandler());
366+
// server.createContext("/novnc", new NoVncConsoleHandler());
361367
server.setExecutor(new ThreadExecutor()); // creates a default executor
362368
server.start();
363369
} catch (Exception e) {
@@ -379,7 +385,23 @@ private static void startupHttpCmdPort() {
379385
}
380386
}
381387

382-
public static void main(String[] argv) {
388+
private static void startServerForNoVNC() {
389+
try {
390+
ConsoleProxyServerFactory factory = getHttpServerFactory();
391+
if (factory == null) {
392+
s_logger.error("Unable to load HTTP server factory");
393+
System.exit(1);
394+
}
395+
Server webServer = factory.
396+
createConsoleProxyServer(443);
397+
webServer.start();
398+
} catch (Exception e) {
399+
s_logger.error(" could not start webserver at 80", e);
400+
throw new RuntimeException("could not start webserver at 80");
401+
}
402+
}
403+
404+
public static void main(String[] argv) throws Exception {
383405
standaloneStart = true;
384406
configLog4j();
385407
Logger.setFactory(new ConsoleProxyLoggerFactory());

0 commit comments

Comments
 (0)