Skip to content

Instantly share code, notes, and snippets.

@httpsterio
Created January 17, 2021 21:15
Show Gist options
  • Save httpsterio/a270ec969c78db3be05320bb2becb370 to your computer and use it in GitHub Desktop.
Save httpsterio/a270ec969c78db3be05320bb2becb370 to your computer and use it in GitHub Desktop.
netlify dns
#!/bin/bash
#
# Asettaa Netlifyssa A-recordin koneen nykyisellä ulkoisella ip:llä. Dependency ainoastaan jq.
# Tarvitsee argumentteina access tokenin (https://app.netlify.com/applications), verkko-osoitteen, aliosoitteen ja vanhenemisajan minuutteina.
# esim: ./netlify-dynamicdns.sh $AccessToken $Domain $Subdomain $TTL
#
if [ "$#" -ne 4 ]; then
echo "Wrong number of parameters passed"
echo "Usage:"
echo "$0 <ACCESS_TOKEN> <DOMAIN> <SUBDOMAIN> <TTL>"
exit
fi
ACCESS_TOKEN="$1"
DOMAIN="$2"
SUBDOMAIN="$3"
TTL="$4"
NETLIFY_API="https://api.netlify.com/api/v1"
EXTERNAL_IP=`dig +short myip.opendns.com @resolver1.opendns.com`
echo "Current external IP is $EXTERNAL_IP"
HOSTNAME="$SUBDOMAIN.$DOMAIN"
DNS_ZONES_RESPONSE=`curl -s "$NETLIFY_API/dns_zones?access_token=$ACCESS_TOKEN" --header "Content-Type:application/json"`
ZONE_ID=`echo $DNS_ZONES_RESPONSE | jq ".[] | select(.name == \"$DOMAIN\") | .id" --raw-output`
DNS_RECORDS_RESPONSE=`curl -s "$NETLIFY_API/dns_zones/$ZONE_ID/dns_records?access_token=$ACCESS_TOKEN" --header "Content-Type:application/json"`
RECORD=`echo $DNS_RECORDS_RESPONSE | jq ".[] | select(.hostname == \"$HOSTNAME\")" --raw-output`
RECORD_VALUE=`echo $RECORD | jq ".value" --raw-output`
echo "Current $HOSTNAME value is $RECORD_VALUE"
if [[ "$RECORD_VALUE" != "$EXTERNAL_IP" ]]; then
if [[ "$RECORD_VALUE" != "" ]]; then
echo "Deleting current entry for $HOSTNAME"
RECORD_ID=`echo $RECORD | jq ".id" --raw-output`
DELETE_RESPONSE_CODE=`curl -X DELETE -s -w "%{response_code}" "$NETLIFY_API/dns_zones/$ZONE_ID/dns_records/$RECORD_ID?access_token=$ACCESS_TOKEN" --header "Content-Type:application/json"`
if [[ $DELETE_RESPONSE_CODE != 204 ]]; then
echo "There was a problem deleting the existing $HOSTNAME entry, response code was $DELETE_RESPONSE_CODE"
exit
fi
fi
echo "Creating new entry for $HOSTNAME with value $EXTERNAL_IP"
CREATE_BODY=`jq -n --arg hostname "$HOSTNAME" --arg externalIp "$EXTERNAL_IP" --arg ttl $TTL '
{
"type": "A",
"hostname": $hostname,
"value": $externalIp,
"ttl": $ttl|tonumber
}'`
CREATE_RESPONSE=`curl -s --data "$CREATE_BODY" "$NETLIFY_API/dns_zones/$ZONE_ID/dns_records?access_token=$ACCESS_TOKEN" --header "Content-Type:application/json"`
NEW_RECORD_TYPE=`echo $CREATE_RESPONSE | jq ".type" --raw-output`
NEW_RECORD_HOSTNAME=`echo $CREATE_RESPONSE | jq ".hostname" --raw-output`
NEW_RECORD_VALUE=`echo $CREATE_RESPONSE | jq ".value" --raw-output`
NEW_RECORD_TTL=`echo $CREATE_RESPONSE | jq ".ttl" --raw-output`
if [[ $NEW_RECORD_TYPE != "A" ]] || [[ $NEW_RECORD_HOSTNAME != $HOSTNAME ]] || [[ $NEW_RECORD_VALUE != $EXTERNAL_IP ]] || [[ $NEW_RECORD_TTL != $TTL ]]; then
echo "There was a problem creating the new entry, some values did not match"
exit
fi
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment