mirror of
https://github.com/kuhyx/utils.git
synced 2026-11-10 19:27:16 +01:00
Some checks are pending
dependency freshness / dependencies on newest stable (push) Waiting to run
file length / file-length (push) Waiting to run
md-naming / markdown naming convention (push) Waiting to run
palette drift / palette (push) Waiting to run
shared gate tests / gate unit tests (push) Waiting to run
The golden image logs in with agetty+startx and has no RGB controllers, no NVIDIA card and no sound card, so the night-lockdown scripts — which mask/stop lightdm.service and getty@.service and shell out to openrgb, nvidia-smi and amixer — had nothing real to act on in a sandbox and were being "verified" on the host instead. - `vm lightdm <name>`: installs lightdm + lightdm-gtk-greeter into the live overlay (pacman -Syu, not -S: the overlay's package database is the image's and mirrors have rotated those versions out), configures autologin -> i3 exactly like the host, turns tty1 back into a plain getty, reboots the guest and proves lightdm.service is active with an Xorg it owns. Never rebuilds the base: `vm build --force` re-seals a new checksum while every existing sandbox still backs onto the old file's name, which is silent qcow2 corruption. - `vm shim <name> <tool> [exit[:N]|hang|sleep:S]`: a fake tool ahead of the real one on PATH, every call logged with an epoch to /var/log/vmbox-shim/<tool>.log so the host can assert what ran and in what order. `hang` is the openrgb 1.0-2 that never returned on 2026-09-12 and defeated the curfew. - The DISPLAY/XAUTHORITY resolver `vm run` sources becomes its own file, guest/vmbox-x11.sh, installed by the image build and re-installed by the lightdm switch; it now tests readability, not existence, and tries ~/.Xauthority before the startx serverauth glob, because lightdm's Xorg -auth file is root-only. - README: the worked example uses MIDNIGHT_SHUTDOWN_CONFIRM=y (the installer refuses to run unattended now; `echo y |` no longer works), and the "i2c RGB stays on the host" line is gone. - bats: four host-side tests for shim.sh (exit, exit:N, hang, refusals). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015mLnUeoJ3mUwGRTowTUH6d
61 lines
2.6 KiB
Bash
61 lines
2.6 KiB
Bash
#!/bin/bash
|
|
# ============================================================================
|
|
# Runs INSIDE the guest during `vm build`, as root, called by provision.sh.
|
|
#
|
|
# Everything that gives the sandbox a real graphical session: autologin on
|
|
# tty1, startx into i3, a minimal i3 config, and the X-environment discovery
|
|
# that lets `vm run` reach that session. Split out of provision.sh to keep
|
|
# both files under the 250-line cap.
|
|
# ============================================================================
|
|
|
|
set -euo pipefail
|
|
|
|
GUEST_USER="${1:-arch}"
|
|
|
|
# --- X11 autologin + i3 ---------------------------------------------------
|
|
# Locker tests need a real X session on tty1. Autologin then startx.
|
|
install -d -m 755 /etc/systemd/system/getty@tty1.service.d
|
|
cat > /etc/systemd/system/getty@tty1.service.d/autologin.conf <<UNIT
|
|
[Service]
|
|
ExecStart=
|
|
ExecStart=-/sbin/agetty --autologin ${GUEST_USER} --noclear %I \$TERM
|
|
UNIT
|
|
|
|
cat > "/home/$GUEST_USER/.xinitrc" <<'XINIT'
|
|
exec i3
|
|
XINIT
|
|
chown "$GUEST_USER:$GUEST_USER" "/home/$GUEST_USER/.xinitrc"
|
|
|
|
# startx on tty1 login only, so `vm ssh` sessions do not try to start X.
|
|
cat > "/home/$GUEST_USER/.bash_profile" <<'PROFILE'
|
|
[[ -f ~/.bashrc ]] && . ~/.bashrc
|
|
if [[ -z ${DISPLAY:-} && $(tty) == /dev/tty1 ]]; then
|
|
exec startx -- -keeptty >~/.xsession.log 2>&1
|
|
fi
|
|
PROFILE
|
|
chown "$GUEST_USER:$GUEST_USER" "/home/$GUEST_USER/.bash_profile"
|
|
|
|
# i3 without a config prompts a wizard that blocks the session; ship a minimal one.
|
|
install -d -m 755 "/home/$GUEST_USER/.config/i3"
|
|
cat > "/home/$GUEST_USER/.config/i3/config" <<'I3'
|
|
set $mod Mod4
|
|
font pango:monospace 10
|
|
bindsym $mod+Return exec xterm
|
|
bindsym $mod+d exec dmenu_run
|
|
bindsym $mod+Shift+q kill
|
|
# Marker window so screenshot tests have something deterministic to match.
|
|
exec --no-startup-id xterm -T vmbox-ready -e 'echo VMBOX READY; exec bash'
|
|
I3
|
|
chown -R "$GUEST_USER:$GUEST_USER" "/home/$GUEST_USER/.config"
|
|
|
|
# --- X session discovery for non-login commands ---------------------------
|
|
# The image ships a real X/i3 session so locker and i3 tests can run. But
|
|
# `vm run` executes through `sh -c`, which reads no profile, so those
|
|
# commands land with no DISPLAY and no XAUTHORITY -- and every X tool then
|
|
# fails with "Could not determine i3 socket path" / "cannot open display".
|
|
# That looks exactly like "the sandbox has no X", which is wrong and cost a
|
|
# real installer run to diagnose. The resolver is its own file, guest/
|
|
# vmbox-x11.sh, because desktop-lightdm.sh re-installs it after switching a
|
|
# sandbox to lightdm (different auth-file location) -- one source for both.
|
|
install -m 644 "$(dirname "${BASH_SOURCE[0]}")/vmbox-x11.sh" /etc/profile.d/vmbox-x11.sh
|