Includes homelab deploy tooling, image position/zoom manifest persistence, and full trading/casino stack. Co-authored-by: Cursor <cursoragent@cursor.com>
33 lines
1.0 KiB
Bash
33 lines
1.0 KiB
Bash
#!/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
|