Skip to main content

DynDNS Updater (Debian / 10.07.2024)

Der DynDNS Updater aktualisiert eine DynDNS-Domain mit der aktuellen IP-Adresse.
Wenn das Script zum ersten Mal ausgeführt wird, muss man die API zur Aktualisierung eingeben, die dieses Script dann aufruft.
Diese API wird dann im script-data-Ordner gespeichert.

Genaue Zusammenfassung:
data=/home/$USER/script-data/$0

Wenn noch keine IP vorhanden ist ($data/ip.txt), dann wird die IP-Adresse von "icanhazip.com" abgerufen.
API wird aufgerufen, IP wurde aktualisiert.
Jeder Schritt wird mitgeloggt in $data/allgemein.csv (besondere Ereignisse), tagesaktuell in $data/logs/YYYYMMTT.csv (Updates).

 

🧾 Was macht das Script?

📁 Lade bisherigen Status:

  • Wenn ip.txt vorhanden ist, wird die bisherige öffentliche IP geladen.

  • Wenn nicht: → erste Ausführung → IP bleibt leer, Log-Eintrag in allgemein.csv.


🌐 Prüfe Update-URL:

  • Wenn updateurl.txt existiert → lese erste Zeile ein.

  • Wenn nicht vorhanden:

    • Benutzer wird zur Eingabe einer gültigen http(s)-URL aufgefordert.

    • Wenn gültig: speichere in updateurl.txt & logge es.

    • Wenn ungültig: Abbruch & Fehlerlog.


📶 Online-Check:

  • Ping an icanhazip.com (IPv4, 1 Paket, Timeout 3s)

  • Wenn erreichbar:

    • Hole neue IP mit curl

    • Vergleiche mit vorheriger IP

      • Unverändert: nur Statusmeldung

      • Geändert:

        • speichere neue IP in ip.txt

        • rufe updateurl auf (z. B. DynDNS-Anbieter)

        • logge Aktualisierung in Tageslog

        • sende E-Mail-Benachrichtigung

  • Wenn nicht online:

    • logge, dass keine Aktualisierung möglich ist

📬 Benötigte Tools:

  • curl

  • ping

  • mail

  • sed, head, tail

  • Bash >= 4

Inhalt der $data/updateurl.txt:

https://api.dyndns.tld/update.php?key=q12w3e4r5t6z7u8i9o0p

Script:

user=$(whoami)
data="/home/$user/script-data/$(basename "$0")"
ippage="icanhazip.com"

	if [ ! -d "$data" ]; then
		mkdir -p "$data"
	fi

	if [ ! -d "$data/logs" ]; then
		mkdir "$data/logs"
	fi


function ipcheck {
	echo "$(date +"[%d.%m.%Y %H:%M:%S]")"

	if [ -f "$data/ip.txt" ]; then
		ip=$(head -n1 "$data/ip.txt")
		echo "Bisherige IP: $ip"
	else
		echo "Erste Ausführung."
		ip=""
		echo "$(date +"%d.%m.%Y;%H:%M:%S");Erste Ausführung;$1" >> "$data/logs/allgemein.csv"
	fi

	if [ -f "$data/updateurl.txt" ]; then
		updateurl=$(sed 's/ //g' "$data/updateurl.txt" | head -n1 | tail -n1)
	else
		echo "Keine Update-URL hinterlegt. URL hier einfügen:"
		echo "$(date +"%d.%m.%Y;%H:%M:%S");Update-URL fehlt" >> "$data/logs/allgemein.csv"
		read -p "Update-URL: " updateurl

		# Überprüfe, ob die URL mit "http://" oder "https://" beginnt
		if [[ "$updateurl" =~ ^(http|https):// ]]; then
			echo "URL OK."
			echo "$updateurl" > "$data/updateurl.txt"
			echo "$(date +"%d.%m.%Y;%H:%M:%S");Update-URL hinterlegt;$1" >> "$data/logs/allgemein.csv"
		else
			echo "Die URL ist ungültig."
			echo "$(date +"%d.%m.%Y;%H:%M:%S");Update-URL ungültig;$1" >> "$data/logs/allgemein.csv"
			exit 1
		fi
	fi

	echo "Prüfe Online-Status"
	if ping -4 -c 1 -W 3 "$ippage" >/dev/null 2>&1; then
		echo "Anschluss Online"
		ipneu=$(curl -s "$ippage")
		echo "IP: $ipneu"

		if [ "$ip" = "$ipneu" ]; then
			echo "IP unverändert."
	#		echo "$(date +"%d.%m.%Y;%H:%M:%S");IP unverändert;$1" >> "$data/logs/$(date +"%Y%m%d").csv"
		else
			echo "Bisherige IP: $ip"
			echo "Neue IP     : $ipneu"
			echo "Aktualisiere..."
			echo "$ipneu" > "$data/ip.txt"
			curl -sSL "$updateurl" >/dev/null
			echo "OK."
			echo "$(date +"%d.%m.%Y;%H:%M:%S");Aktualisiert auf $ipneu;$1" >> "$data/logs/$(date +"%Y%m%d").csv"
			echo "$(date +"[%d.%m.%Y %H:%M:%S]") IP aktualisiert auf $ipneu" | mail -s "DynDNSupdater" "mail@mariobeh.de"
		fi
	else
		echo "Client ist selbst offline, kein Aktualisieren möglich."
		echo "$(date +"%d.%m.%Y;%H:%M:%S");Client offline;$1" >> "$data/logs/$(date +"%Y%m%d").csv"
	fi
}


if [ -z "$1" ]; then
	ipcheck
fi

exit 0