Rewrote UCI apply logic

This commit is contained in:
Steven Barth 2008-09-06 13:51:51 +00:00
parent 8e00d27ae7
commit dbde0216c2
13 changed files with 226 additions and 139 deletions

View file

@ -1,4 +1,7 @@
#!/bin/sh #!/bin/sh
uci set luci.uci_oncommit.luci_statistics='/etc/init.d/luci_statistics restart' uci batch <<-EOF
uci commit luci add ucitrack luci_statistics
set ucitrack.@luci_statistics[-1].init=luci_statistics
commit ucitrack
EOF

View file

@ -1,4 +1,7 @@
#!/bin/sh #!/bin/sh
uci set luci.uci_oncommit.uvc_streamer='/sbin/luci-reload uvc-streamer' uci batch <<-EOF
uci commit luci add ucitrack uvc-streamer
set ucitrack.@uvc-streamer[-1].init=uvc-streamer
commit ucitrack
EOF

View file

@ -30,7 +30,6 @@ define Package/luci-addons/install
$(INSTALL_BIN) ./dist/usr/bin/run-parts $(1)/usr/bin $(INSTALL_BIN) ./dist/usr/bin/run-parts $(1)/usr/bin
$(INSTALL_BIN) ./dist/sbin/luci-flash $(1)/sbin $(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_fixtime $(1)/etc/init.d
$(INSTALL_BIN) ./dist/etc/init.d/luci_ethers $(1)/etc/init.d $(INSTALL_BIN) ./dist/etc/init.d/luci_ethers $(1)/etc/init.d

View file

@ -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

View file

@ -248,11 +248,11 @@ function Map.parse(self, ...)
if luci.http.formvalue("cbi.apply") then if luci.http.formvalue("cbi.apply") then
for i, config in ipairs(self.parsechain) do for i, config in ipairs(self.parsechain) do
self.uci:commit(config) self.uci:commit(config)
self.uci:apply(config)
-- Refresh data because commit changes section names -- Refresh data because commit changes section names
self.uci:load(config) self.uci:load(config)
end end
self.uci:apply(self.parsechain)
-- Reparse sections -- Reparse sections
Node.parse(self, ...) Node.parse(self, ...)

View file

@ -54,14 +54,17 @@ end
local Cursor = getmetatable(cursor()) local Cursor = getmetatable(cursor())
--- Applies the new config --- Applies UCI configuration changes
-- @param config UCI config -- @param configlist List of UCI configurations
function Cursor.apply(self, config) -- @param command Don't apply only return the command
local conf = require "luci.config" function Cursor.apply(self, configlist, command)
return conf.uci_oncommit[config] and configlist = self:_affected(configlist)
os.execute(conf.uci_oncommit[config] .. " >/dev/null 2>&1") local reloadcmd = "/sbin/luci-reload " .. table.concat(configlist, " ")
return command and reloadcmd or os.execute(reloadcmd .. " >/dev/null 2>&1")
end end
--- Delete all sections of a given type that match certain criteria. --- Delete all sections of a given type that match certain criteria.
-- @param config UCI config -- @param config UCI config
-- @param type UCI section type -- @param type UCI section type
@ -180,6 +183,51 @@ function Cursor.changes(self, config)
end 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. --- Add an anonymous section.
-- @class function -- @class function
-- @name Cursor.add -- @name Cursor.add

View file

@ -0,0 +1,47 @@
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_splash
option init luci_splash
config upnpd
option init miniupnpd
config ntpclient
option init ntpclient
config samba
option init samba

View file

@ -0,0 +1,31 @@
#!/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 -n "Reloading $1... "
$2 >/dev/null 2>&1 && echo "done." || echo "failed!"
}
}
reload_init() {
[ -x /etc/init.d/$2 ] && /etc/init.d/$2 enabled && {
echo -n "Reloading $1... "
/etc/init.d/$2 reload >/dev/null 2>&1 && echo "done." || echo "failed!"
}
}
config_load ucitrack
for i in $*
do
config_foreach apply_config $i
done

View file

@ -17,24 +17,7 @@ config extern flash_keep
option ipkg "/etc/ipkg.conf" option ipkg "/etc/ipkg.conf"
option httpd "/etc/httpd.conf" option httpd "/etc/httpd.conf"
option firewall "/etc/firewall.user" 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_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 languages
config internal sauth config internal sauth

View file

