101 lines
3.5 KiB
Bash
101 lines
3.5 KiB
Bash
#!/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 \
|
|
-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 ---" |