2026-09-14 09:08:35 +00:00
|
|
|
#!/bin/bash
|
|
|
|
|
set -euo pipefail
|
|
|
|
|
export DISPLAY="${DISPLAY:-:1}"
|
|
|
|
|
mkdir -p /workspace /home/box/Desktop /home/box/.config/autostart /tmp
|
|
|
|
|
chmod 1777 /workspace /tmp
|
2026-09-15 05:20:44 +00:00
|
|
|
cp -n /usr/share/lazyboy/desktop/*.desktop /home/box/Desktop/ 2>/dev/null || true
|
2026-09-14 09:08:35 +00:00
|
|
|
chmod +x /home/box/Desktop/*.desktop 2>/dev/null || true
|
|
|
|
|
|
|
|
|
|
if [[ -z "${DBUS_SESSION_BUS_ADDRESS:-}" ]]; then
|
|
|
|
|
eval "$(dbus-launch --sh-syntax)"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
display_number="${DISPLAY#:}"
|
|
|
|
|
display_number="${display_number%%.*}"
|
|
|
|
|
if [[ ! "$display_number" =~ ^[0-9]+$ ]]; then
|
|
|
|
|
echo "Unsupported local display: $DISPLAY" >&2
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
if ! xdpyinfo -display "$DISPLAY" >/dev/null 2>&1; then
|
|
|
|
|
lock_file="/tmp/.X${display_number}-lock"
|
|
|
|
|
lock_pid=""
|
|
|
|
|
if [[ -f "$lock_file" ]]; then
|
|
|
|
|
lock_pid=$(tr -d '[:space:]' < "$lock_file")
|
|
|
|
|
fi
|
|
|
|
|
if [[ "$lock_pid" =~ ^[0-9]+$ ]] && kill -0 "$lock_pid" 2>/dev/null; then
|
|
|
|
|
echo "Display lock is held by live process $lock_pid" >&2
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
rm -f -- "$lock_file" "/tmp/.X11-unix/X${display_number}"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
Xvfb "$DISPLAY" -screen 0 1280x720x24 -ac +extension GLX +render -noreset >/tmp/xvfb.log 2>&1 &
|
|
|
|
|
for _ in 1 2 3 4 5 6 7 8 9 10; do
|
|
|
|
|
if xdpyinfo -display "$DISPLAY" >/dev/null 2>&1; then
|
|
|
|
|
break
|
|
|
|
|
fi
|
|
|
|
|
sleep 0.3
|
|
|
|
|
done
|
|
|
|
|
if ! xdpyinfo -display "$DISPLAY" >/dev/null 2>&1; then
|
|
|
|
|
cat /tmp/xvfb.log >&2
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
startxfce4 >/tmp/xfce.log 2>&1 &
|
|
|
|
|
# Only websockify (same container) talks to VNC; keep the passwordless port
|
|
|
|
|
# off the Docker bridge so sibling containers cannot attach. (libvncserver
|
|
|
|
|
# still binds [::]:5900, but the container has no routable IPv6 address.)
|
2026-09-15 09:07:16 +00:00
|
|
|
x11vnc -display "$DISPLAY" -forever -shared -nopw -rfbport 5900 -listen localhost -xkb -repeat -noxdamage >/tmp/x11vnc.log 2>&1 &
|
|
|
|
|
if command -v autocutsel >/dev/null 2>&1; then
|
|
|
|
|
autocutsel -fork -selection CLIPBOARD >/dev/null 2>&1 || true
|
|
|
|
|
autocutsel -fork -selection PRIMARY >/dev/null 2>&1 || true
|
|
|
|
|
fi
|
2026-09-14 09:08:35 +00:00
|
|
|
websockify --web /usr/share/novnc 6080 localhost:5900 >/tmp/novnc.log 2>&1 &
|
|
|
|
|
|
2026-09-15 05:20:44 +00:00
|
|
|
echo "[lazyboy-box] desktop up display=$DISPLAY vnc=6080 xfce chrome terminal" >/tmp/start-desktop.log
|
2026-09-14 09:08:35 +00:00
|
|
|
trap 'node /usr/local/bin/stop-browser.mjs || python3 /usr/local/bin/stop-browser.py; exit 0' TERM INT
|
|
|
|
|
while true; do
|
|
|
|
|
sleep 3600 &
|
|
|
|
|
wait $!
|
|
|
|
|
done
|