luci-app-ddns: patches for #298 #334 #335 337/head
authorChristian Schoenebeck <christian.schoenebeck@gmail.com>
Sun, 1 Mar 2015 19:08:45 +0000 (20:08 +0100)
committerChristian Schoenebeck <christian.schoenebeck@gmail.com>
Sun, 1 Mar 2015 19:08:45 +0000 (20:08 +0100)
* remove usage of opkg via system call for version handling
thanks to Jo-Philipp Wich #335
* remove special handling of bootstrap theme #298 #334

Signed-off-by: Christian Schoenebeck <christian.schoenebeck@gmail.com>
applications/luci-app-ddns/Makefile
applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua
applications/luci-app-ddns/luasrc/model/cbi/ddns/global.lua
applications/luci-app-ddns/luasrc/tools/ddns.lua

index db1da2c7c7ef01457a718119e81105f1aa475ce0..f20b49e90207b30ec498dee991bb60bb5a540db0 100644 (file)
@@ -6,16 +6,11 @@
 
 include $(TOPDIR)/rules.mk
 
-# LuCI specific settings
-LUCI_TITLE:=LuCI Support for Dynamic DNS Client (ddns-scripts)
-LUCI_DEPENDS:=+luci-mod-admin-full +ddns-scripts
-LUCI_PKGARCH:=all
-
 PKG_NAME:=luci-app-ddns
 
 # Version == major.minor.patch
 # increase on new functionality (minor) or patches (patch)
-PKG_VERSION:=2.2.0
+PKG_VERSION:=2.2.1
 
 # Release == build
 # increase on changes of translation files
@@ -24,15 +19,20 @@ PKG_RELEASE:=1
 PKG_LICENSE:=Apache-2.0
 PKG_MAINTAINER:=Christian Schoenebeck <christian.schoenebeck@gmail.com>
 
+# LuCI specific settings
+LUCI_TITLE:=LuCI Support for Dynamic DNS Client (ddns-scripts)
+LUCI_DEPENDS:=+luci-mod-admin-full +ddns-scripts
+LUCI_PKGARCH:=all
+
 define Package/$(PKG_NAME)/config
 # shown in make menuconfig <Help>
 help
        $(LUCI_TITLE)
-
-       Version   : $(PKG_VERSION)-$(PKG_RELEASE)
-       Maintainer: $(PKG_MAINTAINER)
+       .
+       Version: $(PKG_VERSION)-$(PKG_RELEASE)
+       $(PKG_MAINTAINER)
 endef
 
-include ../../luci.mk
+include $(TOPDIR)/feeds/luci/luci.mk
 
 # call BuildPackage - OpenWrt buildroot signature
index 602bc159af7442872370d1d575f31b85500ffc92..40a66ef1524f2967831e7a116ae8c48247af4a6d 100644 (file)
@@ -1,7 +1,7 @@
 -- Copyright 2008 Steven Barth <steven@midlink.org>
 -- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
 -- Copyright 2013 Manuel Munz <freifunk at somakoma dot de>
--- Copyright 2014 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
+-- Copyright 2014-2015 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
 -- Licensed to the public under the Apache License 2.0.
 
 local NX   = require "nixio"
@@ -25,7 +25,6 @@ local has_dnstcp = DDNS.check_bind_host()     -- DNS TCP support
 local has_force  = has_ssl and has_dnstcp      -- Force IP Protocoll
 
 -- html constants -- ###########################################################
-local LFLF     = (DDNS.get_theme() == "Bootstrap") and [[<br /><br />]] or [[]]
 local font_red = "<font color='red'>"
 local font_off = "</font>"
 local bold_on  = "<strong>"
index 32ca5418ef62f8dadcc2cf5b16dab0059682ab57..e1718739f98953bb94f07ce87a611179205b018c 100644 (file)
@@ -7,9 +7,6 @@ local DISP = require "luci.dispatcher"
 local SYS  = require "luci.sys"
 local DDNS = require "luci.tools.ddns"         -- ddns multiused functions
 
--- Bootstrap theme needs 2 or 3 additional linefeeds for tab description for better optic
-local LFLF = (DDNS.get_theme() == "Bootstrap") and [[<br /><br />]] or [[]]
-
 -- cbi-map definition -- #######################################################
 local m = Map("ddns")
 
