blob: 1b080b72ee765a3230c247855ac00da47b7db015 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
#!/bin/sh
set -eu
: "${DO_DYNDNS_DOMAIN:?DO_DYNDNS_DOMAIN must be set}"
: "${DO_DYNDNS_HOSTNAME:?DO_DYNDNS_HOSTNAME must be set}"
: "${DO_DYNDNS_IF4:?DO_DYNDNS_IF4 must be set}"
: "${DO_DYNDNS_INTERVAL:?DO_DYNDNS_INTERVAL must be set}"
: "${DO_DYNDNS_AUTH_FILE:?DO_DYNDNS_AUTH_FILE must be set}"
if [ ! -r "$DO_DYNDNS_AUTH_FILE" ]; then
echo "[ERROR] Auth file '$DO_DYNDNS_AUTH_FILE' not readable" >&2
exit 1
fi
DOMAIN="$DO_DYNDNS_DOMAIN"
HOSTNAME="$DO_DYNDNS_HOSTNAME"
IF4="$DO_DYNDNS_IF4"
INTERVAL="$DO_DYNDNS_INTERVAL"
while :; do
IP4=$(ifconfig "$IF4" | awk '/inet / { print $2 }' | head -n1)
DIGITALOCEAN_TOKEN=$(awk '{$1=$1; print}' "$DO_DYNDNS_AUTH_FILE")
echo "[INFO] Updating A record for hostname $HOSTNAME in domain $DOMAIN → $IP4"
RECORD_ID=$(curl -s -H "Authorization: Bearer $DIGITALOCEAN_TOKEN" \
"https://api.digitalocean.com/v2/domains/$DOMAIN/records?per_page=999999" |
jq -r ".domain_records[] | select(.type==\"A\" and .name==\"$HOSTNAME\") | .id")
if [ -n "$RECORD_ID" ]; then
curl -s -X PUT \
-H "Authorization: Bearer $DIGITALOCEAN_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"data\":\"$IP4\"}" \
"https://api.digitalocean.com/v2/domains/$DOMAIN/records/$RECORD_ID" > /dev/null
echo "[INFO] Record $RECORD_ID updated"
else
echo "[WARN] No A record found for hostname \"$HOSTNAME\" in domain \"$DOMAIN\". Skipping."
fi
SLEEP_SEC=$(printf "%s\n" "$INTERVAL" | awk '
/^[0-9]+s$/ { gsub(/s$/, ""); print $0; exit }
/^[0-9]+m$/ { gsub(/m$/, ""); print $0 * 60; exit }
/^[0-9]+h$/ { gsub(/h$/, ""); print $0 * 3600; exit }
/^[0-9]+d$/ { gsub(/d$/, ""); print $0 * 86400; exit }
/^[0-9]+$/ { print $0; exit }
{ print "invalid"; exit 1 }
')
sleep "$SLEEP_SEC"
done
|