ddns-scripts: new Version 2.1.0-2

- moved /usr/lib/ddns/dynamic_dns_lucihelper.sh from luci-app-ddns into this package
	(Github openwrt/luci issue 251)
	(OpenWrt Trac tickets 18326 18347)
- fix: dynamic_dns_update.sh did not loop
	(OpenWrt Trac ticket 18336)
- add provider cloudflare.com IPv4 and IPv6 (Thanks to Paul for support and testing)
	(OpenWrt Trac ticket 12500)
- modified detection, if dynamic_dns_fuctions are used by dynamic_dns_lucihelper.sh
- redirect stdout of wget,curl,host,nslookup,nc etc to /tmp/ddns_$$.dat and *.err instead of variables
- extended error detection in get_local_ip function
- modified verify of option ip_script to allow parameters, when calling
- add provider selfhost.de IPv4
- add provider no-ip.pl (nothing to do with no-ip.com)
	(Github openwrt/packages issue #542)
	IPv4 (tested) and also added for
	IPv6 (NOT tested) because client IP is autodetected be provider
- add getlocalip_sample.sh as sample script for usage of
	option ip_source 'script'  together with
	option ip_script '/usr/lib/ddns/getlocalip.sh -4'
- cleanup whitespaces at line ends

Signed-off-by: Christian Schoenebeck <christian.schoenebeck@gmail.com>
This commit is contained in:
Christian Schoenebeck
2014-11-15 21:28:01 +01:00
parent a23e8f6bc1
commit ab2b229ad6
15 changed files with 550 additions and 262 deletions
@@ -6,7 +6,7 @@
# (Loosely) based on the script on the one posted by exobyte in the forums here:
# http://forum.openwrt.org/viewtopic.php?id=14040
#
# extended and partial rewritten in August 2014
# extended and partial rewritten in August 2014
# by Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
# to support:
# - IPv6 DDNS services
@@ -14,7 +14,7 @@
# - Proxy Server to send out updates or retrieving WEB based IP detection
# - force_interval=0 to run once (usefull for cron jobs etc.)
# - the usage of BIND's host instead of BusyBox's nslookup if installed (DNS via TCP)
# - extended Verbose Mode and log file support for better error detection
# - extended Verbose Mode and log file support for better error detection
#
# function timeout
# copied from http://www.ict.griffith.edu.au/anthony/software/timeout.sh
@@ -32,14 +32,16 @@
SECTION_ID="" # hold config's section name
VERBOSE_MODE=1 # default mode is log to console, but easily changed with parameter
PIDFILE="" # pid file
UPDFILE="" # store UPTIME of last update
# directory to store run information to.
# directory to store run information to.
RUNDIR=$(uci -q get ddns.global.run_dir) || RUNDIR="/var/run/ddns"
# NEW # directory to store log files
LOGDIR=$(uci -q get ddns.global.log_dir) || LOGDIR="/var/log/ddns"
LOGFILE="" # NEW # logfile can be enabled as new option
PIDFILE="" # pid file
UPDFILE="" # store UPTIME of last update
DATFILE="/tmp/ddns_$$.dat" # save stdout data of WGet and other extern programs called
ERRFILE="/tmp/ddns_$$.err" # save stderr output of WGet and other extern programs called
# number of lines to before rotate logfile
LOGLINES=$(uci -q get ddns.global.log_lines) || LOGLINES=250
LOGLINES=$((LOGLINES + 1)) # correct sed handling
@@ -74,6 +76,9 @@ IPV4_REGEX="[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"
# IPv6 ( ( 0-9a-f 1-4char ":") min 1x) ( ( 0-9a-f 1-4char )optional) ( (":" 0-9a-f 1-4char ) min 1x)
IPV6_REGEX="\(\([0-9A-Fa-f]\{1,4\}:\)\{1,\}\)\(\([0-9A-Fa-f]\{1,4\}\)\{0,1\}\)\(\(:[0-9A-Fa-f]\{1,4\}\)\{1,\}\)"
# detect if called by dynamic_dns_lucihelper.sh script, disable retrys (empty variable == false)
[ "$(basename $0)" = "dynamic_dns_lucihelper.sh" ] && LUCI_HELPER="TRUE" || LUCI_HELPER=""
# loads all options for a given package and section
# also, sets all_option_variables to a list of the variable names
# $1 = ddns, $2 = SECTION_ID
@@ -101,7 +106,7 @@ load_all_config_options()
}
config_load "$__PKGNAME"
# Given SECTION_ID not found so no data, so return 1
[ -z "$__ALL_OPTION_VARIABLES" ] && return 1
@@ -113,17 +118,17 @@ load_all_config_options()
}
# read's all service sections from ddns config
# $1 = Name of variable to store
# $1 = Name of variable to store
load_all_service_sections() {
local __DATA=""
config_cb()
config_cb()
{
# only look for section type "service", ignore everything else
[ "$1" = "service" ] && __DATA="$__DATA $2"
}
config_load "ddns"
eval "$1='$__DATA'"
eval "$1=\"$__DATA\""
return
}
@@ -143,7 +148,7 @@ start_daemon_for_all_ddns_sections()
for __SECTIONID in $__SECTIONS; do
config_get __IFACE "$__SECTIONID" interface "wan"
[ -z "$__EVENTIF" -o "$__IFACE" = "$__EVENTIF" ] || continue
/usr/lib/ddns/dynamic_dns_updater.sh $__SECTIONID 0 > /dev/null 2>&1 &
/usr/lib/ddns/dynamic_dns_updater.sh $__SECTIONID 0 >/dev/null 2>&1 &
done
}
@@ -224,7 +229,7 @@ write_log() {
# VERBOSE_MODE > 1 then NO loop so NO truncate log to $LOGLINES lines
[ $VERBOSE_MODE -gt 1 ] || sed -i -e :a -e '$q;N;'$LOGLINES',$D;ba' $LOGFILE
fi
[ "$SECTION_ID" = "lucihelper" ] && return # nothing else todo when running LuCI helper script
[ $LUCI_HELPER ] && return # nothing else todo when running LuCI helper script
[ $__LEVEL -eq 7 ] && return # no syslog for debug messages
[ $__EXIT -eq 1 ] && {
$__CMD # force syslog before exit
@@ -272,7 +277,7 @@ urlencode() {
__POS=$(( $__POS + 1 )) # increment position
done
eval "$1='$__ENC'" # transfer back to variable
eval "$1=\"$__ENC\"" # transfer back to variable
return 0
}
@@ -312,9 +317,9 @@ get_service_data() {
# check is URL or SCRIPT is given
__URL=$(echo "$__DATA" | grep "^http:")
[ -z "$__URL" ] && __SCRIPT="/usr/lib/ddns/$__DATA"
eval "$1='$__URL'"
eval "$2='$__SCRIPT'"
eval "$1=\"$__URL\""
eval "$2=\"$__SCRIPT\""
return 0
}
@@ -438,7 +443,7 @@ timeout() {
verify_host_port() {
local __HOST=$1
local __PORT=$2
local __TMP __IP __IPV4 __IPV6 __RUNPROG __ERRPROG __ERR
local __IP __IPV4 __IPV6 __RUNPROG __ERR
# return codes
# 1 system specific error
# 2 nslookup error
@@ -447,20 +452,19 @@ verify_host_port() {
[ $# -ne 2 ] && write_log 12 "Error calling 'verify_host_port()' - wrong number of parameters"
__RUNPROG="nslookup $__HOST 2>/dev/null"
__ERRPROG="nslookup $__HOST 2>&1"
__RUNPROG="/usr/bin/nslookup $__HOST >$DATFILE 2>$ERRFILE"
write_log 7 "#> $__RUNPROG"
__TMP=$(eval $__RUNPROG) # test if nslookup runs without errors
eval $__RUNPROG
__ERR=$?
# command error
[ $__ERR -gt 0 ] && {
write_log 7 "Error:\n$(eval $__ERRPROG)"
write_log 3 "DNS Resolver Error - BusyBox nslookup Error '$__ERR'"
write_log 7 "Error:\n$(cat $ERRFILE)"
return 2
}
# extract IP address
__IPV4=$(echo "$__TMP" | sed -ne "3,\$ { s/^Address [0-9]*: \($IPV4_REGEX\).*$/\\1/p }")
__IPV6=$(echo "$__TMP" | sed -ne "3,\$ { s/^Address [0-9]*: \($IPV6_REGEX\).*$/\\1/p }")
__IPV4=$(cat $DATFILE | sed -ne "3,\$ { s/^Address [0-9]*: \($IPV4_REGEX\).*$/\\1/p }")
__IPV6=$(cat $DATFILE | sed -ne "3,\$ { s/^Address [0-9]*: \($IPV6_REGEX\).*$/\\1/p }")
# check IP version if forced
if [ $force_ipversion -ne 0 ]; then
@@ -468,17 +472,17 @@ verify_host_port() {
[ $use_ipv6 -eq 0 -a -z "$__IPV4" ] && __ERR=4
[ $use_ipv6 -eq 1 -a -z "$__IPV6" ] && __ERR=6
[ $__ERR -gt 0 ] && {
[ "$SECTION_ID" = "lucihelper" ] && return 4
write_log 14 "Invalid host Error '4' - Forced IP Version IPv$__ERR don't match"
[ $LUCI_HELPER ] && return 4
write_log 14 "Verify host Error '4' - Forced IP Version IPv$__ERR don't match"
}
fi
# verify nc command
# busybox nc compiled without -l option "NO OPT l!" -> critical error
nc --help 2>&1 | grep -i "NO OPT l!" >/dev/null 2>&1 && \
/usr/bin/nc --help 2>&1 | grep -i "NO OPT l!" >/dev/null 2>&1 && \
write_log 12 "Busybox nc (netcat) compiled without '-l' option, error 'NO OPT l!'"
# busybox nc compiled with extensions
nc --help 2>&1 | grep "\-w" >/dev/null 2>&1 && __NCEXT="TRUE"
/usr/bin/nc --help 2>&1 | grep "\-w" >/dev/null 2>&1 && __NCEXT="TRUE"
# connectivity test
# run busybox nc to HOST PORT
@@ -488,18 +492,17 @@ verify_host_port() {
# so if not "force_ipversion" to use_ipv6 then connect test via ipv4, if availible
[ $force_ipversion -ne 0 -a $use_ipv6 -ne 0 -o -z "$__IPV4" ] && __IP=$__IPV6 || __IP=$__IPV4
if [ -n "$__NCEXT" ]; then # nc compiled with extensions (timeout support)
__RUNPROG="nc -w 1 $__IP $__PORT </dev/null >/dev/null 2>&1"
__ERRPROG="nc -vw 1 $__IP $__PORT </dev/null 2>&1"
if [ -n "$__NCEXT" ]; then # BusyBox nc compiled with extensions (timeout support)
__RUNPROG="/usr/bin/nc -vw 1 $__IP $__PORT </dev/null >$DATFILE 2>$ERRFILE"
write_log 7 "#> $__RUNPROG"
eval $__RUNPROG
__ERR=$?
[ $__ERR -eq 0 ] && return 0
write_log 7 "Error:\n$(eval $__ERRPROG)"
write_log 3 "Connect error - BusyBox nc (netcat) Error '$__ERR'"
write_log 7 "Error:\n$(cat $ERRFILE)"
return 3
else # nc compiled without extensions (no timeout support)
__RUNPROG="timeout 2 -- nc $__IP $__PORT </dev/null >/dev/null 2>&1"
__RUNPROG="timeout 2 -- /usr/bin/nc $__IP $__PORT </dev/null >$DATFILE 2>$ERRFILE"
write_log 7 "#> $__RUNPROG"
eval $__RUNPROG
__ERR=$?
@@ -514,20 +517,20 @@ verify_host_port() {
verify_dns() {
local __ERR=255 # last error buffer
local __CNT=0 # error counter
[ $# -ne 1 ] && write_log 12 "Error calling 'verify_dns()' - wrong number of parameters"
write_log 7 "Verify DNS server '$1'"
while [ $__ERR -gt 0 ]; do
while [ $__ERR -ne 0 ]; do
# DNS uses port 53
verify_host_port "$1" "53"
__ERR=$?
if [ "$SECTION_ID" = "lucihelper" ]; then # no retry if called by LuCI helper script
if [ $LUCI_HELPER ]; then # no retry if called by LuCI helper script
return $__ERR
elif [ $__ERR -gt 0 -a $VERBOSE_MODE -gt 1 ]; then # VERBOSE_MODE > 1 then NO retry
write_log 7 "Verbose Mode: $VERBOSE_MODE - NO retry on error"
elif [ $__ERR -ne 0 -a $VERBOSE_MODE -gt 1 ]; then # VERBOSE_MODE > 1 then NO retry
write_log 4 "Verify DNS server '$1' failed - Verbose Mode: $VERBOSE_MODE - NO retry on error"
return $__ERR
elif [ $__ERR -gt 0 ]; then
elif [ $__ERR -ne 0 ]; then
__CNT=$(( $__CNT + 1 )) # increment error counter
# if error count > retry_count leave here
[ $__CNT -gt $retry_count ] && \
@@ -547,7 +550,7 @@ verify_dns() {
# $1 Proxy-String to verify
verify_proxy() {
# complete entry user:password@host:port
# inside user and password NO '@' of ":" allowed
# inside user and password NO '@' of ":" allowed
# host and port only host:port
# host only host ERROR unsupported
# IPv4 address instead of host 123.234.234.123
@@ -575,17 +578,17 @@ verify_proxy() {
fi
# No Port detected - EXITING
[ -z "$__PORT" ] && {
[ "$SECTION_ID" = "lucihelper" ] && return 5
[ $LUCI_HELPER ] && return 5
write_log 14 "Invalid Proxy server Error '5' - proxy port missing"
}
while [ $__ERR -gt 0 ]; do
verify_host_port "$__HOST" "$__PORT"
__ERR=$?
if [ "$SECTION_ID" = "lucihelper" ]; then # no retry if called by LuCI helper script
if [ $LUCI_HELPER ]; then # no retry if called by LuCI helper script
return $__ERR
elif [ $__ERR -gt 0 -a $VERBOSE_MODE -gt 1 ]; then # VERBOSE_MODE > 1 then NO retry
write_log 7 "Verbose Mode: $VERBOSE_MODE - NO retry on error"
write_log 4 "Verify Proxy server '$1' failed - Verbose Mode: $VERBOSE_MODE - NO retry on error"
return $__ERR
elif [ $__ERR -gt 0 ]; then
__CNT=$(( $__CNT + 1 )) # increment error counter
@@ -604,18 +607,17 @@ verify_proxy() {
}
do_transfer() {
# $1 # Variable to store Answer of transfer
# $2 # URL to use
local __URL="$2"
# $1 # URL to use
local __URL="$1"
local __ERR=0
local __CNT=0 # error counter
local __PROG __RUNPROG __ERRPROG __DATA
local __PROG __RUNPROG
[ $# -ne 2 ] && write_log 12 "Error in 'do_transfer()' - wrong number of parameters"
[ $# -ne 1 ] && write_log 12 "Error in 'do_transfer()' - wrong number of parameters"
# lets prefer GNU Wget because it does all for us - IPv4/IPv6/HTTPS/PROXY/force IP version
if /usr/bin/wget --version 2>&1 | grep "\+ssl" >/dev/null 2>&1 ; then
__PROG="/usr/bin/wget -t 2 -O -" # standard output only 2 retrys on error
__PROG="/usr/bin/wget -nv -t 1 -O $DATFILE -o $ERRFILE" # non_verbose no_retry outfile errfile
# force ip version to use
if [ $force_ipversion -eq 1 ]; then
[ $use_ipv6 -eq 0 ] && __PROG="$__PROG -4" || __PROG="$__PROG -6" # force IPv4/IPv6
@@ -635,14 +637,13 @@ do_transfer() {
# disable proxy if no set (there might be .wgetrc or .curlrc or wrong environment set)
[ -z "$proxy" ] && __PROG="$__PROG --no-proxy"
__RUNPROG="$__PROG -q '$__URL' 2>/dev/null" # do transfer with "-q" to suppress not needed output
__ERRPROG="$__PROG -d '$__URL' 2>&1" # do transfer with "-d" for debug mode
__PROG="GNU Wget" # reuse for error logging
__RUNPROG="$__PROG $__URL" # build final command
__PROG="GNU Wget" # reuse for error logging
# 2nd choice is cURL IPv4/IPv6/HTTPS
# libcurl might be compiled without Proxy Support (default in trunk)
elif [ -x /usr/bin/curl ]; then
__PROG="/usr/bin/curl"
__PROG="/usr/bin/curl -sS -o $DATFILE --stderr $ERRFILE"
# force ip version to use
if [ $force_ipversion -eq 1 ]; then
[ $use_ipv6 -eq 0 ] && __PROG="$__PROG -4" || __PROG="$__PROG -6" # force IPv4/IPv6
@@ -670,13 +671,12 @@ do_transfer() {
write_log 13 "cURL: libcurl compiled without Proxy support"
fi
__RUNPROG="$__PROG -q '$__URL' 2>/dev/null" # do transfer with "-s" to suppress not needed output
__ERRPROG="$__PROG -v '$__URL' 2>&1" # do transfer with "-v" for verbose mode
__PROG="cURL" # reuse for error logging
__RUNPROG="$__PROG $__URL" # build final command
__PROG="cURL" # reuse for error logging
# busybox Wget (did not support neither IPv6 nor HTTPS)
elif [ -x /usr/bin/wget ]; then
__PROG="/usr/bin/wget -O -"
__PROG="/usr/bin/wget -q -O $DATFILE"
# force ip version not supported
[ $force_ipversion -eq 1 ] && \
write_log 14 "BusyBox Wget: can not force IP version to use"
@@ -686,9 +686,8 @@ do_transfer() {
# disable proxy if no set (there might be .wgetrc or .curlrc or wrong environment set)
[ -z "$proxy" ] && __PROG="$__PROG -Y off"
__RUNPROG="$__PROG -q '$__URL' 2>/dev/null" # do transfer with "-q" to suppress not needed output
__ERRPROG="$__PROG '$__URL' 2>&1" #
__PROG="Busybox Wget" # reuse for error logging
__RUNPROG="$__PROG $__URL 2>$ERRFILE" # build final command
__PROG="Busybox Wget" # reuse for error logging
else
write_log 13 "Neither 'Wget' nor 'cURL' installed or executable"
@@ -696,22 +695,17 @@ do_transfer() {
while : ; do
write_log 7 "#> $__RUNPROG"
__DATA=$(eval $__RUNPROG)
__ERR=$?
[ $__ERR -eq 0 ] && {
eval "$1='$__DATA'" # everything ok
return 0 # return
}
$__RUNPROG # DO transfer
__ERR=$? # save error code
[ $__ERR -eq 0 ] && return 0 # no error leave
[ $LUCI_HELPER ] && return 1 # no retry if called by LuCI helper script
[ "$SECTION_ID" = "lucihelper" ] && return 1 # no retry if called by LuCI helper script
write_log 7 "Error:\n$(eval $__ERRPROG)" # report error
write_log 3 "$__PROG error: '$__ERR'"
__DATA=""
write_log 3 "$__PROG Error: '$__ERR'"
write_log 7 "$(cat $ERRFILE)" # report error
[ $VERBOSE_MODE -gt 1 ] && {
# VERBOSE_MODE > 1 then NO retry
write_log 7 "Verbose Mode: $VERBOSE_MODE - NO retry on error"
write_log 4 "Transfer failed - Verbose Mode: $VERBOSE_MODE - NO retry on error"
return 1
}
@@ -739,27 +733,27 @@ send_update() {
# verify given IP / no private IPv4's / no IPv6 addr starting with fxxx of with ":"
[ $use_ipv6 -eq 0 ] && __IP=$(echo $1 | grep -v -E "(^0|^10\.|^127|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-1]\.|^192\.168)")
[ $use_ipv6 -eq 1 ] && __IP=$(echo $1 | grep "^[0-9a-eA-E]")
[ -z "$__IP" ] && write_log 14 "Private or invalid or no IP '$1' given"
[ -z "$__IP" ] && write_log 4 "Private or invalid or no IP '$1' given"
if [ -n "$update_script" ]; then
write_log 7 "parsing script '$update_script'"
. $update_script
else
local __URL __ANSWER __ERR
local __URL __ERR
# do replaces in URL
__URL=$(echo $update_url | sed -e "s#\[USERNAME\]#$URL_USER#g" -e "s#\[PASSWORD\]#$URL_PASS#g" \
-e "s#\[DOMAIN\]#$domain#g" -e "s#\[IP\]#$__IP#g")
[ $use_https -ne 0 ] && __URL=$(echo $__URL | sed -e 's#^http:#https:#')
do_transfer __ANSWER "$__URL" || return 1 # if VERBOSE_MODE > 1
do_transfer "$__URL" || return 1
write_log 7 "DDNS Provider answered:\n$__ANSWER"
write_log 7 "DDNS Provider answered:\n$(cat $DATFILE)"
# analyse provider answers
# "good [IP_ADR]" = successful
# "nochg [IP_ADR]" = no change but OK
echo "$__ANSWER" | grep -E "good|nochg" >/dev/null 2>&1
grep -E "good|nochg" $DATFILE >/dev/null 2>&1
return $? # "0" if "good" or "nochg" found
fi
}
@@ -767,7 +761,7 @@ send_update() {
get_local_ip () {
# $1 Name of Variable to store local IP (LOCAL_IP)
local __CNT=0 # error counter
local __RUNPROG __DATA __URL __ANSWER
local __RUNPROG __DATA __URL __ERR
[ $# -ne 1 ] && write_log 12 "Error calling 'get_local_ip()' - wrong number of parameters"
write_log 7 "Detect local IP"
@@ -779,55 +773,66 @@ get_local_ip () {
[ $use_ipv6 -eq 0 ] && __RUNPROG="network_get_ipaddr" \
|| __RUNPROG="network_get_ipaddr6"
write_log 7 "#> $__RUNPROG __DATA '$ip_network'"
$__RUNPROG __DATA "$ip_network"
eval "$__RUNPROG __DATA $ip_network" || write_log 3 "$__RUNPROG Error: '$?'"
[ -n "$__DATA" ] && write_log 7 "Local IP '$__DATA' detected on network '$ip_network'"
;;
interface)
write_log 7 "#> ifconfig '$ip_interface'"
if [ $use_ipv6 -eq 0 ]; then
__DATA=$(ifconfig $ip_interface | awk '
/inet addr:/ { # Filter IPv4
# inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
$1=""; # remove inet
$3=""; # remove Bcast: ...
$4=""; # remove Mask: ...
FS=":"; # separator ":"
$0=$0; # reread to activate separator
$1=""; # remove addr
FS=" "; # set back separator to default " "
$0=$0; # reread to activate separator (remove whitespaces)
print $1; # print IPv4 addr
}'
)
write_log 7 "#> ifconfig $ip_interface >$DATFILE 2>$ERRFILE"
ifconfig $ip_interface >$DATFILE 2>$ERRFILE
__ERR=$?
if [ $__ERR -eq 0 ]; then
if [ $use_ipv6 -eq 0 ]; then
__DATA=$(awk '
/inet addr:/ { # Filter IPv4
# inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
$1=""; # remove inet
$3=""; # remove Bcast: ...
$4=""; # remove Mask: ...
FS=":"; # separator ":"
$0=$0; # reread to activate separator
$1=""; # remove addr
FS=" "; # set back separator to default " "
$0=$0; # reread to activate separator (remove whitespaces)
print $1; # print IPv4 addr
}' $DATFILE
)
else
__DATA=$(awk '
/inet6/ && /: [0-9a-eA-E]/ && !/\/128/ { # Filter IPv6 exclude fxxx and /128 prefix
# inet6 addr: 2001:db8::xxxx:xxxx/32 Scope:Global
FS="/"; # separator "/"
$0=$0; # reread to activate separator
$2=""; # remove everything behind "/"
FS=" "; # set back separator to default " "
$0=$0; # reread to activate separator
print $3; # print IPv6 addr
}' $DATFILE
)
fi
[ -n "$__DATA" ] && write_log 7 "Local IP '$__DATA' detected on interface '$ip_interface'"
else
__DATA=$(ifconfig $ip_interface | awk '
/inet6/ && /: [0-9a-eA-E]/ && !/\/128/ { # Filter IPv6 exclude fxxx and /128 prefix
# inet6 addr: 2001:db8::xxxx:xxxx/32 Scope:Global
FS="/"; # separator "/"
$0=$0; # reread to activate separator
$2=""; # remove everything behind "/"
FS=" "; # set back separator to default " "
$0=$0; # reread to activate separator
print $3; # print IPv6 addr
}'
)
write_log 3 "ifconfig Error: '$__ERR'"
write_log 7 "$(cat $ERRFILE)" # report error
fi
[ -n "$__DATA" ] && write_log 7 "Local IP '$__DATA' detected on interface '$ip_interface'"
;;
script)
write_log 7 "#> $ip_script"
__DATA=$($ip_script) # get ip from script
[ -n "$__DATA" ] && write_log 7 "Local IP '$__DATA' detected via script '$ip_script'"
write_log 7 "#> $ip_script >$DATFILE 2>$ERRFILE"
eval $ip_script >$DATFILE 2>$ERRFILE
__ERR=$?
if [ $__ERR -eq 0 ]; then
__DATA=$(cat $DATFILE)
[ -n "$__DATA" ] && write_log 7 "Local IP '$__DATA' detected via script '$ip_script'"
else
write_log 3 "$ip_script Error: '$__ERR'"
write_log 7 "$(cat $ERRFILE)" # report error
fi
;;
web)
for __URL in $ip_url; do
do_transfer __ANSWER "$__URL"
[ -n "$__ANSWER" ] && break # Answer detected, leave "for do done"
done
do_transfer "$ip_url"
# use correct regular expression
[ $use_ipv6 -eq 0 ] \
&& __DATA=$(echo "$__ANSWER" | grep -m 1 -o "$IPV4_REGEX") \
|| __DATA=$(echo "$__ANSWER" | grep -m 1 -o "$IPV6_REGEX")
&& __DATA=$(grep -m 1 -o "$IPV4_REGEX" $DATFILE) \
|| __DATA=$(grep -m 1 -o "$IPV6_REGEX" $DATFILE)
[ -n "$__DATA" ] && write_log 7 "Local IP '$__DATA' detected on web at '$__URL'"
;;
*)
@@ -836,14 +841,14 @@ get_local_ip () {
esac
# valid data found return here
[ -n "$__DATA" ] && {
eval "$1='$__DATA'"
eval "$1=\"$__DATA\""
return 0
}
[ "$SECTION_ID" = "lucihelper" ] && return 1 # no retry if called by LuCI helper script
[ $LUCI_HELPER ] && return 1 # no retry if called by LuCI helper script
[ $VERBOSE_MODE -gt 1 ] && {
# VERBOSE_MODE > 1 then NO retry
write_log 7 "Verbose Mode: $VERBOSE_MODE - NO retry on error"
write_log 4 "Get local IP via '$ip_source' failed - Verbose Mode: $VERBOSE_MODE - NO retry on error"
return 1
}
@@ -867,7 +872,7 @@ get_registered_ip() {
# $2 (optional) if set, do not retry on error
local __CNT=0 # error counter
local __ERR=255
local __REGEX __PROG __RUNPROG __ERRPROG __DATA
local __REGEX __PROG __RUNPROG __DATA
# return codes
# 1 no IP detected
@@ -877,23 +882,21 @@ get_registered_ip() {
# set correct regular expression
[ $use_ipv6 -eq 0 ] && __REGEX="$IPV4_REGEX" || __REGEX="$IPV6_REGEX"
if [ -x /usr/bin/host ]; then
if [ -x /usr/bin/host ]; then
__PROG="/usr/bin/host"
[ $use_ipv6 -eq 0 ] && __PROG="$__PROG -t A" || __PROG="$__PROG -t AAAA"
if [ $force_ipversion -eq 1 ]; then # force IP version
[ $use_ipv6 -eq 0 ] && __PROG="$__PROG -4" || __PROG="$__PROG -6"
fi
fi
[ $force_dnstcp -eq 1 ] && __PROG="$__PROG -T" # force TCP
__RUNPROG="$__PROG $domain $dns_server 2>/dev/null"
__ERRPROG="$__PROG -v $domain $dns_server 2>&1"
__RUNPROG="$__PROG $domain $dns_server >$DATFILE 2>$ERRFILE"
__PROG="BIND host"
elif [ -x /usr/bin/nslookup ]; then # last use BusyBox nslookup
[ $force_ipversion -ne 0 -o $force_dnstcp -ne 0 ] && \
write_log 14 "Busybox nslookup - no support to 'force IP Version' or 'DNS over TCP'"
__RUNPROG="nslookup $domain $dns_server 2>/dev/null"
__ERRPROG="nslookup $domain $dns_server 2>&1"
__RUNPROG="/usr/bin/nslookup $domain $dns_server >$DATFILE 2>$ERRFILE"
__PROG="BusyBox nslookup"
else # there must be an error
write_log 12 "Error in 'get_registered_ip()' - no supported Name Server lookup software accessible"
@@ -901,32 +904,31 @@ get_registered_ip() {
while : ; do
write_log 7 "#> $__RUNPROG"
__DATA=$(eval $__RUNPROG)
eval $__RUNPROG
__ERR=$?
if [ $__ERR -ne 0 ]; then
write_log 7 "Error:\n$(eval $__ERRPROG)"
write_log 3 "$__PROG error: '$__ERR'"
__DATA=""
write_log 7 "Error:\n$(cat $ERRFILE)"
else
if [ "$__PROG" = "BIND host" ]; then
__DATA=$(echo "$__DATA" | awk -F "address " '/has/ {print $2; exit}' )
if [ "$__PROG" = "BIND host" ]; then
__DATA=$(cat $DATFILE | awk -F "address " '/has/ {print $2; exit}' )
else
__DATA=$(echo "$__DATA" | sed -ne "3,\$ { s/^Address [0-9]*: \($__REGEX\).*$/\\1/p }" )
__DATA=$(cat $DATFILE | sed -ne "3,\$ { s/^Address [0-9]*: \($__REGEX\).*$/\\1/p }" )
fi
[ -n "$__DATA" ] && {
write_log 7 "Registered IP '$__DATA' detected"
eval "$1='$__DATA'" # valid data found
eval "$1=\"$__DATA\"" # valid data found
return 0 # leave here
}
write_log 4 "NO valid IP found"
__ERR=127
fi
[ "$SECTION_ID" = "lucihelper" ] && return $__ERR # no retry if called by LuCI helper script
[ $LUCI_HELPER ] && return $__ERR # no retry if called by LuCI helper script
[ -n "$2" ] && return $__ERR # $2 is given -> no retry
[ $VERBOSE_MODE -gt 1 ] && {
# VERBOSE_MODE > 1 then NO retry
write_log 7 "Verbose Mode: $VERBOSE_MODE - NO retry on error"
write_log 4 "Get registered/public IP for '$domain' failed - Verbose Mode: $VERBOSE_MODE - NO retry on error"
return $__ERR
}
@@ -949,7 +951,7 @@ get_uptime() {
# $1 Variable to store result in
[ $# -ne 1 ] && write_log 12 "Error calling 'verify_host_port()' - wrong number of parameters"
local __UPTIME=$(cat /proc/uptime)
eval "$1='${__UPTIME%%.*}'"
eval "$1=\"${__UPTIME%%.*}\""
}
trap_handler() {
@@ -984,7 +986,11 @@ trap_handler() {
kill -$1 $__PID # terminate it
done
IFS=$__OLD_IFS
# remove out and err file
[ -f $DATFILE ] && rm -f $DATFILE
[ -f $ERRFILE ] && rm -f $ERRFILE
# exit with correct handling:
# remove trap handling settings and send kill to myself
trap - 0 1 2 3 15