require("luci.http")
require("luci.sys")
require("luci.fs")
+require("luci.fastindex")
+
+-- Dirty OpenWRT fix
+if (os.time() < luci.fs.mtime(luci.sys.libpath() .. "/dispatcher.lua")) then
+ os.execute('date -s '..os.date('%m%d%H%M%Y', luci.fs.mtime(luci.sys.libpath() .. "/dispatcher.lua"))..' > /dev/null 2>&1')
+end
-- Local dispatch database
local tree = {nodes={}}
-- Index table
local index = {}
--- Indexdump
-local indexcache = "/tmp/.luciindex"
-
-- Global request object
request = {}
built_index = false
built_tree = false
+-- Fastindex cache
+local fi = nil
-- Builds a URL
function build_url(...)
local pathinfo = luci.http.env.PATH_INFO or ""
local c = tree
- for s in pathinfo:gmatch("([%w_]+)") do
+ for s in pathinfo:gmatch("([%w-]+)") do
table.insert(request, s)
end
for i, s in ipairs(request) do
c = c.nodes[s]
- if not c then
+ if not c or c.leaf then
break
end
-- Init template engine
local tpl = require("luci.template")
- tpl.viewns.translate = function(...) return require("luci.i18n").translate(...) end
- tpl.viewns.controller = luci.http.dispatcher()
- tpl.viewns.uploadctrl = luci.http.dispatcher_upload()
- tpl.viewns.media = luci.config.main.mediaurlbase
- tpl.viewns.resource = luci.config.main.resourcebase
-
- -- Load default translation
- require("luci.i18n").loadc("default")
+ tpl.viewns.translate = function(...) return require("luci.i18n").translate(...) end
+ tpl.viewns.controller = luci.http.dispatcher()
+ tpl.viewns.uploadctrl = luci.http.dispatcher_upload()
+ tpl.viewns.media = luci.config.main.mediaurlbase
+ tpl.viewns.resource = luci.config.main.resourcebase
+ tpl.viewns.REQUEST_URI = luci.http.env.SCRIPT_NAME .. luci.http.env.PATH_INFO
if c and type(c.target) == "function" then
dispatched = c
-
+ stat, mod = pcall(require, c.module)
+ if stat then
+ luci.util.updfenv(c.target, mod)
+ end
+
stat, err = pcall(c.target)
if not stat then
error500(err)
function createindex()
index = {}
local path = luci.sys.libpath() .. "/controller/"
- local suff = ".lua"
-
- if pcall(require, "fastindex") then
- createindex_fastindex(path, suff)
- else
- createindex_plain(path, suff)
- end
-
- built_index = true
-end
+ local suffix = ".lua"
--- Uses fastindex to create the dispatching tree
-function createindex_fastindex(path, suffix)
- local fi = fastindex.new("index")
- fi.add(path .. "*" .. suffix)
- fi.add(path .. "*/*" .. suffix)
+ if fi == nil then
+ fi = luci.fastindex.new("index")
+ fi.add(path .. "*" .. suffix)
+ fi.add(path .. "*/*" .. suffix)
+ end
fi.scan()
-
+
for k, v in pairs(fi.indexes) do
index[v[2]] = v[1]
end
-end
-
--- Calls the index function of all available controllers
-function createindex_plain(path, suffix)
- local cachetime = nil
-
- local controllers = luci.util.combine(
- luci.fs.glob(path .. "*" .. suffix) or {},
- luci.fs.glob(path .. "*/*" .. suffix) or {}
- )
-
- if indexcache then
- cachetime = luci.fs.mtime(indexcache)
-
- if not cachetime then
- luci.fs.mkdir(indexcache)
- luci.fs.chmod(indexcache, "a=,u=rwx")
- end
- end
- if not cachetime then
- for i,c in ipairs(controllers) do
- c = "luci.controller." .. c:sub(#path+1, #c-#suffix):gsub("/", ".")
- stat, mod = pcall(require, c)
-
- if stat and mod and type(mod.index) == "function" then
- index[c] = mod.index
-
- if indexcache then
- luci.fs.writefile(indexcache .. "/" .. c, string.dump(mod.index))
- end
- end
- end
- else
- for i,c in ipairs(luci.fs.dir(indexcache)) do
- if c:sub(1) ~= "." then
- index[c] = loadfile(indexcache .. "/" .. c)
- end
- end
- end
+ built_index = true
end
-- Creates the dispatching tree from the index
if not built_index then
createindex()
end
+
+ require("luci.i18n")
+
+ -- Load default translation
+ luci.i18n.loadc("default")
+
+ local scope = luci.util.clone(_G)
+ for k,v in pairs(_M) do
+ if type(v) == "function" then
+ scope[k] = v
+ end
+ end
for k, v in pairs(index) do
- luci.util.updfenv(v, _M)
+ scope._NAME = k
+ setfenv(v, scope)
- local stat, mod = pcall(require, k)
- if stat then
- luci.util.updfenv(v, mod)
+ local stat, err = pcall(v)
+ if not stat then
+ error500(err)
+ os.exit(1)
end
-
- pcall(v)
end
built_tree = true
c.target = target
c.title = title
c.order = order
+ c.module = getfenv(2)._NAME
for k,v in pairs(add) do
c[k] = v
for k,v in ipairs(arg) do
if not c.nodes[v] then
- c.nodes[v] = {nodes={}}
+ c.nodes[v] = {nodes={}, module=getfenv(2)._NAME}
end
c = c.nodes[v]
end
end
+function rewrite(n, ...)
+ local req = arg
+ return function()
+ for i=1,n do
+ table.remove(request, 1)
+ end
+
+ for i,r in ipairs(req) do
+ table.insert(request, i, r)
+ end
+
+ dispatch()
+ end
+end
+
+function call(name)
+ return function() getfenv()[name]() end
+end
+
function template(name)
require("luci.template")
return function() luci.template.render(name) end