Add Dynamic DNS Script (#9)
* Initial commit for Dynamic DNS code. Not in a runnable state but as far as I can get for now. * Bring shell script for Dynamic DNS to working order. Dry runs are going well. Have not tested against a production environment yet. * Add instructions for No-IP in case it needs installed later.. * Variablize the full path to the keyfile. Enforce strict permissions on the file. * Final updates after successful testing. * Update instructions, add examples. * Fix usage. * Remove unnecessary asterisk.
This commit is contained in:
parent
5d9c5e495d
commit
e383520ebb
4
.gitignore
vendored
4
.gitignore
vendored
@ -14,6 +14,8 @@ Config/ReverseProxy/config/hosts/*
|
|||||||
Config/ReverseProxy/config/load.conf.d/*
|
Config/ReverseProxy/config/load.conf.d/*
|
||||||
Config/ReverseProxy/config/mail.conf.d/*
|
Config/ReverseProxy/config/mail.conf.d/*
|
||||||
|
|
||||||
# Ignore MailServer Files
|
# Ignore downloaded mail server files
|
||||||
Config/MailServer/setup.sh
|
Config/MailServer/setup.sh
|
||||||
|
|
||||||
|
# Ignore any private key information
|
||||||
|
private.key
|
||||||
|
66
Config/DynamicDNS/README.md
Normal file
66
Config/DynamicDNS/README.md
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
# Dynamic DNS Updater
|
||||||
|
|
||||||
|
This script is meant to be added to cron if you are using afraid.org as your
|
||||||
|
dynamic DNS provider. Similar may be possible with sites such as dyn.org or
|
||||||
|
noip.com but are currently not supported in this project. Links to some of these
|
||||||
|
product's self-built solutions can be found below.
|
||||||
|
|
||||||
|
## Afraid.org Version 2 Instructions
|
||||||
|
|
||||||
|
1. Install this project.
|
||||||
|
|
||||||
|
```
|
||||||
|
git clone https://github.com/Hyperling/docker $PROJECT_DIR
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Add your Afraid DNS account key to $PROJECT_DIR/Config/DynamicDNS/private.key
|
||||||
|
Account key can be found [here](https://freedns.afraid.org/dynamic/v2/).
|
||||||
|
|
||||||
|
1. Add this line to the system's cron scheduling using a command like `crontab -e`.
|
||||||
|
|
||||||
|
```
|
||||||
|
5 * * * * $PROJECT_DIR/Config/DynamicDNS/update_dns.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### TESTING
|
||||||
|
|
||||||
|
Please ensure all testing is done with the test or dry run flags. If you run
|
||||||
|
this for your private key outside of your network then your Dynamic DNS may
|
||||||
|
become inaccurate. This program is only intended to be run in a production
|
||||||
|
manner on the network which needs the Dynamic DNS pointing towards it.
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ./update_dns.sh -4
|
||||||
|
Updated DOMAIN from 1:2:3:4:5:6:7:8 to 1.2.3.4
|
||||||
|
HTTP200
|
||||||
|
Status 0 is acceptable.
|
||||||
|
```
|
||||||
|
```
|
||||||
|
$ ./update_dns.sh -6
|
||||||
|
Updated DOMAIN from 1.2.3.4 to 1:2:3:4:5:6:7:8
|
||||||
|
HTTP200
|
||||||
|
Status 0 is acceptable.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Afraid.org Version 1 Instructions
|
||||||
|
|
||||||
|
Add one of these to your crontab. Basically what the script does without fancy
|
||||||
|
options and checks. Please be concious of how often you knock on the servers,
|
||||||
|
and preferably add a 30-45 second sleep so that you do not hit near :00 seconds.
|
||||||
|
|
||||||
|
```
|
||||||
|
*/4 * * * * sleep 28; curl http://freedns.afraid.org/dynamic/update.php?YOUR_V1_KEY_GOES_HERE
|
||||||
|
```
|
||||||
|
```
|
||||||
|
*/7 * * * * sleep 42; wget -O http://freedns.afraid.org/dynamic/update.php?YOUR_V1_KEY_GOES_HERE
|
||||||
|
```
|
||||||
|
|
||||||
|
## Other Dynamic DNS Hosts
|
||||||
|
|
||||||
|
### No-IP.org Instructions
|
||||||
|
|
||||||
|
Please see this guide on installing the Dynamic Update Client (DUC).
|
||||||
|
|
||||||
|
https://my.noip.com/dynamic-dns/duc
|
149
Config/DynamicDNS/update_dns.sh
Executable file
149
Config/DynamicDNS/update_dns.sh
Executable file
@ -0,0 +1,149 @@
|
|||||||
|
#!/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
|
Loading…
x
Reference in New Issue
Block a user