modules: Make luci-base sufficient to use luci apps
authorDaniel F. Dickinson <cshored@thecshore.com>
Thu, 2 Aug 2018 13:39:48 +0000 (09:39 -0400)
committerJo-Philipp Wich <jo@mein.io>
Wed, 19 Sep 2018 18:08:19 +0000 (20:08 +0200)
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>
18 files changed:
modules/luci-base/luasrc/controller/admin/index.lua [new file with mode: 0644]
modules/luci-base/luasrc/controller/admin/uci.lua [new file with mode: 0644]
modules/luci-base/luasrc/dispatcher.lua
modules/luci-base/luasrc/view/admin_uci/changelog.htm [new file with mode: 0644]
modules/luci-base/luasrc/view/admin_uci/changes.htm [new file with mode: 0644]
modules/luci-base/luasrc/view/admin_uci/revert.htm [new file with mode: 0644]
modules/luci-base/luasrc/view/empty_node_placeholder.htm [new file with mode: 0644]
modules/luci-mod-admin-full/luasrc/controller/admin/index.lua [deleted file]
modules/luci-mod-admin-full/luasrc/controller/admin/network.lua
modules/luci-mod-admin-full/luasrc/controller/admin/status.lua
modules/luci-mod-admin-full/luasrc/controller/admin/system.lua
modules/luci-mod-admin-full/luasrc/controller/admin/uci.lua [deleted file]
modules/luci-mod-admin-full/luasrc/view/admin_uci/changelog.htm [deleted file]
modules/luci-mod-admin-full/luasrc/view/admin_uci/changes.htm [deleted file]
modules/luci-mod-admin-full/luasrc/view/admin_uci/revert.htm [deleted file]
themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm
themes/luci-theme-material/luasrc/view/themes/material/header.htm
themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm

diff --git a/modules/luci-base/luasrc/controller/admin/index.lua b/modules/luci-base/luasrc/controller/admin/index.lua
new file mode 100644 (file)
index 0000000..39e6e57
--- /dev/null
@@ -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 (file)
index 0000000..1d955dd
--- /dev/null
@@ -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
index 6cf2712eb4a862c8771ce68d7d34fe966e9ce68e..09d5d7284664a7e546810cc5b6a1d2d141aca469 100644 (file)
@@ -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 (file)
index 0000000..8a162c8
--- /dev/null
@@ -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>&#160;</ins> <%:Section added%></div>
+               <div class="uci-change-legend-label"><del>&#160;</del> <%:Section removed%></div>
+               <div class="uci-change-legend-label"><var><ins>&#160;</ins></var> <%:Option changed%></div>
+               <div class="uci-change-legend-label"><var><del>&#160;</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 (file)
index 0000000..43bd7c2
--- /dev/null
@@ -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 (file)
index 0000000..d8fd3de
--- /dev/null
@@ -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 (file)
index 0000000..b7e276b
--- /dev/null
@@ -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%>
diff --git a/modules/luci-mod-admin-full/luasrc/controller/admin/index.lua b/modules/luci-mod-admin-full/luasrc/controller/admin/index.lua
deleted file mode 100644 (file)
index cc8c2e3..0000000
+++ /dev/null
@@ -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
index c45605a983cd9671077cc50ddf0bf6dde1454505..c4e1c3aa1655850516b847e3224d6b53696f6030 100644 (file)
@@ -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
 
index ff95f3d9150e055d88fc7c17f9d9f5b5b4d6f571..4f04cce5456622e6a075a16b91e3b3361fb82070 100644 (file)
@@ -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
index 46d2e36c32b1b1a523aa696305c6fbb6ba44c529..4e83769ee03c61f2b1176583e03c8a2a0f4a818a 100644 (file)
@@ -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"))
 
diff --git a/modules/luci-mod-admin-full/luasrc/controller/admin/uci.lua b/modules/luci-mod-admin-full/luasrc/controller/admin/uci.lua
deleted file mode 100644 (file)
index 1d955dd..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
--- 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-mod-admin-full/luasrc/view/admin_uci/changelog.htm b/modules/luci-mod-admin-full/luasrc/view/admin_uci/changelog.htm
deleted file mode 100644 (file)
index 8a162c8..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-<%#
- 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>&#160;</ins> <%:Section added%></div>
-               <div class="uci-change-legend-label"><del>&#160;</del> <%:Section removed%></div>
-               <div class="uci-change-legend-label"><var><ins>&#160;</ins></var> <%:Option changed%></div>
-               <div class="uci-change-legend-label"><var><del>&#160;</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-mod-admin-full/luasrc/view/admin_uci/changes.htm b/modules/luci-mod-admin-full/luasrc/view/admin_uci/changes.htm
deleted file mode 100644 (file)
index 43bd7c2..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-<%#
- 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-mod-admin-full/luasrc/view/admin_uci/revert.htm b/modules/luci-mod-admin-full/luasrc/view/admin_uci/revert.htm
deleted file mode 100644 (file)
index d8fd3de..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<%#
- 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%>
index 4347f133a463c3d5c64c3ccf47f150c2afbce6dc..a6bb326976d1cd3479f53710e717614d3abb762e 100644 (file)
                                <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 -%>
 
index c070b1a617cb53690aa5e90f1fbb7a7ce13465c7..564c680f1d59c5fd16c94396cd7fa569015a7364 100644 (file)
                                        <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 -%>
 
index 6fc657ddce9acf0facd579c736559c65c52b6b4c..1d2161168b4019f2f7ea69fd20f8d51901b0297d 100644 (file)
                <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 -%>