Merge branch 'Toastman-RT' into Toastman-VLAN
[tomato.git] / release / src / router / www / status-devices.asp
blob01203ff3f8bd12f44801c1c6f078477ab5165256
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 For use with Tomato Firmware only.
8 No part of this file may be used without permission.
9 -->
10 <html>
11 <head>
12 <meta http-equiv='content-type' content='text/html;charset=utf-8'>
13 <meta name='robots' content='noindex,nofollow'>
14 <title>[<% ident(); %>] Status: Device List</title>
15 <link rel='stylesheet' type='text/css' href='tomato.css'>
16 <link rel='stylesheet' type='text/css' href='color.css'>
17 <script type='text/javascript' src='tomato.js'></script>
19 <!-- / / / -->
21 <style type='text/css'>
22 #dev-grid .co1 {
23 width: 9%;
25 #dev-grid .co2 {
26 width: 18%;
28 #dev-grid .co3 {
29 width: 14%;
31 #dev-grid .co4 {
32 width: 21%;
34 #dev-grid .co5 {
35 width: 8%;
36 text-align: right;
38 #dev-grid .co6 {
39 width: 8%;
40 text-align: center;
42 #dev-grid .co7 {
43 width: 9%;
44 text-align: right;
46 #dev-grid .co8 {
47 width: 13%;
48 text-align: right;
50 #dev-grid .header {
51 text-align: left;
53 </style>
55 <script type='text/javascript' src='debug.js'></script>
57 <script type='text/javascript' src='wireless.jsx?_http_id=<% nv(http_id); %>'></script>
58 <script type='text/javascript'>
60 ipp = '<% lipp(); %>.';
61 //<% nvram('lan_ifname,wl_ifname,wl_mode,wl_radio'); %>
62 // <% devlist(); %>
64 list = [];
66 function find(mac, ip)
68 var e, i;
70 mac = mac.toUpperCase();
71 for (i = list.length - 1; i >= 0; --i) {
72 e = list[i];
73 if (((e.mac == mac) && ((e.ip == ip) || (e.ip == '') || (ip == null))) ||
74 ((e.mac == '00:00:00:00:00:00') && (e.ip == ip))) {
75 return e;
78 return null;
81 function get(mac, ip)
83 var e, i;
85 mac = mac.toUpperCase();
86 if ((e = find(mac, ip)) != null) {
87 if (ip) e.ip = ip;
88 return e;
91 e = {
92 mac: mac,
93 ip: ip || '',
94 ifname: '',
95 unit: 0,
96 name: '',
97 rssi: '',
98 txrx: '',
99 lease: ''
101 list.push(e);
103 return e;
107 var xob = null;
109 function _deleteLease(ip)
111 form.submitHidden('dhcpd.cgi', { remove: ip });
114 function deleteLease(a, ip)
116 if (xob) return;
117 if ((xob = new XmlHttp()) == null) {
118 _deleteLease(ip);
119 return;
122 a = E(a);
123 a.innerHTML = 'deleting...';
125 xob.onCompleted = function(text, xml) {
126 a.innerHTML = '...';
127 xob = null;
129 xob.onError = function() {
130 _deleteLease(ip);
133 xob.post('dhcpd.cgi', 'remove=' + ip);
136 function addStatic(n)
138 var e = list[n];
139 cookie.set('addstatic', [e.mac, e.ip, e.name.split(',')[0]].join(','), 1);
140 location.href = 'basic-static.asp';
143 function addWF(n)
145 var e = list[n];
146 cookie.set('addmac', [e.mac, e.name.split(',')[0]].join(','), 1);
147 location.href = 'basic-wfilter.asp';
150 function addqoslimit(n)
152 var e = list[n];
153 cookie.set('addqoslimit', [e.ip, e.name.split(',')[0]].join(','), 1);
154 location.href = 'qos-qoslimit.asp';
157 var ref = new TomatoRefresh('update.cgi', 'exec=devlist', 0, 'status_devices_refresh');
159 ref.refresh = function(text)
161 eval(text);
162 dg.removeAllData();
163 dg.populate();
164 dg.resort();
165 for (var uidx = 0; uidx < wl_ifaces.length; ++uidx) {
166 E("noise"+uidx).innerHTML = wlnoise[uidx];
171 var dg = new TomatoGrid();
173 dg.sortCompare = function(a, b) {
174 var col = this.sortColumn;
175 var ra = a.getRowData();
176 var rb = b.getRowData();
177 var r;
179 switch (col) {
180 case 2:
181 r = cmpIP(ra.ip, rb.ip);
182 break;
183 case 4:
184 r = cmpInt(ra.rssi, rb.rssi);
185 break;
186 case 5:
187 r = cmpInt(ra.qual, rb.qual);
188 break;
189 default:
190 r = cmpText(a.cells[col].innerHTML, b.cells[col].innerHTML);
192 if (r == 0) {
193 r = cmpIP(ra.ip, rb.ip);
194 if (r == 0) r = cmpText(ra.ifname, rb.ifname);
196 return this.sortAscending ? r : -r;
199 dg.populate = function()
201 var i, j;
202 var a, b, c, e;
204 list = [];
206 for (i = 0; i < list.length; ++i) {
207 list[i].ip = '';
208 list[i].ifname = '';
209 list[i].unit = 0;
210 list[i].name = '';
211 list[i].rssi = '';
212 list[i].txrx = '';
213 list[i].lease = '';
216 for (i = dhcpd_lease.length - 1; i >= 0; --i) {
217 a = dhcpd_lease[i];
218 e = get(a[2], a[1]);
219 e.lease = '<small><a href="javascript:deleteLease(\'L' + i + '\',\'' + a[1] + '\')" title="Delete Lease" id="L' + i + '">' + a[3] + '</a></small>';
220 e.name = a[0];
221 e.ifname = nvram.lan_ifname;
224 for (i = wldev.length - 1; i >= 0; --i) {
225 a = wldev[i];
226 if (a[0].indexOf('wds') == 0) {
227 e = get(a[1], '-');
229 else {
230 e = get(a[1], null);
232 e.ifname = a[0];
233 e.unit = a[6] * 1;
234 e.rssi = a[2];
236 if ((a[3] > 1000) || (a[4] > 1000))
237 e.txrx = ((a[3] > 1000) ? Math.round(a[3] / 1000) : '-') + ' / ' + ((a[4] > 1000) ? Math.round(a[4] / 1000) : '-'); //+ '<br><small>Mbps</small>';
240 for (i = arplist.length - 1; i >= 0; --i) {
241 a = arplist[i];
243 if ((e = get(a[1], a[0])) != null) {
244 if (e.ifname == '') e.ifname = a[2];
248 for (i = dhcpd_static.length - 1; i >= 0; --i) {
249 a = dhcpd_static[i].split('<');
250 if (a.length < 3) continue;
252 if (a[1].indexOf('.') == -1) a[1] = (ipp + a[1]);
254 c = a[0].split(',');
255 for (j = c.length - 1; j >= 0; --j) {
256 if ((e = find(c[j], a[1])) != null) break;
258 if (j < 0) continue;
260 if (e.name == '') {
261 e.name = a[2];
263 else {
264 b = e.name.toLowerCase();
265 c = a[2].toLowerCase();
266 if ((b.indexOf(c) == -1) && (c.indexOf(b) == -1)) {
267 if (e.name != '') e.name += ', ';
268 e.name += a[2];
273 for (i = list.length - 1; i >= 0; --i) {
274 e = list[i];
276 b = e.mac;
277 if (e.mac.match(/^(..):(..):(..)/)) {
278 b += '<br><small>' +
279 '<a href="http://standards.ieee.org/cgi-bin/ouisearch?' + RegExp.$1 + '-' + RegExp.$2 + '-' + RegExp.$3 + '" target="_new" title="OUI Search">[oui]</a> ' +
280 '<a href="javascript:addStatic(' + i + ')" title="Static Lease...">[static]</a>' +
281 '<a href="javascript:addqoslimit(' + i + ')" title="QoS BW Limiter">[qoslimit]</a>';
283 if (e.rssi != '') {
284 b += ' <a href="javascript:addWF(' + i + ')" title="Wireless Filter...">[wfilter]</a>';
286 b += '</small>';
288 else {
289 b = '';
292 var ifidx = wl_uidx(e.unit);
293 if ((e.rssi !== '') && (ifidx >= 0) && (wlnoise[ifidx] < 0)) {
294 e.qual = MAX(e.rssi - wlnoise[ifidx], 0);
296 else {
297 e.qual = -1;
300 this.insert(-1, e, [
301 e.ifname, b, (e.ip == '-') ? '' : e.ip, e.name,
302 (e.rssi != 0) ? e.rssi + ' <small>dBm</small>' : '',
303 (e.qual < 0) ? '' : '<small>' + e.qual + '</small> <img src="bar' + MIN(MAX(Math.floor(e.qual / 10), 1), 6) + '.gif">',
304 e.txrx, e.lease], false);
308 dg.setup = function()
310 this.init('dev-grid', 'sort');
311 this.headerSet(['Interface', 'MAC Address', 'IP Address', 'Name', 'RSSI &nbsp; &nbsp; ', 'Quality', 'TX/RX Rate&nbsp;', 'Lease &nbsp; &nbsp; ']);
312 this.populate();
313 this.sort(2);
316 function earlyInit()
318 dg.setup();
321 function init()
323 dg.recolor();
324 ref.initPage(3000, 3);
326 </script>
327 </head>
328 <body onload='init()'>
329 <table id='container' cellspacing=0>
330 <tr><td colspan=2 id='header'>
331 <div class='title'>Tomato</div>
332 <div class='version'>Version <% version(); %></div>
333 </td></tr>
334 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
335 <td id='content'>
336 <div id='ident'><% ident(); %></div>
338 <!-- / / / -->
340 <div class='section-title'>Device List</div>
341 <div class='section'>
342 <table id='dev-grid' class='tomato-grid' cellspacing=0></table>
344 <script type='text/javascript'>
345 f = [];
346 for (var uidx = 0; uidx < wl_ifaces.length; ++uidx) {
347 var u = wl_unit(uidx);
348 if (nvram['wl'+u+'_radio'] == '1') {
349 var a = '';
350 if ((nvram['wl'+u+'_mode'] == 'ap') || (nvram['wl'+u+'_mode'] == 'wds'))
351 a = '&nbsp;&nbsp;&nbsp; <input type="button" value="Measure" onclick="javascript:window.location=\'wlmnoise.cgi?_http_id=' + nvram.http_id + '&_wl_unit=' + u +'\'">';
352 f.push( { title: '<b>Noise Floor (' + wl_ifaces[uidx][0] + ')&nbsp;:</b>',
353 prefix: '<span id="noise'+uidx+'">',
354 custom: wlnoise[uidx],
355 suffix: '</span>&nbsp;<small>dBm</small>' + a } );
358 createFieldTable('', f);
359 </script>
361 </div>
363 <!-- / / / -->
365 </td></tr>
366 <tr><td id='footer' colspan=2><script type='text/javascript'>genStdRefresh(1,1,'ref.toggle()');</script></td></tr>
367 </table>
368 <script type='text/javascript'>earlyInit();</script>
369 </body>
370 </html>