Files
2026-04-29 07:52:29 +07:00

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