seedetcher/scripts/debug/export-logs-to-sd

95 lines
2.1 KiB
Bash

#!/bin/sh
set -eu
BOOT_DEV="${SE_LOG_EXPORT_BOOT_DEV:-/dev/mmcblk0p1}"
MNT="${SE_LOG_EXPORT_MNT:-/mnt}"
OUT_DIR_REL="${SE_LOG_EXPORT_DIR:-}"
REASON="${1:-manual}"
TS="$(date +%Y%m%d-%H%M%S 2>/dev/null || echo unknown)"
OUT_BASE="${SE_LOG_EXPORT_BASENAME:-SE-LOGS}"
HOST="$(uname -n 2>/dev/null || echo seedetcher)"
need_cmd() {
command -v "$1" >/dev/null 2>&1 || {
echo "missing required command: $1" >&2
exit 1
}
}
need_cmd mkdir
need_cmd cp
if [ ! -b "$BOOT_DEV" ]; then
echo "boot device not found: $BOOT_DEV" >&2
exit 1
fi
mounted_here=0
mkdir -p "$MNT"
# Force /mnt to be the boot partition mount for deterministic behavior.
if awk -v m="$MNT" '$2==m{found=1} END{exit found?0:1}' /proc/mounts; then
umount "$MNT" >/dev/null 2>&1 || true
fi
mount -t vfat "$BOOT_DEV" "$MNT"
mounted_here=1
cleanup() {
if [ "$mounted_here" = "1" ]; then
umount "$MNT" >/dev/null 2>&1 || true
fi
}
trap cleanup EXIT INT TERM
if [ -n "$OUT_DIR_REL" ]; then
OUT_DIR="$MNT/$OUT_DIR_REL"
else
OUT_DIR="$MNT"
fi
mkdir -p "$OUT_DIR"
WORK="/tmp/log-export-${OUT_BASE}"
rm -rf "$WORK"
mkdir -p "$WORK"
mkdir -p "$WORK/log" "$WORK/var-log-cups"
# Privacy-first allowlist: avoid exporting broad debug/tmp/proc data.
cp /log/init_debug.log "$WORK/log/init_debug.log" 2>/dev/null || true
cp /log/cups.log "$WORK/log/cups.log" 2>/dev/null || true
cp /var/log/cups/error_log "$WORK/var-log-cups/error_log" 2>/dev/null || true
cp /var/log/cups/access_log "$WORK/var-log-cups/access_log" 2>/dev/null || true
if command -v dmesg >/dev/null 2>&1; then
dmesg > "$WORK/dmesg.txt" 2>/dev/null || true
fi
case "$REASON" in
boot*) ;;
*)
if [ -x /bin/pjl-snapshot ]; then
/bin/pjl-snapshot "$WORK" >/dev/null 2>&1 || true
fi
;;
esac
{
echo "timestamp=${TS}"
echo "reason=${REASON}"
echo "host=${HOST}"
echo "boot_dev=${BOOT_DEV}"
echo "uname=$(uname -a 2>/dev/null || true)"
} > "$WORK/manifest.txt"
DEST_DIR="$OUT_DIR/${OUT_BASE}-LATEST"
rm -rf "$DEST_DIR"
mkdir -p "$DEST_DIR"
cp -r "$WORK"/. "$DEST_DIR"/
{
echo "timestamp=${TS}"
} > "$DEST_DIR/export.timestamp"
rm -rf "$WORK"
sync
echo "exported logs: $DEST_DIR"