#!/usr/bin/env bash # DuckDNS IP-Updater — holt oeffentliche IPv4/IPv6 und meldet sie an DuckDNS. set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # shellcheck source=/dev/null source "${SCRIPT_DIR}/env.homelab" : "${DUCKDNS_TOKEN:?DUCKDNS_TOKEN fehlt in deploy/env.homelab}" : "${DUCKDNS_DOMAIN:?DUCKDNS_DOMAIN fehlt in deploy/env.homelab}" SUBDOMAIN="${DUCKDNS_DOMAIN%%.*}" IPV4="$(curl -4 -fsS --max-time 15 https://api.ipify.org 2>/dev/null || true)" IPV6="$(curl -6 -fsS --max-time 15 https://api64.ipify.org 2>/dev/null || true)" if [[ -z "${IPV4}" && -z "${IPV6}" ]]; then echo "duckdns-update: keine oeffentliche IP ermittelbar" >&2 exit 1 fi URL="https://www.duckdns.org/update?domains=${SUBDOMAIN}&token=${DUCKDNS_TOKEN}&verbose=true" [[ -n "${IPV4}" ]] && URL+="&ip=${IPV4}" [[ -n "${IPV6}" ]] && URL+="&ipv6=${IPV6}" RESP="$(curl -fsS --max-time 20 "${URL}")" echo "$(date -Is) duckdns ${SUBDOMAIN}: ${RESP} (v4=${IPV4:-none} v6=${IPV6:-none})" case "${RESP}" in OK*) exit 0 ;; *) exit 1 ;; esac