From 37b79596bbc79b33d7ae7e84dfe763b730ecdc59 Mon Sep 17 00:00:00 2001 From: Steven Barth Date: Sun, 7 Sep 2008 14:17:29 +0000 Subject: [PATCH] Backported UCI-Dependency Tracking and Responsiveness Improvements --- .../root/etc/uci-defaults/luci-statistics | 7 +- .../root/etc/uci-defaults/luci-uvc_streamer | 7 +- contrib/package/luci-addons/Makefile | 1 - .../package/luci-addons/dist/sbin/luci-flash | 4 + .../package/luci-addons/dist/sbin/luci-reload | 9 -- i18n/english/luasrc/i18n/admin-core.en.lua | 2 + i18n/english/luasrc/i18n/admin-core.en.xml | 2 + i18n/english/luasrc/i18n/cbi.en.lua | 1 + i18n/english/luasrc/i18n/cbi.en.xml | 1 + i18n/german/luasrc/i18n/admin-core.de.lua | 2 + i18n/german/luasrc/i18n/admin-core.de.xml | 2 + i18n/german/luasrc/i18n/cbi.de.lua | 1 + i18n/german/luasrc/i18n/cbi.de.xml | 2 + libs/cbi/luasrc/cbi.lua | 19 ++++- libs/cbi/luasrc/view/cbi/map.htm | 13 +++ libs/uci/luasrc/model/uci.lua | 60 ++++++++++++-- libs/uci/root/etc/config/ucitrack | 50 +++++++++++ libs/uci/root/sbin/luci-reload | 32 ++++++++ libs/web/root/etc/config/luci | 18 ---- .../luasrc/controller/admin/system.lua | 8 +- .../luasrc/controller/admin/uci.lua | 80 +++++++----------- .../luasrc/view/admin_system/upgrade.htm | 11 ++- .../luasrc/view/admin_uci/apply.htm | 11 ++- .../luasrc/controller/mini/system.lua | 6 +- .../admin-mini/luasrc/controller/mini/uci.lua | 82 ++++++++----------- .../admin-mini/luasrc/view/mini/uci_apply.htm | 11 ++- .../admin-mini/luasrc/view/mini/upgrade.htm | 11 ++- 27 files changed, 305 insertions(+), 148 deletions(-) delete mode 100644 contrib/package/luci-addons/dist/sbin/luci-reload create mode 100644 libs/uci/root/etc/config/ucitrack create mode 100755 libs/uci/root/sbin/luci-reload diff --git a/applications/luci-statistics/root/etc/uci-defaults/luci-statistics b/applications/luci-statistics/root/etc/uci-defaults/luci-statistics index 6903ddfcb..f89366f1b 100644 --- a/applications/luci-statistics/root/etc/uci-defaults/luci-statistics +++ b/applications/luci-statistics/root/etc/uci-defaults/luci-statistics @@ -1,4 +1,7 @@ #!/bin/sh -uci set luci.uci_oncommit.luci_statistics='/etc/init.d/luci_statistics restart' -uci commit luci +uci batch <<-EOF + add ucitrack luci_statistics + set ucitrack.@luci_statistics[-1].init=luci_statistics + commit ucitrack +EOF diff --git a/applications/luci-uvc_streamer/root/etc/uci-defaults/luci-uvc_streamer b/applications/luci-uvc_streamer/root/etc/uci-defaults/luci-uvc_streamer index 6ecea2c42..42372f051 100644 --- a/applications/luci-uvc_streamer/root/etc/uci-defaults/luci-uvc_streamer +++ b/applications/luci-uvc_streamer/root/etc/uci-defaults/luci-uvc_streamer @@ -1,4 +1,7 @@ #!/bin/sh -uci set luci.uci_oncommit.uvc_streamer='/sbin/luci-reload uvc-streamer' -uci commit luci +uci batch <<-EOF + add ucitrack uvc-streamer + set ucitrack.@uvc-streamer[-1].init=uvc-streamer + commit ucitrack +EOF diff --git a/contrib/package/luci-addons/Makefile b/contrib/package/luci-addons/Makefile index 241f48ac1..aab8485d9 100644 --- a/contrib/package/luci-addons/Makefile +++ b/contrib/package/luci-addons/Makefile @@ -30,7 +30,6 @@ define Package/luci-addons/install $(INSTALL_BIN) ./dist/usr/bin/run-parts $(1)/usr/bin $(INSTALL_BIN) ./dist/sbin/luci-flash $(1)/sbin - $(INSTALL_BIN) ./dist/sbin/luci-reload $(1)/sbin $(INSTALL_BIN) ./dist/etc/init.d/luci_fixtime $(1)/etc/init.d $(INSTALL_BIN) ./dist/etc/init.d/luci_ethers $(1)/etc/init.d $(INSTALL_BIN) ./dist/etc/init.d/luci_hosts $(1)/etc/init.d diff --git a/contrib/package/luci-addons/dist/sbin/luci-flash b/contrib/package/luci-addons/dist/sbin/luci-flash index 07434b507..79bc834b4 100755 --- a/contrib/package/luci-addons/dist/sbin/luci-flash +++ b/contrib/package/luci-addons/dist/sbin/luci-flash @@ -85,5 +85,9 @@ done [ -n "$sysupgrade_init_conffiles" ] && do_save_conffiles run_hooks "" $sysupgrade_pre_upgrade +ask_bool() { + false +} + v "Switching to ramdisk..." run_ramfs '. /etc/functions.sh; include /lib/upgrade; do_upgrade' diff --git a/contrib/package/luci-addons/dist/sbin/luci-reload b/contrib/package/luci-addons/dist/sbin/luci-reload deleted file mode 100644 index 48b6778bc..000000000 --- a/contrib/package/luci-addons/dist/sbin/luci-reload +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -for i in $* -do - [ -x /etc/init.d/$i ] && { - echo -n "Reloading $i... " - /etc/init.d/$i restart >/dev/null 2>&1 && echo "done." || echo "failed!" - } -done \ No newline at end of file diff --git a/i18n/english/luasrc/i18n/admin-core.en.lua b/i18n/english/luasrc/i18n/admin-core.en.lua index 9b12862d5..b34226459 100644 --- a/i18n/english/luasrc/i18n/admin-core.en.lua +++ b/i18n/english/luasrc/i18n/admin-core.en.lua @@ -69,6 +69,8 @@ a_s_fstab_swap1 = 'If your physical memory is insufficient unused data can be te a_s_flash_flashed = 'Firmware successfully flashed. Rebooting device...' a_s_flash_flasherr = 'Failed to flash' a_s_flash_fwimage = 'Firmwareimage' +a_s_flash_received = 'Image received. About to start flashing process. DO NOT POWER OFF THE DEVICE!' +a_s_flash_inprogress = 'Writing firmware...' a_s_flash_fwupgrade = 'Flash Firmware' a_s_flash_keepcfg = 'Keep configuration files' a_s_flash_notimplemented = 'Sorry, this function is not (yet) available for your platform.' diff --git a/i18n/english/luasrc/i18n/admin-core.en.xml b/i18n/english/luasrc/i18n/admin-core.en.xml index fd249e545..5ffd01a26 100644 --- a/i18n/english/luasrc/i18n/admin-core.en.xml +++ b/i18n/english/luasrc/i18n/admin-core.en.xml @@ -73,6 +73,8 @@ Firmware successfully flashed. Rebooting device... Failed to flash Firmwareimage +Image received. About to start flashing process. DO NOT POWER OFF THE DEVICE! +Writing firmware... Flash Firmware Keep configuration files Sorry, this function is not (yet) available for your platform. diff --git a/i18n/english/luasrc/i18n/cbi.en.lua b/i18n/english/luasrc/i18n/cbi.en.lua index d302ee52a..42f93d4cc 100644 --- a/i18n/english/luasrc/i18n/cbi.en.lua +++ b/i18n/english/luasrc/i18n/cbi.en.lua @@ -11,3 +11,4 @@ cbi_sectempty = 'This section contains no values yet' cbi_manual = '-- custom --' cbi_select = '-- Please choose --' cbi_gorel = 'Go to relevant configuration page' +cbi_applying = 'Applying changes' diff --git a/i18n/english/luasrc/i18n/cbi.en.xml b/i18n/english/luasrc/i18n/cbi.en.xml index 89484e4ae..4766ad155 100644 --- a/i18n/english/luasrc/i18n/cbi.en.xml +++ b/i18n/english/luasrc/i18n/cbi.en.xml @@ -15,5 +15,6 @@ -- custom -- -- Please choose -- Go to relevant configuration page +Applying changes diff --git a/i18n/german/luasrc/i18n/admin-core.de.lua b/i18n/german/luasrc/i18n/admin-core.de.lua index 4981bddaf..8bc4f1cd6 100644 --- a/i18n/german/luasrc/i18n/admin-core.de.lua +++ b/i18n/german/luasrc/i18n/admin-core.de.lua @@ -39,6 +39,8 @@ a_s_flash = 'Upgrade' a_s_flash_flashed = 'Flashvorgang erfolgreich. Router startet neu...' a_s_flash_flasherr = 'Flashvorgang fehlgeschlagen' a_s_flash_fwimage = 'Firmwareimage' +a_s_flash_received = 'Abbild empfangen. Starte Flashvorgang. SCHALTEN SIE DAS GERÄT NICHT AUS!' +a_s_flash_inprogress = 'Schreibe Firmware...' a_s_flash_fwupgrade = 'Firmware aktualisieren' a_s_flash_keepcfg = 'Konfigurationsdateien übernehmen' a_s_flash_notimplemented = 'Diese Funktion steht leider (noch) nicht zur Verfügung.' diff --git a/i18n/german/luasrc/i18n/admin-core.de.xml b/i18n/german/luasrc/i18n/admin-core.de.xml index 39334aad8..9b7281972 100644 --- a/i18n/german/luasrc/i18n/admin-core.de.xml +++ b/i18n/german/luasrc/i18n/admin-core.de.xml @@ -43,6 +43,8 @@ Flashvorgang erfolgreich. Router startet neu... Flashvorgang fehlgeschlagen Firmwareimage +Abbild empfangen. Starte Flashvorgang. SCHALTEN SIE DAS GERÄT NICHT AUS! +Schreibe Firmware... Firmware aktualisieren Konfigurationsdateien übernehmen Diese Funktion steht leider (noch) nicht zur Verfügung. diff --git a/i18n/german/luasrc/i18n/cbi.de.lua b/i18n/german/luasrc/i18n/cbi.de.lua index a8d68244e..9e6907537 100644 --- a/i18n/german/luasrc/i18n/cbi.de.lua +++ b/i18n/german/luasrc/i18n/cbi.de.lua @@ -10,3 +10,4 @@ cbi_sectempty = 'Diese Sektion enthält noch keine Einträge' cbi_manual = '-- benutzerdefiniert --' cbi_select = '-- Bitte auswählen --' cbi_gorel = 'Gehe zu relevanter Konfigurationsseite' +cbi_applying = 'Änderungen werden angewandt' diff --git a/i18n/german/luasrc/i18n/cbi.de.xml b/i18n/german/luasrc/i18n/cbi.de.xml index dd37f2f49..c989f8d8d 100644 --- a/i18n/german/luasrc/i18n/cbi.de.xml +++ b/i18n/german/luasrc/i18n/cbi.de.xml @@ -14,4 +14,6 @@ -- benutzerdefiniert -- -- Bitte auswählen -- Gehe zu relevanter Konfigurationsseite +Änderungen werden angewandt + diff --git a/libs/cbi/luasrc/cbi.lua b/libs/cbi/luasrc/cbi.lua index 57147b63c..c1eefca5d 100644 --- a/libs/cbi/luasrc/cbi.lua +++ b/libs/cbi/luasrc/cbi.lua @@ -221,6 +221,7 @@ function Map.__init__(self, config, ...) self.config = config self.parsechain = {self.config} self.template = "cbi/map" + self.apply_on_parse = nil self.uci = uci.cursor() self.save = true if not self.uci:load(self.config) then @@ -258,11 +259,18 @@ function Map.parse(self, ...) if luci.http.formvalue("cbi.apply") then for i, config in ipairs(self.parsechain) do self.uci:commit(config) - self.uci:apply(config) -- Refresh data because commit changes section names self.uci:load(config) end + if self.apply_on_parse then + self.uci:apply(self.parsechain) + else + self._apply = function() + local cmd = self.uci:apply(self.parsechain, true) + return io.popen(cmd) + end + end -- Reparse sections Node.parse(self, ...) @@ -274,6 +282,15 @@ function Map.parse(self, ...) end end +function Map.render(self, ...) + Node.render(self, ...) + if self._apply then + local fp = self._apply() + fp:read("*a") + fp:close() + end +end + -- Creates a child section function Map.section(self, class, ...) if instanceof(class, AbstractSection) then diff --git a/libs/cbi/luasrc/view/cbi/map.htm b/libs/cbi/luasrc/view/cbi/map.htm index e29b4fc74..1238b6adb 100644 --- a/libs/cbi/luasrc/view/cbi/map.htm +++ b/libs/cbi/luasrc/view/cbi/map.htm @@ -16,6 +16,19 @@ $Id$

