#!/bin/bash set -e stty &> /dev/null || \ sleep $[$RANDOM%60] if ! ipCmd="$(which ip 2> /dev/null)" then for p1 in / /usr/ do for p2 in bin/ sbin/ do ipCmd="${p1}${p2}ip" [ -x "${ipCmd}" ] && break done [ -x "${ipCmd}" ] && break done fi while read -r ipVer authToken dev dnsName do if [[ "${ipVer}" = "#"* ]] || [ -z "${ipVer}" ] then continue fi if [ ${ipVer} == "4" ] then dnsVer="A" inetVer="inet" syncPre="" elif [ ${ipVer} == "6" ] then dnsVer="AAAA" inetVer="inet6" syncPre="v6." else >&2 echo 'Error: First column in "#ETCDIR#/update-ddns.conf" needs to be "4" or "6"!' exit 1 fi if [ -z "${dnsName}" ] then dnsIps="$( curl -${ipVer} "${dev}" 2> /dev/null )" ips="1" unset updateIp else dnsIps="$( dig "${dnsName}" ${dnsVer} | \ grep -v '^\s*\(;\|$\)' | \ grep "\s${dnsVer}\s" | \ awk '{print $5}' | \ sort -u )" ips="$( "${ipCmd}" addr show dev "${dev}" | \ grep "^\s*${inetVer}\s.*\sscope\sglobal\s" | \ awk '{print $2}' | \ cut -d/ -f1 | \ sort -u )" if [ $(echo "${ips}" | wc -l) -eq 1 ] then updateIp='?address='"${ips}" else unset updateIp fi fi if [ -z "$( ( echo "${dnsIps}" echo "${ips}" ) | \ sort | \ uniq -d )" ] then curl -sS "https://${syncPre}sync.afraid.org/u/${authToken}/${updateIp}" 2> /dev/null fi done < #ETCDIR#/update-ddns.conf