1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2024-12-24 23:25:24 +00:00

vnc console options added

This commit is contained in:
catborise 2020-07-17 11:04:21 +03:00
parent 522b95fe39
commit 74a4a1a3ef
8 changed files with 148 additions and 54 deletions

View file

@ -0,0 +1,35 @@
# Generated by Django 2.2.13 on 2020-07-16 06:37
from django.db import migrations
from django.utils.translation import ugettext_lazy as _
def add_default_settings(apps, schema_editor):
setting = apps.get_model("appsettings", "AppSettings")
db_alias = schema_editor.connection.alias
setting.objects.using(db_alias).bulk_create([
setting(27, _("Console Scale"), "CONSOLE_SCALE", "False", "True,False", _("Allow console to scaling view")),
setting(28, _("Console View-Only"), "CONSOLE_VIEW_ONLY", "False", "True,False", _("Allow only view not modify")),
setting(29, _("Console Resize Session"), "CONSOLE_RESIZE_SESSION", "False", "True,False", _("Allow to resize session for console")),
setting(30, _("Console Clip Viewport"), "CONSOLE_CLIP_VIEWPORT", "False", "True,False", _("Clip console viewport")),
])
def del_default_settings(apps, schema_editor):
setting = apps.get_model("appsettings", "AppSettings")
db_alias = schema_editor.connection.alias
setting.objects.using(db_alias).filter(key="CONSOLE_SCALE").delete()
setting.objects.using(db_alias).filter(key="CONSOLE_VIEW_ONLY").delete()
setting.objects.using(db_alias).filter(key="CONSOLE_RESIZE_SESSION").delete()
setting.objects.using(db_alias).filter(key="CONSOLE_CLIP_VIEWPORT").delete()
class Migration(migrations.Migration):
dependencies = [
('appsettings', '0003_auto_20200615_0637'),
]
operations = [
migrations.RunPython(add_default_settings, del_default_settings),
]

View file

@ -112,10 +112,5 @@
{% endblock %} {% endblock %}
{% block script %} {% block script %}
<script src="{% static "js/sortable.min.js" %}"></script> <script src="{% static "js/sortable.min.js" %}"></script>
<script>
function open_console(uuid) {
window.open("{% url 'console' %}?token=" + uuid, "", "width=850,height=685");
}
</script>
<script src="{% static 'js/filter-table.js' %}"></script> <script src="{% static 'js/filter-table.js' %}"></script>
{% endblock %} {% endblock %}

View file

@ -202,10 +202,10 @@
rfb.addEventListener("capabilities", function () { updatePowerButtons(); }); rfb.addEventListener("capabilities", function () { updatePowerButtons(); });
// Set parameters that can be changed on an active connection // Set parameters that can be changed on an active connection
rfb.viewOnly = readQueryVariable('view_only', {{ view_only }}); rfb.scaleViewport = {{ scale }};
rfb.scaleViewport = readQueryVariable('scale', {{ scale }}); rfb.viewOnly = {{ view_only }};
rfb.resizeSession = readQueryVariable('resize', {{ resize_session }}); rfb.resizeSession = {{ resize_session }};
rfb.clipViewport = readQueryVariable('clip_viewport', {{ clip_viewport }}); rfb.clipViewport = {{ clip_viewport }};
</script> </script>
{% endblock %} {% endblock %}

View file

@ -1,9 +1,13 @@
import re import re
from django.shortcuts import render from django.shortcuts import render
from libvirt import libvirtError from libvirt import libvirtError
from appsettings.settings import app_settings
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_PATH, WS_PUBLIC_PORT, WS_PUBLIC_HOST from webvirtcloud.settings import (WS_PUBLIC_HOST, WS_PUBLIC_PATH,
WS_PUBLIC_PORT)
def console(request): def console(request):
@ -16,10 +20,10 @@ def console(request):
if request.method == 'GET': if request.method == 'GET':
token = request.GET.get('token', '') token = request.GET.get('token', '')
view_type = request.GET.get('view', 'lite') view_type = request.GET.get('view', 'lite')
view_only = request.GET.get('view_only', 0) view_only = request.GET.get('view_only', app_settings.CONSOLE_VIEW_ONLY.lower())
scale = request.GET.get('scale', 0) scale = request.GET.get('scale', app_settings.CONSOLE_SCALE.lower())
resize_session = request.GET.get('resize_session', 0) resize_session = request.GET.get('resize_session', app_settings.CONSOLE_RESIZE_SESSION.lower())
clip_viewport = request.GET.get('clip_viewport', 0) clip_viewport = request.GET.get('clip_viewport', app_settings.CONSOLE_CLIP_VIEWPORT.lower())
try: try:
temptoken = token.split('-', 1) temptoken = token.split('-', 1)

