forked from oznu/docker-cloudflare-ddns
/
cloudflare.sh
114 lines (93 loc) · 3.08 KB
/
cloudflare.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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
cloudflare() {
if [ -f "$API_KEY_FILE" ]; then
API_KEY=$(cat $API_KEY_FILE)
fi
if [ -z "$EMAIL" ]; then
curl -sSL \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY" \
"$@"
else
curl -sSL \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "X-Auth-Email: $EMAIL" \
-H "X-Auth-Key: $API_KEY" \
"$@"
fi
}
getLocalIpAddress() {
if [ "$RRTYPE" == "A" ]; then
IP_ADDRESS=$(ip addr show $INTERFACE | awk '$1 == "inet" {gsub(/\/.*$/, "", $2); print $2; exit}')
elif [ "$RRTYPE" == "AAAA" ]; then
IP_ADDRESS=$(ip addr show $INTERFACE | awk '$1 == "inet6" {gsub(/\/.*$/, "", $2); print $2; exit}')
fi
echo $IP_ADDRESS
}
getCustomIpAddress() {
IP_ADDRESS=$(sh -c "$CUSTOM_LOOKUP_CMD")
echo $IP_ADDRESS
}
getPublicIpAddress() {
if [ "$RRTYPE" == "A" ]; then
# Use DNS_SERVER ENV variable or default to 1.1.1.1
DNS_SERVER=${DNS_SERVER:=1.1.1.1}
# try dns method first.
CLOUD_FLARE_IP=$(dig +short @$DNS_SERVER ch txt whoami.cloudflare +time=3 | tr -d '"')
CLOUD_FLARE_IP_LEN=${#CLOUD_FLARE_IP}
# if using cloud flare fails, try opendns (some ISPs block 1.1.1.1)
IP_ADDRESS=$([ $CLOUD_FLARE_IP_LEN -gt 15 ] && echo $(dig +short myip.opendns.com @resolver1.opendns.com +time=3) || echo "$CLOUD_FLARE_IP")
# if dns method fails, use http method
if [ "$IP_ADDRESS" = "" ]; then
IP_ADDRESS=$(curl -sf4 https://ipinfo.io | jq -r '.ip')
fi
echo $IP_ADDRESS
elif [ "$RRTYPE" == "AAAA" ]; then
# try dns method first.
IP_ADDRESS=$(dig +short @2606:4700:4700::1111 -6 ch txt whoami.cloudflare | tr -d '"')
# if dns method fails, use http method
if [ "$IP_ADDRESS" = "" ]; then
IP_ADDRESS=$(curl -sf6 https://ifconfig.co)
fi
echo $IP_ADDRESS
fi
}
getDnsRecordName() {
if [ ! -z "$SUBDOMAIN" ]; then
echo $SUBDOMAIN.$ZONE
else
echo $ZONE
fi
}
verifyToken() {
if [ -z "$EMAIL" ]; then
cloudflare -o /dev/null -w "%{http_code}" "$CF_API"/user/tokens/verify
else
cloudflare -o /dev/null -w "%{http_code}" "$CF_API"/user
fi
}
getZoneId() {
cloudflare "$CF_API/zones?name=$ZONE" | jq -r '.result[0].id'
}
getDnsRecordId() {
cloudflare "$CF_API/zones/$1/dns_records?type=$RRTYPE&name=$2" | jq -r '.result[0].id'
}
createDnsRecord() {
if [[ "$PROXIED" != "true" && "$PROXIED" != "false" ]]; then
PROXIED="false"
fi
cloudflare -X POST -d "{\"type\": \"$RRTYPE\",\"name\":\"$2\",\"content\":\"$3\",\"proxied\":$PROXIED,\"ttl\":1 }" "$CF_API/zones/$1/dns_records" | jq -r '.result.id'
}
updateDnsRecord() {
if [[ "$PROXIED" != "true" && "$PROXIED" != "false" ]]; then
PROXIED="false"
fi
cloudflare -X PATCH -d "{\"type\": \"$RRTYPE\",\"name\":\"$3\",\"content\":\"$4\",\"proxied\":$PROXIED }" "$CF_API/zones/$1/dns_records/$2" | jq -r '.result.id'
}
deleteDnsRecord() {
cloudflare -X DELETE "$CF_API/zones/$1/dns_records/$2" | jq -r '.result.id'
}
getDnsRecordIp() {
cloudflare "$CF_API/zones/$1/dns_records/$2" | jq -r '.result.content'
}