1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2025-07-31 12:41:08 +00:00

fix console password & sendkey & css fixes & add scale vb

This commit is contained in:
catborise 2020-06-24 12:39:32 +03:00
parent 48f9ba6d73
commit 4f8a1fd50d
9 changed files with 767 additions and 886 deletions

View file

@ -1,6 +1,7 @@
{% load staticfiles %}
{% load i18n %}
<html>
<head>
<meta charset="utf-8">
<link rel="shortcut icon" href="{% static "favicon.ico" %}">
@ -9,19 +10,13 @@
<link href="{% static "css/webvirtcloud.css" %}" rel="stylesheet">
<style>
body {
margin: 0;
padding: 0;
background-color: #313131;
}
#main_container {
padding: 0;
width: 100%;
max-width: none;
height: 100%;
background-color:#494949;
border-bottom-right-radius: 800px 600px;
background-color: #494949;
border-bottom-right-radius: 850px 600px;
}
@ -32,102 +27,90 @@
margin-right: auto;
display: block;
}
#status {
z-index: 10000;
width: 80%;
position: absolute;
top: 5px;
left: 10%;
text-align: center;
}
</style>
{% block head %}{% endblock %}
{% block head %}{% endblock %}
</head>
<body>
<div id='main_container' class="container">
<nav class="navbar navbar-expand-md navbar-dark bg-primary" arial-label="console navbar">
<div class="container">
<a class="navbar-brand">{{ instance.name }}</a>
<button type="button" class="navbar-toggler" data-toggle="collapse" data-target=".navbar-collapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div id='main_container' class="container">
<nav class="navbar navbar-expand-md navbar-dark bg-primary" arial-label="console navbar">
<div class="container">
<a class="navbar-brand">{{ instance.name }}</a>
<button type="button" class="navbar-toggler" data-toggle="collapse" data-target=".navbar-collapse"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse">
<ul class="navbar-nav mr-auto mt-2 mt-md-0">
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle"
data-toggle="dropdown"
role="button"
id="dropdownMenuLink"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false">
{% trans "Send key(s)" %}
</a>
<div class="dropdown-menu" aria-labelledby="dropdownMenuLink">
<a class="dropdown-item" id="ctrlaltdel" href='#'>Ctrl+Alt+Del</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" id="ctrlaltf1" href='#'>Ctrl+Alt+F1</a>
<a class="dropdown-item" id="ctrlaltf2" href='#'>Ctrl+Alt+F2</a>
<a class="dropdown-item" id="ctrlaltf3" href='#'>Ctrl+Alt+F3</a>
<a class="dropdown-item" id="ctrlaltf4" href='#'>Ctrl+Alt+F4</a>
<a class="dropdown-item" id="ctrlaltf5" href='#'>Ctrl+Alt+F5</a>
<a class="dropdown-item" id="ctrlaltf6" href='#'>Ctrl+Alt+F6</a>
<a class="dropdown-item" id="ctrlaltf7" href='#'>Ctrl+Alt+F7</a>
<a class="dropdown-item" id="ctrlaltf8" href='#'>Ctrl+Alt+F8</a>
<a class="dropdown-item" id="ctrlaltf9" href='#'>Ctrl+Alt+F9</a>
<a class="dropdown-item" id="ctrlaltf10" href='#'>Ctrl+Alt+F10</a>
<a class="dropdown-item" id="ctrlaltf11" href='#'>Ctrl+Alt+F11</a>
<a class="dropdown-item" id="ctrlaltf12" href='#'>Ctrl+Alt+F12</a>
<div class="collapse navbar-collapse">
<ul class="navbar-nav mr-auto mt-2 mt-md-0">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" role="button"
id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{% trans "Send key(s)" %}
</a>
<div class="dropdown-menu" aria-labelledby="dropdownMenuLink">
<a class="dropdown-item" id="ctrlaltdel" href='#'>Ctrl+Alt+Del</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" id="ctrlaltf1" href='#'>Ctrl+Alt+F1</a>
<a class="dropdown-item" id="ctrlaltf2" href='#'>Ctrl+Alt+F2</a>
<a class="dropdown-item" id="ctrlaltf3" href='#'>Ctrl+Alt+F3</a>
<a class="dropdown-item" id="ctrlaltf4" href='#'>Ctrl+Alt+F4</a>
<a class="dropdown-item" id="ctrlaltf5" href='#'>Ctrl+Alt+F5</a>
<a class="dropdown-item" id="ctrlaltf6" href='#'>Ctrl+Alt+F6</a>
<a class="dropdown-item" id="ctrlaltf7" href='#'>Ctrl+Alt+F7</a>
<a class="dropdown-item" id="ctrlaltf8" href='#'>Ctrl+Alt+F8</a>
<a class="dropdown-item" id="ctrlaltf9" href='#'>Ctrl+Alt+F9</a>
<a class="dropdown-item" id="ctrlaltf10" href='#'>Ctrl+Alt+F10</a>
<a class="dropdown-item" id="ctrlaltf11" href='#'>Ctrl+Alt+F11</a>
<a class="dropdown-item" id="ctrlaltf12" href='#'>Ctrl+Alt+F12</a>
</div>
</li>
<li class="nav-item" id="fullscreen_button">
<a class="nav-link" href='#'>{% trans "Fullscreen" %}</a>
</li>
{% block navbarmenu %}{% endblock %}
</ul>
</div>
</li>
<li class="nav-item" id="fullscreen_button">
<a class="nav-link" href='#'>{% trans "Fullscreen" %}</a>
</li>
{% block navbarmenu %}{% endblock %}
</ul>
</div>
</nav>
</div>
</nav>
{% block content %}{% endblock %}
</div>
<script src="{% static "js/jquery.js" %}"></script>
<script src="{% static "js/bootstrap.bundle.min.js" %}"></script>
{% block content %}{% endblock %}
</div>
<script src="{% static "js/jquery.js" %}"></script>
<script src="{% static "js/bootstrap.bundle.min.js" %}"></script>
<script>
function log_message(msg,type) {
var exist=$('#status').is('div');
status_div=$('<div id="status" class="alert alert-'+type+' role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>'+msg+'</div>');
if (exist) {
$('#status').remove();
$('body').prepend(status_div);
<script>
function log_message(msg, type) {
var exist = $('#status').is('div');
status_div = $('<div id="status" class="alert alert-' + type + ' role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>' + msg + '</div>');
if (exist) {
$('#status').remove();
$('body').prepend(status_div);
}
else {
status_div.hide();
$('body').prepend(status_div);
status_div.fadeIn(200);
}
if (type != 'danger') {
status_div.delay(3000).fadeOut(200);
}
}
else {
status_div.hide();
$('body').prepend(status_div);
status_div.fadeIn(200);
}
if (type!='danger') {
status_div.delay(3000).fadeOut(200);
}
}
function log_error(msg) {
log_message(msg,'danger');
}
function log_error(msg) {
log_message(msg, 'danger');
}
function log_info(msg) {
log_message(msg,'info');
}
{% if console_error %}
function log_info(msg) {
log_message(msg, 'info');
}
{% if console_error %}
log_error('{{ console_error|escapejs }}');
{% endif %}
</script>
{% endif %}
</script>
{% block foot %}{% endblock %}
{% block foot %}{% endblock %}
</body>
</html>
</html>

View file

@ -27,138 +27,116 @@
{% load staticfiles %}
{% block head %}
<title>WebVirtCloud - Spice Client - Full</title>
<link rel="stylesheet" type="text/css" href="{% static "js/spice-html5/spice.css" %}" />
<title>WebVirtCloud - Spice Client - Full</title>
<link rel="stylesheet" type="text/css" href="{% static "js/spice-html5/spice.css" %}" />
<!-- ES2015/ES6 modules polyfill -->
<script type="module">
window._spice_has_module_support = true;
</script>
<script>
window.addEventListener("load", function() {
if (window._spice_has_module_support) return;
var loader = document.createElement("script");
loader.src = '{% static "thirdparty/browser-es-module-loader/dist/browser-es-module-loader.js" %}';
document.head.appendChild(loader);
});
</script>
<!-- ES2015/ES6 modules polyfill -->
<script type="module">
window._spice_has_module_support = true;
</script>
<script>
window.addEventListener("load", function () {
if (window._spice_has_module_support) return;
var loader = document.createElement("script");
loader.src = '{% static "thirdparty/browser-es-module-loader/dist/browser-es-module-loader.js" %}';
document.head.appendChild(loader);
});
</script>
<script type="module" crossorigin="anonymous">
<script type="module" crossorigin="anonymous">
import * as SpiceHtml5 from '{% static "js/spice-html5/main.js" %}';
import * as SpiceHtml5 from '{% static "js/spice-html5/main.js" %}';
var host = null, port = null;
var sc;
var host = null, port = null;
var sc;
function spice_error(e) {
function spice_error(e) {
disconnect();
}
function connect() {
var host, port, password, scheme = "ws://", uri;
host = document.getElementById("host").value;
port = document.getElementById("port").value;
password = document.getElementById("password").value;
if ((!host) || (!port)) {
console.log("must set host and port");
return;
}
if (sc) {
sc.stop();
}
uri = scheme + host + ":" + port;
document.getElementById('connectButton').innerHTML = "Stop";
document.getElementById('connectButton').onclick = disconnect;
try {
sc = new SpiceHtml5.SpiceMainConn({
uri: uri, screen_id: "spice-screen", dump_id: "debug-div",
message_id: "message-div", password: password, onerror: spice_error, onagent: agent_connected
});
}
catch (e) {
alert(e.toString());
disconnect();
}
}
function connect() {
var host, port, password, scheme = "ws://", uri;
host = document.getElementById("host").value;
port = document.getElementById("port").value;
password = document.getElementById("password").value;
if ((!host) || (!port)) {
console.log("must set host and port");
return;
function disconnect() {
console.log(">> disconnect");
if (sc) {
sc.stop();
}
document.getElementById('connectButton').innerHTML = "Start";
document.getElementById('connectButton').onclick = connect;
if (window.File && window.FileReader && window.FileList && window.Blob) {
var spice_xfer_area = document.getElementById('spice-xfer-area');
if (spice_xfer_area != null) {
document.getElementById('spice-area').removeChild(spice_xfer_area);
}
document.getElementById('spice-area').removeEventListener('dragover', SpiceHtml5.handle_file_dragover, false);
document.getElementById('spice-area').removeEventListener('drop', SpiceHtml5.handle_file_drop, false);
}
console.log("<< disconnect");
}
if (sc) {
sc.stop();
}
function agent_connected(sc) {
window.addEventListener('resize', SpiceHtml5.handle_resize);
window.spice_connection = this;
uri = scheme + host + ":" + port;
SpiceHtml5.resize_helper(this);
document.getElementById('connectButton').innerHTML = "Stop";
document.getElementById('connectButton').onclick = disconnect;
if (window.File && window.FileReader && window.FileList && window.Blob) {
var spice_xfer_area = document.createElement("div");
spice_xfer_area.setAttribute('id', 'spice-xfer-area');
document.getElementById('spice-area').appendChild(spice_xfer_area);
document.getElementById('spice-area').addEventListener('dragover', SpiceHtml5.handle_file_dragover, false);
document.getElementById('spice-area').addEventListener('drop', SpiceHtml5.handle_file_drop, false);
}
else {
console.log("File API is not supported");
}
}
try {
sc = new SpiceHtml5.SpiceMainConn({uri: uri, screen_id: "spice-screen", dump_id: "debug-div",
message_id: "message-div", password: password, onerror: spice_error, onagent: agent_connected });
}
catch (e) {
alert(e.toString());
disconnect();
}
function toggle_console() {
var checkbox = document.getElementById('show_console');
var m = document.getElementById('message-div');
if (checkbox.checked) {
m.style.display = 'block';
}
else {
m.style.display = 'none';
}
function disconnect() {
console.log(">> disconnect");
if (sc) {
sc.stop();
}
document.getElementById('connectButton').innerHTML = "Start";
document.getElementById('connectButton').onclick = connect;
if (window.File && window.FileReader && window.FileList && window.Blob) {
var spice_xfer_area = document.getElementById('spice-xfer-area');
if (spice_xfer_area != null) {
document.getElementById('spice-area').removeChild(spice_xfer_area);
}
document.getElementById('spice-area').removeEventListener('dragover', SpiceHtml5.handle_file_dragover, false);
document.getElementById('spice-area').removeEventListener('drop', SpiceHtml5.handle_file_drop, false);
}
console.log("<< disconnect");
}
function agent_connected(sc) {
window.addEventListener('resize', SpiceHtml5.handle_resize);
window.spice_connection = this;
SpiceHtml5.resize_helper(this);
if (window.File && window.FileReader && window.FileList && window.Blob) {
var spice_xfer_area = document.createElement("div");
spice_xfer_area.setAttribute('id', 'spice-xfer-area');
document.getElementById('spice-area').appendChild(spice_xfer_area);
document.getElementById('spice-area').addEventListener('dragover', SpiceHtml5.handle_file_dragover, false);
document.getElementById('spice-area').addEventListener('drop', SpiceHtml5.handle_file_drop, false);
}
else {
console.log("File API is not supported");
}
}
function toggle_console() {
var checkbox = document.getElementById('show_console');
var m = document.getElementById('message-div');
if (checkbox.checked) {
m.style.display = 'block';
}
else {
m.style.display = 'none';
}
window.addEventListener('resize', SpiceHtml5.handle_resize);
if (sc) {
SpiceHtml5.resize_helper(sc);
}
}
/* SPICE port event listeners
window.addEventListener('spice-port-data', function(event) {
// Here we convert data to text, but really we can obtain binary data also
var msg_text = arraybuffer_to_str(new Uint8Array(event.detail.data));
DEBUG > 0 && console.log('SPICE port', event.detail.channel.portName, 'message text:', msg_text);
});
window.addEventListener('spice-port-event', function(event) {
DEBUG > 0 && console.log('SPICE port', event.detail.channel.portName, 'event data:', event.detail.spiceEvent);
});
*/
function fullscreen() {
var screen=document.getElementById('spice-screen');
if(screen.requestFullscreen) {
screen.requestFullscreen();
} else if(screen.mozRequestFullScreen) {
screen.mozRequestFullScreen();
} else if(screen.webkitRequestFullscreen) {
screen.webkitRequestFullscreen();
} else if(screen.msRequestFullscreen) {
screen.msRequestFullscreen();
window.addEventListener('resize', SpiceHtml5.handle_resize);
if (sc) {
SpiceHtml5.resize_helper(sc);
}
}
/* SPICE port event listeners
@ -168,24 +146,53 @@
DEBUG > 0 && console.log('SPICE port', event.detail.channel.portName, 'message text:', msg_text);
});
window.addEventListener('spice-port-event', function(event) {
DEBUG > 0 && console.log('SPICE port', event.detail.channel.portName, 'event data:', event.detail.spiceEvent);
});
*/
function fullscreen() {
var screen = document.getElementById('spice-screen');
if (screen.requestFullscreen) {
screen.requestFullscreen();
} else if (screen.mozRequestFullScreen) {
screen.mozRequestFullScreen();
} else if (screen.webkitRequestFullscreen) {
screen.webkitRequestFullscreen();
} else if (screen.msRequestFullscreen) {
screen.msRequestFullscreen();
}
}
function sendctrlaltfn(f) {
SpiceHtml5.sendCtrlAltFN(sc, f);
return false;
}
/* SPICE port event listeners
window.addEventListener('spice-port-data', function(event) {
// Here we convert data to text, but really we can obtain binary data also
var msg_text = arraybuffer_to_str(new Uint8Array(event.detail.data));
DEBUG > 0 && console.log('SPICE port', event.detail.channel.portName, 'message text:', msg_text);
});
window.addEventListener('spice-port-event', function(event) {
DEBUG > 0 && console.log('SPICE port', event.detail.channel.portName, 'event data:', event.detail.spiceEvent);
});
*/
document.getElementById("fullscreen_button").addEventListener('click', fullscreen);
document.getElementById('ctrlaltdel').addEventListener('click', function(){sendCtrlAltDel(sc);});
document.getElementById('ctrlaltf1').addEventListener('click', function(){sendCtrlAltFN(0);});
document.getElementById('ctrlaltf2').addEventListener('click', function(){sendCtrlAltFN(1);});
document.getElementById('ctrlaltf3').addEventListener('click', function(){sendCtrlAltFN(2);});
document.getElementById('ctrlaltf4').addEventListener('click', function(){sendCtrlAltFN(3);});
document.getElementById('ctrlaltf5').addEventListener('click', function(){sendCtrlAltFN(4);});
document.getElementById('ctrlaltf6').addEventListener('click', function(){sendCtrlAltFN(5);});
document.getElementById('ctrlaltf7').addEventListener('click', function(){sendCtrlAltFN(6);});
document.getElementById('ctrlaltf8').addEventListener('click', function(){sendCtrlAltFN(7);});
document.getElementById('ctrlaltf9').addEventListener('click', function(){sendCtrlAltFN(8);});
document.getElementById('ctrlaltf10').addEventListener('click', function(){sendCtrlAltFN(9);});
document.getElementById('ctrlaltf11').addEventListener('click', function(){sendCtrlAltFN(10);});
document.getElementById('ctrlaltf12').addEventListener('click', function(){sendCtrlAltFN(11);});
document.getElementById('ctrlaltdel').addEventListener('click', function () { sendCtrlAltDel(sc); });
document.getElementById('ctrlaltf1').addEventListener('click', function () { sendctrlaltfn(0) });
document.getElementById('ctrlaltf2').addEventListener('click', function () { sendctrlaltfn(1) });
document.getElementById('ctrlaltf3').addEventListener('click', function () { sendctrlaltfn(2) });
document.getElementById('ctrlaltf4').addEventListener('click', function () { sendctrlaltfn(3) });
document.getElementById('ctrlaltf5').addEventListener('click', function () { sendctrlaltfn(4) });
document.getElementById('ctrlaltf6').addEventListener('click', function () { sendctrlaltfn(5) });
document.getElementById('ctrlaltf7').addEventListener('click', function () { sendctrlaltfn(6) });
document.getElementById('ctrlaltf8').addEventListener('click', function () { sendctrlaltfn(7) });
document.getElementById('ctrlaltf9').addEventListener('click', function () { sendctrlaltfn(8) });
document.getElementById('ctrlaltf10').addEventListener('click', function () { sendctrlaltfn(9) });
document.getElementById('ctrlaltf11').addEventListener('click', function () { sendctrlaltfn(10) });
document.getElementById('ctrlaltf12').addEventListener('click', function () { sendctrlaltfn(11) });
document.getElementById('connectButton').onclick = connect;
document.getElementById('show_console').onchange = toggle_console;
@ -193,27 +200,29 @@
{% endblock %}
{% block content %}
<div id="login">
<span class="logo">SPICE</span>
<label for="host">{% trans 'Host' %}:</label> <input type='text' id='host' value='{{ ws_host }}'> <!-- localhost -->
<label for="port">{% trans 'Port' %}:</label> <input type='text' id='port' value='{{ ws_port }}'>
<label for="password">{% trans 'Password' %}:</label> <input type='password' id='password' value='{{ console_passwd }}'>
<label for="show_console">{% trans 'Show console' %}</label><input type="checkbox" id="show_console" value="1" onchange="toggle_console()" checked>
<button id="connectButton">{% trans 'Start' %}</button>
</div>
<div id="login">
<span class="logo">SPICE</span>
<label for="host">{% trans 'Host' %}:</label> <input type='text' id='host' value='{{ ws_host }}'> <!-- localhost -->
<label for="port">{% trans 'Port' %}:</label> <input type='text' id='port' value='{{ ws_port }}'>
<label for="password">{% trans 'Password' %}:</label> <input type='password' id='password'
value='{{ console_passwd }}'>
<label for="show_console">{% trans 'Show console' %}</label><input type="checkbox" id="show_console" value="1"
onchange="toggle_console()" checked>
<button id="connectButton">{% trans 'Start' %}</button>
</div>
<div id="spice-area">
<div id="spice-screen" class="spice-screen"></div>
</div>
<div id="spice-area">
<div id="spice-screen" class="spice-screen"></div>
</div>
<div id="message-div" class="spice-message"></div>
<div id="message-div" class="spice-message"></div>
<div id="debug-div">
<div id="debug-div">
<!-- If DUMPXXX is turned on, dumped images will go here -->
</div>
</div>
{% endblock %}
{% block foot %}
{% endblock %}
{% endblock %}

View file

@ -27,198 +27,205 @@
{% load staticfiles %}
{% block head %}
<title>WebVirtCloud - Spice - Lite</title>
<link rel="stylesheet" type="text/css" href="{% static "js/spice-html5/spice.css" %}" />
<title>WebVirtCloud - Spice - Lite</title>
<link rel="stylesheet" type="text/css" href="{% static "js/spice-html5/spice.css" %}" />
<!-- ES2015/ES6 modules polyfill -->
<script type="module">
window._spice_has_module_support = true;
</script>
<script>
window.addEventListener("load", function() {
if (window._spice_has_module_support) return;
var loader = document.createElement("script");
loader.src = '{% static "thirdparty/browser-es-module-loader/dist/browser-es-module-loader.js" %}';
document.head.appendChild(loader);
});
</script>
<!-- ES2015/ES6 modules polyfill -->
<script type="module">
window._spice_has_module_support = true;
</script>
<script>
window.addEventListener("load", function () {
if (window._spice_has_module_support) return;
var loader = document.createElement("script");
loader.src = '{% static "thirdparty/browser-es-module-loader/dist/browser-es-module-loader.js" %}';
document.head.appendChild(loader);
});
</script>
<script type="module" crossorigin="anonymous">
import * as SpiceHtml5 from '{% static "js/spice-html5/main.js" %}';
<script type="module" crossorigin="anonymous">
import * as SpiceHtml5 from '{% static "js/spice-html5/main.js" %}';
var host = null, port = null;
var sc;
var host = null, port = null;
var sc;
function spice_set_cookie(name, value, days) {
var date, expires;
date = new Date();
date.setTime(date.getTime() + (days*24*60*60*1000));
expires = "; expires=" + date.toGMTString();
document.cookie = name + "=" + value + expires + "; path=/";
};
function spice_set_cookie(name, value, days) {
var date, expires;
date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toGMTString();
document.cookie = name + "=" + value + expires + "; path=/";
};
function spice_query_var(name, defvalue) {
var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
return match ? decodeURIComponent(match[1].replace(/\+/g, ' ')) : defvalue;
function spice_query_var(name, defvalue) {
var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
return match ? decodeURIComponent(match[1].replace(/\+/g, ' ')) : defvalue;
}
function spice_error(e) {
disconnect();
if (e !== undefined && e.message === "Permission denied.") {
var pass = prompt("Password");
connect(pass);
}
}
function connect(password) {
var host, port, scheme = "ws://", uri;
// By default, use the host and port of server that served this file
// host = spice_query_var('host', window.location.hostname);
host = '{{ ws_host| safe }}';
// Note that using the web server port only makes sense
// if your web server has a reverse proxy to relay the WebSocket
// traffic to the correct destination port.
var default_port = window.location.port;
if (!default_port) {
if (window.location.protocol == 'http:') {
default_port = 80;
}
else if (window.location.protocol == 'https:') {
default_port = 443;
}
}
//port = spice_query_var('port', default_port);
port = '{{ ws_port| safe }}';
if (window.location.protocol == 'https:') {
scheme = "wss://";
}
function spice_error(e) {
// If a token variable is passed in, set the parameter in a cookie.
// This is used by nova-spiceproxy.
var token = spice_query_var('token', null);
if (token) {
spice_set_cookie('token', token, 1)
}
if (password === undefined) {
password = spice_query_var('password', '');
password = '{{ console_passwd | safe }}';
}
if (password === 'None') password = '';
var path = spice_query_var('path', 'websockify');
if ((!host) || (!port)) {
console.log(_("must specify host and port in URL"));
return;
}
if (sc) {
sc.stop();
}
uri = scheme + host + ":" + port;
if (path) {
uri += path[0] == '/' ? path : ('/' + path);
}
try {
sc = new SpiceHtml5.SpiceMainConn({
uri: uri, screen_id: "spice-screen", dump_id: "debug-div",
message_id: "message-div", password: password, onerror: spice_error, onagent: agent_connected
});
}
catch (e) {
alert(e.toString());
disconnect();
if (e !== undefined && e.message === "Permission denied.") {
var pass = prompt("Password");
connect(pass);
}
}
function connect(password) {
var host, port, scheme = "ws://", uri;
// By default, use the host and port of server that served this file
// host = spice_query_var('host', window.location.hostname);
host = '{{ ws_host| safe }}';
// Note that using the web server port only makes sense
// if your web server has a reverse proxy to relay the WebSocket
// traffic to the correct destination port.
var default_port = window.location.port;
if (!default_port) {
if (window.location.protocol == 'http:') {
default_port = 80;
}
else if (window.location.protocol == 'https:') {
default_port = 443;
}
}
//port = spice_query_var('port', default_port);
port = '{{ ws_port| safe }}';
if (window.location.protocol == 'https:') {
scheme = "wss://";
}
// If a token variable is passed in, set the parameter in a cookie.
// This is used by nova-spiceproxy.
var token = spice_query_var('token', null);
if (token) {
spice_set_cookie('token', token, 1)
}
if (password === undefined) {
password = spice_query_var('password', '');
password = '{{ console_passwd | safe }}';
}
if (password === 'None') password = '';
var path = spice_query_var('path', 'websockify');
if ((!host) || (!port)) {
console.log(_("must specify host and port in URL"));
return;
}
if (sc) {
sc.stop();
}
uri = scheme + host + ":" + port;
if (path) {
uri += path[0] == '/' ? path : ('/' + path);
}
try {
sc = new SpiceHtml5.SpiceMainConn({uri: uri, screen_id: "spice-screen", dump_id: "debug-div",
message_id: "message-div", password: password, onerror: spice_error, onagent: agent_connected });
}
catch (e) {
alert(e.toString());
disconnect();
}
}
function disconnect() {
console.log(">> disconnect");
if (sc) {
sc.stop();
}
function disconnect() {
console.log(">> disconnect");
if (sc) {
sc.stop();
if (window.File && window.FileReader && window.FileList && window.Blob) {
var spice_xfer_area = document.getElementById('spice-xfer-area');
if (spice_xfer_area != null) {
document.getElementById('spice-area').removeChild(spice_xfer_area);
}
if (window.File && window.FileReader && window.FileList && window.Blob) {
var spice_xfer_area = document.getElementById('spice-xfer-area');
if (spice_xfer_area != null) {
document.getElementById('spice-area').removeChild(spice_xfer_area);
}
document.getElementById('spice-area').removeEventListener('dragover', SpiceHtml5.handle_file_dragover, false);
document.getElementById('spice-area').removeEventListener('drop', SpiceHtml5.handle_file_drop, false);
}
console.log("<< disconnect");
document.getElementById('spice-area').removeEventListener('dragover', SpiceHtml5.handle_file_dragover, false);
document.getElementById('spice-area').removeEventListener('drop', SpiceHtml5.handle_file_drop, false);
}
console.log("<< disconnect");
}
function agent_connected(sc) {
window.addEventListener('resize', SpiceHtml5.handle_resize);
window.spice_connection = this;
function agent_connected(sc) {
window.addEventListener('resize', SpiceHtml5.handle_resize);
window.spice_connection = this;
SpiceHtml5.resize_helper(this);
SpiceHtml5.resize_helper(this);
if (window.File && window.FileReader && window.FileList && window.Blob) {
var spice_xfer_area = document.createElement("div");
spice_xfer_area.setAttribute('id', 'spice-xfer-area');
document.getElementById('spice-area').appendChild(spice_xfer_area);
document.getElementById('spice-area').addEventListener('dragover', SpiceHtml5.handle_file_dragover, false);
document.getElementById('spice-area').addEventListener('drop', SpiceHtml5.handle_file_drop, false);
}
else {
console.log("File API is not supported");
}
if (window.File && window.FileReader && window.FileList && window.Blob) {
var spice_xfer_area = document.createElement("div");
spice_xfer_area.setAttribute('id', 'spice-xfer-area');
document.getElementById('spice-area').appendChild(spice_xfer_area);
document.getElementById('spice-area').addEventListener('dragover', SpiceHtml5.handle_file_dragover, false);
document.getElementById('spice-area').addEventListener('drop', SpiceHtml5.handle_file_drop, false);
}
function fullscreen() {
var screen=document.getElementById('spice-screen');
if(screen.requestFullscreen) {
screen.requestFullscreen();
} else if(screen.mozRequestFullScreen) {
screen.mozRequestFullScreen();
} else if(screen.webkitRequestFullscreen) {
screen.webkitRequestFullscreen();
} else if(screen.msRequestFullscreen) {
screen.msRequestFullscreen();
}
else {
console.log("File API is not supported");
}
}
/* SPICE port event listeners
window.addEventListener('spice-port-data', function(event) {
// Here we convert data to text, but really we can obtain binary data also
var msg_text = arraybuffer_to_str(new Uint8Array(event.detail.data));
DEBUG > 0 && console.log('SPICE port', event.detail.channel.portName, 'message text:', msg_text);
});
function fullscreen() {
var screen = document.getElementById('spice-screen');
if (screen.requestFullscreen) {
screen.requestFullscreen();
} else if (screen.mozRequestFullScreen) {
screen.mozRequestFullScreen();
} else if (screen.webkitRequestFullscreen) {
screen.webkitRequestFullscreen();
} else if (screen.msRequestFullscreen) {
screen.msRequestFullscreen();
}
}
window.addEventListener('spice-port-event', function(event) {
DEBUG > 0 && console.log('SPICE port', event.detail.channel.portName, 'event data:', event.detail.spiceEvent);
});
*/
document.getElementById("fullscreen_button").addEventListener('click', fullscreen);
document.getElementById('ctrlaltdel').addEventListener('click', function(){sendCtrlAltDel(sc);});
document.getElementById('ctrlaltf1').addEventListener('click', function(){sendCtrlAltFN(0);});
document.getElementById('ctrlaltf2').addEventListener('click', function(){sendCtrlAltFN(1);});
document.getElementById('ctrlaltf3').addEventListener('click', function(){sendCtrlAltFN(2);});
document.getElementById('ctrlaltf4').addEventListener('click', function(){sendCtrlAltFN(3);});
document.getElementById('ctrlaltf5').addEventListener('click', function(){sendCtrlAltFN(4);});
document.getElementById('ctrlaltf6').addEventListener('click', function(){sendCtrlAltFN(5);});
document.getElementById('ctrlaltf7').addEventListener('click', function(){sendCtrlAltFN(6);});
document.getElementById('ctrlaltf8').addEventListener('click', function(){sendCtrlAltFN(7);});
document.getElementById('ctrlaltf9').addEventListener('click', function(){sendCtrlAltFN(8);});
document.getElementById('ctrlaltf10').addEventListener('click', function(){sendCtrlAltFN(9);});
document.getElementById('ctrlaltf11').addEventListener('click', function(){sendCtrlAltFN(10);});
document.getElementById('ctrlaltf12').addEventListener('click', function(){sendCtrlAltFN(11);});
connect(undefined);
</script>
function sendctrlaltfn(f) {
SpiceHtml5.sendCtrlAltFN(sc, f);
return false;
}
/* SPICE port event listeners
window.addEventListener('spice-port-data', function(event) {
// Here we convert data to text, but really we can obtain binary data also
var msg_text = arraybuffer_to_str(new Uint8Array(event.detail.data));
DEBUG > 0 && console.log('SPICE port', event.detail.channel.portName, 'message text:', msg_text);
});
window.addEventListener('spice-port-event', function(event) {
DEBUG > 0 && console.log('SPICE port', event.detail.channel.portName, 'event data:', event.detail.spiceEvent);
});
*/
document.getElementById("fullscreen_button").addEventListener('click', fullscreen);
document.getElementById('ctrlaltdel').addEventListener('click', function () { sendCtrlAltDel(sc); });
document.getElementById('ctrlaltf1').addEventListener('click', function () { sendctrlaltfn(0) });
document.getElementById('ctrlaltf2').addEventListener('click', function () { sendctrlaltfn(1) });
document.getElementById('ctrlaltf3').addEventListener('click', function () { sendctrlaltfn(2) });
document.getElementById('ctrlaltf4').addEventListener('click', function () { sendctrlaltfn(3) });
document.getElementById('ctrlaltf5').addEventListener('click', function () { sendctrlaltfn(4) });
document.getElementById('ctrlaltf6').addEventListener('click', function () { sendctrlaltfn(5) });
document.getElementById('ctrlaltf7').addEventListener('click', function () { sendctrlaltfn(6) });
document.getElementById('ctrlaltf8').addEventListener('click', function () { sendctrlaltfn(7) });
document.getElementById('ctrlaltf9').addEventListener('click', function () { sendctrlaltfn(8) });
document.getElementById('ctrlaltf10').addEventListener('click', function () { sendctrlaltfn(9) });
document.getElementById('ctrlaltf11').addEventListener('click', function () { sendctrlaltfn(10) });
document.getElementById('ctrlaltf12').addEventListener('click', function () { sendctrlaltfn(11) });
connect(undefined);
</script>
{% endblock %}
{% block content %}
<div id="spice-area">
<div id="spice-screen" class="spice-screen"></div>
</div>
<div id="spice-area">
<div id="spice-screen" class="spice-screen"></div>
</div>
<div id="message-div" class="spice-message"></div>
<div id="message-div" class="spice-message"></div>
<div id="debug-div">
<!-- If DUMPXXX is turned on, dumped images will go here -->
</div>
{% endblock %}
<div id="debug-div">
<!-- If DUMPXXX is turned on, dumped images will go here -->
</div>
{% endblock %}

View file

@ -3,306 +3,228 @@
{% load staticfiles %}
{% block head %}
<!--
<!--
noVNC example: lightweight example using minimal UI and features
Copyright (C) 2012 Joel Martin
Copyright (C) 2017 Samuel Mannehed for Cendio AB
This is a self-contained file which doesn't import WebUtil or external CSS.
Copyright (C) 2019 The noVNC Authors
noVNC is licensed under the MPL 2.0 (see LICENSE.txt)
This file is licensed under the 2-Clause BSD license (see LICENSE.txt).
Connect parameters are provided in query string:
http://example.com/?host=HOST&port=PORT&encrypt=1
or the fragment:
http://example.com/#host=HOST&port=PORT&encrypt=1
-->
<title>WebVirtCloud - noVNC - Lite</title>
http://example.com/?host=HOST&port=PORT&scale=true
-->
<title>WebVirtCloud - noVNC - Lite</title>
<meta charset="utf-8">
<meta charset="utf-8">
<!-- Always force latest IE rendering engine (even in intranet) & Chrome Frame
Remove this if you use the .htaccess -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- Always force latest IE rendering engine (even in intranet) &
Chrome Frame. Remove this if you use the .htaccess -->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Icons (see Makefile for what the sizes are for) -->
<link rel="icon" sizes="16x16" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-16x16.png" %}">
<link rel="icon" sizes="24x24" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-24x24.png" %}">
<link rel="icon" sizes="32x32" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-32x32.png" %}">
<link rel="icon" sizes="48x48" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-48x48.png" %}">
<link rel="icon" sizes="60x60" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-60x60.png" %}">
<link rel="icon" sizes="64x64" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-64x64.png" %}">
<link rel="icon" sizes="72x72" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-72x72.png" %}">
<link rel="icon" sizes="76x76" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-76x76.png" %}">
<link rel="icon" sizes="96x96" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-96x96.png" %}">
<link rel="icon" sizes="120x120" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-120x120.png" %}">
<link rel="icon" sizes="144x144" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-144x144.png" %}">
<link rel="icon" sizes="152x152" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-152x152.png" %}">
<link rel="icon" sizes="192x192" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-192x192.png" %}">
<!-- Firefox currently mishandles SVG, see #1419039
<link rel="icon" sizes="any" type="image/svg+xml" href="{% static "js/novnc/app/images/icons/novnc-icon.svg" %}">
-->
<!-- Repeated last so that legacy handling will pick this -->
<link rel="icon" sizes="16x16" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-16x16.png" %}">
<!-- Stylesheets -->
<link rel="stylesheet" href='{% static "js/novnc/app/styles/lite.css" %}'>
<!-- 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" />
<!-- Home Screen Icons (favourites and bookmarks use the normal icons) -->
<link rel="apple-touch-icon" sizes="60x60" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-60x60.png" %}">
<link rel="apple-touch-icon" sizes="76x76" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-76x76.png" %}">
<link rel="apple-touch-icon" sizes="120x120" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-120x120.png" %}">
<link rel="apple-touch-icon" sizes="152x152" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-152x152.png" %}">
<!-- Promise polyfill for IE11 -->
<script src="{% static 'js/novnc/vendor/promise.js' %}"></script>
<!-- Stylesheets -->
<link rel="stylesheet" href="{% static "js/novnc/app/styles/lite.css" %}">
<!-- ES2015/ES6 modules polyfill -->
<script nomodule
src="{% static 'js/novnc/vendor/browser-es-module-loader/dist/browser-es-module-loader.js' %}"></script>
<!--
<script type='text/javascript'
src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script>
-->
<!-- actual script modules -->
<script type="module" crossorigin="anonymous">
// RFB holds the API to connect and communicate with a VNC server
import RFB from '{% static "js/novnc/core/rfb.js" %}';
<!-- promise polyfills promises for IE11 -->
<script src="{% static "js/novnc/vendor/promise.js" %}"></script>
<!-- ES2015/ES6 modules polyfill -->
<script type="module"> window._noVNC_has_module_support = true;</script>
<script>
window.addEventListener("load", function() {
if (window._noVNC_has_module_support) return;
var loader = document.createElement("script");
loader.src = "{% static "js/novnc/vendor/browser-es-module-loader/dist/browser-es-module-loader.js" %}";
document.head.appendChild(loader);
});
</script>
let rfb;
let desktopName;
<!-- actual script modules -->
<script type="module" crossorigin="anonymous">
// Load supporting scripts
import * as WebUtil from '{% static "js/novnc/app/webutil.js" %}';
import RFB from '{% static "js/novnc/core/rfb.js" %}';
// When this function is called we have
// successfully connected to a server
function connectedToServer(e) {
status("Connected to " + desktopName);
}
var rfb;
var desktopName;
function updateDesktopName(e) {
desktopName = e.detail.name;
// This function is called when we are disconnected
function disconnectedFromServer(e) {
if (e.detail.clean) {
status("Disconnected");
} else {
status("Something went wrong, connection is closed");
}
function credentials(e) {
var html;
}
var form = document.createElement('form');
form.innerHTML = '<label></label>';
form.innerHTML += '<input type=password size=10 id="password_input">';
form.onsubmit = setPassword;
// When this function is called, the server requires
// credentials to authenticate
function credentialsAreRequired(e) {
const password = prompt("Password Required:");
rfb.sendCredentials({ password: password });
}
// bypass status() because it sets text content
document.getElementById('noVNC_status_bar').setAttribute("class", "noVNC_status_warn");
document.getElementById('noVNC_status').innerHTML = '';
document.getElementById('noVNC_status').appendChild(form);
document.getElementById('noVNC_status').querySelector('label').textContent = 'Password Required: ';
}
function setPassword() {
rfb.sendCredentials({ password: document.getElementById('password_input').value });
return false;
}
function fullscreen() {
if (document.fullscreenElement || // alternative standard method
document.mozFullScreenElement || // currently working methods
document.webkitFullscreenElement ||
document.msFullscreenElement) {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
}
} else {
if (document.documentElement.requestFullscreen) {
document.documentElement.requestFullscreen();
} else if (document.documentElement.mozRequestFullScreen) {
document.documentElement.mozRequestFullScreen();
} else if (document.documentElement.webkitRequestFullscreen) {
document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
} else if (document.body.msRequestFullscreen) {
document.body.msRequestFullscreen();
}
// When this function is called we have received
// a desktop name from the server
function updateDesktopName(e) {
desktopName = e.detail.name;
}
// Since most operating systems will catch Ctrl+Alt+Del
// before they get a chance to be intercepted by the browser,
// we provide a way to emulate this key sequence.
function sendCtrlAltDel() {
rfb.sendCtrlAltDel();
return false;
}
function fullscreen() {
if (document.fullscreenElement || // alternative standard method
document.mozFullScreenElement || // currently working methods
document.webkitFullscreenElement ||
document.msFullscreenElement) {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
}
return false;
}
function sendCtrlAltFN(f) {
rfb.sendCtrlAltFN(f);
return false;
}
function sendCtrlAltDel() {
rfb.sendCtrlAltDel();
return false;
}
function machineShutdown() {
rfb.machineShutdown();
return false;
}
function machineReboot() {
rfb.machineReboot();
return false;
}
function machineReset() {
rfb.machineReset();
return false;
}
function status(text, level) {
switch (level) {
case 'normal':
case 'warn':
case 'error':
break;
default:
level = "warn";
}
document.getElementById('noVNC_status_bar').className = "noVNC_status_" + level;
document.getElementById('noVNC_status').textContent = text;
}
function connected(e) {
document.getElementById('sendCtrlAltDelButton').disabled = false;
if (WebUtil.getConfigVar('encrypt', (window.location.protocol === "https:"))) {
status("Connected (encrypted) to " + desktopName, "normal");
} else {
status("Connected (unencrypted) to " + desktopName, "normal");
} else {
if (document.documentElement.requestFullscreen) {
document.documentElement.requestFullscreen();
} else if (document.documentElement.mozRequestFullScreen) {
document.documentElement.mozRequestFullScreen();
} else if (document.documentElement.webkitRequestFullscreen) {
document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
} else if (document.body.msRequestFullscreen) {
document.body.msRequestFullscreen();
}
}
return false;
}
function sendCtrlAltFN(f) {
rfb.sendCtrlAltFN(f);
return false;
}
function machineShutdown() {
rfb.machineShutdown();
return false;
}
function machineReboot() {
rfb.machineReboot();
return false;
}
function machineReset() {
rfb.machineReset();
return false;
}
function disconnected(e) {
document.getElementById('sendCtrlAltDelButton').disabled = true;
updatePowerButtons();
if (e.detail.clean) {
status("Disconnected", "normal");
} else {
status("Something went wrong, connection is closed", "error");
}
// Show a status text in the top bar
function status(text) {
document.getElementById('noVNC_status').textContent = text;
}
// This function extracts the value of one variable from the
// query string. If the variable isn't defined in the URL
// it returns the default value instead.
function readQueryVariable(name, defaultValue) {
// A URL with a query parameter can look like this:
// https://www.example.com?myqueryparam=myvalue
//
// Note that we use location.href instead of location.search
// because Firefox < 53 has a bug w.r.t location.search
const re = new RegExp('.*[?&]' + name + '=([^&#]*)'),
match = document.location.href.match(re);
if (match) {
// We have to decode the URL since want the cleartext value
return decodeURIComponent(match[1]);
}
function updatePowerButtons() {
var powerbuttons;
powerbuttons = document.getElementById('noVNC_power_buttons');
if (rfb.capabilities.power) {
powerbuttons.className= "noVNC_shown";
} else {
powerbuttons.className = "noVNC_hidden";
}
}
return defaultValue;
}
document.getElementById('sendCtrlAltDelButton').onclick = sendCtrlAltDel;
document.getElementById('machineShutdownButton').onclick = machineShutdown;
document.getElementById('machineRebootButton').onclick = machineReboot;
document.getElementById('machineResetButton').onclick = machineReset;
document.getElementById('fullscreen_button').onclick = fullscreen;
document.getElementById('sendCtrlAltDelButton').onclick = sendCtrlAltDel;
document.getElementById('machineShutdownButton').onclick = machineShutdown;
document.getElementById('machineRebootButton').onclick = machineReboot;
document.getElementById('machineResetButton').onclick = machineReset;
document.getElementById('fullscreen_button').onclick = fullscreen;
document.getElementById('ctrlaltdel').addEventListener('click', sendCtrlAltDel);
document.getElementById('ctrlaltf1').addEventListener('click', function(){sendCtrlAltFN(0);});
document.getElementById('ctrlaltf2').addEventListener('click', function(){sendCtrlAltFN(1);});
document.getElementById('ctrlaltf3').addEventListener('click', function(){sendCtrlAltFN(2);});
document.getElementById('ctrlaltf4').addEventListener('click', function(){sendCtrlAltFN(3);});
document.getElementById('ctrlaltf5').addEventListener('click', function(){sendCtrlAltFN(4);});
document.getElementById('ctrlaltf6').addEventListener('click', function(){sendCtrlAltFN(5);});
document.getElementById('ctrlaltf7').addEventListener('click', function(){sendCtrlAltFN(6);});
document.getElementById('ctrlaltf8').addEventListener('click', function(){sendCtrlAltFN(7);});
document.getElementById('ctrlaltf9').addEventListener('click', function(){sendCtrlAltFN(8);});
document.getElementById('ctrlaltf10').addEventListener('click', function(){sendCtrlAltFN(9);});
document.getElementById('ctrlaltf11').addEventListener('click', function(){sendCtrlAltFN(10);});
document.getElementById('ctrlaltf12').addEventListener('click', function(){sendCtrlAltFN(11);});
document.getElementById('ctrlaltdel').addEventListener('click', sendCtrlAltDel);
document.getElementById('ctrlaltf1').addEventListener('click', function () { sendCtrlAltFN(0); });
document.getElementById('ctrlaltf2').addEventListener('click', function () { sendCtrlAltFN(1); });
document.getElementById('ctrlaltf3').addEventListener('click', function () { sendCtrlAltFN(2); });
document.getElementById('ctrlaltf4').addEventListener('click', function () { sendCtrlAltFN(3); });
document.getElementById('ctrlaltf5').addEventListener('click', function () { sendCtrlAltFN(4); });
document.getElementById('ctrlaltf6').addEventListener('click', function () { sendCtrlAltFN(5); });
document.getElementById('ctrlaltf7').addEventListener('click', function () { sendCtrlAltFN(6); });
document.getElementById('ctrlaltf8').addEventListener('click', function () { sendCtrlAltFN(7); });
document.getElementById('ctrlaltf9').addEventListener('click', function () { sendCtrlAltFN(8); });
document.getElementById('ctrlaltf10').addEventListener('click', function () { sendCtrlAltFN(9); });
document.getElementById('ctrlaltf11').addEventListener('click', function () { sendCtrlAltFN(10); });
document.getElementById('ctrlaltf12').addEventListener('click', function () { sendCtrlAltFN(11); });
WebUtil.init_logging(WebUtil.getConfigVar('logging', 'warn'));
document.title = WebUtil.getConfigVar('title', 'noVNC');
// By default, use the host and port of server that served this file
//var host = WebUtil.getConfigVar('host', window.location.hostname);
//var port = WebUtil.getConfigVar('port', window.location.port);
var host = '{{ ws_host }}';
var port = '{{ ws_port }}';
// Read parameters specified in the URL query string
// By default, use the host and port of server that served this file
const host = readQueryVariable('host', '{{ ws_host }}');
let port = readQueryVariable('port', '{{ ws_port }}');
const password = readQueryVariable('password');
const path = readQueryVariable('path', 'websockify');
// 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;
}
}
//var password = WebUtil.getConfigVar('password', '');
var password = '{{ console_passwd }}';
// | | | | | |
// | | | Connect | | |
// v v v v v v
var path = WebUtil.getConfigVar('path', 'websockify');
status("Connecting");
// If a token variable is passed in, set the parameter in a cookie.
// This is used by nova-novncproxy.
var token = WebUtil.getConfigVar('token', null);
if (token) {
// if token is already present in the path we should use it
path = WebUtil.injectParamIfMissing(path, "token", token);
// Build the websocket URL used to connect
let url;
if (window.location.protocol === "https:") {
url = 'wss';
} else {
url = 'ws';
}
url += '://' + host;
if (port) {
url += ':' + port;
}
url += '/' + path;
WebUtil.createCookie('token', token, 1)
}
// Creating a new RFB object will start a new connection
rfb = new RFB(document.getElementById('noVNC_container'), url,
{ credentials: { password: password } });
(function() {
// Add listeners to important events from the RFB module
rfb.addEventListener("connect", connectedToServer);
rfb.addEventListener("disconnect", disconnectedFromServer);
rfb.addEventListener("credentialsrequired", credentialsAreRequired);
rfb.addEventListener("desktopname", updateDesktopName);
rfb.addEventListener("capabilities", function () { updatePowerButtons(); });
status("Connecting", "normal");
// Set parameters that can be changed on an active connection
rfb.viewOnly = readQueryVariable('view_only', {{ view_only }});
rfb.scaleViewport = readQueryVariable('scale', {{ scale }});
rfb.resizeSession = readQueryVariable('resize', {{ resize_session }});
rfb.clipViewport = readQueryVariable('clip_viewport', {{ clip_viewport }});
if ((!host) || (!port)) {
status('Must specify host and port in URL', 'error');
}
var url;
if (WebUtil.getConfigVar('encrypt', (window.location.protocol === "https:"))) {
url = 'wss';
} else {
url = 'ws';
}
url += '://' + host;
if(port) {
url += ':' + port;
}
url += '/' + path;
//rfb = new RFB(document.body, url,
// { repeaterID: WebUtil.getConfigVar('repeaterID', ''),
// shared: WebUtil.getConfigVar('shared', true),
// credentials: { password: password } });
rfb = new RFB(document.getElementById('noVNC_container'), url,
{ repeaterID: WebUtil.getConfigVar('repeaterID', ''),
shared: WebUtil.getConfigVar('shared', true),
credentials: { password: password } });
rfb.viewOnly = WebUtil.getConfigVar('view_only', false);
rfb.addEventListener("connect", connected);
rfb.addEventListener("disconnect", disconnected);
rfb.addEventListener("capabilities", function () { updatePowerButtons(); });
rfb.addEventListener("credentialsrequired", credentials);
rfb.addEventListener("desktopname", updateDesktopName);
rfb.scaleViewport = WebUtil.getConfigVar('scale', false);
rfb.resizeSession = WebUtil.getConfigVar('resize', false);
})();
</script>
</script>
{% endblock %}
{% block content %}
<div id="noVNC_status_bar">
<div id="noVNC_left_dummy_elem"></div>
<div id="noVNC_status">{% trans 'Loading' %}</div>
<div id="noVNC_buttons">
<input type="button" value="Send CtrlAltDel" id="sendCtrlAltDelButton" class="noVNC_shown">
<span id="noVNC_power_buttons" class="noVNC_hidden">
<input type=button value="Shutdown" id="machineShutdownButton">
<input type=button value="Reboot" id="machineRebootButton">
<input type=button value="Reset" id="machineResetButton">
</span>
</div>
<div id="noVNC_status_bar">
<div id="noVNC_left_dummy_elem"></div>
<div id="noVNC_status">{% trans 'Loading' %}</div>
<div id="noVNC_buttons">
<input type="button" value="Send CtrlAltDel" id="sendCtrlAltDelButton" class="noVNC_shown">
<span id="noVNC_power_buttons" class="noVNC_hidden">
<input type="button" value="Shutdown" id="machineShutdownButton">
<input type="button" value="Reboot" id="machineRebootButton">
<input type="button" value="Reset" id="machineResetButton">
</span>
</div>
<div id='noVNC_container'></div>
{% endblock %}
</div>
<div id="noVNC_container">
<!-- This is where the remote screen will appear -->
</div>
{% endblock %}