Cleanup and documentation
This commit is contained in:
parent
b6e397e1a4
commit
e068351a3f
3 changed files with 180 additions and 93 deletions
|
@ -20,6 +20,11 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
DEALINGS IN THE SOFTWARE.
|
DEALINGS IN THE SOFTWARE.
|
||||||
]]--
|
]]--
|
||||||
|
--[[
|
||||||
|
Changes made by LuCI project:
|
||||||
|
* Renamed to luci.ltn12 to avoid collisions with luasocket
|
||||||
|
* Added inline documentation
|
||||||
|
]]--
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
-- LTN12 - Filters, sources, sinks and pumps.
|
-- LTN12 - Filters, sources, sinks and pumps.
|
||||||
-- LuaSocket toolkit.
|
-- LuaSocket toolkit.
|
||||||
|
@ -33,6 +38,9 @@ DEALINGS IN THE SOFTWARE.
|
||||||
local string = require("string")
|
local string = require("string")
|
||||||
local table = require("table")
|
local table = require("table")
|
||||||
local base = _G
|
local base = _G
|
||||||
|
|
||||||
|
--- Diego Nehab's LTN12 - Filters, sources, sinks and pumps.
|
||||||
|
-- See http://lua-users.org/wiki/FiltersSourcesAndSinks for design concepts
|
||||||
module("luci.ltn12")
|
module("luci.ltn12")
|
||||||
|
|
||||||
filter = {}
|
filter = {}
|
||||||
|
@ -47,7 +55,17 @@ _VERSION = "LTN12 1.0.1"
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
-- Filter stuff
|
-- Filter stuff
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
-- returns a high level filter that cycles a low-level filter
|
|
||||||
|
--- LTN12 Filter constructors
|
||||||
|
-- @class module
|
||||||
|
-- @name luci.ltn12.filter
|
||||||
|
|
||||||
|
--- Return a high level filter that cycles a low-level filter
|
||||||
|
-- by passing it each chunk and updating a context between calls.
|
||||||
|
-- @param low Low-level filter
|
||||||
|
-- @param ctx Context
|
||||||
|
-- @param extra Extra argument passed to the low-level filter
|
||||||
|
-- @return LTN12 filter
|
||||||
function filter.cycle(low, ctx, extra)
|
function filter.cycle(low, ctx, extra)
|
||||||
base.assert(low)
|
base.assert(low)
|
||||||
return function(chunk)
|
return function(chunk)
|
||||||
|
@ -57,8 +75,10 @@ function filter.cycle(low, ctx, extra)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- chains a bunch of filters together
|
--- Chain a bunch of filters together.
|
||||||
-- (thanks to Wim Couwenberg)
|
-- (thanks to Wim Couwenberg)
|
||||||
|
-- @param ... filters to be chained
|
||||||
|
-- @return LTN12 filter
|
||||||
function filter.chain(...)
|
function filter.chain(...)
|
||||||
local n = table.getn(arg)
|
local n = table.getn(arg)
|
||||||
local top, index = 1, 1
|
local top, index = 1, 1
|
||||||
|
@ -91,23 +111,35 @@ end
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
-- Source stuff
|
-- Source stuff
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
--- LTN12 Source constructors
|
||||||
|
-- @class module
|
||||||
|
-- @name luci.ltn12.source
|
||||||
|
|
||||||
-- create an empty source
|
-- create an empty source
|
||||||
local function empty()
|
local function empty()
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Create an empty source.
|
||||||
|
-- @return LTN12 source
|
||||||
function source.empty()
|
function source.empty()
|
||||||
return empty
|
return empty
|
||||||
end
|
end
|
||||||
|
|
||||||
-- returns a source that just outputs an error
|
--- Return a source that just outputs an error.
|
||||||
|
-- @param err Error object
|
||||||
|
-- @return LTN12 source
|
||||||
function source.error(err)
|
function source.error(err)
|
||||||
return function()
|
return function()
|
||||||
return nil, err
|
return nil, err
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- creates a file source
|
--- Create a file source.
|
||||||
|
-- @param handle File handle ready for reading
|
||||||
|
-- @param io_err IO error object
|
||||||
|
-- @return LTN12 source
|
||||||
function source.file(handle, io_err)
|
function source.file(handle, io_err)
|
||||||
if handle then
|
if handle then
|
||||||
return function()
|
return function()
|
||||||
|
@ -118,7 +150,9 @@ function source.file(handle, io_err)
|
||||||
else return source.error(io_err or "unable to open file") end
|
else return source.error(io_err or "unable to open file") end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- turns a fancy source into a simple source
|
--- Turn a fancy source into a simple source.
|
||||||
|
-- @param src fancy source
|
||||||
|
-- @return LTN12 source
|
||||||
function source.simplify(src)
|
function source.simplify(src)
|
||||||
base.assert(src)
|
base.assert(src)
|
||||||
return function()
|
return function()
|
||||||
|
@ -129,7 +163,9 @@ function source.simplify(src)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- creates string source
|
--- Create a string source.
|
||||||
|
-- @param s Data
|
||||||
|
-- @return LTN12 source
|
||||||
function source.string(s)
|
function source.string(s)
|
||||||
if s then
|
if s then
|
||||||
local i = 1
|
local i = 1
|
||||||
|
@ -142,7 +178,9 @@ function source.string(s)
|
||||||
else return source.empty() end
|
else return source.empty() end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- creates rewindable source
|
--- Creates rewindable source.
|
||||||
|
-- @param src LTN12 source to be made rewindable
|
||||||
|
-- @return LTN12 source
|
||||||
function source.rewind(src)
|
function source.rewind(src)
|
||||||
base.assert(src)
|
base.assert(src)
|
||||||
local t = {}
|
local t = {}
|
||||||
|
@ -157,6 +195,10 @@ function source.rewind(src)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Chain a source and a filter together.
|
||||||
|
-- @param src LTN12 source
|
||||||
|
-- @param f LTN12 filter
|
||||||
|
-- @return LTN12 source
|
||||||
function source.chain(src, f)
|
function source.chain(src, f)
|
||||||
base.assert(src and f)
|
base.assert(src and f)
|
||||||
local last_in, last_out = "", ""
|
local last_in, last_out = "", ""
|
||||||
|
@ -204,9 +246,11 @@ function source.chain(src, f)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- creates a source that produces contents of several sources, one after the
|
--- Create a source that produces contents of several sources.
|
||||||
-- other, as if they were concatenated
|
-- Sources will be used one after the other, as if they were concatenated
|
||||||
-- (thanks to Wim Couwenberg)
|
-- (thanks to Wim Couwenberg)
|
||||||
|
-- @param ... LTN12 sources
|
||||||
|
-- @return LTN12 source
|
||||||
function source.cat(...)
|
function source.cat(...)
|
||||||
local src = table.remove(arg, 1)
|
local src = table.remove(arg, 1)
|
||||||
return function()
|
return function()
|
||||||
|
@ -222,7 +266,14 @@ end
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
-- Sink stuff
|
-- Sink stuff
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
-- creates a sink that stores into a table
|
|
||||||
|
--- LTN12 sink constructors
|
||||||
|
-- @class module
|
||||||
|
-- @name luci.ltn12.sink
|
||||||
|
|
||||||
|
--- Create a sink that stores into a table.
|
||||||
|
-- @param t output table to store into
|
||||||
|
-- @return LTN12 sink
|
||||||
function sink.table(t)
|
function sink.table(t)
|
||||||
t = t or {}
|
t = t or {}
|
||||||
local f = function(chunk, err)
|
local f = function(chunk, err)
|
||||||
|
@ -232,7 +283,9 @@ function sink.table(t)
|
||||||
return f, t
|
return f, t
|
||||||
end
|
end
|
||||||
|
|
||||||
-- turns a fancy sink into a simple sink
|
--- Turn a fancy sink into a simple sink.
|
||||||
|
-- @param snk fancy sink
|
||||||
|
-- @return LTN12 sink
|
||||||
function sink.simplify(snk)
|
function sink.simplify(snk)
|
||||||
base.assert(snk)
|
base.assert(snk)
|
||||||
return function(chunk, err)
|
return function(chunk, err)
|
||||||
|
@ -243,7 +296,10 @@ function sink.simplify(snk)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- creates a file sink
|
--- Create a file sink.
|
||||||
|
-- @param handle file handle to write to
|
||||||
|
-- @param io_err IO error
|
||||||
|
-- @return LTN12 sink
|
||||||
function sink.file(handle, io_err)
|
function sink.file(handle, io_err)
|
||||||
if handle then
|
if handle then
|
||||||
return function(chunk, err)
|
return function(chunk, err)
|
||||||
|
@ -260,18 +316,25 @@ local function null()
|
||||||
return 1
|
return 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Create a sink that discards data.
|
||||||
|
-- @return LTN12 sink
|
||||||
function sink.null()
|
function sink.null()
|
||||||
return null
|
return null
|
||||||
end
|
end
|
||||||
|
|
||||||
-- creates a sink that just returns an error
|
--- Create a sink that just returns an error.
|
||||||
|
-- @param err Error object
|
||||||
|
-- @return LTN12 sink
|
||||||
function sink.error(err)
|
function sink.error(err)
|
||||||
return function()
|
return function()
|
||||||
return nil, err
|
return nil, err
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- chains a sink with a filter
|
--- Chain a sink with a filter.
|
||||||
|
-- @param f LTN12 filter
|
||||||
|
-- @param snk LTN12 sink
|
||||||
|
-- @return LTN12 sink
|
||||||
function sink.chain(f, snk)
|
function sink.chain(f, snk)
|
||||||
base.assert(f and snk)
|
base.assert(f and snk)
|
||||||
return function(chunk, err)
|
return function(chunk, err)
|
||||||
|
@ -291,7 +354,16 @@ end
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
-- Pump stuff
|
-- Pump stuff
|
||||||
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
||||||
-- pumps one chunk from the source to the sink
|
|
||||||
|
--- LTN12 pump functions
|
||||||
|
-- @class module
|
||||||
|
-- @name luci.ltn12.pump
|
||||||
|
|
||||||
|
--- Pump one chunk from the source to the sink.
|
||||||
|
-- @param src LTN12 source
|
||||||
|
-- @param snk LTN12 sink
|
||||||
|
-- @return Chunk of data or nil if an error occured
|
||||||
|
-- @return Error object
|
||||||
function pump.step(src, snk)
|
function pump.step(src, snk)
|
||||||
local chunk, src_err = src()
|
local chunk, src_err = src()
|
||||||
local ret, snk_err = snk(chunk, src_err)
|
local ret, snk_err = snk(chunk, src_err)
|
||||||
|
@ -299,7 +371,12 @@ function pump.step(src, snk)
|
||||||
else return nil, src_err or snk_err end
|
else return nil, src_err or snk_err end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- pumps all data from a source to a sink, using a step function
|
--- Pump all data from a source to a sink, using a step function.
|
||||||
|
-- @param src LTN12 source
|
||||||
|
-- @param snk LTN12 sink
|
||||||
|
-- @param step step function (optional)
|
||||||
|
-- @return 1 if the operation succeeded otherwise nil
|
||||||
|
-- @return Error object
|
||||||
function pump.all(src, snk, step)
|
function pump.all(src, snk, step)
|
||||||
base.assert(src and snk)
|
base.assert(src and snk)
|
||||||
step = step or pump.step
|
step = step or pump.step
|
||||||
|
|
|
@ -1,75 +1,33 @@
|
||||||
--[[
|
--[[
|
||||||
LuCI - IPKG wrapper library
|
LuCI - Lua Configuration Interface
|
||||||
|
|
||||||
Description:
|
(c) 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
|
||||||
Wrapper for the ipkg Package manager
|
(c) 2008 Steven Barth <steven@midlink.org>
|
||||||
|
|
||||||
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");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
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.
|
|
||||||
|
|
||||||
|
$Id$
|
||||||
]]--
|
]]--
|
||||||
module("luci.model.ipkg", package.seeall)
|
|
||||||
require("luci.util")
|
|
||||||
require("luci.fs")
|
|
||||||
|
|
||||||
ipkg = luci.fs.access("/bin/opkg") and "opkg" or "ipkg"
|
local os = require "os"
|
||||||
|
local util = require "luci.util"
|
||||||
|
|
||||||
-- Returns repository information
|
local type = type
|
||||||
function info(pkg)
|
local pairs = pairs
|
||||||
return _lookup("info", pkg)
|
local error = error
|
||||||
end
|
|
||||||
|
|
||||||
-- Returns a table with status information
|
local ipkg = "opkg"
|
||||||
function status(pkg)
|
|
||||||
return _lookup("status", pkg)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Installs packages
|
--- LuCI IPKG/OPKG call abstraction library
|
||||||
function install(...)
|
module "luci.model.ipkg"
|
||||||
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
|
-- Internal action function
|
||||||
function _action(cmd, ...)
|
local function _action(cmd, ...)
|
||||||
local pkg = ""
|
local pkg = ""
|
||||||
arg.n = nil
|
arg.n = nil
|
||||||
for k, v in pairs(arg) do
|
for k, v in pairs(arg) do
|
||||||
|
@ -81,39 +39,29 @@ function _action(cmd, ...)
|
||||||
return (r == 0), r
|
return (r == 0), r
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Internal lookup function
|
|
||||||
function _lookup(act, pkg)
|
|
||||||
local cmd = ipkg .. " " .. act
|
|
||||||
if pkg then
|
|
||||||
cmd = cmd .. " '" .. pkg:gsub("'", "") .. "'"
|
|
||||||
end
|
|
||||||
|
|
||||||
return _parselist(luci.util.exec(cmd .. " 2>/dev/null"))
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Internal parser function
|
-- Internal parser function
|
||||||
function _parselist(rawdata)
|
local function _parselist(rawdata)
|
||||||
if type(rawdata) ~= "string" then
|
if type(rawdata) ~= "string" then
|
||||||
error("IPKG: Invalid rawdata given")
|
error("IPKG: Invalid rawdata given")
|
||||||
end
|
end
|
||||||
|
|
||||||
rawdata = luci.util.split(rawdata)
|
rawdata = util.split(rawdata)
|
||||||
local data = {}
|
local data = {}
|
||||||
local c = {}
|
local c = {}
|
||||||
local l = nil
|
local l = nil
|
||||||
|
|
||||||
for k, line in pairs(rawdata) do
|
for k, line in pairs(rawdata) do
|
||||||
if line:sub(1, 1) ~= " " then
|
if line:sub(1, 1) ~= " " then
|
||||||
local split = luci.util.split(line, ":", 1)
|
local split = util.split(line, ":", 1)
|
||||||
local key = nil
|
local key = nil
|
||||||
local val = nil
|
local val = nil
|
||||||
|
|
||||||
if split[1] then
|
if split[1] then
|
||||||
key = luci.util.trim(split[1])
|
key = util.trim(split[1])
|
||||||
end
|
end
|
||||||
|
|
||||||
if split[2] then
|
if split[2] then
|
||||||
val = luci.util.trim(split[2])
|
val = util.trim(split[2])
|
||||||
end
|
end
|
||||||
|
|
||||||
if key and val then
|
if key and val then
|
||||||
|
@ -137,4 +85,68 @@ function _parselist(rawdata)
|
||||||
end
|
end
|
||||||
|
|
||||||
return data
|
return data
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Internal lookup function
|
||||||
|
local function _lookup(act, pkg)
|
||||||
|
local cmd = ipkg .. " " .. act
|
||||||
|
if pkg then
|
||||||
|
cmd = cmd .. " '" .. pkg:gsub("'", "") .. "'"
|
||||||
|
end
|
||||||
|
|
||||||
|
return _parselist(util.exec(cmd .. " 2>/dev/null"))
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--- Return information about installed and available packages.
|
||||||
|
-- @param pkg Limit output to a (set of) packages
|
||||||
|
-- @return Table containing package information
|
||||||
|
function info(pkg)
|
||||||
|
return _lookup("info", pkg)
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Return the package status of one or more packages.
|
||||||
|
-- @param pkg Limit output to a (set of) packages
|
||||||
|
-- @return Table containing package status information
|
||||||
|
function status(pkg)
|
||||||
|
return _lookup("status", pkg)
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Install one or more packages.
|
||||||
|
-- @param ... List of packages to install
|
||||||
|
-- @return Boolean indicating the status of the action
|
||||||
|
-- @return IPKG return code
|
||||||
|
function install(...)
|
||||||
|
return _action("install", ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Determine whether a given package is installed.
|
||||||
|
-- @param pkg Package
|
||||||
|
-- @return Boolean
|
||||||
|
function installed(pkg)
|
||||||
|
local p = status(pkg)[pkg]
|
||||||
|
return (p and p.Status and p.Status.installed)
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Remove one or more packages.
|
||||||
|
-- @param ... List of packages to install
|
||||||
|
-- @return Boolean indicating the status of the action
|
||||||
|
-- @return IPKG return code
|
||||||
|
function remove(...)
|
||||||
|
return _action("remove", ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Update package lists.
|
||||||
|
-- @return Boolean indicating the status of the action
|
||||||
|
-- @return IPKG return code
|
||||||
|
function update()
|
||||||
|
return _action("update")
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Upgrades all installed packages.
|
||||||
|
-- @return Boolean indicating the status of the action
|
||||||
|
-- @return IPKG return code
|
||||||
|
function upgrade()
|
||||||
|
return _action("upgrade")
|
||||||
|
end
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,7 @@ local error, pairs, ipairs, tostring = error, pairs, ipairs, tostring
|
||||||
local require, getmetatable = require, getmetatable
|
local require, getmetatable = require, getmetatable
|
||||||
|
|
||||||
--- LuCI UCI model library.
|
--- LuCI UCI model library.
|
||||||
|
-- @cstyle instance
|
||||||
module("luci.model.uci")
|
module("luci.model.uci")
|
||||||
|
|
||||||
--- Create a new UCI-Cursor.
|
--- Create a new UCI-Cursor.
|
||||||
|
@ -50,10 +51,7 @@ function cursor_state()
|
||||||
return cursor(nil, "/var/state")
|
return cursor(nil, "/var/state")
|
||||||
end
|
end
|
||||||
|
|
||||||
--- UCI-Cursor
|
|
||||||
-- @class module
|
|
||||||
-- @cstyle instance
|
|
||||||
-- @name luci.model.uci.Cursor
|
|
||||||
local Cursor = getmetatable(cursor())
|
local Cursor = getmetatable(cursor())
|
||||||
|
|
||||||
--- Applies the new config
|
--- Applies the new config
|
||||||
|
|
Loading…
Reference in a new issue