modules/admin-full: finally sort out dhcp setup issues in interface settings
authorJo-Philipp Wich <jow@openwrt.org>
Sat, 17 Sep 2011 23:43:55 +0000 (23:43 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Sat, 17 Sep 2011 23:43:55 +0000 (23:43 +0000)
modules/admin-full/luasrc/model/cbi/admin_network/ifaces.lua

index 8f5f5e4..3aef9d7 100644 (file)
@@ -58,6 +58,20 @@ if not net then
        return
 end
 
+-- dhcp setup was requested, create section and reload page
+if m:formvalue("cbid.dhcp._enable._enable") then
+       m.uci:section("dhcp", "dhcp", nil, {
+               interface = arg[1],
+               start     = "100",
+               limit     = "150",
+               leasetime = "12h"
+       })
+
+       m.uci:save("dhcp")
+       luci.http.redirect(luci.dispatcher.build_url("admin/network/network", arg[1]))
+       return
+end
+
 local ifc = net:get_interfaces()[1]
 
 s = m:section(NamedSection, arg[1], "interface", translate("Common Configuration"))
@@ -668,101 +682,92 @@ end
 
 if has_dnsmasq and net:proto() == "static" then
        m2 = Map("dhcp", "", "")
-       
-       local section_id
-       function m2.on_parse()
-               m2.uci:foreach("dhcp", "dhcp", function(s)
-                       if s.interface == arg[1] then
-                               section_id = s['.name']
-                               return false
-                       end
-               end)
-
-               if not section_id then
-                       local c = 1
-                       section_id = arg[1]
-                       while m2.uci:get("dhcp", section_id) do
-                               section_id = arg[1] .. c
-                               c = c + 1
-                       end
-               end
-       end
-
-       s = m2:section(TypedSection, "dhcp", translate("DHCP Server"))
-       s.addremove = false
-       s.anonymous = true
-       s:tab("general",  translate("General Setup"))
-       s:tab("advanced", translate("Advanced Settings"))
-
-       function s.cfgsections(self)
-               return { section_id }
-       end
 
-       local ignore = s:taboption("general", Flag, "ignore",
-               translate("Ignore interface"),
-               translate("Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for " ..
-                       "this interface."))
+       local has_section = false
 
-       ignore.rmempty = false
-       ignore.default = ignore.enabled
-
-       function ignore.write(self, section, value)
-               if m2.uci:get("dhcp", section) ~= "dhcp" then
-                       m2.uci:section("dhcp", "dhcp", section, {
-                               interface = arg[1]
-                       })
+       m2.uci:foreach("dhcp", "dhcp", function(s)
+               if s.interface == arg[1] then
+                       has_section = true
+                       return false
                end
-               m2.uci:set("dhcp", section, "ignore", (value == "1") and "1" or "0")
-       end
-
-
-       local start = s:taboption("general", Value, "start", translate("Start"),
-               translate("Lowest leased address as offset from the network address."))
-       start.optional = true
-       start.datatype = "uinteger"
-       start.default = "100"
-
-       local limit = s:taboption("general", Value, "limit", translate("Limit"),
-               translate("Maximum number of leased addresses."))
-       limit.optional = true
-       limit.datatype = "uinteger"
-       limit.default = "150"
+       end)
 
-       local ltime = s:taboption("general", Value, "leasetime", translate("Leasetime"),
-               translate("Expiry time of leased addresses, minimum is 2 Minutes (<code>2m</code>)."))
-       ltime.rmempty = true
-       ltime.default = "12h"
+       if not has_section then
 
-       local dd = s:taboption("advanced", Flag, "dynamicdhcp",
-               translate("Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"),
-               translate("Dynamically allocate DHCP addresses for clients. If disabled, only " ..
-                       "clients having static leases will be served."))
-       dd.default = dd.enabled
+               s = m2:section(TypedSection, "dhcp", translate("DHCP Server"))
+               s.anonymous   = true
+               s.cfgsections = function() return { "_enable" } end
 
-       s:taboption("advanced", Flag, "force", translate("Force"),
-               translate("Force DHCP on this network even if another server is detected."))
+               x = s:option(Button, "_enable")
+               x.title      = translate("No DHCP Server configured for this interface")
+               x.inputtitle = translate("Setup DHCP Server")
+               x.inputstyle = "apply"
 
-       -- XXX: is this actually useful?
-       --s:taboption("advanced", Value, "name", translate("Name"),
-       --      translate("Define a name for this network."))
+       else
 
-       mask = s:taboption("advanced", Value, "netmask",
-               translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"),
-               translate("Override the netmask sent to clients. Normally it is calculated " ..
-                       "from the subnet that is served."))
-
-       mask.optional = true
-       mask.datatype = "ip4addr"
-
-       s:taboption("advanced", DynamicList, "dhcp_option", translate("DHCP-Options"),
-               translate("Define additional DHCP options, for example \"<code>6,192.168.2.1," ..
-                       "192.168.2.2</code>\" which advertises different DNS servers to clients."))
+               s = m2:section(TypedSection, "dhcp", translate("DHCP Server"))
+               s.addremove = false
+               s.anonymous = true
+               s:tab("general",  translate("General Setup"))
+               s:tab("advanced", translate("Advanced Settings"))
 
+               function s.filter(self, section)
+                       return m2.uci:get("dhcp", section, "interface") == arg[1]
+               end
 
-       for i, n in ipairs(s.children) do
-               if n ~= ignore then
-                       n:depends("ignore", "")
+               local ignore = s:taboption("general", Flag, "ignore",
+                       translate("Ignore interface"),
+                       translate("Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for " ..
+                               "this interface."))
+
+               local start = s:taboption("general", Value, "start", translate("Start"),
+                       translate("Lowest leased address as offset from the network address."))
+               start.optional = true
+               start.datatype = "uinteger"
+               start.default = "100"
+
+               local limit = s:taboption("general", Value, "limit", translate("Limit"),
+                       translate("Maximum number of leased addresses."))
+               limit.optional = true
+               limit.datatype = "uinteger"
+               limit.default = "150"
+
+               local ltime = s:taboption("general", Value, "leasetime", translate("Leasetime"),
+                       translate("Expiry time of leased addresses, minimum is 2 Minutes (<code>2m</code>)."))
+               ltime.rmempty = true
+               ltime.default = "12h"
+
+               local dd = s:taboption("advanced", Flag, "dynamicdhcp",
+                       translate("Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"),
+                       translate("Dynamically allocate DHCP addresses for clients. If disabled, only " ..
+                               "clients having static leases will be served."))
+               dd.default = dd.enabled
+
+               s:taboption("advanced", Flag, "force", translate("Force"),
+                       translate("Force DHCP on this network even if another server is detected."))
+
+               -- XXX: is this actually useful?
+               --s:taboption("advanced", Value, "name", translate("Name"),
+               --      translate("Define a name for this network."))
+
+               mask = s:taboption("advanced", Value, "netmask",
+                       translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"),
+                       translate("Override the netmask sent to clients. Normally it is calculated " ..
+                               "from the subnet that is served."))
+
+               mask.optional = true
+               mask.datatype = "ip4addr"
+
+               s:taboption("advanced", DynamicList, "dhcp_option", translate("DHCP-Options"),
+                       translate("Define additional DHCP options, for example \"<code>6,192.168.2.1," ..
+                               "192.168.2.2</code>\" which advertises different DNS servers to clients."))
+
+               for i, n in ipairs(s.children) do
+                       if n ~= ignore then
+                               n:depends("ignore", "")
+                       end
                end
+
        end
 end