modules: Make luci-base sufficient to use luci apps
Per the discussion in https://github.com/openwrt/luci/issues/869, make luci-base sufficient to login, logout, and review and apply or revert uci changes. This allows most luci-app-xxx to work without having luci-mod-admin-full installed. It has been tested with some apps and not luci-mod-admin-full, as well as with luci-mod-admin-full (to make sure the usual case doesn't break). Instead of creating a new module namespace (e.g. 'Base') we reduce the opportunities for breakage by having luci-base take over the 'shell' of the 'Administration' (admin/....) namespace. Since admin is assumed by all current building LuCI components (including Freifunk), this doesn't introduce the 'Administration' tab into any situation where it would not already be present (but includes it where it was before). We also add a "Component not installed" page to avoid fatal errors and backtrace when e.g. luci-mod-admin-full is not installed. Signed-off-by: Daniel F. Dickinson <cshored@thecshore.com>
This commit is contained in:
parent
1a0316bbba
commit
6ec0353201
14 changed files with 108 additions and 58 deletions
82
modules/luci-base/luasrc/controller/admin/index.lua
Normal file
82
modules/luci-base/luasrc/controller/admin/index.lua
Normal file
|
@ -0,0 +1,82 @@
|
|||
-- Copyright 2008 Steven Barth <steven@midlink.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
module("luci.controller.admin.index", package.seeall)
|
||||
|
||||
function index()
|
||||
function toplevel_page(page, preflookup, preftarget)
|
||||
if preflookup and preftarget then
|
||||
if lookup(preflookup) then
|
||||
page.target = preftarget
|
||||
end
|
||||
end
|
||||
|
||||
if not page.target then
|
||||
page.target = firstchild()
|
||||
end
|
||||
end
|
||||
|
||||
local root = node()
|
||||
if not root.target then
|
||||
root.target = alias("admin")
|
||||
root.index = true
|
||||
end
|
||||
|
||||
local page = node("admin")
|
||||
page.title = _("Administration")
|
||||
page.order = 10
|
||||
page.sysauth = "root"
|
||||
page.sysauth_authenticator = "htmlauth"
|
||||
page.ucidata = true
|
||||
page.index = true
|
||||
toplevel_page(page, "admin/status/overview", alias("admin", "status"))
|
||||
|
||||
-- Empty menu tree to be populated by addons and modules
|
||||
|
||||
page = node("admin", "status")
|
||||
page.title = _("Status")
|
||||
page.order = 10
|
||||
page.index = true
|
||||
-- overview is from mod-admin-full
|
||||
toplevel_page(page, "admin/status/overview", alias("admin", "status", "overview"))
|
||||
|
||||
page = node("admin", "system")
|
||||
page.title = _("System")
|
||||
page.order = 20
|
||||
page.index = true
|
||||
-- system/system is from mod-admin-full
|
||||
toplevel_page(page, "admin/system/system", alias("admin", "system", "system"))
|
||||
|
||||
-- Only used if applications add items
|
||||
page = node("admin", "services")
|
||||
page.title = _("Services")
|
||||
page.order = 40
|
||||
page.index = true
|
||||
toplevel_page(page, false, false)
|
||||
|
||||
-- Even for mod-admin-full network just uses first submenu item as landing
|
||||
page = node("admin", "network")
|
||||
page.title = _("Network")
|
||||
page.order = 50
|
||||
page.index = true
|
||||
toplevel_page(page, false, false)
|
||||
|
||||
-- Logout is last
|
||||
entry({"admin", "logout"}, call("action_logout"), _("Logout"), 999)
|
||||
end
|
||||
|
||||
function action_logout()
|
||||
local dsp = require "luci.dispatcher"
|
||||
local utl = require "luci.util"
|
||||
local sid = dsp.context.authsession
|
||||
|
||||
if sid then
|
||||
utl.ubus("session", "destroy", { ubus_rpc_session = sid })
|
||||
|
||||
luci.http.header("Set-Cookie", "sysauth=%s; expires=%s; path=%s/" %{
|
||||
sid, 'Thu, 01 Jan 1970 01:00:00 GMT', dsp.build_url()
|
||||
})
|
||||
end
|
||||
|
||||
luci.http.redirect(dsp.build_url())
|
||||
end
|
|
@ -741,11 +741,12 @@ function _firstchild()
|
|||
end
|
||||
end
|
||||
|
||||
assert(lowest ~= nil,
|
||||
"The requested node contains no childs, unable to redispatch")
|
||||
|
||||
path[#path+1] = lowest
|
||||
dispatch(path)
|
||||
if lowest == nil then
|
||||
require "luci.template".render("empty_node_placeholder")
|
||||
else
|
||||
path[#path+1] = lowest
|
||||
dispatch(path)
|
||||
end
|
||||
end
|
||||
|
||||
function firstchild()
|
||||
|
|
11
modules/luci-base/luasrc/view/empty_node_placeholder.htm
Normal file
11
modules/luci-base/luasrc/view/empty_node_placeholder.htm
Normal file
|
@ -0,0 +1,11 @@
|
|||
<%#
|
||||
Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
|
||||
Copyright 2018 Daniel F. Dickinson <cshored@thecshore.com>
|
||||
Licensed to the public under the Apache License 2.0.
|
||||
-%>
|
||||
|
||||
<%+header%>
|
||||
|
||||
<p>Component not present.</p>
|
||||
|
||||
<%+footer%>
|
|
@ -1,42 +0,0 @@
|
|||
-- Copyright 2008 Steven Barth <steven@midlink.org>
|
||||
-- Licensed to the public under the Apache License 2.0.
|
||||
|
||||
module("luci.controller.admin.index", package.seeall)
|
||||
|
||||
function index()
|
||||
local root = node()
|
||||
if not root.target then
|
||||
root.target = alias("admin")
|
||||
root.index = true
|
||||
end
|
||||
|
||||
local page = node("admin")
|
||||
page.target = firstchild()
|
||||
page.title = _("Administration")
|
||||
page.order = 10
|
||||
page.sysauth = "root"
|
||||
page.sysauth_authenticator = "htmlauth"
|
||||
page.ucidata = true
|
||||
page.index = true
|
||||
|
||||
-- Empty services menu to be populated by addons
|
||||
entry({"admin", "services"}, firstchild(), _("Services"), 40).index = true
|
||||
|
||||
entry({"admin", "logout"}, call("action_logout"), _("Logout"), 90)
|
||||
end
|
||||
|
||||
function action_logout()
|
||||
local dsp = require "luci.dispatcher"
|
||||
local utl = require "luci.util"
|
||||
local sid = dsp.context.authsession
|
||||
|
||||
if sid then
|
||||
utl.ubus("session", "destroy", { ubus_rpc_session = sid })
|
||||
|
||||
luci.http.header("Set-Cookie", "sysauth=%s; expires=%s; path=%s/" %{
|
||||
sid, 'Thu, 01 Jan 1970 01:00:00 GMT', dsp.build_url()
|
||||
})
|
||||
end
|
||||
|
||||
luci.http.redirect(dsp.build_url())
|
||||
end
|
|
@ -8,12 +8,6 @@ function index()
|
|||
local uci = require("luci.model.uci").cursor()
|
||||
local page
|
||||
|
||||
page = node("admin", "network")
|
||||
page.target = firstchild()
|
||||
page.title = _("Network")
|
||||
page.order = 50
|
||||
page.index = true
|
||||
|
||||
-- if page.inreq then
|
||||
local has_switch = false
|
||||
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
module("luci.controller.admin.status", package.seeall)
|
||||
|
||||
function index()
|
||||
entry({"admin", "status"}, alias("admin", "status", "overview"), _("Status"), 20).index = true
|
||||
entry({"admin", "status", "overview"}, template("admin_status/index"), _("Overview"), 1)
|
||||
|
||||
entry({"admin", "status", "iptables"}, template("admin_status/iptables"), _("Firewall"), 2).leaf = true
|
||||
|
|
|
@ -7,7 +7,6 @@ module("luci.controller.admin.system", package.seeall)
|
|||
function index()
|
||||
local fs = require "nixio.fs"
|
||||
|
||||
entry({"admin", "system"}, alias("admin", "system", "system"), _("System"), 30).index = true
|
||||
entry({"admin", "system", "system"}, cbi("admin_system/system"), _("System"), 1)
|
||||
entry({"admin", "system", "clock_status"}, post_on({ set = true }, "action_clock_status"))
|
||||
|
||||
|
|
|
@ -193,7 +193,9 @@
|
|||
<div class="alert-message warning">
|
||||
<h4><%:No password set!%></h4>
|
||||
<p><%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%></p>
|
||||
<div class="right"><a class="btn" href="<%=url("admin/system/admin")%>"><%:Go to password configuration...%></a></div>
|
||||
<% if disp.lookup("amdin/system/admin") then %>
|
||||
<div class="right"><a class="btn" href="<%=url("admin/system/admin")%>"><%:Go to password configuration...%></a></div>
|
||||
<% end %>
|
||||
</div>
|
||||
<%- end -%>
|
||||
|
||||
|
|
|
@ -239,7 +239,9 @@
|
|||
<div class="alert-message warning">
|
||||
<h4><%:No password set!%></h4>
|
||||
<p><%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%></p>
|
||||
<div class="right"><a class="btn" href="<%=url("admin/system/admin")%>"><%:Go to password configuration...%></a></div>
|
||||
<% if disp.lookup("admin/system/admin") then %>
|
||||
<div class="right"><a class="btn" href="<%=url("admin/system/admin")%>"><%:Go to password configuration...%></a></div>
|
||||
<% end %>
|
||||
</div>
|
||||
<%- end -%>
|
||||
|
||||
|
|
|
@ -257,6 +257,8 @@
|
|||
<div class="alert-message warning">
|
||||
<h4><%:No password set!%></h4>
|
||||
<p><%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%></p>
|
||||
<div class="right"><a class="btn" href="<%=url("admin/system/admin")%>"><%:Go to password configuration...%></a></div>
|
||||
<% if disp.lookup("admin/system/admin") then %>
|
||||
<div class="right"><a class="btn" href="<%=url("admin/system/admin")%>"><%:Go to password configuration...%></a></div>
|
||||
<% end %>
|
||||
</div>
|
||||
<%- end -%>
|
||||
|
|
Loading…
Reference in a new issue