]]--
module("luci.dispatcher", package.seeall)
+require("luci.init")
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
built_index = false
built_tree = false
--- Fastindex cache
-local fi = nil
+-- Fastindex
+local fi
+
-- Builds a URL
function build_url(...)
return luci.http.dispatcher() .. "/" .. table.concat(arg, "/")
end
+-- Prints an error message or renders the "error401" template if available
+function error401(message)
+ message = message or "Unauthorized"
+
+ require("luci.template")
+ if not pcall(luci.template.render, "error401") then
+ luci.http.prepare_content("text/plain")
+ print(message)
+ end
+ return false
+end
+
-- Sends a 404 error code and renders the "error404" template if available
function error404(message)
luci.http.status(404, "Not Found")
end
end
+ if track.sysauth then
+ local accs = track.sysauth
+ accs = (type(accs) == "string") and {accs} or accs
+
+ local function sysauth(user, password)
+ return (luci.util.contains(accs, user)
+ and luci.sys.user.checkpasswd(user, password))
+ end
+
+ if not luci.http.basic_auth(sysauth) then
+ error401()
+ return
+ end
+ end
if track.i18n then
require("luci.i18n").loadc(track.i18n)
function createindex()
index = {}
local path = luci.sys.libpath() .. "/controller/"
- local suffix = ".lua"
+ local suff = ".lua"
+
+ if pcall(require, "luci.fastindex") then
+ createindex_fastindex(path, suff)
+ else
+ createindex_plain(path, suff)
+ end
+
+ built_index = true
+end
- if fi == nil then
+-- Uses fastindex to create the dispatching tree
+function createindex_fastindex(path, suffix)
+ if not fi 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
- built_index = true
+-- Calls the index function of all available controllers
+-- Fallback for transition purposes / Leave it in as long as it works otherwise throw it away
+function createindex_plain(path, suffix)
+ if built_index then
+ return
+ end
+
+ local cache = nil
+
+ local controllers = luci.util.combine(
+ luci.fs.glob(path .. "*" .. suffix) or {},
+ luci.fs.glob(path .. "*/*" .. suffix) or {}
+ )
+
+ if indexcache then
+ cache = luci.fs.mtime(indexcache)
+
+ if not cache then
+ luci.fs.mkdir(indexcache)
+ luci.fs.chmod(indexcache, "a=,u=rwx")
+ cache = luci.fs.mtime(indexcache)
+ end
+ end
+
+ for i,c in ipairs(controllers) do
+ local module = "luci.controller." .. c:sub(#path+1, #c-#suffix):gsub("/", ".")
+ local cachefile
+ local stime
+ local ctime
+
+ if cache then
+ cachefile = indexcache .. "/" .. module
+ stime = luci.fs.mtime(c) or 0
+ ctime = luci.fs.mtime(cachefile) or 0
+ end
+
+ if not cache or stime > ctime then
+ stat, mod = pcall(require, module)
+
+ if stat and mod and type(mod.index) == "function" then
+ index[module] = mod.index
+
+ if cache then
+ luci.fs.writefile(cachefile, luci.util.dump(mod.index))
+ end
+ end
+ else
+ index[module] = loadfile(cachefile)
+ end
+ end
end
-- Creates the dispatching tree from the index
built_tree = true
end
--- Shortcut for creating a dispatching node
-function entry(path, target, title, order, add)
- add = add or {}
+-- Reassigns a node to another position
+function assign(path, clone, title, order)
+ local obj = node(path)
+ obj.nodes = nil
+ obj.module = nil
+
+ obj.title = title
+ obj.order = order
+
+ setmetatable(obj, {__index = clone})
+
+ return obj
+end
+-- Shortcut for creating a dispatching node
+function entry(path, target, title, order)
local c = node(path)
+
c.target = target
c.title = title
c.order = order
c.module = getfenv(2)._NAME
- for k,v in pairs(add) do
- c[k] = v
- end
-
return c
end
c = c.nodes[v]
end
+ c.path = arg
+
return c
end