forked from kkkgo/dnspod-ddns-with-bashshell
-
Notifications
You must be signed in to change notification settings - Fork 0
/
dnspod_ddns.sh
58 lines (54 loc) · 2.21 KB
/
dnspod_ddns.sh
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
52
53
54
55
56
57
58
#! /bin/bash
# CONF START
API_ID=12345
API_Token=abcdefghijklmnopq2333333
domain=example.com
host=home
CHECKURL=https://myip4.ipip.net
# OUT="pppoe"
# CONF END
printf "[$(date +"%F %T %Z")] "
# Query CHECKURL IP and public DNS IP
if (echo $CHECKURL | grep -q "://"); then
IPREX='([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
URLIP=$(curl -4 -k $(if [ -n "$OUT" ]; then echo "--interface $OUT"; fi) -s $CHECKURL | grep -Eo "$IPREX" | tail -n1)
if (echo $URLIP | grep -qEvo "$IPREX"); then
printf "(warning: failed to query IP) "
fi
# echo "[URL IP]: $URLIP"
dnscmd="nslookup"
type nslookup >/dev/null 2>&1 || dnscmd="ping -c1"
DNSTEST=$($dnscmd $(if [ "$host" != "@" ]; then echo "$host."; fi)$domain)
if [ "$?" != 0 ] && [ "$dnscmd" == "nslookup" ] || (echo $DNSTEST | grep -qEvo "$IPREX"); then
printf "(warning: failed to reach DNS) "
else
DNSIP=$(echo $DNSTEST | grep -Eo "$IPREX" | tail -n1)
fi
# echo "[DNS IP]: $DNSIP"
if [ "$DNSIP" == "$URLIP" ] && [ -n "$DNSIP" ]; then
echo "SKIPPING: IP not changed"
exit
fi
fi
# Update DDNS
token="login_token=${API_ID},${API_Token}&format=json&lang=en&error_on_empty=yes&domain=${domain}&sub_domain=${host}"
Record="$(curl -4 -k $(if [ -n "$OUT" ]; then echo "--interface $OUT"; fi) -s -X POST https://dnsapi.cn/Record.List -d "${token}")"
iferr="$(echo ${Record#*code} | cut -d'"' -f3)"
if [ "$iferr" == "1" ]; then
record_ip=$(echo ${Record#*value} | cut -d'"' -f3)
# echo "[API IP]: $record_ip"
if [ "$record_ip" == "$URLIP" ]; then
echo "SKIPPING: already updated"
exit
fi
record_id=$(echo ${Record#*\"records\"\:\[\{\"id\"} | cut -d'"' -f2)
record_line_id=$(echo ${Record#*line_id} | cut -d'"' -f3)
# echo Start DDNS update...
ddns="$(curl -4 -k $(if [ -n "$OUT" ]; then echo "--interface $OUT"; fi) -s -X POST https://dnsapi.cn/Record.Ddns -d "${token}&record_id=${record_id}&record_line_id=${record_line_id}")"
ddns_result="$(echo ${ddns#*message\"} | cut -d'"' -f2)"
printf "$ddns_result: $record_ip -> "
echo $ddns | grep -Eo "$IPREX" | tail -n1
else
printf "ERROR: "
echo $(echo ${Record#*message\"}) | cut -d'"' -f2
fi