Backported UCI-Dependency Tracking and Responsiveness Improvements

This commit is contained in:
Steven Barth
2008-09-07 14:17:29 +00:00
parent 0d12944af5
commit 37b79596bb
27 changed files with 305 additions and 148 deletions

View File

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

View File

@@ -16,6 +16,19 @@ $Id$
<div class="cbi-map" id="cbi-<%=self.config%>">
<h1><%=self.title%></h1>
<div class="cbi-map-descr"><%=self.description%></div>
<%- if self._apply then -%><code><%: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()
-%>
</code><%- end -%>
<%- self:render_children() %>
<br />
</div>

View File

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

View File

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

32
libs/uci/root/sbin/luci-reload Executable file
View File

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

View File

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