luci-base: luci.tools.status: add host_hints to DHCPv6 leases
Attempt to derive a MAC from the DHCPv6 lease DUID and use it to look up a host hint. If a hint is found, add it to the lease information. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
parent
ccbb17d260
commit
c61c5deac4
1 changed files with 32 additions and 0 deletions
|
@ -6,9 +6,25 @@ module("luci.tools.status", package.seeall)
|
||||||
local uci = require "luci.model.uci".cursor()
|
local uci = require "luci.model.uci".cursor()
|
||||||
local ipc = require "luci.ip"
|
local ipc = require "luci.ip"
|
||||||
|
|
||||||
|
local function duid_to_mac(duid)
|
||||||
|
local b1, b2, b3, b4, b5, b6
|
||||||
|
|
||||||
|
-- DUID-LLT / Ethernet
|
||||||
|
if type(duid) == "string" and #duid == 28 then
|
||||||
|
b1, b2, b3, b4, b5, b6 = duid:match("^00010001(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)%x%x%x%x%x%x%x%x$")
|
||||||
|
|
||||||
|
-- DUID-LL / Ethernet
|
||||||
|
elseif type(duid) == "string" and #duid == 20 then
|
||||||
|
b1, b2, b3, b4, b5, b6 = duid:match("^00030001(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)$")
|
||||||
|
end
|
||||||
|
|
||||||
|
return b1 and ipc.checkmac(table.concat({ b1, b2, b3, b4, b5, b6 }, ":"))
|
||||||
|
end
|
||||||
|
|
||||||
local function dhcp_leases_common(family)
|
local function dhcp_leases_common(family)
|
||||||
local rv = { }
|
local rv = { }
|
||||||
local nfs = require "nixio.fs"
|
local nfs = require "nixio.fs"
|
||||||
|
local sys = require "luci.sys"
|
||||||
local leasefile = "/tmp/dhcp.leases"
|
local leasefile = "/tmp/dhcp.leases"
|
||||||
|
|
||||||
uci:foreach("dhcp", "dnsmasq",
|
uci:foreach("dhcp", "dnsmasq",
|
||||||
|
@ -87,6 +103,22 @@ local function dhcp_leases_common(family)
|
||||||
fd:close()
|
fd:close()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if family == 6 then
|
||||||
|
local _, lease
|
||||||
|
local hosts = sys.net.host_hints()
|
||||||
|
for _, lease in ipairs(rv) do
|
||||||
|
local mac = duid_to_mac(lease.duid)
|
||||||
|
local host = mac and hosts[mac]
|
||||||
|
if host then
|
||||||
|
if not lease.name then
|
||||||
|
lease.host_hint = host.name or host.ipv4 or host.ipv6
|
||||||
|
elseif host.name and lease.hostname ~= host.name then
|
||||||
|
lease.host_hint = host.name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
return rv
|
return rv
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue