luci-base: fix parsing of ethers(5)
authorJo-Philipp Wich <jo@mein.io>
Sun, 11 Mar 2018 17:16:24 +0000 (18:16 +0100)
committerJo-Philipp Wich <jo@mein.io>
Sun, 11 Mar 2018 17:26:31 +0000 (18:26 +0100)
The /etc/ethers file may contain any number of white space characters
between the mac address and the IP/hostname field, so extend the pattern
to allow for that.

Man ethers(5) also states that the IP field may be a symbolic hostname,
so test whether the name is an IP address or hostname before adding it
to the hints structure.

Fixes #1674.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
modules/luci-base/luasrc/sys.lua

index 84c747f2bd3bf1e864cbe08046f20d72ac2a3bad..b00feda5a8ab264eac40d9766cdf6461a78d60c8 100644 (file)
@@ -146,9 +146,13 @@ local function _nethints(what, callback)
 
        if fs.access("/etc/ethers") then
                for e in io.lines("/etc/ethers") do
-                       mac, ip = e:match("^([a-f0-9]%S+) (%S+)")
-                       if mac and ip then
-                               _add(what, mac:upper(), ip, nil, nil)
+                       mac, name = e:match("^([a-fA-F0-9:]+)%s+(%S+)")
+                       if mac and name then
+                               if luci.ip.IPv4(name) then
+                                       _add(what, mac:upper(), name, nil, nil)
+                               else
+                                       _add(what, mac:upper(), nil, nil, name)
+                               end
                        end
                end
        end