From 0e0988682f887cd5e363ab7e23e9ed2a4c67184e Mon Sep 17 00:00:00 2001 From: Steph Enders Date: Wed, 5 Jul 2023 10:40:37 -0400 Subject: Create update script This script will: 1. take in a domain and a config path 2. fetch your domains current IP using dig 3. fetch your server IP using ipinfo.io/ip (via curl) 4. then if there is a mismatch it will: 4.1. fetch your DNS A Record for that API from the API 4.2. POST an update for that DNS record with the new IP from the API 5. else print that things are successful The porkbun APIs denoted here: https://porkbun.com/api/json/v3/documentation --- .gitignore | 1 + README.txt | 6 +++++- update.sh | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100755 update.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..04204c7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +config diff --git a/README.txt b/README.txt index 98b08a1..22d827d 100644 --- a/README.txt +++ b/README.txt @@ -4,4 +4,8 @@ Sometimes your servers IP changes underneath you. This util is script you can se == SETUP -Ensure your API keys are somewhere secure and accessible to the script +Ensure your API keys are somewhere secure and accessible to the script. It will be sourced by the script so should be sh env compatible (aka KEY=VALUE) + +== REQUIREMENTS + +curl, dig, jq diff --git a/update.sh b/update.sh new file mode 100755 index 0000000..9fba7be --- /dev/null +++ b/update.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env sh +set -e +if [ $# -ne 2 ]; then + echo "Usage: ./update.sh DOMAIN API_CONFIG" >&2 + exit 1 +fi + +DOMAIN=$1 +API_CONFIG=$2 + +source $API_CONFIG +config_ip=$(dig +short $DOMAIN) +actual_ip=$(curl https://ipinfo.io/ip) + +if [ "$config_ip" != "$actual_ip" ]; then + echo "Updating IP from $config_id to $actual_ip for $DOMAIN" + res=$(curl -X POST "https://porkbun.com/api/json/v3/dns/retrieve/$DOMAIN" \ + -d "{ \"secretapikey\": \"${SECRETAPIKEY}\", \"apikey\": \"${APIKEY}\" }") + status=$(echo "$res" | jq -r '.status') + if [ "$status" != "SUCCESS" ]; then + echo "Failed to fetch domain ID:\n\t$res" >&2 + exit 1 + fi + ID=$(echo "$res" | jq -r ".records[] | select(.type == \"A\") | select(.content == \"${config_ip}\") | .id") + res=$(curl -X POST "https://porkbun.com/api/json/v3/dns/edit/$DOMAIN/$ID" \ + -d "{ \"secretapikey\": \"${SECRETAPIKEY}\", \"apikey\": \"${APIKEY}\", \"content\": \"${actual_ip}\", \"ttl\": \"600\", \"type\": \"A\", \"name\": \"\" }") + status=$(echo "$res" | jq -r '.status') + if [ "$status" == "SUCCESS" ]; then + echo "Successfully updated $DOMAIN record $ID from $config_ip to $actual_ip" + else + echo "Failed to update DNS record for $DOMAIN with $ID from $config_ip to $actual_ip" >&2 + pretty=$(echo "$res" | jq '.') + echo "$pretty" >&2 + exit 1 + fi +else + echo "$DOMAIN is currently registered properly: $config_ip $actual_ip" +fi + +exit 0 -- cgit v1.2.3-54-g00ecf