Skip to content

Instantly share code, notes, and snippets.

@alyyousuf7
Last active March 4, 2024 17:19
Show Gist options
  • Select an option

  • Save alyyousuf7/50eb1496c25fe1eead76fa6d8b78fbc3 to your computer and use it in GitHub Desktop.

Select an option

Save alyyousuf7/50eb1496c25fe1eead76fa6d8b78fbc3 to your computer and use it in GitHub Desktop.
Ngrok and GoDaddy Connector

Ngrok and GoDaddy Connector

Ngrok provides a paid service to connect custom domain to a service. This script provides similar functionality which requires to be run everytime ngrok is started/restarted.

It updates your custom domain's CNAME record to the ngrok subdomain assigned to your service.

Usage

$ ./script.sh -n [ngrok name] -k [godaddy key]:[godaddy secret] -d [godaddy domain] -s [godaddy subdomain]

[ngrok name]: Ngrok service name thats deployed (named service can be created using ngrok configuration file)

[godaddy key]:[godaddy secret]: GoDaddy key and secret joined using a colon

[godaddy domain]: Your domain on GoDaddy

[godaddy subdomain]: Subdomain to be created/updated by this script to have ngrok subdomain

#!/bin/bash
show_help() {
echo "$0 -n [ngrok name] -k [godaddy key]:[godaddy secret] -d [godaddy domain] -s [godaddy subdomain]"
}
OPTIND=1
NGROK_NAME=""
GODADDY_KEY_SECRET=""
GODADDY_DOMAIN=""
GODADDY_SUBDOMAIN=""
while getopts "h?n:k:d:s:" opt; do
case "$opt" in
h|\?)
show_help
exit 0
;;
n) NGROK_NAME=$OPTARG
;;
k) GODADDY_KEY_SECRET=$OPTARG
;;
d) GODADDY_DOMAIN=$OPTARG
;;
s) GODADDY_SUBDOMAIN=$OPTARG
;;
esac
done
shift $((OPTIND-1))
[ "${1:-}" = "--" ] && shift
[[ -z "$NGROK_NAME" ]] \
|| [[ -z "$GODADDY_KEY_SECRET" ]] \
|| [[ -z "$GODADDY_DOMAIN" ]] \
|| [[ -z "$GODADDY_SUBDOMAIN" ]] \
&& echo -e "One or more parameters were missing\n" \
&& show_help \
&& exit 1
while [[ -z "$NGROK_DOMAIN" ]]; do
NGROK_DOMAIN=$(curl -s "http://localhost:4040/api/tunnels" | jq -r ".tunnels[] | select(.name == \"$NGROK_NAME\") | .public_url" | sed -e "s/.*:\/\///")
[[ -z "$NGROK_DOMAIN" ]] && echo "waiting for ngrok" && sleep 1
done
echo "ngrok domain:" $NGROK_DOMAIN
GODADDY_RESPONSE=$(curl -s -H "Authorization: sso-key $GODADDY_KEY_SECRET" "https://api.godaddy.com/v1/domains/$GODADDY_DOMAIN/records/CNAME/$GODADDY_SUBDOMAIN")
GODADDY_RECORD=$(echo $GODADDY_RESPONSE | jq -r ".[0].data" 2> /dev/null)
[[ $? -ne 0 ]] && echo -e "failed to get godaddy records\n" && (echo $GODADDY_RESPONSE | jq -r .message) && exit 1
if [[ "$GODADDY_RECORD" == "null" ]]; then
# Create a record if it does not exist
echo "creating godaddy record"
GODADDY_RESPONSE=$(curl -f -s -H "Authorization: sso-key $GODADDY_KEY_SECRET" -H "Content-type: application/json" "https://api.godaddy.com/v1/domains/$GODADDY_DOMAIN/records" -X PATCH -d "[{\"name\":\"$GODADDY_SUBDOMAIN\",\"data\": \"$NGROK_DOMAIN\",\"ttl\":600,\"type\":\"CNAME\"}]")
[[ $? -ne 0 ]] && echo -e "error creating godaddy record\n" && (echo $GODADDY_RESPONSE | jq -r .message) && exit 1
elif [[ "$GODADDY_RECORD" != "$NGROK_DOMAIN" ]]; then
# Update record
echo "updating godaddy record"
GODADDY_RESPONSE=$(curl -f -s -H "Authorization: sso-key $GODADDY_KEY_SECRET" -H "Content-type: application/json" "https://api.godaddy.com/v1/domains/$GODADDY_DOMAIN/records/CNAME/$GODADDY_SUBDOMAIN" -X PUT -d "[{\"name\":\"$GODADDY_SUBDOMAIN\",\"data\": \"$NGROK_DOMAIN\",\"ttl\":600,\"type\":\"CNAME\"}]")
[[ $? -ne 0 ]] && echo -e "error updating godaddy record\n" && (echo $GODADDY_RESPONSE | jq -r .message) && exit 1
else
echo "godaddy record:" $GODADDY_RECORD "(matched)"
fi
@bmk10
Copy link
Copy Markdown

bmk10 commented Sep 15, 2020

what os it on ?? linux.. would like to also go windows/raspberry pi and maybe macosx, as one machine = one root domain.,

@alyyousuf7
Copy link
Copy Markdown
Author

It should work on any linux/unix, that includes raspberry pi and macos..
However you’d need to install jq..

Windows, erm, is a bit hassle to support..

@bmk10
Copy link
Copy Markdown

bmk10 commented Sep 15, 2020

I can later rewrite a php curl script, for godaddy(I can transparent to the OS systems). I did it before to auto make mysql databases godaddy/aws didn't network violations for this, since it was over 1000 x 2 gig dbs, on the farm. but I cheated, I stole the cookie from myself on the site, and automated some really long takeing dialogs. its nice how there is just a key and secret now. with all these oauth api coming out.

hack is to open dev tools(f10/12) in chrome, then 2nd click on the api http call and do 'copy as cURL' then paste that code,(fix it up a little), and a few variable, and add a loop and automate from database =]

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