#!/bin/bash # ----------------------------------------------------------------------------------------------- # --------------------------------- Media Management Orchestrator ------------------------------ # ----------------------------------------------------------------------------------------------- # Runs all media maintenance scripts sequentially in the order defined in Master.conf. # Each job in MEDIA_MAINTENANCE_JOBS is a script path with an optional argument. # Scripts are resolved relative to the ecosystem root directory. # # To add a new job — edit MEDIA_MAINTENANCE_JOBS in Master.conf: # "Media/my_new_script.sh" — script with no argument # "Media/media_cleaner.sh profile" — script with argument # # Order matters — permissions runs before cleaners so files are correctly owned first. # Each job runs independently — a failure in one does not stop the others. # Supports --dry-run — passes through to all child scripts. # ----------------------------------------------------------------------------------------------- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ECOSYSTEM_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" source "$ECOSYSTEM_ROOT/Master.conf" source "$ECOSYSTEM_ROOT/common.sh" parse_args "$@" # ----------------------------------------------------------------------------------------------- # ━━━ $ICON_GEAR Setup ━━━ # ----------------------------------------------------------------------------------------------- echo "" echo "━━━ $ICON_GEAR Setup ━━━" if [[ "$EUID" -ne 0 ]]; then error "Must be run as root" exit 1 fi success "Running as root" [[ "$DRY_RUN" == true ]] && warn "DRY RUN — passing --dry-run to all child scripts" # Validate job list if [[ ${#MEDIA_MAINTENANCE_JOBS[@]} -eq 0 ]]; then warn "MEDIA_MAINTENANCE_JOBS is empty in Master.conf — nothing to run" exit 0 fi # ----------------------------------------------------------------------------------------------- # ━━━ $ICON_SUMMARY Status ━━━ # ----------------------------------------------------------------------------------------------- if [[ "$SHOW_STATUS" == true ]]; then echo "" echo "━━━━━ $ICON_SUMMARY STATUS ━━━━━" echo "$ICON_CLEAN Jobs to run: ${#MEDIA_MAINTENANCE_JOBS[@]}" local_idx=1 for job in "${MEDIA_MAINTENANCE_JOBS[@]}"; do echo " $local_idx. $job" ((local_idx++)) done echo "$ICON_GEAR Dry Run: $DRY_RUN" echo "━━━━━━━━━━━━━━━━━━━━━━━" exit 0 fi # ----------------------------------------------------------------------------------------------- # Tracking # ----------------------------------------------------------------------------------------------- PASS=() FAIL=() JOB_TIMES=() TOTAL_START=$(date +%s) # ----------------------------------------------------------------------------------------------- # JOB RUNNER # Splits each MEDIA_MAINTENANCE_JOBS entry into script path + optional argument. # Resolves script relative to ecosystem root. Passes --dry-run if active. # Records pass/fail and duration for summary. # ----------------------------------------------------------------------------------------------- run_job() { local entry="$1" # Split entry into script path and optional argument local script_rel arg="" read -r script_rel arg <<< "$entry" local script="$ECOSYSTEM_ROOT/$script_rel" local label label="$(basename "$script_rel" .sh)${arg:+ $arg}" local job_start job_start=$(date +%s) echo "" echo "━━━ $ICON_CLEAN $label ━━━" if [[ ! -f "$script" ]]; then error "$script not found — skipping" FAIL+=("$label") JOB_TIMES+=("$label:0") return fi if [[ ! -x "$script" ]]; then warn "$script is not executable — attempting to fix" chmod +x "$script" fi local dry_flag="" [[ "$DRY_RUN" == true ]] && dry_flag="--dry-run" # Run script with optional argument and optional dry-run flag if bash "$script" $arg $dry_flag; then local job_end job_end=$(date +%s) PASS+=("$label") JOB_TIMES+=("$label:$((job_end - job_start))") success "$label complete" else local job_end job_end=$(date +%s) FAIL+=("$label") JOB_TIMES+=("$label:$((job_end - job_start))") error "$label failed — continuing to next job" fi } # ----------------------------------------------------------------------------------------------- # ━━━ $ICON_CLEAN Media Management ━━━ # ----------------------------------------------------------------------------------------------- echo "" echo "━━━ $ICON_CLEAN Media Management — $(date '+%Y-%m-%d %H:%M:%S') ━━━" echo "$ICON_SUMMARY Jobs: ${#MEDIA_MAINTENANCE_JOBS[@]}" echo "" JOB_INDEX=1 for job in "${MEDIA_MAINTENANCE_JOBS[@]}"; do info "Job $JOB_INDEX of ${#MEDIA_MAINTENANCE_JOBS[@]}: $job" run_job "$job" ((JOB_INDEX++)) done TOTAL_END=$(date +%s) TOTAL_DURATION=$((TOTAL_END - TOTAL_START)) JOB_COUNT=$(( ${#PASS[@]} + ${#FAIL[@]} )) # ----------------------------------------------------------------------------------------------- # ━━━ $ICON_SUMMARY Summary ━━━ # ----------------------------------------------------------------------------------------------- echo "" echo "━━━━━ $ICON_SUMMARY MEDIA MANAGEMENT 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 "${JOB_TIMES[@]}"; do label="${entry%%:*}" duration="${entry##*:}" if printf '%s\n' "${FAIL[@]}" | grep -qx "$label"; then echo " $ICON_ERROR $label — $(format_duration $duration)" else echo " $ICON_DONE $label — $(format_duration $duration)" fi done echo "" echo " $ICON_SUCCESS Passed: ${#PASS[@]}/$JOB_COUNT" echo " $ICON_ERROR Failed: ${#FAIL[@]}/$JOB_COUNT" echo " $ICON_TIME Duration: $(format_duration $TOTAL_DURATION)" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" if [[ ${#FAIL[@]} -gt 0 ]]; then notify "Media management completed with failures on $(hostname) — failed: ${FAIL[*]}" "Media Management" "warning" exit 1 else notify "Media management complete on $(hostname) — ${#PASS[@]}/$JOB_COUNT jobs in $(format_duration $TOTAL_DURATION)" "Media Management" "normal" exit 0 fi