144 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| # 2023-05-18 Hyperling
 | |
| # Keep afraid.org dynamic DNS synced on ISP connections without static IPs.
 | |
| 
 | |
| ## Setup ##
 | |
| 
 | |
| DIR="`dirname $0`"
 | |
| PROG=`basename $0`
 | |
| if [[ $DIR == "."* ]]; then
 | |
| 	DIR="`pwd`"
 | |
| fi
 | |
| 
 | |
| DOMAIN="sync.afraid.org"
 | |
| PROTOCOL="http"
 | |
| 
 | |
| KEYFILE_NAME="private.key"
 | |
| KEYFILE="$DIR/$KEYFILE_NAME"
 | |
| 
 | |
| ## Functions ##
 | |
| 
 | |
| function usage {
 | |
| 	# Accepts 1 parameter: The exit code to use.
 | |
| 	exit_status=$1
 | |
| 	echo "Usage: $PROG [-4] [-6] [-d | -t] [-v] [-h]" 1>&2
 | |
| 	cat <<- EOF
 | |
| 	   Program reads the local $KEYFILE_NAME and syncs with the Dynamic DNS provider.
 | |
| 
 | |
| 	   Current DNS providers are mentioned in the README, but initally only
 | |
| 	      afraid.org is being supported since that is the maintainer's primary
 | |
| 	      usage. More may be added eventually or you're welcome to contribute.
 | |
| 
 | |
| 	   Parameters:
 | |
| 	      -4 : Update IPV4.
 | |
| 	      -6 : Update IPV6.
 | |
| 	         * If neither 4 or 6 are provided, 4 is assumed as Yes.
 | |
| 	      -d : Perform a dry run, echoing the commands rather than doing the update.
 | |
| 	      -t : Test run. Alias for the dry run option above.
 | |
| 	      -v : Enable extra output, helpful for debugging.
 | |
| 	      -h : Print this list of parameters.
 | |
| 	EOF
 | |
| 	exit $exit_status
 | |
| }
 | |
| 
 | |
| function check {
 | |
| 	# Accepts parameter of status and whether the program is needs to quit.
 | |
| 	status=$1
 | |
| 	quit=$2
 | |
| 	if [[ $status != 0 ]]; then
 | |
| 		echo "ERROR: Did not receive a successful return message, got $status." 1>&2
 | |
| 		if [[ $quit == "Y" ]]; then
 | |
| 			exit $status
 | |
| 		fi
 | |
| 	fi
 | |
| 	echo "Status $status is acceptable."
 | |
| }
 | |
| 
 | |
| ## Validations ##
 | |
| 
 | |
| # Ensure the account key is present and has contents.
 | |
| if [[ ! -s $KEYFILE ]]; then
 | |
| 	echo "ERROR: Key file '$KEYFILE' is empty or does not exist." 1>&2
 | |
| 	echo -e "Please see '$DIR/README.md' for instructions.\n"
 | |
| 	usage
 | |
| fi
 | |
| 
 | |
| ## Parameters ##
 | |
| 
 | |
| while getopts ":46dtvh" opt; do
 | |
| 	case $opt in
 | |
| 		4)	v4="Y"
 | |
| 			;;
 | |
| 		6) v6="Y"
 | |
| 			;;
 | |
| 		d | t) dry_run="Y"
 | |
| 			;;
 | |
| 		v) set -x
 | |
| 			;;
 | |
| 		h) usage 0
 | |
| 			;;
 | |
| 		*) echo "ERROR: Parameter $opt not recognized."
 | |
| 			usage 1
 | |
| 			;;
 | |
| 	esac
 | |
| done
 | |
| 
 | |
| # Cannot set both 4 and 6, otherwise only the 2nd takes effect.
 | |
| if [[ -n $v4 && -n $v6 ]]; then
 | |
| 	echo "ERROR: Cannot set both v4 and v6, please only choose one." 1>&2
 | |
| 	usage 1
 | |
| fi
 | |
| 
 | |
| # If neither parameter was passed, assume 4 is wanted.
 | |
| if [[ -z $v4 && -z $v6 ]]; then
 | |
| 	v4="Y"
 | |
| fi
 | |
| 
 | |
| ## Main ##
 | |
| 
 | |
| # Use echo instead of cURL if doing a dry/test run.
 | |
| command="curl -w HTTP%{http_code}\n"
 | |
| if [[ $dry_run == "Y" ]]; then
 | |
| 	command="echo $command"
 | |
| fi
 | |
| 
 | |
| # Ensure permissions are strict.
 | |
| chmod -c 600 $KEYFILE
 | |
| 
 | |
| # Get the user's key
 | |
| if [[ -n $KEYFILE ]]; then
 | |
| 	key=`cat $KEYFILE`
 | |
| else
 | |
| 	echo "ERROR: Cannot find '$KEYFILE'. Please set up your account key." 1>&2
 | |
| 	usage 1
 | |
| fi
 | |
| 
 | |
| # Remove any padding like newlines or trailing spaces
 | |
| key=`echo $key`
 | |
| 
 | |
| # Ensure we got a value
 | |
| if [[ -z $key ]]; then
 | |
| 	echo "ERROR: Key contents were not read, is '$KEYFILE' set up proerly?." 1>&2
 | |
| 	usage 1
 | |
| fi
 | |
| 
 | |
| # Try to ensure the key is not going to cause a malformed link somehow.
 | |
| if [[ $key == *" "* ]]; then
 | |
| 	echo "WARNING: Space character found in key. Is that correct? Converting to %20." 1>&2
 | |
| 	key=${key// /%20}
 | |
| fi
 | |
| 
 | |
| uri="$DOMAIN/u/$key/"
 | |
| 
 | |
| # Connect with the provider.
 | |
| if [[ $v4 == "Y" ]]; then
 | |
| 	$command $PROTOCOL://$uri
 | |
| 	check $? Y
 | |
| fi
 | |
| if [[ $v6 == "Y" ]]; then
 | |
| 	$command $PROTOCOL://v6.$uri
 | |
| 	check $? Y
 | |
| fi
 | |
| 
 | |
| exit 0
 |