modules/admin-full, modules/admin-core, themes/base: add port status indicators to...
authorJo-Philipp Wich <jow@openwrt.org>
Tue, 11 Sep 2012 14:18:28 +0000 (14:18 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Tue, 11 Sep 2012 14:18:28 +0000 (14:18 +0000)
modules/admin-core/luasrc/tools/status.lua
modules/admin-full/luasrc/controller/admin/network.lua
modules/admin-full/luasrc/model/cbi/admin_network/vlan.lua
modules/admin-full/luasrc/view/admin_network/switch_status.htm [new file with mode: 0644]
themes/base/htdocs/luci-static/resources/icons/port_down.png [new file with mode: 0644]
themes/base/htdocs/luci-static/resources/icons/port_up.png [new file with mode: 0644]

index cd543f71e8bba3219a91ab744912e8bab73c0f63..e5c517f23840f9b36f73703f237f492212d62890 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)
@@ -153,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
index 00e1fe2ff1fb9f676a7cc924633bd1ae2ebdfb36..85dc68fff0128b5c16396a4da85c7569f106ced4 100644 (file)
@@ -10,7 +10,6 @@ You may obtain a copy of the License at
 
        http://www.apache.org/licenses/LICENSE-2.0
 
-$Id$
 ]]--
 
 module("luci.controller.admin.network", package.seeall)
@@ -39,6 +38,9 @@ function index()
                        page.target = cbi("admin_network/vlan")
                        page.title  = _("Switch")
                        page.order  = 20
+
+                       page = entry({"admin", "network", "switch_status"}, call("switch_status"), nil)
+                       page.leaf = true
                end
 
 
@@ -417,6 +419,14 @@ function lease_status()
        luci.http.write(']')
 end
 
+function switch_status()
+       local path = luci.dispatcher.context.requestpath
+       local s = require "luci.tools.status"
+
+       luci.http.prepare_content("application/json")
+       luci.http.write_json(s.switch_status(path[#path]))
+end
+
 function diag_command(cmd)
        local path = luci.dispatcher.context.requestpath
        local addr = path[#path]
index 25fd0a899cfd5fbe7cf17da2f27e14ea3dce6867..9dc3f2f636de7fbdde767fac1d35521c9fb17d76 100644 (file)
@@ -10,7 +10,6 @@ You may obtain a copy of the License at
 
        http://www.apache.org/licenses/LICENSE-2.0
 
-$Id$
 ]]--
 
 m = Map("network", translate("Switch"), translate("The network ports on this device can be combined to several <abbr title=\"Virtual Local Area Network\">VLAN</abbr>s in which computers can communicate directly with each other. <abbr title=\"Virtual Local Area Network\">VLAN</abbr>s are often used to separate different network segments. Often there is by default one Uplink port for a connection to the next greater network like the internet and other ports for a local network."))
@@ -276,6 +275,12 @@ m.uci:foreach("network", "switch",
 
                        port_opts[#port_opts+1] = po
                end
+
+
+        -- Switch status template
+        s = m:section(SimpleSection)
+        s.template = "admin_network/switch_status"
+        s.switch = switch_name
        end
 )
 
diff --git a/modules/admin-full/luasrc/view/admin_network/switch_status.htm b/modules/admin-full/luasrc/view/admin_network/switch_status.htm
new file mode 100644 (file)
index 0000000..31da264
--- /dev/null
@@ -0,0 +1,44 @@
+<script type="text/javascript">//<![CDATA[
+       var tb;
+       var ths = document.getElementsByTagName('th');
+       for (var i = 0; i < ths.length; i++)
+               if (ths[i].className = 'cbi-section-table-cell' && !ths[i].innerHTML)
+               {
+                       ths[i].innerHTML = '<%:Port status:%>';
+                       tb = ths[i].parentNode;
+                       break;
+               }
+
+       if (tb)
+       {
+               XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "switch_status", self.switch)%>', null,
+                       function(x, st)
+                       {
+                               if (st && st.length)
+                               {
+                                       for (var i = 0; i < st.length; i++)
+                                       {
+                                               var th = tb.childNodes[i+1];
+
+                                               if (st[i].link)
+                                               {
+                                                       th.innerHTML = String.format(
+                                                               '<small><img src="<%=resource%>/icons/port_up.png" />' +
+                                                               '<br />%d<%:baseT%> %s</small>',
+                                                               st[i].speed, st[i].duplex
+                                                                       ? '<%:full-duplex%>' : '<%:half-duplex%>'
+                                                       );
+                                               }
+                                               else
+                                               {
+                                                       th.innerHTML = String.format(
+                                                               '<small><img src="<%=resource%>/icons/port_down.png" />' +
+                                                               '<br /><%:no link%></small>'
+                                                       );
+                                               }
+                                       }
+                               }
+                       }
+               );
+       }
+//]]></script>
diff --git a/themes/base/htdocs/luci-static/resources/icons/port_down.png b/themes/base/htdocs/luci-static/resources/icons/port_down.png
new file mode 100644 (file)
index 0000000..25ea172
Binary files /dev/null and b/themes/base/htdocs/luci-static/resources/icons/port_down.png differ
diff --git a/themes/base/htdocs/luci-static/resources/icons/port_up.png b/themes/base/htdocs/luci-static/resources/icons/port_up.png
new file mode 100644 (file)
index 0000000..9182478
Binary files /dev/null and b/themes/base/htdocs/luci-static/resources/icons/port_up.png differ