#!/bin/bash # ----------------------------------------------------------------------------------------------- # --------------------------------- Daily Sync Orchestrator ------------------------------------ # ----------------------------------------------------------------------------------------------- # Runs all bulk media shares sequentially. Scheduled via unRAID User Scripts plugin at 1am. # Per-share rsync handled by rsync.sh — this script tracks pass/fail and total time only. # Add or remove shares in Master.conf under DAILY_SYNC_SHARES. # ----------------------------------------------------------------------------------------------- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "$SCRIPT_DIR/../Master.conf" source "$SCRIPT_DIR/../common.sh" RSYNC_SCRIPT="$SCRIPT_DIR/../Rsync/rsync.sh" # ----------------------------------------------------------------------------------------------- # ━━━ $ICON_GEAR Setup ━━━ # ----------------------------------------------------------------------------------------------- echo "" echo "━━━ $ICON_GEAR Setup ━━━" detect_hosts resolve_remote_ip # ----------------------------------------------------------------------------------------------- # ━━━ $ICON_SHIELD Pre-flight Checks ━━━ # ----------------------------------------------------------------------------------------------- echo "" echo "━━━ $ICON_SHIELD Pre-flight Checks ━━━" # Single connectivity and rootfs check upfront — fail fast before attempting all shares # Individual share and disk checks run per-share inside rsync.sh check_connectivity check_remote_rootfs # ----------------------------------------------------------------------------------------------- # Tracking # ----------------------------------------------------------------------------------------------- PASS=() FAIL=() SHARE_TIMES=() TOTAL_START=$(date +%s) # Build combined share list — media shares + personal shares for this host ALL_SHARES=("${DAILY_SYNC_SHARES[@]}") if [[ "$LOCAL_SERVER_NAME" == "$HOST1" ]]; then for share in "${HOST1_PERSONAL_SHARES[@]}"; do [[ -n "$share" ]] && ALL_SHARES+=("$share") done elif [[ "$LOCAL_SERVER_NAME" == "$HOST2" ]]; then for share in "${HOST2_PERSONAL_SHARES[@]}"; do [[ -n "$share" ]] && ALL_SHARES+=("$share") done fi SHARE_COUNT=${#ALL_SHARES[@]} # ----------------------------------------------------------------------------------------------- # ━━━ $ICON_SYNC Transfer ━━━ # ----------------------------------------------------------------------------------------------- echo "" echo "━━━ $ICON_SYNC Daily Sync Starting — $(date '+%Y-%m-%d %H:%M:%S') ━━━" echo "$ICON_SUMMARY Shares: $SHARE_COUNT" echo "" SHARE_INDEX=0 for SHARE in "${ALL_SHARES[@]}"; do SHARE_INDEX=$((SHARE_INDEX + 1)) SHARE_NAME=$(basename "$SHARE") SHARE_START=$(date +%s) echo "━━━ $ICON_SYNC Share $SHARE_INDEX of $SHARE_COUNT: $SHARE_NAME ━━━" if bash "$RSYNC_SCRIPT" "$SHARE"; then SHARE_END=$(date +%s) SHARE_TIMES+=("$SHARE_NAME:$((SHARE_END - SHARE_START))") PASS+=("$SHARE_NAME") echo "$ICON_DONE $SHARE_NAME complete" else SHARE_END=$(date +%s) SHARE_TIMES+=("$SHARE_NAME:$((SHARE_END - SHARE_START))") FAIL+=("$SHARE_NAME") error "$SHARE_NAME failed — continuing to next share" fi echo "" done TOTAL_END=$(date +%s) TOTAL_DURATION=$((TOTAL_END - TOTAL_START)) # ----------------------------------------------------------------------------------------------- # ━━━ $ICON_SUMMARY Summary ━━━ # ----------------------------------------------------------------------------------------------- echo "━━━━━ $ICON_SUMMARY DAILY SYNC SUMMARY ━━━━━" echo "$ICON_TIME Started: $(date -d @$TOTAL_START '+%Y-%m-%d %H:%M:%S')" echo "$ICON_TIME Finished: $(date -d @$TOTAL_END '+%Y-%m-%d %H:%M:%S')" echo "" for entry in "${SHARE_TIMES[@]}"; do SHARE_NAME="${entry%%:*}" DURATION="${entry##*:}" if printf '%s\n' "${FAIL[@]}" | grep -qx "$SHARE_NAME"; then echo " $ICON_ERROR $SHARE_NAME — $(format_duration $DURATION)" else echo " $ICON_DONE $SHARE_NAME — $(format_duration $DURATION)" fi done echo "" echo " $ICON_SUCCESS Passed: ${#PASS[@]}/$SHARE_COUNT" echo " $ICON_ERROR Failed: ${#FAIL[@]}/$SHARE_COUNT" echo " $ICON_TIME Duration: $(format_duration $TOTAL_DURATION)" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" if [[ ${#FAIL[@]} -gt 0 ]]; then notify "Daily sync completed with failures — ${#FAIL[@]}/$SHARE_COUNT failed: ${FAIL[*]}" "Daily Sync" "warning" exit 1 else notify "Daily sync complete — ${#PASS[@]}/$SHARE_COUNT shares in $(format_duration $TOTAL_DURATION)" "Daily Sync" "normal" exit 0 fi