<%=self.title%>

<%=self.description%>
+ <%- if self._apply then -%><%:cbi_applying%>: + +<% + local fp = self._apply() + self._apply = nil + local line = fp:read() + while line do + write(line.."\n") + line = fp:read() + end + fp:close() + -%> + <%- end -%> <%- self:render_children() %>
diff --git a/libs/uci/luasrc/model/uci.lua b/libs/uci/luasrc/model/uci.lua index 659cd6254..8852d1e5f 100644 --- a/libs/uci/luasrc/model/uci.lua +++ b/libs/uci/luasrc/model/uci.lua @@ -54,14 +54,17 @@ end local Cursor = getmetatable(cursor()) ---- Applies the new config --- @param config UCI config -function Cursor.apply(self, config) - local conf = require "luci.config" - return conf.uci_oncommit[config] and - os.execute(conf.uci_oncommit[config] .. " >/dev/null 2>&1") +--- Applies UCI configuration changes +-- @param configlist List of UCI configurations +-- @param command Don't apply only return the command +function Cursor.apply(self, configlist, command) + configlist = self:_affected(configlist) + local reloadcmd = "/sbin/luci-reload " .. table.concat(configlist, " ") + + return command and reloadcmd or os.execute(reloadcmd .. " >/dev/null 2>&1") end + --- Delete all sections of a given type that match certain criteria. -- @param config UCI config -- @param type UCI section type @@ -180,6 +183,51 @@ function Cursor.changes(self, config) end +-- Return a list of initscripts affected by configuration changes. +function Cursor._affected(self, configlist) + configlist = type(configlist) == "table" and configlist or {configlist} + + local c = cursor() + c:load("ucitrack") + + -- Resolve dependencies + local reloadlist = {} + + local function _resolve_deps(name) + local reload = {name} + local deps = {} + + c:foreach("ucitrack", name, + function(section) + if section.affects then + for i, aff in ipairs(section.affects) do + table.insert(deps, aff) + end + end + end) + + for i, dep in ipairs(deps) do + for j, add in ipairs(_resolve_deps(dep)) do + table.insert(reload, add) + end + end + + return reload + end + + -- Collect initscripts + for j, config in ipairs(configlist) do + for i, e in ipairs(_resolve_deps(config)) do + if not util.contains(reloadlist, e) then + table.insert(reloadlist, e) + end + end + end + + return reloadlist +end + + --- Add an anonymous section. -- @class function -- @name Cursor.add diff --git a/libs/uci/root/etc/config/ucitrack b/libs/uci/root/etc/config/ucitrack new file mode 100644 index 000000000..fbc0a240a --- /dev/null +++ b/libs/uci/root/etc/config/ucitrack @@ -0,0 +1,50 @@ +config network + option init network + list affects dhcp + +config wireless + list affects network + +config firewall + option init firewall + list affects luci-splash + list affects qos + +config olsr + option init olsrd + +config dhcp + option init dnsmasq + +config dropbear + option init dropbear + +config httpd + option init httpd + +config fstab + option init fstab + +config qos + option init qos + +config system + option init led + +config luci_ethers + option init luci_ethers + +config luci_hosts + option init luci_hosts + +config luci_splash + option init luci_splash + +config upnpd + option init miniupnpd + +config ntpclient + option init ntpclient + +config samba + option init samba diff --git a/libs/uci/root/sbin/luci-reload b/libs/uci/root/sbin/luci-reload new file mode 100755 index 000000000..cc621b2e9 --- /dev/null +++ b/libs/uci/root/sbin/luci-reload @@ -0,0 +1,32 @@ +#!/bin/sh +. /etc/functions.sh + +apply_config() { + config_get init "$1" init + config_get exec "$1" exec + + [ -n "$init" ] && reload_init "$2" "$init" + [ -n "$exec" ] && reload_exec "$2" "$exec" +} + +reload_exec() { + [ -x $2 ] && { + echo "Reloading $1... " + $2 >/dev/null 2>&1 || echo "!!! Failed to reload $1 !!!" + } +} + +reload_init() { + [ -x /etc/init.d/$2 ] && /etc/init.d/$2 enabled && { + echo "Reloading $1... " + /etc/init.d/$2 reload >/dev/null 2>&1 || echo "!!! Failed to reload $1 !!!" + } +} + +config_load ucitrack + +for i in $* +do + config_foreach apply_config $i $i + echo "done." +done \ No newline at end of file diff --git a/libs/web/root/etc/config/luci b/libs/web/root/etc/config/luci index 02e54c413..b9efff35d 100644 --- a/libs/web/root/etc/config/luci +++ b/libs/web/root/etc/config/luci @@ -18,24 +18,6 @@ config extern flash_keep option httpd "/etc/httpd.conf" option firewall "/etc/firewall.user" -config event uci_oncommit - option network "/sbin/luci-reload network firewall dnsmasq luci_splash" - option wireless "/sbin/luci-reload network firewall dnsmasq luci_splash" - option olsr "/sbin/luci-reload olsrd" - option dhcp "/sbin/luci-reload dnsmasq" - option dropbear "/sbin/luci-reload dropbear" - option httpd "/sbin/luci-reload httpd" - option fstab "/sbin/luci-reload fstab" - option qos "/sbin/luci-reload qos" - option system "/sbin/luci-reload led" - option firewall "/sbin/luci-reload firewall luci_splash" - option luci_hosts "/sbin/luci-reload luci_hosts dnsmasq" - option luci_ethers "/sbin/luci-reload luci_ethers dnsmasq" - option luci_splash "/sbin/luci-reload firewall luci_splash" - option upnpd "/etc/init.d/miniupnpd enabled && /sbin/luci-reload miniupnpd || /etc/init.d/miniupnpd stop" - option ntpclient "/sbin/luci-reload ntpclient" - option samba "/sbin/luci-reload samba" - config internal languages config internal sauth diff --git a/modules/admin-full/luasrc/controller/admin/system.lua b/modules/admin-full/luasrc/controller/admin/system.lua index 6cf951a15..5d64336e0 100644 --- a/modules/admin-full/luasrc/controller/admin/system.lua +++ b/modules/admin-full/luasrc/controller/admin/system.lua @@ -182,7 +182,7 @@ end function action_upgrade() require("luci.model.uci") - local ret = nil + local ret local plat = luci.fs.mtime("/lib/upgrade/platform.sh") local tmpfile = "/tmp/firmware.img" local broadcom = os.execute('grep brcm_ /lib/upgrade/platform.sh >/dev/null 2>&1') == 0 @@ -208,7 +208,9 @@ function action_upgrade() local keepcfg = keep_avail and luci.http.formvalue("keepcfg") if plat and fname then - ret = luci.sys.flash(tmpfile, keepcfg and _keep_pattern()) + ret = function() + return luci.sys.flash(tmpfile, keepcfg and _keep_pattern()) + end end luci.template.render("admin_system/upgrade", {sysupgrade=plat, ret=ret, keep_avail=keep_avail}) @@ -224,4 +226,4 @@ function _keep_pattern() end end return kpattern -end \ No newline at end of file +end diff --git a/modules/admin-full/luasrc/controller/admin/uci.lua b/modules/admin-full/luasrc/controller/admin/uci.lua index 88c37d650..53b3464f6 100644 --- a/modules/admin-full/luasrc/controller/admin/uci.lua +++ b/modules/admin-full/luasrc/controller/admin/uci.lua @@ -24,27 +24,23 @@ function index() end function convert_changes(changes) - local ret = {} + local util = require "luci.util" + + local ret for r, tbl in pairs(changes) do for s, os in pairs(tbl) do for o, v in pairs(os) do - local val, str - if (v == "") then - str = "-" - val = "" - else - str = "" - val = "="..luci.util.pcdata(v) - end - str = r.."."..s - if o ~= ".type" then - str = str.."."..o - end - table.insert(ret, str..val) + ret = (ret and ret.."\n" or "") .. "%s%s.%s%s%s" % { + v == "" and "-" or "", + r, + s, + o ~= ".type" and "."..o or "", + v ~= "" and "="..util.pcdata(v) or "" + } end end end - return table.concat(ret, "\n") + return ret end function action_changes() @@ -54,52 +50,38 @@ end function action_apply() local path = luci.dispatcher.context.path - - local output = "" local uci = luci.model.uci.cursor() local changes = uci:changes() - - if changes then - local com = {} - local run = {} - - -- Collect files to be applied and commit changes - for r, tbl in pairs(changes) do - if r then - if path[#path] ~= "apply" then - uci:load(r) - uci:commit(r) - uci:unload(r) - end - if luci.config.uci_oncommit and luci.config.uci_oncommit[r] then - run[luci.config.uci_oncommit[r]] = true - end - end - end - - -- Search for post-commit commands - for cmd, i in pairs(run) do - output = output .. cmd .. ":\n" .. luci.util.exec(cmd) .. "\n" + local reload = {} + + -- Collect files to be applied and commit changes + for r, tbl in pairs(changes) do + table.insert(reload, r) + if path[#path] ~= "apply" then + uci:load(r) + uci:commit(r) + uci:unload(r) end end + local function _reload() + local cmd = uci:apply(reload, true) + return io.popen(cmd) + end - luci.template.render("admin_uci/apply", {changes=convert_changes(changes), output=output}) + luci.template.render("admin_uci/apply", {changes=convert_changes(changes), reload=_reload}) end function action_revert() local uci = luci.model.uci.cursor() local changes = uci:changes() - if changes then - local revert = {} - - -- Collect files to be reverted - for r, tbl in pairs(changes) do - uci:load(r) - uci:revert(r) - uci:unload(r) - end + + -- Collect files to be reverted + for r, tbl in pairs(changes) do + uci:load(r) + uci:revert(r) + uci:unload(r) end luci.template.render("admin_uci/revert", {changes=convert_changes(changes)}) diff --git a/modules/admin-full/luasrc/view/admin_system/upgrade.htm b/modules/admin-full/luasrc/view/admin_system/upgrade.htm index e0fbb9332..a3d97d649 100644 --- a/modules/admin-full/luasrc/view/admin_system/upgrade.htm +++ b/modules/admin-full/luasrc/view/admin_system/upgrade.htm @@ -34,7 +34,13 @@ $Id$ <% elseif ret then %> - <% if ret == 0 then %> +