@ -24,27 +24,23 @@ function index()
end end
function convert_changes(changes) function convert_changes(changes)
local ret = {} local util = require "luci.util"
local ret
for r, tbl in pairs(changes) do for r, tbl in pairs(changes) do
for s, os in pairs(tbl) do for s, os in pairs(tbl) do
for o, v in pairs(os) do for o, v in pairs(os) do
local val, str ret = (ret and ret.."\n" or "") .. "%s%s.%s%s%s" % {
if (v == "") then v == "" and "-" or "",
str = "-" r,
val = "" s,
else o ~= ".type" and "."..o or "",
str = "" v ~= "" and "="..util.pcdata(v) or ""
val = "="..luci.util.pcdata(v) }
end
str = r.."."..s
if o ~= ".type" then
str = str.."."..o
end
table.insert(ret, str..val)
end end
end end
end end
return table.concat(ret, "\n") return ret
end end
function action_changes() function action_changes()
@ -54,52 +50,38 @@ end
function action_apply() function action_apply()
local path = luci.dispatcher.context.path local path = luci.dispatcher.context.path
local output = ""
local uci = luci.model.uci.cursor() local uci = luci.model.uci.cursor()
local changes = uci:changes() local changes = uci:changes()
local reload = {}
if changes then
local com = {} -- Collect files to be applied and commit changes
local run = {} for r, tbl in pairs(changes) do
table.insert(reload, r)
-- Collect files to be applied and commit changes if path[#path] ~= "apply" then
for r, tbl in pairs(changes) do uci:load(r)
if r then uci:commit(r)
if path[#path] ~= "apply" then uci:unload(r)
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"
end end
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 end
function action_revert() function action_revert()
local uci = luci.model.uci.cursor() local uci = luci.model.uci.cursor()
local changes = uci:changes() local changes = uci:changes()
if changes then
local revert = {} -- Collect files to be reverted
for r, tbl in pairs(changes) do
-- Collect files to be reverted uci:load(r)
for r, tbl in pairs(changes) do uci:revert(r)
uci:load(r) uci:unload(r)
uci:revert(r)
uci:unload(r)
end
end end
luci.template.render("admin_uci/revert", {changes=convert_changes(changes)}) luci.template.render("admin_uci/revert", {changes=convert_changes(changes)})

View file

@ -16,5 +16,13 @@ $Id$
<h1><%:config%></h1> <h1><%:config%></h1>
<p><%:uci_applied%>:</p> <p><%:uci_applied%>:</p>
<code><%=(changes or "-")%> <code><%=(changes or "-")%>
<%=output%></code> <%
local fp = reload()
local line = fp:read()
while line do
write(line.."\n")
line = fp:read()
end
fp:close()
%></code>
<%+footer%> <%+footer%>

View file

@ -20,31 +20,27 @@ function index()
entry({"mini", "uci"}, nil, i18n("config")) entry({"mini", "uci"}, nil, i18n("config"))
entry({"mini", "uci", "changes"}, call("action_changes"), i18n("changes"), 30) entry({"mini", "uci", "changes"}, call("action_changes"), i18n("changes"), 30)
entry({"mini", "uci", "revert"}, call("action_revert"), i18n("revert"), 20) 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 end
function convert_changes(changes) function convert_changes(changes)
local ret = {} local util = require "luci.util"
local ret
for r, tbl in pairs(changes) do for r, tbl in pairs(changes) do
for s, os in pairs(tbl) do for s, os in pairs(tbl) do
for o, v in pairs(os) do for o, v in pairs(os) do
local val, str ret = (ret and ret.."\n" or "") .. "%s%s.%s%s%s" % {
if (v == "") then v == "" and "-" or "",
str = "-" r,
val = "" s,
else o ~= ".type" and "."..o or "",
str = "" v ~= "" and "="..util.pcdata(v) or ""
val = "="..luci.util.pcdata(v) }
end
str = r.."."..s
if o ~= ".type" then
str = str.."."..o
end
table.insert(ret, str..val)
end end
end end
end end
return table.concat(ret, "\n") return ret
end end
function action_changes() function action_changes()
@ -53,49 +49,37 @@ function action_changes()
end end
function action_apply() function action_apply()
local path = luci.dispatcher.context.path
local uci = luci.model.uci.cursor() local uci = luci.model.uci.cursor()
local changes = uci:changes() local changes = uci:changes()
local output = "" local reload = {}
if changes then -- Collect files to be applied and commit changes
local com = {} for r, tbl in pairs(changes) do
local run = {} table.insert(reload, r)
uci:load(r)
-- Collect files to be applied and commit changes uci:commit(r)
for r, tbl in pairs(changes) do uci:unload(r)
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
end end
local function _reload()
luci.template.render("mini/uci_apply", {changes=convert_changes(changes), output=output}) local cmd = uci:apply(reload, true)
return io.popen(cmd)
end
luci.template.render("mini/uci_apply", {changes=convert_changes(changes), reload=_reload})
end end
function action_revert() function action_revert()
local uci = luci.model.uci.cursor() local uci = luci.model.uci.cursor()
local changes = uci:changes() local changes = uci:changes()
if changes then
local revert = {} -- Collect files to be reverted
for r, tbl in pairs(changes) do
-- Collect files to be reverted uci:load(r)
for r, tbl in pairs(changes) do uci:revert(r)
uci:load(r) uci:unload(r)
uci:revert(r)
uci:unload(r)
end
end end
luci.template.render("mini/uci_revert", {changes=convert_changes(changes)}) luci.template.render("mini/uci_revert", {changes=convert_changes(changes)})

View file

@ -16,5 +16,13 @@ $Id$
<h1><%:config%></h1> <h1><%:config%></h1>
<p><%:uci_applied%>:</p> <p><%:uci_applied%>:</p>
<code><%=(changes or "-")%> <code><%=(changes or "-")%>
<%=output%></code> <%
local fp = reload()
local line = fp:read()
while line do
write(line.."\n")
line = fp:read()
end
fp:close()
%></code>
<%+footer%> <%+footer%>