UI cleanup, phase 2 (partially cosmetic)
[tomato.git] / release / src-rt-6.x.4708 / router / www / ipt-details.asp
blob09806eb9accf13b84074b4fecf96a2fd4758af41
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 IP Traffic enhancements
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 <title>[<% ident(); %>] IP Traffic: Details</title>
19 <link rel='stylesheet' type='text/css' href='tomato.css'>
20 <% css(); %>
21 <script type='text/javascript' src='tomato.js'></script>
23 <!-- / / / -->
25 <style type='text/css'>
26 #grid .co2,
27 #grid .co3,
28 #grid .co4,
29 #grid .co5,
30 #grid .co6,
31 #grid .co7,
32 #grid .co8 {
33 text-align: right;
35 </style>
37 <script type='text/javascript' src='debug.js'></script>
38 <script type='text/javascript' src='protocols.js'></script>
39 <script type='text/javascript' src='bwm-hist.js'></script>
40 <script type='text/javascript' src='bwm-common.js'></script>
41 <script type='text/javascript' src='interfaces.js'></script>
43 <script type='text/javascript'>
44 // <% nvram('cstats_enable,lan_ipaddr,lan1_ipaddr,lan2_ipaddr,lan3_ipaddr,lan_netmask,lan1_netmask,lan2_netmask,lan3_netmask,dhcpd_static'); %>
46 // <% devlist(); %>
48 var cstats_busy = 0;
50 try {
51 // <% iptraffic(); %>
53 catch (ex) {
54 iptraffic = [];
55 cstats_busy = 1;
58 if (typeof(iptraffic) == 'undefined') {
59 iptraffic = [];
60 cstats_busy = 1;
63 var grid = new TomatoGrid();
65 var scale = -1;
66 var lock = 0;
68 var filterip = [];
69 var filteripe = [];
70 var filteripe_before = [];
72 var prevtimestamp = new Date().getTime();
73 var thistimestamp;
74 var difftimestamp;
75 var avgiptraffic = [];
76 var lastiptraffic = iptraffic;
78 hostnamecache = [];
80 var ref = new TomatoRefresh('update.cgi', '', 0, 'ipt_details');
81 ref.refresh = function(text) {
83 ++lock;
85 var i, b, j, k, l;
87 thistimestamp = new Date().getTime();
89 try {
90 eval(text);
92 catch (ex) {
93 iptraffic = [];
94 cstats_busy = 1;
97 difftimestamp = thistimestamp - prevtimestamp;
98 prevtimestamp = thistimestamp;
100 for (i = 0; i < iptraffic.length; ++i) {
101 b = iptraffic[i];
103 j = getArrayPosByElement(avgiptraffic, b[0], 0);
104 if (j == -1) {
105 j = avgiptraffic.length;
106 avgiptraffic[j] = [ b[0], 0, 0, 0, 0, 0, 0, 0, 0, b[9], b[10] ];
109 k = getArrayPosByElement(lastiptraffic, b[0], 0);
110 if (k == -1) {
111 k = lastiptraffic.length;
112 lastiptraffic[k] = b;
115 for (l = 1; l <= 8; ++l) {
116 avgiptraffic[j][l] = ((b[l] - lastiptraffic[k][l]) / difftimestamp * 1000);
117 lastiptraffic[k][l] = b[l];
120 avgiptraffic[j][9] = b[9];
121 avgiptraffic[j][10] = b[10];
122 lastiptraffic[k][9] = b[9];
123 lastiptraffic[k][10] = b[10];
126 setTimeout(function() { E('loading').style.visibility = 'hidden'; }, 100);
128 --lock;
130 grid.populate();
133 grid.populate = function() {
134 if ((lock) || (cstats_busy)) return;
136 var hostslisted = [];
138 var i, b, x;
139 var fskip;
141 var tx = 0;
142 var rx = 0;
143 var tcpi = 0;
144 var tcpo = 0;
145 var udpi = 0;
146 var udpo = 0;
147 var icmpi = 0;
148 var icmpo = 0;
149 var tcpconn = 0;
150 var udpconn = 0;
152 grid.removeAllData();
154 for (i = 0; i < avgiptraffic.length; ++i) {
155 fskip = 0;
156 b = avgiptraffic[i];
158 if(E('_f_onlyactive').checked) {
159 if ((b[2] < 10) && (b[3] < 10))
160 continue;
163 if (filteripe.length>0) {
164 fskip = 0;
165 for (x = 0; x < filteripe.length; ++x) {
166 if (b[0] == filteripe[x]){
167 fskip=1;
168 break;
171 if (fskip == 1) continue;
174 if (filterip.length>0) {
175 fskip = 1;
176 for (x = 0; x < filterip.length; ++x) {
177 if (b[0] == filterip[x]){
178 fskip=0;
179 break;
182 if (fskip == 1) continue;
185 rx += b[1];
186 tx += b[2];
187 tcpi += b[3];
188 tcpo += b[4];
189 udpi += b[5];
190 udpo += b[6];
191 icmpi += b[7];
192 icmpo += b[8];
193 tcpconn += b[9];
194 udpconn += b[10];
195 hostslisted.push(b[0]);
197 var h = b[0];
198 if (E('_f_hostnames').checked) {
199 if(hostnamecache[b[0]] != null) {
200 h = hostnamecache[b[0]] + ((b[0].indexOf(':') != -1) ? '<br>' : ' ') + '<small>(' + b[0] + ')</small>';
204 if (E('_f_shortcuts').checked) {
205 h = h + '<br><small>';
206 h = h + '<a href="javascript:viewQosDetail(' + i + ')" title="View QoS Details">[qosdetails]</a>';
207 h = h + '<a href="javascript:viewQosCTrates(' + i + ')" title="View transfer rates per connection">[qosrates]</a>';
208 h = h + '<a href="javascript:viewIptHistory(' + i + ')" title="View IP Traffic History">[history]</a>';
209 h = h + '<a href="javascript:addExcludeList(' + i + ')" title="Filter out this address">[hide]</a>';
210 h = h + '</small>';
213 d = [h,
214 rescale((b[1]/1024).toFixed(2)).toString(),
215 rescale((b[2]/1024).toFixed(2)).toString(),
216 b[3].toFixed(0).toString(),
217 b[4].toFixed(0).toString(),
218 b[5].toFixed(0).toString(),
219 b[6].toFixed(0).toString(),
220 b[7].toFixed(0).toString(),
221 b[8].toFixed(0).toString(),
222 b[9].toString(),
223 b[10].toString()];
225 grid.insertData(-1, d);
228 grid.resort();
229 grid.recolor();
230 grid.footerSet([ 'Total ' + ('<small><i>(' + ((hostslisted.length > 0) ? (hostslisted.length + ' hosts') : 'no data') + ')</i></small>'),
231 rescale((rx/1024).toFixed(2)).toString(),
232 rescale((tx/1024).toFixed(2)).toString(),
233 tcpi.toFixed(0).toString() + '/' + tcpo.toFixed(0).toString(),
234 udpi.toFixed(0).toString() + '/' + udpo.toFixed(0).toString(),
235 icmpi.toFixed(0).toString() + '/' + icmpo.toFixed(0).toString(),
236 tcpconn.toString(), udpconn.toString() ]);
239 grid.sortCompare = function(a, b) {
240 var col = this.sortColumn;
241 var da = a.getRowData();
242 var db = b.getRowData();
243 var r = 0;
245 switch (col) {
246 case 0: // host
247 r = cmpText(da[col], db[col]);
248 break;
249 case 1: // Download
250 case 2: // Upload
251 r = cmpFloat(da[col], db[col]);
252 break;
253 case 3: // TCP pkts
254 r = cmpInt(da[3]+da[4], db[3]+db[4]);
255 break;
256 case 4: // UDP pkts
257 r = cmpInt(da[5]+da[6], db[5]+db[6]);
258 break;
259 case 5: // ICMP pkts
260 r = cmpInt(da[7]+da[8], db[7]+db[8]);
261 break;
262 case 6: // TCP connections
263 r = cmpInt(da[9], db[9]);
264 break;
265 case 7: // UDP connections
266 r = cmpInt(da[10], db[10]);
267 break;
269 return this.sortAscending ? r : -r;
272 function popupWindow(v) {
273 window.open(v, '', 'width=1000,height=600,toolbar=no,menubar=no,scrollbars=yes,resizable=yes');
276 function viewQosDetail(n) {
277 cookie.set('qos_filterip', [avgiptraffic[n][0]], 1);
278 popupWindow('qos-detailed.asp');
281 function viewQosCTrates(n) {
282 cookie.set('qos_filterip', [avgiptraffic[n][0]], 1);
283 popupWindow('qos-ctrate.asp');
286 function viewIptHistory(n) {
287 cookie.set('ipt_filterip', [avgiptraffic[n][0]], 1);
288 popupWindow('ipt-daily.asp');
291 function addExcludeList(n) {
292 if (E('_f_filter_ipe').value.length<6) {
293 E('_f_filter_ipe').value = avgiptraffic[n][0];
294 } else {
295 if (E('_f_filter_ipe').value.indexOf(avgiptraffic[n][0]) < 0) {
296 E('_f_filter_ipe').value = E('_f_filter_ipe').value + ',' + avgiptraffic[n][0];
299 dofilter();
302 grid.dataToView = function(data) {
303 return [data[0].toString(),
304 data[1].toString(),
305 data[2].toString(),
306 data[3] + '/' + data[4],
307 data[5] + '/' + data[6],
308 data[7] + '/' + data[8],
309 data[9].toString(),
310 data[10].toString() ];
313 grid.setup = function() {
314 this.init('grid', 'sort');
315 this.headerSet(['Host', 'Download (bytes/s)', 'Upload (bytes/s)', 'TCP IN/OUT (pkt/s)', 'UDP IN/OUT (pkt/s)', 'ICMP IN/OUT (pkt/s)', 'TCP Connections', 'UDP Connections']);
318 function init() {
319 if (nvram.cstats_enable != '1') {
320 E('refresh-time').disabled = 1;
321 E('refresh-button').disabled = 1;
322 return;
325 if ((c = cookie.get('ipt_filterip')) != null) {
326 cookie.set('ipt_filterip', '', 0);
327 if (c.length>6) {
328 E('_f_filter_ip').value = E('_f_filter_ip').value + ((E('_f_filter_ip').value.length > 0) ? ',' : '') + c;
329 filterip.push(c.split(','));
333 if ((c = cookie.get('ipt_addr_hidden')) != null) {
334 if (c.length>6) {
335 E('_f_filter_ipe').value = c;
336 filteripe = c.split(',');
340 filteripe_before = filteripe;
342 if (((c = cookie.get('ipt_details_options_vis')) != null) && (c == '1')) {
343 toggleVisibility("options");
346 scale = fixInt(cookie.get('ipt_details_scale'), 0, 2, 0);
348 E('_f_scale').value = scale;
350 E('_f_onlyactive').checked = (((c = cookie.get('ipt_details_onlyactive')) != null) && (c == '1'));
352 E('_f_hostnames').checked = (((c = cookie.get('ipt_details_hostnames')) != null) && (c == '1'));
354 E('_f_shortcuts').checked = (((c = cookie.get('ipt_details_shortcuts')) != null) && (c == '1'));
356 populateCache();
357 grid.setup();
358 ref.postData = 'exec=iptraffic';
359 ref.initPage(250);
360 if (!ref.running) ref.once = 1;
361 ref.start();
364 function getArrayPosByElement(haystack, needle, index) {
365 for (var i = 0; i < haystack.length; ++i) {
366 if (haystack[i][index] == needle) {
367 return i;
370 return -1;
373 function dofilter() {
374 var i;
376 if (E('_f_filter_ip').value.length>0) {
377 filterip = E('_f_filter_ip').value.split(',');
378 for (i = 0; i < filterip.length; ++i) {
379 if ((filterip[i] = fixIP(filterip[i])) == null) {
380 filterip.splice(i,1);
383 E('_f_filter_ip').value = (filterip.length > 0) ? filterip.join(',') : '';
384 } else {
385 filterip = [];
388 if (E('_f_filter_ipe').value.length>0) {
389 filteripe = E('_f_filter_ipe').value.split(',');
390 for (i = 0; i < filteripe.length; ++i) {
391 if ((filteripe[i] = fixIP(filteripe[i])) == null) {
392 filteripe.splice(i,1);
395 E('_f_filter_ipe').value = (filteripe.length > 0) ? filteripe.join(',') : '';
396 } else {
397 filteripe = [];
400 if (filteripe_before != filteripe) {
401 cookie.set('ipt_addr_hidden', (filteripe.length > 0) ? filteripe.join(',') : '', 1);
402 filteripe_before = filteripe;
405 grid.populate();
408 function verifyFields(focused, quiet) {
409 scale = E('_f_scale').value * 1;
410 cookie.set('ipt_details_scale', E('_f_scale').value, 2);
412 cookie.set('ipt_details_onlyactive', (E('_f_onlyactive').checked ? '1' : '0'), 1);
414 cookie.set('ipt_details_hostnames', (E('_f_hostnames').checked ? '1' : '0'), 1);
416 cookie.set('ipt_details_shortcuts', (E('_f_shortcuts').checked ? '1' : '0'), 1);
418 dofilter();
419 return 1;
422 function toggleVisibility(whichone) {
423 if(E('sesdiv' + whichone).style.display=='') {
424 E('sesdiv' + whichone).style.display='none';
425 E('sesdiv' + whichone + 'showhide').innerHTML='(Click here to show)';
426 cookie.set('ipt_details_' + whichone + '_vis', 0);
427 } else {
428 E('sesdiv' + whichone).style.display='';
429 E('sesdiv' + whichone + 'showhide').innerHTML='(Click here to hide)';
430 cookie.set('ipt_details_' + whichone + '_vis', 1);
434 </script>
436 </head>
437 <body onload='init()'>
438 <form id='_fom' action='javascript:{}'>
439 <table id='container' cellspacing=0>
440 <tr><td colspan=2 id='header'>
441 <div class='title'>Tomato</div>
442 <div class='version'>Version <% version(); %></div>
443 </td></tr>
444 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
445 <td id='content'>
446 <div id='ident'><% ident(); %></div>
448 <div id='cstats'>
449 <!-- / / / -->
451 <div class='section-title'>IP Traffic Details</div>
452 <div class='section'>
453 <table id='grid' class='tomato-grid' style="float:left" cellspacing=1></table>
455 <div id='loading'><br><b>Loading...</b></div>
456 </div>
458 <!-- / / / -->
460 <div class='section-title'>Options <small><i><a href='javascript:toggleVisibility("options");'><span id='sesdivoptionsshowhide'>(Click here to show)</span></a></i></small></div>
461 <div class='section' id='sesdivoptions' style='display:none'>
462 <script type='text/javascript'>
463 var c;
464 c = [];
465 c.push({ title: 'Only these IPs', name: 'f_filter_ip', size: 50, maxlen: 255, type: 'text', suffix: ' <small>(comma separated list)</small>' });
466 c.push({ title: 'Exclude these IPs', name: 'f_filter_ipe', size: 50, maxlen: 255, type: 'text', suffix: ' <small>(comma separated list)</small>' });
467 c.push({ title: 'Scale', name: 'f_scale', type: 'select', options: [['0', 'KB'], ['1', 'MB'], ['2', 'GB']] });
468 c.push({ title: 'Ignore inactive hosts', name: 'f_onlyactive', type: 'checkbox' });
469 c.push({ title: 'Show hostnames', name: 'f_hostnames', type: 'checkbox' });
470 c.push({ title: 'Show shortcuts', name: 'f_shortcuts', type: 'checkbox' });
471 createFieldTable('',c);
472 </script>
473 <div style="float:right;text-align:right">
474 &raquo; <a href="admin-iptraffic.asp">Configure</a>
475 </div>
476 </div>
478 <!-- / / / -->
480 </div>
481 <br>
483 <script type='text/javascript'>checkCstats();</script>
486 </td></tr>
487 <tr><td id='footer' colspan=2>
488 <script type='text/javascript'>genStdRefresh(1,1,'ref.toggle()');</script>
489 </td></tr>
490 </table>
491 </form>
492 </body>
493 </html>