modules/admin-full: introduce a new tab for firewall related stuff in iface config...
[project/luci.git] / modules / admin-full / luasrc / model / cbi / admin_network / ifaces.lua
index 4a48e9f6da368b8852c00bf1157c0c0ef6ad255f..e8ace36a9b24d462210b52d27e085ec1c904fbe7 100644 (file)
@@ -13,8 +13,9 @@ You may obtain a copy of the License at
 $Id$
 ]]--
 
-local wa = require "luci.tools.webadmin"
 local fs = require "nixio.fs"
+local nw = require "luci.model.network"
+local fw = require "luci.model.firewall"
 
 arg[1] = arg[1] or ""
 
@@ -26,13 +27,20 @@ local has_pppoa = fs.glob("/usr/lib/pppd/*/pppoatm.so")()
 local has_ipv6  = fs.access("/proc/net/ipv6_route")
 
 m = Map("network", translate("interfaces"), translate("a_n_ifaces1"))
+m:chain("firewall")
+m:chain("wireless")
+
+nw.init(m.uci)
+fw.init(m.uci)
 
 s = m:section(NamedSection, arg[1], "interface")
-s.addremove = true
+s.addremove = false
 
 s:tab("general", translate("a_n_general", "General Setup"))
 if has_ipv6 then s:tab("ipv6", translate("a_n_ipv6", "IPv6 Setup")) end
+if has_pppd then s:tab("ppp", translate("a_n_ppp", "PPP Settings")) end
 s:tab("physical", translate("a_n_physical", "Physical Settings"))
+s:tab("firewall", translate("a_n_firewall", "Firewall Settings"))
 
 --[[
 back = s:taboption("general", DummyValue, "_overview", translate("overview"))
@@ -66,6 +74,10 @@ stp:depends("type", "1")
 stp.rmempty = true
 
 ifname_single = s:taboption("physical", Value, "ifname_single", translate("interface"))
+ifname_single.template = "cbi/network_ifacelist"
+ifname_single.widget = "radio"
+ifname_single.nobridges = true
+ifname_single.network = arg[1]
 ifname_single.rmempty = true
 ifname_single:depends("type", "")
 
@@ -74,68 +86,70 @@ function ifname_single.cfgvalue(self, s)
 end
 
 function ifname_single.write(self, s, val)
-       self.map.uci:set("network", s, "ifname", val)
+       local n = nw:get_network(s)
+       if n then
+               local i
+               for _, i in ipairs(n:get_interfaces()) do
+                       n:del_interface(i)
+               end
+               n:add_interface(val)
+       end
 end
 
 
 ifname_multi = s:taboption("physical", MultiValue, "ifname_multi", translate("interface"))
+ifname_multi.template = "cbi/network_ifacelist"
+ifname_multi.nobridges = true
+ifname_multi.network = arg[1]
 ifname_multi.widget = "checkbox"
 ifname_multi:depends("type", "1")
 ifname_multi.cfgvalue = ifname_single.cfgvalue
 ifname_multi.write = ifname_single.write
 
-for i,d in ipairs(luci.sys.net.devices()) do
-       if d ~= "lo" then
-               ifname_single:value(d)
-               ifname_multi:value(d)
+
+for _, d in ipairs(nw:get_interfaces()) do
+       if not d:is_bridge() then
+               ifname_single:value(d:name())
+               ifname_multi:value(d:name())
        end
 end
 
-local zones = wa.network_get_zones(arg[1])
-if zones then
-       if #zones == 0 then
-               m:chain("firewall")
-
-               fwzone = s:taboption("general", Value, "_fwzone",
-                       translate("network_interface_fwzone"),
-                       translate("network_interface_fwzone_desc"))
-               fwzone.rmempty = true
-               fwzone:value("", "- " .. translate("none") .. " -")
-               fwzone:value(arg[1])
-               m.uci:load("firewall")
-               m.uci:foreach("firewall", "zone",
-                       function (section)
-                               fwzone:value(section.name)
-                       end
-               )
-
-               function fwzone.write(self, section, value)
-                       local zone = wa.firewall_find_zone(value)
-                       local stat
-
-                       if not zone then
-                               stat = m.uci:section("firewall", "zone", nil, {
-                                       name = value,
-                                       network = section
-                               })
-                       else
-                               local net = m.uci:get("firewall", zone, "network")
-                               net = (net or value) .. " " .. section
-                               stat = m.uci:set("firewall", zone, "network", net)
-                       end
-
-                       if stat then
-                               self.render = function() end
-                       end
+
+local fwd_to, fwd_from
+
+fwzone = s:taboption("firewall", Value, "_fwzone",
+       translate("network_interface_fwzone"),
+       translate("network_interface_fwzone_desc"))
+
+fwzone.template = "cbi/firewall_zonelist"
+fwzone.network = arg[1]
+fwzone.rmempty = false
+
+function fwzone.cfgvalue(self, section)
+       self.iface = section
+       local z = fw:get_zone_by_network(section)
+       return z and z:name()
+end
+
+function fwzone.write(self, section, value)
+       local zone = fw:get_zone(value)
+
+       if not zone and value == '-' then
+               value = m:formvalue(self:cbid(section) .. ".newzone")
+               if value and #value > 0 then
+                       zone = fw:add_zone(value)
+               else
+                       fw:del_network(section)
                end
-       else
-               fwzone = s:taboption("general", DummyValue, "_fwzone", translate("zone"))
-               fwzone.value = table.concat(zones, ", ")
        end
-       fwzone.titleref = luci.dispatcher.build_url("admin", "network", "firewall", "zones")
-       m.uci:unload("firewall")
+
+       if zone then
+               fw:del_network(section)
+               zone:add_network(section)
+       end
 end
 
+
 ipaddr = s:taboption("general", Value, "ipaddr", translate("ipaddress"))
 ipaddr.rmempty = true
 ipaddr:depends("proto", "static")
@@ -154,11 +168,13 @@ gw.rmempty = true
 bcast = s:taboption("general", Value, "bcast", translate("broadcast"))
 bcast:depends("proto", "static")
 
-ip6addr = s:taboption("ipv6", Value, "ip6addr", translate("ip6address"), translate("cidr6"))
-ip6addr:depends("proto", "static")
+if has_ipv6 then
+       ip6addr = s:taboption("ipv6", Value, "ip6addr", translate("ip6address"), translate("cidr6"))
+       ip6addr:depends("proto", "static")
 
-ip6gw = s:taboption("ipv6", Value, "ip6gw", translate("gateway6"))
-ip6gw:depends("proto", "static")
+       ip6gw = s:taboption("ipv6", Value, "ip6gw", translate("gateway6"))
+       ip6gw:depends("proto", "static")
+end
 
 dns = s:taboption("general", Value, "dns", translate("dnsserver"))
 dns:depends("peerdns", "")
@@ -210,7 +226,7 @@ if has_pppd or has_pppoe or has_pppoa or has_3g or has_pptp then
        pass:depends("proto", "ppp")
        pass:depends("proto", "3g")
 
-       ka = s:taboption("general", Value, "keepalive",
+       ka = s:taboption("ppp", Value, "keepalive",
         translate("network_interface_keepalive"),
         translate("network_interface_keepalive_desc")
        )
@@ -220,7 +236,7 @@ if has_pppd or has_pppoe or has_pppoa or has_3g or has_pptp then
        ka:depends("proto", "ppp")
        ka:depends("proto", "3g")
 
-       demand = s:taboption("general", Value, "demand",
+       demand = s:taboption("ppp", Value, "demand",
         translate("network_interface_demand"),
         translate("network_interface_demand_desc")
        )
@@ -232,16 +248,16 @@ if has_pppd or has_pppoe or has_pppoa or has_3g or has_pptp then
 end
 
 if has_pppoa then
-       encaps = s:taboption("general", ListValue, "encaps", translate("network_interface_encaps"))
+       encaps = s:taboption("ppp", ListValue, "encaps", translate("network_interface_encaps"))
        encaps:depends("proto", "pppoa")
        encaps:value("", translate("cbi_select"))
        encaps:value("vc", "VC")
        encaps:value("llc", "LLC")
 
-       vpi = s:taboption("general", Value, "vpi", "VPI")
+       vpi = s:taboption("ppp", Value, "vpi", "VPI")
        vpi:depends("proto", "pppoa")
 
-       vci = s:taboption("general", Value, "vci", "VCI")
+       vci = s:taboption("ppp", Value, "vci", "VCI")
        vci:depends("proto", "pppoa")
 end
 
@@ -253,7 +269,7 @@ if has_pptp or has_pppd or has_pppoe or has_pppoa or has_3g then
        device:depends("proto", "ppp")
        device:depends("proto", "3g")
 
-       defaultroute = s:taboption("general", Flag, "defaultroute",
+       defaultroute = s:taboption("ppp", Flag, "defaultroute",
         translate("network_interface_defaultroute"),
         translate("network_interface_defaultroute_desc")
        )
@@ -267,7 +283,7 @@ if has_pptp or has_pppd or has_pppoe or has_pppoa or has_3g then
                return ( AbstractValue.cfgvalue(...) or '1' )
        end
 
-       peerdns = s:taboption("general", Flag, "peerdns",
+       peerdns = s:taboption("ppp", Flag, "peerdns",
         translate("network_interface_peerdns"),
         translate("network_interface_peerdns_desc")
        )
@@ -281,14 +297,16 @@ if has_pptp or has_pppd or has_pppoe or has_pppoa or has_3g then
                return ( AbstractValue.cfgvalue(...) or '1' )
        end
 
-       ipv6 = s:taboption("general", Flag, "ipv6", translate("network_interface_ipv6") )
-       ipv6:depends("proto", "ppp")
-       ipv6:depends("proto", "pppoa")
-       ipv6:depends("proto", "pppoe")
-       ipv6:depends("proto", "pptp")
-       ipv6:depends("proto", "3g")
+       if has_ipv6 then
+               ipv6 = s:taboption("ppp", Flag, "ipv6", translate("network_interface_ipv6") )
+               ipv6:depends("proto", "ppp")
+               ipv6:depends("proto", "pppoa")
+               ipv6:depends("proto", "pppoe")
+               ipv6:depends("proto", "pptp")
+               ipv6:depends("proto", "3g")
+       end
 
-       connect = s:taboption("general", Value, "connect",
+       connect = s:taboption("ppp", Value, "connect",
         translate("network_interface_connect"),
         translate("network_interface_connect_desc")
        )
@@ -298,7 +316,7 @@ if has_pptp or has_pppd or has_pppoe or has_pppoa or has_3g then
        connect:depends("proto", "pptp")
        connect:depends("proto", "3g")
 
-       disconnect = s:taboption("general", Value, "disconnect",
+       disconnect = s:taboption("ppp", Value, "disconnect",
         translate("network_interface_disconnect"),
         translate("network_interface_disconnect_desc")
        )
@@ -308,7 +326,7 @@ if has_pptp or has_pppd or has_pppoe or has_pppoa or has_3g then
        disconnect:depends("proto", "pptp")
        disconnect:depends("proto", "3g")
 
-       pppd_options = s:taboption("general", Value, "pppd_options",
+       pppd_options = s:taboption("ppp", Value, "pppd_options",
         translate("network_interface_pppd_options"),
         translate("network_interface_pppd_options_desc")
        )
@@ -318,7 +336,7 @@ if has_pptp or has_pppd or has_pppoe or has_pppoa or has_3g then
        pppd_options:depends("proto", "pptp")
        pppd_options:depends("proto", "3g")
 
-       maxwait = s:taboption("general", Value, "maxwait",
+       maxwait = s:taboption("ppp", Value, "maxwait",
         translate("network_interface_maxwait"),
         translate("network_interface_maxwait_desc")
        )
@@ -331,31 +349,26 @@ s2.addremove = true
 s2:depends("interface", arg[1])
 s2.defaults.interface = arg[1]
 
+s2:tab("general", translate("a_n_general", "General Setup"))
 
 s2.defaults.proto = "static"
 
-ipaddr = s2:option(Value, "ipaddr", translate("ipaddress"))
-ipaddr.rmempty = true
+s2:taboption("general", Value, "ipaddr", translate("ipaddress")).rmempty = true
 
-nm = s2:option(Value, "netmask", translate("netmask"))
+nm = s2:taboption("general", Value, "netmask", translate("netmask"))
 nm.rmempty = true
 nm:value("255.255.255.0")
 nm:value("255.255.0.0")
 nm:value("255.0.0.0")
 
-gw = s2:option(Value, "gateway", translate("gateway"))
-gw.rmempty = true
-
-bcast = s2:option(Value, "bcast", translate("broadcast"))
-bcast.optional = true
-
-ip6addr = s2:option(Value, "ip6addr", translate("ip6address"), translate("cidr6"))
-ip6addr.optional = true
+s2:taboption("general", Value, "gateway", translate("gateway")).rmempty = true
+s2:taboption("general", Value, "bcast", translate("broadcast"))
+s2:taboption("general", Value, "dns", translate("dnsserver"))
 
-ip6gw = s2:option(Value, "ip6gw", translate("gateway6"))
-ip6gw.optional = true
-
-dns = s2:option(Value, "dns", translate("dnsserver"))
-dns.optional = true
+if has_ipv6 then
+       s2:tab("ipv6", translate("a_n_ipv6", "IPv6 Setup"))
+       s2:taboption("ipv6", Value, "ip6addr", translate("ip6address"), translate("cidr6"))
+       s2:taboption("ipv6", Value, "ip6gw", translate("gateway6"))
+end
 
 return m