modules/admin-core, modules/admin-full: fix switch port status for devices with multi...
authorJo-Philipp Wich <jow@openwrt.org>
Thu, 1 Nov 2012 20:03:36 +0000 (20:03 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Thu, 1 Nov 2012 20:03:36 +0000 (20:03 +0000)
modules/admin-core/luasrc/tools/status.lua
modules/admin-full/luasrc/model/cbi/admin_network/vlan.lua
modules/admin-full/luasrc/view/admin_network/switch_status.htm

index e5c517f23840f9b36f73703f237f492212d62890..3ececa8f1340b4b04865a0161bca20f9f23afe83 100644 (file)
@@ -153,35 +153,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
index 9dc3f2f636de7fbdde767fac1d35521c9fb17d76..b0de19133dfd228d6a997b3d6d056f776075a22f 100644 (file)
@@ -14,6 +14,8 @@ You may obtain a copy of the License at
 
 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."))
 
+local switches = { }
+
 m.uci:foreach("network", "switch",
        function(x)
                local sid         = x['.name']
@@ -199,7 +201,7 @@ m.uci:foreach("network", "switch",
                end
 
 
-               local vid = s:option(Value, has_vlan4k or "vlan", "VLAN ID")
+               local vid = s:option(Value, has_vlan4k or "vlan", "VLAN ID", "<div id='portstatus-%s'></div>" % switch_name)
 
                vid.rmempty = false
                vid.forcewrite = true
@@ -276,12 +278,13 @@ 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
+               switches[#switches+1] = switch_name
        end
 )
 
+-- Switch status template
+s = m:section(SimpleSection)
+s.template = "admin_network/switch_status"
+s.switches = switches
+
 return m
index 0b284833e777837f820dd11695d5d00138ef3ac0..b299575e2f2ad9d51fb803e0ba1260772391c00b 100644 (file)
@@ -1,31 +1,28 @@
 <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)
+       var switches = [ '<%=table.concat(self.switches, "', '")%>' ];
+       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "switch_status")%>/' + switches.join(','), null,
+               function(x, st)
                {
-                       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)
+                       for (var i = 0; i < switches.length; i++)
                        {
-                               if (st && st.length)
+                               var ports = st[switches[i]];
+                               var th0 = document.getElementById('portstatus-' + switches[i]);
+
+                               if (th0 && ports && ports.length)
                                {
-                                       for (var i = 0; i < st.length; i++)
+                                       if (!th0.innerHTML)
+                                               th0.innerHTML = '<%:Port status:%>';
+
+                                       for (var j = 0; j < ports.length; j++)
                                        {
-                                               var th = tb.childNodes[i+1];
+                                               var th = th0.parentNode.parentNode.childNodes[j+1];
 
-                                               if (st[i].link)
+                                               if (ports[j].link)
                                                {
                                                        th.innerHTML = String.format(
                                                                '<small><img src="<%=resource%>/icons/port_up.png" />' +
                                                                '<br />%d<%:baseT%><br />%s</small>',
-                                                               st[i].speed, st[i].duplex
+                                                               ports[j].speed, ports[j].duplex
                                                                        ? '<%:full-duplex%>' : '<%:half-duplex%>'
                                                        );
                                                }
@@ -39,6 +36,6 @@
                                        }
                                }
                        }
-               );
-       }
+               }
+       );
 //]]></script>