Add scripts to automatically update the LAN DNS records.

./sbin/update-dns.sh may be called at regular intervals (one hour
or so) via crontab.

It will automatically detect:
- its local host name (*.lan.dougal.aaltronav.eu); and
- which IP has internet access, if any.

Armed with that information and with the dynamic DNS API password
stored in DYNDNS_PASSWD in ~/.dougalrc, it will update the relevant
DNS record.

For this to work, the first `lan.dougal` hostname in the Nginx
configuration must be the one that is set up for dynamic update.
Other `lan.dougal` hostnames should be CNAME records pointing to
the first one.
This commit is contained in:
D. Berge
2025-08-09 18:30:26 +02:00
parent ae8e5d4ef6
commit db97382758
2 changed files with 59 additions and 0 deletions

40
sbin/update-dns.sh Executable file
View File

@@ -0,0 +1,40 @@
#!/bin/bash
# Path to Nginx configuration file
NGINX_CONFIG="/etc/nginx/vhosts.d/dougal.conf"
# Extract the first hostname matching 'lan.dougal' from the config
# Assumes server_name lines like: server_name hostname1 hostname2;
HOSTNAME=$(grep -oE '[a-zA-Z0-9.-]*lan\.dougal[a-zA-Z0-9.-]*' "$NGINX_CONFIG" | head -n 1)
if [ -z "$HOSTNAME" ]; then
echo "Error: No matching hostname found in $NGINX_CONFIG"
exit 1
fi
# Path to IP retrieval script
IP_SCRIPT="$HOME/software/sbin/get-ip.sh"
# Get the current IPv4 address
IP_ADDRESS=$("$IP_SCRIPT")
if [ -z "$IP_ADDRESS" ]; then
echo "Error: Failed to retrieve IP address from $IP_SCRIPT"
exit 1
fi
# Check for DYNDNS_PASSWD environment variable
if [ -z "$DYNDNS_PASSWD" ]; then
echo "Error: DYNDNS_PASSWD environment variable is not set"
exit 1
fi
# Hurricane Electric DynDNS update URL
UPDATE_URL="https://dyn.dns.he.net/nic/update?hostname=$HOSTNAME&password=$DYNDNS_PASSWD&myip=$IP_ADDRESS"
# Send the update request and capture the response
RESPONSE=$(curl -s "$UPDATE_URL")
# Output the response for logging/debugging
echo "Update response for $HOSTNAME ($IP_ADDRESS): $RESPONSE"