#!/bin/bash
# h42 pihole – lokale DNS-Einträge im Pi-hole (dns.hosts), damit LAN-Clients direkt auf hov4 gehen.
#   h42 pihole add <fqdn> [ip]   (Default-IP: $LAN_IP)
#   h42 pihole del <fqdn>
#   h42 pihole exists <fqdn>   Exit 0: vorhanden, 3: nicht vorhanden, sonst: nicht prüfbar
#   h42 pihole list
# add/del melden, wenn der Eintrag schon vorhanden bzw. nicht vorhanden ist (Exit 0); abweichende IP bei add wird ersetzt.
set -euo pipefail
. "${H42_LIB:-/usr/lib/h42}/common.sh"

ftl() { docker exec "$PIHOLE_CONTAINER" pihole-FTL --config dns.hosts "$@"; }
current() { ftl | tr -d '[],' | sed 's/^ *//; s/ *$//' | awk 'NF{for(i=1;i<=NF;i+=2) print $i" "$(i+1)}'; }
write() { ftl "$(jq -R . | jq -sc .)" >/dev/null; }
ips_of() { awk -v f="$1" '$2==f{print $1}'; }    # stdin: Einträge aus current
without() { awk -v f="$1" 'NF && $2!=f'; }       # NF: keine Leerzeile aus einer leeren Liste zurückschreiben

case ${1:-} in
  add)  fqdn=${2:?fqdn fehlt}; ip=${3:-$LAN_IP}
        entries=$(current); have=$(ips_of "$fqdn" <<<"$entries")
        if [ "$have" = "$ip" ]; then echo "$ip $fqdn ist im Pi-hole schon vorhanden"; exit 0; fi
        if [ -n "$have" ]; then echo "$fqdn ist im Pi-hole schon vorhanden und wird ersetzt: $(paste -sd, <<<"$have")"; fi
        { without "$fqdn" <<<"$entries"; echo "$ip $fqdn"; } | write; echo "$ip $fqdn (Pi-hole)" ;;
  del)  fqdn=${2:?fqdn fehlt}
        entries=$(current); have=$(ips_of "$fqdn" <<<"$entries")
        if [ -z "$have" ]; then echo "$fqdn ist im Pi-hole nicht vorhanden"; exit 0; fi
        without "$fqdn" <<<"$entries" | write; echo "$fqdn aus Pi-hole entfernt (war: $(paste -sd, <<<"$have"))" ;;
  exists) fqdn=${2:?fqdn fehlt}
        entries=$(current); have=$(ips_of "$fqdn" <<<"$entries")
        [ -n "$have" ] || exit 3 ;;
  list) current ;;
  *)    usage ;;
esac
