#!/usr/bin/bash # # sync-zones.sh — rsync-based zone replication from primary to secondary # # Runs on the SECONDARY (netinfra-02). Syncs the zones/ directory from the # primary (netinfra-01) every 60 seconds. When a zone file changes, Technitium # detects the modification and reloads automatically. # # This is used instead of AXFR-based zone transfer because Technitium's zone # transfer mechanism uses port 53 (standard DNS), but on the netinfra hosts # port 53 is Pi-hole and Technitium is on port 5300. rsync-based replication # avoids the port conflict entirely. # # Install as a systemd service/timer or run via cron: # * * * * * /home/localuser/services/technitium/sync-zones.sh # set -uo pipefail PRIMARY_HOST="${PRIMARY_HOST:-pfv-netinfra-01.knel.net}" CONFIG_DIR="${CONFIG_DIR:-/home/localuser/services/technitium/config}" ZONE_DIR="$CONFIG_DIR/zones" LOCK_FILE="/tmp/technitium-zone-sync.lock" LOG_FILE="${LOG_FILE:-/home/localuser/services/technitium/sync.log}" log() { printf '[%s] %s\n' "$(date +%H:%M:%S)" "$*" >> "$LOG_FILE"; } # Prevent overlapping runs exec 9>"$LOCK_FILE" || exit 0 flock -n 9 || { log "another sync is running; skipping"; exit 0; } mkdir -p "$ZONE_DIR" # rsync zones from primary. Use --temp-dir to avoid partial writes being # picked up by Technitium, and --delete to remove zones deleted on primary. log "Syncing zones from $PRIMARY_HOST..." if rsync -az --delete --temp-dir=/tmp \ "${PRIMARY_HOST}:$ZONE_DIR/" "$ZONE_DIR/" >> "$LOG_FILE" 2>&1; then zone_count=$(ls "$ZONE_DIR" | wc -l) log "Sync complete: $zone_count zones" else log "ERROR: rsync failed (rc=$?)" exit 1 fi