#!/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 updateUrl dev dnsName do if [[ "${ipVer}" = '#'* ]] || [ -z "${ipVer}" ] then continue fi if [ "${ipVer}" == '4' ] then dnsVer='A' inetVer='inet' ipCmdVer='-4' elif [ "${ipVer}" == '6' ] then dnsVer='AAAA' inetVer='inet6' ipCmdVer='-6' 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 $1 "${dnsName}" ${dnsVer} | \ grep -v '^\s*\(;\|$\)' | \ grep "\s${dnsVer}\s" | \ awk '{print $5}' | \ sort -u )" if [ "${dev}" == "-" ] then unset dev else dev="dev ${dev}" fi ips="$( "${ipCmd}" -o "${ipCmdVer}" addr show ${dev} scope global | \ awk '{print $4}' | \ cut -d/ -f1 | \ sort -u )" if [ $(echo "${ips}" | wc -l) -eq 0 ] then unset updateIp else updateIp='address='"$(echo -n "${ips}" | tr '\n' ',')" if [[ "${updateUrl}" = *'?'* ]] then updateIp='&'"${updateIp}" else updateIp='?'"${updateIp}" fi fi fi if [ -z "$( ( echo "${dnsIps}" echo "${ips}" ) | \ sort | \ uniq -d )" ] then curl -${ipVer} -sS "${updateUrl}${updateIp}" 2> /dev/null fi done < #ETCDIR#/update-ddns.conf