play_state_sync.sh:
- Add detect_hosts() call so TRANSCODE_SERVERS alias is populated
- Switch MEDIA_SERVERS → TRANSCODE_SERVERS (correct array name from host*.conf)
- Fix malformed jq fallback in combine step (was {"} now handled with if/else)
- Skip placeholder API keys in _add_server
load_config.sh:
- Replace 'for x in $(ls glob)' with 'while read < <(printf glob | sort)'
so paths with spaces (e.g. dev workspace) don't get word-split
97 lines
5.6 KiB
Bash
97 lines
5.6 KiB
Bash
#!/bin/bash
|
|
# ==============================================================================================
|
|
# ================================= CONFIGURATION LOADER =======================================
|
|
# ==============================================================================================
|
|
# Single entry point for all configuration sourcing across the ecosystem.
|
|
# Every script sources this file instead of sourcing master.conf files directly.
|
|
#
|
|
# ── HOW IT WORKS ──────────────────────────────────────────────────────────────────────────────
|
|
# 1. Sources master.conf (shared config — hostnames, thresholds, toggles, profiles, job lists)
|
|
# 2. Auto-discovers and sources all host*.conf files in the same directory
|
|
# Each host conf extends the shared profile arrays and adds host-specific credentials
|
|
# 3. Sources common.sh (shared functions — detect_hosts, logging, notifications etc.)
|
|
#
|
|
# ── WHY THIS EXISTS ───────────────────────────────────────────────────────────────────────────
|
|
# Without this loader every script had to explicitly source each conf file:
|
|
# source master.conf
|
|
# source host1.conf
|
|
# source host2.conf
|
|
# source common.sh
|
|
#
|
|
# Adding a new server meant updating every script.
|
|
# With this loader — add host3.conf to the git repo and every server
|
|
# auto-discovers it on next git pull. Zero script changes required. Ever.
|
|
#
|
|
# ── ADDING A NEW SERVER ───────────────────────────────────────────────────────────────────────
|
|
# 1. Create Configurations/host3.conf following the same structure as HOST1/HOST2
|
|
# 2. Commit and push to git repo
|
|
# 3. All servers pull it automatically — no other changes needed
|
|
#
|
|
# ── USAGE IN SCRIPTS ──────────────────────────────────────────────────────────────────────────
|
|
# Replace the three source lines at the top of every script with:
|
|
#
|
|
# SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
# source "$SCRIPT_DIR/../load_config.sh"
|
|
#
|
|
# Scripts in subdirectories (Rsync/, Docker_Essentials/ etc.) use ../ to reach root.
|
|
# Scripts in root directory use ./ instead:
|
|
#
|
|
# SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
# source "$SCRIPT_DIR/load_config.sh"
|
|
#
|
|
# ── SPARSE CHECKOUT NOTE ──────────────────────────────────────────────────────────────────────
|
|
# Sparse checkout controls which host*.conf files each server receives.
|
|
# HOST1 only pulls Configurations/host1.conf — never HOST2's credentials.
|
|
# HOST2 only pulls Configurations/host2.conf — never HOST1's credentials.
|
|
# This loader sources whatever conf files ARE present — sparse checkout handles the rest.
|
|
# Both servers pull all non-credential conf files (Configurations/master.conf, common.sh, load_config.sh).
|
|
#
|
|
# ==============================================================================================
|
|
|
|
# ━━━ Locate config root ━━━
|
|
# load_config.sh always lives in the repo root.
|
|
# Scripts call it from subdirectories using ../ — resolve to the actual root.
|
|
LOAD_CONFIG_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
|
# ━━━ Source shared config ━━━
|
|
# master.conf must be sourced first — it declares the shared PROFILE_* arrays
|
|
# that Host confs extend. Sourcing host confs before master.conf would fail.
|
|
if [[ ! -f "$LOAD_CONFIG_DIR/Configurations/master.conf" ]]; then
|
|
echo "[FATAL] master.conf not found at $LOAD_CONFIG_DIR/Configurations/master.conf" >&2
|
|
echo "[FATAL] Check TARGET_DIR and git pull status" >&2
|
|
exit 1
|
|
fi
|
|
source "$LOAD_CONFIG_DIR/Configurations/master.conf"
|
|
|
|
# ━━━ Auto-discover and source all host*.conf files ━━━
|
|
# Sorted for consistent load order — HOST1 before HOST2 before HOST3 etc.
|
|
# Each host conf extends the shared PROFILE_* arrays and adds host-specific vars.
|
|
# Missing files are silently skipped — sparse checkout intentionally withholds some.
|
|
# At least one host conf must be present or the ecosystem has no identity to work with.
|
|
_host_confs_loaded=0
|
|
|
|
# Use a sorted array glob — avoids word-splitting on paths with spaces
|
|
while IFS= read -r _conf; do
|
|
[[ -f "$_conf" ]] || continue
|
|
source "$_conf"
|
|
(( _host_confs_loaded++ ))
|
|
[[ "${ENABLE_LOGGING:-false}" == "true" ]] && \
|
|
echo "[LOG] Loaded host config: $(basename "$_conf")" >&2
|
|
done < <(printf '%s\n' "$LOAD_CONFIG_DIR/Configurations"/host*.conf 2>/dev/null | sort)
|
|
|
|
if [[ "$_host_confs_loaded" -eq 0 ]]; then
|
|
echo "[FATAL] No host*.conf files found in $LOAD_CONFIG_DIR" >&2
|
|
echo "[FATAL] At least one host conf required — check git pull and sparse checkout" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# ━━━ Source shared functions ━━━
|
|
# common.sh sourced last — it calls detect_hosts() which needs HOST* vars to be set.
|
|
if [[ ! -f "$LOAD_CONFIG_DIR/common.sh" ]]; then
|
|
echo "[FATAL] common.sh not found at $LOAD_CONFIG_DIR/common.sh" >&2
|
|
exit 1
|
|
fi
|
|
source "$LOAD_CONFIG_DIR/common.sh"
|
|
|
|
# ━━━ Cleanup ━━━
|
|
unset _conf _host_confs_loaded LOAD_CONFIG_DIR |