#!/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 : "${KARLDNS_UPDATE_URL:?Set KARLDNS_UPDATE_URL in $CONFIG_FILE or the environment}" 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 *""*|*""*) 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="" elif [ "$KARLDNS_IPV4" != "off" ]; then ipv4="$KARLDNS_IPV4" fi if [ "$KARLDNS_IPV6" = "auto" ]; then ipv6="" elif [ "$KARLDNS_IPV6" != "off" ]; then ipv6="$KARLDNS_IPV6" fi 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 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" ;; *) echo "KarlDNS: update failed. Server said: $response" >&2 exit 1 ;; esac