<%:a_s_flash_received%>

+

<%:a_s_flash_inprogress%>

+ + + <% %> + <% local ret = ret() + if ret == 0 then %>
<%:a_s_flash_flashed%>
<% else %>
<%:a_s_flash_flasherr%>! (<%:code%> <%=ret%>)
@@ -42,4 +48,5 @@ $Id$ <% else %>
<%:a_s_flash_notimplemented%>
<% end %> -<%+footer%> \ No newline at end of file +<%+footer%> +<% if ret == 0 then luci.sys.reboot() end %> diff --git a/modules/admin-full/luasrc/view/admin_uci/apply.htm b/modules/admin-full/luasrc/view/admin_uci/apply.htm index e28094728..9a9a063f1 100644 --- a/modules/admin-full/luasrc/view/admin_uci/apply.htm +++ b/modules/admin-full/luasrc/view/admin_uci/apply.htm @@ -16,5 +16,14 @@ $Id$

<%:config%>

<%:uci_applied%>:

<%=(changes or "-")%> -<%=output%> + +<% +local fp = reload() +local line = fp:read() +while line do + write(line.."\n") + line = fp:read() +end +fp:close() +%> <%+footer%> \ No newline at end of file diff --git a/modules/admin-mini/luasrc/controller/mini/system.lua b/modules/admin-mini/luasrc/controller/mini/system.lua index c3910a302..6d16ef865 100644 --- a/modules/admin-mini/luasrc/controller/mini/system.lua +++ b/modules/admin-mini/luasrc/controller/mini/system.lua @@ -105,7 +105,9 @@ function action_upgrade() local keepcfg = keep_avail and luci.http.formvalue("keepcfg") if plat and fname then - ret = luci.sys.flash(tmpfile, keepcfg and _keep_pattern()) + ret = function() + return luci.sys.flash(tmpfile, keepcfg and _keep_pattern()) + end end luci.template.render("mini/upgrade", {sysupgrade=plat, ret=ret, keep_avail=keep_avail}) @@ -121,4 +123,4 @@ function _keep_pattern() end end return kpattern -end \ No newline at end of file +end diff --git a/modules/admin-mini/luasrc/controller/mini/uci.lua b/modules/admin-mini/luasrc/controller/mini/uci.lua index a5b3402ad..4e920563a 100644 --- a/modules/admin-mini/luasrc/controller/mini/uci.lua +++ b/modules/admin-mini/luasrc/controller/mini/uci.lua @@ -20,31 +20,27 @@ function index() entry({"mini", "uci"}, nil, i18n("config")) entry({"mini", "uci", "changes"}, call("action_changes"), i18n("changes"), 30) entry({"mini", "uci", "revert"}, call("action_revert"), i18n("revert"), 20) - entry({"mini", "uci", "apply"}, call("action_apply"), i18n("saveapply"), 10) + entry({"mini", "uci", "saveapply"}, call("action_apply"), i18n("saveapply"), 10) end function convert_changes(changes) - local ret = {} + local util = require "luci.util" + + local ret for r, tbl in pairs(changes) do for s, os in pairs(tbl) do for o, v in pairs(os) do - local val, str - if (v == "") then - str = "-" - val = "" - else - str = "" - val = "="..luci.util.pcdata(v) - end - str = r.."."..s - if o ~= ".type" then - str = str.."."..o - end - table.insert(ret, str..val) + ret = (ret and ret.."\n" or "") .. "%s%s.%s%s%s" % { + v == "" and "-" or "", + r, + s, + o ~= ".type" and "."..o or "", + v ~= "" and "="..util.pcdata(v) or "" + } end end end - return table.concat(ret, "\n") + return ret end function action_changes() @@ -53,49 +49,37 @@ function action_changes() end function action_apply() + local path = luci.dispatcher.context.path local uci = luci.model.uci.cursor() local changes = uci:changes() - local output = "" - - if changes then - local com = {} - local run = {} - - -- Collect files to be applied and commit changes - for r, tbl in pairs(changes) do - if r then - uci:load(r) - uci:commit(r) - uci:unload(r) - if luci.config.uci_oncommit and luci.config.uci_oncommit[r] then - run[luci.config.uci_oncommit[r]] = true - end - end - end - - -- Search for post-commit commands - for cmd, i in pairs(run) do - output = output .. cmd .. ":\n" .. luci.util.exec(cmd) .. "\n" - end + local reload = {} + + -- Collect files to be applied and commit changes + for r, tbl in pairs(changes) do + table.insert(reload, r) + uci:load(r) + uci:commit(r) + uci:unload(r) end - - luci.template.render("mini/uci_apply", {changes=convert_changes(changes), output=output}) + local function _reload() + local cmd = uci:apply(reload, true) + return io.popen(cmd) + end + + luci.template.render("mini/uci_apply", {changes=convert_changes(changes), reload=_reload}) end function action_revert() local uci = luci.model.uci.cursor() local changes = uci:changes() - if changes then - local revert = {} - - -- Collect files to be reverted - for r, tbl in pairs(changes) do - uci:load(r) - uci:revert(r) - uci:unload(r) - end + + -- Collect files to be reverted + for r, tbl in pairs(changes) do + uci:load(r) + uci:revert(r) + uci:unload(r) end luci.template.render("mini/uci_revert", {changes=convert_changes(changes)}) diff --git a/modules/admin-mini/luasrc/view/mini/uci_apply.htm b/modules/admin-mini/luasrc/view/mini/uci_apply.htm index e28094728..9a9a063f1 100644 --- a/modules/admin-mini/luasrc/view/mini/uci_apply.htm +++ b/modules/admin-mini/luasrc/view/mini/uci_apply.htm @@ -16,5 +16,14 @@ $Id$

