modules/admin-full: prepare iface join wizzard
authorJo-Philipp Wich <jow@openwrt.org>
Sat, 10 Oct 2009 15:59:46 +0000 (15:59 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Sat, 10 Oct 2009 15:59:46 +0000 (15:59 +0000)
modules/admin-full/luasrc/controller/admin/network.lua
modules/admin-full/luasrc/model/cbi/admin_network/iface_add.lua [new file with mode: 0644]
modules/admin-full/luasrc/model/cbi/admin_network/iface_add_s1.lua [new file with mode: 0644]

index 12dd559..28ee82e 100644 (file)
@@ -51,6 +51,9 @@ function index()
        page.leaf   = true
        page.subindex = true
 
+       local page = entry({"admin", "network", "add"}, cbi("admin_network/iface_add"), nil)
+       page.leaf = true
+
        uci:foreach("network", "interface",
                function (section)
                        local ifc = section[".name"]
diff --git a/modules/admin-full/luasrc/model/cbi/admin_network/iface_add.lua b/modules/admin-full/luasrc/model/cbi/admin_network/iface_add.lua
new file mode 100644 (file)
index 0000000..4283553
--- /dev/null
@@ -0,0 +1,19 @@
+--[[
+LuCI - Lua Configuration Interface
+
+Copyright 2009 Jo-Philipp Wich <xm@subsignal.org>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+$Id$
+]]--
+
+d = Delegator()
+d.allow_back = true
+d:add("step1", load("admin_network/iface_add_s1", arg[1]))
+
+return d
diff --git a/modules/admin-full/luasrc/model/cbi/admin_network/iface_add_s1.lua b/modules/admin-full/luasrc/model/cbi/admin_network/iface_add_s1.lua
new file mode 100644 (file)
index 0000000..759a7c9
--- /dev/null
@@ -0,0 +1,106 @@
+--[[
+LuCI - Lua Configuration Interface
+
+Copyright 2009 Jo-Philipp Wich <xm@subsignal.org>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+$Id$
+]]--
+
+local nw  = require "luci.model.network"
+local fw  = require "luci.model.firewall"
+local uci = require "luci.model.uci".cursor()
+
+m = SimpleForm("network", translate("a_n_create", "Create Or Attach Network"),
+       translate("a_n_c_desc",
+               "If the interface is attached to an existing network it will be <em>bridged</em> " ..
+               "to the existing interfaces and is covered by the firewall zone of the choosen network.<br />" ..
+               "Uncheck the attach option to define a new standalone network for this interface."
+       ))
+
+nw.init(uci)
+fw.init(uci)
+
+attachnet = m:field(Flag, "_attach", translate("a_n_c_attach", "Attach to existing network"))
+attachnet.rmempty = false
+attachnet.default = "1"
+
+newnet = m:field(Value, "_netname_new", translate("a_n_c_netname", "Name of the new network"),
+       translate("a_n_c_netname_desc",
+               "The allowed characters are: <code>A-Z</code>, <code>a-z</code>, " ..
+               "<code>0-9</code> and <code>_</code>"
+       ))
+
+newnet:depends("_attach", "")
+newnet.default = "net_" .. arg[1]:gsub("[^%w_]+", "_")
+
+addnet = m:field(Value, "_netname_attach",
+       translate("a_n_c_network", "Network to attach interface to"))
+
+addnet.template = "cbi/network_netlist"
+addnet.widget = "radio"
+addnet.nocreate = true
+addnet:depends("_attach", "1")
+
+fwzone = m:field(Value, "_fwzone",
+       translate("network_interface_fwzone"),
+       translate("network_interface_fwzone_desc"))
+
+fwzone.template = "cbi/firewall_zonelist"
+addnet.widget = "radio"
+fwzone:depends("_attach", "")
+fwzone.default = "zone_" .. arg[1]:gsub("[^%w_]+", "_")
+
+
+function attachnet.write(self, section, value)
+       local net, zone
+
+       if value == "1" then
+               net = nw:get_network(addnet:formvalue(section))
+               if net then
+                       net:type("bridge")
+               end
+       else
+               local zval = fwzone:formvalue(section)
+               
+               net = nw:add_network(newnet:formvalue(section), { proto  = "none" })
+               zone = fw:get_zone(zval)
+
+               if not zone and zval == '-' then
+                       zval = m:formvalue(fwzone:cbid(section) .. ".newzone")
+                       if zval and #zval > 0 then
+                               zone = fw:add_zone(zval)
+                       else
+                               fw:del_network(arg[1])
+                       end
+               end
+       end
+
+       if not net then
+               self.error = { [section] = "missing" }
+       else
+               net:add_interface(arg[1])
+
+               if zone then
+                       fw:del_network(net:name())
+                       zone:add_network(net:name())
+               end
+
+               uci:save("network")
+               uci:save("firewall")
+               luci.http.redirect(luci.dispatcher.build_url("admin/network/network", net:name()))
+       end
+end
+
+function fwzone.cfgvalue(self, section)
+       self.iface = section
+       local z = fw:get_zone_by_network(section)
+       return z and z:name()
+end
+
+return m