2026-05-20 23:55:27 +02:00
|
|
|
#!/bin/sh
|
|
|
|
|
set -eu
|
|
|
|
|
|
|
|
|
|
CONFIG_FILE="${KARLDNS_CONFIG:-${XDG_CONFIG_HOME:-$HOME/.config}/karldns/updater.env}"
|
|
|
|
|
|
|
|
|
|
if [ -r "$CONFIG_FILE" ]; then
|
|
|
|
|
# shellcheck disable=SC1090
|
|
|
|
|
. "$CONFIG_FILE"
|
|
|
|
|
fi
|
|
|
|
|
|
2026-05-21 10:05:40 +02:00
|
|
|
: "${KARLDNS_UPDATE_URL:?Set KARLDNS_UPDATE_URL in $CONFIG_FILE or the environment}"
|
2026-05-20 23:55:27 +02:00
|
|
|
KARLDNS_BASE_URL="${KARLDNS_BASE_URL:-https://karldns.de}"
|
|
|
|
|
KARLDNS_LOCK_FILE="${KARLDNS_LOCK_FILE:-/tmp/karldns-updater.lock}"
|
|
|
|
|
KARLDNS_CACHE_FILE="${KARLDNS_CACHE_FILE:-${XDG_CACHE_HOME:-$HOME/.cache}/karldns/last-ip}"
|
|
|
|
|
KARLDNS_CURL="${KARLDNS_CURL:-curl}"
|
|
|
|
|
KARLDNS_IP_URL="${KARLDNS_IP_URL:-$KARLDNS_BASE_URL/ip}"
|
|
|
|
|
KARLDNS_IPV4="${KARLDNS_IPV4:-auto}"
|
|
|
|
|
KARLDNS_IPV6="${KARLDNS_IPV6:-auto}"
|
|
|
|
|
case "$KARLDNS_UPDATE_URL" in
|
|
|
|
|
*"<ipaddr>"*|*"<ip6addr>"*) KARLDNS_UPDATE_URL="${KARLDNS_UPDATE_URL%%\?*}" ;;
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
mkdir -p "$(dirname "$KARLDNS_CACHE_FILE")"
|
|
|
|
|
mkdir -p "$(dirname "$KARLDNS_LOCK_FILE")" 2>/dev/null || true
|
|
|
|
|
|
|
|
|
|
if command -v flock >/dev/null 2>&1; then
|
|
|
|
|
exec 9>"$KARLDNS_LOCK_FILE"
|
|
|
|
|
if ! flock -n 9; then
|
|
|
|
|
exit 0
|
|
|
|
|
fi
|
|
|
|
|
else
|
|
|
|
|
lock_dir="${KARLDNS_LOCK_FILE}.d"
|
|
|
|
|
if ! mkdir "$lock_dir" 2>/dev/null; then
|
|
|
|
|
exit 0
|
|
|
|
|
fi
|
|
|
|
|
trap 'rmdir "$lock_dir"' EXIT INT TERM
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
ipv4=""
|
|
|
|
|
ipv6=""
|
|
|
|
|
if [ "$KARLDNS_IPV4" = "auto" ]; then
|
|
|
|
|
ipv4="$("$KARLDNS_CURL" -4 -fsS --max-time 15 "$KARLDNS_IP_URL" 2>/dev/null | tr -d '[:space:]' || true)"
|
|
|
|
|
elif [ "$KARLDNS_IPV4" != "off" ]; then
|
|
|
|
|
ipv4="$KARLDNS_IPV4"
|
|
|
|
|
fi
|
|
|
|
|
if [ "$KARLDNS_IPV6" = "auto" ]; then
|
|
|
|
|
ipv6="$("$KARLDNS_CURL" -6 -fsS --max-time 15 "$KARLDNS_IP_URL" 2>/dev/null | tr -d '[:space:]' || true)"
|
|
|
|
|
elif [ "$KARLDNS_IPV6" != "off" ]; then
|
|
|
|
|
ipv6="$KARLDNS_IPV6"
|
|
|
|
|
fi
|
|
|
|
|
|
2026-05-21 10:05:40 +02:00
|
|
|
case "$ipv4" in *" "*) echo "KarlDNS: could not read a valid IPv4 address" >&2; exit 1 ;; esac
|
|
|
|
|
case "$ipv6" in *" "*) echo "KarlDNS: could not read a valid IPv6 address" >&2; exit 1 ;; esac
|
2026-05-20 23:55:27 +02:00
|
|
|
public_ip="${ipv4}|${ipv6}"
|
|
|
|
|
has_discovered_ip=0
|
|
|
|
|
if [ -n "$ipv4" ] || [ -n "$ipv6" ]; then
|
|
|
|
|
has_discovered_ip=1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
last_ip=""
|
|
|
|
|
if [ -r "$KARLDNS_CACHE_FILE" ]; then
|
|
|
|
|
last_ip="$(cat "$KARLDNS_CACHE_FILE")"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [ "$has_discovered_ip" = "1" ] && [ "$public_ip" = "$last_ip" ] && [ "${KARLDNS_FORCE:-0}" != "1" ]; then
|
|
|
|
|
echo "KarlDNS: unchanged ${ipv4:-no-ipv4} ${ipv6:-no-ipv6}"
|
|
|
|
|
exit 0
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [ "$has_discovered_ip" = "1" ]; then
|
|
|
|
|
set -- --get "$KARLDNS_UPDATE_URL"
|
|
|
|
|
if [ -n "$ipv4" ]; then
|
|
|
|
|
set -- "$@" --data-urlencode "myip=$ipv4"
|
|
|
|
|
fi
|
|
|
|
|
if [ -n "$ipv6" ]; then
|
|
|
|
|
set -- "$@" --data-urlencode "myipv6=$ipv6"
|
|
|
|
|
fi
|
|
|
|
|
response="$("$KARLDNS_CURL" -fsS --max-time 20 "$@")"
|
|
|
|
|
else
|
|
|
|
|
response="$("$KARLDNS_CURL" -fsS --max-time 20 "$KARLDNS_UPDATE_URL")"
|
|
|
|
|
fi
|
|
|
|
|
case "$response" in
|
|
|
|
|
good*|nochg*)
|
|
|
|
|
if [ "$has_discovered_ip" = "1" ]; then
|
|
|
|
|
printf '%s\n' "$public_ip" > "$KARLDNS_CACHE_FILE"
|
|
|
|
|
fi
|
|
|
|
|
echo "KarlDNS: $response"
|
|
|
|
|
;;
|
|
|
|
|
*)
|
2026-05-21 10:05:40 +02:00
|
|
|
echo "KarlDNS: update failed. Server said: $response" >&2
|
2026-05-20 23:55:27 +02:00
|
|
|
exit 1
|
|
|
|
|
;;
|
|
|
|
|
esac
|