From 62addbba5d031a7d49a82591e2ff91201468c432 Mon Sep 17 00:00:00 2001 From: "F. Javier Puig Diaz" Date: Tue, 22 Sep 2026 18:10:29 +0100 Subject: [PATCH] Add new file --- sync_motion.sh | 101 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 sync_motion.sh diff --git a/sync_motion.sh b/sync_motion.sh new file mode 100644 index 0000000..8e87cc2 --- /dev/null +++ b/sync_motion.sh @@ -0,0 +1,101 @@ +#!/bin/bash + +# Ensure log directory exists +mkdir -p /home/habiwan/logs +LOG="/home/habiwan/logs/motion_sync.log" +LOCKFILE="/tmp/sync_motion.lock" + +# Configuration +LOCAL_DIR="/var/lib/motioneye" +RCLONE_TARGET="box:MotionEye" +MAX_SIZE_KB=9437184 # 9 GB in KB for 'du' (9 * 1024 * 1024) + +# Keep log file under ~5 MB by trimming it when it gets too large +MAX_LOG_SIZE=$((5 * 1024 * 1024)) +if [ -f "$LOG" ] && [ $(stat -f%z "$LOG" 2>/dev/null || stat -c%s "$LOG" 2>/dev/null) -gt $MAX_LOG_SIZE ]; then + tail -n 500 "$LOG" > "${LOG}.tmp" && mv "${LOG}.tmp" "$LOG" +fi + +log_msg() { + echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG" +} + +exec 200>"$LOCKFILE" +if ! flock -n 200; then + echo "Script is already running. Exiting back to CLI." + exit 1 +fi + +log_msg "--- Starting Sync & Housekeeping ---" + +# ============================================================================== +# 1. REMUX MKV TO MP4 +# ============================================================================== +log_msg "Scanning for MKV files to convert for browser playback..." +find "$LOCAL_DIR" -type f -name "*.mkv" | while read -r mkv_file; do + mp4_file="${mkv_file%.mkv}.mp4" + if ffmpeg -y -i "$mkv_file" -c copy -movflags +faststart "$mp4_file" >/dev/null 2>&1; then + log_msg "Successfully remuxed: $(basename "$mkv_file") -> $(basename "$mp4_file")" + rm -f "$mkv_file" + [ -f "${mkv_file}.thumb" ] && mv "${mkv_file}.thumb" "${mp4_file}.thumb" + [ -f "${mkv_file%.mkv}.jpg" ] && mv "${mkv_file%.mkv}.jpg" "${mp4_file%.mkv}.jpg" + else + log_msg "ERROR: Failed to convert $mkv_file" + fi +done + +# ============================================================================== +# 2. LOCAL CLEANUP (Batch Trim down to 9GB) +# ============================================================================== +log_msg "--- Starting Local Disk Cleanup Check ---" +CURRENT_SIZE=$(du -s "$LOCAL_DIR" | awk '{print $1}') +log_msg "Current local disk space utilization: ${CURRENT_SIZE} KB" + +if [ "$CURRENT_SIZE" -gt "$MAX_SIZE_KB" ]; then + BYTES_TO_FREE=$(( (CURRENT_SIZE - MAX_SIZE_KB) * 1024 )) + log_msg "Storage exceeds 9GB. Need to purge ~${BYTES_TO_FREE} bytes..." + + # Gather files sorted by age and delete in a single stream pass + FREED=0 + DELETED_COUNT=0 + while IFS= read -r line; do + FILE_SIZE=$(echo "$line" | awk '{print $1}') + FILE_PATH=$(echo "$line" | cut -d' ' -f2-) + + rm -f "$FILE_PATH" + FREED=$((FREED + FILE_SIZE)) + ((DELETED_COUNT++)) + + if [ "$FREED" -ge "$BYTES_TO_FREE" ]; then + break + fi + done < <(find "$LOCAL_DIR" -type f \( -name "*.mp4" -o -name "*.thumb" -o -name "*.jpg" \) -printf "%s %p\n" | sort -n) + + log_msg "Cleaned up $DELETED_COUNT oldest local file(s)." +fi + +# Clean empty date subdirectories +find "$LOCAL_DIR" -mindepth 2 -type d -empty -delete 2>/dev/null +log_msg "--- Finished Local Cleanup Check ---" + +# ============================================================================== +# 3. SYNC TO BOX (Reflects local 9GB state & deletes missing remote files) +# ============================================================================== +log_msg "Syncing local storage to Box (purging remote deleted files)..." + +rclone sync "$LOCAL_DIR" "$RCLONE_TARGET" \ + --include "*.mp4" \ + --include "*.jpg" \ + --include "*.thumb" \ + --transfers 8 \ + --checkers 16 \ + --fast-list \ + -P 2>&1 | tee -a "$LOG" + +if [ ${PIPESTATUS[0]} -eq 0 ]; then + log_msg "Rclone sync completed successfully." +else + log_msg "ERROR: Rclone sync encountered errors." +fi + +log_msg "--- Finished Sync & Housekeeping ---" \ No newline at end of file