production-deb/scripts/read-usb-logs.sh
obsidian-ai 0f5bbf004a fork: production-deb v0.1.0 from debian-s8ns-prefs-iso server variant
Server-only canonical production Debian build. Drops laptop/vanilla
variants. Interactive LUKS + hostname at install. user/123 forced rotate.
DVD-1 offline base. S8N_LOGS log-capture partition.

Lineage: forked from s8n/debian-s8ns-prefs-iso commit d4be55f.
2026-05-08 13:53:38 +01:00

78 lines
2.4 KiB
Bash
Executable file

#!/usr/bin/env bash
# read-usb-logs.sh — read install logs from S8N_LOGS partition on the USB.
# Use after a failed install: pull USB from target, plug into onyx (or wherever
# you have this repo cloned), run this script.
#
# Usage:
# sudo scripts/read-usb-logs.sh /dev/sdX
# sudo scripts/read-usb-logs.sh # auto-detect by label
#
# Outputs:
# - Lists all run-* directories
# - Cats the latest run's exit-status, last 50 lines of syslog, post-install log
# - On --copy: rsyncs the entire S8N_LOGS contents to ./out/usb-logs-<date>/
set -euo pipefail
DEV="${1:-}"
COPY=0
[[ "${1:-}" == "--copy" ]] && { COPY=1; DEV="${2:-}"; }
if [[ -z "$DEV" ]]; then
DEV="$(blkid -L S8N_LOGS 2>/dev/null || true)"
[[ -n "$DEV" ]] || { echo "ERR: no partition labeled S8N_LOGS found. Pass /dev/sdXN explicitly." >&2; exit 1; }
fi
[[ -b "$DEV" ]] || { echo "ERR: not a block device: $DEV" >&2; exit 1; }
MOUNT=$(mktemp -d)
trap 'sudo umount "$MOUNT" 2>/dev/null || true; rmdir "$MOUNT" 2>/dev/null || true' EXIT
echo "[*] Mounting $DEV at $MOUNT (read-only)..."
sudo mount -o ro "$DEV" "$MOUNT"
echo "[*] Contents:"
ls -la "$MOUNT"
LATEST=$(ls -1d "$MOUNT"/run-* 2>/dev/null | sort | tail -1 || true)
if [[ -z "$LATEST" ]]; then
echo "[!] No run-* directories found. Either install never reached late_command, or log capture failed."
exit 0
fi
echo
echo "[*] Latest run: $(basename "$LATEST")"
echo " contents:"
ls -la "$LATEST"
echo
echo "=== build-info.txt ==="
cat "$LATEST/build-info.txt" 2>/dev/null || echo "(missing)"
echo
echo "=== exit-status.txt ==="
cat "$LATEST/exit-status.txt" 2>/dev/null || echo "(missing — install may have crashed before late_command finished)"
echo
echo "=== syslog (last 80 lines) ==="
tail -80 "$LATEST/syslog" 2>/dev/null || echo "(missing)"
echo
echo "=== s8n-post-install.log (full) ==="
cat "$LATEST/s8n-post-install.log" 2>/dev/null || echo "(missing — postinstall didn't run)"
echo
echo "=== s8n-luks-rekey.log (full) ==="
cat "$LATEST/s8n-luks-rekey.log" 2>/dev/null || echo "(missing — luks-rekey didn't run)"
echo
echo "=== installer/ (debian-installer logs) ==="
ls "$LATEST/installer/" 2>/dev/null || echo "(missing)"
if [[ "$COPY" -eq 1 ]]; then
DEST="$(pwd)/out/usb-logs-$(date -u +%Y%m%dT%H%M%SZ)"
mkdir -p "$DEST"
echo
echo "[*] Copying full log set to $DEST ..."
sudo cp -r "$MOUNT"/run-*/. "$DEST/"
sudo chown -R "$USER:$USER" "$DEST"
echo "[OK] $DEST"
fi