mirror of
https://github.com/novatiq/packages.git
synced 2026-04-30 15:38:40 +01:00
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user