Chad
fa892cb3bd
* 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.
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 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
|