File: //usr/local/bin/dns-sync.sh
#!/bin/bash
# DNS Sync Script - Replicates DNS records from houston to ns1, ns2, ns3
# Run via cron every 5 minutes: */5 * * * * /usr/local/bin/dns-sync.sh
LOGFILE="/var/log/dns-sync.log"
LOCKFILE="/tmp/dns-sync.lock"
NAMESERVERS="91.99.165.130 5.223.58.55 5.161.96.70"
# Prevent concurrent runs
if [ -f "$LOCKFILE" ]; then
exit 0
fi
trap "rm -f $LOCKFILE" EXIT
touch "$LOCKFILE"
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOGFILE"
}
log "Starting DNS sync..."
# Export DNS tables from houston
DUMP_FILE="/tmp/dns_records_dump.sql"
mysqldump --single-transaction --quick \
--no-create-info --replace \
cyberpanel domains records domainmetadata \
2>/dev/null > "$DUMP_FILE"
if [ ! -s "$DUMP_FILE" ]; then
log "ERROR: Failed to dump DNS tables"
exit 1
fi
# Sync to each nameserver
for NS in $NAMESERVERS; do
log "Syncing to $NS..."
# Transfer and import
if scp -q "$DUMP_FILE" root@$NS:/tmp/dns_records_dump.sql 2>/dev/null; then
ssh -o ConnectTimeout=10 root@$NS "mysql cyberpanel < /tmp/dns_records_dump.sql && pdns_control reload && rm /tmp/dns_records_dump.sql" 2>/dev/null
if [ $? -eq 0 ]; then
log " ✓ $NS synced successfully"
else
log " ✗ $NS import failed"
fi
else
log " ✗ $NS transfer failed"
fi
done
# Cleanup
rm -f "$DUMP_FILE"
log "DNS sync completed"