* Rewrote ffluci.http, ffluci.model.uci

* WARNING: API CHANGES FOR ffluci.http and ffluci.model.uci
This commit is contained in:
Steven Barth 2008-05-05 19:27:30 +00:00
parent 2d95ace789
commit cc729464f9
26 changed files with 512 additions and 292 deletions

View file

@ -3,12 +3,14 @@ LUAC_OPTIONS = -s
FILES = ffluci/debug.lua ffluci/view/*.htm ffluci/view/cbi/*.htm ffluci/i18n/*
CFILES = ffluci/bits.lua ffluci/util.lua ffluci/http.lua ffluci/fs.lua \
ffluci/sys.lua ffluci/model/uci.lua ffluci/model/ipkg.lua \
ffluci/config.lua ffluci/i18n.lua ffluci/template.lua \
CFILES = ffluci/bits.lua ffluci/util.lua \
ffluci/sgi/haserl.lua \
ffluci/http.lua ffluci/fs.lua ffluci/sys.lua \
ffluci/model/uci/wrapper.lua ffluci/model/uci/libuci.lua ffluci/model/uci.lua \
ffluci/model/ipkg.lua ffluci/config.lua ffluci/i18n.lua ffluci/template.lua \
ffluci/cbi.lua ffluci/dispatcher.lua ffluci/menu.lua ffluci/init.lua
DIRECTORIES = ffluci/model/cbi ffluci/model/menu ffluci/controller ffluci/i18n ffluci/view/cbi
DIRECTORIES = ffluci/model/cbi ffluci/model/menu ffluci/controller ffluci/i18n ffluci/view/cbi ffluci/model/uci ffluci/sgi
OUTDIRS = $(DIRECTORIES:%=dist/%)
INFILES = $(CFILES:%=src/%)

View file

@ -0,0 +1,2 @@
package.path = "/usr/lib/lua/?.lua;/usr/lib/lua/?/init.lua;" .. package.path
package.cpath = "/usr/lib/lua/?.so;" .. package.cpath

View file

@ -119,15 +119,10 @@ function Map.__init__(self, config, ...)
self.config = config
self.template = "cbi/map"
self.uci = ffluci.model.uci.Session()
self.ucidata = self.uci:show(self.config)
self.ucidata = self.uci:sections(self.config)
if not self.ucidata then
error("Unable to read UCI data: " .. self.config)
else
if not self.ucidata[self.config] then
self.ucidata[self.config] = {}
end
self.ucidata = self.ucidata[self.config]
end
end
end
-- Creates a child section
@ -249,7 +244,7 @@ function AbstractSection.parse_optionals(self, section)
end
end
if field and field:len() > 0 and self.dynamic then
if field and #field > 0 and self.dynamic then
self:add_dynamic(field)
end
end
@ -267,12 +262,10 @@ function AbstractSection.parse_dynamic(self, section)
end
local arr = ffluci.util.clone(self:cfgvalue(section))
local form = ffluci.http.formvalue("cbid."..self.config.."."..section)
if type(form) == "table" then
for k,v in pairs(form) do
arr[k] = v
end
end
local form = ffluci.http.formvaluetable("cbid."..self.config.."."..section)
for k, v in pairs(form) do
arr[k] = v
end
for key,val in pairs(arr) do
local create = true
@ -440,14 +433,12 @@ function TypedSection.parse(self)
-- Remove
crval = "cbi.rts." .. self.config
name = ffluci.http.formvalue(crval)
if type(name) == "table" then
for k,v in pairs(name) do
if self:cfgvalue(k) and self:checkscope(k) then
self:remove(k)
end
name = ffluci.http.formvaluetable(crval)
for k,v in pairs(name) do
if self:cfgvalue(k) and self:checkscope(k) then
self:remove(k)
end
end
end
end
for i, k in ipairs(self:cfgsections()) do

View file

@ -45,7 +45,7 @@ main.lang = "de"
-- Now overwrite with UCI values
local ucidata = ffluci.model.uci.show("luci")
if ucidata and ucidata.luci then
ffluci.util.update(ffluci.config, ucidata.luci)
local ucidata = ffluci.model.uci.sections("luci")
if ucidata then
ffluci.util.update(ffluci.config, ucidata)
end

View file

@ -87,9 +87,6 @@ require("ffluci.template")
require("ffluci.config")
require("ffluci.sys")
local tree = {}
-- Sets privilege for given category
function assign_privileges(category)
local cp = ffluci.config.category_privileges
@ -100,6 +97,18 @@ function assign_privileges(category)
end
end
-- Builds a URL from a triple of category, module and action
function build_url(category, module, action)
category = category or "public"
module = module or "index"
action = action or "index"
local pattern = ffluci.http.get_script_name() .. "/%s/%s/%s"
return pattern:format(category, module, action)
end
-- Dispatches the "request"
function dispatch(req)
request = req
@ -117,10 +126,11 @@ end
-- Sends a 404 error code and renders the "error404" template if available
function error404(message)
ffluci.http.set_status(404, "Not Found")
message = message or "Not Found"
if not pcall(ffluci.template.render, "error404") then
ffluci.http.textheader()
ffluci.http.set_content_type("text/plain")
print(message)
end
return false
@ -128,10 +138,10 @@ end
-- Sends a 500 error code and renders the "error500" template if available
function error500(message)
ffluci.http.status(500, "Internal Server Error")
ffluci.http.set_status(500, "Internal Server Error")
if not pcall(ffluci.template.render, "error500", {message=message}) then
ffluci.http.textheader()
ffluci.http.set_content_type("text/plain")
print(message)
end
return false
@ -212,7 +222,7 @@ end
-- Internal Dispatcher Functions --
function _action(request)
local action = getfenv()["action_" .. request.action:gsub("-", "_")]
local action = getfenv(2)["action_" .. request.action:gsub("-", "_")]
local i18n = require("ffluci.i18n")
if action then

View file

@ -27,86 +27,8 @@ limitations under the License.
]]--
ENV = ENV or {}
FORM = FORM or {}
module("ffluci.http", package.seeall)
require("ffluci.util")
-- Sets HTTP-Status-Header
function status(code, message)
print("Status: " .. tostring(code) .. " " .. message)
end
-- Asks the browser to redirect to "url"
function redirect(url, qs)
if qs then
url = url .. "?" .. qs
end
status(302, "Found")
print("Location: " .. url .. "\n")
end
-- Same as redirect but accepts category, module and action for internal use
function request_redirect(category, module, action, ...)
category = category or "public"
module = module or "index"
action = action or "index"
local pattern = script_name() .. "/%s/%s/%s"
redirect(pattern:format(category, module, action), ...)
end
-- Returns the User's IP
function remote_addr()
return ENV.REMOTE_ADDR
end
-- Returns the script name
function script_name()
return ENV.SCRIPT_NAME
end
-- Gets form value from key
function formvalue(key, default)
local c = formvalues()
for match in key:gmatch("[%w-_]+") do
c = c[match]
if c == nil then
return default
end
end
return c
end
-- Returns a table of all COOKIE, GET and POST Parameters
function formvalues()
return FORM
end
-- Prints plaintext content-type header
function textheader()
print("Content-Type: text/plain\n")
end
-- Prints html content-type header
function htmlheader()
print("Content-Type: text/html\n")
end
-- Prints xml content-type header
function xmlheader()
print("Content-Type: text/xml\n")
end
if ENV and ENV.HASERLVER then
require("ffluci.sgi.haserl")
end

View file

@ -25,5 +25,5 @@ limitations under the License.
]]--
module("ffluci", package.seeall)
__version__ = "0.3"
__version__ = "0.4"
__appname__ = "FFLuCI"

View file

@ -1,14 +1,8 @@
--[[
FFLuCI - UCI wrapper library
FFLuCI - UCI mpdel
Description:
Wrapper for the /sbin/uci application, syntax of implemented functions
is comparable to the syntax of the uci application
Any return value of false or nil can be interpreted as an error
ToDo: Reimplement in Lua
Generalized UCI model
FileId:
$Id$
@ -30,24 +24,12 @@ limitations under the License.
]]--
module("ffluci.model.uci", package.seeall)
require("ffluci.util")
require("ffluci.fs")
require("ffluci.sys")
-- The OS uci command
ucicmd = "uci"
-- Session class
Session = ffluci.util.class()
-- Session constructor
function Session.__init__(self, path, uci)
uci = uci or ucicmd
if path then
self.ucicmd = uci .. " -P " .. path
else
self.ucicmd = uci
end
-- Test whether to load libuci-Wrapper or /sbin/uci-Wrapper
if pcall(require, "uci") then
Session = require("ffluci.model.uci.libuci").Session
else
Session = require("ffluci.model.uci.wrapper").Session
end
-- The default Session
@ -61,156 +43,48 @@ end
-- Wrapper for "uci add"
function Session.add(self, config, section_type)
return self:_uci("add " .. _path(config) .. " " .. _path(section_type))
end
function add(...)
return default:add(...)
end
-- Wrapper for "uci changes"
function Session.changes(self, config)
return self:_uci("changes " .. _path(config))
end
function changes(...)
return default:changes(...)
end
-- Wrapper for "uci commit"
function Session.commit(self, config)
return self:_uci2("commit " .. _path(config))
end
function commit(...)
return default:commit(...)
end
-- Wrapper for "uci del"
function Session.del(self, config, section, option)
return self:_uci2("del " .. _path(config, section, option))
end
function del(...)
return default:del(...)
end
-- Wrapper for "uci get"
function Session.get(self, config, section, option)
return self:_uci("get " .. _path(config, section, option))
end
function get(...)
return default:get(...)
end
-- Wrapper for "uci revert"
function Session.revert(self, config)
return self:_uci2("revert " .. _path(config))
end
function revert(...)
return default:revert(...)
end
-- Wrapper for "uci show"
function Session.show(self, config, ...)
return self:_uci3("show " .. _path(config), ...)
end
function show(...)
return default:show(...)
function sections(...)
return default:sections(...)
end
-- Wrapper for "uci set"
function Session.set(self, config, section, option, value)
return self:_uci2("set " .. _path(config, section, option, value))
end
function set(...)
return default:set(...)
end
-- Internal functions --
function Session._uci(self, cmd)
local res = ffluci.sys.exec(self.ucicmd .. " 2>/dev/null " .. cmd)
if res:len() == 0 then
return nil
else
return res:sub(1, res:len()-1)
end
end
function Session._uci2(self, cmd)
local res = ffluci.sys.exec(self.ucicmd .. " 2>&1 " .. cmd)
if res:len() > 0 then
return false, res
else
return true
end
end
function Session._uci3(self, cmd, raw)
local res = ffluci.sys.execl(self.ucicmd .. " 2>&1 " .. cmd)
if res[1] and res[1]:sub(1, self.ucicmd:len()+1) == self.ucicmd..":" then
return nil, res[1]
end
if raw then
return table.concat(res, "\n")
end
tbl = {}
for k,line in pairs(res) do
c, s, t = line:match("^([^.]-)%.([^.]-)=(.-)$")
if c then
tbl[c] = tbl[c] or {}
tbl[c][".order"] = tbl[c][".order"] or {}
tbl[c][s] = {}
table.insert(tbl[c][".order"], s)
tbl[c][s][".type"] = t
end
c, s, o, v = line:match("^([^.]-)%.([^.]-)%.([^.]-)=(.-)$")
if c then
tbl[c][s][o] = v
end
end
return tbl
end
-- Build path (config.section.option=value) and prevent command injection
function _path(...)
local result = ""
-- Not using ipairs because it is not reliable in case of nil arguments
arg.n = nil
for k,v in pairs(arg) do
if v then
v = tostring(v)
if k == 1 then
result = "'" .. v:gsub("['.]", "") .. "'"
elseif k < 4 then
result = result .. ".'" .. v:gsub("['.]", "") .. "'"
elseif k == 4 then
result = result .. "='" .. v:gsub("'", "") .. "'"
end
end
end
return result
end

View file

@ -0,0 +1,162 @@
--[[
FFLuCI - UCI libuci wrapper
Description:
Wrapper for the libuci Lua bindings
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("ffluci.model.uci.libuci", package.seeall)
require("ffluci.util")
require("ffluci.fs")
require("ffluci.sys")
-- The OS uci command
ucicmd = "uci"
-- Session class
Session = ffluci.util.class()
-- Session constructor
function Session.__init__(self, path, uci)
uci = uci or ucicmd
if path then
self.ucicmd = uci .. " -P " .. path
else
self.ucicmd = uci
end
end
function Session.add(self, config, section_type)
return self:_uci("add " .. _path(config) .. " " .. _path(section_type))
end
function Session.changes(self, config)
return self:_uci("changes " .. _path(config))
end
function Session.commit(self, config)
return self:_uci2("commit " .. _path(config))
end
function Session.del(self, config, section, option)
return self:_uci2("del " .. _path(config, section, option))
end
function Session.get(self, config, section, option)
return self:_uci("get " .. _path(config, section, option))
end
function Session.revert(self, config)
return self:_uci2("revert " .. _path(config))
end
function Session.sections(self, config)
if not config then
return nil
end
local r1, r2 = self:_uci3("show " .. _path(config))
if type(r1) == "table" then
return r1[config]
else
return nil, r2
end
end
function Session.set(self, config, section, option, value)
return self:_uci2("set " .. _path(config, section, option, value))
end
-- Internal functions --
function Session._uci(self, cmd)
local res = ffluci.sys.exec(self.ucicmd .. " 2>/dev/null " .. cmd)
if res:len() == 0 then
return nil
else
return res:sub(1, res:len()-1)
end
end
function Session._uci2(self, cmd)
local res = ffluci.sys.exec(self.ucicmd .. " 2>&1 " .. cmd)
if res:len() > 0 then
return false, res
else
return true
end
end
function Session._uci3(self, cmd)
local res = ffluci.sys.execl(self.ucicmd .. " 2>&1 " .. cmd)
if res[1] and res[1]:sub(1, self.ucicmd:len()+1) == self.ucicmd..":" then
return nil, res[1]
end
tbl = {}
for k,line in pairs(res) do
c, s, t = line:match("^([^.]-)%.([^.]-)=(.-)$")
if c then
tbl[c] = tbl[c] or {}
tbl[c][".order"] = tbl[c][".order"] or {}
tbl[c][s] = {}
table.insert(tbl[c][".order"], s)
tbl[c][s][".type"] = t
end
c, s, o, v = line:match("^([^.]-)%.([^.]-)%.([^.]-)=(.-)$")
if c then
tbl[c][s][o] = v
end
end
return tbl
end
-- Build path (config.section.option=value) and prevent command injection
function _path(...)
local result = ""
-- Not using ipairs because it is not reliable in case of nil arguments
arg.n = nil
for k,v in pairs(arg) do
if v then
v = tostring(v)
if k == 1 then
result = "'" .. v:gsub("['.]", "") .. "'"
elseif k < 4 then
result = result .. ".'" .. v:gsub("['.]", "") .. "'"
elseif k == 4 then
result = result .. "='" .. v:gsub("'", "") .. "'"
end
end
end
return result
end

View file

@ -0,0 +1,165 @@
--[[
FFLuCI - UCI wrapper library
Description:
Wrapper for the /sbin/uci application, syntax of implemented functions
is comparable to the syntax of the uci application
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("ffluci.model.uci.wrapper", package.seeall)
require("ffluci.util")
require("ffluci.fs")
require("ffluci.sys")
-- The OS uci command
ucicmd = "uci"
-- Session class
Session = ffluci.util.class()
-- Session constructor
function Session.__init__(self, path, uci)
uci = uci or ucicmd
if path then
self.ucicmd = uci .. " -P " .. path
else
self.ucicmd = uci
end
end
function Session.add(self, config, section_type)
return self:_uci("add " .. _path(config) .. " " .. _path(section_type))
end
function Session.changes(self, config)
return self:_uci("changes " .. _path(config))
end
function Session.commit(self, config)
return self:_uci2("commit " .. _path(config))
end
function Session.del(self, config, section, option)
return self:_uci2("del " .. _path(config, section, option))
end
function Session.get(self, config, section, option)
return self:_uci("get " .. _path(config, section, option))
end
function Session.revert(self, config)
return self:_uci2("revert " .. _path(config))
end
function Session.sections(self, config)
if not config then
return nil
end
local r1, r2 = self:_uci3("show " .. _path(config))
if type(r1) == "table" then
return r1[config]
else
return nil, r2
end
end
function Session.set(self, config, section, option, value)
return self:_uci2("set " .. _path(config, section, option, value))
end
-- Internal functions --
function Session._uci(self, cmd)
local res = ffluci.sys.exec(self.ucicmd .. " 2>/dev/null " .. cmd)
if res:len() == 0 then
return nil
else
return res:sub(1, res:len()-1)
end
end
function Session._uci2(self, cmd)
local res = ffluci.sys.exec(self.ucicmd .. " 2>&1 " .. cmd)
if res:len() > 0 then
return false, res
else
return true
end
end
function Session._uci3(self, cmd)
local res = ffluci.sys.execl(self.ucicmd .. " 2>&1 " .. cmd)
if res[1] and res[1]:sub(1, self.ucicmd:len()+1) == self.ucicmd..":" then
return nil, res[1]
end
tbl = {}
for k,line in pairs(res) do
c, s, t = line:match("^([^.]-)%.([^.]-)=(.-)$")
if c then
tbl[c] = tbl[c] or {}
tbl[c][".order"] = tbl[c][".order"] or {}
tbl[c][s] = {}
table.insert(tbl[c][".order"], s)
tbl[c][s][".type"] = t
end
c, s, o, v = line:match("^([^.]-)%.([^.]-)%.([^.]-)=(.-)$")
if c then
tbl[c][s][o] = v
end
end
return tbl
end
-- Build path (config.section.option=value) and prevent command injection
function _path(...)
local result = ""
-- Not using ipairs because it is not reliable in case of nil arguments
arg.n = nil
for k,v in pairs(arg) do
if v then
v = tostring(v)
if k == 1 then
result = "'" .. v:gsub("['.]", "") .. "'"
elseif k < 4 then
result = result .. ".'" .. v:gsub("['.]", "") .. "'"
elseif k == 4 then
result = result .. "='" .. v:gsub("'", "") .. "'"
end
end
end
return result
end

View file

@ -0,0 +1,89 @@
--[[
FFLuCI - SGI-Module for Haserl
Description:
Server Gateway Interface for Haserl
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("ffluci.sgi.haserl", package.seeall)
ENV = ENV or {}
FORM = FORM or {}
require("ffluci.util")
-- HTTP interface
-- Returns a table of all COOKIE, GET and POST Parameters
function ffluci.http.formvalues(prefix)
return FORM
end
-- Gets form value from key
function ffluci.http.formvalue(key, default)
local c = ffluci.http.formvalues()
for match in key:gmatch("[%w-_]+") do
c = c[match]
if c == nil then
return default
end
end
return c
end
-- Gets a table of values with a certain prefix
function ffluci.http.formvaluetable(prefix)
return formvalue(prefix, {})
end
-- Returns the User's IP
function ffluci.http.get_remote_addr()
return ENV.REMOTE_ADDR
end
-- Returns the script name
function ffluci.http.get_script_name()
return ENV.SCRIPT_NAME
end
-- Asks the browser to redirect to "url"
function ffluci.http.redirect(url, qs)
if qs then
url = url .. "?" .. qs
end
set_status(302, "Found")
print("Location: " .. url .. "\n")
end
-- Set Content-Type
function ffluci.http.set_content_type(type)
print("Content-Type: "..type.."\n")
end
-- Sets HTTP-Status-Header
function ffluci.http.set_status(code, message)
print("Status: " .. tostring(code) .. " " .. message)
end

View file

@ -54,7 +54,7 @@ compiler_enable_bytecode = false
viewns = {
translate = ffluci.i18n.translate,
config = function(...) return ffluci.model.uci.get(...) or "" end,
controller = ffluci.http.script_name(),
controller = ffluci.http.get_script_name(),
media = ffluci.config.main.mediaurlbase,
write = io.write,
include = function(name) Template(name):render(getfenv(2)) end,

View file

@ -5,7 +5,7 @@ local req = require("ffluci.dispatcher").request
local menu = require("ffluci.menu").get()[req.category]
menu = menu or {}
require("ffluci.i18n").loadc("default")
require("ffluci.http").htmlheader()
require("ffluci.http").set_content_type("text/html")
%><?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

View file

@ -6,10 +6,10 @@ function action_wizard()
end
local ifaces = {}
local wldevs = ffluci.model.uci.show("wireless")
local wldevs = ffluci.model.uci.sections("wireless")
if wldevs then
for k, v in pairs(wldevs.wireless) do
for k, v in pairs(wldevs) do
if v[".type"] == "wifi-device" then
table.insert(ifaces, k)
end
@ -55,9 +55,9 @@ function configure_freifunk()
uci:set("network", "ffdhcp", "ipaddr", dhcpip)
uci:set("network", "ffdhcp", "netmask", uci:get("freifunk", "community", "dhcpmask"))
local dhcp = uci:show("dhcp")
local dhcp = uci:sections("dhcp")
if dhcp then
for k, v in pairs(dhcp.dhcp) do
for k, v in pairs(dhcp) do
if v[".type"] == "dhcp" and v.interface == "ffdhcp" then
uci:del("dhcp", k)
end
@ -72,9 +72,9 @@ function configure_freifunk()
uci:set("dhcp", sk, "leasetime", "30m")
end
local splash = uci:show("luci_splash")
local splash = uci:sections("luci_splash")
if splash then
for k, v in pairs(splash.luci_splash) do
for k, v in pairs(splash) do
if v[".type"] == "iface" then
uci:del("luci_splash", k)
end
@ -86,8 +86,8 @@ function configure_freifunk()
end
-- Configure OLSR
if ffluci.http.formvalue("olsr") and uci:show("olsr") then
for k, v in pairs(uci:show("olsr").olsr) do
if ffluci.http.formvalue("olsr") and uci:sections("olsr") then
for k, v in pairs(uci:sections("olsr")) do
if v[".type"] == "Interface" or v[".type"] == "LoadPlugin" then
uci:del("olsr", k)
end
@ -122,14 +122,13 @@ function configure_freifunk()
end
-- Configure Wifi
local wifi = ffluci.http.formvalue("wifi")
local wcfg = uci:show("wireless")
if type(wifi) == "table" and wcfg then
for iface, v in pairs(wifi) do
if wcfg.wireless[iface] then
local wcfg = uci:sections("wireless")
if wcfg then
for iface, v in pairs(wcfg) do
if v[".type"] == "wifi-device" and ffluci.http.formvalue("wifi."..iface) then
-- Cleanup
for k, v in pairs(wcfg.wireless) do
if v[".type"] == "wifi-iface" and v.device == iface then
for k, j in pairs(wcfg) do
if j[".type"] == "wifi-iface" and j.device == iface then
uci:del("wireless", k)
end
end
@ -152,5 +151,5 @@ function configure_freifunk()
end
ffluci.http.request_redirect("admin", "uci", "changes")
ffluci.http.redirect(ffluci.dispatcher.build_url("admin", "uci", "changes"))
end

View file

@ -61,8 +61,7 @@ function action_packages()
-- Packets to be installed
local install = ffluci.http.formvalue("install")
install = (type(install) == "table" and submit) and install or nil
local install = submit and ffluci.http.formvaluetable("install")
-- Install from URL
local url = ffluci.http.formvalue("url")
@ -73,7 +72,7 @@ function action_packages()
install[url] = 1
end
-- Do install
-- Do install
if install then
for k, v in pairs(install) do
void, install[k] = ipkg.install(k)
@ -82,8 +81,7 @@ function action_packages()
-- Remove packets
local remove = ffluci.http.formvalue("remove")
remove = (type(remove) == "table" and submit) and remove or nil
local remove = submit and ffluci.http.formvaluetable("remove")
if remove then
for k, v in pairs(remove) do
void, remove[k] = ipkg.remove(k)
@ -187,7 +185,7 @@ function action_upgrade()
if plat and imgname then
local kpattern = nil
if keepcfg then
local files = ffluci.model.uci.show("luci", "flash_keep")
local files = ffluci.model.uci.sections("luci").flash_keep
if files.luci and files.luci.flash_keep then
kpattern = ""
for k,v in pairs(files.luci.flash_keep) do

View file

@ -6,14 +6,14 @@ function action_activate()
os.execute("luci-splash add "..mac.." >/dev/null 2>&1")
ffluci.http.redirect(ffluci.model.uci.get("freifunk", "community", "homepage"))
else
ffluci.http.request_redirect()
ffluci.http.redirect(ffluci.dispatcher.build_url())
end
end
function action_accepted()
ffluci.http.request_redirect()
ffluci.http.redirect(ffluci.dispatcher.build_url())
end
function action_unknown()
ffluci.http.request_redirect()
ffluci.http.redirect(ffluci.dispatcher.build_url())
end

View file

@ -10,7 +10,7 @@ s.addremove = true
s.anonymous = true
iface = s:option(ListValue, "interface", "Schnittstelle")
for k, v in pairs(ffluci.model.uci.show("network").network) do
for k, v in pairs(ffluci.model.uci.sections("network")) do
if v[".type"] == "interface" and k ~= "loopback" then
iface:value(k)
s:depends("interface", k) -- Only change sections with existing interfaces

View file

@ -8,7 +8,7 @@ s.addremove = true
s.anonymous = true
iface = s:option(ListValue, "interface", "Schnittstelle")
for k, v in pairs(ffluci.model.uci.show("network").network) do
for k, v in pairs(ffluci.model.uci.sections("network")) do
if v[".type"] == "interface" and k ~= "loopback" then
iface:value(k)
end

View file

@ -51,7 +51,7 @@ i.dynamic = true
network = i:option(ListValue, "Interface", "Netzwerkschnittstellen")
network:value("")
for k, v in pairs(ffluci.model.uci.show("network").network) do
for k, v in pairs(ffluci.model.uci.sections("network")) do
if v[".type"] == "interface" and k ~= "loopback" then
network:value(k)
end

View file

@ -11,7 +11,7 @@ s.addremove = true
s.anonymous = true
iface = s:option(ListValue, "network", "Schnittstelle")
for k, v in pairs(ffluci.model.uci.show("network").network) do
for k, v in pairs(ffluci.model.uci.sections("network")) do
if v[".type"] == "interface" and k ~= "loopback" then
iface:value(k)
end

View file

@ -11,7 +11,7 @@ s.anonymous = true
s:option(Value, "ssid", "Netzkennung (ESSID)").maxlength = 32
device = s:option(ListValue, "device", "Gerät")
local d = ffluci.model.uci.show("wireless").wireless
local d = ffluci.model.uci.sections("wireless")
if d then
for k, v in pairs(d) do
if v[".type"] == "wifi-device" then
@ -22,7 +22,7 @@ end
network = s:option(ListValue, "network", "Netzwerk", "WLAN-Netz zu Netzwerk hinzufügen")
network:value("")
for k, v in pairs(ffluci.model.uci.show("network").network) do
for k, v in pairs(ffluci.model.uci.sections("network")) do
if v[".type"] == "interface" and k ~= "loopback" then
network:value(k)
end

View file

@ -1,5 +1,5 @@
<%+header%>
<% local contact = ffluci.model.uci.show("freifunk").freifunk.contact %>
<% local contact = ffluci.model.uci.sections("freifunk").contact %>
<h1><%:contact Kontakt%></h1>
<table cellspacing="0" cellpadding="6">
<tr><th><%:nickname Pseudonym%>:</th><td><%=contact.nickname%></td></tr>

View file

@ -1,5 +1,5 @@
<%+header%>
<% local ff = ffluci.model.uci.show("freifunk").freifunk %>
<% local ff = ffluci.model.uci.sections("freifunk") %>
<h1><%:hellonet Hallo und willkommen im Netz von%> <%=ff.community.name%>!</h1>
<p><%:public1 Wir sind eine Initiative zur Schaffung eines freien, offenen und unabhängigen Funknetzwerks auf WLAN-Basis.%><br />
<%:public2 Dies ist der Zugangspunkt %><%=ffluci.sys.hostname()%>. <%:public3 Er wird betrieben von %>

View file

@ -1,5 +1,5 @@
<%
ffluci.http.textheader()
ffluci.http.set_content_type("text/plain")
for k, v in pairs(ffluci.sys.wifi.getiwconfig()) do
%>
<tr>

View file

@ -1,5 +1,5 @@
<%
ffluci.http.textheader()
ffluci.http.set_content_type("text/plain")
for iface, cells in pairs(ffluci.sys.wifi.iwscan()) do
for i, cell in ipairs(cells) do
%>

View file

@ -3,7 +3,7 @@ module("ffluci.controller.rpc.luciinfo", package.seeall)
function action_index()
local uci = ffluci.model.uci.StateSession()
ffluci.http.textheader()
ffluci.http.set_content_type("text/plain")
-- General
print("luciinfo.api=1")
@ -26,8 +26,14 @@ function action_index()
-- Freifunk
local ff = uci:show("freifunk", true) or ""
print(ff)
local ff = uci:sections("freifunk") or {}
for k, v in pairs(ff) do
if k:sub(1, 1) ~= "." then
for i, j in pairs(v) do
print("freifunk." .. k .. "." .. i .. "=" .. j)
end
end
end
end
function sanitize(val)