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
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']
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
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
<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%>'
);
}
}
}
}
- );
- }
+ }
+ );
//]]></script>