Skip to content

Instantly share code, notes, and snippets.

@5lx
Created June 17, 2016 15:55
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save 5lx/5cd60701949a52d8d1cfb83496bdc820 to your computer and use it in GitHub Desktop.
Save 5lx/5cd60701949a52d8d1cfb83496bdc820 to your computer and use it in GitHub Desktop.
Update Digital Ocean Floating IP and Cloudflare DNS Record
#!/bin/bash
DO_TOKEN=
DO_API=https://api.digitalocean.com/v2
CF_API_KEY=
CF_AUTH_EMAIL=
CF_ROOT_DOMAIN=
CF_RECORD=
CF_API=https://api.cloudflare.com/client/v4
writeLog() {
echo $(date -u "+%Y-%m-%dT%H:%M:%SZ") $@
}
getDOInfo() {
local result=$(curl -sX GET -H "Content-Type: application/json" \
-H "Authorization: Bearer ${DO_TOKEN}" \
"${DO_API}/floating_ips?page=1&per_page=20")
Old_Floating_IP=$(echo ${result} | jq -r '.floating_ips[0].ip')
Droplet_ID=$(echo ${result} | jq -r '.floating_ips[0].droplet.id')
Droplet_Name=$(echo ${result} | jq -r '.floating_ips[0].droplet.name')
writeLog ${Droplet_Name}"["${Droplet_ID}"]: Floating IP:"${Old_Floating_IP}
}
updateFIP() {
curl -sX POST -H "Content-Type: application/json" \
-H "Authorization: Bearer ${DO_TOKEN}"\
-d '{"type":"unassign"}' \
"${DO_API}/floating_ips/${Old_Floating_IP}/actions" > /dev/null
sleep 10s
local result=$(curl -sX POST -H "Content-Type: application/json" \
-H "Authorization: Bearer ${DO_TOKEN}" \
-d '{"droplet_id": '"${Droplet_ID}"'}' \
"${DO_API}/floating_ips")
curl -sX DELETE -H "Content-Type: application/json" \
-H "Authorization: Bearer ${DO_TOKEN}" \
"${DO_API}/floating_ips/${Old_Floating_IP}" > /dev/null
New_Floating_IP=$(echo ${result} | jq -r '.floating_ip.ip')
writeLog "New Floating IP is:" ${New_Floating_IP}
}
getZone() {
ZONE_ID=$(curl --fail -sX GET "${CF_API}/zones/?name=${CF_ROOT_DOMAIN}" \
-H "X-Auth-Key:${CF_API_KEY}" \
-H "X-Auth-Email:${CF_AUTH_EMAIL}" \
-H "Content-Type: application/json" | jq -r .result[0].id)
writeLog "DNS zone ID:" ${ZONE_ID}
}
getRecords() {
local result=$(curl -sX GET "${CF_API}/zones/${ZONE_ID}/dns_records?type=A&name=${CF_RECORD}&page=1&per_page=20&order=type&direction=desc&match=all" \
-H "X-Auth-Key:${CF_API_KEY}" \
-H "X-Auth-Email:${CF_AUTH_EMAIL}" \
-H "Content-Type: application/json")
RID=$(echo ${result} | jq -r '.result[].id')
CF_OIP=$(echo ${result} | jq -r '.result[0].content')
writeLog "DNS record ID:" ${RID}
}
updateRecord() {
writeLog "Updating DNS A Record for" ${CF_RECORD} "From:" ${CF_OIP} "To:" ${New_Floating_IP}
local result=$(curl -sX PUT "${CF_API}/zones/${ZONE_ID}/dns_records/${RID}" \
-H "X-Auth-Key:${CF_API_KEY}" \
-H "X-Auth-Email:${CF_AUTH_EMAIL}" \
-H "Content-Type: application/json" \
--data "$(printf '{"id":"%s","type":"A","name":"%s","content":"%s","ttl":1}' $RID $CF_RECORD $New_Floating_IP)")
writeLog "success:" $(echo ${result} | jq -r '.success')
}
run(){
getDOInfo
updateFIP
getZone
getRecords
updateRecord
}
run
@5lx
Copy link
Author

5lx commented Jun 17, 2016

Need install jq

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment