feat: harden dashcam transfer tegen flakke SD-lezer + stale-mount cleanup
- dashcam-transfer.py: log echte OSError (shutil.copy2 i.p.v. cp), pre-flight leesbaarheidscheck voor ruimte-wissen, retry (3x) + early-abort (5x), guards op bestandssysteem-calls, WhatsApp GESTOPT bij defecte kaart - dashcam-transfer-mount.sh: skip als service al draait, read-only fsck.exfat health check, %k device-naam doorgeven - dashcam-transfer-cleanup.sh: nieuw - ruimt stale mount op bij udev REMOVE - udev/99-dashcam-trigger.rules: ADD + REMOVE regels met %k - tests: 20 python + 7 mount + 12 cleanup checks - README: architectuur, robuustheid, deploy-instructies
This commit is contained in:
parent
8ef7078ba4
commit
8cc04ea409
9 changed files with 779 additions and 76 deletions
98
tests/test_mount_script.sh
Executable file
98
tests/test_mount_script.sh
Executable file
|
|
@ -0,0 +1,98 @@
|
|||
#!/bin/bash
|
||||
# Functional test for dashcam-transfer-mount.sh using fake tools on PATH.
|
||||
set -u
|
||||
|
||||
SCRIPT="$(cd "$(dirname "$0")/.." && pwd)/dashcam-transfer-mount.sh"
|
||||
WORK=$(mktemp -d)
|
||||
trap 'rm -rf "$WORK"' EXIT
|
||||
|
||||
FAKEBIN="$WORK/bin"
|
||||
mkdir -p "$FAKEBIN"
|
||||
|
||||
LOGGER_FILE="$WORK/logger.log"
|
||||
MOUNT_LOG="$WORK/mount.log"
|
||||
FSCK_LOG="$WORK/fsck.log"
|
||||
MOUNT_MARKER="$WORK/mounted"
|
||||
START_MARKER="$WORK/started"
|
||||
|
||||
export LOGGER_FILE MOUNT_LOG FSCK_LOG MOUNT_MARKER START_MARKER
|
||||
|
||||
cat > "$FAKEBIN/logger" <<'EOF'
|
||||
#!/bin/bash
|
||||
echo "logger: $*" >> "$LOGGER_FILE"
|
||||
EOF
|
||||
|
||||
cat > "$FAKEBIN/systemctl" <<'EOF'
|
||||
#!/bin/bash
|
||||
if [ "$1" = "is-active" ]; then
|
||||
case "$2" in
|
||||
--quiet) ;;
|
||||
*) echo "$SYSTEMCTL_STATE" ;;
|
||||
esac
|
||||
[ "$SYSTEMCTL_STATE" = "active" ]
|
||||
elif [ "$1" = "start" ]; then
|
||||
touch "$START_MARKER"
|
||||
fi
|
||||
EOF
|
||||
|
||||
cat > "$FAKEBIN/mount" <<'EOF'
|
||||
#!/bin/bash
|
||||
echo "mount $*" >> "$MOUNT_LOG"
|
||||
touch "$MOUNT_MARKER"
|
||||
exit 0
|
||||
EOF
|
||||
|
||||
cat > "$FAKEBIN/umount" <<'EOF'
|
||||
#!/bin/bash
|
||||
exit 0
|
||||
EOF
|
||||
|
||||
cat > "$FAKEBIN/mountpoint" <<'EOF'
|
||||
#!/bin/bash
|
||||
exit 1
|
||||
EOF
|
||||
|
||||
cat > "$FAKEBIN/fsck.exfat" <<'EOF'
|
||||
#!/bin/bash
|
||||
echo "fsck $*" >> "$FSCK_LOG"
|
||||
exit 0
|
||||
EOF
|
||||
|
||||
cat > "$FAKEBIN/lsblk" <<'EOF'
|
||||
#!/bin/bash
|
||||
exit 0
|
||||
EOF
|
||||
|
||||
chmod +x "$FAKEBIN"/*
|
||||
|
||||
pass=0
|
||||
fail=0
|
||||
check() { # $1=desc, $2=condition
|
||||
if eval "$2"; then
|
||||
echo "PASS: $1"
|
||||
pass=$((pass + 1))
|
||||
else
|
||||
echo "FAIL: $1"
|
||||
fail=$((fail + 1))
|
||||
fi
|
||||
}
|
||||
|
||||
# Test 1: service already active → skip, never unmount/mount/start
|
||||
export SYSTEMCTL_STATE=active
|
||||
rm -f "$MOUNT_MARKER" "$START_MARKER" "$LOGGER_FILE" "$MOUNT_LOG" "$FSCK_LOG"
|
||||
PATH="$FAKEBIN:$PATH" DASHCAM_MAX_WAIT=0 "$SCRIPT" sde1
|
||||
check "service actief → exit zonder mount" 'test ! -e "$MOUNT_MARKER"'
|
||||
check "service actief → geen service start" 'test ! -e "$START_MARKER"'
|
||||
check "service actief → skip gelogd" 'grep -q "al bezig" "$LOGGER_FILE"'
|
||||
|
||||
# Test 2: service inactive → mount, fsck, start
|
||||
export SYSTEMCTL_STATE=inactive
|
||||
rm -f "$MOUNT_MARKER" "$START_MARKER" "$LOGGER_FILE" "$MOUNT_LOG" "$FSCK_LOG"
|
||||
PATH="$FAKEBIN:$PATH" DASHCAM_MAX_WAIT=0 "$SCRIPT" sde1
|
||||
check "service inactief → gemount" 'test -e "$MOUNT_MARKER"'
|
||||
check "service inactief → service gestart" 'test -e "$START_MARKER"'
|
||||
check "fsck.exfat uitgevoerd" 'test -s "$FSCK_LOG"'
|
||||
check "mount gelogd" 'grep -q "mounted, starting transfer" "$LOGGER_FILE"'
|
||||
|
||||
echo "=== $pass pass, $fail fail ==="
|
||||
[ "$fail" -eq 0 ]
|
||||
Loading…
Reference in a new issue