Files
void-installer/tests/lib/make-test-overlay.sh

108 lines
4.2 KiB
Bash
Executable File

#!/bin/bash
# Side-channel overlay used ONLY by the QEMU smoke-test harness.
# Sourced into the live ISO at /usr/local/share/installer/install.conf.d/
# and /etc/profile.d/. Forces unattended + test-mode behaviour and enables
# sshd in the installed system so the harness can ssh in.
set -Eeuo pipefail
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
DEST="${1:?usage: $0 <out-dir>}"
mkdir -p "$DEST/etc/profile.d"
cat > "$DEST/etc/profile.d/99-void-installer-test.sh" <<EOF
# Auto-run installer non-interactively when test ISO boots.
export UNATTENDED=1
export TEST_MODE=1
export PROFILE="${TEST_PROFILE:-stable-cinnamon}"
EOF
chmod 0644 "$DEST/etc/profile.d/99-void-installer-test.sh"
mkdir -p "$DEST/usr/local/share/installer/install.conf.d"
cat > "$DEST/usr/local/share/installer/install.conf.d/99-test.conf" <<'EOF'
# Test overrides (qemu smoke test)
SSHD_ENABLE="yes"
DEFAULT_DISK="/dev/vda"
DEFAULT_ROOT_PART="/dev/vda5"
DEFAULT_EFI_PART="/dev/vda1"
# Use the local xbps proxy on the host (10.0.2.2 inside QEMU's user net).
INSTALL_REPO_URL="http://10.0.2.2:3142/current"
# Quieter zram in tiny VM
ZRAM_SIZE_PCT="25"
EOF
chmod 0644 "$DEST/usr/local/share/installer/install.conf.d/99-test.conf"
# Drop a public key the harness can use to ssh in as moze without a password.
# Generated below (or supplied via TEST_PUBKEY env) and added to authorized_keys
# under /etc/installer-ssh/ so postinstall.sh copies it into ~/.ssh/.
mkdir -p "$DEST/etc/installer-ssh"
if [[ -n "${TEST_PUBKEY:-}" ]]; then
echo "$TEST_PUBKEY" > "$DEST/etc/installer-ssh/authorized_keys"
chmod 0600 "$DEST/etc/installer-ssh/authorized_keys"
fi
# Enable an autostart `sshd` already inside the live env so the harness
# can ssh into the live ISO too if needed (debug).
mkdir -p "$DEST/etc/runit/runsvdir/default"
ln -sf /etc/sv/sshd "$DEST/etc/runit/runsvdir/default/sshd" 2>/dev/null || true
# Autologin root on ttyS0 so the installer's .bash_profile fires under
# QEMU's `-display none -serial file:...` (no tty1 attached).
mkdir -p "$DEST/etc/sv/agetty-ttyS0-autologin"
cat > "$DEST/etc/sv/agetty-ttyS0-autologin/run" <<'EOF'
#!/bin/sh
exec /sbin/agetty --autologin root --noclear -L 115200 ttyS0 vt100
EOF
chmod 0755 "$DEST/etc/sv/agetty-ttyS0-autologin/run"
ln -sf /etc/sv/agetty-ttyS0-autologin "$DEST/etc/runit/runsvdir/default/agetty-ttyS0-autologin"
# Make .bash_profile fire on ttyS0 AND tty1 (interactive GTK QEMU uses tty1).
mkdir -p "$DEST/root"
cat > "$DEST/root/.bash_profile" <<'EOF'
case "$(tty)" in
/dev/ttyS0|/dev/tty1)
# Atomic single-instance lock. mkdir is atomic; only ONE tty wins.
# Previously the check-then-touch race let both tty1 and ttyS0 enter,
# running install-void twice in parallel and corrupting /mnt.
if mkdir /tmp/.installer-lock 2>/dev/null; then
echo "Void Linux Installer (xps9700) — TEST MODE"
# Bring up networking via dhcpcd (live ISO doesn't autostart it).
echo " bringing up network..."
dhcpcd -b 2>/dev/null || true
for i in $(seq 1 20); do
if curl -sf --max-time 1 http://10.0.2.2:3142/ >/dev/null 2>&1; then
echo " network up after ${i}s"
break
fi
sleep 1
done
sleep 1
set -x
/usr/local/sbin/install-void 2>&1 | tee /tmp/installer.log
rc=${PIPESTATUS[0]}
set +x
if [ "$rc" -ne 0 ]; then
echo "===== INSTALLER FAILED rc=$rc ====="
echo "--- ip addr ---"
ip addr 2>&1 | head -20
echo "--- ip route ---"
ip route 2>&1
echo "--- /etc/resolv.conf ---"
cat /etc/resolv.conf 2>/dev/null
echo "--- curl proxy test ---"
curl -sv --max-time 3 http://10.0.2.2:3142/ 2>&1 | head -10
echo "--- /tmp/installer.log (tail) ---"
tail -100 /tmp/installer.log 2>/dev/null
echo "===== END FAIL DUMP ====="
exec /bin/bash
fi
echo "Install complete. Powering off."
poweroff
fi
;;
esac
EOF
chmod 0644 "$DEST/root/.bash_profile"
echo ">>> test overlay staged at $DEST"