[pve-devel] [PATCH 2/3] add novnc html template
Alexandre Derumier
aderumier at odiso.com
Mon Jun 2 01:50:19 CEST 2014
From: Stefan Priebe <s.priebe at profihost.ag>
Signed-off-by: Stefan Priebe <s.priebe at profihost.ag>
Signed-off-by: Alexandre Derumier <aderumier at odiso.com>
---
defines.mk | 1 +
www/Makefile | 2 +-
www/novnc/Makefile | 15 ++++
www/novnc/vnc_pve.html | 188 ++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 205 insertions(+), 1 deletion(-)
create mode 100644 www/novnc/Makefile
create mode 100644 www/novnc/vnc_pve.html
diff --git a/defines.mk b/defines.mk
index 0194db9..1db5ced 100644
--- a/defines.mk
+++ b/defines.mk
@@ -18,3 +18,4 @@ WWWIMAGEDIR=${WWWBASEDIR}/images
WWWEXT4DIR=${WWWBASEDIR}/ext4
WWWCSSDIR=${WWWBASEDIR}/css
WWWJSDIR=${WWWBASEDIR}/js
+WWWNOVNCDIR=${WWWBASEDIR}/novnc
diff --git a/www/Makefile b/www/Makefile
index 60e1fad..f464684 100644
--- a/www/Makefile
+++ b/www/Makefile
@@ -1,4 +1,4 @@
-SUBDIRS = images ext4 css manager bootstrap
+SUBDIRS = images ext4 css manager bootstrap novnc
all: ${SUBDIRS}
diff --git a/www/novnc/Makefile b/www/novnc/Makefile
new file mode 100644
index 0000000..9d99ab4
--- /dev/null
+++ b/www/novnc/Makefile
@@ -0,0 +1,15 @@
+include ../../defines.mk
+
+all:
+
+.PHONY: install
+install: vnc_pve.html
+ install -d ${WWWNOVNCDIR}
+ install -m 0644 -o www-data -g www-data $< ${WWWNOVNCDIR}
+
+.PHONY: distclean
+distclean: clean
+
+.PHONY: clean
+clean:
+ rm -rf *~
diff --git a/www/novnc/vnc_pve.html b/www/novnc/vnc_pve.html
new file mode 100644
index 0000000..460e39a
--- /dev/null
+++ b/www/novnc/vnc_pve.html
@@ -0,0 +1,188 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>noVNC</title>
+
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+
+ <!-- Apple iOS Safari settings -->
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+ <meta name="apple-mobile-web-app-capable" content="yes" />
+ <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
+ <!-- App Start Icon -->
+ <link rel="apple-touch-startup-image" href="images/screen_320x460.png" />
+ <!-- For iOS devices set the icon to use if user bookmarks app on their homescreen -->
+ <link rel="apple-touch-icon" href="images/screen_57x57.png">
+
+ <!-- Stylesheets -->
+ <link rel="stylesheet" href="include/base.css" title="plain">
+
+ <script src="include/util.js"></script>
+</head>
+
+<body style="margin: 0px;">
+ <div id="noVNC_screen">
+ <div id="noVNC_status_bar" class="noVNC_status_bar" style="margin-top: 0px; visibility: hidden; position: absolute;">
+ <table border=0 width="100%"><tr>
+ <td><div id="noVNC_status" style="position: relative; height: auto;">
+ Loading
+ </div></td>
+ <td width="1%"><div id="noVNC_buttons">
+ <input type=button value="Send CtrlAltDel"
+ id="sendCtrlAltDelButton">
+ <span id="noVNC_xvp_buttons">
+ <input type=button value="Shutdown"
+ id="xvpShutdownButton">
+ <input type=button value="Reboot"
+ id="xvpRebootButton">
+ <input type=button value="Reset"
+ id="xvpResetButton">
+ </span>
+ </div>
+ </td>
+ </tr></table>
+ </div>
+ <canvas id="noVNC_canvas" width="640px" height="20px">
+ Canvas not supported.
+ </canvas>
+ </div>
+
+ <script>
+ /*jslint white: false */
+ /*global window, $, Util, RFB, */
+ "use strict";
+
+ // Load supporting scripts
+ Util.load_scripts(["webutil.js", "base64.js", "websock.js", "des.js",
+ "keysymdef.js", "keyboard.js", "input.js", "display.js",
+ "jsunzip.js", "rfb.js"]);
+
+ var rfb;
+
+ function passwordRequired(rfb) {
+ var msg;
+ msg = '<form onsubmit="return setPassword();"';
+ msg += ' style="margin-bottom: 0px">';
+ msg += 'Password Required: ';
+ msg += '<input type=password size=10 id="password_input" class="noVNC_status">';
+ msg += '<\/form>';
+ $D('noVNC_status_bar').setAttribute("class", "noVNC_status_warn");
+ $D('noVNC_status').innerHTML = msg;
+ }
+ function setPassword() {
+ rfb.sendPassword($D('password_input').value);
+ return false;
+ }
+ function sendCtrlAltDel() {
+ rfb.sendCtrlAltDel();
+ return false;
+ }
+ function xvpShutdown() {
+ rfb.xvpShutdown();
+ return false;
+ }
+ function xvpReboot() {
+ rfb.xvpReboot();
+ return false;
+ }
+ function xvpReset() {
+ rfb.xvpReset();
+ return false;
+ }
+ function updateState(rfb, state, oldstate, msg) {
+ var s, sb, cad, level;
+ s = $D('noVNC_status');
+ sb = $D('noVNC_status_bar');
+ cad = $D('sendCtrlAltDelButton');
+ switch (state) {
+ case 'failed': level = "error"; break;
+ case 'fatal': level = "error"; break;
+ case 'normal': level = "normal"; break;
+ case 'disconnected': level = "normal"; break;
+ case 'loaded': level = "normal"; break;
+ default: level = "warn"; break;
+ }
+
+ if (state === "normal") {
+ cad.disabled = false;
+ } else {
+ cad.disabled = true;
+ xvpInit(0);
+ }
+
+ if (typeof(msg) !== 'undefined') {
+ sb.setAttribute("class", "noVNC_status_" + level);
+ s.innerHTML = msg;
+ }
+ }
+
+ function xvpInit(ver) {
+ var xvpbuttons;
+ xvpbuttons = $D('noVNC_xvp_buttons');
+ if (ver >= 1) {
+ xvpbuttons.style.display = 'inline';
+ } else {
+ xvpbuttons.style.display = 'none';
+ }
+ }
+
+ window.onscriptsload = function () {
+ var host, port, password, path, token;
+
+ $D('sendCtrlAltDelButton').style.display = "inline";
+ $D('sendCtrlAltDelButton').onclick = sendCtrlAltDel;
+ $D('xvpShutdownButton').onclick = xvpShutdown;
+ $D('xvpRebootButton').onclick = xvpReboot;
+ $D('xvpResetButton').onclick = xvpReset;
+
+ WebUtil.init_logging(WebUtil.getQueryVar('logging', 'warn'));
+ document.title = unescape(WebUtil.getQueryVar('title', 'noVNC'));
+ // By default, use the host and port of server that served this file
+ host = WebUtil.getQueryVar('host', window.location.hostname);
+ port = WebUtil.getQueryVar('port', window.location.port);
+
+ // if port == 80 (or 443) then it won't be present and should be
+ // set manually
+ if (!port) {
+ if (window.location.protocol.substring(0,5) == 'https') {
+ port = 443;
+ }
+ else if (window.location.protocol.substring(0,4) == 'http') {
+ port = 80;
+ }
+ }
+
+ // If a token variable is passed in, set the parameter in a cookie.
+ // This is used by nova-novncproxy.
+ token = WebUtil.getQueryVar('token', null);
+ if (token) {
+ WebUtil.createCookie('token', token, 1)
+ }
+
+ password = WebUtil.getQueryVar('password', '');
+ path = WebUtil.getQueryVar('path', 'websockify');
+
+ if ((!host) || (!port)) {
+ updateState('failed',
+ "Must specify host and port in URL");
+ return;
+ }
+
+ rfb = new RFB({'target': $D('noVNC_canvas'),
+ 'encrypt': WebUtil.getQueryVar('encrypt',
+ (window.location.protocol === "https:")),
+ 'repeaterID': WebUtil.getQueryVar('repeaterID', ''),
+ 'true_color': WebUtil.getQueryVar('true_color', true),
+ 'local_cursor': WebUtil.getQueryVar('cursor', true),
+ 'shared': WebUtil.getQueryVar('shared', true),
+ 'view_only': WebUtil.getQueryVar('view_only', false),
+ 'updateState': updateState,
+ 'onXvpInit': xvpInit,
+ 'onPasswordRequired': passwordRequired});
+ rfb.connect(host, port, password, path);
+ };
+ </script>
+
+ </body>
+</html>
--
1.7.10.4
More information about the pve-devel
mailing list