diff --git a/appsettings/migrations/0004_auto_20200716_0637.py b/appsettings/migrations/0004_auto_20200716_0637.py new file mode 100644 index 0000000..5feffa3 --- /dev/null +++ b/appsettings/migrations/0004_auto_20200716_0637.py @@ -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), + ] diff --git a/computes/templates/computes/instances.html b/computes/templates/computes/instances.html index d72ecbd..342d53d 100644 --- a/computes/templates/computes/instances.html +++ b/computes/templates/computes/instances.html @@ -112,10 +112,5 @@ {% endblock %} {% block 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> {% endblock %} \ No newline at end of file diff --git a/console/templates/console-vnc-lite.html b/console/templates/console-vnc-lite.html index e3cad63..a76744e 100755 --- a/console/templates/console-vnc-lite.html +++ b/console/templates/console-vnc-lite.html @@ -202,10 +202,10 @@ rfb.addEventListener("capabilities", function () { updatePowerButtons(); }); // 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 }}); + rfb.scaleViewport = {{ scale }}; + rfb.viewOnly = {{ view_only }}; + rfb.resizeSession = {{ resize_session }}; + rfb.clipViewport = {{ clip_viewport }}; </script> {% endblock %} diff --git a/console/views.py b/console/views.py index e1df4f2..8251526 100644 --- a/console/views.py +++ b/console/views.py @@ -1,9 +1,13 @@ import re + from django.shortcuts import render from libvirt import libvirtError + +from appsettings.settings import app_settings from instances.models import Instance 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): @@ -16,10 +20,10 @@ def console(request): if request.method == 'GET': token = request.GET.get('token', '') view_type = request.GET.get('view', 'lite') - view_only = request.GET.get('view_only', 0) - scale = request.GET.get('scale', 0) - resize_session = request.GET.get('resize_session', 0) - clip_viewport = request.GET.get('clip_viewport', 0) + view_only = request.GET.get('view_only', app_settings.CONSOLE_VIEW_ONLY.lower()) + scale = request.GET.get('scale', app_settings.CONSOLE_SCALE.lower()) + resize_session = request.GET.get('resize_session', app_settings.CONSOLE_RESIZE_SESSION.lower()) + clip_viewport = request.GET.get('clip_viewport', app_settings.CONSOLE_CLIP_VIEWPORT.lower()) try: temptoken = token.split('-', 1) diff --git a/instances/templates/allinstances.html b/instances/templates/allinstances.html index d8c5a14..caaa932 100644 --- a/instances/templates/allinstances.html +++ b/instances/templates/allinstances.html @@ -38,11 +38,6 @@ {% endblock content %} {% block 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> {% if request.user.is_superuser %} <script> diff --git a/instances/templates/instance.html b/instances/templates/instance.html index 5562ac5..3739391 100644 --- a/instances/templates/instance.html +++ b/instances/templates/instance.html @@ -166,11 +166,6 @@ input.val(editor.getSession().getValue()); }); </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> function random_mac(net) { $.getJSON('{% url 'instances:random_mac_address' %}', function (data) { diff --git a/instances/templates/instance_actions.html b/instances/templates/instance_actions.html index 06cfe43..f67dc1d 100644 --- a/instances/templates/instance_actions.html +++ b/instances/templates/instance_actions.html @@ -42,4 +42,12 @@ <span class="fa fa-eye"></span> </button> {% endif %} -</form> \ No newline at end of file +</form> +{% block script %} +<script> + function open_console(uuid) { + url = '{% url 'console' %}?token=' + uuid + ''; + window.open(url, '', 'width=850,height=650') + } +</script> +{% endblock script %} \ No newline at end of file diff --git a/instances/templates/instances/access_tab.html b/instances/templates/instances/access_tab.html index f5b4579..b32046e 100644 --- a/instances/templates/instances/access_tab.html +++ b/instances/templates/instances/access_tab.html @@ -4,13 +4,15 @@ <!-- Nav tabs --> <ul class="nav nav-tabs" role="tablist"> <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" %} </a> </li> {% if app_settings.SHOW_ACCESS_ROOT_PASSWORD == 'True' %} <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" %} </a> </li> @@ -24,7 +26,8 @@ {% endif %} {% if instance.status == 1 %} <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" %} </a> </li> @@ -33,38 +36,83 @@ <!-- Tab panes --> <div class="tab-content"> <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> - {% 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> + <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 %} + </p> + {% if instance.console_type == 'vnc' %} + <div class="ml-3 form-row"> + <div class="custom-control custom-switch"> + <input class="custom-control-input" type="checkbox" name="scale" + {% if app_settings.CONSOLE_SCALE == 'True' %} checked {% endif %} + id="scale"> + <label class="custom-control-label font-weight-bold" for="scale">{% trans "Scale" %}</label> </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 %} - <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 %} <div class="clearfix"></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"> <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 %} <div class="form-group row"> <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> {% 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 %} - <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 %} </form> <div class="clearfix"></div> @@ -73,25 +121,27 @@ {% if app_settings.SHOW_ACCESS_SSH_KEYS == 'True' %} <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> - <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 %} <div class="form-group row"> <div class="col-sm-12"> <select name="sshkeyid" class="form-control-lg keyselect"> {% if publickeys %} - {% for key in publickeys %} - <option value="{{ key.id }}">{{ key.keyname }}</option> - {% endfor %} + {% for key in publickeys %} + <option value="{{ key.id }}">{{ key.keyname }}</option> + {% endfor %} {% else %} - <option value="None">{% trans "None" %}</option> + <option value="None">{% trans "None" %}</option> {% endif %} </select> </div> </div> {% 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 %} - <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 %} </form> <div class="clearfix"></div> @@ -101,9 +151,9 @@ <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> <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"> - <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> </div> <div class="clearfix"></div> @@ -112,3 +162,15 @@ </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 %} \ No newline at end of file