This repository has been archived on 2026-10-28. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files

92 lines
2.5 KiB
Bash
Raw Permalink Normal View History

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_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
2026-05-21 17:23:08 +02:00
ipv4=""
2026-05-20 23:55:27 +02:00
elif [ "$KARLDNS_IPV4" != "off" ]; then
ipv4="$KARLDNS_IPV4"
fi
if [ "$KARLDNS_IPV6" = "auto" ]; then
2026-05-21 17:23:08 +02:00
ipv6=""
2026-05-20 23:55:27 +02:00
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