---[[
-LuCI - Lua Configuration Interface
+-- Copyright 2008 Steven Barth <steven@midlink.org>
+-- Licensed to the public under the Apache License 2.0.
-Copyright 2008 Steven Barth <steven@midlink.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 sys = require "luci.sys"
+local ipc = require "luci.ip"
+local o
+require "luci.util"
m = Map("dhcp", translate("DHCP and DNS"),
translate("Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol" ..
s:taboption("files", Flag, "nohosts",
- translate("Ignore Hosts files")).optional = true
-
-hf = s:taboption("files", DynamicList, "addnhosts",
- translate("Additional Hosts files"))
+ translate("Ignore <code>/etc/hosts</code>")).optional = true
-hf:depends("nohosts", "")
-hf.optional = true
+s:taboption("files", DynamicList, "addnhosts",
+ translate("Additional Hosts files")).optional = true
s:taboption("advanced", Flag, "boguspriv",
translate("Localise queries"),
translate("Localise hostname depending on the requesting subnet if multiple IPs are available"))
+local have_dnssec_support = luci.util.checklib("/usr/sbin/dnsmasq", "libhogweed.so")
+
+if have_dnssec_support then
+ o = s:taboption("advanced", Flag, "dnssec",
+ translate("DNSSEC"))
+ o.optional = true
+
+ o = s:taboption("advanced", Flag, "dnsseccheckunsigned",
+ translate("DNSSEC check unsigned"),
+ translate("Requires upstream supports DNSSEC; verify unsigned domain responses really come from unsigned domains"))
+ o.optional = true
+end
+
s:taboption("general", Value, "local",
translate("Local server"),
translate("Local domain specification. Names matching this domain are never forwarded and are resolved from DHCP or hosts files only"))
translate("No negative cache"),
translate("Do not cache negative replies, e.g. for not existing domains"))
+s:taboption("advanced", Value, "serversfile",
+ translate("Additional servers file"),
+ translate("This file may contain lines like 'server=/domain/1.2.3.4' or 'server=1.2.3.4' for"..
+ "domain-specific or full upstream <abbr title=\"Domain Name System\">DNS</abbr> servers."))
+
s:taboption("advanced", Flag, "strictorder",
translate("Strict order"),
translate("<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the " ..
translate("List of domains to allow RFC1918 responses for"))
rd:depends("rebind_protection", "1")
-rd.datatype = "host"
+rd.datatype = "host(1)"
rd.placeholder = "ihost.netflix.com"
"only hosts with a corresponding lease are served.") .. "<br />" ..
translate("Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</em> " ..
"indentifies the host, the <em>IPv4-Address</em> specifies to the fixed address to " ..
- "use and the <em>Hostname</em> is assigned as symbolic name to the requesting host."))
+ "use and the <em>Hostname</em> is assigned as symbolic name to the requesting host. " ..
+ "The optional <em>Lease time</em> can be used to set non-standard host-specific " ..
+ "lease time, e.g. 12h, 3d or infinite."))
s.addremove = true
s.anonymous = true
ip = s:option(Value, "ip", translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"))
ip.datatype = "or(ip4addr,'ignore')"
+time = s:option(Value, "leasetime", translate("Lease time"))
+time.rmempty = true
+
hostid = s:option(Value, "hostid", translate("<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"))
-sys.net.arptable(function(entry)
- ip:value(entry["IP address"])
- mac:value(
- entry["HW address"],
- entry["HW address"] .. " (" .. entry["IP address"] .. ")"
- )
+ipc.neighbors({ family = 4 }, function(n)
+ if n.mac and n.dest then
+ ip:value(n.dest:string())
+ mac:value(n.mac, "%s (%s)" %{ n.mac, n.dest:string() })
+ end
end)
function ip.validate(self, value, section)