luci-app-ddns: improve performance 1819/head
authorAnsuel Smith <ansuelsmth@gmail.com>
Thu, 24 May 2018 00:03:03 +0000 (02:03 +0200)
committerAnsuel Smith <ansuelsmth@gmail.com>
Sat, 2 Jun 2018 16:52:22 +0000 (18:52 +0200)
Every request directed to the ddns app call ddns tools module.
Ddns tools module have lots of global variable that call slow os.execute function. This adds 10 second to every ddns request even if the function that is requested doesn't need that global variable. This commit introduce env_info function that execute os.execute command by executing what is actually requested and not process all the variables. Also remove 2 unecessary module that are not used. More researh find that major slowdown was caused by the calling of ddns script for the version check. Now we check if opkg is present and use it to check ddns-scripts version.

Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
applications/luci-app-ddns/Makefile
applications/luci-app-ddns/luasrc/controller/ddns.lua
applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua
applications/luci-app-ddns/luasrc/model/cbi/ddns/hints.lua
applications/luci-app-ddns/luasrc/model/cbi/ddns/overview.lua
applications/luci-app-ddns/luasrc/tools/ddns.lua

index bd6ddeb1b354c4f260b3d87e303c6f3da9ecd72e..886b266b046c9c4c1a103e9857cc48217b0d8e65 100644 (file)
@@ -16,7 +16,7 @@ PKG_VERSION:=2.4.9
 
 # Release == build
 # increase on changes of translation files
-PKG_RELEASE:=3
+PKG_RELEASE:=4
 
 PKG_LICENSE:=Apache-2.0
 PKG_MAINTAINER:=Christian Schoenebeck <christian.schoenebeck@gmail.com>
index 5f4a5118c387443d91f9c9fa5f4462c707fed177..bfd7a2a41487ce312f478dcaf31c5af837770505 100755 (executable)
@@ -21,7 +21,6 @@ luci_helper = "/usr/lib/ddns/dynamic_dns_lucihelper.sh"
 
 local srv_name    = "ddns-scripts"
 local srv_ver_min = "2.7.7"                    -- minimum version of service required
-local srv_ver_cmd = luci_helper .. [[ -V | awk {'print $2'}]]
 local app_name    = "luci-app-ddns"
 local app_title   = "Dynamic DNS"
 local app_version = "2.4.9-1"
@@ -29,7 +28,6 @@ local app_version = "2.4.9-1"
 function index()
        local nxfs      = require "nixio.fs"            -- global definitions not available
        local sys       = require "luci.sys"            -- in function index()
-       local ddns      = require "luci.tools.ddns"     -- ddns multiused functions
        local muci      = require "luci.model.uci"
 
        -- no config create an empty one
@@ -81,26 +79,41 @@ end
 
 -- Standardized application/service functions
 function app_title_main()
