1 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML
4.0//EN'
>
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.
12 <meta http-equiv='content-type' content='text/html;charset=utf-
8'
>
13 <meta name='robots' content='noindex,nofollow'
>
14 <title>[<%
ident(); %>] QoS: <% translate(
"View Details"); %
></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>
20 <style type='text/css'
>
32 <script type='text/javascript' src='debug.js'
></script>
33 <script type='text/javascript' src='protocols.js'
></script>
35 <script type='text/javascript'
>
36 // <% nvram(''); %> // http_id
38 var abc
= ['<% translate("Unclassified"); %>', '<% translate("Highest"); %>', '<% translate("High"); %>', '<% translate("Medium"); %>', '<% translate("Low"); %>', '<% translate("Lowest"); %>', '<% translate("Class"); %> A','<% translate("Class"); %> B','<% translate("Class"); %> C','<% translate("Class"); %> D','<% translate("Class"); %> E'];
39 var colors
= ['F08080','E6E6FA','0066CC','8FBC8F','FAFAD2','ADD8E6','9ACD32','E0FFFF','90EE90','FF9933','FFF0F5'];
41 if ((viewClass
= '<% cgi_get("class"); %>') == '') {
44 else if ((isNaN(viewClass
*= 1)) || (viewClass
< 0) || (viewClass
> 10)) {
55 if ((queue
.length
== 0) || (xob
)) return;
58 xob
.onCompleted = function(text
, xml
) {
60 for (var i
= 0; i
< resolve_data
.length
; ++i
) {
61 var r
= resolve_data
[i
];
62 if (r
[1] == '') r
[1] = r
[0];
64 if (lock
== 0) grid
.setName(r
[0], r
[1]);
66 if (queue
.length
== 0) {
67 if ((lock
== 0) && (resolveCB
) && (grid
.sortColumn
== 4)) grid
.resort();
69 else setTimeout(resolve
, 500);
72 xob
.onError = function(ex
) {
76 xob
.post('resolve.cgi', 'ip=' + queue
.splice(0, 20).join(','));
81 function resolveChanged()
85 b
= E('resolve').checked
? 1 : 0;
88 cookie
.set('qos_resolve', b
);
89 if (b
) grid
.resolveAll();
93 var grid
= new TomatoGrid();
95 grid
.dataToView = function(data
) {
97 for (var col
= 0; col
< data
.length
; ++col
) {
100 s
= abc
[data
[col
]] || ('' + data
[col
]);
103 s
= (data
[col
] * 1 > 0) ? ('' + data
[col
]) : '';
107 s
= scaleSize(data
[col
] * 1);
118 grid
.sortCompare = function(a
, b
) {
120 var col
= obj
.sortColumn
;
121 var da
= a
.getRowData();
122 var db
= b
.getRowData();
131 r
= cmpInt(da
[col
], db
[col
]);
134 r
= cmpInt(da
[col
] ? da
[col
] : 10000, db
[col
] ? db
[col
] : 10000);
139 var a = fixIP(da[col]);
140 var b = fixIP(db[col]);
141 if ((a != null) && (b != null)) {
142 r = aton(a) - aton(b);
148 r
= cmpText(da
[col
], db
[col
]);
151 return obj
.sortAscending
? r
: -r
;
154 grid
.onClick = function(cell
) {
156 var ip
= row
.getRowData()[3];
157 if (this.lastClicked
!= row
) {
158 this.lastClicked
= row
;
159 if (ip
.indexOf('<') == -1) {
161 row
.style
.cursor
= 'wait';
170 grid
.resolveAll = function()
172 var i
, ip
, row
, q
, cols
, j
;
176 for (i
= 1; i
< this.tb
.rows
.length
; ++i
) {
177 row
= this.tb
.rows
[i
];
178 for (j
= cols
.length
-1; j
>= 0; j
--) {
179 ip
= row
.getRowData()[cols
[j
]];
180 if (ip
.indexOf('<') == -1) {
185 row
.style
.cursor
= 'wait';
193 grid
.setName = function(ip
, name
) {
194 var i
, row
, data
, cols
, j
;
197 for (i
= this.tb
.rows
.length
- 1; i
> 0; --i
) {
198 row
= this.tb
.rows
[i
];
199 data
= row
.getRowData();
200 for (j
= cols
.length
-1; j
>= 0; j
--) {
201 if (data
[cols
[j
]] == ip
) {
202 data
[cols
[j
]] = name
+ ((ip
.indexOf(':') != -1) ? '<br>' : ' ') + '<small>(' + ip
+ ')</small>';
203 row
.setRowData(data
);
204 row
.cells
[cols
[j
]].innerHTML
= data
[cols
[j
]];
205 row
.style
.cursor
= 'default';
211 grid
.setup = function() {
212 this.init('grid', 'sort');
213 this.headerSet(['<% translate("Proto"); %>', '<% translate("Source"); %>', '<% translate("S Port"); %>', '<% translate("Destination"); %>', '<% translate("D Port"); %>', '<% translate("Class"); %>', '<% translate("Rule"); %>', '<% translate("Bytes Out"); %>', '<% translate("Bytes In"); %>']);
216 var ref
= new TomatoRefresh('update.cgi', '', 0, 'qos_detailed');
218 ref
.refresh = function(text
)
220 var i
, b
, d
, cols
, j
;
232 grid
.lastClicked
= null;
233 grid
.removeAllData();
242 for (i
= 0; i
< ctdump
.length
; ++i
) {
244 for (j
= cols
.length
-1; j
>= 0; j
--) {
246 if (cache
[ip
] != null) {
248 b
[cols
[j
]] = cache
[ip
] + ((ip
.indexOf(':') != -1) ? '<br>' : ' ') + '<small>(' + ip
+ ')</small>';
262 d
= [protocols
[b
[0]] || b
[0], b
[2], b
[4], b
[3], b
[5], b
[8], b
[9], b
[6], b
[7]];
263 var row
= grid
.insertData(-1, d
);
264 if (cursor
) row
.style
.cursor
= cursor
;
271 setTimeout(function() { E('loading').style
.visibility
= 'hidden'; }, 100);
275 if (resolveCB
) resolve();
282 if (((c
= cookie
.get('qos_resolve')) != null) && (c
== '1')) {
283 E('resolve').checked
= resolveCB
= 1;
286 if (viewClass
!= -1) E('stitle').innerHTML
= 'View Details: ' + abc
[viewClass
];
288 ref
.postData
= 'exec=ctdump&arg0=' + viewClass
;
291 if (!ref
.running
) ref
.once
= 1;
296 <body onload='init()'
>
297 <form id='_fom' action='javascript:{}'
>
298 <table id='container' cellspacing=
0>
299 <tr><td colspan=
2 id='header'
>
300 <div class='title'
>Tomato
</div>
301 <div class='version'
><%
translate("Version"); %> <% version(); %
></div>
303 <tr id='body'
><td id='navi'
><script type='text/javascript'
>navi()</script></td>
305 <div id='ident'
><%
ident(); %></div>
309 <div class='section-title' id='stitle' onclick='document.
location=
"qos-graphs.asp"' style='cursor:pointer'
><%
translate("View Details"); %></div>
310 <div class='section'
>
311 <table id='grid' class='tomato-grid'
style=
"float:left" cellspacing=
1></table>
312 <input type='checkbox' id='resolve' onclick='resolveChanged()' onchange='resolveChanged()'
> <%
translate("Automatically Resolve Addresses"); %>
313 <div id='loading'
><br><b><%
translate("Loading"); %>...
</b></div>
319 <tr><td id='footer' colspan=
2>
320 <script type='text/javascript'
>genStdRefresh(1,10,'ref.toggle()');</script>