Merge pull request #2742 from Ansuel/odhcp-lease
luci-base: handle dhcp lease from odhcpd
This commit is contained in:
commit
c8b7e7631b
2 changed files with 40 additions and 17 deletions
|
@ -137,7 +137,7 @@ end
|
||||||
net = {}
|
net = {}
|
||||||
|
|
||||||
local function _nethints(what, callback)
|
local function _nethints(what, callback)
|
||||||
local _, k, e, mac, ip, name
|
local _, k, e, mac, ip, name, duid, iaid
|
||||||
local cur = uci.cursor()
|
local cur = uci.cursor()
|
||||||
local ifn = { }
|
local ifn = { }
|
||||||
local hosts = { }
|
local hosts = { }
|
||||||
|
@ -190,6 +190,24 @@ local function _nethints(what, callback)
|
||||||
end
|
end
|
||||||
)
|
)
|
||||||
|
|
||||||
|
cur:foreach("dhcp", "odhcpd",
|
||||||
|
function(s)
|
||||||
|
if type(s.leasefile) == "string" and fs.access(s.leasefile) then
|
||||||
|
for e in io.lines(s.leasefile) do
|
||||||
|
duid, iaid, name, _, ip = e:match("^# %S+ (%S+) (%S+) (%S+) (-?%d+) %S+ %S+ ([0-9a-f:.]+)/[0-9]+")
|
||||||
|
mac = net.duid_to_mac(duid)
|
||||||
|
if mac then
|
||||||
|
if ip and iaid == "ipv4" then
|
||||||
|
_add(what, mac, ip, nil, name ~= "*" and name)
|
||||||
|
elseif ip then
|
||||||
|
_add(what, mac, nil, ip, name ~= "*" and name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
)
|
||||||
|
|
||||||
cur:foreach("dhcp", "host",
|
cur:foreach("dhcp", "host",
|
||||||
function(s)
|
function(s)
|
||||||
for mac in luci.util.imatch(s.mac) do
|
for mac in luci.util.imatch(s.mac) do
|
||||||
|
@ -386,6 +404,26 @@ function net.devices()
|
||||||
return devs
|
return devs
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function net.duid_to_mac(duid)
|
||||||
|
local b1, b2, b3, b4, b5, b6
|
||||||
|
|
||||||
|
if type(duid) == "string" then
|
||||||
|
-- DUID-LLT / Ethernet
|
||||||
|
if #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 #duid == 20 then
|
||||||
|
b1, b2, b3, b4, b5, b6 = duid:match("^00030001(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)$")
|
||||||
|
|
||||||
|
-- DUID-LL / Ethernet (Without Header)
|
||||||
|
elseif #duid == 12 then
|
||||||
|
b1, b2, b3, b4, b5, b6 = duid:match("^(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)$")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return b1 and luci.ip.checkmac(table.concat({ b1, b2, b3, b4, b5, b6 }, ":"))
|
||||||
|
end
|
||||||
|
|
||||||
process = {}
|
process = {}
|
||||||
|
|
||||||
|
|
|
@ -6,21 +6,6 @@ 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"
|
||||||
|
@ -93,7 +78,7 @@ local function dhcp_leases_common(family)
|
||||||
elseif ip and iaid == "ipv4" and family == 4 then
|
elseif ip and iaid == "ipv4" and family == 4 then
|
||||||
rv[#rv+1] = {
|
rv[#rv+1] = {
|
||||||
expires = (expire >= 0) and os.difftime(expire, os.time()),
|
expires = (expire >= 0) and os.difftime(expire, os.time()),
|
||||||
macaddr = ipc.checkmac(duid:gsub("^(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)$", "%1:%2:%3:%4:%5:%6")) or "00:00:00:00:00:00",
|
macaddr = sys.net.duid_to_mac(duid) or "00:00:00:00:00:00",
|
||||||
ipaddr = ip,
|
ipaddr = ip,
|
||||||
hostname = (name ~= "-") and name
|
hostname = (name ~= "-") and name
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue