diff options
Diffstat (limited to 'src/ffluci')
-rw-r--r-- | src/ffluci/model/ipkg.lua | 81 | ||||
-rw-r--r-- | src/ffluci/util.lua | 13 |
2 files changed, 92 insertions, 2 deletions
diff --git a/src/ffluci/model/ipkg.lua b/src/ffluci/model/ipkg.lua index a0ca8a8273..4779854037 100644 --- a/src/ffluci/model/ipkg.lua +++ b/src/ffluci/model/ipkg.lua @@ -27,3 +27,84 @@ limitations under the License. ]]-- module("ffluci.model.ipkg", package.seeall) require("ffluci.sys") +require("ffluci.util") + +ipkg = "ipkg" +local statuslist = nil + +-- Returns repository information +function info(pkg) + -- To be implemented +end + +-- Returns a table with status information +function status(refresh) + if not statuslist or refresh then + statuslist = _parselist(ffluci.sys.exec(ipkg .. " status")) + end + + return statuslist +end + +-- Installs a package +function install(pkg) + if not pkg then + return nil + end + + local c = ipkg .. " install '" .. pkg:gsub("'", "") .. "' >/dev/null 2>&1" + local r = os.execute(c) + return (r == 0), r +end + +function installed(pkg, ...) + local p = status(...)[pkg] + return (p and p.Status and p.Status.installed) +end + +function _parselist(rawdata) + if type(rawdata) ~= "string" then + error("IPKG: Invalid rawdata given") + end + + rawdata = ffluci.util.split(rawdata) + local data = {} + local c = {} + local l = nil + + for k, line in pairs(rawdata) do + if line:sub(1, 1) ~= " " then + local split = ffluci.util.split(line, ":", 1) + local key = nil + local val = nil + + if split[1] then + key = ffluci.util.trim(split[1]) + end + + if split[2] then + val = ffluci.util.trim(split[2]) + end + + if key and val then + if key == "Package" then + c = {Package = val} + data[val] = c + elseif key == "Status" then + c.Status = {} + for i, j in pairs(ffluci.util.split(val, " ")) do + c.Status[j] = true + end + else + c[key] = val + end + l = key + end + else + -- Multi-line field + c[l] = c[l] .. "\n" .. line:sub(2) + end + end + + return data +end
\ No newline at end of file diff --git a/src/ffluci/util.lua b/src/ffluci/util.lua index 54ee071ef7..a33d141e60 100644 --- a/src/ffluci/util.lua +++ b/src/ffluci/util.lua @@ -145,9 +145,10 @@ function sessionid() end --- Splits a string into an array (Taken from lua-users.org) -function split(str, pat) +-- Splits a string into an array (Adapted from lua-users.org) +function split(str, pat, max) pat = pat or "\n" + max = max or -1 local t = {} local fpat = "(.-)" .. pat @@ -155,10 +156,14 @@ function split(str, pat) local s, e, cap = str:find(fpat, 1) while s do + max = max - 1 if s ~= 1 or cap ~= "" then table.insert(t,cap) end last_end = e+1 + if max == 0 then + break + end s, e, cap = str:find(fpat, last_end) end @@ -170,6 +175,10 @@ function split(str, pat) return t end +-- Removes whitespace from beginning and end of a string +function trim (string) + return string:gsub("^%s*(.-)%s*$", "%1") +end -- Updates given table with new values function update(t, updates) |