diff options
Diffstat (limited to 'modules/luci-base')
-rw-r--r-- | modules/luci-base/luasrc/controller/admin/index.lua | 82 | ||||
-rw-r--r-- | modules/luci-base/luasrc/controller/admin/uci.lua | 109 | ||||
-rw-r--r-- | modules/luci-base/luasrc/dispatcher.lua | 11 | ||||
-rw-r--r-- | modules/luci-base/luasrc/view/admin_uci/changelog.htm | 66 | ||||
-rw-r--r-- | modules/luci-base/luasrc/view/admin_uci/changes.htm | 45 | ||||
-rw-r--r-- | modules/luci-base/luasrc/view/admin_uci/revert.htm | 33 | ||||
-rw-r--r-- | modules/luci-base/luasrc/view/empty_node_placeholder.htm | 11 |
7 files changed, 352 insertions, 5 deletions
diff --git a/modules/luci-base/luasrc/controller/admin/index.lua b/modules/luci-base/luasrc/controller/admin/index.lua new file mode 100644 index 0000000000..39e6e573b1 --- /dev/null +++ b/modules/luci-base/luasrc/controller/admin/index.lua @@ -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 diff --git a/modules/luci-base/luasrc/controller/admin/uci.lua b/modules/luci-base/luasrc/controller/admin/uci.lua new file mode 100644 index 0000000000..1d955dd982 --- /dev/null +++ b/modules/luci-base/luasrc/controller/admin/uci.lua @@ -0,0 +1,109 @@ +-- Copyright 2008 Steven Barth <steven@midlink.org> +-- Copyright 2010-2015 Jo-Philipp Wich <jow@openwrt.org> +-- Licensed to the public under the Apache License 2.0. + +module("luci.controller.admin.uci", package.seeall) + +function index() + local redir = luci.http.formvalue("redir", true) + or table.concat(luci.dispatcher.context.request, "/") + + entry({"admin", "uci"}, nil, _("Configuration")) + entry({"admin", "uci", "changes"}, post_on({ trigger_apply = true }, "action_changes"), _("Changes"), 40).query = {redir=redir} + entry({"admin", "uci", "revert"}, post("action_revert"), _("Revert"), 30).query = {redir=redir} + + local node + local authen = function(checkpass, allowed_users) + return "root", luci.http.formvalue("sid") + end + + node = entry({"admin", "uci", "apply_rollback"}, post("action_apply_rollback"), nil) + node.cors = true + node.sysauth_authenticator = authen + + node = entry({"admin", "uci", "apply_unchecked"}, post("action_apply_unchecked"), nil) + node.cors = true + node.sysauth_authenticator = authen + + node = entry({"admin", "uci", "confirm"}, call("action_confirm"), nil) + node.cors = true + node.sysauth = false +end + + +function action_changes() + local uci = require "luci.model.uci" + local changes = uci:changes() + + luci.template.render("admin_uci/changes", { + changes = next(changes) and changes, + timeout = timeout, + trigger_apply = luci.http.formvalue("trigger_apply") and true or false + }) +end + +function action_revert() + local uci = require "luci.model.uci" + local changes = uci:changes() + + -- Collect files to be reverted + local r, tbl + for r, tbl in pairs(changes) do + uci:revert(r) + end + + luci.template.render("admin_uci/revert", { + changes = next(changes) and changes, + trigger_revert = true + }) +end + + +local function ubus_state_to_http(errstr) + local map = { + ["Invalid command"] = 400, + ["Invalid argument"] = 400, + ["Method not found"] = 404, + ["Entry not found"] = 404, + ["No data"] = 204, + ["Permission denied"] = 403, + ["Timeout"] = 504, + ["Not supported"] = 500, + ["Unknown error"] = 500, + ["Connection failed"] = 503 + } + + local code = map[errstr] or 200 + local msg = errstr or "OK" + + luci.http.status(code, msg) + + if code ~= 204 then + luci.http.prepare_content("text/plain") + luci.http.write(msg) + end +end + +function action_apply_rollback() + local uci = require "luci.model.uci" + local token, errstr = uci:apply(true) + if token then + luci.http.prepare_content("application/json") + luci.http.write_json({ token = token }) + else + ubus_state_to_http(errstr) + end +end + +function action_apply_unchecked() + local uci = require "luci.model.uci" + local _, errstr = uci:apply(false) + ubus_state_to_http(errstr) +end + +function action_confirm() + local uci = require "luci.model.uci" + local token = luci.http.formvalue("token") + local _, errstr = uci:confirm(token) + ubus_state_to_http(errstr) +end diff --git a/modules/luci-base/luasrc/dispatcher.lua b/modules/luci-base/luasrc/dispatcher.lua index 6cf2712eb4..09d5d72846 100644 --- a/modules/luci-base/luasrc/dispatcher.lua +++ b/modules/luci-base/luasrc/dispatcher.lua @@ -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() diff --git a/modules/luci-base/luasrc/view/admin_uci/changelog.htm b/modules/luci-base/luasrc/view/admin_uci/changelog.htm new file mode 100644 index 0000000000..8a162c88b6 --- /dev/null +++ b/modules/luci-base/luasrc/view/admin_uci/changelog.htm @@ -0,0 +1,66 @@ +<%# + Copyright 2010 Jo-Philipp Wich <jo@mein.io> + Licensed to the public under the Apache License 2.0. +-%> + +<% export("uci_changelog", function(changes) -%> +<div class="cbi-section"> + <strong><%:Legend:%></strong> + <div class="uci-change-legend"> + <div class="uci-change-legend-label"><ins> </ins> <%:Section added%></div> + <div class="uci-change-legend-label"><del> </del> <%:Section removed%></div> + <div class="uci-change-legend-label"><var><ins> </ins></var> <%:Option changed%></div> + <div class="uci-change-legend-label"><var><del> </del></var> <%:Option removed%></div> + <br style="clear:both" /> + </div> + <br /> + + <div class="uci-change-list"><% + local util = luci.util + local tpl = { + ["add-3"] = "<ins>uci add %0 <strong>%3</strong> # =%2</ins>", + ["set-3"] = "<ins>uci set %0.<strong>%2</strong></ins>=%3", + ["set-4"] = "<var><ins>uci set %0.%2.%3=<strong>%4</strong></ins></var>", + ["remove-2"] = "<del>uci del %0.<strong>%2</strong></del>", + ["remove-3"] = "<var><del>uci del %0.%2.<strong>%3</strong></del></var>", + ["order-3"] = "<var>uci reorder %0.%2=<strong>%3</strong></var>", + ["list-add-4"] = "<var><ins>uci add_list %0.%2.%3=<strong>%4</strong></ins></var>", + ["list-del-4"] = "<var><del>uci del_list %0.%2.%3=<strong>%4</strong></del></var>", + ["rename-3"] = "<var>uci rename %0.%2=<strong>%3</strong></var>", + ["rename-4"] = "<var>uci rename %0.%2.%3=<strong>%4</strong></var>" + } + + local conf, deltas + for conf, deltas in util.kspairs(changes) do + write("<h3># /etc/config/%s</h3>" % conf) + + local _, delta, added + for _, delta in pairs(deltas) do + local t = tpl["%s-%d" %{ delta[1], #delta }] + + write(t:gsub("%%(%d)", function(n) + if n == "0" then + return conf + elseif n == "2" then + if added and delta[2] == added[1] then + return "@%s[-1]" % added[2] + else + return delta[2] + end + elseif n == "4" then + return util.shellquote(delta[4]) + else + return delta[tonumber(n)] + end + end)) + + if delta[1] == "add" then + added = { delta[2], delta[3] } + end + end + + write("<br />") + end + %></div> +</div> +<%- end) %> diff --git a/modules/luci-base/luasrc/view/admin_uci/changes.htm b/modules/luci-base/luasrc/view/admin_uci/changes.htm new file mode 100644 index 0000000000..43bd7c23fb --- /dev/null +++ b/modules/luci-base/luasrc/view/admin_uci/changes.htm @@ -0,0 +1,45 @@ +<%# + Copyright 2008 Steven Barth <steven@midlink.org> + Copyright 2008-2018 Jo-Philipp Wich <jo@mein.io> + Licensed to the public under the Apache License 2.0. +-%> + +<%+header%> + +<%- + local node, redir_url = luci.dispatcher.lookup(luci.http.formvalue("redir")) + export("redirect", redir_url or url("admin/uci/changes")) + + include("admin_uci/changelog") +-%> + +<h2 name="content"><%:Configuration%> / <%:Changes%></h2> + +<% if changes then %> + <%- uci_changelog(changes) -%> +<% else %> + <p><strong><%:There are no pending changes!%></strong></p> +<% end %> + +<div class="alert-message" id="cbi_apply_status" style="display:none"></div> + +<div class="cbi-page-actions"> + <% if redir_url then %> + <form method="get" action="<%=luci.util.pcdata(redir_url)%>"> + <input class="cbi-button cbi-button-link" type="submit" value="<%:Back%>" /> + </form> + <% end %> + + <form method="post" action="<%=url("admin/uci/changes")%>"> + <input type="hidden" name="token" value="<%=token%>" /> + <input type="hidden" name="redir" value="<%=pcdata(luci.http.formvalue("redir"))%>" /> + <input class="cbi-button cbi-button-save" type="submit" name="trigger_apply" value="<%:Save & Apply%>" /> + </form> + <form method="post" action="<%=url("admin/uci/revert")%>"> + <input type="hidden" name="token" value="<%=token%>" /> + <input type="hidden" name="redir" value="<%=pcdata(luci.http.formvalue("redir"))%>" /> + <input class="cbi-button cbi-button-reset" type="submit" value="<%:Revert%>" /> + </form> +</div> + +<%+footer%> diff --git a/modules/luci-base/luasrc/view/admin_uci/revert.htm b/modules/luci-base/luasrc/view/admin_uci/revert.htm new file mode 100644 index 0000000000..d8fd3de01e --- /dev/null +++ b/modules/luci-base/luasrc/view/admin_uci/revert.htm @@ -0,0 +1,33 @@ +<%# + Copyright 2008 Steven Barth <steven@midlink.org> + Copyright 2008-2018 Jo-Philipp Wich <jo@mein.io> + Licensed to the public under the Apache License 2.0. +-%> + +<%+header%> + +<%- + local node, redir_url = luci.dispatcher.lookup(luci.http.formvalue("redir")) + export("redirect", redir_url or url("admin/uci/changes")) + + include("admin_uci/changelog") +-%> + +<h2 name="content"><%:Configuration%> / <%:Revert%></h2> + +<% if changes then %> + <p><strong><%:The following changes have been reverted%>:</strong></p> + <%- uci_changelog(changes) -%> +<% else %> + <p><strong><%:There are no pending changes to revert!%></strong></p> +<% end %> + +<% if redir_url then %> + <div class="cbi-page-actions"> + <form class="inline" method="get" action="<%=luci.util.pcdata(redir_url)%>"> + <input class="cbi-button cbi-button-link" style="margin:0" type="submit" value="<%:Back%>" /> + </form> + </div> +<% end %> + +<%+footer%> diff --git a/modules/luci-base/luasrc/view/empty_node_placeholder.htm b/modules/luci-base/luasrc/view/empty_node_placeholder.htm new file mode 100644 index 0000000000..b7e276b960 --- /dev/null +++ b/modules/luci-base/luasrc/view/empty_node_placeholder.htm @@ -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%> |