Fixed a design flaw in luci.model.uci
This commit is contained in:
parent
746fa9df8f
commit
75d4cca7ae
13 changed files with 94 additions and 57 deletions
|
@ -4,7 +4,7 @@ require("socket")
|
||||||
require("luci.ip")
|
require("luci.ip")
|
||||||
require("luci.model.uci")
|
require("luci.model.uci")
|
||||||
|
|
||||||
luci.model.uci.set_savedir(luci.model.uci.savedir_state)
|
luci.model.uci.load_state("network")
|
||||||
|
|
||||||
local server = socket.bind("0.0.0.0", arg[1] or 8082)
|
local server = socket.bind("0.0.0.0", arg[1] or 8082)
|
||||||
server:settimeout(0, "t")
|
server:settimeout(0, "t")
|
||||||
|
|
|
@ -5,7 +5,7 @@ require("luci.util")
|
||||||
require("luci.model.uci")
|
require("luci.model.uci")
|
||||||
|
|
||||||
-- Init state session
|
-- Init state session
|
||||||
luci.model.uci.set_savedir(luci.model.uci.savedir_state)
|
luci.model.uci.load_state("luci_splash")
|
||||||
local uci = luci.model.uci
|
local uci = luci.model.uci
|
||||||
|
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@ function add_lease(mac)
|
||||||
})
|
})
|
||||||
add_rule(mac)
|
add_rule(mac)
|
||||||
|
|
||||||
uci.save()
|
uci.save_state("luci_splash")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ function remove_lease(mac)
|
||||||
uci.delete("luci_splash", j)
|
uci.delete("luci_splash", j)
|
||||||
end
|
end
|
||||||
|
|
||||||
uci.save()
|
uci.save_state("luci_splash")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
@ -156,7 +156,7 @@ function sync()
|
||||||
local leasetime = tonumber(uci.get("luci_splash", "general", "leasetime")) * 3600
|
local leasetime = tonumber(uci.get("luci_splash", "general", "leasetime")) * 3600
|
||||||
|
|
||||||
-- Clean state file
|
-- Clean state file
|
||||||
uci.load("luci_splash")
|
uci.load_state("luci_splash")
|
||||||
uci.revert("luci_splash")
|
uci.revert("luci_splash")
|
||||||
|
|
||||||
|
|
||||||
|
@ -185,7 +185,7 @@ function sync()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
uci.save("luci_splash")
|
uci.save_state("luci_splash")
|
||||||
end
|
end
|
||||||
|
|
||||||
main(arg)
|
main(arg)
|
|
@ -157,7 +157,7 @@ function Map.__init__(self, config, ...)
|
||||||
self.config = config
|
self.config = config
|
||||||
self.parsechain = {self.config}
|
self.parsechain = {self.config}
|
||||||
self.template = "cbi/map"
|
self.template = "cbi/map"
|
||||||
if not uci.load(self.config) then
|
if not uci.load_config(self.config) then
|
||||||
error("Unable to read UCI data: " .. self.config)
|
error("Unable to read UCI data: " .. self.config)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -170,9 +170,16 @@ end
|
||||||
|
|
||||||
-- Use optimized UCI writing
|
-- Use optimized UCI writing
|
||||||
function Map.parse(self, ...)
|
function Map.parse(self, ...)
|
||||||
|
if self.stateful then
|
||||||
|
uci.load_state(self.config)
|
||||||
|
else
|
||||||
|
uci.load_config(self.config)
|
||||||
|
end
|
||||||
|
|
||||||
Node.parse(self, ...)
|
Node.parse(self, ...)
|
||||||
|
|
||||||
for i, config in ipairs(self.parsechain) do
|
for i, config in ipairs(self.parsechain) do
|
||||||
uci.save(config)
|
uci.save_config(config)
|
||||||
end
|
end
|
||||||
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
|
||||||
|
@ -182,8 +189,7 @@ function Map.parse(self, ...)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Refresh data because commit changes section names
|
-- Refresh data because commit changes section names
|
||||||
uci.unload(config)
|
uci.load_config(config)
|
||||||
uci.load(config)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Reparse sections
|
-- Reparse sections
|
||||||
|
@ -240,11 +246,6 @@ function Map.get(self, section, option)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- UCI stateget
|
|
||||||
function Map.stateget(self, section, option)
|
|
||||||
return uci.get_statevalue(self.config, section, option)
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
--[[
|
--[[
|
||||||
Page - A simple node
|
Page - A simple node
|
||||||
|
@ -705,7 +706,6 @@ function AbstractValue.__init__(self, map, option, ...)
|
||||||
self.default = nil
|
self.default = nil
|
||||||
self.size = nil
|
self.size = nil
|
||||||
self.optional = false
|
self.optional = false
|
||||||
self.stateful = false
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Add a dependencie to another section field
|
-- Add a dependencie to another section field
|
||||||
|
@ -789,9 +789,7 @@ end
|
||||||
|
|
||||||
-- Return the UCI value of this object
|
-- Return the UCI value of this object
|
||||||
function AbstractValue.cfgvalue(self, section)
|
function AbstractValue.cfgvalue(self, section)
|
||||||
return self.stateful
|
return self.map:get(section, self.option)
|
||||||
and self.map:stateget(section, self.option)
|
|
||||||
or self.map:get(section, self.option)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Validate the form value
|
-- Validate the form value
|
||||||
|
|
|
@ -79,15 +79,46 @@ function section(config, type, name, values)
|
||||||
return stat and name
|
return stat and name
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Get a certain state value.
|
--- Savely load the configuration.
|
||||||
-- @param ... Parameters passed to function get
|
-- @param config Configuration to load
|
||||||
-- @return UCI value
|
-- @return Sucess status
|
||||||
-- @see get
|
-- @see load_state
|
||||||
function get_statevalue(...)
|
-- @see load
|
||||||
set_savedir(savedir_state)
|
function load_config(...)
|
||||||
local result = get(...)
|
set_confdir(confdir_default)
|
||||||
set_savedir(savedir_default)
|
set_savedir(savedir_default)
|
||||||
return result
|
return load(...)
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Savely load state values.
|
||||||
|
-- @param config Configuration to load
|
||||||
|
-- @return Sucess status
|
||||||
|
-- @see load_config
|
||||||
|
-- @see load
|
||||||
|
function load_state(config)
|
||||||
|
set_confdir(confdir_default)
|
||||||
|
set_savedir(savedir_state)
|
||||||
|
return load(config)
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Save changes to config values.
|
||||||
|
-- @param config Configuration to save
|
||||||
|
-- @return Sucess status
|
||||||
|
-- @see save_state
|
||||||
|
-- @see save
|
||||||
|
function save_config(config)
|
||||||
|
set_savedir(savedir_default)
|
||||||
|
return save(config)
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Save changes to state values.
|
||||||
|
-- @param config Configuration to save
|
||||||
|
-- @return Sucess status
|
||||||
|
-- @see save_config
|
||||||
|
-- @see save
|
||||||
|
function save_state(config)
|
||||||
|
set_savedir(savedir_state)
|
||||||
|
return save(config)
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Updated the data of a section using data from a table.
|
--- Updated the data of a section using data from a table.
|
||||||
|
@ -157,10 +188,13 @@ end
|
||||||
-- @return Table of UCI sections or table of UCI values
|
-- @return Table of UCI sections or table of UCI values
|
||||||
|
|
||||||
--- Manually load a config.
|
--- Manually load a config.
|
||||||
|
-- Warning: This function is unsave! You should use load_config or load_state if possible.
|
||||||
-- @class function
|
-- @class function
|
||||||
-- @name load
|
-- @name load
|
||||||
-- @param config UCI config
|
-- @param config UCI config
|
||||||
-- @return Boolean whether operation succeeded
|
-- @return Boolean whether operation succeeded
|
||||||
|
-- @see load_config
|
||||||
|
-- @see load_state
|
||||||
-- @see save
|
-- @see save
|
||||||
-- @see unload
|
-- @see unload
|
||||||
|
|
||||||
|
@ -180,6 +214,7 @@ end
|
||||||
-- @see unload
|
-- @see unload
|
||||||
|
|
||||||
--- Set a value or create a named section.
|
--- Set a value or create a named section.
|
||||||
|
-- Warning: This function is unsave! You should use save_config or save_state if possible.
|
||||||
-- @class function
|
-- @class function
|
||||||
-- @name set
|
-- @name set
|
||||||
-- @param config UCI config
|
-- @param config UCI config
|
||||||
|
|
|
@ -69,8 +69,7 @@ end
|
||||||
-- @return String containing the reason for errors (if any)
|
-- @return String containing the reason for errors (if any)
|
||||||
function UVL.validate( self, config )
|
function UVL.validate( self, config )
|
||||||
|
|
||||||
self.uci.set_confdir( self.uci.confdir_default )
|
self.uci.load_config( config )
|
||||||
self.uci.load( config )
|
|
||||||
self.beenthere = { }
|
self.beenthere = { }
|
||||||
|
|
||||||
local co = self.uci.get_all( config )
|
local co = self.uci.get_all( config )
|
||||||
|
@ -109,8 +108,7 @@ function UVL.validate( self, config )
|
||||||
end
|
end
|
||||||
|
|
||||||
function UVL.validate_section( self, config, section )
|
function UVL.validate_section( self, config, section )
|
||||||
self.uci.set_confdir( self.uci.confdir_default )
|
self.uci.load_config( config )
|
||||||
self.uci.load( config )
|
|
||||||
self.beenthere = { }
|
self.beenthere = { }
|
||||||
|
|
||||||
local co = self.uci.get_all( config )
|
local co = self.uci.get_all( config )
|
||||||
|
@ -125,8 +123,7 @@ function UVL.validate_section( self, config, section )
|
||||||
end
|
end
|
||||||
|
|
||||||
function UVL.validate_option( self, config, section, option )
|
function UVL.validate_option( self, config, section, option )
|
||||||
self.uci.set_confdir( self.uci.confdir_default )
|
self.uci.load_config( config )
|
||||||
self.uci.load( config )
|
|
||||||
self.beenthere = { }
|
self.beenthere = { }
|
||||||
|
|
||||||
local co = self.uci.get_all( config )
|
local co = self.uci.get_all( config )
|
||||||
|
|
|
@ -57,10 +57,11 @@ function date_format(secs)
|
||||||
end
|
end
|
||||||
|
|
||||||
function network_get_addresses(net)
|
function network_get_addresses(net)
|
||||||
|
luci.model.uci.load_state("network")
|
||||||
local addr = {}
|
local addr = {}
|
||||||
local ipv4 = luci.model.uci.get_statevalue("network", net, "ipaddr")
|
local ipv4 = luci.model.uci.get("network", net, "ipaddr")
|
||||||
local mav4 = luci.model.uci.get_statevalue("network", net, "netmask")
|
local mav4 = luci.model.uci.get("network", net, "netmask")
|
||||||
local ipv6 = luci.model.uci.get_statevalue("network", net, "ip6addr")
|
local ipv6 = luci.model.uci.get("network", net, "ip6addr")
|
||||||
|
|
||||||
if ipv4 and mav4 then
|
if ipv4 and mav4 then
|
||||||
ipv4 = luci.ip.IPv4(ipv4, mav4)
|
ipv4 = luci.ip.IPv4(ipv4, mav4)
|
||||||
|
@ -113,7 +114,7 @@ function cbi_add_knownips(field)
|
||||||
end
|
end
|
||||||
|
|
||||||
function network_get_zones(net)
|
function network_get_zones(net)
|
||||||
if not luci.model.uci.load("firewall") then
|
if not luci.model.uci.load_state("firewall") then
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -146,11 +147,12 @@ function firewall_find_zone(name)
|
||||||
end
|
end
|
||||||
|
|
||||||
function iface_get_network(iface)
|
function iface_get_network(iface)
|
||||||
|
luci.model.uci.load_state("network")
|
||||||
local net
|
local net
|
||||||
|
|
||||||
luci.model.uci.foreach("network", "interface",
|
luci.model.uci.foreach("network", "interface",
|
||||||
function (section)
|
function (section)
|
||||||
local ifname = luci.model.uci.get_statevalue(
|
local ifname = luci.model.uci.get(
|
||||||
"network", section[".name"], "ifname"
|
"network", section[".name"], "ifname"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,7 @@ function action_apply()
|
||||||
for r, tbl in pairs(changes) do
|
for r, tbl in pairs(changes) do
|
||||||
if r then
|
if r then
|
||||||
if path[#path] ~= "apply" then
|
if path[#path] ~= "apply" then
|
||||||
luci.model.uci.load(r)
|
luci.model.uci.load_config(r)
|
||||||
luci.model.uci.commit(r)
|
luci.model.uci.commit(r)
|
||||||
luci.model.uci.unload(r)
|
luci.model.uci.unload(r)
|
||||||
end
|
end
|
||||||
|
@ -93,7 +93,7 @@ function action_revert()
|
||||||
|
|
||||||
-- Collect files to be reverted
|
-- Collect files to be reverted
|
||||||
for r, tbl in pairs(changes) do
|
for r, tbl in pairs(changes) do
|
||||||
luci.model.uci.load(r)
|
luci.model.uci.load_config(r)
|
||||||
luci.model.uci.revert(r)
|
luci.model.uci.revert(r)
|
||||||
luci.model.uci.unload(r)
|
luci.model.uci.unload(r)
|
||||||
end
|
end
|
||||||
|
|
|
@ -17,6 +17,7 @@ require("luci.tools.webadmin")
|
||||||
|
|
||||||
|
|
||||||
m = Map("network", translate("interfaces"))
|
m = Map("network", translate("interfaces"))
|
||||||
|
m.stateful = true
|
||||||
|
|
||||||
local created
|
local created
|
||||||
local netstat = luci.sys.net.deviceinfo()
|
local netstat = luci.sys.net.deviceinfo()
|
||||||
|
@ -44,14 +45,12 @@ function s.parse(self, ...)
|
||||||
end
|
end
|
||||||
|
|
||||||
up = s:option(Flag, "up")
|
up = s:option(Flag, "up")
|
||||||
up.stateful = true
|
|
||||||
function up.write(self, section, value)
|
function up.write(self, section, value)
|
||||||
local call = value == "1" and "ifdown" or "ifup"
|
local call = value == "1" and "ifdown" or "ifup"
|
||||||
os.execute(call .. " " .. section)
|
os.execute(call .. " " .. section)
|
||||||
end
|
end
|
||||||
|
|
||||||
ifname = s:option(DummyValue, "ifname", translate("device"))
|
ifname = s:option(DummyValue, "ifname", translate("device"))
|
||||||
ifname.stateful = true
|
|
||||||
ifname.titleref = luci.dispatcher.build_url("admin", "network", "vlan")
|
ifname.titleref = luci.dispatcher.build_url("admin", "network", "vlan")
|
||||||
|
|
||||||
if luci.model.uci.load("firewall") then
|
if luci.model.uci.load("firewall") then
|
||||||
|
@ -66,7 +65,7 @@ end
|
||||||
|
|
||||||
hwaddr = s:option(DummyValue, "_hwaddr")
|
hwaddr = s:option(DummyValue, "_hwaddr")
|
||||||
function hwaddr.cfgvalue(self, section)
|
function hwaddr.cfgvalue(self, section)
|
||||||
local ix = self.map:stateget(section, "ifname") or ""
|
local ix = self.map:get(section, "ifname") or ""
|
||||||
return luci.fs.readfile("/sys/class/net/" .. ix .. "/address") or "n/a"
|
return luci.fs.readfile("/sys/class/net/" .. ix .. "/address") or "n/a"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -81,7 +80,7 @@ end
|
||||||
txrx = s:option(DummyValue, "_txrx")
|
txrx = s:option(DummyValue, "_txrx")
|
||||||
|
|
||||||
function txrx.cfgvalue(self, section)
|
function txrx.cfgvalue(self, section)
|
||||||
local ix = self.map:stateget(section, "ifname")
|
local ix = self.map:get(section, "ifname")
|
||||||
|
|
||||||
local rx = netstat and netstat[ix] and netstat[ix][1]
|
local rx = netstat and netstat[ix] and netstat[ix][1]
|
||||||
rx = rx and luci.tools.webadmin.byte_format(tonumber(rx)) or "-"
|
rx = rx and luci.tools.webadmin.byte_format(tonumber(rx)) or "-"
|
||||||
|
@ -95,7 +94,7 @@ end
|
||||||
errors = s:option(DummyValue, "_err")
|
errors = s:option(DummyValue, "_err")
|
||||||
|
|
||||||
function errors.cfgvalue(self, section)
|
function errors.cfgvalue(self, section)
|
||||||
local ix = self.map:stateget(section, "ifname")
|
local ix = self.map:get(section, "ifname")
|
||||||
|
|
||||||
local rx = netstat and netstat[ix] and netstat[ix][3]
|
local rx = netstat and netstat[ix] and netstat[ix][3]
|
||||||
local tx = netstat and netstat[ix] and netstat[ix][11]
|
local tx = netstat and netstat[ix] and netstat[ix][11]
|
||||||
|
|
|
@ -63,7 +63,7 @@ function action_apply()
|
||||||
-- Collect files to be applied and commit changes
|
-- Collect files to be applied and commit changes
|
||||||
for r, tbl in pairs(changes) do
|
for r, tbl in pairs(changes) do
|
||||||
if r then
|
if r then
|
||||||
luci.model.uci.load(r)
|
luci.model.uci.load_config(r)
|
||||||
luci.model.uci.commit(r)
|
luci.model.uci.commit(r)
|
||||||
luci.model.uci.unload(r)
|
luci.model.uci.unload(r)
|
||||||
if luci.config.uci_oncommit and luci.config.uci_oncommit[r] then
|
if luci.config.uci_oncommit and luci.config.uci_oncommit[r] then
|
||||||
|
@ -90,7 +90,7 @@ function action_revert()
|
||||||
|
|
||||||
-- Collect files to be reverted
|
-- Collect files to be reverted
|
||||||
for r, tbl in pairs(changes) do
|
for r, tbl in pairs(changes) do
|
||||||
luci.model.uci.load(r)
|
luci.model.uci.load_config(r)
|
||||||
luci.model.uci.revert(r)
|
luci.model.uci.revert(r)
|
||||||
luci.model.uci.unload(r)
|
luci.model.uci.unload(r)
|
||||||
end
|
end
|
||||||
|
|
|
@ -47,6 +47,7 @@ f:field(DummyValue, "_uptime", translate("m_i_uptime")).value =
|
||||||
|
|
||||||
|
|
||||||
m = Map("network", translate("interfaces"))
|
m = Map("network", translate("interfaces"))
|
||||||
|
m.stateful = true
|
||||||
local netstat = luci.sys.net.deviceinfo()
|
local netstat = luci.sys.net.deviceinfo()
|
||||||
|
|
||||||
m.parse = function() end
|
m.parse = function() end
|
||||||
|
@ -60,21 +61,20 @@ end
|
||||||
|
|
||||||
hwaddr = s:option(DummyValue, "_hwaddr")
|
hwaddr = s:option(DummyValue, "_hwaddr")
|
||||||
function hwaddr.cfgvalue(self, section)
|
function hwaddr.cfgvalue(self, section)
|
||||||
local ix = self.map:stateget(section, "ifname") or ""
|
local ix = self.map:get(section, "ifname") or ""
|
||||||
return luci.fs.readfile("/sys/class/net/" .. ix .. "/address") or "n/a"
|
return luci.fs.readfile("/sys/class/net/" .. ix .. "/address") or "n/a"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
ipaddr = s:option(DummyValue, "ipaddr", translate("ipaddress"))
|
s:option(DummyValue, "ipaddr", translate("ipaddress"))
|
||||||
ipaddr.stateful = true
|
|
||||||
|
s:option(DummyValue, "netmask", translate("netmask"))
|
||||||
|
|
||||||
ipaddr = s:option(DummyValue, "netmask", translate("netmask"))
|
|
||||||
ipaddr.stateful = true
|
|
||||||
|
|
||||||
txrx = s:option(DummyValue, "_txrx")
|
txrx = s:option(DummyValue, "_txrx")
|
||||||
|
|
||||||
function txrx.cfgvalue(self, section)
|
function txrx.cfgvalue(self, section)
|
||||||
local ix = self.map:stateget(section, "ifname")
|
local ix = self.map:get(section, "ifname")
|
||||||
|
|
||||||
local rx = netstat and netstat[ix] and netstat[ix][1]
|
local rx = netstat and netstat[ix] and netstat[ix][1]
|
||||||
rx = rx and luci.tools.webadmin.byte_format(tonumber(rx)) or "-"
|
rx = rx and luci.tools.webadmin.byte_format(tonumber(rx)) or "-"
|
||||||
|
@ -88,7 +88,7 @@ end
|
||||||
errors = s:option(DummyValue, "_err")
|
errors = s:option(DummyValue, "_err")
|
||||||
|
|
||||||
function errors.cfgvalue(self, section)
|
function errors.cfgvalue(self, section)
|
||||||
local ix = self.map:stateget(section, "ifname")
|
local ix = self.map:get(section, "ifname")
|
||||||
|
|
||||||
local rx = netstat and netstat[ix] and netstat[ix][3]
|
local rx = netstat and netstat[ix] and netstat[ix][3]
|
||||||
local tx = netstat and netstat[ix] and netstat[ix][11]
|
local tx = netstat and netstat[ix] and netstat[ix][11]
|
||||||
|
|
|
@ -154,7 +154,9 @@ end
|
||||||
<%
|
<%
|
||||||
if tree.nodes[category] and tree.nodes[category].ucidata then
|
if tree.nodes[category] and tree.nodes[category].ucidata then
|
||||||
local ucic = 0
|
local ucic = 0
|
||||||
for i, j in pairs(require("luci.model.uci").changes()) do
|
require("luci.model.uci")
|
||||||
|
luci.model.uci.set_savedir(luci.model.uci.savedir_default)
|
||||||
|
for i, j in pairs(luci.model.uci.changes()) do
|
||||||
for k, l in pairs(j) do
|
for k, l in pairs(j) do
|
||||||
for m, n in pairs(l) do
|
for m, n in pairs(l) do
|
||||||
ucic = ucic + 1;
|
ucic = ucic + 1;
|
||||||
|
|
|
@ -161,7 +161,9 @@ end
|
||||||
<%
|
<%
|
||||||
if tree.nodes[category] and tree.nodes[category].ucidata then
|
if tree.nodes[category] and tree.nodes[category].ucidata then
|
||||||
local ucic = 0
|
local ucic = 0
|
||||||
for i, j in pairs(require("luci.model.uci").changes()) do
|
require("luci.model.uci")
|
||||||
|
luci.model.uci.set_savedir(luci.model.uci.savedir_default)
|
||||||
|
for i, j in pairs(luci.model.uci.changes()) do
|
||||||
for k, l in pairs(j) do
|
for k, l in pairs(j) do
|
||||||
for m, n in pairs(l) do
|
for m, n in pairs(l) do
|
||||||
ucic = ucic + 1;
|
ucic = ucic + 1;
|
||||||
|
|
|
@ -162,7 +162,9 @@ end
|
||||||
<%
|
<%
|
||||||
if tree.nodes[category] and tree.nodes[category].ucidata then
|
if tree.nodes[category] and tree.nodes[category].ucidata then
|
||||||
local ucic = 0
|
local ucic = 0
|
||||||
for i, j in pairs(require("luci.model.uci").changes()) do
|
require("luci.model.uci")
|
||||||
|
luci.model.uci.set_savedir(luci.model.uci.savedir_default)
|
||||||
|
for i, j in pairs(luci.model.uci.changes()) do
|
||||||
for k, l in pairs(j) do
|
for k, l in pairs(j) do
|
||||||
for m, n in pairs(l) do
|
for m, n in pairs(l) do
|
||||||
ucic = ucic + 1;
|
ucic = ucic + 1;
|
||||||
|
|
Loading…
Reference in a new issue