local init = require "luci.init"
local util = require "luci.util"
local http = require "luci.http"
+local nixio = require "nixio", require "nixio.util"
module("luci.dispatcher", package.seeall)
context = util.threadlocal()
if (c and c.index) or not track.notemplate then
local tpl = require("luci.template")
local media = track.mediaurlbase or luci.config.main.mediaurlbase
- if not pcall(tpl.Template, "themes/%s/header" % fs.basename(media)) then
+ if not tpl.Template("themes/%s/header" % fs.basename(media)) then
+ --if not pcall(tpl.Template, "themes/%s/header" % fs.basename(media)) then
media = nil
for name, theme in pairs(luci.config.themes) do
if name:sub(1,1) ~= "." and pcall(tpl.Template,
local user
if sdat then
- sdat = loadstring(sdat)()
+ sdat = loadstring(sdat)
+ setfenv(sdat, {})
+ sdat = sdat()
if not verifytoken or ctx.urltoken.stok == sdat.token then
user = sdat.user
end
--- Generate the dispatching index using the best possible strategy.
function createindex()
local path = luci.util.libpath() .. "/controller/"
- local suff = ".lua"
+ local suff = { ".lua", ".lua.gz" }
if luci.util.copcall(require, "luci.fastindex") then
createindex_fastindex(path, suff)
--- Generate the dispatching index using the fastindex C-indexer.
-- @param path Controller base directory
--- @param suffix Controller file suffix
-function createindex_fastindex(path, suffix)
+-- @param suffixes Controller file suffixes
+function createindex_fastindex(path, suffixes)
index = {}
if not fi then
fi = luci.fastindex.new("index")
- fi.add(path .. "*" .. suffix)
- fi.add(path .. "*/*" .. suffix)
+ for _, suffix in ipairs(suffixes) do
+ fi.add(path .. "*" .. suffix)
+ fi.add(path .. "*/*" .. suffix)
+ end
end
fi.scan()
--- Generate the dispatching index using the native file-cache based strategy.
-- @param path Controller base directory
--- @param suffix Controller file suffix
-function createindex_plain(path, suffix)
- local controllers = util.combine(
- luci.fs.glob(path .. "*" .. suffix) or {},
- luci.fs.glob(path .. "*/*" .. suffix) or {}
- )
+-- @param suffixes Controller file suffixes
+function createindex_plain(path, suffixes)
+ local controllers = { }
+ for _, suffix in ipairs(suffixes) do
+ controllers = util.combine(
+ controllers,
+ luci.fs.glob(path .. "*" .. suffix) or {},
+ luci.fs.glob(path .. "*/*" .. suffix) or {}
+ )
+ end
if indexcache then
local cachedate = fs.mtime(indexcache)
if cachedate > realdate then
assert(
sys.process.info("uid") == fs.stat(indexcache, "uid")
- and fs.stat(indexcache, "mode") == "rw-------",
+ and fs.stat(indexcache, "modestr") == "rw-------",
"Fatal: Indexcache is not sane!"
)
index = {}
for i,c in ipairs(controllers) do
- local module = "luci.controller." .. c:sub(#path+1, #c-#suffix):gsub("/", ".")
+ local module = "luci.controller." .. c:sub(#path+1, #c):gsub("/", ".")
+ for _, suffix in ipairs(suffixes) do
+ module = module:gsub(suffix.."$", "")
+ end
+
local mod = require(module)
local idx = mod.index
end
if indexcache then
- fs.writefile(indexcache, util.get_bytecode(index))
- fs.chmod(indexcache, "a-rwx,u+rw")
+ local f = nixio.open(indexcache, "w", 600)
+ f:writeall(util.get_bytecode(index))
+ f:close()
end
end
local state = nil
for i, res in ipairs(maps) do
- if config.autoapply then
- res.autoapply = config.autoapply
- end
+ res.flow = config
local cstate = res:parse()
if cstate and (not state or cstate < state) then
state = cstate
end
end
+ local function _resolve_path(path)
+ return type(path) == "table" and build_url(unpack(path)) or path
+ end
+
if config.on_valid_to and state and state > 0 and state < 2 then
- http.redirect(config.on_valid_to)
+ http.redirect(_resolve_path(config.on_valid_to))
return
end
if config.on_changed_to and state and state > 1 then
- http.redirect(config.on_changed_to)
+ http.redirect(_resolve_path(config.on_changed_to))
return
end
if config.on_success_to and state and state > 0 then
- http.redirect(config.on_success_to)
+ http.redirect(_resolve_path(config.on_success_to))
return
end
local pageaction = true
http.header("X-CBI-State", state or 0)
- tpl.render("cbi/header", {state = state})
+ if not config.noheader then
+ tpl.render("cbi/header", {state = state})
+ end
for i, res in ipairs(maps) do
res:render()
if res.pageaction == false then
pageaction = false
end
end
- tpl.render("cbi/footer", {pageaction=pageaction, state = state, autoapply = config.autoapply})
+ if not config.nofooter then
+ tpl.render("cbi/footer", {flow = config, pageaction=pageaction, state = state, autoapply = config.autoapply})
+ end
end
--- Create a CBI model dispatching target.