#!/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