View file

@ -38,11 +38,6 @@
{% endblock content %} {% endblock content %}
{% block script %} {% block script %}
<script src="{% static "js/sortable.min.js" %}"></script> <script src="{% static "js/sortable.min.js" %}"></script>
<script>
function open_console(uuid) {
window.open("{% url 'console' %}?token=" + uuid, "", "width=850,height=485");
}
</script>
<script src="{% static 'js/filter-table.js' %}"></script> <script src="{% static 'js/filter-table.js' %}"></script>
{% if request.user.is_superuser %} {% if request.user.is_superuser %}
<script> <script>

View file

@ -166,11 +166,6 @@
input.val(editor.getSession().getValue()); input.val(editor.getSession().getValue());
}); });
</script> </script>
<script>
function open_console(view_style) {
window.open('{% url 'console' %}?token={{ compute.id }}-{{ instance.get_uuid }}&view=' + view_style +'', '', 'width=850,height=600')
}
</script>
<script> <script>
function random_mac(net) { function random_mac(net) {
$.getJSON('{% url 'instances:random_mac_address' %}', function (data) { $.getJSON('{% url 'instances:random_mac_address' %}', function (data) {

View file

@ -42,4 +42,12 @@
<span class="fa fa-eye"></span> <span class="fa fa-eye"></span>
</button> </button>
{% endif %} {% endif %}
</form> </form>
{% block script %}
<script>
function open_console(uuid) {
url = '{% url 'console' %}?token=' + uuid + '';
window.open(url, '', 'width=850,height=650')
}
</script>
{% endblock script %}

View file

@ -4,13 +4,15 @@
<!-- Nav tabs --> <!-- Nav tabs -->
<ul class="nav nav-tabs" role="tablist"> <ul class="nav nav-tabs" role="tablist">
<li class="nav-item"> <li class="nav-item">
<a class="nav-link text-secondary active" href="#vnconsole" aria-controls="vnconsole" role="tab" data-toggle="tab"> <a class="nav-link text-secondary active" href="#vnconsole" aria-controls="vnconsole" role="tab"
data-toggle="tab">
{% trans "Console" %} {% trans "Console" %}
</a> </a>
</li> </li>
{% if app_settings.SHOW_ACCESS_ROOT_PASSWORD == 'True' %} {% if app_settings.SHOW_ACCESS_ROOT_PASSWORD == 'True' %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link text-secondary" href="#rootpasswd" aria-controls="rootpasswd" role="tab" data-toggle="tab"> <a class="nav-link text-secondary" href="#rootpasswd" aria-controls="rootpasswd" role="tab"
data-toggle="tab">
{% trans "Root Password" %} {% trans "Root Password" %}
</a> </a>
</li> </li>
@ -24,7 +26,8 @@
{% endif %} {% endif %}
{% if instance.status == 1 %} {% if instance.status == 1 %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link text-secondary" href="#vdiconsole" aria-controls="vdiconsole" role="tab" data-toggle="tab"> <a class="nav-link text-secondary" href="#vdiconsole" aria-controls="vdiconsole" role="tab"
data-toggle="tab">
{% trans "VDI" %} {% trans "VDI" %}
</a> </a>
</li> </li>
@ -33,38 +36,83 @@
<!-- Tab panes --> <!-- Tab panes -->
<div class="tab-content"> <div class="tab-content">
<div role="tabpanel" class="tab-pane tab-pane-bordered active" id="vnconsole"> <div role="tabpanel" class="tab-pane tab-pane-bordered active" id="vnconsole">
<p>{% trans "This action opens a new window with a VNC connection to the console of the instance." %}</p> <p>{% blocktrans with type=instance.console_type|upper %} This action opens a new window with a {{ type }} connection to the console of the instance.{% endblocktrans %}
{% if instance.status == 1 %} </p>
<!-- Split button --> {% if instance.console_type == 'vnc' %}
<div class="btn-group float-right"> <div class="ml-3 form-row">
<button type="button" id="consoleBtnGroup" class="btn btn-lg btn-success" onclick="open_console('lite')">{% trans 'Console' %}</button> <div class="custom-control custom-switch">
<button type="button" class="btn btn-success dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <input class="custom-control-input" type="checkbox" name="scale"
<span class="sr-only">{% trans 'Toggle Dropdown' %}</span> {% if app_settings.CONSOLE_SCALE == 'True' %} checked {% endif %}
</button> id="scale">
<div class="dropdown-menu"> <label class="custom-control-label font-weight-bold" for="scale">{% trans "Scale" %}</label>
<a class="dropdown-item" href="#" title="{% trans "Console port" %}: {{ instance.console_port }}" onclick="open_console('lite')">{% trans "Console" %} - {% trans "Lite" %}</a>
<a class="dropdown-item" href="#" title="{% trans "Console port" %}: {{ instance.console_port }}" onclick="open_console('full')">{% trans "Console" %} - {% trans "Full" %}</a>
</div> </div>
</div> </div>
<div class="ml-3 form-row">
<div class="custom-control custom-switch">
<input class="custom-control-input" type="checkbox" name="view_only"
{% if app_settings.CONSOLE_VIEW_ONLY == 'True' %} checked {% endif %}
id="view_only">
<label class="custom-control-label font-weight-bold" for="view_only">{% trans "View Only" %}</label>
</div>
</div>
<div class="ml-3 form-row">
<div class="custom-control custom-switch">
<input class="custom-control-input" type="checkbox" name="resize_session"
{% if app_settings.CONSOLE_RESIZE_SESSION == 'True' %} checked {% endif %}
id="resize_session">
<label class="custom-control-label font-weight-bold" for="resize_session">{% trans "Resize Session" %}</label>
</div>
</div>
<div class="ml-3 form-row">
<div class="custom-control custom-switch">
<input class="custom-control-input" type="checkbox" name="clip_viewport"
{% if app_settings.CONSOLE_CLIP_VIEWPORT == 'True' %} checked {% endif %}
id="clip_viewport">
<label class="custom-control-label font-weight-bold" for="clip_viewport">{% trans "View Clipboard" %}</label>
</div>
</div>
{% endif %}
{% if instance.status == 1 %}
<!-- Split button -->
<div class="btn-group float-right">
<button type="button" id="consoleBtnGroup" class="btn btn-lg btn-success"
onclick="open_console('lite')">{% trans 'Console' %}</button>
<button type="button" class="btn btn-success dropdown-toggle dropdown-toggle-split"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="sr-only">{% trans 'Toggle Dropdown' %}</span>
</button>
<div class="dropdown-menu">
<a class="dropdown-item" href="#"
title="{% trans "Console port" %}: {{ instance.console_port }}"
onclick="open_console('lite')">{% trans "Console" %} - {% trans "Lite" %}</a>
<a class="dropdown-item" href="#"
title="{% trans "Console port" %}: {{ instance.console_port }}"
onclick="open_console('full')">{% trans "Console" %} - {% trans "Full" %}</a>
</div>
</div>
{% else %} {% else %}
<button class="btn btn-lg btn-success float-right disabled">{% trans "Console" %}</button> <button class="btn btn-lg btn-success float-right disabled">{% trans "Console" %}</button>
{% endif %} {% endif %}
<div class="clearfix"></div> <div class="clearfix"></div>
</div> </div>
{% if app_settings.SHOW_ACCESS_SSH_KEYS == 'True' %} {% if app_settings.SHOW_ACCESS_ROOT_PASSWORD == 'True' %}
<div role="tabpanel" class="tab-pane tab-pane-bordered" id="rootpasswd"> <div role="tabpanel" class="tab-pane tab-pane-bordered" id="rootpasswd">
<p>{% trans "You need shut down your instance and enter a new root password." %}</p> <p>{% trans "You need shut down your instance and enter a new root password." %}</p>
<form action="{% url 'instances:rootpasswd' instance.id %}" class="form-inline" method="post" role="form" aria-label="Add root password to instance form"> <form action="{% url 'instances:rootpasswd' instance.id %}" class="form-inline" method="post"
role="form" aria-label="Add root password to instance form">
{% csrf_token %} {% csrf_token %}
<div class="form-group row"> <div class="form-group row">
<div class="col-sm-12"> <div class="col-sm-12">
<input type="text" class="form-control-lg" name="passwd" placeholder="{% trans "Enter Password" %}" maxlength="24"> <input type="text" class="form-control-lg" name="passwd"
placeholder="{% trans "Enter Password" %}" maxlength="24">
</div> </div>
</div> </div>
{% if instance.status == 5 %} {% if instance.status == 5 %}
<input type="submit" class="btn btn-lg btn-success float-right" name="rootpasswd" value="{% trans "Reset Root Password" %}"> <input type="submit" class="btn btn-lg btn-success float-right" name="rootpasswd"
value="{% trans "Reset Root Password" %}">
{% else %} {% else %}
<button class="btn btn-lg btn-success float-right disabled">{% trans "Reset Root Password" %}</button> <button
class="btn btn-lg btn-success float-right disabled">{% trans "Reset Root Password" %}</button>
{% endif %} {% endif %}
</form> </form>
<div class="clearfix"></div> <div class="clearfix"></div>
@ -73,25 +121,27 @@
{% if app_settings.SHOW_ACCESS_SSH_KEYS == 'True' %} {% if app_settings.SHOW_ACCESS_SSH_KEYS == 'True' %}
<div role="tabpanel" class="tab-pane tab-pane-bordered" id="sshkeys"> <div role="tabpanel" class="tab-pane tab-pane-bordered" id="sshkeys">
<p>{% trans "You need shut down your instance and choose your public key." %}</p> <p>{% trans "You need shut down your instance and choose your public key." %}</p>
<form action="{% url 'instances:add_public_key' instance.id %}" class="form-inline" method="post" role="form" aria-label="Add public key to instance form"> <form action="{% url 'instances:add_public_key' instance.id %}" class="form-inline" method="post"
role="form" aria-label="Add public key to instance form">
{% csrf_token %} {% csrf_token %}
<div class="form-group row"> <div class="form-group row">
<div class="col-sm-12"> <div class="col-sm-12">
<select name="sshkeyid" class="form-control-lg keyselect"> <select name="sshkeyid" class="form-control-lg keyselect">
{% if publickeys %} {% if publickeys %}
{% for key in publickeys %} {% for key in publickeys %}
<option value="{{ key.id }}">{{ key.keyname }}</option> <option value="{{ key.id }}">{{ key.keyname }}</option>
{% endfor %} {% endfor %}
{% else %} {% else %}
<option value="None">{% trans "None" %}</option> <option value="None">{% trans "None" %}</option>
{% endif %} {% endif %}
</select> </select>
</div> </div>
</div> </div>
{% if instance.status == 5 %} {% if instance.status == 5 %}
<input type="submit" class="btn btn-lg btn-success float-right" name="addpublickey" value="{% trans "Add Public Key" %}"> <input type="submit" class="btn btn-lg btn-success float-right" name="addpublickey"
value="{% trans "Add Public Key" %}">
{% else %} {% else %}
<button class="btn btn-lg btn-success float-right disabled">{% trans "Add Public Key" %}</button> <button class="btn btn-lg btn-success float-right disabled">{% trans "Add Public Key" %}</button>
{% endif %} {% endif %}
</form> </form>
<div class="clearfix"></div> <div class="clearfix"></div>
@ -101,9 +151,9 @@
<div role="tabpanel" class="tab-pane tab-pane-bordered" id="vdiconsole"> <div role="tabpanel" class="tab-pane tab-pane-bordered" id="vdiconsole">
<p>{% trans "This action opens a remote viewer with a connection to the console of the instance." %}</p> <p>{% trans "This action opens a remote viewer with a connection to the console of the instance." %}</p>
<div class="input-group"> <div class="input-group">
<input type="text" class="input-lg disabled form-control" disabled id="vdi_url_input"/> <input type="text" class="input-lg disabled form-control" disabled id="vdi_url_input" />
<span class="input-group-append"> <span class="input-group-append">
<a href="#" class="btn btn-success" id="vdi_url" >{% trans "VDI" %}</a> <a href="#" class="btn btn-success" id="vdi_url">{% trans "VDI" %}</a>
</span> </span>
</div> </div>
<div class="clearfix"></div> <div class="clearfix"></div>
@ -112,3 +162,15 @@
</div> </div>
</div> </div>
</div> </div>
{% block script %}
<script>
function open_console(view_style) {
const sc = $("#scale").is(':checked');
const vo = $("#view_only").is(':checked');
const rs = $("#resize_session").is(':checked');
const cv = $("#clip_viewport").is(':checked');
url = '{% url 'console' %}?token={{ compute.id }}-{{ instance.get_uuid }}&view=' + view_style + '' + '&view_only=' + vo + '' + '&scale=' + sc + '' + '&clip_viewport=' + cv + '' + '&resize_session=' + rs + '';
window.open(url, '', 'width=850,height=600')
}
</script>
{% endblock %}