Umfangreich kommentiert
This commit is contained in:
parent
142d604bf4
commit
60b920a3f1
|
|
@ -12,9 +12,17 @@
|
||||||
# Getestet wurde es mit Traefik 2.9 aber auch 1.7 sollte es laut Dokumentation unterstützen:
|
# Getestet wurde es mit Traefik 2.9 aber auch 1.7 sollte es laut Dokumentation unterstützen:
|
||||||
# https://doc.traefik.io/traefik/v1.7/configuration/acme/#provider
|
# https://doc.traefik.io/traefik/v1.7/configuration/acme/#provider
|
||||||
#################################################################################################################
|
#################################################################################################################
|
||||||
# Alle Konfigurationsparameter werden aus der config.env Datei gelesen
|
# Es wird dringend empfohlen mit neuem certresolver, nur einem Dienst und dem Staging CA zu arbeiten.
|
||||||
#############################################
|
#################################################################################################################
|
||||||
|
|
||||||
|
# Der Traefik Container kennt curl nicht, mit folgendem Befehl wird es installiert,
|
||||||
|
# Tipp hierfür habe ich von: https://community.traefik.io/t/using-external-program-for-dns-challenge-and-lets-encrypt/8072/12
|
||||||
apk add -U curl
|
apk add -U curl
|
||||||
|
|
||||||
|
# Alle Konfigurationsparameter werden aus der config.env Datei gelesen, diese Datei sowie das Skript müssen im
|
||||||
|
# Container bekannt sein. Ich habe beides in einem Configordner, den ich nach /etc/traefik durchreiche.
|
||||||
|
# für debug auf der eigenen Umgebung $configfile anpassen oder eine Kopie/Link der configfile auch lokal
|
||||||
|
# unter /etc/traefik ablegen
|
||||||
configfile="/etc/traefik/config.env"
|
configfile="/etc/traefik/config.env"
|
||||||
|
|
||||||
if [ ! -r "$configfile" ]; then
|
if [ ! -r "$configfile" ]; then
|
||||||
|
|
@ -22,6 +30,16 @@ if [ ! -r "$configfile" ]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# aus der configfile wird eine Zeile gesucht die mit "apitoken=" beginnt, der text direkt darauf gefolgt wird als apitoken
|
||||||
|
# interpretiert und sollte nicht leer sein, sonst bricht das skript ab.
|
||||||
|
# Der API-Token wird auf ipv64.net im Reiter "DynDNS" rechts im Account Status Block unter "API Key" generiert und angezeigt.
|
||||||
|
# Alternativ sieht man es auch an gleicher Stelle, wenn man auf den Account selbst geht.
|
||||||
|
# da API Aufrufe auf 64/24h limitiert sind, könnte man erste Versuche mit falschem Token machen
|
||||||
|
# Traefik würde dann folgende Fehlermeldung werfen (zumindest bei Loglevel debug):
|
||||||
|
# level=debug msg="fd=_acme-challenge.meinesub.domain.ipv64.net, domain=domain.ipv64.net, praefix=_acme-challenge.meinesub, content=abc..xyz"
|
||||||
|
# direkt gefolgt von:
|
||||||
|
# level=debug msg="{\"status\":\"401 Unauthorized\",\"info\":\"Unauthorized\"}"
|
||||||
|
# ich nutze graylog und filter dann nach "praefix"
|
||||||
apitoken=$(grep ^"apitoken=" "$configfile" | sed -e "s/apitoken=//")
|
apitoken=$(grep ^"apitoken=" "$configfile" | sed -e "s/apitoken=//")
|
||||||
|
|
||||||
if [ -z "$apitoken" ]; then
|
if [ -z "$apitoken" ]; then
|
||||||
|
|
@ -31,20 +49,31 @@ fi
|
||||||
|
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
# hier wird auf den ersten Parameter geprüft, present und cleanup gehören zum LEGO, debug habe ich ergänzt um eine Ausgabe ohne API Aufruf zu machen
|
||||||
|
# bis auf den curl Aufruf sind alle drei Blöcke gleich, daher wird alles nur einmal beschrieben
|
||||||
case "$1" in
|
case "$1" in
|
||||||
"present")
|
"present")
|
||||||
echo "Present"
|
echo "Present"
|
||||||
|
# Der FQDN im zweiten Übergabeparameter enthält am Ende ein Punkt, dieser wird nun entfernt, da sonst der API Aufruf nicht funktioniert.
|
||||||
full_domain=${2%"."}
|
full_domain=${2%"."}
|
||||||
|
# Nun wird von rechts beginnend 3 mal alles bis zum Punkt gemerkt, und so die registrierte dyndns Domain ermittelt. "sub.domain.ipv64.net" wird "domain.ipv64.net"
|
||||||
domain=$(echo $full_domain | rev | cut -d . -f -3 | rev)
|
domain=$(echo $full_domain | rev | cut -d . -f -3 | rev)
|
||||||
|
# Daraus wird nun der Präfix für den DNS Eintrag ermittelt indem beim full_domain von rechts ausgehend die Domain abgeschnitten wird. Aus "sub.domain.ipv64.net" wird "sub."
|
||||||
praefix=${full_domain%"$domain"}
|
praefix=${full_domain%"$domain"}
|
||||||
|
# vom präefix wird noch der rechts . entfernt, also aus "sub." wird "sub"
|
||||||
praefix=${praefix%"."}
|
praefix=${praefix%"."}
|
||||||
|
# Nun werden die einzelnen Bestandteile des API Calls analog der API Dokumentation von ipv64.net vorbereitet.
|
||||||
auth_h="Authorization: Bearer $apitoken"
|
auth_h="Authorization: Bearer $apitoken"
|
||||||
|
# die Domain mus mit einer registrierten Domain übereinstimmen, der relevante Parameter ist "add_record"
|
||||||
domain_pl="add_record=$domain"
|
domain_pl="add_record=$domain"
|
||||||
praefix_pl="praefix=$praefix"
|
praefix_pl="praefix=$praefix"
|
||||||
|
# Es wird ein DNS Record vom Typ TXT benötigt
|
||||||
type_pl="type=TXT"
|
type_pl="type=TXT"
|
||||||
|
# Und der Inhalt aus dem dritten Parameter soll als Wert zum DNSRECORD gesetzt werden.
|
||||||
content_pl="content=$3"
|
content_pl="content=$3"
|
||||||
|
# Hier die Ausgabe für Debuging zwecke, um den Aufruf im Log zu finden
|
||||||
echo "fd=$full_domain, domain=$domain, praefix=$praefix, $content_pl"
|
echo "fd=$full_domain, domain=$domain, praefix=$praefix, $content_pl"
|
||||||
|
# Bei der Anlage wird ein POST abgesetzt um den Eintrag abzusetzen.
|
||||||
curl -s -X POST -d "$domain_pl" -d "$praefix_pl" -d "$type_pl" -d "$content_pl" -H "$auth_h" https://ipv64.net/api
|
curl -s -X POST -d "$domain_pl" -d "$praefix_pl" -d "$type_pl" -d "$content_pl" -H "$auth_h" https://ipv64.net/api
|
||||||
;;
|
;;
|
||||||
"cleanup")
|
"cleanup")
|
||||||
|
|
@ -53,11 +82,13 @@ case "$1" in
|
||||||
praefix=${full_domain%"$domain"}
|
praefix=${full_domain%"$domain"}
|
||||||
praefix=${praefix%"."}
|
praefix=${praefix%"."}
|
||||||
auth_h="Authorization: Bearer $apitoken"
|
auth_h="Authorization: Bearer $apitoken"
|
||||||
|
# Zum entfernen ist der API Paramter "del_record" notwendig
|
||||||
domain_pl="del_record=$domain"
|
domain_pl="del_record=$domain"
|
||||||
praefix_pl="praefix=$praefix"
|
praefix_pl="praefix=$praefix"
|
||||||
type_pl="type=TXT"
|
type_pl="type=TXT"
|
||||||
content_pl="content=$3"
|
content_pl="content=$3"
|
||||||
echo "fd=$full_domain, domain= $domain, praefix=$praefix, $content_pl"
|
echo "fd=$full_domain, domain= $domain, praefix=$praefix, $content_pl"
|
||||||
|
# Beim der Aufräumen wird ein DELETE abgesetzt um den Eintrag wieder zu entfernen
|
||||||
curl -s -X DELETE -d "$domain_pl" -d "$praefix_pl" -d "$type_pl" -d "$content_pl" -H "$auth_h" https://ipv64.net/api
|
curl -s -X DELETE -d "$domain_pl" -d "$praefix_pl" -d "$type_pl" -d "$content_pl" -H "$auth_h" https://ipv64.net/api
|
||||||
;;
|
;;
|
||||||
"debug")
|
"debug")
|
||||||
|
|
@ -71,11 +102,14 @@ case "$1" in
|
||||||
praefix_pl="praefix=$praefix"
|
praefix_pl="praefix=$praefix"
|
||||||
type_pl="type=TXT"
|
type_pl="type=TXT"
|
||||||
content_pl="content=$3"
|
content_pl="content=$3"
|
||||||
|
##########
|
||||||
|
# Achtung: im Debugmodus wird der Token im log ausgegeben, ggf. nach debug einen neuen API Key generieren
|
||||||
|
##########
|
||||||
echo "fd=$full_domain, domain=$domain, praefix=$praefix, $content_pl $auth_h"
|
echo "fd=$full_domain, domain=$domain, praefix=$praefix, $content_pl $auth_h"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
|
# Falls das Skript mit einem ungültigen ersten Paramter aufgerufen wird, bricht es mit einem Fehler ab.
|
||||||
echo "OOPS"
|
echo "OOPS"
|
||||||
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue