summaryrefslogtreecommitdiffhomepage
path: root/libs/ipkg
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ipkg')
-rw-r--r--libs/ipkg/luasrc/model/ipkg.lua141
1 files changed, 141 insertions, 0 deletions
diff --git a/libs/ipkg/luasrc/model/ipkg.lua b/libs/ipkg/luasrc/model/ipkg.lua
new file mode 100644
index 0000000000..075acc4c3a
--- /dev/null
+++ b/libs/ipkg/luasrc/model/ipkg.lua
@@ -0,0 +1,141 @@
+--[[
+LuCI - IPKG wrapper library
+
+Description:
+Wrapper for the ipkg Package manager
+
+Any return value of false or nil can be interpreted as an error
+
+FileId:
+$Id$
+
+License:
+Copyright 2008 Steven Barth <steven@midlink.org>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+]]--
+module("luci.model.ipkg", package.seeall)
+require("luci.sys")
+require("luci.util")
+require("luci.fs")
+
+ipkg = luci.fs.access("/bin/opkg") and "opkg" or "ipkg"
+
+-- Returns repository information
+function info(pkg)
+ return _lookup("info", pkg)
+end
+
+-- Returns a table with status information
+function status(pkg)
+ return _lookup("status", pkg)
+end
+
+-- Installs packages
+function install(...)
+ return _action("install", ...)
+end
+
+-- Returns whether a package is installed
+function installed(pkg, ...)
+ local p = status(...)[pkg]
+ return (p and p.Status and p.Status.installed)
+end
+
+-- Removes packages
+function remove(...)
+ return _action("remove", ...)
+end
+
+-- Updates package lists
+function update()
+ return _action("update")
+end
+
+-- Upgrades installed packages
+function upgrade()
+ return _action("upgrade")
+end
+
+
+-- Internal action function
+function _action(cmd, ...)
+ local pkg = ""
+ arg.n = nil
+ for k, v in pairs(arg) do
+ pkg = pkg .. " '" .. v:gsub("'", "") .. "'"
+ end
+
+ local c = ipkg.." "..cmd.." "..pkg.." >/dev/null 2>&1"
+ local r = os.execute(c)
+ return (r == 0), r
+end
+
+-- Internal lookup function
+function _lookup(act, pkg)
+ local cmd = ipkg .. " " .. act
+ if pkg then
+ cmd = cmd .. " '" .. pkg:gsub("'", "") .. "'"
+ end
+
+ return _parselist(luci.sys.exec(cmd .. " 2>/dev/null"))
+end
+
+-- Internal parser function
+function _parselist(rawdata)
+ if type(rawdata) ~= "string" then
+ error("IPKG: Invalid rawdata given")
+ end
+
+ rawdata = luci.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 = luci.util.split(line, ":", 1)
+ local key = nil
+ local val = nil
+
+ if split[1] then
+ key = luci.util.trim(split[1])
+ end
+
+ if split[2] then
+ val = luci.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(luci.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