luci-base, luci-mod-admin-full: store backup vars in luci configuration

Keep the ifname and bridge state backup variables in /etc/config/luci to not
pollute /etc/config/network.

Fixes #1655.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
Jo-Philipp Wich 2018-03-02 12:23:55 +01:00
parent 3e17668adb
commit 852ec6e28b
2 changed files with 45 additions and 9 deletions

View file

@ -543,6 +543,9 @@ end
function del_network(self, n) function del_network(self, n)
local r = _uci:delete("network", n) local r = _uci:delete("network", n)
if r then if r then
_uci:delete_all("luci", "ifstate",
function(s) return (s.interface == n) end)
_uci:delete_all("network", "alias", _uci:delete_all("network", "alias",
function(s) return (s.interface == n) end) function(s) return (s.interface == n) end)

View file

@ -16,6 +16,7 @@ local has_firewall = fs.access("/etc/config/firewall")
m = Map("network", translate("Interfaces") .. " - " .. arg[1]:upper(), translate("On this page you can configure the network interfaces. You can bridge several interfaces by ticking the \"bridge interfaces\" field and enter the names of several network interfaces separated by spaces. You can also use <abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation <samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: <samp>eth0.1</samp>).")) m = Map("network", translate("Interfaces") .. " - " .. arg[1]:upper(), translate("On this page you can configure the network interfaces. You can bridge several interfaces by ticking the \"bridge interfaces\" field and enter the names of several network interfaces separated by spaces. You can also use <abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation <samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: <samp>eth0.1</samp>)."))
m.redirect = luci.dispatcher.build_url("admin", "network", "network") m.redirect = luci.dispatcher.build_url("admin", "network", "network")
m:chain("wireless") m:chain("wireless")
m:chain("luci")
if has_firewall then if has_firewall then
m:chain("firewall") m:chain("firewall")
@ -27,18 +28,52 @@ fw.init(m.uci)
local net = nw:get_network(arg[1]) local net = nw:get_network(arg[1])
local function set_ifstate(name, option, value)
local found = false
m.uci:foreach("luci", "ifstate", function (s)
if s.interface == name then
m.uci:set("luci", s[".name"], option, value)
found = true
return false
end
end)
if not found then
local sid = m.uci:add("luci", "ifstate")
m.uci:set("luci", sid, "interface", name)
m.uci:set("luci", sid, option, value)
end
m.uci:save("luci")
end
local function get_ifstate(name, option)
local val
m.uci:foreach("luci", "ifstate", function (s)
if s.interface == name then
val = m.uci:get("luci", s[".name"], option)
return false
end
end)
return val
end
local function backup_ifnames(is_bridge) local function backup_ifnames(is_bridge)
if not net:is_floating() and not m:get(net:name(), "_orig_ifname") then if not net:is_floating() and not get_ifstate(net:name(), "ifname") then
local ifcs = net:get_interfaces() or { net:get_interface() } local ifcs = net:get_interfaces() or { net:get_interface() }
if ifcs then if ifcs then
local _, ifn local _, ifn
local ifns = { } local ifns = { }
for _, ifn in ipairs(ifcs) do for _, ifn in ipairs(ifcs) do
ifns[#ifns+1] = ifn:name() local wif = ifn:get_wifinet()
ifns[#ifns+1] = wif and wif:id() or ifn:name()
end end
if #ifns > 0 then if #ifns > 0 then
m:set(net:name(), "_orig_ifname", table.concat(ifns, " ")) set_ifstate(net:name(), "ifname", table.concat(ifns, " "))
m:set(net:name(), "_orig_bridge", tostring(net:is_bridge())) set_ifstate(net:name(), "bridge", tostring(net:is_bridge()))
end end
end end
end end
@ -84,10 +119,10 @@ if m:formvalue("cbid.network.%s._switch" % net:name()) then
elseif net:is_floating() and not proto:is_floating() then elseif net:is_floating() and not proto:is_floating() then
-- if we have backup data, then re-add all orphaned interfaces -- if we have backup data, then re-add all orphaned interfaces
-- from it and restore the bridge choice -- from it and restore the bridge choice
local br = (m:get(net:name(), "_orig_bridge") == "true") local br = (get_ifstate(net:name(), "bridge") == "true")
local ifn local ifn
local ifns = { } local ifns = { }
for ifn in ut.imatch(m:get(net:name(), "_orig_ifname")) do for ifn in ut.imatch(get_ifstate(net:name(), "ifname")) do
ifn = nw:get_interface(ifn) ifn = nw:get_interface(ifn)
if ifn and not ifn:get_network() then if ifn and not ifn:get_network() then
proto:add_interface(ifn) proto:add_interface(ifn)
@ -114,9 +149,7 @@ if m:formvalue("cbid.network.%s._switch" % net:name()) then
for k, v in pairs(m:get(net:name())) do for k, v in pairs(m:get(net:name())) do
if k:sub(1,1) ~= "." and if k:sub(1,1) ~= "." and
k ~= "type" and k ~= "type" and
k ~= "ifname" and k ~= "ifname"
k ~= "_orig_ifname" and
k ~= "_orig_bridge"
then then
m:del(net:name(), k) m:del(net:name(), k)
end end