env-docker/Config/DynamicDNS/update_dns.sh
Chad fa892cb3bd
Add Micro Configurations (#18)
* Begin changing files to recommendations rather than actual contents, that way multiple examples can be shown and when they are changed to be the real .yml they are not added to the project.

* Shrink the PHP limits more.

* Convert all configurations to be micro/standard.

* Double check the script supports IPv6. Shrink case statement.

* Fix uncommented nc-oo.

* Shrink NC further.

* Change name of env example.

* Change name of env example.

* Do not provide micro versions of DNS or PhotoPrism.

* Fix error in NC checks, wants at least 512M.

* Shrink more.

* Add a folder to keep static resources.

* Copy static resources into the container. This unfortunately doubles the size right now. Maybe do a volume in the future.

* Bring the description up to date.

* Make the description slightly more agnostic.

* Be more consistent about using variable.
2024-01-24 11:05:44 +00:00

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 should 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