<%:config%>

<%:uci_applied%>:

<%=(changes or "-")%> -<%=output%> + +<% +local fp = reload() +local line = fp:read() +while line do + write(line.."\n") + line = fp:read() +end +fp:close() +%> <%+footer%> \ No newline at end of file diff --git a/modules/admin-mini/luasrc/view/mini/upgrade.htm b/modules/admin-mini/luasrc/view/mini/upgrade.htm index e0fbb9332..a3d97d649 100644 --- a/modules/admin-mini/luasrc/view/mini/upgrade.htm +++ b/modules/admin-mini/luasrc/view/mini/upgrade.htm @@ -34,7 +34,13 @@ $Id$ <% elseif ret then %> - <% if ret == 0 then %> +

<%:a_s_flash_received%>

+

<%:a_s_flash_inprogress%>

+ + + <% %> + <% local ret = ret() + if ret == 0 then %>
<%:a_s_flash_flashed%>
<% else %>
<%:a_s_flash_flasherr%>! (<%:code%> <%=ret%>)
@@ -42,4 +48,5 @@ $Id$ <% else %>
<%:a_s_flash_notimplemented%>
<% end %> -<%+footer%> \ No newline at end of file +<%+footer%> +<% if ret == 0 then luci.sys.reboot() end %> -- 2.25.1