Add support for stateful DHCPv6
[project/luci.git] / modules / admin-core / luasrc / tools / status.lua
index cd543f7..becd7d4 100644 (file)
@@ -9,7 +9,6 @@ You may obtain a copy of the License at
 
        http://www.apache.org/licenses/LICENSE-2.0
 
-$Id$
 ]]--
 
 module("luci.tools.status", package.seeall)
@@ -67,10 +66,34 @@ function dhcp_leases()
 end
 
 function dhcp6_leases()
-       if luci.sys.call("dnsmasq --version 2>/dev/null | grep -q ' DHCPv6 '") == 0 then
+       local nfs = require "nixio.fs"
+       local leasefile = "/tmp/hosts/6relayd"
+       local rv = {}
+
+       if nfs.access(leasefile, "r") then
+               local fd = io.open(leasefile, "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 then
+                                               rv[#rv+1] = {
+                                                       expires  = os.difftime(tonumber(ts) or 0, os.time()),
+                                                       duid     = duid,
+                                                       ip6addr  = ip,
+                                                       hostname = (name ~= "-") and name
+                                               }
+                                       end
+                               end
+                       end
+                       fd:close()
+               end
+               return rv
+       elseif luci.sys.call("dnsmasq --version 2>/dev/null | grep -q ' DHCPv6 '") == 0 then
                return dhcp_leases_common(6)
-       else
-               return nil
        end
 end
 
@@ -153,3 +176,41 @@ function wifi_network(id)
        end
        return { }
 end
+
+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
+                       until not l
+                       swc:close()
+               end
+               switches[dev] = ports
+       end
+       return switches
+end