modules/admin-full: rework interface add dialog, now handles floating protocols like PPP correctly
This commit is contained in:
parent
be71f1c93a
commit
b666015dc2
1 changed files with 50 additions and 21 deletions
|
@ -19,6 +19,8 @@ local utl = require "luci.util"
|
|||
local uci = require "luci.model.uci".cursor()
|
||||
|
||||
m = SimpleForm("network", translate("Create Interface"))
|
||||
m.redirect = luci.dispatcher.build_url("admin/network/network")
|
||||
m.reset = false
|
||||
|
||||
newnet = m:field(Value, "_netname", translate("Name of the new interface"),
|
||||
translate("The allowed characters are: <code>A-Z</code>, <code>a-z</code>, " ..
|
||||
|
@ -29,6 +31,8 @@ newnet:depends("_attach", "")
|
|||
newnet.default = arg[1] and "net_" .. arg[1]:gsub("[^%w_]+", "_")
|
||||
newnet.datatype = "uciname"
|
||||
|
||||
newproto = m:field(ListValue, "_netproto", translate("Protocol of the new interface"))
|
||||
|
||||
netbridge = m:field(Flag, "_bridge", translate("Create a bridge over multiple interfaces"))
|
||||
|
||||
|
||||
|
@ -36,41 +40,66 @@ sifname = m:field(Value, "_ifname", translate("Cover the following interface"),
|
|||
translate("Note: If you choose an interface here which is part of another network, it will be moved into this network."))
|
||||
|
||||
sifname.widget = "radio"
|
||||
sifname.template = "cbi/network_ifacelist"
|
||||
sifname.template = "cbi/network_ifacelist"
|
||||
sifname.nobridges = true
|
||||
sifname:depends("_bridge", "")
|
||||
|
||||
|
||||
mifname = m:field(Value, "_ifnames", translate("Cover the following interfaces"),
|
||||
translate("Note: If you choose an interface here which is part of another network, it will be moved into this network."))
|
||||
|
||||
mifname.widget = "checkbox"
|
||||
mifname.template = "cbi/network_ifacelist"
|
||||
mifname.template = "cbi/network_ifacelist"
|
||||
mifname.nobridges = true
|
||||
mifname:depends("_bridge", "1")
|
||||
|
||||
function newnet.write(self, section, value)
|
||||
local bridge = netbridge:formvalue(section) == "1"
|
||||
local ifaces = bridge and mifname:formvalue(section) or sifname:formvalue(section)
|
||||
|
||||
local nn = nw:add_network(value, { proto = "none" })
|
||||
if nn then
|
||||
if bridge then
|
||||
nn:set("type", "bridge")
|
||||
local _, p
|
||||
for _, p in ipairs(nw:get_protocols()) do
|
||||
if p:is_installed() then
|
||||
newproto:value(p:proto(), p:get_i18n())
|
||||
if not p:is_virtual() then netbridge:depends("_netproto", p:proto()) end
|
||||
if not p:is_floating() then
|
||||
sifname:depends({ _bridge = "", _netproto = p:proto()})
|
||||
mifname:depends({ _bridge = "1", _netproto = p:proto()})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local iface
|
||||
for iface in utl.imatch(ifaces) do
|
||||
nn:add_interface(iface)
|
||||
if not bridge then
|
||||
break
|
||||
function newproto.validate(self, value, section)
|
||||
local name = newnet:formvalue(section)
|
||||
if not name or #name == 0 then
|
||||
newnet:add_error(section, translate("No network name specified"))
|
||||
elseif m:get(name) then
|
||||
newnet:add_error(section, translate("The given network name is not unique"))
|
||||
end
|
||||
|
||||
local proto = nw:get_protocol(value)
|
||||
if proto and not proto:is_floating() then
|
||||
local br = (netbridge:formvalue(section) == "1")
|
||||
local ifn = br and mifname:formvalue(section) or sifname:formvalue(section)
|
||||
for ifn in utl.imatch(ifn) do
|
||||
return value
|
||||
end
|
||||
return nil, translate("The selected protocol needs a device assigned")
|
||||
end
|
||||
return value
|
||||
end
|
||||
|
||||
function newproto.write(self, section, value)
|
||||
local name = newnet:formvalue(section)
|
||||
if name and #name > 0 then
|
||||
local br = (netbridge:formvalue(section) == "1") and "bridge" or nil
|
||||
local net = nw:add_network(name, { proto = value, type = br })
|
||||
if net then
|
||||
local ifn
|
||||
for ifn in utl.imatch(
|
||||
br and mifname:formvalue(section) or sifname:formvalue(section)
|
||||
) do
|
||||
net:add_interface(ifn)
|
||||
end
|
||||
nw:save("network")
|
||||
nw:save("wireless")
|
||||
end
|
||||
|
||||
nw:save("network")
|
||||
nw:save("wireless")
|
||||
|
||||
luci.http.redirect(luci.dispatcher.build_url("admin/network/network", nn:name()))
|
||||
luci.http.redirect(luci.dispatcher.build_url("admin/network/network", name))
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in a new issue