#!/bin/sh set -u INTERVAL_MINUTES="${SYNC_INTERVAL:-1}" APPLY_MODE="${DNS_SYNC_APPLY:-false}" STATE_DB="${DNS_SYNC_STATE_DB:-/var/lib/dns-sync/state.sqlite3}" MAX_CHANGES="${DNS_SYNC_MAX_CHANGES:-}" case "$INTERVAL_MINUTES" in ''|*[!0-9]*) echo "ERROR: SYNC_INTERVAL must be an integer number of minutes" >&2 exit 1 ;; esac if [ "$INTERVAL_MINUTES" -lt 1 ]; then echo "ERROR: SYNC_INTERVAL must be at least 1 minute" >&2 exit 1 fi case "$(printf '%s' "$APPLY_MODE" | tr '[:upper:]' '[:lower:]')" in 1|true|yes|on) APPLY_MODE=true ;; 0|false|no|off) APPLY_MODE=false ;; *) echo "ERROR: DNS_SYNC_APPLY must be true or false" >&2 exit 1 ;; esac if [ -n "$MAX_CHANGES" ]; then case "$MAX_CHANGES" in *[!0-9]*) echo "ERROR: DNS_SYNC_MAX_CHANGES must be a non-negative integer" >&2 exit 1 ;; esac fi INTERVAL_SECONDS=$((INTERVAL_MINUTES * 60)) sleep_pid="" shutdown() { echo "Stopping DNS sync service..." [ -z "$sleep_pid" ] || kill "$sleep_pid" 2>/dev/null || true exit 0 } trap shutdown INT TERM run_reconcile() { if [ "$APPLY_MODE" = true ]; then if [ -n "$MAX_CHANGES" ]; then python -m dns_sync reconcile \ --state-db "$STATE_DB" \ --apply \ --max-changes "$MAX_CHANGES" else python -m dns_sync reconcile \ --state-db "$STATE_DB" \ --apply fi else python -m dns_sync reconcile \ --state-db "$STATE_DB" fi } echo "DNS sync service started" echo "Sync interval: ${INTERVAL_MINUTES} minute(s)" echo "Reconciliation mode: $([ "$APPLY_MODE" = true ] && echo APPLY || echo READ-ONLY)" echo "State database: ${STATE_DB}" echo "Enabled plugins: ${ENABLED_PLUGINS:-npm}" echo "External plugin path: ${DNS_SYNC_PLUGIN_PATH:-/plugins}" while :; do echo echo "=== DNS reconciliation: $(date -Iseconds) ===" if run_reconcile; then echo "Reconciliation run completed successfully" else rc=$? echo "ERROR: Reconciliation run failed with exit code ${rc}" >&2 fi sleep "$INTERVAL_SECONDS" & sleep_pid=$! wait "$sleep_pid" || true sleep_pid="" done