95 lines
2.3 KiB
Bash
Executable File
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
|