@@ -38,7 +35,7 @@ local ns = m:section( NamedSection, "global", "ddns",
        .. [[<a href="http://wiki.openwrt.org/doc/uci/ddns#version_2x1" target="_blank">]]
        .. translate("For detailed information about parameter settings look here.")
        .. [[</a>]]
-       .. LFLF )
+
 -- section might not exist
 function ns.cfgvalue(self, section)
        if not self.map:get(section) then
index e9c3fa936a5c5b15f1d69f25d1f3b69cdbe4e401..6d53931469551c78610e1bc2c8fcee3dedae3f45 100644 (file)
@@ -100,39 +100,67 @@ end
 function ipkg_ver_compare(ver1, comp, ver2)
        if not ver1 or not (#ver1 > 0)
        or not ver2 or not (#ver2 > 0)
-       or not comp or not (#comp > 0) then
-               return nil
+       or not comp or not (#comp > 0) then return nil end
+       -- correct compare string
+       if comp == "<>" or comp == "><" or comp == "!=" or comp == "~=" then comp = "~="
+       elseif comp == "<=" or comp == "<" or comp == "=<" then comp = "<="
+       elseif comp == ">=" or comp == ">" or comp == "=>" then comp = ">="
+       elseif comp == "="  or comp == "==" then comp = "=="
+       elseif comp == "<<" then comp = "<"
+       elseif comp == ">>" then comp = ">"
+       else return nil end
+
+       local av1 = UTIL.split(ver1, "[%.%-]", nil, true)
+       local av2 = UTIL.split(ver2, "[%.%-]", nil, true)
+
+       for i = 1, math.max(table.getn(av1),table.getn(av2)), 1  do
+               local s1 = av1[i] or ""
+               local s2 = av2[i] or ""
+               local n1 = tonumber(s1)
+               local n2 = tonumber(s2)
+
+               -- one numeric and other empty string then set other to 0
+               if n1 and not n2 and (not s2 or #s2 == 0) then n2 = 0 end
+               if n2 and not n1 and (not s1 or #s1 == 0) then n1 = 0 end
+
+               local nc = (n1 and n2)  -- numeric compare
+
+               if nc then
+                       -- first "not equal" found return true
+                       if comp == "~=" and (n1 ~= n2) then return true end
+                       -- first "lower" found return true
+                       if (comp == "<" or comp == "<=") and (n1 < n2) then return true end
+                       -- first "greater" found return true
+                       if (comp == ">" or comp == ">=") and (n1 > n2) then return true end
+                       -- not equal then return false
+                       if (n1 ~= n2) then return false end
+               else
+                       if comp == "~=" and (s1 ~= s2) then return true end
+                       if (comp == "<" or comp == "<=") and (s1 < s2) then return true end
+                       if (comp == ">" or comp == ">=") and (s1 > s2) then return true end
+                       if (s1 ~= s2) then return false end
+               end
        end
-       return (tonumber(SYS.call(
-               [[opkg compare-versions "]] .. ver1 .. [[" "]] .. comp .. [[" "]] .. ver2 .. [["]]
-               )) == 1)
+       -- all equal then true
+       return true
 end
 
 -- read version information for given package if installed
 function ipkg_ver_installed(pkg)
-       if not pkg then
-               return nil
-       end
-       -- opkg list-installed [pkg] | cut -d " " -f 3 - return version as sting
-       local ver = SYS.exec([[opkg list-installed ]] .. pkg .. [[ | cut -d " " -f 3 ]])
-       if (#ver > 0) then
-               return ver
-       end
-       return nil
-end
-
--- get the "name" of the current active theme
-function get_theme()
-       local _uci  = UCI.cursor()
-       local _base = _uci:get("luci", "main", "mediaurlbase")  -- only pathname
-       _uci:unload("luci")
-
-       for k, v in pairs(luci.config.themes) do
-               if k:sub(1, 1) ~= "." and v == _base then
-                       return k
-               end
+       local version = nil
+       local control = io.open("/usr/lib/opkg/info/%s.control" % pkg, "r")
+       if control then
+               local ln
+               repeat
+                       ln = control:read("*l")
+                       if ln and ln:match("^Version: ") then
+                               version = ln:gsub("^Version: ", "")
+                               break
+                       end
+               until not ln
+               control:close()
        end
-       return nil
+       return version
 end
 
 -- replacement of build-in read of UCI option