Archived
61 lines
2.8 KiB
Bash
Executable File
61 lines
2.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Apply a Pi-hole configuration directory to a destination Pi-hole instance.
|
|
#
|
|
# Usage: apply-config.sh <source-dir> <dest-host>
|
|
# 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") <source-dir> <dest-host>" >&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."
|