Created
September 11, 2015 18:07
-
-
Save thesabbir/301e4a55c4a0d38f279f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<%# | |
LuCI - Lua Configuration Interface | |
Copyright 2008 Steven Barth <[email protected]> | |
Copyright 2008-2011 Jo-Philipp Wich <[email protected]> | |
Licensed under the Apache License, Version 2.0 (the "License"); | |
you may not use this file except in compliance with the License. | |
You may obtain a copy of the License at | |
http://www.apache.org/licenses/LICENSE-2.0 | |
$Id: index.htm 9069 2012-08-17 15:06:46Z jow $ | |
-%> | |
<% | |
require "luci.fs" | |
require "luci.tools.status" | |
local has_ipv6 = luci.fs.access("/proc/net/ipv6_route") | |
local has_dhcp = luci.fs.access("/etc/config/dhcp") | |
local has_wifi = luci.fs.stat("/etc/config/wireless") | |
has_wifi = has_wifi and has_wifi.size > 0 | |
if luci.http.formvalue("status") == "1" then | |
local ntm = require "luci.model.network".init() | |
local wan = ntm:get_wannet() | |
local wan6 = ntm:get_wan6net() | |
local _, _, memtotal, memcached, membuffers, memfree = luci.sys.sysinfo() | |
local conn_count = tonumber(( | |
luci.sys.exec("wc -l /proc/net/nf_conntrack") or | |
luci.sys.exec("wc -l /proc/net/ip_conntrack") or | |
""):match("%d+")) or 0 | |
local conn_max = tonumber(( | |
luci.sys.exec("sysctl net.nf_conntrack_max") or | |
luci.sys.exec("sysctl net.ipv4.netfilter.ip_conntrack_max") or | |
""):match("%d+")) or 4096 | |
local rv = { | |
uptime = luci.sys.uptime(), | |
localtime = os.date(), | |
loadavg = { luci.sys.loadavg() }, | |
memtotal = memtotal, | |
memcached = memcached, | |
membuffers = membuffers, | |
memfree = memfree, | |
connmax = conn_max, | |
conncount = conn_count, | |
leases = luci.tools.status.dhcp_leases(), | |
leases6 = luci.tools.status.dhcp6_leases(), | |
wifinets = luci.tools.status.wifi_networks() | |
} | |
if wan then | |
rv.wan = { | |
ipaddr = wan:ipaddr(), | |
gwaddr = wan:gwaddr(), | |
netmask = wan:netmask(), | |
dns = wan:dnsaddrs(), | |
expires = wan:expires(), | |
uptime = wan:uptime(), | |
proto = wan:proto(), | |
ifname = wan:ifname(), | |
link = wan:adminlink() | |
} | |
end | |
if wan6 then | |
rv.wan6 = { | |
ip6addr = wan6:ip6addr(), | |
gw6addr = wan6:gw6addr(), | |
dns = wan6:dns6addrs(), | |
uptime = wan6:uptime(), | |
ifname = wan6:ifname(), | |
link = wan6:adminlink() | |
} | |
end | |
if rv.wan.proto == "3g" then | |
local data3g = luci.sys.exec("gcom") | |
rv.wan3g = { | |
operator = data3g:match("\"[a-zA-Z0-9 ]+\""), | |
quality = data3g:match("Signal Quality: [0-9]+"), | |
sim = data3g:match("SIM [a-zA-Z0-9 ]+") | |
} | |
end | |
luci.http.prepare_content("application/json") | |
luci.http.write_json(rv) | |
return | |
end | |
local system, model = luci.sys.sysinfo() | |
-%> | |
<%+header%> | |
<script type="text/javascript" src="<%=resource%>/cbi.js"></script> | |
<script type="text/javascript">//<![CDATA[ | |
function progressbar(v, m) | |
{ | |
var vn = parseInt(v) || 0; | |
var mn = parseInt(m) || 100; | |
var pc = Math.floor((100 / mn) * vn); | |
return String.format( | |
'<div style="width:200px; position:relative; border:1px solid #999999">' + | |
'<div style="background-color:#CCCCCC; width:%d%%; height:15px">' + | |
'<div style="position:absolute; left:0; top:0; text-align:center; width:100%%; color:#000000">' + | |
'<small>%s / %s (%d%%)</small>' + | |
'</div>' + | |
'</div>' + | |
'</div>', pc, v, m, pc | |
); | |
} | |
var wifidevs = <%=luci.http.write_json(netdevs)%>; | |
var arptable = <%=luci.http.write_json(arpcache)%>; | |
XHR.poll(5, '<%=REQUEST_URI%>', { status: 1 }, | |
function(x, info) | |
{ | |
var si = document.getElementById('wan4_i'); | |
var ss = document.getElementById('wan4_s'); | |
var ifc = info.wan; | |
if (ifc && ifc.ifname && ifc.proto != 'none') | |
{ | |
var s = String.format( | |
'<strong><%:Type%>: </strong>%s<br />' + | |
'<strong><%:Address%>: </strong>%s<br />' + | |
'<strong><%:Netmask%>: </strong>%s<br />' + | |
'<strong><%:Gateway%>: </strong>%s<br />', | |
ifc.proto, | |
(ifc.ipaddr) ? ifc.ipaddr : '0.0.0.0', | |
(ifc.netmask && ifc.netmask != ifc.ipaddr) ? ifc.netmask : '255.255.255.255', | |
(ifc.gwaddr) ? ifc.gwaddr : '0.0.0.0' | |
); | |
for (var i = 0; i < ifc.dns.length; i++) | |
{ | |
s += String.format( | |
'<strong><%:DNS%> %d: </strong>%s<br />', | |
i + 1, ifc.dns[i] | |
); | |
} | |
if (ifc.expires > -1) | |
{ | |
s += String.format( | |
'<strong><%:Expires%>: </strong>%t<br />', | |
ifc.expires | |
); | |
} | |
if (ifc.uptime > 0) | |
{ | |
s += String.format( | |
'<strong><%:Connected%>: </strong>%t<br />', | |
ifc.uptime | |
); | |
} | |
if (ifc.proto == '3g') | |
{ | |
s = String.format( | |
'<strong><%:Operator%>: </strong>%s<br /><strong><%:Signal%>: </strong>%s<br /><strong><%:SIM%>: </strong>%s<br />', | |
info.wan3g.operator, info.wan3g.quality.substring(15),info.wan3g.sim | |
) + s; | |
} | |
ss.innerHTML = String.format('<small>%s</small>', s); | |
if (ifc.proto == '3g') | |
{ | |
var sigqual = parseInt(info.wan3g.quality.substring(15)) | |
var icon; | |
if (sigqual == 99 || !sigqual) | |
icon = "/luci-static/resources/icons/signal-none.png"; | |
else if (sigqual == 0) | |
icon = "/luci-static/resources/icons/signal-0.png"; | |
else if (sigqual < 7) | |
icon = "/luci-static/resources/icons/signal-0-25.png"; | |
else if (sigqual < 15) | |
icon = "/luci-static/resources/icons/signal-25-50.png"; | |
else if (sigqual < 24) | |
icon = "/luci-static/resources/icons/signal-50-75.png"; | |
else | |
icon = "/luci-static/resources/icons/signal-75-100.png"; | |
si.innerHTML = String.format( | |
'<img src="%s" />' + | |
'<br /><small><a href="%s">%s</a></small>', | |
icon, ifc.link, ifc.ifname | |
); | |
} | |
else | |
{ | |
si.innerHTML = String.format( | |
'<img src="<%=resource%>/icons/ethernet.png" />' + | |
'<br /><small><a href="%s">%s</a></small>', | |
ifc.link, ifc.ifname | |
); | |
} | |
} | |
else | |
{ | |
si.innerHTML = '<img src="<%=resource%>/icons/ethernet_disabled.png" /><br /><small>?</small>'; | |
ss.innerHTML = '<em><%:Not connected%></em>'; | |
} | |
<% if has_ipv6 then %> | |
var si6 = document.getElementById('wan6_i'); | |
var ss6 = document.getElementById('wan6_s'); | |
var ifc6 = info.wan6; | |
if (ifc6 && ifc6.ifname && ifc6.proto != 'none') | |
{ | |
var s = String.format( | |
'<strong><%:Address%>: </strong>%s<br />' + | |
'<strong><%:Gateway%>: </strong>%s<br />', | |
(ifc6.ip6addr) ? ifc6.ip6addr : '::', | |
(ifc6.gw6addr) ? ifc6.gw6addr : '::' | |
); | |
for (var i = 0; i < ifc6.dns.length; i++) | |
{ | |
s += String.format( | |
'<strong><%:DNS%> %d: </strong>%s<br />', | |
i + 1, ifc6.dns[i] | |
); | |
} | |
if (ifc6.uptime > 0) | |
{ | |
s += String.format( | |
'<strong><%:Connected%>: </strong>%t<br />', | |
ifc6.uptime | |
); | |
} | |
ss6.innerHTML = String.format('<small>%s</small>', s); | |
si6.innerHTML = String.format( | |
'<img src="<%=resource%>/icons/ethernet.png" />' + | |
'<br /><small><a href="%s">%s</a></small>', | |
ifc6.link, ifc6.ifname | |
); | |
} | |
else | |
{ | |
si6.innerHTML = '<img src="<%=resource%>/icons/ethernet_disabled.png" /><br /><small>?</small>'; | |
ss6.innerHTML = '<em><%:Not connected%></em>'; | |
} | |
<% end %> | |
<% if has_dhcp then %> | |
var ls = document.getElementById('lease_status_table'); | |
if (ls) | |
{ | |
/* clear all rows */ | |
while( ls.rows.length > 1 ) | |
ls.rows[0].parentNode.deleteRow(1); | |
for( var i = 0; i < info.leases.length; i++ ) | |
{ | |
var timestr; | |
if (info.leases[i].expires <= 0) | |
timestr = '<em><%:expired%></em>'; | |
else | |
timestr = String.format('%t', info.leases[i].expires); | |
var tr = ls.rows[0].parentNode.insertRow(-1); | |
tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1); | |
tr.insertCell(-1).innerHTML = info.leases[i].hostname ? info.leases[i].hostname : '?'; | |
tr.insertCell(-1).innerHTML = info.leases[i].ipaddr; | |
tr.insertCell(-1).innerHTML = info.leases[i].macaddr; | |
tr.insertCell(-1).innerHTML = timestr; | |
} | |
if( ls.rows.length == 1 ) | |
{ | |
var tr = ls.rows[0].parentNode.insertRow(-1); | |
tr.className = 'cbi-section-table-row'; | |
var td = tr.insertCell(-1); | |
td.colSpan = 4; | |
td.innerHTML = '<em><br /><%:There are no active leases.%></em>'; | |
} | |
} | |
var ls6 = document.getElementById('lease6_status_table'); | |
if (ls6 && info.leases6) | |
{ | |
ls6.parentNode.style.display = 'block'; | |
/* clear all rows */ | |
while( ls6.rows.length > 1 ) | |
ls6.rows[0].parentNode.deleteRow(1); | |
for( var i = 0; i < info.leases6.length; i++ ) | |
{ | |
var timestr; | |
if (info.leases6[i].expires <= 0) | |
timestr = '<em><%:expired%></em>'; | |
else | |
timestr = String.format('%t', info.leases6[i].expires); | |
var tr = ls6.rows[0].parentNode.insertRow(-1); | |
tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1); | |
tr.insertCell(-1).innerHTML = info.leases6[i].hostname ? info.leases6[i].hostname : '?'; | |
tr.insertCell(-1).innerHTML = info.leases6[i].ip6addr; | |
tr.insertCell(-1).innerHTML = info.leases6[i].duid; | |
tr.insertCell(-1).innerHTML = timestr; | |
} | |
if( ls6.rows.length == 1 ) | |
{ | |
var tr = ls6.rows[0].parentNode.insertRow(-1); | |
tr.className = 'cbi-section-table-row'; | |
var td = tr.insertCell(-1); | |
td.colSpan = 4; | |
td.innerHTML = '<em><br /><%:There are no active leases.%></em>'; | |
} | |
} | |
<% end %> | |
<% if has_wifi then %> | |
var assoclist = [ ]; | |
var ws = document.getElementById('wifi_status_table'); | |
if (ws) | |
{ | |
var wsbody = ws.rows[0].parentNode; | |
while (ws.rows.length > 0) | |
wsbody.deleteRow(0); | |
for (var didx = 0; didx < info.wifinets.length; didx++) | |
{ | |
var dev = info.wifinets[didx]; | |
var tr = wsbody.insertRow(-1); | |
var td; | |
td = tr.insertCell(-1); | |
td.width = "33%"; | |
td.innerHTML = dev.name; | |
td.style.verticalAlign = "top"; | |
td = tr.insertCell(-1); | |
var s = ''; | |
for (var nidx = 0; nidx < dev.networks.length; nidx++) | |
{ | |
var net = dev.networks[nidx]; | |
var is_assoc = (net.bssid != '00:00:00:00:00:00' && net.channel); | |
var icon; | |
if (!is_assoc) | |
icon = "<%=resource%>/icons/signal-none.png"; | |
else if (net.quality == 0) | |
icon = "<%=resource%>/icons/signal-0.png"; | |
else if (net.quality < 25) | |
icon = "<%=resource%>/icons/signal-0-25.png"; | |
else if (net.quality < 50) | |
icon = "<%=resource%>/icons/signal-25-50.png"; | |
else if (net.quality < 75) | |
icon = "<%=resource%>/icons/signal-50-75.png"; | |
else | |
icon = "<%=resource%>/icons/signal-75-100.png"; | |
s += String.format( | |
'<table><tr><td style="text-align:center; width:32px; padding:3px">' + | |
'<img src="%s" title="<%:Signal%>: %d dBm / <%:Noise%>: %d dBm" />' + | |
'<br /><small>%d%%</small>' + | |
'</td><td style="text-align:left; padding:3px"><small>' + | |
'<strong><%:SSID%>:</strong> <a href="%s">%h</a><br />' + | |
'<strong><%:Mode%>:</strong> %s<br />' + | |
'<strong><%:Channel%>:</strong> %d (%.3f <%:GHz%>)<br />' + | |
'<strong><%:Bitrate%>:</strong> %s <%:Mbit/s%><br />', | |
icon, net.signal, net.noise, | |
net.quality, | |
net.link, net.ssid, | |
net.mode, | |
net.channel, net.frequency, | |
net.bitrate || '?' | |
); | |
if (is_assoc) | |
{ | |
s += String.format( | |
'<strong><%:BSSID%>:</strong> %s<br />' + | |
'<strong><%:Encryption%>:</strong> %s', | |
net.bssid, | |
net.encryption | |
); | |
} | |
else | |
{ | |
s += '<em><%:Wireless is disabled or not associated%></em>'; | |
} | |
s += '</small></td></tr></table>'; | |
for (var bssid in net.assoclist) | |
{ | |
assoclist.push({ | |
bssid: bssid, | |
signal: net.assoclist[bssid].signal, | |
noise: net.assoclist[bssid].noise, | |
rx_rate: net.assoclist[bssid].rx_rate, | |
rx_mcs: net.assoclist[bssid].rx_mcs, | |
rx_40mhz: net.assoclist[bssid].rx_40mhz, | |
tx_rate: net.assoclist[bssid].tx_rate, | |
tx_mcs: net.assoclist[bssid].tx_mcs, | |
tx_40mhz: net.assoclist[bssid].tx_40mhz, | |
link: net.link, | |
name: net.name | |
}); | |
} | |
} | |
if (!s) | |
s = '<em><%:No information available%></em>'; | |
td.innerHTML = s; | |
} | |
} | |
var ac = document.getElementById('wifi_assoc_table'); | |
if (ac) | |
{ | |
/* clear all rows */ | |
while( ac.rows.length > 1 ) | |
ac.rows[0].parentNode.deleteRow(1); | |
assoclist.sort(function(a, b) { | |
return (a.name == b.name) | |
? (a.bssid < b.bssid) | |
: (a.name > b.name ) | |
; | |
}); | |
for( var i = 0; i < assoclist.length; i++ ) | |
{ | |
var tr = ac.rows[0].parentNode.insertRow(-1); | |
tr.className = 'cbi-section-table-row cbi-rowstyle-' + (1 + (i % 2)); | |
var icon; | |
var q = (-1 * (assoclist[i].noise - assoclist[i].signal)) / 5; | |
if (q < 1) | |
icon = "<%=resource%>/icons/signal-0.png"; | |
else if (q < 2) | |
icon = "<%=resource%>/icons/signal-0-25.png"; | |
else if (q < 3) | |
icon = "<%=resource%>/icons/signal-25-50.png"; | |
else if (q < 4) | |
icon = "<%=resource%>/icons/signal-50-75.png"; | |
else | |
icon = "<%=resource%>/icons/signal-75-100.png"; | |
tr.insertCell(-1).innerHTML = String.format( | |
'<img src="%s" title="<%:Signal%>: %d <%:dBm%> / <%:Noise%>: %d <%:dBm%>" />', | |
icon, assoclist[i].signal, assoclist[i].noise | |
); | |
tr.insertCell(-1).innerHTML = assoclist[i].bssid; | |
tr.insertCell(-1).innerHTML = String.format( | |
'<a href="%s">%h</a>', | |
assoclist[i].link, | |
assoclist[i].name | |
); | |
tr.insertCell(-1).innerHTML = String.format('%d <%:dBm%>', assoclist[i].signal); | |
tr.insertCell(-1).innerHTML = String.format('%d <%:dBm%>', assoclist[i].noise); | |
tr.insertCell(-1).innerHTML = (assoclist[i].rx_mcs > -1) | |
? String.format('%.1f <%:Mbit/s%>, MCS %d, %d<%:MHz%>', assoclist[i].rx_rate / 1000, assoclist[i].rx_mcs, assoclist[i].rx_40mhz ? 40 : 20) | |
: String.format('%.1f <%:Mbit/s%>', assoclist[i].rx_rate / 1000) | |
; | |
tr.insertCell(-1).innerHTML = (assoclist[i].tx_mcs > -1) | |
? String.format('%.1f <%:Mbit/s%>, MCS %d, %d<%:MHz%>', assoclist[i].tx_rate / 1000, assoclist[i].tx_mcs, assoclist[i].tx_40mhz ? 40 : 20) | |
: String.format('%.1f <%:Mbit/s%>', assoclist[i].tx_rate / 1000) | |
; | |
} | |
if (ac.rows.length == 1) | |
{ | |
var tr = ac.rows[0].parentNode.insertRow(-1); | |
tr.className = 'cbi-section-table-row'; | |
var td = tr.insertCell(-1); | |
td.colSpan = 7; | |
td.innerHTML = '<br /><em><%:No information available%></em>'; | |
} | |
} | |
<% end %> | |
var e; | |
if (e = document.getElementById('localtime')) | |
e.innerHTML = info.localtime; | |
if (e = document.getElementById('uptime')) | |
e.innerHTML = String.format('%t', info.uptime); | |
if (e = document.getElementById('loadavg')) | |
e.innerHTML = String.format('%.02f, %.02f, %.02f', | |
info.loadavg[0], info.loadavg[1], info.loadavg[2]); | |
if (e = document.getElementById('memtotal')) | |
e.innerHTML = progressbar( | |
(info.memfree + info.membuffers + info.memcached) + " <%:kB%>", | |
info.memtotal + " <%:kB%>" | |
); | |
if (e = document.getElementById('memfree')) | |
e.innerHTML = progressbar( | |
info.memfree + " <%:kB%>", info.memtotal + " <%:kB%>" | |
); | |
if (e = document.getElementById('memcache')) | |
e.innerHTML = progressbar( | |
info.memcached + " <%:kB%>", info.memtotal + " <%:kB%>" | |
); | |
if (e = document.getElementById('membuff')) | |
e.innerHTML = progressbar( | |
info.membuffers + " <%:kB%>", info.memtotal + " <%:kB%>" | |
); | |
if (e = document.getElementById('conns')) | |
e.innerHTML = progressbar(info.conncount, info.connmax); | |
} | |
); | |
//]]></script> | |
<h2><a id="content" name="content"><%:Status%></a></h2> | |
<fieldset class="cbi-section"> | |
<legend><%:System%></legend> | |
<table width="100%" cellspacing="10"> | |
<tr><td width="33%"><%:Router Name%></td><td><%=luci.sys.hostname() or "?"%></td></tr> | |
<tr><td width="33%"><%:Router Model%></td><td><%=pcdata(model or "?")%></td></tr> | |
<tr><td width="33%"><%:Firmware Version%></td><td> | |
<%=pcdata(luci.version.distname)%> <%=pcdata(luci.version.distversion)%> / | |
<%=pcdata(luci.version.luciname)%> (<%=pcdata(luci.version.luciversion)%>) | |
</td></tr> | |
<tr><td width="33%"><%:Kernel Version%></td><td><%=luci.sys.exec("uname -r")%></td></tr> | |
<tr><td width="33%"><%:Local Time%></td><td id="localtime">-</td></tr> | |
<tr><td width="33%"><%:Uptime%></td><td id="uptime">-</td></tr> | |
<tr><td width="33%"><%:Load Average%></td><td id="loadavg">-</td></tr> | |
</table> | |
</fieldset> | |
<fieldset class="cbi-section"> | |
<legend><%:Memory%></legend> | |
<table width="100%" cellspacing="10"> | |
<tr><td width="33%"><%:Total Available%></td><td id="memtotal">-</td></tr> | |
<tr><td width="33%"><%:Free%></td><td id="memfree">-</td></tr> | |
<tr><td width="33%"><%:Cached%></td><td id="memcache">-</td></tr> | |
<tr><td width="33%"><%:Buffered%></td><td id="membuff">-</td></tr> | |
</table> | |
</fieldset> | |
<fieldset class="cbi-section"> | |
<legend><%:Network%></legend> | |
<table width="100%" cellspacing="10"> | |
<tr><td width="33%" style="vertical-align:top"><%:IPv4 WAN Status%></td><td> | |
<table><tr> | |
<td id="wan4_i" style="width:16px; text-align:center; padding:3px"><img src="<%=resource%>/icons/ethernet_disabled.png" /><br /><small>?</small></td> | |
<td id="wan4_s" style="vertical-align:middle; padding: 3px"><em><%:Collecting data...%></em></td> | |
</tr></table> | |
</td></tr> | |
<% if has_ipv6 then %> | |
<tr><td width="33%" style="vertical-align:top"><%:IPv6 WAN Status%></td><td> | |
<table><tr> | |
<td id="wan6_i" style="width:16px; text-align:center; padding:3px"><img src="<%=resource%>/icons/ethernet_disabled.png" /><br /><small>?</small></td> | |
<td id="wan6_s" style="vertical-align:middle; padding: 3px"><em><%:Collecting data...%></em></td> | |
</tr></table> | |
</td></tr> | |
<% end %> | |
<tr><td width="33%"><%:Active Connections%></td><td id="conns">-</td></tr> | |
</table> | |
</fieldset> | |
<% if has_dhcp then %> | |
<fieldset class="cbi-section"> | |
<legend><%:DHCP Leases%></legend> | |
<table class="cbi-section-table" id="lease_status_table"> | |
<tr class="cbi-section-table-titles"> | |
<th class="cbi-section-table-cell"><%:Hostname%></th> | |
<th class="cbi-section-table-cell"><%:IPv4-Address%></th> | |
<th class="cbi-section-table-cell"><%:MAC-Address%></th> | |
<th class="cbi-section-table-cell"><%:Leasetime remaining%></th> | |
</tr> | |
<tr class="cbi-section-table-row"> | |
<td colspan="4"><em><br /><%:Collecting data...%></em></td> | |
</tr> | |
</table> | |
</fieldset> | |
<fieldset class="cbi-section" style="display:none"> | |
<legend><%:DHCPv6 Leases%></legend> | |
<table class="cbi-section-table" id="lease6_status_table"> | |
<tr class="cbi-section-table-titles"> | |
<th class="cbi-section-table-cell"><%:Hostname%></th> | |
<th class="cbi-section-table-cell"><%:IPv6-Address%></th> | |
<th class="cbi-section-table-cell"><%:DUID%></th> | |
<th class="cbi-section-table-cell"><%:Leasetime remaining%></th> | |
</tr> | |
<tr class="cbi-section-table-row"> | |
<td colspan="4"><em><br /><%:Collecting data...%></em></td> | |
</tr> | |
</table> | |
</fieldset> | |
<% end %> | |
<% if has_wifi then %> | |
<fieldset class="cbi-section"> | |
<legend><%:Wireless%></legend> | |
<table id="wifi_status_table" width="100%" cellspacing="10"> | |
<tr><td><em><%:Collecting data...%></em></td></tr> | |
</table> | |
</fieldset> | |
<fieldset class="cbi-section"> | |
<legend><%:Associated Stations%></legend> | |
<table class="cbi-section-table" id="wifi_assoc_table"> | |
<tr class="cbi-section-table-titles"> | |
<th class="cbi-section-table-cell"> </th> | |
<th class="cbi-section-table-cell"><%:MAC-Address%></th> | |
<th class="cbi-section-table-cell"><%:Network%></th> | |
<th class="cbi-section-table-cell"><%:Signal%></th> | |
<th class="cbi-section-table-cell"><%:Noise%></th> | |
<th class="cbi-section-table-cell"><%:RX Rate%></th> | |
<th class="cbi-section-table-cell"><%:TX Rate%></th> | |
</tr> | |
<tr class="cbi-section-table-row"> | |
<td colspan="7"><em><br /><%:Collecting data...%></em></td> | |
</tr> | |
</table> | |
</fieldset> | |
<% end %> | |
<%- | |
require "luci.util" | |
require "nixio.fs" | |
local plugins = nixio.fs.dir(luci.util.libpath() .. "/view/admin_status/index") | |
if plugins then | |
local inc | |
for inc in plugins do | |
if inc:match("%.htm$") then | |
include("admin_status/index/" .. inc:gsub("%.htm$", "")) | |
end | |
end | |
end | |
-%> | |
<%+footer%> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment