UI cleanup, phase 5, ARM (functional changes)
[tomato.git] / release / src-rt-6.x.4708 / router / www / status-devices.asp
blob42f5ac2a83453e9680680558234cb19bd2c469e5
1 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0//EN'>
2 <!--
3 Tomato GUI
4 Copyright (C) 2006-2010 Jonathan Zarate
5 http://www.polarcloud.com/tomato/
7 Tomato VLAN GUI
8 Copyright (C) 2011 Augusto Bott
9 http://code.google.com/p/tomato-sdhc-vlan/
11 For use with Tomato Firmware only.
12 No part of this file may be used without permission.
13 -->
14 <html>
15 <head>
16 <meta http-equiv='content-type' content='text/html;charset=utf-8'>
17 <meta name='robots' content='noindex,nofollow'>
18 <meta name="viewport" content="width=device-width">
19 <title>[<% ident(); %>] Status: Device List</title>
20 <link rel='stylesheet' type='text/css' href='tomato.css'>
21 <% css(); %>
22 <script type='text/javascript' src='tomato.js'></script>
24 <!-- / / / -->
26 <style type='text/css'>
27 #dev-grid .co1 {
28 width: 8%;
30 #dev-grid .co2 {
31 width: 20%;
33 #dev-grid .co3 {
34 width: 13%;
36 #dev-grid .co4 {
37 width: 21%;
39 #dev-grid .co5 {
40 width: 8%;
41 text-align: right;
43 #dev-grid .co6 {
44 width: 8%;
45 text-align: center;
47 #dev-grid .co7 {
48 width: 9%;
49 text-align: right;
51 #dev-grid .co8 {
52 width: 13%;
53 text-align: right;
55 #dev-grid .header {
56 text-align: left;
58 </style>
60 <script type='text/javascript' src='debug.js'></script>
62 <script type='text/javascript' src='wireless.jsx?_http_id=<% nv(http_id); %>'></script>
63 <script type='text/javascript'>
65 ipp = '<% lipp(); %>.';
66 //<% nvram('lan_ifname,wl_ifname,wl_mode,wl_radio'); %>
67 // <% devlist(); %>
69 list = [];
71 function find(mac, ip)
73 var e, i;
75 mac = mac.toUpperCase();
76 for (i = list.length - 1; i >= 0; --i) {
77 e = list[i];
78 if (((e.mac == mac) && ((e.ip == ip) || (e.ip == '') || (ip == null))) ||
79 ((e.mac == '00:00:00:00:00:00') && (e.ip == ip))) {
80 return e;
83 return null;
86 function get(mac, ip)
88 var e, i;
90 mac = mac.toUpperCase();
91 if ((e = find(mac, ip)) != null) {
92 if (ip) e.ip = ip;
93 return e;
96 e = {
97 mac: mac,
98 ip: ip || '',
99 ifname: '',
100 unit: 0,
101 name: '',
102 rssi: '',
103 txrx: '',
104 lease: ''
106 list.push(e);
108 return e;
112 var xob = null;
114 function _deleteLease(ip)
116 form.submitHidden('dhcpd.cgi', { remove: ip });
119 function deleteLease(a, ip)
121 if (xob) return;
122 if ((xob = new XmlHttp()) == null) {
123 _deleteLease(ip);
124 return;
127 a = E(a);
128 a.innerHTML = 'deleting...';
130 xob.onCompleted = function(text, xml) {
131 a.innerHTML = '...';
132 xob = null;
134 xob.onError = function() {
135 _deleteLease(ip);
138 xob.post('dhcpd.cgi', 'remove=' + ip);
141 function addStatic(n)
143 var e = list[n];
144 cookie.set('addstatic', [e.mac, e.ip, e.name.split(',')[0]].join(','), 1);
145 location.href = 'basic-static.asp';
148 function addWF(n)
150 var e = list[n];
151 cookie.set('addmac', [e.mac, e.name.split(',')[0]].join(','), 1);
152 location.href = 'basic-wfilter.asp';
155 function addbwlimit(n)
157 var e = list[n];
158 cookie.set('addbwlimit', [e.ip, e.name.split(',')[0]].join(','), 1);
159 location.href = 'bwlimit.asp';
162 var ref = new TomatoRefresh('update.cgi', 'exec=devlist', 0, 'status_devices_refresh');
164 ref.refresh = function(text)
166 eval(text);
167 dg.removeAllData();
168 dg.populate();
169 dg.resort();
170 for (var uidx = 0; uidx < wl_ifaces.length; ++uidx) {
171 if (wl_sunit(uidx)<0)
172 E("noise"+uidx).innerHTML = wlnoise[uidx];
177 var dg = new TomatoGrid();
179 dg.sortCompare = function(a, b) {
180 var col = this.sortColumn;
181 var ra = a.getRowData();
182 var rb = b.getRowData();
183 var r;
185 switch (col) {
186 case 2:
187 r = cmpIP(ra.ip, rb.ip);
188 break;
189 case 4:
190 r = cmpInt(ra.rssi, rb.rssi);
191 break;
192 case 5:
193 r = cmpInt(ra.qual, rb.qual);
194 break;
195 default:
196 r = cmpText(a.cells[col].innerHTML, b.cells[col].innerHTML);
198 if (r == 0) {
199 r = cmpIP(ra.ip, rb.ip);
200 if (r == 0) r = cmpText(ra.ifname, rb.ifname);
202 return this.sortAscending ? r : -r;
205 dg.populate = function()
207 var i, j;
208 var a, b, c, e;
210 list = [];
212 for (i = 0; i < list.length; ++i) {
213 list[i].ip = '';
214 list[i].ifname = '';
215 list[i].unit = 0;
216 list[i].name = '';
217 list[i].rssi = '';
218 list[i].txrx = '';
219 list[i].lease = '';
222 for (i = dhcpd_lease.length - 1; i >= 0; --i) {
223 a = dhcpd_lease[i];
224 e = get(a[2], a[1]);
225 e.lease = '<small><a href="javascript:deleteLease(\'L' + i + '\',\'' + a[1] + '\')" title="Delete Lease" id="L' + i + '">' + a[3] + '</a></small>';
226 e.name = a[0];
227 e.ifname = '';
230 for (i = wldev.length - 1; i >= 0; --i) {
231 a = wldev[i];
232 if (a[0].indexOf('wds') == 0) {
233 e = get(a[1], '-');
235 else {
236 e = get(a[1], null);
238 e.ifname = a[0];
239 e.unit = a[6] * 1;
240 e.rssi = a[2];
242 if ((a[3] >= 1000) || (a[4] >= 1000))
243 e.txrx = ((a[3] >= 1000) ? Math.round(a[3] / 1000) : '-') + ' / ' + ((a[4] >= 1000) ? Math.round(a[4] / 1000) : '-'); //+ '<br><small>Mbps</small>';
246 for (i = arplist.length - 1; i >= 0; --i) {
247 a = arplist[i];
249 if ((e = get(a[1], a[0])) != null) {
250 if (e.ifname == '') e.ifname = a[2];
254 for (i = dhcpd_static.length - 1; i >= 0; --i) {
255 a = dhcpd_static[i].split('<');
256 if (a.length < 3) continue;
258 if (a[1].indexOf('.') == -1) a[1] = (ipp + a[1]);
260 c = a[0].split(',');
261 for (j = c.length - 1; j >= 0; --j) {
262 if ((e = find(c[j], a[1])) != null) break;
264 if (j < 0) continue;
266 if (e.ip == '') {
267 e.ip = a[1];
270 if (e.name == '') {
271 e.name = a[2];
273 else {
274 b = e.name.toLowerCase();
275 c = a[2].toLowerCase();
276 if ((b.indexOf(c) == -1) && (c.indexOf(b) == -1)) {
277 if (e.name != '') e.name += ', ';
278 e.name += a[2];
283 for (i = list.length - 1; i >= 0; --i) {
284 e = list[i];
286 b = e.mac;
287 if (e.mac.match(/^(..):(..):(..)/)) {
288 b += '<br><small>' +
289 '<a href="http://api.macvendors.com/' + RegExp.$1 + '-' + RegExp.$2 + '-' + RegExp.$3 + '" target="_new" title="OUI Search">[oui]</a> ' +
290 '<a href="javascript:addStatic(' + i + ')" title="Static Lease...">[static]</a> ' +
291 '<a href="javascript:addbwlimit(' + i + ')" title="BW Limiter">[bwlimit]</a>';
293 if (e.rssi != '') {
294 b += ' <a href="javascript:addWF(' + i + ')" title="Wireless Filter...">[wfilter]</a>';
296 b += '</small>';
298 else {
299 b = '';
302 var ifidx = wl_uidx(e.unit);
303 if ((e.rssi !== '') && (ifidx >= 0) && (wlnoise[ifidx] < 0)) {
304 e.qual = MAX(e.rssi - wlnoise[ifidx], 0);
306 else {
307 e.qual = -1;
310 this.insert(-1, e, [
311 e.ifname, b, (e.ip == '-') ? '' : e.ip, e.name,
312 (e.rssi != 0) ? e.rssi + ' <small>dBm</small>' : '',
313 (e.qual < 0) ? '' : '<small>' + e.qual + '</small> <img src="bar' + MIN(MAX(Math.floor(e.qual / 10), 1), 6) + '.gif">',
314 e.txrx, e.lease], false);
318 dg.setup = function()
320 this.init('dev-grid', 'sort');
321 this.headerSet(['Interface', 'MAC Address', 'IP Address', 'Name', 'RSSI &nbsp; &nbsp; ', 'Quality', 'TX/RX Rate&nbsp;', 'Lease &nbsp; &nbsp; ']);
322 this.populate();
323 this.sort(2);
326 function earlyInit()
328 dg.setup();
331 function init()
333 dg.recolor();
334 ref.initPage(3000, 3);
336 </script>
337 </head>
338 <body onload='init()'>
339 <table id='container' cellspacing=0>
340 <tr><td colspan=2 id='header'>
341 <div class='title'>Tomato</div>
342 <div class='version'>Version <% version(); %></div>
343 </td></tr>
344 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
345 <td id='content'>
346 <div id='ident'><% ident(); %></div>
348 <!-- / / / -->
350 <div class='section-title'>Device List</div>
351 <div class='section'>
352 <table id='dev-grid' class='tomato-grid' cellspacing=0></table>
354 <script type='text/javascript'>
355 f = [];
356 for (var uidx = 0; uidx < wl_ifaces.length; ++uidx) {
357 var u = wl_unit(uidx);
358 if (nvram['wl'+u+'_radio'] == '1') {
359 if (wl_sunit(uidx)<0) {
360 var a = '';
361 if ((nvram['wl'+u+'_mode'] == 'ap') || (nvram['wl'+u+'_mode'] == 'wds'))
362 a = '&nbsp;&nbsp;&nbsp; <input type="button" value="Measure" onclick="javascript:window.location=\'wlmnoise.cgi?_http_id=' + nvram.http_id + '&_wl_unit=' + u +'\'">';
363 f.push( { title: '<b>Noise Floor (' + wl_ifaces[uidx][0] + ')&nbsp;:</b>',
364 prefix: '<span id="noise'+uidx+'">',
365 custom: wlnoise[uidx],
366 suffix: '</span>&nbsp;<small>dBm</small>' + a } );
370 createFieldTable('', f);
371 </script>
373 </div>
375 <!-- / / / -->
377 </td></tr>
378 <tr><td id='footer' colspan=2><script type='text/javascript'>genStdRefresh(1,0,'ref.toggle()');</script></td></tr>
379 </table>
380 <script type='text/javascript'>earlyInit();</script>
381 </body>
382 </html>