Skip to content

Instantly share code, notes, and snippets.

@davidswelt
Forked from nmschulte/nfsn.api.sh
Last active March 3, 2019 01:49
Show Gist options
  • Save davidswelt/63f9e00cfa7ef56b97c4ddc381271c6e to your computer and use it in GitHub Desktop.
Save davidswelt/63f9e00cfa7ef56b97c4ddc381271c6e to your computer and use it in GitHub Desktop.
NearlyFreeSpeech.NET API request "library", in pure shell (requires sha1sum and curl)
#!/usr/bin/env sh
# Copyright (c) 2015 Nathan Schulte
# set LOGIN and API_KEY below --
# see bottom for example use, in this case, checking and updating the default DNS A RR for a domain
# 0: request URI, e.g. '/dns/example.com/listRRs'
# 1..n: parameters
make_request () {
LOGIN=''
TIMESTAMP=$(date +%s)
SALT=$(LC_CTYPE=C tr -dc 'a-zA-Z0-9' < /dev/urandom | head -c 16)
API_KEY=''
REQUEST_URI="$1"
if [ "$#" -gt "1" ]; then
PARAMETERS="$2"
fi
COUNT=3
while test $COUNT -le $#
do
eval "PARAMETER=\$$COUNT"
PARAMETERS="$PARAMETERS&$PARAMETER"
COUNT=$((COUNT + 1))
done
BODY=$PARAMETERS
BODY_HASH=$(printf "%s" "$BODY" | sha1sum | awk '{print $1}')
HASH_STRING=$(printf "%s" "$LOGIN;$TIMESTAMP;$SALT;$API_KEY;$REQUEST_URI;$BODY_HASH")
HASH=$(printf "%s" "$HASH_STRING" | sha1sum | awk '{print $1}')
#echo "Hash String: $HASH_STRING"
#echo "Hash: $HASH"
#echo "Parameters: $PARAMETERS"
#echo "Body: $BODY"
#echo "Body Hash: $BODY_HASH"
#echo "Login: $LOGIN"
#echo "Timestamp: $TIMESTAMP"
#echo "Salt: $SALT"
#echo "API Key: $API_KEY"
#echo "Request URI: $REQUEST_URI"
#echo "requesting $REQUEST_URI with $BODY"
printf "%s" "$(curl -s -o - -k -X POST -H "X-NFSN-Authentication: $LOGIN;$TIMESTAMP;$SALT;$HASH" -d "$BODY" "https://api.nearlyfreespeech.net$REQUEST_URI")"
}
A_RECORD=$(make_request '/dns/example.com/listRRs' 'name=' 'type=A' | sed 's/.*"data":"\([0-9\.]*\)".*/\1/')
# IP="127.0.0.1" #`ip -o addr show ppp0 | awk 'FNR == 2 {print $4}'`
# Get IP
IP=$(curl https://api.ipify.org)
echo "existing record: $A_RECORD"
echo "current address: $IP"
if [ "$IP" != "$A_RECORD" ]; then
make_request '/dns/example.com/removeRR' 'name=' 'type=A' "data=$A_RECORD"
make_request '/dns/example.com/addRR' 'name=' 'type=A' "data=$IP"
fi
@davidswelt
Copy link
Author

This gets the public IP via api.ipify.org, and salt generation works on macOS, too.

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