Cleanup and documentation

This commit is contained in:
Steven Barth 2008-08-29 15:47:56 +00:00
parent b6e397e1a4
commit e068351a3f
3 changed files with 180 additions and 93 deletions

View file

@ -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

View file

@ -1,16 +1,8 @@
--[[ --[[
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.
@ -18,58 +10,24 @@ 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 $Id$
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.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
@ -138,3 +86,67 @@ function _parselist(rawdata)
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

View file

@ -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