-       return  [[<a href="javascript:alert(']]
-                       .. I18N.translate("Version Information")
-                       .. [[\n\n]] .. app_name
-                       .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]] .. app_version
-                       .. [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("required") .. [[:]]
-                       .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]]
-                               .. srv_ver_min .. [[ ]] .. I18N.translate("or higher")
-                       .. [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("installed") .. [[:]]
-                       .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]]
-                               .. (service_version() or I18N.translate("NOT installed"))
-                       .. [[\n\n]]
-               .. [[')">]]
-               .. I18N.translate(app_title)
-               .. [[</a>]]
+       tmp = {}
+       tmp[#tmp+1] =   [[<a href="javascript:alert(']]
+       tmp[#tmp+1] =            I18N.translate("Version Information")
+       tmp[#tmp+1] =            [[\n\n]] .. app_name
+       tmp[#tmp+1] =            [[\n\t]] .. I18N.translate("Version") .. [[:\t]] .. app_version
+       tmp[#tmp+1] =            [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("required") .. [[:]]
+       tmp[#tmp+1] =            [[\n\t]] .. I18N.translate("Version") .. [[:\t]]
+       tmp[#tmp+1] =                    srv_ver_min .. [[ ]] .. I18N.translate("or higher")
+       tmp[#tmp+1] =            [[\n\n]] .. srv_name .. [[ ]] .. I18N.translate("installed") .. [[:]]
+       tmp[#tmp+1] =            [[\n\t]] .. I18N.translate("Version") .. [[:\t]]
+       tmp[#tmp+1] =                    (service_version() or I18N.translate("NOT installed"))
+       tmp[#tmp+1] =            [[\n\n]]
+       tmp[#tmp+1] =    [[')">]]
+       tmp[#tmp+1] =    I18N.translate(app_title)
+       tmp[#tmp+1] =    [[</a>]]
+               
+       return table.concat(tmp)
 end
 function service_version()
-       local ver = nil
 
+       local nxfs      = require "nixio.fs"
+
+       local ver = nil
+       local ver_helper
+       
+       if nxfs.access("/bin/opkg") then
+               ver_helper = "/bin/opkg info " .. srv_name .. " | grep 'Version'"
+       else
+               ver_helper = luci_helper .. " -V"
+       end
+       
+       local srv_ver_cmd = ver_helper .. " | awk {'print $2'} "
+       
        ver = UTIL.exec(srv_ver_cmd)
-       if #ver > 0 then return ver end
+       if ver and #ver > 0 then return ver end
 
        IPKG.list_installed(srv_name, function(n, v, d)
                        if v and (#v > 0) then ver = v end
@@ -108,6 +121,7 @@ function service_version()
        )
        return  ver
 end
+
 function service_ok()
        return  IPKG.compare_versions((service_version() or "0"), ">=", srv_ver_min)
 end
index 977dbe34b1f52537e00a9cabde5cc11a988da0ae..10d39c7183334ff46d80fcddaecbf919bd9ad158 100644 (file)
@@ -292,6 +292,10 @@ function luh.parse(self, section, novld)
 end
 
 -- use_ipv6 -- ################################################################
+
+--We call it globally as it's called 11 times even outside specific function, saves 11 os.execute slow command!
+local has_ipv6 = DDNS.env_info("has_ipv6") 
+
 usev6 = ns:taboption("basic", ListValue, "use_ipv6",
        translate("IP address version"),
        translate("Defines which IP address 'IPv4/IPv6' is send to the DDNS provider") )
@@ -300,16 +304,16 @@ usev6.default = "0"
 usev6:value("0", translate("IPv4-Address") )
 function usev6.cfgvalue(self, section)
        local value = AbstractValue.cfgvalue(self, section) or "0"
-       if DDNS.has_ipv6 or (value == "1" and not DDNS.has_ipv6) then
+       if has_ipv6 or (value == "1" and not has_ipv6) then
                self:value("1", translate("IPv6-Address") )
        end
-       if value == "1" and not DDNS.has_ipv6 then
+       if value == "1" and not has_ipv6 then
                self.description = err_ipv6_basic
        end
        return value
 end
 function usev6.validate(self, value)
-       if (value == "1" and DDNS.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
@@ -360,7 +364,7 @@ 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 DDNS.has_ipv6 then
+if not has_ipv6 then
        svc6.description = err_ipv6_basic
 end
 function svc6.cfgvalue(self, section)
@@ -374,7 +378,7 @@ function svc6.cfgvalue(self, section)
 end
 function svc6.validate(self, value)
        if usev6:formvalue(section) == "1" then -- do only on IPv6
-               if DDNS.has_ipv6 then return value end
+               if has_ipv6 then return value end
                return nil, err_tab_basic(self) .. err_ipv6_plain
        else
                return ""       -- suppress validate error
@@ -586,13 +590,17 @@ end
 svc6:value("-", translate("-- custom --") )
 
 -- IPv4/IPv6 - use_https -- ###################################################
-if DDNS.has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then
+
+--We call it globally as it's called 4 times outside specific function.
+local has_ssl = DDNS.env_info("has_ssl")
+
+if has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then
        https = ns:taboption("basic", Flag, "use_https",
                translate("Use HTTP Secure") )
        https.orientation = "horizontal"
        function https.cfgvalue(self, section)
                local value = AbstractValue.cfgvalue(self, section)
-               if not DDNS.has_ssl and value == "1" then
+               if not has_ssl and value == "1" then
                        self.description = bold_on .. font_red ..
                                translate("HTTPS not supported") .. font_off .. "<br />" ..
                                translate("please disable") .. " !" .. bold_off
@@ -602,7 +610,7 @@ if DDNS.has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then
                return value
        end
        function https.validate(self, value)
-               if (value == "1" and DDNS.has_ssl ) or value == "0" then return value end
+               if (value == "1" and has_ssl ) or value == "0" then return value end
                return nil, err_tab_basic(self) .. translate("HTTPS not supported") .. " !"
        end
        function https.write(self, section, value)
@@ -616,7 +624,7 @@ if DDNS.has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then
 end
 
 -- IPv4/IPv6 - cacert -- ######################################################
-if DDNS.has_ssl then
+if has_ssl then
        cert = ns:taboption("basic", Value, "cacert",
                translate("Path to CA-Certificate"),
                translate("directory or path/file") .. "<br />" ..
@@ -706,7 +714,7 @@ src6:value("network", translate("Network"))
 src6:value("web", translate("URL"))
 src6:value("interface", translate("Interface"))
 src6:value("script", translate("Script"))
-if not DDNS.has_ipv6 then
+if not has_ipv6 then
        src6.description = err_ipv6_other
 end
 function src6.cfgvalue(self, section)
@@ -715,7 +723,7 @@ end
 function src6.validate(self, value)
        if usev6:formvalue(section) ~= "1" then
                return ""       -- ignore on IPv4 selected
-       elseif not DDNS.has_ipv6 then
+       elseif not has_ipv6 then
                return nil, err_tab_adv(self) .. err_ipv6_plain
        elseif not _verify_ip_source() then
                return nil, err_tab_adv(self) ..
@@ -794,7 +802,7 @@ ipn6 = ns:taboption("advanced", ListValue, "ipv6_network",
 ipn6:depends("ipv6_source", "network")
 ipn6.default = "wan6"
 WADM.cbi_add_networks(ipn6)
-if DDNS.has_ipv6 then
+if has_ipv6 then
        ipn6.description = translate("Defines the network to read systems IPv6-Address from")
 else
        ipn6.description = err_ipv6_other
@@ -808,7 +816,7 @@ function ipn6.validate(self, value)
                -- ignore if IPv4 selected OR
                -- ignore everything except "network"
                return ""
-       elseif DDNS.has_ipv6 then
+       elseif has_ipv6 then
                return value
        else
                return nil, err_tab_adv(self) .. err_ipv6_plain
@@ -881,7 +889,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 DDNS.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
@@ -895,7 +903,7 @@ function iurl6.validate(self, value)
                -- ignore if IPv4 selected OR
                -- ignore everything except "web"
                return ""
-       elseif not DDNS.has_ipv6 then
+       elseif not has_ipv6 then
                return nil, err_tab_adv(self) .. err_ipv6_plain
        elseif not value or #value == 0 then
                return nil, err_tab_adv(self) .. translate("missing / required")
@@ -1051,7 +1059,7 @@ eif6:depends("ipv6_source", "web")
 eif6:depends("ipv6_source", "script")
 eif6.default = "wan6"
 WADM.cbi_add_networks(eif6)
-if not DDNS.has_ipv6 then
+if not has_ipv6 then
        eif6.description = err_ipv6_other
 else
        eif6.description = translate("Network on which the ddns-updater scripts will be started")
@@ -1065,7 +1073,7 @@ function eif6.validate(self, value)
         or fsrc6 == "network"
         or fsrc6 == "interface" then
                return ""       -- ignore IPv4, network, interface
-       elseif not DDNS.has_ipv6 then
+       elseif not has_ipv6 then
                return nil, err_tab_adv(self) .. err_ipv6_plain
        else
                return value
@@ -1084,10 +1092,13 @@ function eif6.write(self, section, value)
 end
 function eif6.parse(self, section, novld)
        DDNS.value_parse(self, section, novld)
-end
+end 
 
 -- IPv4/IPv6 - bind_network -- ################################################
-if DDNS.has_bindnet or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then
+
+local has_bindnet = DDNS.env_info("has_bindnet")
+
+if has_bindnet or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then
        bnet = ns:taboption("advanced", ListValue, "bind_network",
                translate("Bind Network") )
        bnet:depends("ipv4_source", "web")
@@ -1097,7 +1108,7 @@ if DDNS.has_bindnet or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then
        WADM.cbi_add_networks(bnet)
        function bnet.cfgvalue(self, section)
                local value = AbstractValue.cfgvalue(self, section)
-               if not DDNS.has_bindnet and value ~= "" then
+               if not has_bindnet and value ~= "" then
                        self.description = bold_on .. font_red ..
                                translate("Binding to a specific network not supported") .. font_off .. "<br />" ..
                                translate("please set to 'default'") .. " !" .. bold_off
@@ -1108,7 +1119,7 @@ if DDNS.has_bindnet or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then
                return value
        end
        function bnet.validate(self, value)
-               if ( (value ~= "") and DDNS.has_bindnet ) or (value == "") then return value end
+               if ( (value ~= "") and has_bindnet ) or (value == "") then return value end
                return nil, err_tab_adv(self) .. translate("Binding to a specific network not supported") .. " !"
        end
        function bnet.parse(self, section, novld)
@@ -1119,13 +1130,16 @@ end
 -- IPv4 + IPv6 - force_ipversion -- ###########################################
 -- optional to force wget/curl and host to use only selected IP version
 -- command parameter "-4" or "-6"
-if DDNS.has_forceip or ( ( m:get(section, "force_ipversion") or "0" ) ~= "0" ) then
+
+local has_forceip = DDNS.env_info("has_forceip")
+
+if has_forceip or ( ( m:get(section, "force_ipversion") or "0" ) ~= "0" ) then
        fipv = ns:taboption("advanced", Flag, "force_ipversion",
                translate("Force IP Version") )
        fipv.orientation = "horizontal"
        function fipv.cfgvalue(self, section)
                local value = AbstractValue.cfgvalue(self, section)
-               if not DDNS.has_forceip and value ~= "0" then
+               if not has_forceip and value ~= "0" then
                        self.description = bold_on .. font_red ..
                                translate("Force IP Version not supported") .. font_off .. "<br />" ..
                                translate("please disable") .. " !" .. bold_off
@@ -1135,14 +1149,17 @@ if DDNS.has_forceip or ( ( m:get(section, "force_ipversion") or "0" ) ~= "0" ) t
                return value
        end
        function fipv.validate(self, value)
-               if (value == "1" and DDNS.has_forceip) or value == "0" then return value end
+               if (value == "1" and has_forceip) or value == "0" then return value end
                return nil, err_tab_adv(self) .. translate("Force IP Version not supported")
        end
 end
 
 -- IPv4 + IPv6 - dns_server -- ################################################
 -- optional DNS Server to use resolving my IP
-if DDNS.has_dnsserver or ( ( m:get(section, "dns_server") or "" ) ~= "" ) then
+
+local has_dnsserver = DDNS.env_info("has_dnsserver")
+
+if has_dnsserver or ( ( m:get(section, "dns_server") or "" ) ~= "" ) then
        dns = ns:taboption("advanced", Value, "dns_server",
                translate("DNS-Server"),
                translate("OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'.") .. "<br />" ..
@@ -1152,7 +1169,7 @@ if DDNS.has_dnsserver or ( ( m:get(section, "dns_server") or "" ) ~= "" ) then
                -- if .datatype is set, then it is checked before calling this function
                if not value or (#value == 0) then
                        return ""       -- ignore on empty
-               elseif not DDNS.has_dnsserver then
+               elseif not has_dnsserver then
                        return nil, err_tab_adv(self) .. translate("Specifying a DNS-Server is not supported")
                elseif not DTYP.host(value) then
                        return nil, err_tab_adv(self) .. translate("use hostname, FQDN, IPv4- or IPv6-Address")
@@ -1179,13 +1196,16 @@ if DDNS.has_dnsserver or ( ( m:get(section, "dns_server") or "" ) ~= "" ) then
 end
 
 -- IPv4 + IPv6 - force_dnstcp -- ##############################################
-if DDNS.has_bindhost or ( ( m:get(section, "force_dnstcp") or "0" ) ~= "0" ) then
+
+local has_bindhost = DDNS.env_info("has_bindhost")
+
+if has_bindhost or ( ( m:get(section, "force_dnstcp") or "0" ) ~= "0" ) then
        tcp = ns:taboption("advanced", Flag, "force_dnstcp",
                translate("Force TCP on DNS") )
        tcp.orientation = "horizontal"
        function tcp.cfgvalue(self, section)
                local value = AbstractValue.cfgvalue(self, section)
-               if not DDNS.has_bindhost and value ~= "0" then
+               if not has_bindhost and value ~= "0" then
                        self.description = bold_on .. font_red ..
                                translate("DNS requests via TCP not supported") .. font_off .. "<br />" ..
                                translate("please disable") .. " !" .. bold_off
@@ -1195,7 +1215,7 @@ if DDNS.has_bindhost or ( ( m:get(section, "force_dnstcp") or "0" ) ~= "0" ) the
                return value
        end
        function tcp.validate(self, value)
-               if (value == "1" and DDNS.has_bindhost ) or value == "0" then
+               if (value == "1" and has_bindhost ) or value == "0" then
                        return value
                end
                return nil, err_tab_adv(self) .. translate("DNS requests via TCP not supported")
@@ -1204,13 +1224,16 @@ end
 
 -- IPv4 + IPv6 - proxy -- #####################################################
 -- optional Proxy to use for http/https requests  [user:password@]proxyhost[:port]
-if DDNS.has_proxy or ( ( m:get(section, "proxy") or "" ) ~= "" ) then
+
+local has_proxy = DDNS.env_info("has_proxy")
+
+if has_proxy or ( ( m:get(section, "proxy") or "" ) ~= "" ) then
        pxy = ns:taboption("advanced", Value, "proxy",
                translate("PROXY-Server") )
        pxy.placeholder="user:password@myproxy.lan:8080"
        function pxy.cfgvalue(self, section)
                local value = AbstractValue.cfgvalue(self, section)
-               if not DDNS.has_proxy and value ~= "" then
+               if not has_proxy and value ~= "" then
                        self.description = bold_on .. font_red ..
                                translate("PROXY-Server not supported") .. font_off .. "<br />" ..
                                translate("please remove entry") .. "!" .. bold_off
@@ -1226,7 +1249,7 @@ if DDNS.has_proxy or ( ( m:get(section, "proxy") or "" ) ~= "" ) then
                -- if .datatype is set, then it is checked before calling this function
                if not value or (#value == 0) then
                        return ""       -- ignore on empty
-               elseif DDNS.has_proxy then
+               elseif has_proxy then
                        local ipv6  = usev6:formvalue(section) or "0"
                        local force = fipv:formvalue(section) or "0"
                        local command = CTRL.luci_helper .. [[ -]]
index df39a3a7e583ce29ede849ffce2681cb674fed10..419201548b5c372bb139f2f0b934476eea5ae297 100644 (file)
@@ -48,7 +48,7 @@ if not SYS.init.enabled("ddns") then
 end
 
 -- No IPv6 support
-if not DDNS.has_ipv6 then
+if not DDNS.env_info("has_ipv6") then
        local v6 = s:option(DummyValue, "_no_ipv6")
        v6.titleref = 'http://www.openwrt.org" target="_blank'
        v6.rawhtml  = true
@@ -60,7 +60,7 @@ if not DDNS.has_ipv6 then
 end
 
 -- No HTTPS support
-if not DDNS.has_ssl then
+if not DDNS.env_info("has_ssl") then
        local sl = s:option(DummyValue, "_no_https")
        sl.titleref = DISP.build_url("admin", "system", "packages")
        sl.rawhtml  = true
@@ -74,7 +74,7 @@ if not DDNS.has_ssl then
 end
 
 -- No bind_network
-if not DDNS.has_bindnet then
+if not DDNS.env_info("has_bindnet") then
        local bn = s:option(DummyValue, "_no_bind_network")
        bn.titleref = DISP.build_url("admin", "system", "packages")
        bn.rawhtml  = true
@@ -90,7 +90,7 @@ if not DDNS.has_bindnet then
 end
 
 -- currently only cURL possibly without proxy support
-if not DDNS.has_proxy then
+if not DDNS.env_info("has_proxy") then
        local px = s:option(DummyValue, "_no_proxy")
        px.titleref = DISP.build_url("admin", "system", "packages")
        px.rawhtml  = true
@@ -104,7 +104,7 @@ if not DDNS.has_proxy then
 end
 
 -- "Force IP Version not supported"
-if not DDNS.has_forceip then
+if not DDNS.env_info("has_forceip") then
        local fi = s:option(DummyValue, "_no_force_ip")
        fi.titleref = DISP.build_url("admin", "system", "packages")
        fi.rawhtml  = true
@@ -112,11 +112,11 @@ if not DDNS.has_forceip then
                translate("Force IP Version not supported") .. bold_off
        local value = translate("BusyBox's nslookup and Wget do not support to specify " ..
                                "the IP version to use for communication with DDNS Provider!")
-       if not (DDNS.has_wgetssl or DDNS.has_curl or DDNS.has_fetch) then
+       if not (DDNS.env_info("has_wgetssl") or DDNS.env_info("has_curl") or DDNS.env_info("has_fetch")) then
                value = value .. "<br />- " ..
                        translate("You should install 'wget' or 'curl' or 'uclient-fetch' package.")
        end
-       if not DDNS.has_bindhost then
+       if not DDNS.env_info("has_bindhost") then
                value = value .. "<br />- " ..
                        translate("You should install 'bind-host' or 'knot-host' or 'drill' package for DNS requests.")
        end
@@ -124,7 +124,7 @@ if not DDNS.has_forceip then
 end
 
 -- "DNS requests via TCP not supported"
-if not DDNS.has_bindhost then
+if not DDNS.env_info("has_bindhost") then
        local dt = s:option(DummyValue, "_no_dnstcp")
        dt.titleref = DISP.build_url("admin", "system", "packages")
        dt.rawhtml  = true
@@ -137,7 +137,7 @@ if not DDNS.has_bindhost then
 end
 
 -- nslookup compiled with musl produce problems when using
-if not DDNS.has_dnsserver then
+if not DDNS.env_info("has_dnsserver") then
        local ds = s:option(DummyValue, "_no_dnsserver")
        ds.titleref = DISP.build_url("admin", "system", "packages")
        ds.rawhtml  = true
@@ -151,7 +151,7 @@ if not DDNS.has_dnsserver then
 end
 
 -- certificates installed
-if DDNS.has_ssl and not DDNS.has_cacerts then
+if DDNS.env_info("has_ssl") and not DDNS.env_info("has_cacerts") then
        local ca = s:option(DummyValue, "_no_certs")
        ca.titleref = DISP.build_url("admin", "system", "packages")
        ca.rawhtml  = true
index 114f831c170f16a9a2b870c818b0bc9e7ec2842d..11f73800ea7156454a979632e4ac1fbb693378b6 100644 (file)
@@ -1,21 +1,20 @@
 -- Copyright 2014-2018 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
 -- Licensed to the public under the Apache License 2.0.
 
-local NXFS = require "nixio.fs"
 local DISP = require "luci.dispatcher"
 local HTTP = require "luci.http"
 local SYS  = require "luci.sys"
 local CTRL = require "luci.controller.ddns"    -- this application's controller
 local DDNS = require "luci.tools.ddns"         -- ddns multiused functions
 
-local show_hints = not (DDNS.has_ipv6          -- IPv6 support
-                   and DDNS.has_ssl            -- HTTPS support
-                   and DDNS.has_proxy          -- Proxy support
-                   and DDNS.has_bindhost       -- DNS TCP support
-                   and DDNS.has_forceip        -- Force IP version
-                   and DDNS.has_dnsserver      -- DNS server support
-                   and DDNS.has_bindnet        -- Bind to network/interface
-                   and DDNS.has_cacerts        -- certificates installed at /etc/ssl/certs
+local show_hints = not (DDNS.env_info("has_ipv6")              -- IPv6 support
+                                  and  DDNS.env_info("has_ssl")                -- HTTPS support
+                                  and  DDNS.env_info("has_proxy")              -- Proxy support
+                                  and  DDNS.env_info("has_bindhost")   -- DNS TCP support
+                                  and  DDNS.env_info("has_forceip")    -- Force IP version
+                                  and  DDNS.env_info("has_dnsserver")  -- DNS server support
+                                  and  DDNS.env_info("has_bindnet")    -- Bind to network/interface
+                                  and  DDNS.env_info("has_cacerts")    -- certificates installed at /etc/ssl/certs
                )
 local not_enabled = not SYS.init.enabled("ddns")
 local need_update = not CTRL.service_ok()
index 690b9b30ceb57d62a1ef3bce90917326e229d5ac..57913a51fe529f1022ea3dade30f5e8d05fa2e05 100755 (executable)
@@ -5,36 +5,134 @@ module("luci.tools.ddns", package.seeall)
 
 local NX   = require "nixio"
 local NXFS = require "nixio.fs"
-local OPKG = require "luci.model.ipkg"
 local UCI  = require "luci.model.uci"
 local SYS  = require "luci.sys"
-local UTIL = require "luci.util"
 
-local function _check_certs()
-       local _, v = NXFS.glob("/etc/ssl/certs/*.crt")
-       if ( v == 0 ) then _, v = NXFS.glob("/etc/ssl/certs/*.pem") end
-       return (v > 0)
-end
+function env_info(type)
+
+       if ( type == "has_ssl" ) or ( type == "has_proxy" ) or ( type == "has_forceip" ) 
+           or ( type == "has_bindnet" ) or ( type == "has_fetch" ) 
+               or ( type == "has_wgetssl" ) or ( type == "has_curl" ) 
+               or ( type == "has_curlssl" ) or ( type == "has_curlpxy" ) 
+               or ( type == "has_fetchssl" ) or ( type == "has_bbwget" ) then 
+               
+               local function has_wgetssl() 
+                       return (SYS.call( [[which wget-ssl >/dev/null 2>&1]] ) == 0)    -- and true or nil
+               end
+               
+               local function has_curlssl() 
+                       return (SYS.call( [[$(which curl) -V 2>&1 | grep "Protocols:" | grep -qF "https"]] ) ~= 0)
+               end
+               
+               local function has_fetch()
+                       return (SYS.call( [[which uclient-fetch >/dev/null 2>&1]] ) == 0)
+               end
+               
+               local function has_fetchssl()
+                       return NXFS.access("/lib/libustream-ssl.so")
+               end
+               
+               local function has_curl()
+                       return (SYS.call( [[which curl >/dev/null 2>&1]] ) == 0)
+               end
+               
+               local function has_curlpxy()
+                       return (SYS.call( [[grep -i "all_proxy" /usr/lib/libcurl.so* >/dev/null 2>&1]] ) == 0)
+               end
+               
+               local function has_bbwget()
+                       return (SYS.call( [[$(which wget) -V 2>&1 | grep -iqF "busybox"]] ) == 0)
+               end
+               
+               if type == "has_wgetssl" then
+                       return has_wgetssl()
+               
+               elseif type == "has_curl" then
+                       return has_curl()
+                       
+               elseif type == "has_curlssl" then
+                       return has_curlssl()
+                       
+               elseif type == "has_curlpxy" then
+                       return has_curlpxy()
+                       
+               elseif type == "has_fetch" then
+                       return has_fetch()
+                       
+               elseif type == "has_fetchssl" then
+                       return has_fetchssl()
+                       
+               elseif type == "has_bbwget" then
+                       return has_bbwget()
+               
+               elseif type == "has_ssl" then
+                       if has_wgetssl() then return true end
+                       if has_curlssl() then return true end
+                       if (has_fetch() and has_fetchssl()) then return true end
+                       return false
+                       
+               elseif type == "has_proxy" then
+                       if has_wgetssl() then return true end
+                       if has_curlpxy() then return true end
+                       if has_fetch() then return true end
+                       if has_bbwget() then return true end
+                       return false
+                       
+               elseif type == "has_forceip" then
+                       if has_wgetssl() then return true end
+                       if has_curl() then return true end
+                       if has_fetch() then return true end -- only really needed for transfer
+                       return false
+                       
+               elseif type == "has_bindnet" then
+                       if has_curl() then return true end
+                       if has_wgetssl() then return true end
+                       return false
+               end
+       
+       elseif ( type == "has_dnsserver" ) or ( type == "has_bindhost" ) or ( type == "has_hostip" ) or ( type == "has_nslookup" ) then
+               local function has_bindhost() 
+                       if (SYS.call( [[which host >/dev/null 2>&1]] ) == 0) then return true end
+                       if (SYS.call( [[which host >/dev/null 2>&1]] ) == 0) then return true end
+                       if (SYS.call( [[which khost >/dev/null 2>&1]] ) == 0) then return true end
+                       if (SYS.call( [[which drill >/dev/null 2>&1]] ) == 0) then return true end
+                       return false
+               end
+               
+               local function has_hostip()
+                       return (SYS.call( [[which hostip >/dev/null 2>&1]] ) == 0)
+               end
+               
+               local function has_nslookup()
+                       return (SYS.call( [[$(which nslookup) localhost 2>&1 | grep -qF "(null)"]] ) ~= 0)
+               end
+               
+               if type == "has_bindhost" then
+                       return has_bindhost()
+               elseif type == "has_hostip" then
+                       return has_hostip()
+               elseif type == "has_nslookup" then
+                       return has_nslookup()
+               elseif tyep == "has_dnsserver" then
+                       if has_bindhost() then return true end
+                       if has_hostip() then return true end
+                       if has_nslookup() then return true end
+                       return false
+               end
+               
+       elseif type == "has_ipv6" then
+               return (NXFS.access("/proc/net/ipv6_route") and NXFS.access("/usr/sbin/ip6tables"))
+               
+       elseif type == "has_cacerts" then
+               --old _check_certs() local function 
+               local _, v = NXFS.glob("/etc/ssl/certs/*.crt")
+               if ( v == 0 ) then _, v = NXFS.glob("/etc/ssl/certs/*.pem") end
+               return (v > 0)
+       else
+               return
+       end
 
-has_wgetssl    = (SYS.call( [[which wget-ssl >/dev/null 2>&1]] ) == 0) -- and true or nil
-has_curl       = (SYS.call( [[which curl >/dev/null 2>&1]] ) == 0)
-has_curlssl    = (SYS.call( [[$(which curl) -V 2>&1 | grep "Protocols:" | grep -qF "https"]] ) ~= 0)
-has_curlpxy    = (SYS.call( [[grep -i "all_proxy" /usr/lib/libcurl.so* >/dev/null 2>&1]] ) == 0)
-has_fetch      = (SYS.call( [[which uclient-fetch >/dev/null 2>&1]] ) == 0)
-has_fetchssl   = NXFS.access("/lib/libustream-ssl.so")
-has_bbwget     = (SYS.call( [[$(which wget) -V 2>&1 | grep -iqF "busybox"]] ) == 0)
-has_bindhost   = (SYS.call( [[which host >/dev/null 2>&1]] ) == 0)
-               or (SYS.call( [[which khost >/dev/null 2>&1]] ) == 0)
-               or (SYS.call( [[which drill >/dev/null 2>&1]] ) == 0)
-has_hostip     = (SYS.call( [[which hostip >/dev/null 2>&1]] ) == 0)
-has_nslookup   = (SYS.call( [[$(which nslookup) localhost 2>&1 | grep -qF "(null)"]] ) ~= 0)
-has_ipv6       = (NXFS.access("/proc/net/ipv6_route") and NXFS.access("/usr/sbin/ip6tables"))
-has_ssl                = (has_wgetssl or has_curlssl or (has_fetch and has_fetchssl))
-has_proxy      = (has_wgetssl or has_curlpxy or has_fetch or has_bbwget)
-has_forceip    = (has_wgetssl or has_curl or has_fetch) -- only really needed for transfer
-has_dnsserver  = (has_bindhost or has_hostip or has_nslookup)
-has_bindnet    = (has_wgetssl or has_curl)
-has_cacerts    = _check_certs()
+end
 
 -- function to calculate seconds from given interval and unit
 function calc_seconds(interval, unit)