mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-10 20:26:48 +00:00
feat(console): one VNC console page, driven from the panel's bar
The VM page offered a lite and a full VNC console. Lite lacked a clipboard, display settings and a way to reconnect; full put noVNC's own side bar under the panel's bar, with a Fullscreen item that called a function noVNC does not have, status messages hidden behind the bar, saved noVNC settings that overrode the Access tab's, connection settings that cannot apply, and a Connect button that reused the page's two-minute token and failed. console-vnc.html and static/js/console_vnc.js replace both, on noVNC's RFB with Bootstrap controls, and keep what the full view did: - Status in the bar (Connecting, Connected, Disconnected, Connection lost, Could not connect, Authentication failed with the server's reason on hover); Disconnect, then Reconnect, which loads the page again for a new token. - The VNC password in a dialog (with a username when the server asks for one), not a browser prompt; without passwordless console it is not in the page. - Send key(s) gains Hold Ctrl / Alt / Windows (noVNC's extra keys). - Clipboard: what the VM copies, sending text to the VM's clipboard, and typing it key by key (new: works in firmware, installers and login prompts; Shift for the characters a US keyboard shifts, 25 ms a key as firmware drops faster keys, verified in a UEFI shell). - View: scaling (none, fit, resize the VM's screen), clip, drag a clipped screen, view only, dot cursor, quality, compression; it starts as Settings > Console says (a touch screen starts fitted). - A Keyboard item on touch devices (noVNC's on-screen keyboard input, key events and Android's text-only input), Fullscreen with keyboard lock, the bell. Dropped with the full view: noVNC's websocket host/port/path, repeater ID and log level (the panel fixes them), automatic reconnect (the token is single use in time), XVP power buttons (QEMU has no XVP) and shared-mode off. The bar is compact (about 45 px in the 850x600 window). The Access tab has one Console button instead of the Lite/Full split and four switches, and it and the VM list open one window per VM (opening it again reloads it).
This commit is contained in:
parent
3a560e9f85
commit
0532471759
12 changed files with 520 additions and 843 deletions
|
|
@ -13,22 +13,9 @@ from vrtManager.instance import wvmInstance
|
|||
from vrtManager.util import is_loopback
|
||||
|
||||
|
||||
def to_bool(val, default=False):
|
||||
if val is None:
|
||||
return default
|
||||
return str(val).strip().lower() in ("true", "1", "yes")
|
||||
|
||||
|
||||
def console(request, compute_id, uuid):
|
||||
"""The console page of the VM with this UUID on this compute. The page's
|
||||
query gives the view (lite or full) and its display options. A console
|
||||
"""The console page of the VM with this UUID on this compute. A console
|
||||
that cannot open gets a page that says why, and no console client."""
|
||||
view_type = "full" if request.GET.get("view", "").strip().lower() == "full" else "lite"
|
||||
view_only = to_bool(request.GET.get("view_only"), default=to_bool(app_settings.CONSOLE_VIEW_ONLY))
|
||||
scale = to_bool(request.GET.get("scale"), default=to_bool(app_settings.CONSOLE_SCALE))
|
||||
resize_session = to_bool(request.GET.get("resize_session"), default=to_bool(app_settings.CONSOLE_RESIZE_SESSION))
|
||||
clip_viewport = to_bool(request.GET.get("clip_viewport"), default=to_bool(app_settings.CONSOLE_CLIP_VIEWPORT))
|
||||
|
||||
instance = Instance.objects.filter(compute_id=compute_id, uuid=uuid).first()
|
||||
# Same answer for "no such VM" and "not allowed", so the response
|
||||
# does not reveal whether a VM exists.
|
||||
|
|
@ -84,5 +71,22 @@ def console(request, compute_id, uuid):
|
|||
|
||||
# the console daemons' credential for this page
|
||||
token = tokens.SIGNER.sign(f"{compute_id}:{uuid}:{request.user.id}")
|
||||
console_page = "console-xterm.html" if console_type == "pty" else "console-vnc-" + view_type + ".html"
|
||||
return render(request, console_page, locals())
|
||||
if console_type == "pty":
|
||||
return render(request, "console-xterm.html", {"instance": instance, "token": token})
|
||||
|
||||
# how the VNC page starts (Settings > Console); its View menu changes them
|
||||
if app_settings.CONSOLE_RESIZE_SESSION == "True":
|
||||
resize = "remote"
|
||||
elif app_settings.CONSOLE_SCALE == "True":
|
||||
resize = "scale"
|
||||
else:
|
||||
resize = "off"
|
||||
vnc = {
|
||||
"token": token,
|
||||
# without the permission the VNC server asks the user for it
|
||||
"password": console_passwd if request.user.has_perm("instances.passwordless_console") else None,
|
||||
"resize": resize,
|
||||
"clip": app_settings.CONSOLE_CLIP_VIEWPORT == "True",
|
||||
"viewOnly": app_settings.CONSOLE_VIEW_ONLY == "True",
|
||||
}
|
||||
return render(request, "console-vnc.html", {"instance": instance, "vnc": vnc})
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue