#!/usr/bin/env bash # Apply a Pi-hole configuration directory to a destination Pi-hole instance. # # Usage: apply-config.sh # source-dir Local directory containing config files (as written by pull-config.sh) # dest-host SSH-reachable hostname or IP of the destination Pi-hole # # Example: # ./apply-config.sh ./config root@pihole-new # ./apply-config.sh /backup/pihole-20260723 root@192.168.2.101 # # The destination Pi-hole must already have Pi-hole v6 installed. # pihole-FTL is restarted at the end to apply the new config. set -euo pipefail usage() { echo "Usage: $(basename "$0") " >&2 echo " source-dir Local directory with config files (from pull-config.sh)" >&2 echo " dest-host SSH target for the destination Pi-hole (e.g. root@pihole)" >&2 exit 1 } [[ $# -eq 2 ]] || usage SOURCE="$1" DEST="$2" [[ -d "${SOURCE}" ]] || { echo "Error: source directory '${SOURCE}' not found" >&2; exit 1; } [[ -f "${SOURCE}/pihole.toml" ]] || { echo "Error: '${SOURCE}/pihole.toml' not found — is this a valid config dir?" >&2; exit 1; } echo "Applying Pi-hole config from ${SOURCE} → ${DEST}" # ── Verify destination is running Pi-hole ────────────────────────────────────── ssh "${DEST}" "command -v pihole-FTL >/dev/null 2>&1 || { echo 'pihole-FTL not found on destination'; exit 1; }" # ── pihole.toml ──────────────────────────────────────────────────────────────── echo " pihole.toml" ssh "${DEST}" "cp /etc/pihole/pihole.toml /etc/pihole/pihole.toml.pre-apply 2>/dev/null || true" scp "${SOURCE}/pihole.toml" "${DEST}:/etc/pihole/pihole.toml" ssh "${DEST}" "chown pihole:pihole /etc/pihole/pihole.toml; chmod 640 /etc/pihole/pihole.toml" # ── custom dnsmasq drop-ins ──────────────────────────────────────────────────── if [[ -d "${SOURCE}/dnsmasq.d" ]] && [[ -n "$(ls "${SOURCE}/dnsmasq.d/"*.conf 2>/dev/null)" ]]; then echo " dnsmasq.d/ (custom drop-ins)" for f in "${SOURCE}/dnsmasq.d/"*.conf; do name="$(basename "$f")" echo " ${name}" scp "${f}" "${DEST}:/etc/dnsmasq.d/${name}" done fi # ── Restart pihole-FTL ───────────────────────────────────────────────────────── echo " Restarting pihole-FTL" ssh "${DEST}" "systemctl restart pihole-FTL" sleep 2 ssh "${DEST}" "systemctl is-active pihole-FTL" echo "Done. Config applied to ${DEST}." echo "Note: gravity (blocklists) is not transferred — run 'pihole updateGravity' on ${DEST} to rebuild."