From 157e8e52aef5ede350e17ce688f76fbaddea5dd2 Mon Sep 17 00:00:00 2001 From: Christian Schoenebeck Date: Sat, 15 Nov 2014 22:06:18 +0100 Subject: [PATCH] luci-app-ddns: modified to support ddns-scripts 2.1.0-2 - moved /usr/lib/ddns/dynamic_dns_lucihelper.sh to ddns-scripts package - fixed error message when validating proxy - modified validating ip_script to allow the usage of parameters - using ipkg/postinst AND ipkg/postinst-pkg as long as LuCI Makefiles did not fullfil requirements of new OpenWrt default_postinst and default_postrm reported in Issue #255 - cleanup whitespaces at line ends Signed-off-by: Christian Schoenebeck --- applications/luci-ddns/CHANGELOG | 13 +++ applications/luci-ddns/ipkg/postinst | 5 ++ applications/luci-ddns/ipkg/postinst-pkg | 10 +++ .../luci-ddns/luasrc/controller/ddns.lua | 30 +++---- .../luci-ddns/luasrc/model/cbi/ddns/ddns.lua | 12 +-- .../luasrc/model/cbi/ddns/detail.lua | 54 +++++------ applications/luci-ddns/luasrc/tools/ddns.lua | 14 +-- .../luasrc/view/ddns/overview_status.htm | 4 +- .../luasrc/view/ddns/system_status.htm | 4 +- .../usr/lib/ddns/dynamic_dns_lucihelper.sh | 90 ------------------- 10 files changed, 89 insertions(+), 147 deletions(-) create mode 100644 applications/luci-ddns/ipkg/postinst-pkg delete mode 100755 applications/luci-ddns/root/usr/lib/ddns/dynamic_dns_lucihelper.sh diff --git a/applications/luci-ddns/CHANGELOG b/applications/luci-ddns/CHANGELOG index 7848a14a0b..56c1cf9236 100644 --- a/applications/luci-ddns/CHANGELOG +++ b/applications/luci-ddns/CHANGELOG @@ -1,3 +1,16 @@ +Version: 2.1.0-2 +Date: 2014-11-15 +ddns-scripts: 2.1.0-2 or greater needed + +- moved /usr/lib/ddns/dynamic_dns_lucihelper.sh to ddns-scripts package +- fixed error message when validating proxy +- modified validating ip_script to allow the usage of parameters +- using ipkg/postinst AND ipkg/postinst-pkg as long as LuCI Makefiles did not + fullfil requirements of new OpenWrt default_postinst and default_postrm + reported in Issue #255 +- cleanup whitespaces at line ends + +-------------------------------------------------------------------------------- Version: 2.1.0-1 Date: 2014-11-09 ddns-scripts: 2.1.0-1 or greater needed diff --git a/applications/luci-ddns/ipkg/postinst b/applications/luci-ddns/ipkg/postinst index a2c13fa34c..938f746f70 100644 --- a/applications/luci-ddns/ipkg/postinst +++ b/applications/luci-ddns/ipkg/postinst @@ -1,5 +1,10 @@ #!/bin/sh [ -n "${IPKG_INSTROOT}" ] || { + # luci updates are not in sync with ddns-script updates !!! + # needed because luci update might delete helper script + # copy dynamic_dns_helper.tmp.sh from ddns-scripts + cp -f /usr/lib/ddns/dynamic_dns_lucihelper.tmp.sh /usr/lib/ddns/dynamic_dns_lucihelper.sh + ( . /etc/uci-defaults/luci-ddns ) && rm -f /etc/uci-defaults/luci-ddns exit 0 } diff --git a/applications/luci-ddns/ipkg/postinst-pkg b/applications/luci-ddns/ipkg/postinst-pkg new file mode 100644 index 0000000000..938f746f70 --- /dev/null +++ b/applications/luci-ddns/ipkg/postinst-pkg @@ -0,0 +1,10 @@ +#!/bin/sh +[ -n "${IPKG_INSTROOT}" ] || { + # luci updates are not in sync with ddns-script updates !!! + # needed because luci update might delete helper script + # copy dynamic_dns_helper.tmp.sh from ddns-scripts + cp -f /usr/lib/ddns/dynamic_dns_lucihelper.tmp.sh /usr/lib/ddns/dynamic_dns_lucihelper.sh + + ( . /etc/uci-defaults/luci-ddns ) && rm -f /etc/uci-defaults/luci-ddns + exit 0 +} diff --git a/applications/luci-ddns/luasrc/controller/ddns.lua b/applications/luci-ddns/luasrc/controller/ddns.lua index 952c9ffe3f..4559cd2ed1 100644 --- a/applications/luci-ddns/luasrc/controller/ddns.lua +++ b/applications/luci-ddns/luasrc/controller/ddns.lua @@ -25,11 +25,11 @@ local SYS = require "luci.sys" local DDNS = require "luci.tools.ddns" -- ddns multiused functions local UTIL = require "luci.util" -local luci_ddns_version = "2.1.0-1" -- luci-app-ddns / openwrt Makefile compatible version -local ddns_scripts_min = "2.1.0-1" -- minimum version of ddns-scripts required +local luci_ddns_version = "2.1.0-2" -- luci-app-ddns / openwrt Makefile compatible version +local ddns_scripts_min = "2.1.0-2" -- minimum version of ddns-scripts required function index() - -- above 'require "mod"' definitions are not recognized + -- above 'require "mod"' definitions are not recognized -- inside index() during initialisation -- no configuration file, don't start @@ -48,7 +48,7 @@ function index() else entry( {"admin", "services", "ddns"}, cbi("ddns/overview"), _("Dynamic DNS"), 59) entry( {"admin", "services", "ddns", "detail"}, cbi("ddns/detail"), nil ).leaf = true - entry( {"admin", "services", "ddns", "hints"}, cbi("ddns/hints", + entry( {"admin", "services", "ddns", "hints"}, cbi("ddns/hints", {hideapplybtn=true, hidesavebtn=true, hideresetbtn=true}), nil ).leaf = true entry( {"admin", "services", "ddns", "logview"}, call("logread") ).leaf = true entry( {"admin", "services", "ddns", "startstop"}, call("startstop") ).leaf = true @@ -80,14 +80,14 @@ local function _get_status() -- and enabled state local section = s[".name"] local enabled = tonumber(s["enabled"]) or 0 - local datelast = "_empty_" -- formated date of last update + local datelast = "_empty_" -- formated date of last update local datenext = "_empty_" -- formated date of next update -- get force seconds local force_seconds = DDNS.calc_seconds( tonumber(s["force_interval"]) or 72 , s["force_unit"] or "hours" ) - -- get/validate pid and last update + -- get/validate pid and last update local pid = DDNS.get_pid(section) local uptime = SYS.uptime() local lasttime = DDNS.get_lastupd(section) @@ -116,7 +116,7 @@ local function _get_status() if pid > 0 and ( lasttime + force_seconds - uptime ) <= 0 then datenext = "_verify_" - -- run once + -- run once elseif force_seconds == 0 then datenext = "_runonce_" @@ -124,11 +124,11 @@ local function _get_status() elseif pid == 0 and enabled == 0 then datenext = "_disabled_" - -- no process running and NOT + -- no process running and NOT elseif pid == 0 and enabled ~= 0 then datenext = "_stopped_" end - + -- get/set monitored interface and IP version local iface = s["interface"] or "_nonet_" local use_ipv6 = tonumber(s["use_ipv6"]) or 0 @@ -143,10 +143,10 @@ local function _get_status() local force_ipversion = tonumber(s["force_ipversion"] or 0) local force_dnstcp = tonumber(s["force_dnstcp"] or 0) local command = [[/usr/lib/ddns/dynamic_dns_lucihelper.sh]] - command = command .. [[ get_registered_ip ]] .. domain .. [[ ]] .. use_ipv6 .. + command = command .. [[ get_registered_ip ]] .. domain .. [[ ]] .. use_ipv6 .. [[ ]] .. force_ipversion .. [[ ]] .. force_dnstcp .. [[ ]] .. dnsserver local reg_ip = SYS.exec(command) - if reg_ip == "" then + if reg_ip == "" then reg_ip = "_nodata_" end @@ -177,7 +177,7 @@ function logread(section) local ldata=NXFS.readfile(lfile) if not ldata or #ldata == 0 then ldata="_nodata_" - end + end uci:unload("ddns") HTTP.write(ldata) end @@ -226,7 +226,7 @@ function startstop(section, enabled) end end - -- we can not execute because other + -- we can not execute because other -- uncommited changes pending, so exit here if not exec then HTTP.write("_uncommited_") @@ -235,14 +235,14 @@ function startstop(section, enabled) -- save enable state uci:set("ddns", section, "enabled", ( (enabled == "true") and "1" or "0") ) - uci:save("ddns") + uci:save("ddns") uci:commit("ddns") uci:unload("ddns") -- start dynamic_dns_updater.sh script os.execute ([[/usr/lib/ddns/dynamic_dns_updater.sh %s 0 > /dev/null 2>&1 &]] % section) NX.nanosleep(3) -- 3 seconds "show time" - + -- status changed so return full status data = _get_status() HTTP.prepare_content("application/json") diff --git a/applications/luci-ddns/luasrc/model/cbi/ddns/ddns.lua b/applications/luci-ddns/luasrc/model/cbi/ddns/ddns.lua index 1c7e04a96e..9ce0c13eb5 100644 --- a/applications/luci-ddns/luasrc/model/cbi/ddns/ddns.lua +++ b/applications/luci-ddns/luasrc/model/cbi/ddns/ddns.lua @@ -113,18 +113,18 @@ web.default = "http://checkip.dyndns.com/" web.rmempty = true -local ci = s:option(Value, "check_interval", translate("Check for changed IP every")) -ci.datatype = "and(uinteger,min(1))" -ci.default = 10 +local ci = s:option(Value, "check_interval", translate("Check for changed IP every")) +ci.datatype = "and(uinteger,min(1))" +ci.default = 10 local unit = s:option(ListValue, "check_unit", translate("Check-time unit")) unit.default = "minutes" unit:value("minutes", translate("min")) unit:value("hours", translate("h")) -fi = s:option(Value, "force_interval", translate("Force update every")) -fi.datatype = "and(uinteger,min(1))" -fi.default = 72 +fi = s:option(Value, "force_interval", translate("Force update every")) +fi.datatype = "and(uinteger,min(1))" +fi.default = 72 local unit = s:option(ListValue, "force_unit", translate("Force-time unit")) unit.default = "hours" diff --git a/applications/luci-ddns/luasrc/model/cbi/ddns/detail.lua b/applications/luci-ddns/luasrc/model/cbi/ddns/detail.lua index 8619d449d5..d7a15a83d0 100644 --- a/applications/luci-ddns/luasrc/model/cbi/ddns/detail.lua +++ b/applications/luci-ddns/luasrc/model/cbi/ddns/detail.lua @@ -112,7 +112,7 @@ local function _verify_ip_source() local command = [[/usr/lib/ddns/dynamic_dns_lucihelper.sh get_local_ip ]] .. _ipv6 .. [[ ]] .. _source .. [[ ]] .. _network .. [[ ]] .. - _url .. [[ ]] .. _interface .. [[ ]] .. _script.. [[ ]] .. _proxy + _url .. [[ ]] .. _interface .. [[ ']] .. _script.. [[' ]] .. _proxy local ret = SYS.call(command) if ret == 0 then @@ -126,7 +126,7 @@ end m = Map("ddns") -- first need to close from cbi map template our closed by template -m.title = [[]] .. +m.title = [[]] .. translate("Dynamic DNS") m.description = translate("Dynamic DNS allows that your router can be reached with " .. @@ -167,8 +167,8 @@ en = ns:taboption("basic", Flag, "enabled", translate("If this service section is disabled it could not be started." .. "
" .. "Neither from LuCI interface nor from console") ) en.orientation = "horizontal" -function en.parse(self, section) - DDNS.flag_parse(self, section) +function en.parse(self, section) + DDNS.flag_parse(self, section) end -- use_ipv6 (NEW) -- ########################################################## @@ -189,13 +189,13 @@ function usev6.cfgvalue(self, section) return value end function usev6.validate(self, value) - if (value == "1" and has_ipv6) or value == "0" then + if (value == "1" and has_ipv6) or value == "0" then return value end return nil, err_tab_basic(self) .. err_ipv6_plain end function usev6.write(self, section, value) - if value == "0" then -- force rmempty + if value == "0" then -- force rmempty return self.map:del(section, self.option) else return self.map:set(section, self.option, value) @@ -256,8 +256,8 @@ svc6 = ns:taboption("basic", ListValue, "ipv6_service_name", translate("DDNS Service provider") .. " [IPv6]" ) svc6.default = "-" svc6:depends("use_ipv6", "1") -- only show on IPv6 -if not has_ipv6 then - svc6.description = err_ipv6_basic +if not has_ipv6 then + svc6.description = err_ipv6_basic end local services6 = { } @@ -425,8 +425,8 @@ if has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then end return value end - function https.parse(self, section) - DDNS.flag_parse(self, section) + function https.parse(self, section) + DDNS.flag_parse(self, section) end function https.validate(self, value) if (value == "1" and has_ssl ) or value == "0" then return value end @@ -453,7 +453,7 @@ if has_ssl then cert.rmempty = false -- force validate function cert.default = "/etc/ssl/certs" function cert.validate(self, value) - if https:formvalue(section) == "0" then + if https:formvalue(section) == "0" then return "" -- supress validate error if NOT https end if value then -- otherwise errors in datatype check @@ -487,8 +487,8 @@ logf = ns:taboption("basic", Flag, "use_logfile", logf.orientation = "horizontal" logf.rmempty = false -- we want to save in /etc/config/ddns file on "0" because logf.default = "1" -- if not defined write to log by default -function logf.parse(self, section) - DDNS.flag_parse(self, section) +function logf.parse(self, section) + DDNS.flag_parse(self, section) end -- TAB: Advanced ################################################################################## @@ -644,8 +644,8 @@ function ipn6.validate(self, value) or src6:formvalue(section) ~= "network" then -- ignore if IPv4 selected OR -- ignore everything except "network" - return "" - elseif has_ipv6 then + return "" + elseif has_ipv6 then return value else return nil, err_tab_adv(self) .. err_ipv6_plain @@ -712,7 +712,7 @@ iurl6 = ns:taboption("advanced", Value, "ipv6_url", translate("URL to detect") .. " [IPv6]" ) iurl6:depends("ipv6_source", "web") iurl6.default = "http://checkipv6.dyndns.com" -if has_ipv6 then +if has_ipv6 then iurl6.description = translate("Defines the Web page to read systems IPv6-Address from") else iurl6.description = err_ipv6_other @@ -796,12 +796,16 @@ ips = ns:taboption("advanced", Value, "ip_script", translate("User defined script to read systems IP-Address") ) ips:depends("ipv4_source", "script") -- IPv4 ips:depends("ipv6_source", "script") -- or IPv6 +ips.rmempty = false ips.placeholder = "/path/to/script.sh" function ips.validate(self, value) + local split + if value then split = UTIL.split(value, " ") end + if (usev6:formvalue(section) == "0" and src4:formvalue(section) ~= "script") or (usev6:formvalue(section) == "1" and src6:formvalue(section) ~= "script") then return "" - elseif not value or not FS.access(value, "x") then + elseif not value or not (#value > 0) or not FS.access(split[1], "x") then return nil, err_tab_adv(self) .. translate("not found or not executable - Sample: '/path/to/script.sh'") else @@ -913,8 +917,8 @@ if has_force or ( ( m:get(section, "force_ipversion") or "0" ) ~= "0" ) then if (value == "1" and has_force) or value == "0" then return value end return nil, err_tab_adv(self) .. translate("Force IP Version not supported") end - function fipv.parse(self, section) - DDNS.flag_parse(self, section) + function fipv.parse(self, section) + DDNS.flag_parse(self, section) end function fipv.write(self, section, value) if value == "1" then @@ -970,13 +974,13 @@ if has_dnstcp or ( ( m:get(section, "force_dnstcp") or "0" ) ~= "0" ) then return value end function tcp.validate(self, value) - if (value == "1" and has_dnstcp ) or value == "0" then + if (value == "1" and has_dnstcp ) or value == "0" then return value end return nil, err_tab_adv(self) .. translate("DNS requests via TCP not supported") end - function tcp.parse(self, section) - DDNS.flag_parse(self, section) + function tcp.parse(self, section) + DDNS.flag_parse(self, section) end end @@ -1018,7 +1022,7 @@ if has_proxy or ( ( m:get(section, "proxy") or "" ) ~= "" ) then else return nil, err_tab_adv(self) .. translate("unspecific error") end else - return nil, err .. translate("PROXY-Server not supported") + return nil, err_tab_adv(self) .. translate("PROXY-Server not supported") end end end @@ -1082,7 +1086,7 @@ fi.template = "ddns/detail_value" fi.default = 72 -- see dynamic_dns_updater.sh script fi.rmempty = false -- validate ourselves for translatable error messages function fi.validate(self, value) - if not DTYP.uinteger(value) + if not DTYP.uinteger(value) or tonumber(value) < 0 then return nil, err_tab_timer(self) .. translate("minimum value '0'") end @@ -1144,7 +1148,7 @@ rc = ns:taboption("timer", Value, "retry_count", rc.default = 5 rc.rmempty = false -- validate ourselves for translatable error messages function rc.validate(self, value) - if not DTYP.uinteger(value) + if not DTYP.uinteger(value) or tonumber(value) < 1 then return nil, err_tab_timer(self) .. translate("minimum value '1'") else diff --git a/applications/luci-ddns/luasrc/tools/ddns.lua b/applications/luci-ddns/luasrc/tools/ddns.lua index 8d56c92a16..ad7b5e86f2 100644 --- a/applications/luci-ddns/luasrc/tools/ddns.lua +++ b/applications/luci-ddns/luasrc/tools/ddns.lua @@ -44,7 +44,7 @@ end -- check if IPv6 supported by OpenWrt function check_ipv6() - return NXFS.access("/proc/net/ipv6_route") + return NXFS.access("/proc/net/ipv6_route") and NXFS.access("/usr/sbin/ip6tables") end @@ -113,7 +113,7 @@ end -- read version information for given package if installed function ipkg_version(package) - if not package then + if not package then return nil end local info = OPKG.info(package) @@ -121,7 +121,7 @@ function ipkg_version(package) local version = "" local i = 0 for k, v in pairs(info) do - if v.Package == package and v.Status.installed then + if v.Package == package and v.Status.installed then version = v.Version i = i + 1 end @@ -182,7 +182,7 @@ function flag_parse(self, section) if (fvalue ~= cvalue) then self.section.changed = true end else self:remove(section) - self.section.changed = true + self.section.changed = true end end @@ -222,14 +222,14 @@ end function parse_url(url) --, default) -- initialize default parameters local parsed = {} --- for i,v in base.pairs(default or parsed) do +-- for i,v in base.pairs(default or parsed) do -- parsed[i] = v -- end -- remove whitespace -- url = string.gsub(url, "%s", "") -- get fragment - url = string.gsub(url, "#(.*)$", + url = string.gsub(url, "#(.*)$", function(f) parsed.fragment = f return "" @@ -262,7 +262,7 @@ function parse_url(url) --, default) parsed.path = url local authority = parsed.authority - if not authority then + if not authority then return parsed end authority = string.gsub(authority,"^([^@]*)@", diff --git a/applications/luci-ddns/luasrc/view/ddns/overview_status.htm b/applications/luci-ddns/luasrc/view/ddns/overview_status.htm index e23cc796e9..37c54be25f 100644 --- a/applications/luci-ddns/luasrc/view/ddns/overview_status.htm +++ b/applications/luci-ddns/luasrc/view/ddns/overview_status.htm @@ -141,10 +141,10 @@ str += "\n\nluci-app-ddns:"; str += "\n\t<%:Version%>:\t" + luci_version; str += "\n\t<%:Build%>:\t" + luci_build; - str += "\n\nddns-scripts <%:installed%>:"; - str += "\n\t<%:Version%>:\t" + ddns_version; str += "\n\nddns-scripts <%:required%>:"; str += "\n\t<%:Version%>:\t" + ddns_required + " <%:or greater%>"; + str += "\n\nddns-scripts <%:installed%>:"; + str += "\n\t<%:Version%>:\t" + ddns_version; str += "\n\n" alert(str); } diff --git a/applications/luci-ddns/luasrc/view/ddns/system_status.htm b/applications/luci-ddns/luasrc/view/ddns/system_status.htm index dcf06cc0bb..db9d1d1a01 100644 --- a/applications/luci-ddns/luasrc/view/ddns/system_status.htm +++ b/applications/luci-ddns/luasrc/view/ddns/system_status.htm @@ -10,7 +10,7 @@ if ( !(tbl) ) { return; } // clear all rows - while (tbl.rows.length > 1) + while (tbl.rows.length > 1) tbl.deleteRow(1); // variable for Modulo-Division use to set cbi-rowstyle-? (0 or 1) @@ -115,7 +115,7 @@ if (tbl.rows.length == 1 || (data[0].enabled == 0 && tbl.rows.length == 2) ) { var br = '
'; - if (tbl.rows.length > 1) + if (tbl.rows.length > 1) br = ''; var tr = tbl.insertRow(-1); tr.className = "cbi-section-table-row"; diff --git a/applications/luci-ddns/root/usr/lib/ddns/dynamic_dns_lucihelper.sh b/applications/luci-ddns/root/usr/lib/ddns/dynamic_dns_lucihelper.sh deleted file mode 100755 index 3fc84748ee..0000000000 --- a/applications/luci-ddns/root/usr/lib/ddns/dynamic_dns_lucihelper.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/sh -# /usr/lib/ddns/luci_dns_helper.sh -# -# Written in August 2014 -# by Christian Schoenebeck -# This script is used by luci-app-ddns -# - getting registered IP -# - check if possible to get local IP -# - verifing given DNS- or Proxy-Server -# -# variables in small chars are read from /etc/config/ddns as parameter given here -# variables in big chars are defined inside these scripts as gloval vars -# variables in big chars beginning with "__" are local defined inside functions only -# set -vx #script debugger - -[ $# -lt 2 ] && exit 1 - -. /usr/lib/ddns/dynamic_dns_functions.sh # global vars are also defined here - -# set -vx #script debugger - -# preset some variables, wrong or not set in dynamic_dns_functions.sh -SECTION_ID="lucihelper" -LOGFILE="$LOGDIR/$SECTION_ID.log" -VERBOSE_MODE=0 # no console logging -# global variables normally set by reading DDNS UCI configuration -use_syslog=0 # no syslog -use_logfile=0 # by default no logfile, can be changed here - -case "$1" in - get_registered_ip) - local IP - domain=$2 # Hostname/Domain - use_ipv6=${3:-"0"} # Use IPv6 - default IPv4 - force_ipversion=${4:-"0"} # Force IP Version - default 0 - No - force_dnstcp=${5:-"0"} # Force TCP on DNS - default 0 - No - dns_server=${6:-""} # DNS server - default No DNS - write_log 7 "-----> get_registered_ip IP" - get_registered_ip IP - [ $? -ne 0 ] && IP="" - echo -n "$IP" # suppress LF - ;; - verify_dns) - # $2 : dns-server to verify # no need for force_dnstcp because - # verify with nc (netcat) uses tcp anyway - use_ipv6=${3:-"0"} # Use IPv6 - default IPv4 - force_ipversion=${4:-"0"} # Force IP Version - default 0 - No - write_log 7 "-----> verify_dns '$2'" - verify_dns "$2" - ;; - verify_proxy) - # $2 : proxy string to verify - use_ipv6=${3:-"0"} # Use IPv6 - default IPv4 - force_ipversion=${4:-"0"} # Force IP Version - default 0 - No - write_log 7 "-----> verify_proxy '$2'" - verify_proxy "$2" - ;; - get_local_ip) - local IP - use_ipv6="$2" # Use IPv6 - ip_source="$3" # IP source - ip_network="$4" # set if source = "network" otherwise "-" - ip_url="$5" # set if source = "web" otherwise "-" - ip_interface="$6" # set if source = "interface" itherwiase "-" - ip_script="$7" # set if source = "script" otherwise "-" - proxy="$8" # proxy if set - force_ipversion="0" # not needed but must be set - use_https="0" # not needed but must be set - [ -n "$proxy" -a "$ip_source" = "web" ] && { - # proxy defined, used for ip_source=web - export HTTP_PROXY="http://$proxy" - export HTTPS_PROXY="http://$proxy" - export http_proxy="http://$proxy" - export https_proxy="http://$proxy" - } - # don't need IP only the return code - [ "$ip_source" = "web" -o "$ip_source" = "script" ] && { - # we wait only 3 seconds for an - # answer from "web" or "script" - write_log 7 "-----> timeout 3 -- get_local_ip IP" - timeout 3 -- get_local_ip IP - } || { - write_log 7 "-----> get_local_ip IP" - get_local_ip IP - } - ;; - *) - return 255 - ;; -esac -- 2.30.2