Fixed a design flaw in luci.model.uci

This commit is contained in:
Steven Barth 2008-08-17 10:20:36 +00:00
parent 746fa9df8f
commit 75d4cca7ae
13 changed files with 94 additions and 57 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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