summaryrefslogtreecommitdiff
path: root/linode-ddns.sh
diff options
context:
space:
mode:
Diffstat (limited to 'linode-ddns.sh')
-rwxr-xr-xlinode-ddns.sh56
1 files changed, 0 insertions, 56 deletions
diff --git a/linode-ddns.sh b/linode-ddns.sh
deleted file mode 100755
index cd0cd76..0000000
--- a/linode-ddns.sh
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/usr/bin/env bash
-#
-# Copyright 2022 David Vazgenovich Shakaryan
-#
-# LINODE_TOKEN=<token> linode-ddns.sh <domain>
-
-IP_RESOLVER='https://ifconfig.co'
-TARGET="${1}"
-
-shopt -s extglob
-
-die() {
- [[ -n "${@}" ]] && echo "${@}" >&2
- exit 1
-}
-
-lincurl() {
- curl -sfH "Authorization: Bearer ${LINODE_TOKEN}" \
- "https://api.linode.com/v4/domains/${1}" \
- "${@:2}"
-}
-
-ip="$(curl -sf4 "${IP_RESOLVER}")" || die 'IP lookup failed'
-
-dom_re="${TARGET}"
-while [[ "${dom_re}" =~ ^([^\\]*)\.(.*)$ ]]; do
- dom_re="(${BASH_REMATCH[1]}\\.)?${BASH_REMATCH[2]}"
-done
-
-res="$(lincurl)" || die 'Domains lookup failed'
-IFS='|' read dom_id dom_name < <(jq -er --arg re "${dom_re}" \
- '[.data[] | select(.domain | test("\\A" + $re + "\\z"))] |
- if . == [] then (null | halt_error) else . end |
- max_by(.domain | length) | [.id, .domain] | join("|")' \
- <<< "${res}") || die 'Domain not found'
-rec_name="${TARGET%%?(.)${dom_name}}"
-
-res=$(lincurl "${dom_id}/records") || die 'Records lookup failed'
-rec_id="$(jq -er --arg name "${rec_name}" \
- 'first(.data[] | select(.type == "A" and .name == $name)) | .id' \
- <<< "${res}")" || die 'Record not found'
-
-res="$(lincurl "${dom_id}/records/${rec_id}")" || die 'Record lookup failed'
-old_ip="$(jq -r '.target' <<< "${res}")"
-
-if [[ "${old_ip}" == "${ip}" ]]; then
- echo "IP unchanged from ${ip}"
- exit
-fi
-
-res="$(lincurl "${dom_id}/records/${rec_id}" \
- -H 'Content-Type: application/json' \
- -X PUT -d "{\"target\":\"${ip}\"}")" || die 'Record update failed'
-new_ip="$(jq -r '.target' <<< "${res}")"
-
-echo "IP changed from ${old_ip} to ${new_ip}"