summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ffluci/model/ipkg.lua81
-rw-r--r--src/ffluci/util.lua13
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)