initial commit
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user