From 8a9124dfc0a4acc483716b60d5c3bfaf40342413 Mon Sep 17 00:00:00 2001 From: Christian Schoenebeck Date: Sat, 11 Oct 2014 11:00:19 +0200 Subject: [PATCH] ddns-scripts: add retry loop to verify dns and proxy Changed the verify of DNS server and proxy at script start to retry the verify if there are connection problems during verify plus some minor changes. Signed-off-by: Christian Schoenebeck --- net/ddns-scripts/Makefile | 2 +- .../usr/lib/ddns/dynamic_dns_functions.sh | 32 ++++--- .../files/usr/lib/ddns/dynamic_dns_updater.sh | 87 ++++++++++++++----- net/ddns-scripts/files/usr/lib/ddns/services | 2 +- 4 files changed, 83 insertions(+), 40 deletions(-) diff --git a/net/ddns-scripts/Makefile b/net/ddns-scripts/Makefile index 71ab4b66e..71c57866e 100644 --- a/net/ddns-scripts/Makefile +++ b/net/ddns-scripts/Makefile @@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ddns-scripts PKG_VERSION:=2.0.1 -PKG_RELEASE:=8 +PKG_RELEASE:=9 PKG_LICENSE:=GPL-2.0 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) diff --git a/net/ddns-scripts/files/usr/lib/ddns/dynamic_dns_functions.sh b/net/ddns-scripts/files/usr/lib/ddns/dynamic_dns_functions.sh index 33aeb1979..aeabe5280 100644 --- a/net/ddns-scripts/files/usr/lib/ddns/dynamic_dns_functions.sh +++ b/net/ddns-scripts/files/usr/lib/ddns/dynamic_dns_functions.sh @@ -63,6 +63,7 @@ ERR_LOCAL_IP=0 # error counter on getting local ip ERR_REG_IP=0 # error counter on getting DNS registered ip ERR_SEND=0 # error counter on sending update to DNS provider ERR_UPDATE=0 # error counter on different local and registered ip +ERR_VERIFY=0 # error counter verifying proxy- and dns-servers # format to show date information in log and luci-app-ddns default ISO 8601 format DATE_FORMAT=$(uci -q get ddns.global.date_format) || DATE_FORMAT="%F %R" @@ -122,10 +123,10 @@ start_daemon_for_all_ddns_sections() local __SECTIONID="" local __IFACE="" - config_cb() + config_cb() { # only look for section type "service", ignore everything else - [ "$1" == "service" ] && __SECTIONS="$__SECTIONS $2" + [ "$1" = "service" ] && __SECTIONS="$__SECTIONS $2" } config_load "ddns" @@ -214,7 +215,7 @@ __urlencode() { return 0 } -# extract update_url for given DDNS Provider from +# extract url or script for given DDNS Provider from # file /usr/lib/ddns/services for IPv4 or from # file /usr/lib/ddns/services_ipv6 for IPv6 get_service_data() { @@ -387,25 +388,27 @@ __verify_host_port() { # command error [ $__ERR -gt 0 ] && { verbose_echo "\n!!!!!!!!! ERROR =: BusyBox nslookup Error '$__ERR'\n$(eval $__ERRPROG)\n" - syslog_err "DNS Resolver Error - BusyBox nslookup Error: '$__ERR'" + syslog_err "DNS Resolver Error - BusyBox nslookup Error '$__ERR'" return 2 } || { # we need to run twice because multi-line output needs to be directly piped to grep because # pipe returns return code of last prog in pipe but we need errors from nslookup command - __IPV4=$(eval $__RUNPROG | sed '1,2d' | grep -o "Name:\|Address.*" | grep -m 1 -o "$IPV4_REGEX") - __IPV6=$(eval $__RUNPROG | sed '1,2d' | grep -o "Name:\|Address.*" | grep -m 1 -o "$IPV6_REGEX") + __IPV4=$(eval $__RUNPROG | sed -ne "3,\$ { s/^Address [0-9]*: \($IPV4_REGEX\).*$/\\1/p }") + __IPV6=$(eval $__RUNPROG | sed -ne "3,\$ { s/^Address [0-9]*: \($IPv6_REGEX\).*$/\\1/p }") } # check IP version if forced if [ $force_ipversion -ne 0 ]; then - [ $use_ipv6 -eq 0 -a -z "$__IPV4" ] && return 4 - [ $use_ipv6 -eq 1 -a -z "$__IPV6" ] && return 4 + __ERR=0 + [ $use_ipv6 -eq 0 -a -z "$__IPV4" ] && __ERR=4 + [ $use_ipv6 -eq 1 -a -z "$__IPV6" ] && __ERR=6 + [ $__ERR -gt 0 ] && critical_error "Invalid host: Error '4' - Force IP Version IPv$__ERR not supported" fi # verify nc command # busybox nc compiled without -l option "NO OPT l!" -> critical error nc --help 2>&1 | grep -iq "NO OPT l!" && \ - critical_error "Busybox nc: netcat compiled with errors" + critical_error "Busybox nc: netcat compiled without -l option, error 'NO OPT l!'" # busybox nc compiled with extensions nc --help 2>&1 | grep -q "\-w" && __NCEXT="TRUE" @@ -428,7 +431,7 @@ __verify_host_port() { __ERR=$? [ $__ERR -eq 0 ] && return 0 verbose_echo "\n!!!!!!!!! ERROR =: BusyBox nc Error '$__ERR'\n$(eval $__ERRPROG)\n" - syslog_err "host verify Error - BusyBox nc Error: '$__ERR'" + syslog_err "host verify Error - BusyBox nc Error '$__ERR'" return 3 else # nc compiled without extensions (no timeout support) __RUNPROG="__timeout 2 -- nc $__IP $__PORT /dev/null 2>&1" @@ -437,7 +440,7 @@ __verify_host_port() { __ERR=$? [ $__ERR -eq 0 ] && return 0 verbose_echo "\n!!!!!!!!! ERROR =: BusyBox nc Error '$__ERR' (timeout)" - syslog_err "host verify Error - BusyBox nc Error: '$__ERR' (timeout)" + syslog_err "host verify Error - BusyBox nc Error '$__ERR' (timeout)" return 3 fi } @@ -454,8 +457,9 @@ verify_dns() { verify_proxy() { # $1 Proxy-String to verify # complete entry user:password@host:port + # inside user and password NO '@' of ":" allowed # host and port only host:port - # host only host unsupported + # host only host ERROR unsupported # IPv4 address instead of host 123.234.234.123 # IPv6 address instead of host [xxxx:....:xxxx] in square bracket local __TMP __HOST __PORT @@ -477,8 +481,8 @@ verify_proxy() { __HOST=$(echo $__TMP | awk -F ":" '{print $1}') __PORT=$(echo $__TMP | awk -F ":" '{print $2}') fi - # No Port detected ERROR 5 - [ -z "$__PORT" ] && return 5 + # No Port detected + [ -z "$__PORT" ] && critical_error "Invalid Proxy server Error '5' - proxy port missing" __verify_host_port "$__HOST" "$__PORT" } diff --git a/net/ddns-scripts/files/usr/lib/ddns/dynamic_dns_updater.sh b/net/ddns-scripts/files/usr/lib/ddns/dynamic_dns_updater.sh index 3892c69d8..6c715cb49 100755 --- a/net/ddns-scripts/files/usr/lib/ddns/dynamic_dns_updater.sh +++ b/net/ddns-scripts/files/usr/lib/ddns/dynamic_dns_updater.sh @@ -213,36 +213,75 @@ fi verbose_echo " waiting =: 10 seconds for interfaces to fully come up" sleep 10 -# verify DNS server -[ -n "$dns_server" ] && { - verbose_echo "******* VERIFY =: DNS server '$dns_server'" +# verify DNS server: +# do with retry's because there might be configurations +# not directly could connect to outside dns when interface is already up +ERR_VERIFY=0 # reset err counter +while [ -n "$dns_server" ]; do + [ $ERR_VERIFY -eq 0 ] && verbose_echo "******* VERIFY =: DNS server '$dns_server'" verify_dns "$dns_server" - case $? in - 0) ;; # everything OK - 2) critical_error "Invalid DNS server Error: '2' - nslookup can not resolve host";; - 3) critical_error "Invalid DNS server Error: '3' - nc (netcat) can not connect";; - 4) critical_error "Invalid DNS server Error: '4' - Forced IP Version don't matched";; - *) critical_error "Invalid DNS server Error: '1' - unspecific error";; + ERR_LAST=$? # save return value + [ $ERR_LAST -eq 0 ] && break # everything ok leave while loop + ERR_VERIFY=$(( $ERR_VERIFY + 1 )) + # if error count > retry_count leave here with critical error + [ $ERR_VERIFY -gt $retry_count ] && { + case $ERR_LAST in + 2) critical_error "Invalid DNS server Error: '2' - nslookup can not resolve host";; + 3) critical_error "Invalid DNS server Error: '3' - nc (netcat) can not connect";; + *) critical_error "Invalid DNS server Error: '$ERR_LAST' - unspecific error";; + esac + } + case $ERR_LAST in + 2) syslog_err "Invalid DNS server Error: '2' - nslookup can not resolve host - retry $ERR_VERIFY/$retry_count in $RETRY_SECONDS seconds\n";; + 3) syslog_err "Invalid DNS server Error: '3' - nc (netcat) can not connect - retry $ERR_VERIFY/$retry_count in $RETRY_SECONDS seconds\n";; + *) syslog_err "Invalid DNS server Error: '$ERR_LAST' - unspecific error - retry $ERR_VERIFY/$retry_count in $RETRY_SECONDS seconds\n";; esac -} + [ $VERBOSE_MODE -gt 1 ] && { + # VERBOSE_MODE > 1 then NO retry + verbose_echo "\n!!!!!!!!! ERROR =: Verbose Mode - NO retry\n" + break + } + verbose_echo "******** RETRY =: DNS server '$dns_server' - retry $ERR_VERIFY/$retry_count in $RETRY_SECONDS seconds" + sleep $RETRY_SECONDS +done # verify Proxy server and set environment +# do with retry's because there might be configurations +# not directly could connect to outside dns when interface is already up +ERR_VERIFY=0 # reset err counter [ -n "$proxy" ] && { - verbose_echo "******* VERIFY =: Proxy server 'http://$proxy'" + [ $ERR_VERIFY -eq 0 ] && verbose_echo "******* VERIFY =: Proxy server 'http://$proxy'" verify_proxy "$proxy" - case $? in - 0) # everything OK - export HTTP_PROXY="http://$proxy" - export HTTPS_PROXY="http://$proxy" - export http_proxy="http://$proxy" - export https_proxy="http://$proxy" - ;; - 2) critical_error "Invalid Proxy server Error: '2' - nslookup can not resolve host";; - 3) critical_error "Invalid Proxy server Error: '3' - nc (netcat) can not connect";; - 4) critical_error "Invalid Proxy server Error: '4' - Forced IP Version don't matched";; - 5) critical_error "Invalid Proxy server Error: '5' - proxy port missing";; - *) critical_error "Invalid Proxy server Error: '1' - unspecific error";; + ERR_LAST=$? # save return value + [ $ERR_LAST -eq 0 ] && { + # everything ok set proxy and leave while loop + export HTTP_PROXY="http://$proxy" + export HTTPS_PROXY="http://$proxy" + export http_proxy="http://$proxy" + export https_proxy="http://$proxy" + break + } + ERR_VERIFY=$(( $ERR_VERIFY + 1 )) + # if error count > retry_count leave here with critical error + [ $ERR_VERIFY -gt $retry_count ] && { + case $ERR_LAST in + 2) critical_error "Invalid Proxy server Error '2' - nslookup can not resolve host";; + 3) critical_error "Invalid Proxy server Error '3' - nc (netcat) can not connect";; + *) critical_error "Invalid Proxy server Error '$ERR_LAST' - unspecific error";; + esac + } + case $ERR_LAST in + 2) syslog_err "Invalid Proxy server Error '2' - nslookup can not resolve host - retry $ERR_VERIFY/$retry_count in $RETRY_SECONDS seconds\n";; + 3) syslog_err "Invalid Proxy server Error '3' - nc (netcat) can not connect - retry $ERR_VERIFY/$retry_count in $RETRY_SECONDS seconds\n";; + *) syslog_err "Invalid Proxy server Error '$ERR_LAST' - unspecific error - retry $ERR_VERIFY/$retry_count in $RETRY_SECONDS seconds\n";; esac + [ $VERBOSE_MODE -gt 1 ] && { + # VERBOSE_MODE > 1 then NO retry + verbose_echo "\n!!!!!!!!! ERROR =: Verbose Mode - NO retry\n" + break + } + verbose_echo "******** RETRY =: Proxy server 'http://$proxy' - retry $ERR_VERIFY/$retry_count in $RETRY_SECONDS seconds" + sleep $RETRY_SECONDS } # let's check if there is already an IP registered at the web @@ -304,7 +343,7 @@ while : ; do if [ $VERBOSE_MODE -gt 2 ]; then verbose_echo " VERBOSE MODE =: NO UPDATE send to DDNS provider" elif [ "$LOCAL_IP" != "$REGISTERED_IP" ]; then - verbose_echo "******* UPDATE =: LOCAL: '$LOCAL_IP' <=> REGISTERED: '$REGISTERED_IP'" + verbose_echo "******* UPDATE =: LOCAL: '$LOCAL_IP' <> REGISTERED: '$REGISTERED_IP'" else verbose_echo "******* FORCED =: LOCAL: '$LOCAL_IP' == REGISTERED: '$REGISTERED_IP'" fi diff --git a/net/ddns-scripts/files/usr/lib/ddns/services b/net/ddns-scripts/files/usr/lib/ddns/services index 5bb2aee5e..bb447fb41 100644 --- a/net/ddns-scripts/files/usr/lib/ddns/services +++ b/net/ddns-scripts/files/usr/lib/ddns/services @@ -71,7 +71,7 @@ "duiadns.net" "http://ipv4.duia.ro/dynamic.duia?host=[DOMAIN]&password=[PASSWORD]&ip4=[IP]" # Two-DNS - Simply. Connected. Everywhere. -"Two-DNS" "http://[USERNAME]:[PASSWORD]@update.twodns.de/update?hostname=[DOMAIN]&ip=[IP]" +"twodns.de" "http://[USERNAME]:[PASSWORD]@update.twodns.de/update?hostname=[DOMAIN]&ip=[IP]" # MyDNS.JP "mydns.jp" "http://www.mydns.jp/directip.html?MID=[USERNAME]&PWD=[PASSWORD]&IPV4ADDR=[IP]"