Skip to content

Instantly share code, notes, and snippets.

@5lx
Created June 17, 2016 15:55
Show Gist options
  • Select an option

  • Save 5lx/5cd60701949a52d8d1cfb83496bdc820 to your computer and use it in GitHub Desktop.

Select an option

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
Copy Markdown
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