95 lines
2.1 KiB
Bash
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"
|