diff options
Diffstat (limited to 'src/ffluci/model/ipkg.lua')
-rw-r--r-- | src/ffluci/model/ipkg.lua | 81 |
1 files changed, 81 insertions, 0 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 |