2015-02-27 12:25:41 +00:00
|
|
|
import re
|
2020-07-17 08:04:21 +00:00
|
|
|
|
2020-11-20 11:19:53 +00:00
|
|
|
from vrtManager.util import randomUUID
|
|
|
|
|
|
|
|
from django.http.response import HttpResponseServerError
|
2015-02-27 12:25:41 +00:00
|
|
|
from django.shortcuts import render
|
2020-11-20 11:19:53 +00:00
|
|
|
from django.utils.translation import gettext_lazy as _
|
2020-04-24 16:34:29 +00:00
|
|
|
from libvirt import libvirtError
|
2020-07-17 08:04:21 +00:00
|
|
|
|
2020-11-20 11:19:53 +00:00
|
|
|
from accounts.models import UserInstance
|
2020-07-17 08:04:21 +00:00
|
|
|
from appsettings.settings import app_settings
|
2015-02-27 12:25:41 +00:00
|
|
|
from instances.models import Instance
|
|
|
|
from vrtManager.instance import wvmInstance
|
2020-11-05 09:34:31 +00:00
|
|
|
from webvirtcloud.settings import (
|
|
|
|
WS_PUBLIC_HOST,
|
|
|
|
WS_PUBLIC_PATH,
|
|
|
|
WS_PUBLIC_PORT,
|
|
|
|
)
|
2015-02-27 12:25:41 +00:00
|
|
|
|
|
|
|
|
|
|
|
def console(request):
|
|
|
|
"""
|
|
|
|
:param request:
|
|
|
|
:return:
|
|
|
|
"""
|
2018-05-31 09:38:03 +00:00
|
|
|
console_error = None
|
2015-02-27 12:25:41 +00:00
|
|
|
|
2020-09-25 12:57:17 +00:00
|
|
|
if request.method == "GET":
|
|
|
|
token = request.GET.get("token", "")
|
|
|
|
view_type = request.GET.get("view", "lite")
|
|
|
|
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())
|
2015-02-27 12:25:41 +00:00
|
|
|
|
|
|
|
try:
|
2020-09-25 12:57:17 +00:00
|
|
|
temptoken = token.split("-", 1)
|
2015-02-27 12:25:41 +00:00
|
|
|
host = int(temptoken[0])
|
|
|
|
uuid = temptoken[1]
|
2020-11-20 11:19:53 +00:00
|
|
|
|
2022-06-13 07:58:46 +00:00
|
|
|
if not request.user.is_superuser and not request.user.has_perm("instances.view_instances"):
|
2020-11-20 11:19:53 +00:00
|
|
|
try:
|
|
|
|
userInstance = UserInstance.objects.get(
|
|
|
|
instance__compute_id=host, instance__uuid=uuid, user__id=request.user.id
|
|
|
|
)
|
|
|
|
instance = Instance.objects.get(compute_id=host, uuid=uuid)
|
|
|
|
except UserInstance.DoesNotExist:
|
|
|
|
instance = None
|
|
|
|
console_error = _("User does not have permission to access console or host/instance not exist")
|
|
|
|
return HttpResponseServerError(console_error)
|
|
|
|
else:
|
|
|
|
instance = Instance.objects.get(compute_id=host, uuid=uuid)
|
|
|
|
|
2020-07-13 09:33:09 +00:00
|
|
|
conn = wvmInstance(
|
|
|
|
instance.compute.hostname,
|
|
|
|
instance.compute.login,
|
|
|
|
instance.compute.password,
|
|
|
|
instance.compute.type,
|
|
|
|
instance.name,
|
|
|
|
)
|
2015-02-27 12:25:41 +00:00
|
|
|
console_type = conn.get_console_type()
|
|
|
|
console_websocket_port = conn.get_console_websocket_port()
|
|
|
|
console_passwd = conn.get_console_passwd()
|
2020-03-16 13:59:45 +00:00
|
|
|
except libvirtError:
|
2015-02-27 12:25:41 +00:00
|
|
|
console_type = None
|
|
|
|
console_websocket_port = None
|
|
|
|
console_passwd = None
|
|
|
|
|
2019-11-08 17:07:02 +00:00
|
|
|
ws_port = console_websocket_port if console_websocket_port else WS_PUBLIC_PORT
|
2015-02-27 12:25:41 +00:00
|
|
|
ws_host = WS_PUBLIC_HOST if WS_PUBLIC_HOST else request.get_host()
|
2020-09-25 12:57:17 +00:00
|
|
|
ws_path = WS_PUBLIC_PATH if WS_PUBLIC_PATH else "/"
|
2015-02-27 12:25:41 +00:00
|
|
|
|
2020-09-25 12:57:17 +00:00
|
|
|
if ":" in ws_host:
|
|
|
|
ws_host = re.sub(":[0-9]+", "", ws_host)
|
2015-02-27 12:25:41 +00:00
|
|
|
|
2020-09-25 12:57:17 +00:00
|
|
|
if console_type == "vnc" or console_type == "spice":
|
2020-07-17 12:32:06 +00:00
|
|
|
console_page = "console-" + console_type + "-" + view_type + ".html"
|
2018-08-14 12:11:49 +00:00
|
|
|
response = render(request, console_page, locals())
|
2022-07-17 11:25:47 +00:00
|
|
|
elif console_type == "pty":
|
|
|
|
response = render(request, "console-xterm.html", locals())
|
2015-02-27 12:25:41 +00:00
|
|
|
else:
|
2020-07-17 12:32:06 +00:00
|
|
|
if console_type is None:
|
2020-11-20 11:19:53 +00:00
|
|
|
console_error = _("Fail to get console. Please check the console configuration of your VM.")
|
2020-07-17 12:32:06 +00:00
|
|
|
else:
|
2020-11-20 11:19:53 +00:00
|
|
|
console_error = _("Console type '%(type)s' has not support") % {"type": console_type}
|
2020-09-25 12:57:17 +00:00
|
|
|
response = render(request, "console-vnc-lite.html", locals())
|
2015-02-27 12:25:41 +00:00
|
|
|
|
2020-09-25 12:57:17 +00:00
|
|
|
response.set_cookie("token", token)
|
2015-02-27 12:25:41 +00:00
|
|
|
return response
|