3 // Requires js-storage, jquery, and sparkline be loaded prior
5 // dragorn@kismetwireless.net
6 // MIT/GPL License (pick one); the web ui code is licensed more
7 // freely than GPL to reflect the generally MIT-licensed nature
8 // of the web/jquery environment
12 var local_uri_prefix = "";
13 if (typeof(KISMET_URI_PREFIX) !== 'undefined')
14 local_uri_prefix = KISMET_URI_PREFIX;
20 var options = base_options;
30 var packetgraph = null;
34 style: 'padding: 2px; border: 0px;'
39 style: 'padding-bottom: 2px;'
45 style: "border: 0px !important; width: 100%;",
50 $('<td>').html('Total Packets')
61 $('<td>').html('Duplicates')
72 $('<td>').html('Packet queue backlog')
83 $('<td>').html('Dropped queue')
94 $('<td>').html('Errors')
104 // Close the alert panel if we click outside it
105 var close_dialog_outside = function(e) {
107 (e != null && $(e.target).closest('#packetdialog').length == 0)) {
109 if (dialog != null) {
114 // Remove the handler
115 $('body').off('click', close_dialog_outside);
117 // Don't pass the click on
118 e.stopImmediatePropagation();
122 var open_dialog = function(e) {
123 if (dialog != null) {
124 close_dialog_outside(e);
126 e.stopImmediatePropagation();
130 var fullscreen = false;
133 //var nominal_h = ($(window).height() / 3) * 2;
138 if ($(window).width() < 450) {
139 nominal_w = $(window).width() - 5;
140 nominal_h = $(window).height() - 5;
148 "autoposition": "RIGHT"
153 // Position under the element
154 var off_y = (nominal_h / 2) + (element.outerHeight() / 2) + 3;
156 // left-ish of the icon
157 var off_x = (nominal_w / 5) * 2;
160 // Where the outer border lands
161 var outerborder = off_x + (nominal_w / 2);
173 $('.kg-header-close', popup_content).show();
183 content: popup_content,
186 $("body").on("click", close_dialog_outside);
188 e.stopImmediatePropagation();
192 var packet_refresh = function() {
193 if (kismet_ui.window_visible) {
194 $.get(local_uri_prefix + "packetchain/packet_stats.json")
195 .done(function(data) {
196 data = kismet.sanitizeObject(data);
200 kismet.RecalcRrdData2(data['kismet.packetchain.packets_rrd'], kismet.RRD_SECOND, {
201 transform: function(data, opt) {
204 var ret = new Array();
206 for (var ri = 0; ri < data.length; ri++) {
207 peak = Math.max(peak, data[ri]);
209 if ((ri % slices) == (slices - 1)) {
220 kismet.RecalcRrdData2(
221 data['kismet.packetchain.error_packets_rrd'], kismet.RRD_SECOND, {
222 transform: function(data, opt) {
225 var ret = new Array();
227 for (var ri = 0; ri < data.length; ri++) {
228 peak = Math.max(peak, data[ri]);
230 if ((ri % slices) == (slices - 1)) {
241 kismet.RecalcRrdData2(
242 data['kismet.packetchain.dupe_packets_rrd'], kismet.RRD_SECOND, {
243 transform: function(data, opt) {
246 var ret = new Array();
248 for (var ri = 0; ri < data.length; ri++) {
249 peak = Math.max(peak, data[ri]);
251 if ((ri % slices) == (slices - 1)) {
262 kismet.RecalcRrdData2(
263 data['kismet.packetchain.queued_packets_rrd'], kismet.RRD_SECOND, {
264 transform: function(data, opt) {
267 var ret = new Array();
269 for (var ri = 0; ri < data.length; ri++) {
270 peak = Math.max(peak, data[ri]);
272 if ((ri % slices) == (slices - 1)) {
283 kismet.RecalcRrdData2(
284 data['kismet.packetchain.dropped_packets_rrd'], kismet.RRD_SECOND, {
285 transform: function(data, opt) {
288 var ret = new Array();
290 for (var ri = 0; ri < data.length; ri++) {
291 peak = Math.max(peak, data[ri]);
293 if ((ri % slices) == (slices - 1)) {
305 for (var i = 0; i < rate_rrd.length; i++) {
306 combo_rrd.push([rate_rrd[i], dupe_rrd[i]]);
310 packetgraph.sparkline(combo_rrd, {
315 $('#rate', popup_content).sparkline(rate_rrd, {
320 $('#error', popup_content).sparkline(error_rrd, {
325 $('#dupe', popup_content).sparkline(dupe_rrd, {
330 $('#queue', popup_content).sparkline(queue_rrd, {
335 $('#drop', popup_content).sparkline(drop_rrd, {
346 timerid = setTimeout(packet_refresh, 1000);
349 timerid = setTimeout(packet_refresh, 1000);
354 $.fn.packetrate = function(data, inopt) {
355 // Get the stored value if one exists
356 storage = Storages.localStorage;
360 element.addClass('kg-top-icon');
362 options = $.extend(base_options, inopt);
364 packetgraph = $('div.icon', this);
365 if (packetgraph.length == 0) {
366 packetgraph = $('<div>', {
373 click = $('a.packetbutton', this);
375 if (click.length != 0) {
381 class: "packetbutton"
383 .on('click', open_dialog);
385 click.append(packetgraph);
386 element.append(click);
388 packetgraph.sparkline([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], {
395 element.tooltipster({
399 kismet_ui_base.SubscribeEventbus("PACKETCHAIN_STATS", [], function(data) {
400 data = kismet.sanitizeObject(data);
404 kismet.RecalcRrdData2(data['kismet.packetchain.packets_rrd'], kismet.RRD_SECOND, {
405 transform: function(data, opt) {
408 var ret = new Array();
410 for (var ri = 0; ri < data.length; ri++) {
411 peak = Math.max(peak, data[ri]);
413 if ((ri % slices) == (slices - 1)) {
424 kismet.RecalcRrdData2(
425 data['kismet.packetchain.error_packets_rrd'], kismet.RRD_SECOND, {
426 transform: function(data, opt) {
429 var ret = new Array();
431 for (var ri = 0; ri < data.length; ri++) {
432 peak = Math.max(peak, data[ri]);
434 if ((ri % slices) == (slices - 1)) {
445 kismet.RecalcRrdData2(
446 data['kismet.packetchain.dupe_packets_rrd'], kismet.RRD_SECOND, {
447 transform: function(data, opt) {
450 var ret = new Array();
452 for (var ri = 0; ri < data.length; ri++) {
453 peak = Math.max(peak, data[ri]);
455 if ((ri % slices) == (slices - 1)) {
466 kismet.RecalcRrdData2(
467 data['kismet.packetchain.queued_packets_rrd'], kismet.RRD_SECOND, {
468 transform: function(data, opt) {
471 var ret = new Array();
473 for (var ri = 0; ri < data.length; ri++) {
474 peak = Math.max(peak, data[ri]);
476 if ((ri % slices) == (slices - 1)) {
487 kismet.RecalcRrdData2(
488 data['kismet.packetchain.dropped_packets_rrd'], kismet.RRD_SECOND, {
489 transform: function(data, opt) {
492 var ret = new Array();
494 for (var ri = 0; ri < data.length; ri++) {
495 peak = Math.max(peak, data[ri]);
497 if ((ri % slices) == (slices - 1)) {
509 for (var i = 0; i < rate_rrd.length; i++) {
510 combo_rrd.push([rate_rrd[i], dupe_rrd[i]]);
514 packetgraph.sparkline(combo_rrd, {
517 stackedBarColor: [kismet_theme.sparkline_multi_a, kismet_theme.sparkline_multi_b],
520 $('#rate', popup_content).sparkline(rate_rrd, {
523 barColor: kismet_theme.sparkline_main,
524 nullColor: kismet_theme.sparkline_main,
525 zeroColor: kismet_theme.sparkline_main,
528 $('#error', popup_content).sparkline(error_rrd, {
531 barColor: kismet_theme.sparkline_main,
532 nullColor: kismet_theme.sparkline_main,
533 zeroColor: kismet_theme.sparkline_main,
536 $('#dupe', popup_content).sparkline(dupe_rrd, {
539 barColor: kismet_theme.sparkline_main,
540 nullColor: kismet_theme.sparkline_main,
541 zeroColor: kismet_theme.sparkline_main,
544 $('#queue', popup_content).sparkline(queue_rrd, {
547 barColor: kismet_theme.sparkline_main,
548 nullColor: kismet_theme.sparkline_main,
549 zeroColor: kismet_theme.sparkline_main,
552 $('#drop', popup_content).sparkline(drop_rrd, {
555 barColor: kismet_theme.sparkline_main,
556 nullColor: kismet_theme.sparkline_main,
557 zeroColor: kismet_theme.sparkline_main,