Archived
Build KarlDNS self-hosted DynDNS service
This commit is contained in:
1 parent
45bc38d950
commit
ca92dc211a
65 files changed
+9200
-3570
No files matched your search
Executable
+93
@@ -0,0 +1,93 @@
|
||||
#!/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:?KARLDNS_UPDATE_URL is required 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_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
|
||||
|
||||
case "$ipv4" in *" "*) echo "KarlDNS: invalid IPv4 discovery result" >&2; exit 1 ;; esac
|
||||
case "$ipv6" in *" "*) echo "KarlDNS: invalid IPv6 discovery result" >&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: $response" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
Reference in new issue
Block a user