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.
 

97 lines
2.5 KiB

#!/bin/bash
api_key='MyApiKey'
api_endpoint='https://dns.api.gandi.net/api/v5'
ifconfig='https://homnomnom.fr/ip/'
host="example.com"
ttl='300'
domainsV4=(
"subdomain1"
"subdomain2"
)
domainsV6=(
"subdomain3"
"subdomain4"
)
#script below
function die {
echo -e $1 >&2
kill -HUP $$
}
function get_api {
tmpfile=$(mktemp)
http_code=$(curl --silent "${api_endpoint}/${1}" \
--header "Content-Type: application/json" \
--header "X-Api-Key: ${api_key}" \
--output ${tmpfile} \
--write-out '%{http_code}')
message=$(cat ${tmpfile})
rm ${tmpfile}
if [[ ${http_code} != "200" ]]; then
die "API GET call exited with code ${http_code}.\nMessage: ${message}"
fi
echo ${message}
}
function put_api {
tmpfile=$(mktemp)
http_code=$(curl --request PUT \
--header "Content-Type: application/json" \
--header "X-Api-Key: ${api_key}" \
--silent \
--output ${tmpfile} \
--write-out '%{http_code}' \
"${api_endpoint}/${1}" \
-d "${2}")
message=$(cat ${tmpfile})
rm ${tmpfile}
if [[ ${http_code} != "201" ]]; then
die "API PUT call exited with code ${http_code}.\nMessage: ${message}"
fi
echo ${message}
}
#find out zone UUID for domain
uuid=$(get_api "domains/${host}")
uuid=$(echo ${uuid} | jq '.zone_uuid' | sed 's/"//g')
echo "UUID: ${uuid}"
ipv4=$(curl -4 --silent ${ifconfig})
echo "detected IPv4 address: ${ipv4}"
for domain in ${domainsV4[@]}; do
ip=$(get_api "zones/${uuid}/records/${domain}/A" | jq '.rrset_values[0]' | sed 's/"//g')
if [ "${ip}" == "${ipv4}" ]; then
echo "- ${domain}.${host}: IP already OK"
else
payload='{"rrset_ttl": '${ttl}', "rrset_values": ["'${ipv4}'"]}'
put_api "zones/${uuid}/records/${domain}/A" "${payload}" >/dev/null
echo "- ${domain}.${host}: replaced ${ip} with ${ipv4}"
fi
done
ipv6=$(curl -6 --silent ${ifconfig})
echo "detected IPv6 address: ${ipv6}"
for domain in ${domainsV6[@]}; do
ip=$(get_api "zones/${uuid}/records/${domain}/AAAA" | jq '.rrset_values[0]' | sed 's/"//g')
if [ "${ip}" == "${ipv6}" ]; then
echo "- ${domain}.${host}: IP already OK"
else
payload='{"rrset_ttl": '${ttl}', "rrset_values": ["'${ipv6}'"]}'
put_api "zones/${uuid}/records/${domain}/AAAA" "${payload}" >/dev/null
echo "- ${domain}.${host}: replaced ${ip} with ${ipv6}"
fi
done