#!/bin/sh
# AnyDNS – certbot-Hook für Let's-Encrypt-Zertifikate über DNS (ohne offenen Port, auch Wildcard)
#
# Einrichten:
#   1. Im AnyDNS-Kundencenter unter „Zertifikate“ einen Zugang für den Hostnamen anlegen.
#   2. Zugangsdaten nach /etc/letsencrypt/anydns.ini schreiben (chmod 600):
#        ANYDNS_USER=…            (Benutzer / username)
#        ANYDNS_KEY=…             (Schlüssel / password)
#        ANYDNS_SUBDOMAIN=…       (Subdomain)
#   3. Dieses Skript nach /usr/local/bin/anydns-certbot-hook.sh kopieren, chmod 755.
#   4. certbot certonly --manual --preferred-challenges dns \
#        --manual-auth-hook /usr/local/bin/anydns-certbot-hook.sh \
#        -d meinname.anydns.info -d '*.meinname.anydns.info'
#
# Das Skript setzt den Prüfwert und wartet, bis ALLE vier AnyDNS-Nameserver ihn ausliefern
# (höchstens 5 Minuten) – erst dann lässt certbot Let's Encrypt prüfen. Benötigt curl und dig
# (Debian/Ubuntu: apt install curl dnsutils). Ein Aufräum-Hook ist nicht nötig.

INI="${ANYDNS_INI:-/etc/letsencrypt/anydns.ini}"
[ -r "$INI" ] || { echo "AnyDNS: $INI fehlt oder ist nicht lesbar" >&2; exit 1; }
. "$INI"
: "${CERTBOT_DOMAIN:?Nur als certbot --manual-auth-hook aufrufen}" "${CERTBOT_VALIDATION:?}"

antwort=$(curl -sS --max-time 30 -X POST "https://anydns.info/acme-dns/update" \
    -H "X-Api-User: $ANYDNS_USER" -H "X-Api-Key: $ANYDNS_KEY" -H "Content-Type: application/json" \
    -d "{\"subdomain\":\"$ANYDNS_SUBDOMAIN\",\"txt\":\"$CERTBOT_VALIDATION\"}") || { echo "AnyDNS: keine Verbindung" >&2; exit 1; }
case "$antwort" in
    *"\"txt\""*) ;;
    *) echo "AnyDNS: Prüfwert abgelehnt: $antwort" >&2; exit 1 ;;
esac

name="_acme-challenge.${CERTBOT_DOMAIN#\*.}"
ende=$(( $(date +%s) + 300 ))
while [ "$(date +%s)" -lt "$ende" ]; do
    fehlt=0
    for ns in anydns.sw-comnizept.de ns2.sw-comnizept.de ns3.sw-comnizept.de ns4.sw-comnizept.de; do
        dig +short +time=3 +tries=1 TXT "$name" "@$ns" | grep -q -- "$CERTBOT_VALIDATION" || fehlt=1
    done
    [ "$fehlt" = 0 ] && exit 0
    sleep 10
done
echo "AnyDNS: Prüfwert nach 5 Minuten noch nicht auf allen Nameservern – certbot versucht es trotzdem" >&2
exit 0
