mirror of
https://github.com/openwrt/luci.git
synced 2026-04-15 19:01:56 +00:00
Backported UCI-Dependency Tracking and Responsiveness Improvements
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
50
libs/uci/root/etc/config/ucitrack
Normal file
50
libs/uci/root/etc/config/ucitrack
Normal 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
32
libs/uci/root/sbin/luci-reload
Executable 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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user