mirror of
https://github.com/retspen/webvirtcloud
synced 2026-10-18 00:50:07 +00:00
fix(console): fix novncd startup in container and prevent double slashes in websocket url
This commit is contained in:
parent
f061189716
commit
d9112b797f
7 changed files with 64 additions and 15 deletions
|
|
@ -20,6 +20,17 @@ if [ -z "$SECRET_KEY" ]; then
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Apply optional WebSocket configuration from environment
|
||||||
|
if [ -n "$WS_PUBLIC_PORT" ]; then
|
||||||
|
sed -i "s|^WS_PUBLIC_PORT = .*|WS_PUBLIC_PORT = $WS_PUBLIC_PORT|" "$APP_DIR/webvirtcloud/settings.py"
|
||||||
|
fi
|
||||||
|
if [ -n "$WS_PUBLIC_HOST" ]; then
|
||||||
|
sed -i "s|^WS_PUBLIC_HOST = .*|WS_PUBLIC_HOST = \"$WS_PUBLIC_HOST\"|" "$APP_DIR/webvirtcloud/settings.py"
|
||||||
|
fi
|
||||||
|
if [ -n "$WS_PUBLIC_PATH" ]; then
|
||||||
|
sed -i "s|^WS_PUBLIC_PATH = .*|WS_PUBLIC_PATH = \"$WS_PUBLIC_PATH\"|" "$APP_DIR/webvirtcloud/settings.py"
|
||||||
|
fi
|
||||||
|
|
||||||
# Persist SQLite database in DATA_DIR
|
# Persist SQLite database in DATA_DIR
|
||||||
if [ ! -f "$DATA_DIR/db.sqlite3" ] && [ -f "$APP_DIR/db.sqlite3" ] && [ ! -L "$APP_DIR/db.sqlite3" ]; then
|
if [ ! -f "$DATA_DIR/db.sqlite3" ] && [ -f "$APP_DIR/db.sqlite3" ] && [ ! -L "$APP_DIR/db.sqlite3" ]; then
|
||||||
mv "$APP_DIR/db.sqlite3" "$DATA_DIR/db.sqlite3"
|
mv "$APP_DIR/db.sqlite3" "$DATA_DIR/db.sqlite3"
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,28 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
# `/sbin/setuser www-data` runs the given command as the user `www-data`.
|
USER="www-data"
|
||||||
RUNAS=$(which setuser)
|
DJANGO_PROJECT="/srv/webvirtcloud"
|
||||||
[ -z "$RUNAS" ] && RUNAS="$(which sudo) -u"
|
PYTHON="$DJANGO_PROJECT/venv/bin/python3"
|
||||||
USER=www-data
|
NOVNCD="$DJANGO_PROJECT/console/novncd"
|
||||||
|
LOG="/var/log/novncd.log"
|
||||||
|
|
||||||
DJANGO_PROJECT=/srv/webvirtcloud
|
cd "$DJANGO_PROJECT" || exit 1
|
||||||
PYTHON=$DJANGO_PROJECT/venv/bin/python3
|
|
||||||
NOVNCD=$DJANGO_PROJECT/console/novncd
|
|
||||||
|
|
||||||
# make novncd debug, verbose
|
# make novncd debug, verbose
|
||||||
#PARAMS="-d -v"
|
#PARAMS="-d -v"
|
||||||
|
|
||||||
LOG=/var/log/novncd.log
|
if [ -x /sbin/setuser ]; then
|
||||||
|
if [ -n "$PARAMS" ]; then
|
||||||
cd $DJANGO_PROJECT || exit
|
# shellcheck disable=SC2086
|
||||||
exec "$RUNAS" "$USER" "$PYTHON" "$NOVNCD" "$PARAMS" >> $LOG 2>&1
|
exec /sbin/setuser "$USER" "$PYTHON" "$NOVNCD" $PARAMS >> "$LOG" 2>&1
|
||||||
|
else
|
||||||
|
exec /sbin/setuser "$USER" "$PYTHON" "$NOVNCD" >> "$LOG" 2>&1
|
||||||
|
fi
|
||||||
|
elif command -v su >/dev/null 2>&1; then
|
||||||
|
if [ -n "$PARAMS" ]; then
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
exec su -s /bin/sh "$USER" -c "exec \"$PYTHON\" \"$NOVNCD\" $PARAMS" >> "$LOG" 2>&1
|
||||||
|
else
|
||||||
|
exec su -s /bin/sh "$USER" -c "exec \"$PYTHON\" \"$NOVNCD\"" >> "$LOG" 2>&1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
|
||||||
|
|
@ -143,6 +143,7 @@ class CompatibilityMixIn(object):
|
||||||
# NoVNC uses it's own convention that forward token
|
# NoVNC uses it's own convention that forward token
|
||||||
# from the request to a cookie header, we should check
|
# from the request to a cookie header, we should check
|
||||||
# also for this behavior
|
# also for this behavior
|
||||||
|
token = None
|
||||||
hcookie = self.headers.get("cookie")
|
hcookie = self.headers.get("cookie")
|
||||||
|
|
||||||
if hcookie:
|
if hcookie:
|
||||||
|
|
@ -159,6 +160,22 @@ class CompatibilityMixIn(object):
|
||||||
if "token" in cookie:
|
if "token" in cookie:
|
||||||
token = cookie["token"].value
|
token = cookie["token"].value
|
||||||
|
|
||||||
|
# Fallback to query parameter if token not found in cookie
|
||||||
|
if not token and hasattr(self, "path"):
|
||||||
|
from urllib.parse import parse_qs, urlparse
|
||||||
|
|
||||||
|
try:
|
||||||
|
parsed_url = urlparse(self.path)
|
||||||
|
query_params = parse_qs(parsed_url.query)
|
||||||
|
if "token" in query_params:
|
||||||
|
token = query_params["token"][0]
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if not token:
|
||||||
|
self.msg("No console token provided in cookie or query parameters")
|
||||||
|
return
|
||||||
|
|
||||||
(
|
(
|
||||||
connhost,
|
connhost,
|
||||||
connport,
|
connport,
|
||||||
|
|
|
||||||
|
|
@ -61,8 +61,8 @@
|
||||||
sc.stop();
|
sc.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
// uri = scheme + host + ":" + port;
|
var path = '{{ ws_path }}';
|
||||||
uri = scheme + "{{ ws_host }}:{{ ws_port }}{{ ws_path }}";
|
uri = scheme + "{{ ws_host }}:{{ ws_port }}" + (path ? (path[0] == '/' ? path : ('/' + path)) : '/');
|
||||||
|
|
||||||
document.getElementById('connectButton').innerHTML = "Stop";
|
document.getElementById('connectButton').innerHTML = "Stop";
|
||||||
document.getElementById('connectButton').onclick = disconnect;
|
document.getElementById('connectButton').onclick = disconnect;
|
||||||
|
|
|
||||||
|
|
@ -194,7 +194,15 @@
|
||||||
if (port) {
|
if (port) {
|
||||||
url += ':' + port;
|
url += ':' + port;
|
||||||
}
|
}
|
||||||
url += '/' + path;
|
if (path) {
|
||||||
|
url += path.startsWith('/') ? path : ('/' + path);
|
||||||
|
} else {
|
||||||
|
url += '/';
|
||||||
|
}
|
||||||
|
const token = readQueryVariable('token', '{{ token }}');
|
||||||
|
if (token) {
|
||||||
|
url += (url.includes('?') ? '&' : '?') + 'token=' + encodeURIComponent(token);
|
||||||
|
}
|
||||||
|
|
||||||
// Creating a new RFB object will start a new connection
|
// Creating a new RFB object will start a new connection
|
||||||
rfb = new RFB(document.getElementById('noVNC_container'), url,
|
rfb = new RFB(document.getElementById('noVNC_container'), url,
|
||||||
|
|
|
||||||
|
|
@ -86,6 +86,9 @@ def console(request):
|
||||||
if ":" in ws_host:
|
if ":" in ws_host:
|
||||||
ws_host = re.sub(":[0-9]+", "", ws_host)
|
ws_host = re.sub(":[0-9]+", "", ws_host)
|
||||||
|
|
||||||
|
if ws_path:
|
||||||
|
ws_path = ws_path.strip("/") + "/" if ws_path.strip("/") else ""
|
||||||
|
|
||||||
if console_type == "vnc" or console_type == "spice":
|
if console_type == "vnc" or console_type == "spice":
|
||||||
console_page = "console-" + console_type + "-" + view_type + ".html"
|
console_page = "console-" + console_type + "-" + view_type + ".html"
|
||||||
response = render(request, console_page, locals())
|
response = render(request, console_page, locals())
|
||||||
|
|
|
||||||
|
|
@ -213,7 +213,7 @@ WS_PUBLIC_PORT = 6080
|
||||||
WS_PUBLIC_HOST = None
|
WS_PUBLIC_HOST = None
|
||||||
|
|
||||||
# Websock public path
|
# Websock public path
|
||||||
WS_PUBLIC_PATH = "/novncd/"
|
WS_PUBLIC_PATH = "novncd/"
|
||||||
|
|
||||||
# Websock Certificate for SSL
|
# Websock Certificate for SSL
|
||||||
WS_CERT = None
|
WS_CERT = None
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue