From 20740ad583630ef84b990b7c4d7bcf0fc0735860 Mon Sep 17 00:00:00 2001 From: Daniel Molina Date: Wed, 10 Jun 2015 15:49:14 +0200 Subject: [PATCH] feature #3748: Add VNC libraries --- src/sunstone/public/app/main.js | 10 ++- src/sunstone/public/app/sunstone-config.js | 4 +- src/sunstone/public/app/utils/vnc.js | 95 ++++++++++++++++++++++ 3 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 src/sunstone/public/app/utils/vnc.js diff --git a/src/sunstone/public/app/main.js b/src/sunstone/public/app/main.js index 25ef50d128..4a6e7dd3bd 100644 --- a/src/sunstone/public/app/main.js +++ b/src/sunstone/public/app/main.js @@ -48,7 +48,10 @@ require.config({ 'flot.tooltip': '../bower_components/flot.tooltip/js/jquery.flot.tooltip.min', /* noUiSlider */ - 'nouislider': '../vendor/4.0/nouislider/jquery.nouislider.min' + 'nouislider': '../vendor/4.0/nouislider/jquery.nouislider.min', + + /* VNC */ + 'vnc-util': '../bower_components/no-vnc/include/util' }, shim: { /* jQuery */ @@ -152,6 +155,11 @@ require.config({ 'nouislider': { deps: ['jquery'] }, + + /* VNC */ + 'vnc-util': { + exports: 'Util' + }, } }); diff --git a/src/sunstone/public/app/sunstone-config.js b/src/sunstone/public/app/sunstone-config.js index 0c04229b91..64952cb7ee 100644 --- a/src/sunstone/public/app/sunstone-config.js +++ b/src/sunstone/public/app/sunstone-config.js @@ -99,7 +99,9 @@ define(function(require) { }, 'autoRefresh' : _config['view']['autorefresh'], - 'tableOrder': _config['user_config']['table_order'] + 'tableOrder': _config['user_config']['table_order'], + 'vncProxyPort': _config['system_config']['vnc_proxy_port'], + 'vncWSS': _config['user_config']['vnc_wss'] } return Config; diff --git a/src/sunstone/public/app/utils/vnc.js b/src/sunstone/public/app/utils/vnc.js new file mode 100644 index 0000000000..b73766a20c --- /dev/null +++ b/src/sunstone/public/app/utils/vnc.js @@ -0,0 +1,95 @@ +define(function(require) { + INCLUDE_URI = "bower_components/no-vnc/include/"; + require('vnc-util'); + var Config = require('sunstone-config'); + + var _lock = false; + var _rfb; + + Util.load_scripts(["webutil.js", "base64.js", "websock.js", "des.js", + "keysymdef.js", "keyboard.js", "input.js", "display.js", + "jsunzip.js", "rfb.js", "keysym.js"]); + + return { + 'lockStatus': lockStatus, + 'lock': lock, + 'unlock': unlock, + 'vncCallback': vncCallback, + 'disconnect': disconnect, + 'sendCtrlAltDel': sendCtrlAltDel + } + + function lockStatus() { + return _lock; + } + + function lock() { + _lock = true; + } + + function unlock() { + _lock = false; + } + + function vncCallback(response) { + _rfb = new RFB({'target': $D('VNC_canvas'), + 'encrypt': Config.vncWSS == "yes", + 'true_color': true, + 'local_cursor': true, + 'shared': true, + 'onUpdateState': updateVNCState}); + + var proxy_host = window.location.hostname; + var proxy_port = Config.vncProxyPort; + var pw = response["password"]; + var token = response["token"]; + var vm_name = response["vm_name"]; + var path = '?token=' + token; + + var url = "vnc?"; + url += "host=" + proxy_host; + url += "&port=" + proxy_port; + url += "&token=" + token; + url += "&password=" + pw; + url += "&encrypt=" + Config.vncWSS; + url += "&title=" + vm_name; + + $("#open_in_a_new_window").attr('href', url) + _rfb.connect(proxy_host, proxy_port, pw, path); + } + + function disconnect() { + if (_rfb) { _rfb.disconnect(); } + } + + function sendCtrlAltDel() { + if (_rfb) { rfb.sendCtrlAltDel(); } + } + + //This is taken from noVNC examples + function updateVNCState(rfb, state, oldstate, msg) { + var s, sb, cad, klass; + s = $D('VNC_status'); + sb = $D('VNC_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; + } + + if (typeof(msg) !== 'undefined') { + sb.setAttribute("class", "noVNC_status_" + level); + s.innerHTML = msg; + } + } +});