71 lines
2.0 KiB
Bash
71 lines
2.0 KiB
Bash
#!/bin/bash
|
|
# wg-sync-watch.sh — Watches wg0.conf for changes with debounce
|
|
# Fixed: proper debounce, error isolation, health reporting
|
|
|
|
set -uo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
source "${SCRIPT_DIR}/wg-policy-lib.sh"
|
|
|
|
SYNC_SCRIPT="/usr/local/bin/wg-sync-policy.sh"
|
|
ENGINE_SCRIPT="/usr/local/bin/wg-policy-engine.sh"
|
|
HEALTH_INTERVAL=300 # Health check every 5 minutes
|
|
LAST_HEALTH=0
|
|
|
|
# === Validate prerequisites ===
|
|
if ! command -v inotifywait &>/dev/null; then
|
|
log_error "inotifywait not found. Install: apt install inotify-tools"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -f "$WG_CONF" ]]; then
|
|
log_error "WireGuard config not found: $WG_CONF"
|
|
exit 1
|
|
fi
|
|
|
|
# === Main watcher loop ===
|
|
log_info "Monitoring $WG_CONF for changes (debounce: ${DEBOUNCE_SEC}s)..."
|
|
log_info "Health check interval: ${HEALTH_INTERVAL}s"
|
|
|
|
inotifywait -m -e close_write,move,create \
|
|
--format '%e %f' \
|
|
"$(dirname "$WG_CONF")" 2>/dev/null | \
|
|
while read -r events filename; do
|
|
|
|
# Only react to wg0.conf changes
|
|
[[ "$filename" != "$(basename "$WG_CONF")" ]] && continue
|
|
|
|
log_info "Detected change: $events $filename"
|
|
|
|
# Debounce: wait until no more events for DEBOUNCE_SEC
|
|
while IFS= read -r -t "$DEBOUNCE_SEC" _dummy; do
|
|
: # Drain events within debounce window
|
|
done
|
|
|
|
log_info "Debounce complete, applying changes..."
|
|
|
|
# Run sync
|
|
if retry "$SYNC_SCRIPT"; then
|
|
log_info "Sync successful, running engine..."
|
|
|
|
# Run engine with retry
|
|
if retry "$ENGINE_SCRIPT"; then
|
|
log_info "Policy engine applied successfully"
|
|
else
|
|
log_error "Policy engine FAILED after retries"
|
|
fi
|
|
else
|
|
log_error "Policy sync FAILED after retries"
|
|
fi
|
|
|
|
# Periodic health check
|
|
local now
|
|
now=$(date +%s)
|
|
if (( now - LAST_HEALTH >= HEALTH_INTERVAL )); then
|
|
LAST_HEALTH=$now
|
|
log_info "=== Periodic Health Check ==="
|
|
health_check || log_warn "Health check reported issues"
|
|
fi
|
|
|
|
done
|