1 -- Copyright 2008 Steven Barth <steven@midlink.org>
2 -- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
3 -- Licensed to the public under the Apache License 2.0.
5 local uci = require "luci.model.uci".cursor()
6 local sys = require "luci.sys"
7 local wa = require "luci.tools.webadmin"
8 local fs = require "nixio.fs"
10 m = Map("dhcp", "DHCP")
12 s = m:section(TypedSection, "dhcp", "DHCP-Server")
17 s:depends("interface", "lan")
19 enable = s:option(ListValue, "ignore", translate("enable"), "")
20 enable:value(0, translate("enable"))
21 enable:value(1, translate("disable"))
23 start = s:option(Value, "start", translate("First leased address"))
25 start:depends("ignore", "0")
28 limit = s:option(Value, "limit", translate("Number of leased addresses"), "")
29 limit:depends("ignore", "0")
31 function limit.cfgvalue(self, section)
32 local value = Value.cfgvalue(self, section)
35 return tonumber(value) + 1
39 function limit.write(self, section, value)
40 value = tonumber(value) - 1
41 return Value.write(self, section, value)
46 time = s:option(Value, "leasetime")
47 time:depends("ignore", "0")
51 local leasefn, leasefp, leases
52 uci:foreach("dhcp", "dnsmasq",
54 leasefn = section.leasefile
57 local leasefp = leasefn and fs.access(leasefn) and io.lines(leasefn)
60 for lease in leasefp do
61 table.insert(leases, luci.util.split(lease, " "))
66 v = m:section(Table, leases, translate("Active Leases"))
67 name = v:option(DummyValue, 4, translate("Hostname"))
68 function name.cfgvalue(self, ...)
69 local value = DummyValue.cfgvalue(self, ...)
70 return (value == "*") and "?" or value
72 ip = v:option(DummyValue, 3, translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"))
73 mac = v:option(DummyValue, 2, translate("<abbr title=\"Media Access Control\">MAC</abbr>-Address"))
74 ltime = v:option(DummyValue, 1, translate("Leasetime remaining"))
75 function ltime.cfgvalue(self, ...)
76 local value = DummyValue.cfgvalue(self, ...)
77 return wa.date_format(os.difftime(tonumber(value), os.time()))
81 s2 = m:section(TypedSection, "host", translate("Static Leases"))
84 s2.template = "cbi/tblsection"
86 name = s2:option(Value, "name", translate("Hostname"))
87 mac = s2:option(Value, "mac", translate("<abbr title=\"Media Access Control\">MAC</abbr>-Address"))
88 ip = s2:option(Value, "ip", translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"))
89 sys.net.arptable(function(entry)
90 ip:value(entry["IP address"])
93 entry["HW address"] .. " (" .. entry["IP address"] .. ")"