modules/admin-full, modules/admin-core, themes/base: add port status indicators to...
[project/luci.git] / modules / admin-core / luasrc / tools / status.lua
index 2eef3e0..e5c517f 100644 (file)
@@ -9,14 +9,13 @@ You may obtain a copy of the License at
 
        http://www.apache.org/licenses/LICENSE-2.0
 
-$Id$
 ]]--
 
 module("luci.tools.status", package.seeall)
 
 local uci = require "luci.model.uci".cursor()
 
-function dhcp_leases()
+local function dhcp_leases_common(family)
        local rv = { }
        local nfs = require "nixio.fs"
        local leasefile = "/var/dhcp.leases"
@@ -36,14 +35,23 @@ function dhcp_leases()
                        if not ln then
                                break
                        else
-                               local ts, mac, ip, name = ln:match("^(%d+) (%S+) (%S+) (%S+)")
-                               if ts and mac and ip and name then
-                                       rv[#rv+1] = {
-                                               expires  = os.difftime(tonumber(ts) or 0, os.time()),
-                                               macaddr  = mac,
-                                               ipaddr   = ip,
-                                               hostname = (name ~= "*") and name
-                                       }
+                               local ts, mac, ip, name, duid = ln:match("^(%d+) (%S+) (%S+) (%S+) (%S+)")
+                               if ts and mac and ip and name and duid then
+                                       if family == 4 and not ip:match(":") then
+                                               rv[#rv+1] = {
+                                                       expires  = os.difftime(tonumber(ts) or 0, os.time()),
+                                                       macaddr  = mac,
+                                                       ipaddr   = ip,
+                                                       hostname = (name ~= "*") and name
+                                               }
+                                       elseif family == 6 and ip:match(":") then
+                                               rv[#rv+1] = {
+                                                       expires  = os.difftime(tonumber(ts) or 0, os.time()),
+                                                       ip6addr  = ip,
+                                                       duid     = (duid ~= "*") and duid,
+                                                       hostname = (name ~= "*") and name
+                                               }
+                                       end
                                end
                        end
                end
@@ -53,6 +61,18 @@ function dhcp_leases()
        return rv
 end
 
+function dhcp_leases()
+       return dhcp_leases_common(4)
+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
+end
+
 function wifi_networks()
        local rv = { }
        local ntm = require "luci.model.network".init()
@@ -132,3 +152,36 @@ function wifi_network(id)
        end
        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)
+                                       }
+                               end
+                       end
+               until not l
+               swc:close()
+       end
+       return ports
+end