Adapt IPv6 interface to new architecture
[project/luci.git] / modules / admin-core / luasrc / tools / status.lua
index e5c517f..27bc925 100644 (file)
@@ -58,6 +58,34 @@ local function dhcp_leases_common(family)
                fd:close()
        end
 
+       local fd = io.open("/tmp/hosts/odhcpd", "r")
+       if fd then
+               while true do
+                       local ln = fd:read("*l")
+                       if not ln then
+                               break
+                       else
+                               local iface, duid, iaid, name, ts, id, length, ip = ln:match("^# (%S+) (%S+) (%S+) (%S+) (%d+) (%S+) (%S+) (.*)")
+                               if ip and iaid ~= "ipv4" and family == 6 then
+                                       rv[#rv+1] = {
+                                               expires  = os.difftime(tonumber(ts) or 0, os.time()),
+                                               duid     = duid,
+                                               ip6addr  = ip,
+                                               hostname = (name ~= "-") and name
+                                       }
+                               elseif ip and iaid == "ipv4" and family == 4 then
+                                       rv[#rv+1] = {
+                                               expires  = os.difftime(tonumber(ts) or 0, os.time()),
+                                               macaddr  = duid,
+                                               ipaddr   = ip,
+                                               hostname = (name ~= "-") and name
+                                       }
+                               end
+                       end
+               end
+               fd:close()
+       end
+
        return rv
 end
 
@@ -66,11 +94,7 @@ function dhcp_leases()
 end
 
 function dhcp6_leases()
-       if luci.sys.call("dnsmasq --version 2>/dev/null | grep -q ' DHCPv6 '") == 0 then
-               return dhcp_leases_common(6)
-       else
-               return nil
-       end
+       return dhcp_leases_common(6)
 end
 
 function wifi_networks()
@@ -153,35 +177,40 @@ function wifi_network(id)
        return { }
 end
 
-function switch_status(dev)
-       local ports = { }
-       local swc = io.popen("swconfig dev %q show" % dev, "r")
-       if swc then
-               local l
-               repeat
-                       l = swc:read("*l")
-                       if l then
-                               local port, up = l:match("port:(%d+) link:(%w+)")
-                               if port then
-                                       local speed  = l:match(" speed:(%d+)")
-                                       local duplex = l:match(" (%w+)-duplex")
-                                       local txflow = l:match(" (txflow)")
-                                       local rxflow = l:match(" (rxflow)")
-                                       local auto   = l:match(" (auto)")
-
-                                       ports[#ports+1] = {
-                                               port   = tonumber(port) or 0,
-                                               speed  = tonumber(speed) or 0,
-                                               link   = (up == "up"),
-                                               duplex = (duplex == "full"),
-                                               rxflow = (not not rxflow),
-                                               txflow = (not not txflow),
-                                               auto   = (not not auto)
-                                       }
+function switch_status(devs)
+       local dev
+       local switches = { }
+       for dev in devs:gmatch("[^%s,]+") do
+               local ports = { }
+               local swc = io.popen("swconfig dev %q show" % dev, "r")
+               if swc then
+                       local l
+                       repeat
+                               l = swc:read("*l")
+                               if l then
+                                       local port, up = l:match("port:(%d+) link:(%w+)")
+                                       if port then
+                                               local speed  = l:match(" speed:(%d+)")
+                                               local duplex = l:match(" (%w+)-duplex")
+                                               local txflow = l:match(" (txflow)")
+                                               local rxflow = l:match(" (rxflow)")
+                                               local auto   = l:match(" (auto)")
+
+                                               ports[#ports+1] = {
+                                                       port   = tonumber(port) or 0,
+                                                       speed  = tonumber(speed) or 0,
+                                                       link   = (up == "up"),
+                                                       duplex = (duplex == "full"),
+                                                       rxflow = (not not rxflow),
+                                                       txflow = (not not txflow),
+                                                       auto   = (not not auto)
+                                               }
+                                       end
                                end
-                       end
-               until not l
-               swc:close()
+                       until not l
+                       swc:close()
+               end
+               switches[dev] = ports
        end
-       return ports
+       return switches
 end