74 lines
2.2 KiB
Bash
Executable File
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."
|