1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2024-11-01 03:54:15 +00:00

wsproxy patch

This commit is contained in:
catborise 2020-06-26 16:31:41 +03:00
parent 6c79c2bace
commit c0f707854a
10 changed files with 295 additions and 281 deletions

View file

@ -1,11 +1,28 @@
FROM phusion/baseimage:0.11 FROM phusion/baseimage:18.04-1.0.0
EXPOSE 80
EXPOSE 6080
# Use baseimage-docker's init system.
CMD ["/sbin/my_init"]
RUN echo 'APT::Get::Clean=always;' >> /etc/apt/apt.conf.d/99AutomaticClean RUN echo 'APT::Get::Clean=always;' >> /etc/apt/apt.conf.d/99AutomaticClean
RUN apt-get update -qqy RUN apt-get update -qqy
RUN DEBIAN_FRONTEND=noninteractive apt-get -qyy install \ RUN DEBIAN_FRONTEND=noninteractive apt-get -qyy install \
-o APT::Install-Suggests=false \ -o APT::Install-Suggests=false \
git python3-virtualenv python3-dev python3-lxml virtualenv libvirt-dev zlib1g-dev nginx libsasl2-modules git \
python3-virtualenv \
python3-dev \
python3-lxml \
virtualenv \
libvirt-dev \
zlib1g-dev \
nginx \
libsasl2-modules
RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
ADD . /srv/webvirtcloud ADD . /srv/webvirtcloud
RUN chown -R www-data:www-data /srv/webvirtcloud RUN chown -R www-data:www-data /srv/webvirtcloud
@ -39,11 +56,7 @@ ADD conf/runit/nginx-log-forwarder /etc/service/nginx-log-forwarder/run
ADD conf/runit/novncd.sh /etc/service/novnc/run ADD conf/runit/novncd.sh /etc/service/novnc/run
ADD conf/runit/webvirtcloud.sh /etc/service/webvirtcloud/run ADD conf/runit/webvirtcloud.sh /etc/service/webvirtcloud/run
EXPOSE 80
EXPOSE 6080
# Define mountable directories. # Define mountable directories.
#VOLUME [] #VOLUME []
# Use baseimage-docker's init system. WORKDIR /srv/webvirtcloud
CMD ["/sbin/my_init"]

View file

@ -300,6 +300,12 @@ datasource:
metadata_urls: [ "http://webvirtcloud.domain.com/datasource" ] metadata_urls: [ "http://webvirtcloud.domain.com/datasource" ]
``` ```
### Reverse-Proxy
Edit WS_PUBLIC_PORT at settings.py file to expose redirect to 80. Default: 6080
```
WS_PUBLIC_PORT = 80
```
### How To Update ### How To Update
```bash ```bash
# Go to Installation Directory # Go to Installation Directory

View file

@ -15,9 +15,21 @@ server {
proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header Host $host:$server_port; proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-Proto $remote_addr; proxy_set_header X-Forwarded-Proto $remote_addr;
proxy_set_header X-Forwarded-Ssl off;
proxy_connect_timeout 600; proxy_connect_timeout 600;
proxy_read_timeout 600; proxy_read_timeout 600;
proxy_send_timeout 600; proxy_send_timeout 600;
client_max_body_size 1024M; client_max_body_size 1024M;
} }
location /novncd/ {
proxy_pass http://wsnovncd;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
} }
upstream wsnovncd {
server 127.0.0.1:6080;
}

View file

@ -31,17 +31,8 @@
<link rel="stylesheet" type="text/css" href="{% static "js/spice-html5/spice.css" %}" /> <link rel="stylesheet" type="text/css" href="{% static "js/spice-html5/spice.css" %}" />
<!-- ES2015/ES6 modules polyfill --> <!-- ES2015/ES6 modules polyfill -->
<script type="module"> <script nomodule src='{% static "thirdparty/browser-es-module-loader/dist/browser-es-module-loader.js" %}'></script>
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">
@ -70,7 +61,8 @@
sc.stop(); sc.stop();
} }
uri = scheme + host + ":" + port; // uri = scheme + host + ":" + port;
uri = scheme + "{{ ws_host }}:{{ ws_port }}{{ ws_path }}";
document.getElementById('connectButton').innerHTML = "Stop"; document.getElementById('connectButton').innerHTML = "Stop";
document.getElementById('connectButton').onclick = disconnect; document.getElementById('connectButton').onclick = disconnect;

