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
|
|
@ -1,15 +1,22 @@
|
|||
#!/bin/bash
|
||||
# Mount SD card and start dashcam transfer.
|
||||
# Mount SD card by kernel device name (udev %k) and start dashcam transfer.
|
||||
# Called by udev rule 99-dashcam-trigger.rules via systemd-run.
|
||||
# systemd-run is used (not direct udev exec) because udev context
|
||||
# lacks mount/umount permissions on Fedora with SELinux enforcing.
|
||||
#
|
||||
# The udev rule passes the kernel name (e.g. "sde1") as $1 so the
|
||||
# device is mounted dynamically, independent of its filesystem UUID.
|
||||
MAX_WAIT="${DASHCAM_MAX_WAIT:-60}"
|
||||
|
||||
DEV=${1:+/dev/$1}
|
||||
logger -t dashcam-transfer "Trigger: SD card detected ($DEV)"
|
||||
|
||||
# Never interrupt a running transfer: a flaky reader can cause a second
|
||||
# udev event (USB re-enumeration) which must not unmount a busy card.
|
||||
if systemctl is-active --quiet dashcam-transfer.service; then
|
||||
logger -t dashcam-transfer "Trigger: transfer service al bezig — skip"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ -n "$1" ]; then
|
||||
for ((i=0; i<60; i++)); do
|
||||
for ((i=0; i<MAX_WAIT; i++)); do
|
||||
if [ -e "$DEV" ]; then
|
||||
logger -t dashcam-transfer "Trigger: device ready after ${i}s"
|
||||
break
|
||||
|
|
@ -19,7 +26,7 @@ if [ -n "$1" ]; then
|
|||
else
|
||||
UUID=$(lsblk -rno UUID /dev/sde1 2>/dev/null)
|
||||
DEV=/dev/disk/by-uuid/$UUID
|
||||
for ((i=0; i<60; i++)); do
|
||||
for ((i=0; i<MAX_WAIT; i++)); do
|
||||
if [ -e "$DEV" ]; then
|
||||
logger -t dashcam-transfer "Trigger: device ready after ${i}s"
|
||||
break
|
||||
|
|
@ -27,13 +34,20 @@ else
|
|||
sleep 1
|
||||
done
|
||||
fi
|
||||
|
||||
while mountpoint -q /mnt/sdcard 2>/dev/null; do
|
||||
umount /mnt/sdcard 2>/dev/null || break
|
||||
done
|
||||
|
||||
mount "$DEV" /mnt/sdcard -o uid=1000,gid=1000,fmask=0000,dmask=0000
|
||||
if [ $? -eq 0 ]; then
|
||||
logger -t dashcam-transfer "Trigger: mounted, starting transfer"
|
||||
# Read-only exFAT health check; logs warnings but never blocks the transfer.
|
||||
if command -v fsck.exfat >/dev/null 2>&1; then
|
||||
fsck.exfat -n "$DEV" 2>&1 | logger -t dashcam-transfer
|
||||
logger -t dashcam-transfer "Trigger: fsck.exfat exit ${PIPESTATUS[0]}"
|
||||
fi
|
||||
systemctl start dashcam-transfer
|
||||
else
|
||||
logger -t dashcam-transfer "TRIGGER ERROR: mount failed"
|
||||
fi
|
||||
fi
|
||||
|
|
|
|||
Loading…
Reference in a new issue