LazyBoy2/box/start-desktop.sh

57 lines
1.9 KiB
Bash

#!/bin/bash
set -euo pipefail
export DISPLAY="${DISPLAY:-:1}"
mkdir -p /workspace /home/box/Desktop /home/box/.config/autostart /tmp
chmod 1777 /workspace /tmp
cp -n /usr/share/lazyboy/desktop/*.desktop /home/box/Desktop/ 2>/dev/null || true
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.)
x11vnc -display "$DISPLAY" -forever -shared -nopw -rfbport 5900 -listen localhost >/tmp/x11vnc.log 2>&1 &
websockify --web /usr/share/novnc 6080 localhost:5900 >/tmp/novnc.log 2>&1 &
echo "[lazyboy-box] desktop up display=$DISPLAY vnc=6080 xfce chrome terminal" >/tmp/start-desktop.log
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