From: Steven Barth Date: Wed, 2 Apr 2008 10:10:32 +0000 (+0000) Subject: * Updated INSTALL file X-Git-Tag: 0.8.0~1167 X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=commitdiff_plain;h=f2fc9438a21005e7da824f091f8213d46e426cf2 * Updated INSTALL file --- diff --git a/INSTALL b/INSTALL index 20e9a49da..a9196f081 100644 --- a/INSTALL +++ b/INSTALL @@ -35,8 +35,8 @@ TOC: Prerequisites: CGI enabled webserver Lua 5.1.x or later - LuaFileSystem Lua extension - Haserl 0.9x or later with Lua support builtin + Luaposix Lua extension + Haserl 0.9.23 or later with Lua support builtin Installation: Use make to build a distribution of FFLuCI diff --git a/src/ffluci/model/ipkg.lua b/src/ffluci/model/ipkg.lua index a0ca8a827..477985403 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 54ee071ef..a33d141e6 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)