raspiblitz/home.admin/config.scripts/internet.dyndomain.sh
ChuckNorrison 1f0416bbbb
Add staticIP config and fix 127.0.0.1 (#3419)
* Add staticIP config and fix 127.0.0.1

Add possibility of a staticIP config in Raspiblitz.conf to override globalIP and publicIP detection.

Skip dyndns in case of static ip usage

if curl fails accidentaly it could result in the wrong IP. Only prefer if publicIP is empty.

* add FAQ entry

Co-authored-by: rootzoll <christian@geektank.de>
2022-12-10 14:53:29 +01:00

177 lines
5.3 KiB
Bash
Executable file

#!/bin/bash
# command info
if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then
echo "set a dynamic domain like freeDNS"
echo "internet.dyndomain.sh status"
echo "internet.dyndomain.sh on --> interactive setup"
echo "internet.dyndomain.sh on [domainName] [?updateURL]"
echo "internet.dyndomain.sh update"
echo "internet.dyndomain.sh off"
exit 1
fi
## get system configs
source /home/admin/raspiblitz.info 2>/dev/null
source /mnt/hdd/raspiblitz.conf 2>/dev/null
# GETTING STATUS
if [ "$1" = "status" ]; then
if [ ${#dynDomain} -gt 0 ]; then
echo "active=1"
echo "dynDomain='${dynDomain}'"
echo "dynUpdateUrl='${dynUpdateUrl}'"
echo "# checking if dyndomain dns resolving is matching public IP"
dynIPv4=$(host -W 8 ${dynDomain} | grep 'has address' | cut -d ' ' -f 4)
dynIPv6=$(host -W 8 ${dynDomain} | grep 'has IPv6 address' | cut -d ' ' -f 5)
source <(/home/admin/config.scripts/internet.sh status global)
echo "publicip='${publicip}'"
echo "dynipv4='${dynIPv4}'"
echo "dynipv6='${dynIPv6}'"
if [ ${#dynIPv4} -eq 0 ] && [ ${#dynIPv6} -eq 0 ]; then
echo "exists=0"
else
echo "exists=1"
fi
if [ "${publicip}" == "${dynIPv4}" ] || [ "${publicip}" == "${dynIPv6}" ]; then
echo "uptodate=1"
else
echo "uptodate=0"
fi
else
echo "active=0"
fi
exit
fi
# FUNCTION updating dyndomain (if update URL is set)
updateDynDNS()
{
if [ "${staticIP}" == "" ]; then
if [ ${#dynUpdateUrl} -gt 0 ]; then
echo "# calling: ${dynUpdateUrl}"
echo "# to update domain: ${dynDomain}"
curl -s --connect-timeout 6 ${dynUpdateUrl} 1>&2
else
echo "# dynUpdateUrl not set - not updating"
fi
else
echo "# staticIP is set - not updating"
fi
}
# UPDATE
if [ "$1" = "update" ]; then
echo "# internet.dyndomain.sh update"
if [ ${#dynUpdateUrl} -eq 0 ]; then
echo "error='no url set for dynamic domain update'"
exit 1
fi
updateDynDNS
exit
fi
# ON
if [ "$1" = "1" ] || [ "$1" = "on" ]; then
dynDomain=''
dynUpdateUrl=''
# when additional parameters are given
if [ $# > 1 ]; then
# 2. parameter is dyndomain (required)
dynDomain=$2
# 3. parameter is the update url (optional - could be that router is doing the update)
if [ $# > 2 ]; then
dynUpdateUrl=$3
fi
fi
# if no parameters --> ask for it interactive
if [ ${#dynDomain} -eq 0 ]; then
dynDomain=$(whiptail --inputbox "\nEnter the Dynamic Domain Name:\n(example: freedns.afraid.org)" 10 52 --title "Dynamic Domain" --backtitle "DynamicDNS" 3>&1 1>&2 2>&3)
# check if domain was entered
if [ ${#dynDomain} -eq 0 ]; then
whiptail --title " Error " --msgbox "\n Domain cannot be empty." 8 30
exit 1
fi
# check if domain exists
notFound=$(host -W 16 ${dynDomain} | grep -c 'not found')
if [ ${notFound} -eq 1 ]; then
whiptail --title " Error " --msgbox "\n Domain ${dynDomain} not found.\n Make sure it exists before setup. " 9 50
exit 1
fi
dynUpdateUrl=$(whiptail --inputbox "\nPublic IP Update URL:\n(freedns.afraid.org use 'DirectURL')" 10 52 --title "Update URL (optional)" --backtitle "DynamicDNS" 3>&1 1>&2 2>&3)
fi
# check if any input to set
if [ ${#dynDomain} -eq 0 ]; then
echo "error='missing parameter'"
exit 1
fi
echo "# switching the DynamicDNS ON"
echo "# dynDomain(${dynDomain})"
echo "# dynUpdateUrl(${dynUpdateUrl})"
# setting dynUpdateUrl is a bit complicated because value can contain chars that break sed replacement
# so first remove dynUpdateUrl from config and then add fresh as new line at the end
# remove line & write fresh
/home/admin/config.scripts/blitz.conf.sh set dynDomain "${dynDomain}"
# remove line & write fresh
/home/admin/config.scripts/blitz.conf.sh set dynUpdateUrl "${dynUpdateUrl}"
# make sure dyndomain is added to lnd config file (just edits the config file)
sudo /home/admin/config.scripts/lnd.tlscert.sh domain-add ${dynDomain}
# update the IP of the dyndomain once (if updateurl is set)
updateDynDNS
# just if lnd is running make sure to create a new TLS cert
lndRunning=$(systemctl is-active lnd | grep -c "^active")
if [ ${lndRunning} -eq 1 ]; then
echo "# lnd service is running - trigger TLS refresh"
sudo /home/admin/config.scripts/lnd.tlscert.sh refresh
else
# this is important during update/recovery to ensure non-blocking run
echo "# lnd service is not running - skipping TLS recreation"
fi
echo "# DynamicDNS is now ON"
exit
fi
# OFF
if [ "$1" = "0" ] || [ "$1" = "off" ]; then
echo "# switching DynamicDNS OFF"
# removing values in raspiblitz config
/home/admin/config.scripts/blitz.conf.sh delete dynUpdateUrl
/home/admin/config.scripts/blitz.conf.sh delete dynDomain
# lnd.conf: remove domain tls entries
sudo /home/admin/config.scripts/lnd.tlscert.sh domain-remove ALL
# just if lnd is running make sure to create a new TLS cert
lndRunning=$(systemctl is-active lnd | grep -c "^active")
if [ ${lndRunning} -eq 1 ]; then
echo "# lnd service is running - trigger TLS refresh"
sudo /home/admin/config.scripts/lnd.tlscert.sh refresh
else
echo "# lnd service is not running - skipping TLS recreation"
fi
echo "# DynamicDNS is now OFF"
exit
fi
# if not matching and exiting on one of the commands above
echo "error='unknown parameter'"
exit 1