Files
Varaverk/Orchestrators/media_management.sh
T

177 lines
6.5 KiB
Bash

#!/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"
acquire_lock
[[ "$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