Files

95 lines
2.3 KiB
Bash
Executable File

#!/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