claude-home/server-configs/caddy-migration/scripts/caddy-pihole-sync.sh
Cal Corum c08e779e42 docs: add caddy migration config, tdarr flow backup, and troubleshooting updates
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 13:13:21 -05:00

74 lines
2.2 KiB
Bash
Executable File

#!/bin/bash
# caddy-pihole-sync.sh
# Syncs all domain names from Caddyfile to Pi-hole local DNS entries.
# Replaces the NPM SQLite-based sync script.
#
# Usage:
# ./caddy-pihole-sync.sh [--dry-run]
#
# Reads the Caddyfile, extracts domain blocks, and writes local DNS
# entries to both Pi-holes pointing all domains to the Caddy host IP.
set -euo pipefail
CADDY_IP="10.10.0.16"
CADDYFILE="/home/cal/caddy/Caddyfile"
PRIMARY_PIHOLE_CONTAINER="pihole"
SECONDARY_PIHOLE_HOST="ubuntu-manticore"
SECONDARY_PIHOLE_CONTAINER="pihole"
CUSTOM_LIST_PATH="/etc/pihole/custom.list"
DRY_RUN=false
if [[ "${1:-}" == "--dry-run" ]]; then
DRY_RUN=true
fi
# Extract domain names from Caddyfile site blocks
# Matches lines like "subdomain.manticorum.com {" at the start of a block
extract_domains() {
grep -oP '^[a-zA-Z0-9._-]+\.manticorum\.com' "$CADDYFILE" | sort -u
}
DOMAINS=$(extract_domains)
if [[ -z "$DOMAINS" ]]; then
echo "ERROR: No domains found in $CADDYFILE"
exit 1
fi
echo "=== Caddy -> Pi-hole DNS Sync ==="
echo "Caddy IP: $CADDY_IP"
echo "Domains found: $(echo "$DOMAINS" | wc -l)"
echo ""
# Build custom.list content (Pi-hole local DNS format: "IP domain")
CUSTOM_ENTRIES=""
while IFS= read -r domain; do
CUSTOM_ENTRIES+="${CADDY_IP} ${domain}"$'\n'
echo " ${CADDY_IP} -> ${domain}"
done <<< "$DOMAINS"
if $DRY_RUN; then
echo ""
echo "[DRY RUN] Would write to both Pi-holes:"
echo "$CUSTOM_ENTRIES"
exit 0
fi
echo ""
# Sync to primary Pi-hole (local container)
echo "Syncing to primary Pi-hole..."
echo "$CUSTOM_ENTRIES" | docker exec -i "$PRIMARY_PIHOLE_CONTAINER" tee "$CUSTOM_LIST_PATH" > /dev/null
docker exec "$PRIMARY_PIHOLE_CONTAINER" pihole restartdns reload
echo " Primary Pi-hole updated."
# Sync to secondary Pi-hole (remote host)
echo "Syncing to secondary Pi-hole ($SECONDARY_PIHOLE_HOST)..."
echo "$CUSTOM_ENTRIES" | ssh "$SECONDARY_PIHOLE_HOST" "docker exec -i $SECONDARY_PIHOLE_CONTAINER tee $CUSTOM_LIST_PATH > /dev/null"
ssh "$SECONDARY_PIHOLE_HOST" "docker exec $SECONDARY_PIHOLE_CONTAINER pihole restartdns reload"
echo " Secondary Pi-hole updated."
echo ""
echo "Sync complete. $(echo "$DOMAINS" | wc -l) domains pointed to $CADDY_IP on both Pi-holes."