You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
2.6 KiB

#!/bin/bash
# User variables
domain="{{ cloudflare_ddns_domain }}"
zoneid="{{ cloudflare_ddns_zoneid }}"
apikey="{{ cloudflare_ddns_apikey }}"
ipcheck=ifconfig.io
{% raw %}
# Runtime variables
silent=0
dns_record_id=""
wanip=""
dnsip=""
# https://developers.cloudflare.com/api/operations/dns-records-for-a-zone-patch-dns-record
if [[ "${@}" == "--silent" ]]; then silent=1; fi
function prereqs() {
prereq=('jq' 'curl' 'tr')
for pre in ${prereq[@]}; do
which $pre >/dev/null
if [ $? -ne 0 ]; then echo "Cannot find required tool $pre in path. Pls install tool or fix path."; exit 1; fi
done
if [ ${#domain} -eq 0 ]; then echo "domain value cannot be blank. Pls fix in script."; exit 1; fi
if [ ${#apikey} -eq 0 ]; then echo "apikey value cannot be blank. Pls fix in script."; exit 1; fi
if [ ${#zoneid} -eq 0 ]; then echo "zoneid value cannot be blank. Pls fix in script."; exit 1; fi
if [ ${#ipcheck} -eq 0 ]; then echo "ipcheck website cannot be blank. Pls fix in script."; exit 1; fi
}
function getwanip() {
wanip=$(curl -4 https://${ipcheck} 2>/dev/null)
}
function getdnsip() {
jsondata=$(curl --request GET \
--url https://api.cloudflare.com/client/v4/zones/${zoneid}/dns_records?name=${domain} \
--header 'Content-Type: application/json' \
--header "Authorization: Bearer ${apikey}" 2>/dev/null)
success=$(echo $jsondata | jq '.success')
if [[ "$success" != "true" ]]; then
if [[ $silent -eq 0 ]]; then
echo "Unable to get data for dns record $domain in zone $zoneid. Please see the server response below:"
echo -e "\n${jsondata}\n"
fi
exit 1
fi
dns_record_id=$(echo $jsondata | jq '.result[0].id' | tr -d \")
dnsip=$(echo $jsondata | jq '.result[0].content' | tr -d \")
}
function updatedns() {
jsondata=$(curl --request PATCH \
--url https://api.cloudflare.com/client/v4/zones/${zoneid}/dns_records/${dns_record_id} \
--header 'Content-Type: application/json' \
--header "Authorization: Bearer ${apikey}" \
--data "{
'content': '${wanip}',
'name': '${domain}',
'type': 'A'
}" 2>/dev/null)
success=$(echo $jsondata | jq '.success')
if [[ "$success" != "true" ]]; then
if [[ $silent -eq 0 ]]; then
echo "Unable to update data for dns record $domain in zone $zoneid. Please see the server response below:"
echo -e "\n${jsondata}\n"
fi
exit 1
fi
}
prereqs
getwanip
getdnsip
if [[ "${wanip}" == "${dnsip}" ]]; then
if [ $silent -eq 0 ]; then
echo "WAN IP and DNS IP are the same. Not changing. (W:${wanip} / D:${dnsip})"
fi
exit 0
else
if [ $silent -eq 0 ]; then
echo "WAN IP and DNS IP do not match. Updating DNS IP. (W:${wanip} / D:${dnsip})"
fi
updatedns
exit 0
fi
{% endraw %}