From: Jo-Philipp Wich Date: Wed, 14 Nov 2018 13:35:01 +0000 (+0100) Subject: luci-lib-ipkg: move out of luci-base X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=4bbe32548c407ec6ae104934b3f1fe53539de9f6;p=oweals%2Fluci.git luci-lib-ipkg: move out of luci-base Move the old luci.model.ipkg utility class into a separate package and let the components using it depend on the new library package. Signed-off-by: Jo-Philipp Wich --- diff --git a/applications/luci-app-aria2/Makefile b/applications/luci-app-aria2/Makefile index f5b006c35..e957c436f 100644 --- a/applications/luci-app-aria2/Makefile +++ b/applications/luci-app-aria2/Makefile @@ -21,7 +21,7 @@ PKG_MAINTAINER:=Hsing-Wang Liao # LuCI specific settings LUCI_TITLE:=LuCI Support for Aria2 -LUCI_DEPENDS:=+aria2 +LUCI_DEPENDS:=+luci-lib-ipkg +aria2 LUCI_PKGARCH:=all define Package/$(PKG_NAME)/config diff --git a/applications/luci-app-ddns/Makefile b/applications/luci-app-ddns/Makefile index 9262afcf8..eb3a77aee 100644 --- a/applications/luci-app-ddns/Makefile +++ b/applications/luci-app-ddns/Makefile @@ -23,7 +23,7 @@ PKG_MAINTAINER:=Ansuel Smith # LuCI specific settings LUCI_TITLE:=LuCI Support for Dynamic DNS Client (ddns-scripts) -LUCI_DEPENDS:=+luci-mod-admin-full +ddns-scripts +LUCI_DEPENDS:=+luci-lib-ipkg +luci-mod-admin-full +ddns-scripts # LUCI_PKGARCH:=all define Package/$(PKG_NAME)/config diff --git a/applications/luci-app-dynapoint/Makefile b/applications/luci-app-dynapoint/Makefile index 83512dba5..e405cc41f 100644 --- a/applications/luci-app-dynapoint/Makefile +++ b/applications/luci-app-dynapoint/Makefile @@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=LuCI Support for DynaPoint -LUCI_DEPENDS:=+dynapoint +LUCI_DEPENDS:=+luci-lib-ipkg +dynapoint PKG_LICENSE:=GPL-3.0+ PKG_MAINTAINER:=Tobias Ilte diff --git a/applications/luci-app-privoxy/Makefile b/applications/luci-app-privoxy/Makefile index 486cf0ee7..672817283 100644 --- a/applications/luci-app-privoxy/Makefile +++ b/applications/luci-app-privoxy/Makefile @@ -21,7 +21,7 @@ PKG_MAINTAINER:= # LuCI specific settings LUCI_TITLE:=LuCI Support for Privoxy WEB proxy -LUCI_DEPENDS:=+luci-mod-admin-full +privoxy +LUCI_DEPENDS:=+luci-lib-ipkg +luci-mod-admin-full +privoxy LUCI_PKGARCH:=all define Package/$(PKG_NAME)/config diff --git a/applications/luci-app-radicale/Makefile b/applications/luci-app-radicale/Makefile index 87180e77d..90ef0deba 100644 --- a/applications/luci-app-radicale/Makefile +++ b/applications/luci-app-radicale/Makefile @@ -21,7 +21,7 @@ PKG_MAINTAINER:= # LuCI specific settings LUCI_TITLE:=LuCI Support for Radicale CardDAV/CalDAV -LUCI_DEPENDS:=+luci-mod-admin-full +LUCI_DEPENDS:=+luci-lib-ipkg +luci-mod-admin-full LUCI_PKGARCH:=all define Package/$(PKG_NAME)/config diff --git a/applications/luci-app-transmission/Makefile b/applications/luci-app-transmission/Makefile index 668c73185..42b29e9a4 100644 --- a/applications/luci-app-transmission/Makefile +++ b/applications/luci-app-transmission/Makefile @@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=LuCI Support for Transmission -LUCI_DEPENDS:= +LUCI_DEPENDS:=+luci-lib-ipkg include ../../luci.mk diff --git a/libs/luci-lib-ipkg/Makefile b/libs/luci-lib-ipkg/Makefile new file mode 100644 index 000000000..52fcf6fe8 --- /dev/null +++ b/libs/luci-lib-ipkg/Makefile @@ -0,0 +1,14 @@ +# +# Copyright (C) 2018 Jo-Philipp Wich +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=Legacy opkg interface class +LUCI_DEPENDS:=+luci-base + +include ../../luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/libs/luci-lib-ipkg/luasrc/model/ipkg.lua b/libs/luci-lib-ipkg/luasrc/model/ipkg.lua new file mode 100644 index 000000000..e27ea5289 --- /dev/null +++ b/libs/luci-lib-ipkg/luasrc/model/ipkg.lua @@ -0,0 +1,247 @@ +-- Copyright 2008-2011 Jo-Philipp Wich +-- Copyright 2008 Steven Barth +-- Licensed to the public under the Apache License 2.0. + +local os = require "os" +local io = require "io" +local fs = require "nixio.fs" +local util = require "luci.util" + +local type = type +local pairs = pairs +local error = error +local table = table + +local ipkg = "opkg --force-removal-of-dependent-packages --force-overwrite --nocase" +local icfg = "/etc/opkg.conf" + +module "luci.model.ipkg" + + +-- Internal action function +local function _action(cmd, ...) + local cmdline = { ipkg, cmd } + + local k, v + for k, v in pairs({...}) do + cmdline[#cmdline+1] = util.shellquote(v) + end + + local c = "%s >/tmp/opkg.stdout 2>/tmp/opkg.stderr" % table.concat(cmdline, " ") + local r = os.execute(c) + local e = fs.readfile("/tmp/opkg.stderr") + local o = fs.readfile("/tmp/opkg.stdout") + + fs.unlink("/tmp/opkg.stderr") + fs.unlink("/tmp/opkg.stdout") + + return r, o or "", e or "" +end + +-- Internal parser function +local function _parselist(rawdata) + if type(rawdata) ~= "function" then + error("OPKG: Invalid rawdata given") + end + + local data = {} + local c = {} + local l = nil + + for line in rawdata do + if line:sub(1, 1) ~= " " then + local key, val = line:match("(.-): ?(.*)%s*") + + if key and val then + if key == "Package" then + c = {Package = val} + data[val] = c + elseif key == "Status" then + c.Status = {} + for j in val:gmatch("([^ ]+)") do + c.Status[j] = true + end + else + c[key] = val + end + l = key + end + else + -- Multi-line field + c[l] = c[l] .. "\n" .. line + end + end + + return data +end + +-- Internal lookup function +local function _lookup(cmd, pkg) + local cmdline = { ipkg, cmd } + if pkg then + cmdline[#cmdline+1] = util.shellquote(pkg) + end + + -- OPKG sometimes kills the whole machine because it sucks + -- Therefore we have to use a sucky approach too and use + -- tmpfiles instead of directly reading the output + local tmpfile = os.tmpname() + os.execute("%s >%s 2>/dev/null" %{ table.concat(cmdline, " "), tmpfile }) + + local data = _parselist(io.lines(tmpfile)) + os.remove(tmpfile) + return data +end + + +function info(pkg) + return _lookup("info", pkg) +end + +function status(pkg) + return _lookup("status", pkg) +end + +function install(...) + return _action("install", ...) +end + +function installed(pkg) + local p = status(pkg)[pkg] + return (p and p.Status and p.Status.installed) +end + +function remove(...) + return _action("remove", ...) +end + +function update() + return _action("update") +end + +function upgrade() + return _action("upgrade") +end + +-- List helper +local function _list(action, pat, cb) + local cmdline = { ipkg, action } + if pat then + cmdline[#cmdline+1] = util.shellquote(pat) + end + + local fd = io.popen(table.concat(cmdline, " ")) + if fd then + local name, version, sz, desc + while true do + local line = fd:read("*l") + if not line then break end + + name, version, sz, desc = line:match("^(.-) %- (.-) %- (.-) %- (.+)") + + if not name then + name, version, sz = line:match("^(.-) %- (.-) %- (.+)") + desc = "" + end + + if name and version then + if #version > 26 then + version = version:sub(1,21) .. ".." .. version:sub(-3,-1) + end + + cb(name, version, sz, desc) + end + + name = nil + version = nil + sz = nil + desc = nil + end + + fd:close() + end +end + +function list_all(pat, cb) + _list("list --size", pat, cb) +end + +function list_installed(pat, cb) + _list("list_installed --size", pat, cb) +end + +function find(pat, cb) + _list("find --size", pat, cb) +end + + +function overlay_root() + local od = "/" + local fd = io.open(icfg, "r") + + if fd then + local ln + + repeat + ln = fd:read("*l") + if ln and ln:match("^%s*option%s+overlay_root%s+") then + od = ln:match("^%s*option%s+overlay_root%s+(%S+)") + + local s = fs.stat(od) + if not s or s.type ~= "dir" then + od = "/" + end + + break + end + until not ln + + fd:close() + end + + return od +end + +function compare_versions(ver1, comp, ver2) + if not ver1 or not ver2 + or not comp or not (#comp > 0) then + error("Invalid parameters") + 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 + error("Invalid compare string") + return nil + end + + local av1 = util.split(ver1, "[%.%-]", nil, true) + local av2 = util.split(ver2, "[%.%-]", nil, true) + + local max = table.getn(av1) + if (table.getn(av1) < table.getn(av2)) then + max = table.getn(av2) + end + + for i = 1, max, 1 do + local s1 = av1[i] or "" + local s2 = av2[i] or "" + + -- first "not equal" found return true + if comp == "~=" and (s1 ~= s2) then return true end + -- first "lower" found return true + if (comp == "<" or comp == "<=") and (s1 < s2) then return true end + -- first "greater" found return true + if (comp == ">" or comp == ">=") and (s1 > s2) then return true end + -- not equal then return false + if (s1 ~= s2) then return false end + end + + -- all equal and not compare greater or lower then true + return not (comp == "<" or comp == ">") +end diff --git a/libs/luci-lib-ipkg/luasrc/model/ipkg.luadoc b/libs/luci-lib-ipkg/luasrc/model/ipkg.luadoc new file mode 100644 index 000000000..4e1548dda --- /dev/null +++ b/libs/luci-lib-ipkg/luasrc/model/ipkg.luadoc @@ -0,0 +1,125 @@ +---[[ +LuCI OPKG call abstraction library +]] +module "luci.model.ipkg" + +---[[ +Return information about installed and available packages. + +@class function +@name info +@param pkg Limit output to a (set of) packages +@return Table containing package information +]] + +---[[ +Return the package status of one or more packages. + +@class function +@name status +@param pkg Limit output to a (set of) packages +@return Table containing package status information +]] + +---[[ +Install one or more packages. + +@class function +@name install +@param ... List of packages to install +@return Boolean indicating the status of the action +@return OPKG return code, STDOUT and STDERR +]] + +---[[ +Determine whether a given package is installed. + +@class function +@name installed +@param pkg Package +@return Boolean +]] + +---[[ +Remove one or more packages. + +@class function +@name remove +@param ... List of packages to install +@return Boolean indicating the status of the action +@return OPKG return code, STDOUT and STDERR +]] + +---[[ +Update package lists. + +@class function +@name update +@return Boolean indicating the status of the action +@return OPKG return code, STDOUT and STDERR +]] + +---[[ +Upgrades all installed packages. + +@class function +@name upgrade +@return Boolean indicating the status of the action +@return OPKG return code, STDOUT and STDERR +]] + +---[[ +List all packages known to opkg. + +@class function +@name list_all +@param pat Only find packages matching this pattern, nil lists all packages +@param cb Callback function invoked for each package, receives name, version and description as arguments +@return nothing +]] + +---[[ +List installed packages. + +@class function +@name list_installed +@param pat Only find packages matching this pattern, nil lists all packages +@param cb Callback function invoked for each package, receives name, version and description as arguments +@return nothing +]] + +---[[ +Find packages that match the given pattern. + +@class function +@name find +@param pat Find packages whose names or descriptions match this pattern, nil results in zero results +@param cb Callback function invoked for each patckage, receives name, version and description as arguments +@return nothing +]] + +---[[ +Determines the overlay root used by opkg. + +@class function +@name overlay_root +@return String containing the directory path of the overlay root. +]] + +---[[ +lua version of opkg compare-versions + +@class function +@name compare_versions +@param ver1 string version 1 +@param ver2 string version 2 +@param comp string compare versions using + "<=" or "<" lower-equal + ">" or ">=" greater-equal + "=" equal + "<<" lower + ">>" greater + "~=" not equal +@return Boolean indicating the status of the compare +]] + diff --git a/modules/luci-base/luasrc/model/ipkg.lua b/modules/luci-base/luasrc/model/ipkg.lua deleted file mode 100644 index e27ea5289..000000000 --- a/modules/luci-base/luasrc/model/ipkg.lua +++ /dev/null @@ -1,247 +0,0 @@ --- Copyright 2008-2011 Jo-Philipp Wich --- Copyright 2008 Steven Barth --- Licensed to the public under the Apache License 2.0. - -local os = require "os" -local io = require "io" -local fs = require "nixio.fs" -local util = require "luci.util" - -local type = type -local pairs = pairs -local error = error -local table = table - -local ipkg = "opkg --force-removal-of-dependent-packages --force-overwrite --nocase" -local icfg = "/etc/opkg.conf" - -module "luci.model.ipkg" - - --- Internal action function -local function _action(cmd, ...) - local cmdline = { ipkg, cmd } - - local k, v - for k, v in pairs({...}) do - cmdline[#cmdline+1] = util.shellquote(v) - end - - local c = "%s >/tmp/opkg.stdout 2>/tmp/opkg.stderr" % table.concat(cmdline, " ") - local r = os.execute(c) - local e = fs.readfile("/tmp/opkg.stderr") - local o = fs.readfile("/tmp/opkg.stdout") - - fs.unlink("/tmp/opkg.stderr") - fs.unlink("/tmp/opkg.stdout") - - return r, o or "", e or "" -end - --- Internal parser function -local function _parselist(rawdata) - if type(rawdata) ~= "function" then - error("OPKG: Invalid rawdata given") - end - - local data = {} - local c = {} - local l = nil - - for line in rawdata do - if line:sub(1, 1) ~= " " then - local key, val = line:match("(.-): ?(.*)%s*") - - if key and val then - if key == "Package" then - c = {Package = val} - data[val] = c - elseif key == "Status" then - c.Status = {} - for j in val:gmatch("([^ ]+)") do - c.Status[j] = true - end - else - c[key] = val - end - l = key - end - else - -- Multi-line field - c[l] = c[l] .. "\n" .. line - end - end - - return data -end - --- Internal lookup function -local function _lookup(cmd, pkg) - local cmdline = { ipkg, cmd } - if pkg then - cmdline[#cmdline+1] = util.shellquote(pkg) - end - - -- OPKG sometimes kills the whole machine because it sucks - -- Therefore we have to use a sucky approach too and use - -- tmpfiles instead of directly reading the output - local tmpfile = os.tmpname() - os.execute("%s >%s 2>/dev/null" %{ table.concat(cmdline, " "), tmpfile }) - - local data = _parselist(io.lines(tmpfile)) - os.remove(tmpfile) - return data -end - - -function info(pkg) - return _lookup("info", pkg) -end - -function status(pkg) - return _lookup("status", pkg) -end - -function install(...) - return _action("install", ...) -end - -function installed(pkg) - local p = status(pkg)[pkg] - return (p and p.Status and p.Status.installed) -end - -function remove(...) - return _action("remove", ...) -end - -function update() - return _action("update") -end - -function upgrade() - return _action("upgrade") -end - --- List helper -local function _list(action, pat, cb) - local cmdline = { ipkg, action } - if pat then - cmdline[#cmdline+1] = util.shellquote(pat) - end - - local fd = io.popen(table.concat(cmdline, " ")) - if fd then - local name, version, sz, desc - while true do - local line = fd:read("*l") - if not line then break end - - name, version, sz, desc = line:match("^(.-) %- (.-) %- (.-) %- (.+)") - - if not name then - name, version, sz = line:match("^(.-) %- (.-) %- (.+)") - desc = "" - end - - if name and version then - if #version > 26 then - version = version:sub(1,21) .. ".." .. version:sub(-3,-1) - end - - cb(name, version, sz, desc) - end - - name = nil - version = nil - sz = nil - desc = nil - end - - fd:close() - end -end - -function list_all(pat, cb) - _list("list --size", pat, cb) -end - -function list_installed(pat, cb) - _list("list_installed --size", pat, cb) -end - -function find(pat, cb) - _list("find --size", pat, cb) -end - - -function overlay_root() - local od = "/" - local fd = io.open(icfg, "r") - - if fd then - local ln - - repeat - ln = fd:read("*l") - if ln and ln:match("^%s*option%s+overlay_root%s+") then - od = ln:match("^%s*option%s+overlay_root%s+(%S+)") - - local s = fs.stat(od) - if not s or s.type ~= "dir" then - od = "/" - end - - break - end - until not ln - - fd:close() - end - - return od -end - -function compare_versions(ver1, comp, ver2) - if not ver1 or not ver2 - or not comp or not (#comp > 0) then - error("Invalid parameters") - 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 - error("Invalid compare string") - return nil - end - - local av1 = util.split(ver1, "[%.%-]", nil, true) - local av2 = util.split(ver2, "[%.%-]", nil, true) - - local max = table.getn(av1) - if (table.getn(av1) < table.getn(av2)) then - max = table.getn(av2) - end - - for i = 1, max, 1 do - local s1 = av1[i] or "" - local s2 = av2[i] or "" - - -- first "not equal" found return true - if comp == "~=" and (s1 ~= s2) then return true end - -- first "lower" found return true - if (comp == "<" or comp == "<=") and (s1 < s2) then return true end - -- first "greater" found return true - if (comp == ">" or comp == ">=") and (s1 > s2) then return true end - -- not equal then return false - if (s1 ~= s2) then return false end - end - - -- all equal and not compare greater or lower then true - return not (comp == "<" or comp == ">") -end diff --git a/modules/luci-base/luasrc/model/ipkg.luadoc b/modules/luci-base/luasrc/model/ipkg.luadoc deleted file mode 100644 index 4e1548dda..000000000 --- a/modules/luci-base/luasrc/model/ipkg.luadoc +++ /dev/null @@ -1,125 +0,0 @@ ----[[ -LuCI OPKG call abstraction library -]] -module "luci.model.ipkg" - ----[[ -Return information about installed and available packages. - -@class function -@name info -@param pkg Limit output to a (set of) packages -@return Table containing package information -]] - ----[[ -Return the package status of one or more packages. - -@class function -@name status -@param pkg Limit output to a (set of) packages -@return Table containing package status information -]] - ----[[ -Install one or more packages. - -@class function -@name install -@param ... List of packages to install -@return Boolean indicating the status of the action -@return OPKG return code, STDOUT and STDERR -]] - ----[[ -Determine whether a given package is installed. - -@class function -@name installed -@param pkg Package -@return Boolean -]] - ----[[ -Remove one or more packages. - -@class function -@name remove -@param ... List of packages to install -@return Boolean indicating the status of the action -@return OPKG return code, STDOUT and STDERR -]] - ----[[ -Update package lists. - -@class function -@name update -@return Boolean indicating the status of the action -@return OPKG return code, STDOUT and STDERR -]] - ----[[ -Upgrades all installed packages. - -@class function -@name upgrade -@return Boolean indicating the status of the action -@return OPKG return code, STDOUT and STDERR -]] - ----[[ -List all packages known to opkg. - -@class function -@name list_all -@param pat Only find packages matching this pattern, nil lists all packages -@param cb Callback function invoked for each package, receives name, version and description as arguments -@return nothing -]] - ----[[ -List installed packages. - -@class function -@name list_installed -@param pat Only find packages matching this pattern, nil lists all packages -@param cb Callback function invoked for each package, receives name, version and description as arguments -@return nothing -]] - ----[[ -Find packages that match the given pattern. - -@class function -@name find -@param pat Find packages whose names or descriptions match this pattern, nil results in zero results -@param cb Callback function invoked for each patckage, receives name, version and description as arguments -@return nothing -]] - ----[[ -Determines the overlay root used by opkg. - -@class function -@name overlay_root -@return String containing the directory path of the overlay root. -]] - ----[[ -lua version of opkg compare-versions - -@class function -@name compare_versions -@param ver1 string version 1 -@param ver2 string version 2 -@param comp string compare versions using - "<=" or "<" lower-equal - ">" or ">=" greater-equal - "=" equal - "<<" lower - ">>" greater - "~=" not equal -@return Boolean indicating the status of the compare -]] - diff --git a/modules/luci-mod-freifunk/Makefile b/modules/luci-mod-freifunk/Makefile index 550db1df1..70de10879 100644 --- a/modules/luci-mod-freifunk/Makefile +++ b/modules/luci-mod-freifunk/Makefile @@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=LuCI Freifunk module -LUCI_DEPENDS:=+luci-mod-admin-full +luci-lib-json +freifunk-firewall +freifunk-common +LUCI_DEPENDS:=+luci-mod-admin-full +luci-lib-json +luci-lib-ipkg +freifunk-firewall +freifunk-common include ../../luci.mk