View file

@ -31,17 +31,7 @@
<link rel="stylesheet" type="text/css" href="{% static "js/spice-html5/spice.css" %}" /> <link rel="stylesheet" type="text/css" href="{% static "js/spice-html5/spice.css" %}" />
<!-- ES2015/ES6 modules polyfill --> <!-- ES2015/ES6 modules polyfill -->
<script type="module"> <script nomodule src='{% static "thirdparty/browser-es-module-loader/dist/browser-es-module-loader.js" %}'></script>
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" %}';
@ -65,7 +55,7 @@
function spice_error(e) { function spice_error(e) {
disconnect(); disconnect();
if (e !== undefined && e.message === "Permission denied.") { if (e !== undefined && e.message === "Permission denied.") {
var pass = prompt("Password"); var pass = prompt('{% trans "Password" %}');
connect(pass); connect(pass);
} }
} }
@ -108,7 +98,8 @@
} }
if (password === 'None') password = ''; if (password === 'None') password = '';
var path = spice_query_var('path', 'websockify'); //var path = spice_query_var('path', 'websockify');
var path = spice_query_var('path', '{{ ws_path }}');
if ((!host) || (!port)) { if ((!host) || (!port)) {
console.log('{% trans "must specify host and port in URL" %}'); console.log('{% trans "must specify host and port in URL" %}');
@ -119,7 +110,8 @@
sc.stop(); sc.stop();
} }
uri = scheme + host + ":" + port; // uri = scheme + host + ":" + port;
uri = scheme + "{{ ws_host }}:{{ ws_port }}{{ ws_path }}";
if (path) { if (path) {
uri += path[0] == '/' ? path : ('/' + path); uri += path[0] == '/' ? path : ('/' + path);

View file

@ -3,7 +3,7 @@
{% load staticfiles %} {% load staticfiles %}
{% block head %} {% block head %}
<!-- <!--
noVNC example: simple example using default UI noVNC example: simple example using default UI
Copyright (C) 2018 The noVNC Authors Copyright (C) 2018 The noVNC Authors
noVNC is licensed under the MPL 2.0 (see LICENSE.txt) noVNC is licensed under the MPL 2.0 (see LICENSE.txt)
@ -13,323 +13,321 @@
or the fragment: or the fragment:
http://example.com/#host=HOST&port=PORT&encrypt=1 http://example.com/#host=HOST&port=PORT&encrypt=1
--> -->
<title>WebVirtCloud - noVNC</title> <title>WebVirtCloud - noVNC</title>
<meta charset="utf-8" /> <meta charset="utf-8" />
<!-- Icons (see Makefile for what the sizes are for) --> <!-- 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="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="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="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="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="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="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="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="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="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="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="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="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" %}"> <link rel="icon" sizes="192x192" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-192x192.png" %}">
<!-- Firefox currently mishandles SVG, see #1419039 <!-- 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" %}"> <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 --> <!-- 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" %}"> <link rel="icon" sizes="16x16" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-16x16.png" %}">
<!-- Apple iOS Safari settings --> <!-- Apple iOS Safari settings -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> <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-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<!-- Home Screen Icons (favourites and bookmarks use the normal icons) --> <!-- 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="60x60" type="image/png"
<link rel="apple-touch-icon" sizes="76x76" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-76x76.png" %}"> href="{% static "js/novnc/app/images/icons/novnc-60x60.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="76x76" type="image/png"
<link rel="apple-touch-icon" sizes="152x152" type="image/png" href="{% static "js/novnc/app/images/icons/novnc-152x152.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" %}">
<!-- Stylesheets --> <!-- Stylesheets -->
<link rel="stylesheet" href="{% static "js/novnc/app/styles/base.css" %}"/> <link rel="stylesheet" href="{% static "js/novnc/app/styles/base.css" %}" />
<!-- <!--
<script type='text/javascript' src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script> <script type='text/javascript' src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script>
--> -->
<!-- this is included as a normal file in order to catch script-loading errors as well --> <!-- this is included as a normal file in order to catch script-loading errors as well -->
<script type="text/javascript" src="{% static "js/novnc/app/error-handler.js" %}"></script> <script type="text/javascript" src="{% static "js/novnc/app/error-handler.js" %}"></script>
<!-- begin scripts --> <!-- begin scripts -->
<!-- promise polyfills promises for IE11 --> <!-- promise polyfills promises for IE11 -->
<script src="{% static "js/novnc/vendor/promise.js" %}"></script> <script src="{% static "js/novnc/vendor/promise.js" %}"></script>
<!-- ES2015/ES6 modules polyfill --> <!-- ES2015/ES6 modules polyfill -->
<script type="module"> <script nomodule
window._noVNC_has_module_support = true; src='{% static "js/novnc/vendor/browser-es-module-loader/dist/browser-es-module-loader.js" %}'></script>
</script> <!-- actual script modules -->
<script> <script type="module" crossorigin="anonymous" src="{% static "js/novnc/app/ui.js" %}"></script>
window.addEventListener("load", function() { <!-- end scripts -->
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>
<!-- actual script modules -->
<script type="module" crossorigin="anonymous" src="{% static "js/novnc/app/ui.js" %}"></script>
<!-- end scripts -->
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<div id="noVNC_fallback_error" class="noVNC_center"> <div id="noVNC_fallback_error" class="noVNC_center">
<div> <div>
<div>{% trans 'noVNC encountered an error' %}:</div> <div>{% trans 'noVNC encountered an error' %}:</div>
<br> <br>
<div id="noVNC_fallback_errormsg"></div> <div id="noVNC_fallback_errormsg"></div>
</div>
</div> </div>
</div>
<!-- noVNC Control Bar --> <!-- noVNC Control Bar -->
<div id="noVNC_control_bar_anchor" class="noVNC_vcenter"> <div id="noVNC_control_bar_anchor" class="noVNC_vcenter">
<div id="noVNC_control_bar"> <div id="noVNC_control_bar">
<div id="noVNC_control_bar_handle" title="Hide/Show the control bar"><div></div></div> <div id="noVNC_control_bar_handle" title="Hide/Show the control bar">
<div></div>
</div>
<div class="noVNC_scroll"> <div class="noVNC_scroll">
<h1 class="noVNC_logo" translate="no"><span>no</span><br/>VNC</h1> <h1 class="noVNC_logo" translate="no"><span>no</span><br />VNC</h1>
<!-- Drag/Pan the viewport --> <!-- Drag/Pan the viewport -->
<input type="image" alt="viewport drag" src="{% static "js/novnc/app/images/drag.svg" %}" <input type="image" alt="viewport drag" src="{% static "js/novnc/app/images/drag.svg" %}"
id="noVNC_view_drag_button" class="noVNC_button noVNC_hidden" id="noVNC_view_drag_button" class="noVNC_button noVNC_hidden" title="Move/Drag Viewport" />
title="Move/Drag Viewport" />
<!--noVNC Touch Device only buttons--> <!--noVNC Touch Device only buttons-->
<div id="noVNC_mobile_buttons"> <div id="noVNC_mobile_buttons">
<input type="image" alt="No mousebutton" src="{% static "js/novnc/app/images/mouse_none.svg" %}" <input type="image" alt="No mousebutton" src="{% static "js/novnc/app/images/mouse_none.svg" %}"
id="noVNC_mouse_button0" class="noVNC_button" id="noVNC_mouse_button0" class="noVNC_button" title="Active Mouse Button" />
title="Active Mouse Button"/>
<input type="image" alt="Left mousebutton" src="{% static "js/novnc/app/images/mouse_left.svg" %}" <input type="image" alt="Left mousebutton" src="{% static "js/novnc/app/images/mouse_left.svg" %}"
id="noVNC_mouse_button1" class="noVNC_button" id="noVNC_mouse_button1" class="noVNC_button" title="Active Mouse Button" />
title="Active Mouse Button"/>
<input type="image" alt="Middle mousebutton" src="{% static "js/novnc/app/images/mouse_middle.svg" %}" <input type="image" alt="Middle mousebutton" src="{% static "js/novnc/app/images/mouse_middle.svg" %}"
id="noVNC_mouse_button2" class="noVNC_button" id="noVNC_mouse_button2" class="noVNC_button" title="Active Mouse Button" />
title="Active Mouse Button"/>
<input type="image" alt="Right mousebutton" src="{% static "js/novnc/app/images/mouse_right.svg" %}" <input type="image" alt="Right mousebutton" src="{% static "js/novnc/app/images/mouse_right.svg" %}"
id="noVNC_mouse_button4" class="noVNC_button" id="noVNC_mouse_button4" class="noVNC_button" title="Active Mouse Button" />
title="Active Mouse Button"/>
<input type="image" alt="Keyboard" src="{% static "js/novnc/app/images/keyboard.svg" %}" <input type="image" alt="Keyboard" src="{% static "js/novnc/app/images/keyboard.svg" %}"
id="noVNC_keyboard_button" class="noVNC_button" id="noVNC_keyboard_button" class="noVNC_button" value="Keyboard" title="Show Keyboard" />
value="Keyboard" title="Show Keyboard" />
</div> </div>
<!-- Extra manual keys --> <!-- Extra manual keys -->
<div id="noVNC_extra_keys"> <div id="noVNC_extra_keys">
<input type="image" alt="Extra keys" src="{% static "js/novnc/app/images/toggleextrakeys.svg" %}" <input type="image" alt="Extra keys" src="{% static "js/novnc/app/images/toggleextrakeys.svg" %}"
id="noVNC_toggle_extra_keys_button" class="noVNC_button" id="noVNC_toggle_extra_keys_button" class="noVNC_button" title="Show Extra Keys" />
title="Show Extra Keys"/>
<div class="noVNC_vcenter"> <div class="noVNC_vcenter">
<div id="noVNC_modifiers" class="noVNC_panel"> <div id="noVNC_modifiers" class="noVNC_panel">
<input type="image" alt="Ctrl" src="{% static "js/novnc/app/images/ctrl.svg" %}" <input type="image" alt="Ctrl" src="{% static "js/novnc/app/images/ctrl.svg" %}"
id="noVNC_toggle_ctrl_button" class="noVNC_button" id="noVNC_toggle_ctrl_button" class="noVNC_button" title="Toggle Ctrl" />
title="Toggle Ctrl"/> <input type="image" alt="Alt" src="{% static "js/novnc/app/images/alt.svg" %}"
<input type="image" alt="Alt" src="{% static "js/novnc/app/images/alt.svg" %}" id="noVNC_toggle_alt_button" class="noVNC_button" title="Toggle Alt" />
id="noVNC_toggle_alt_button" class="noVNC_button" <input type="image" alt="Windows" src="{% static "js/novnc/app/images/windows.svg" %}"
title="Toggle Alt"/> id="noVNC_toggle_windows_button" class="noVNC_button" title="Toggle Windows">
<input type="image" alt="Windows" src="{% static "js/novnc/app/images/windows.svg" %}" <input type="image" alt="Tab" src="{% static "js/novnc/app/images/tab.svg" %}"
id="noVNC_toggle_windows_button" class="noVNC_button" id="noVNC_send_tab_button" class="noVNC_button" title="Send Tab" />
title="Toggle Windows"> <input type="image" alt="Esc" src="{% static "js/novnc/app/images/esc.svg" %}"
<input type="image" alt="Tab" src="{% static "js/novnc/app/images/tab.svg" %}" id="noVNC_send_esc_button" class="noVNC_button" title="Send Escape" />
id="noVNC_send_tab_button" class="noVNC_button" <input type="image" alt="Ctrl+Alt+Del" src="{% static "js/novnc/app/images/ctrlaltdel.svg" %}"
title="Send Tab"/> id="noVNC_send_ctrl_alt_del_button" class="noVNC_button" title="Send Ctrl-Alt-Del" />
<input type="image" alt="Esc" src="{% static "js/novnc/app/images/esc.svg" %}" </div>
id="noVNC_send_esc_button" class="noVNC_button"
title="Send Escape"/>
<input type="image" alt="Ctrl+Alt+Del" src="{% static "js/novnc/app/images/ctrlaltdel.svg" %}"
id="noVNC_send_ctrl_alt_del_button" class="noVNC_button"
title="Send Ctrl-Alt-Del" />
</div>
</div> </div>
</div> </div>
<!-- Shutdown/Reboot --> <!-- Shutdown/Reboot -->
<input type="image" alt="Shutdown/Reboot" src="{% static "js/novnc/app/images/power.svg" %}" <input type="image" alt="Shutdown/Reboot" src="{% static "js/novnc/app/images/power.svg" %}"
id="noVNC_power_button" class="noVNC_button" id="noVNC_power_button" class="noVNC_button" title="Shutdown/Reboot..." />
title="Shutdown/Reboot..." />
<div class="noVNC_vcenter"> <div class="noVNC_vcenter">
<div id="noVNC_power" class="noVNC_panel"> <div id="noVNC_power" class="noVNC_panel">
<div class="noVNC_heading"> <div class="noVNC_heading">
<img src="{% static "js/novnc/app/images/power.svg" %}"> Power <img src="{% static "js/novnc/app/images/power.svg" %}"> Power
</div>
<input type="button" id="noVNC_shutdown_button" value="Shutdown" />
<input type="button" id="noVNC_reboot_button" value="Reboot" />
<input type="button" id="noVNC_reset_button" value="Reset" />
</div> </div>
<input type="button" id="noVNC_shutdown_button" value="Shutdown" />
<input type="button" id="noVNC_reboot_button" value="Reboot" />
<input type="button" id="noVNC_reset_button" value="Reset" />
</div>
</div> </div>
<!-- Clipboard --> <!-- Clipboard -->
<input type="image" alt="Clipboard" src="{% static "js/novnc/app/images/clipboard.svg" %}" <input type="image" alt="Clipboard" src="{% static "js/novnc/app/images/clipboard.svg" %}"
id="noVNC_clipboard_button" class="noVNC_button" id="noVNC_clipboard_button" class="noVNC_button" title="Clipboard" />
title="Clipboard" />
<div class="noVNC_vcenter"> <div class="noVNC_vcenter">
<div id="noVNC_clipboard" class="noVNC_panel"> <div id="noVNC_clipboard" class="noVNC_panel">
<div class="noVNC_heading"> <div class="noVNC_heading">
<img src="{% static "js/novnc/app/images/clipboard.svg" %}"> Clipboard <img src="{% static "js/novnc/app/images/clipboard.svg" %}"> Clipboard
</div>
<textarea id="noVNC_clipboard_text" rows=5></textarea>
<br />
<input id="noVNC_clipboard_clear_button" type="button" value="Clear" class="noVNC_submit" />
</div> </div>
<textarea id="noVNC_clipboard_text" rows=5></textarea>
<br />
<input id="noVNC_clipboard_clear_button" type="button"
value="Clear" class="noVNC_submit" />
</div>
</div> </div>
<!-- Toggle fullscreen --> <!-- Toggle fullscreen -->
<input type="image" alt="Fullscreen" src="{% static "js/novnc/app/images/fullscreen.svg" %}" <input type="image" alt="Fullscreen" src="{% static "js/novnc/app/images/fullscreen.svg" %}"
id="noVNC_fullscreen_button" class="noVNC_button noVNC_hidden" id="noVNC_fullscreen_button" class="noVNC_button noVNC_hidden" title="Fullscreen" />
title="Fullscreen" />
<!-- Settings --> <!-- Settings -->
<input type="image" alt="Settings" src="{% static "js/novnc/app/images/settings.svg" %}" <input type="image" alt="Settings" src="{% static "js/novnc/app/images/settings.svg" %}"
id="noVNC_settings_button" class="noVNC_button" id="noVNC_settings_button" class="noVNC_button" title="Settings" />
title="Settings" />
<div class="noVNC_vcenter"> <div class="noVNC_vcenter">
<div id="noVNC_settings" class="noVNC_panel"> <div id="noVNC_settings" class="noVNC_panel">
<ul> <ul>
<li class="noVNC_heading"> <li class="noVNC_heading">
<img src="{% static "js/novnc/app/images/settings.svg" %}"> Settings <img src="{% static "js/novnc/app/images/settings.svg" %}"> Settings
</li> </li>
<li> <li>
<label><input id="noVNC_setting_shared" type="checkbox" /> Shared Mode</label> <label><input id="noVNC_setting_shared" type="checkbox" /> Shared Mode</label>
</li> </li>
<li> <li>
<label><input id="noVNC_setting_view_only" type="checkbox" /> View Only</label> <label><input id="noVNC_setting_view_only" type="checkbox" /> View Only</label>
</li> </li>
<li><hr></li> <li>
<li> <hr>
<label><input id="noVNC_setting_view_clip" type="checkbox" /> Clip to Window</label> </li>
</li> <li>
<li> <label><input id="noVNC_setting_view_clip" type="checkbox" /> Clip to Window</label>
<label for="noVNC_setting_resize">Scaling Mode:</label> </li>
<select id="noVNC_setting_resize" name="vncResize"> <li>
<option value="off">None</option> <label for="noVNC_setting_resize">Scaling Mode:</label>
<option value="scale">Local Scaling</option> <select id="noVNC_setting_resize" name="vncResize">
<option value="remote">Remote Resizing</option> <option value="off">None</option>
</select> <option value="scale">Local Scaling</option>
</li> <option value="remote">Remote Resizing</option>
<li><hr></li> </select>
<li> </li>
<div class="noVNC_expander">Advanced</div> <li>
<div><ul> <hr>
<li> </li>
<label for="noVNC_setting_repeaterID">Repeater ID:</label> <li>
<input id="noVNC_setting_repeaterID" type="input" value="" /> <div class="noVNC_expander">Advanced</div>
</li> <div>
<li> <ul>
<div class="noVNC_expander">WebSocket</div>
<div><ul>
<li> <li>
<label><input id="noVNC_setting_encrypt" type="checkbox"/>Encrypt</label> <label for="noVNC_setting_repeaterID">Repeater ID:</label>
</li> <input id="noVNC_setting_repeaterID" type="input" value="" />
<li>
<label for="noVNC_setting_host">Host:</label>
<input id="noVNC_setting_host" value="{{ ws_host }}"/>
</li> </li>
<li> <li>
<label for="noVNC_setting_port">Port:</label> <div class="noVNC_expander">WebSocket</div>
<input id="noVNC_setting_port" value="{{ ws_port }}" type="number"/> <div>
<ul>
<li>
<label><input id="noVNC_setting_encrypt"
type="checkbox" />Encrypt</label>
</li>
<li>
<label for="noVNC_setting_host">Host:</label>
<input id="noVNC_setting_host" value="{{ ws_host }}" />
</li>
<li>
<label for="noVNC_setting_port">Port:</label>
<input id="noVNC_setting_port" value="{{ ws_port }}"
type="number" />
</li>
<li>
<label for="noVNC_setting_path">Path:</label>
<!-- <input id="noVNC_setting_path" type="input" value="websockify"/> -->
<input id="noVNC_setting_path" type="input" value="{{ ws_path }}" />
</li>
</ul>
</div>
</li> </li>
<li> <li>
<label for="noVNC_setting_path">Path:</label> <hr>
<input id="noVNC_setting_path" type="input" value="websockify"/>
</li> </li>
</ul></div> <li>
</li> <label><input id="noVNC_setting_reconnect" type="checkbox" />Automatic
<li><hr></li> Reconnect</label>
<li> <input id="noVNC_setting_autoconnect" type="checkbox" value="true" hidden />
<label><input id="noVNC_setting_reconnect" type="checkbox" />Automatic Reconnect</label> </li>
<input id="noVNC_setting_autoconnect" type="checkbox" value="true" hidden/> <li>
</li> <label for="noVNC_setting_reconnect_delay">Reconnect Delay (ms):</label>
<li> <input id="noVNC_setting_reconnect_delay" type="number" />
<label for="noVNC_setting_reconnect_delay">Reconnect Delay (ms):</label> </li>
<input id="noVNC_setting_reconnect_delay" type="number" /> <li>
</li> <hr>
<li><hr></li> </li>
<li> <li>
<label><input id="noVNC_setting_show_dot" type="checkbox">Show Dot when No Cursor</label> <label><input id="noVNC_setting_show_dot" type="checkbox">Show Dot when No
</li> Cursor</label>
<li><hr></li> </li>
<!-- Logging selection dropdown --> <li>
<li> <hr>
<label>Logging: </li>
<select id="noVNC_setting_logging" name="vncLogging"> <!-- Logging selection dropdown -->
</select> <li>
</label> <label>Logging:
</li> <select id="noVNC_setting_logging" name="vncLogging">
</ul></div> </select>
</li> </label>
</ul> </li>
</div> </ul>
</div>
</li>
</ul>
</div>
</div> </div>
<!-- Connection Controls --> <!-- Connection Controls -->
<input type="image" alt="Disconnect" src="{% static "js/novnc/app/images/disconnect.svg" %}" <input type="image" alt="Disconnect" src="{% static "js/novnc/app/images/disconnect.svg" %}"
id="noVNC_disconnect_button" class="noVNC_button" id="noVNC_disconnect_button" class="noVNC_button" title="Disconnect" />
title="Disconnect" />
</div>
</div>
<div id="noVNC_control_bar_hint"></div>
</div> <!-- End of noVNC_control_bar -->
<!-- Status Dialog -->
<div id="noVNC_status"></div>
<!-- Connect button -->
<div class="noVNC_center">
<div id="noVNC_connect_dlg">
<div class="noVNC_logo" translate="no"><span>no</span>VNC</div>
<div id="noVNC_connect_button">
<div><img src="{% static "js/novnc/app/images/connect.svg" %}"> Connect</div>
</div>
</div> </div>
</div> </div>
<!-- Password Dialog --> <div id="noVNC_control_bar_hint"></div>
<div class="noVNC_center noVNC_connect_layer">
<div id="noVNC_password_dlg" class="noVNC_panel"><form aria-label="noVNC password form">
<ul>
<li>
<label>Password:</label>
<input id="noVNC_password_input" type="password" />
</li>
<li>
<input id="noVNC_password_button" type="submit" value="Send Password" class="noVNC_submit" />
</li>
</ul>
</form></div>
</div>
<!-- Transition Screens --> </div> <!-- End of noVNC_control_bar -->
<div id="noVNC_transition">
<div id="noVNC_transition_text"></div> <!-- Status Dialog -->
<div> <div id="noVNC_status"></div>
<!-- Connect button -->
<div class="noVNC_center">
<div id="noVNC_connect_dlg">
<div class="noVNC_logo" translate="no"><span>no</span>VNC</div>
<div id="noVNC_connect_button">
<div><img src="{% static "js/novnc/app/images/connect.svg" %}"> Connect</div>
</div>
</div>
</div>
<!-- Password Dialog -->
<div class="noVNC_center noVNC_connect_layer">
<div id="noVNC_password_dlg" class="noVNC_panel">
<form aria-label="noVNC password form">
<ul>
<li>
<label>Password:</label>
<input id="noVNC_password_input" type="password" />
</li>
<li>
<input id="noVNC_password_button" type="submit" value="Send Password" class="noVNC_submit" />
</li>
</ul>
</form>
</div>
</div>
<!-- Transition Screens -->
<div id="noVNC_transition">
<div id="noVNC_transition_text"></div>
<div>
<input type="button" id="noVNC_cancel_reconnect_button" value="Cancel" class="noVNC_submit" /> <input type="button" id="noVNC_cancel_reconnect_button" value="Cancel" class="noVNC_submit" />
</div>
<div class="noVNC_spinner"></div>
</div> </div>
<div class="noVNC_spinner"></div>
</div>
<!-- This is where the RFB elements will attach --> <!-- This is where the RFB elements will attach -->
<div id="noVNC_container"> <div id="noVNC_container">
<!-- Note that Google Chrome on Android doesn't respect any of these, <!-- Note that Google Chrome on Android doesn't respect any of these,
html attributes which attempt to disable text suggestions on the html attributes which attempt to disable text suggestions on the
on-screen keyboard. Let's hope Chrome implements the ime-mode on-screen keyboard. Let's hope Chrome implements the ime-mode
style for example --> style for example -->
<textarea id="noVNC_keyboardinput" autocapitalize="off" <textarea id="noVNC_keyboardinput" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false"
autocorrect="off" autocomplete="off" spellcheck="false" mozactionhint="Enter" tabindex="-1"></textarea>
mozactionhint="Enter" tabindex="-1"></textarea> </div>
</div>
<audio id="noVNC_bell"> <audio id="noVNC_bell">
<source src="{% static "js/novnc/app/sounds/bell.oga" %}" type="audio/ogg"> <source src="{% static "js/novnc/app/sounds/bell.oga" %}" type="audio/ogg">
<source src="{% static "js/novnc/app/sounds/bell.mp3" %}" type="audio/mpeg"> <source src="{% static "js/novnc/app/sounds/bell.mp3" %}" type="audio/mpeg">
</audio> </audio>
{% endblock %} {% endblock %}

View file

@ -3,7 +3,6 @@
{% load staticfiles %} {% load staticfiles %}
{% block head %} {% block head %}
<!-- <!--
noVNC example: lightweight example using minimal UI and features noVNC example: lightweight example using minimal UI and features
This is a self-contained file which doesn't import WebUtil or external CSS. This is a self-contained file which doesn't import WebUtil or external CSS.
@ -169,8 +168,8 @@
const host = readQueryVariable('host', '{{ ws_host }}'); const host = readQueryVariable('host', '{{ ws_host }}');
let port = readQueryVariable('port', '{{ ws_port }}'); let port = readQueryVariable('port', '{{ ws_port }}');
const password = readQueryVariable('password'); const password = readQueryVariable('password');
const path = readQueryVariable('path', 'websockify'); //const path = readQueryVariable('path', 'websockify');
const path = readQueryVariable('path', '{{ ws_path }}');
// | | | | | | // | | | | | |
// | | | Connect | | | // | | | Connect | | |

View file

@ -3,7 +3,7 @@ from django.shortcuts import render
from libvirt import libvirtError from libvirt import libvirtError
from instances.models import Instance from instances.models import Instance
from vrtManager.instance import wvmInstance from vrtManager.instance import wvmInstance
from webvirtcloud.settings import WS_PUBLIC_PORT, WS_PUBLIC_HOST from webvirtcloud.settings import WS_PUBLIC_PATH, WS_PUBLIC_PORT, WS_PUBLIC_HOST
def console(request): def console(request):
@ -41,6 +41,7 @@ def console(request):
ws_port = console_websocket_port if console_websocket_port else WS_PUBLIC_PORT ws_port = console_websocket_port if console_websocket_port else WS_PUBLIC_PORT
ws_host = WS_PUBLIC_HOST if WS_PUBLIC_HOST else request.get_host() ws_host = WS_PUBLIC_HOST if WS_PUBLIC_HOST else request.get_host()
ws_path = WS_PUBLIC_PATH if WS_PUBLIC_PATH else '/'
if ':' in ws_host: if ':' in ws_host:
ws_host = re.sub(':[0-9]+', '', ws_host) ws_host = re.sub(':[0-9]+', '', ws_host)

View file

@ -2,8 +2,6 @@ body
{ {
background-color: #999999; background-color: #999999;
color: #000000; margin: 0; padding: 0; color: #000000; margin: 0; padding: 0;
font-family: "Lucida Grande", "Lucida Sans Unicode", "Helvetica Neue", Helvetica, Arial, Verdana, sans-serif;
font-size: 12pt;
line-height: 1.5em; line-height: 1.5em;
} }

View file

@ -151,7 +151,10 @@ WS_PUBLIC_PORT = 6080
# Websock public host # Websock public host
WS_PUBLIC_HOST = None WS_PUBLIC_HOST = None
# Websock SSL connection # Websock public path
WS_PUBLIC_PATH = '/novncd/'
# Websock Certificate for SSL
WS_CERT = None WS_CERT = None
# List of console listen addresses # List of console listen addresses