#!/bin/bash # Ensure log directory exists mkdir -p /home/$USER/logs LOG="/home/$USER/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 -L \ -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 ---"