pcapr-local 0.1.10
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/LICENSE.txt +20 -0
- data/README.md +64 -0
- data/Rakefile +57 -0
- data/VERSION +1 -0
- data/bin/pcap2par +49 -0
- data/bin/startpcapr +40 -0
- data/bin/stoppcapr +33 -0
- data/bin/xtractr +5 -0
- data/lib/environment.rb +106 -0
- data/lib/exe/xtractr +0 -0
- data/lib/mu/pcap.rb +110 -0
- data/lib/mu/pcap/ethernet.rb +148 -0
- data/lib/mu/pcap/header.rb +75 -0
- data/lib/mu/pcap/io_pair.rb +67 -0
- data/lib/mu/pcap/io_wrapper.rb +76 -0
- data/lib/mu/pcap/ip.rb +61 -0
- data/lib/mu/pcap/ipv4.rb +257 -0
- data/lib/mu/pcap/ipv6.rb +148 -0
- data/lib/mu/pcap/packet.rb +104 -0
- data/lib/mu/pcap/pkthdr.rb +155 -0
- data/lib/mu/pcap/reader.rb +61 -0
- data/lib/mu/pcap/reader/http_family.rb +170 -0
- data/lib/mu/pcap/sctp.rb +367 -0
- data/lib/mu/pcap/sctp/chunk.rb +123 -0
- data/lib/mu/pcap/sctp/chunk/data.rb +134 -0
- data/lib/mu/pcap/sctp/chunk/init.rb +100 -0
- data/lib/mu/pcap/sctp/chunk/init_ack.rb +68 -0
- data/lib/mu/pcap/sctp/parameter.rb +110 -0
- data/lib/mu/pcap/sctp/parameter/ip_address.rb +48 -0
- data/lib/mu/pcap/stream_packetizer.rb +72 -0
- data/lib/mu/pcap/tcp.rb +505 -0
- data/lib/mu/pcap/udp.rb +69 -0
- data/lib/mu/scenario/pcap.rb +164 -0
- data/lib/mu/scenario/pcap/fields.rb +50 -0
- data/lib/mu/scenario/pcap/rtp.rb +71 -0
- data/lib/pcapr_local.rb +159 -0
- data/lib/pcapr_local/config.rb +336 -0
- data/lib/pcapr_local/db.rb +197 -0
- data/lib/pcapr_local/scanner.rb +250 -0
- data/lib/pcapr_local/server.rb +178 -0
- data/lib/pcapr_local/www/favicon.ico +0 -0
- data/lib/pcapr_local/www/favicon.png +0 -0
- data/lib/pcapr_local/www/home/index.html +138 -0
- data/lib/pcapr_local/www/static/image/16x16/Cancel.png +0 -0
- data/lib/pcapr_local/www/static/image/16x16/Cancel.png.1 +0 -0
- data/lib/pcapr_local/www/static/image/16x16/Download.png +0 -0
- data/lib/pcapr_local/www/static/image/16x16/Folder3.png +0 -0
- data/lib/pcapr_local/www/static/image/16x16/Full Size.png +0 -0
- data/lib/pcapr_local/www/static/image/16x16/Minus.png +0 -0
- data/lib/pcapr_local/www/static/image/16x16/Plus.png +0 -0
- data/lib/pcapr_local/www/static/image/16x16/Search.png +0 -0
- data/lib/pcapr_local/www/static/image/16x16/User.png +0 -0
- data/lib/pcapr_local/www/static/image/48x48/Phone.png +0 -0
- data/lib/pcapr_local/www/static/image/48x48/Video.png +0 -0
- data/lib/pcapr_local/www/static/image/bar-orange.gif +0 -0
- data/lib/pcapr_local/www/static/image/beta.png +0 -0
- data/lib/pcapr_local/www/static/image/bg.png +0 -0
- data/lib/pcapr_local/www/static/image/blockquote.png +0 -0
- data/lib/pcapr_local/www/static/image/body-bg.png +0 -0
- data/lib/pcapr_local/www/static/image/body-h3.png +0 -0
- data/lib/pcapr_local/www/static/image/body-hl1-bg.png +0 -0
- data/lib/pcapr_local/www/static/image/body-hl1-h3.png +0 -0
- data/lib/pcapr_local/www/static/image/body-hl1-readmore.png +0 -0
- data/lib/pcapr_local/www/static/image/body-hl2-bg.png +0 -0
- data/lib/pcapr_local/www/static/image/body-hl2-h3.png +0 -0
- data/lib/pcapr_local/www/static/image/body-hl2-readmore.png +0 -0
- data/lib/pcapr_local/www/static/image/body-hl3-bg.png +0 -0
- data/lib/pcapr_local/www/static/image/body-hl3-h3.png +0 -0
- data/lib/pcapr_local/www/static/image/body-hl3-readmore.png +0 -0
- data/lib/pcapr_local/www/static/image/body-hl4-bg.png +0 -0
- data/lib/pcapr_local/www/static/image/body-hl4-h3.png +0 -0
- data/lib/pcapr_local/www/static/image/body-hl4-readmore.png +0 -0
- data/lib/pcapr_local/www/static/image/body-hl5-h3.png +0 -0
- data/lib/pcapr_local/www/static/image/body-hl6-h3.png +0 -0
- data/lib/pcapr_local/www/static/image/body-hl7-h3.png +0 -0
- data/lib/pcapr_local/www/static/image/body-hl8-h3.png +0 -0
- data/lib/pcapr_local/www/static/image/body-readmore.png +0 -0
- data/lib/pcapr_local/www/static/image/bottom-bg.png +0 -0
- data/lib/pcapr_local/www/static/image/bottom-l.png +0 -0
- data/lib/pcapr_local/www/static/image/bottom-r.png +0 -0
- data/lib/pcapr_local/www/static/image/btn-search.png +0 -0
- data/lib/pcapr_local/www/static/image/bullet-1.png +0 -0
- data/lib/pcapr_local/www/static/image/bullet-2.png +0 -0
- data/lib/pcapr_local/www/static/image/bullet-3.png +0 -0
- data/lib/pcapr_local/www/static/image/bullet-4.png +0 -0
- data/lib/pcapr_local/www/static/image/bullet-5.png +0 -0
- data/lib/pcapr_local/www/static/image/bullet-6.png +0 -0
- data/lib/pcapr_local/www/static/image/bullet-7.png +0 -0
- data/lib/pcapr_local/www/static/image/bullet-hl1.png +0 -0
- data/lib/pcapr_local/www/static/image/bullet-hl2.png +0 -0
- data/lib/pcapr_local/www/static/image/bullet-hl3.png +0 -0
- data/lib/pcapr_local/www/static/image/bullet-hl4.png +0 -0
- data/lib/pcapr_local/www/static/image/bullet-pathway.png +0 -0
- data/lib/pcapr_local/www/static/image/bullet-section1.png +0 -0
- data/lib/pcapr_local/www/static/image/bullet-section2.png +0 -0
- data/lib/pcapr_local/www/static/image/collapsed.gif +0 -0
- data/lib/pcapr_local/www/static/image/crosslink.png +0 -0
- data/lib/pcapr_local/www/static/image/expanded.gif +0 -0
- data/lib/pcapr_local/www/static/image/favicon.ico +0 -0
- data/lib/pcapr_local/www/static/image/favicon.png +0 -0
- data/lib/pcapr_local/www/static/image/icon-author.png +0 -0
- data/lib/pcapr_local/www/static/image/icon-created.png +0 -0
- data/lib/pcapr_local/www/static/image/p-expand.gif +0 -0
- data/lib/pcapr_local/www/static/image/pcapr-logo.png +0 -0
- data/lib/pcapr_local/www/static/image/powered-by.png +0 -0
- data/lib/pcapr_local/www/static/image/section1-bg.png +0 -0
- data/lib/pcapr_local/www/static/image/section1-h3.png +0 -0
- data/lib/pcapr_local/www/static/image/section1-readmore.png +0 -0
- data/lib/pcapr_local/www/static/image/section2-bg.png +0 -0
- data/lib/pcapr_local/www/static/image/section2-h3.png +0 -0
- data/lib/pcapr_local/www/static/image/section2-readmore.png +0 -0
- data/lib/pcapr_local/www/static/image/status-alert.png +0 -0
- data/lib/pcapr_local/www/static/image/status-download.png +0 -0
- data/lib/pcapr_local/www/static/image/status-info.png +0 -0
- data/lib/pcapr_local/www/static/image/status-note.png +0 -0
- data/lib/pcapr_local/www/static/image/tab-round.png +0 -0
- data/lib/pcapr_local/www/static/image/throbber.gif +0 -0
- data/lib/pcapr_local/www/static/image/user.jpg +0 -0
- data/lib/pcapr_local/www/static/script/closet/async.js +421 -0
- data/lib/pcapr_local/www/static/script/closet/closet.api.js +241 -0
- data/lib/pcapr_local/www/static/script/closet/closet.folders.js +94 -0
- data/lib/pcapr_local/www/static/script/closet/closet.js +187 -0
- data/lib/pcapr_local/www/static/script/closet/closet.mr.js +219 -0
- data/lib/pcapr_local/www/static/script/closet/closet.options.js +359 -0
- data/lib/pcapr_local/www/static/script/closet/closet.quantity.js +73 -0
- data/lib/pcapr_local/www/static/script/closet/closet.render.js +205 -0
- data/lib/pcapr_local/www/static/script/closet/closet.report.js +86 -0
- data/lib/pcapr_local/www/static/script/closet/closet.reports.http.js +135 -0
- data/lib/pcapr_local/www/static/script/closet/closet.reports.overview.js +163 -0
- data/lib/pcapr_local/www/static/script/closet/closet.reports.sip.js +159 -0
- data/lib/pcapr_local/www/static/script/closet/closet.reports.tcp.js +72 -0
- data/lib/pcapr_local/www/static/script/closet/closet.reports.visualize.js +263 -0
- data/lib/pcapr_local/www/static/script/closet/closet.util.js +40 -0
- data/lib/pcapr_local/www/static/script/jquery/jquery-1.4.2.min.js +154 -0
- data/lib/pcapr_local/www/static/script/jquery/jquery-ui.js +10921 -0
- data/lib/pcapr_local/www/static/script/jquery/jquery.flot.js +2123 -0
- data/lib/pcapr_local/www/static/script/jquery/jquery.flot.selection.js +184 -0
- data/lib/pcapr_local/www/static/script/jquery/jquery.flot.stack.js +184 -0
- data/lib/pcapr_local/www/static/script/jquery/jquery.form.js +643 -0
- data/lib/pcapr_local/www/static/script/jquery/jquery.jsonp.min.js +3 -0
- data/lib/pcapr_local/www/static/script/jquery/jquery.menu.js +142 -0
- data/lib/pcapr_local/www/static/script/jquery/jquery.suggest.js +308 -0
- data/lib/pcapr_local/www/static/script/jquery/jquery.ui.core.js +203 -0
- data/lib/pcapr_local/www/static/script/jquery/jquery.ui.slider.js +629 -0
- data/lib/pcapr_local/www/static/script/jquery/jquery.ui.sortable.js +1055 -0
- data/lib/pcapr_local/www/static/script/jquery/jquery.ui.widget.js +236 -0
- data/lib/pcapr_local/www/static/script/json2.js +481 -0
- data/lib/pcapr_local/www/static/script/sammy/plugins/sammy.cache.js +115 -0
- data/lib/pcapr_local/www/static/script/sammy/plugins/sammy.template.js +117 -0
- data/lib/pcapr_local/www/static/script/sammy/sammy.js +1696 -0
- data/lib/pcapr_local/www/static/script/tipsy/jquery.tipsy.js +104 -0
- data/lib/pcapr_local/www/static/style/c3p0.css +116 -0
- data/lib/pcapr_local/www/static/style/jquery.suggest.css +27 -0
- data/lib/pcapr_local/www/static/style/page.css +1113 -0
- data/lib/pcapr_local/www/static/style/tipsy.css +7 -0
- data/lib/pcapr_local/www/templates/browse.services.template +10 -0
- data/lib/pcapr_local/www/templates/browse.template +77 -0
- data/lib/pcapr_local/www/templates/flows.template +38 -0
- data/lib/pcapr_local/www/templates/pcap.template +63 -0
- data/lib/pcapr_local/www/templates/sip.calls.template +35 -0
- data/lib/pcapr_local/www/templates/statistics.template +6 -0
- data/lib/pcapr_local/xtractr.rb +179 -0
- data/lib/pcapr_local/xtractr/instance.rb +172 -0
- data/pcapr-local.gemspec +297 -0
- data/test/mu/pcap/reader/tc_http_family.rb +251 -0
- data/test/mu/pcap/tc_ethernet.rb +71 -0
- data/test/mu/pcap/tc_header.rb +56 -0
- data/test/mu/pcap/tc_ipv4.rb +103 -0
- data/test/mu/pcap/tc_ipv6.rb +83 -0
- data/test/mu/pcap/tc_packet.rb +44 -0
- data/test/mu/pcap/tc_pair.rb +58 -0
- data/test/mu/pcap/tc_pkthdr.rb +33 -0
- data/test/mu/pcap/tc_reader.rb +76 -0
- data/test/mu/pcap/tc_tcp.rb +426 -0
- data/test/mu/pcap/tc_udp.rb +33 -0
- data/test/mu/pcap/tc_wrapper.rb +80 -0
- data/test/mu/scenario/pcap/tc_fields.rb +67 -0
- data/test/mu/scenario/pcap/tc_rtp.rb +135 -0
- data/test/mu/scenario/sip_signalled_call_1.pcap +0 -0
- data/test/mu/scenario/tc_pcap.rb +190 -0
- data/test/mu/scenario/test_data/arp.pcap +0 -0
- data/test/mu/scenario/test_data/dns.pcap +0 -0
- data/test/mu/scenario/test_data/http-v6.pcap +0 -0
- data/test/mu/scenario/test_data/http.pcap +0 -0
- data/test/mu/scenario/test_data/http_chunked.pcap +0 -0
- data/test/mu/scenario/test_data/http_deflate.pcap +0 -0
- data/test/mu/scenario/test_data/httpauth3.pcap +0 -0
- data/test/mu/scenario/test_data/icmp.pcap +0 -0
- data/test/mu/scenario/test_data/sip_signalled_call_1.pcap +0 -0
- data/test/mu/tc_pcap.rb +39 -0
- data/test/mu/testcase.rb +86 -0
- data/test/pcapr_local/arp.pcap +0 -0
- data/test/pcapr_local/data.js +3 -0
- data/test/pcapr_local/http_chunked.pcap +0 -0
- data/test/pcapr_local/tc_api.rb +181 -0
- data/test/pcapr_local/test.tgz +0 -0
- data/test/pcapr_local/test_scanner.rb +241 -0
- data/test/pcapr_local/test_xtractr.rb +219 -0
- data/test/pcapr_local/testcase.rb +107 -0
- data/test/test_export_to_scenario.sh +25 -0
- data/test/test_pcapr_local.rb +29 -0
- metadata +450 -0
@@ -0,0 +1,73 @@
|
|
1
|
+
var closet = closet || {};
|
2
|
+
closet.quantity = (function() {
|
3
|
+
return {
|
4
|
+
bytes: function(size) {
|
5
|
+
if (size > 1024*1024) {
|
6
|
+
var mb = Math.round(size/1024/1024);
|
7
|
+
return mb + ' MB';
|
8
|
+
} else if (size > 1024) {
|
9
|
+
var kb = Math.round(size/1024);
|
10
|
+
return kb + ' KB';
|
11
|
+
} else {
|
12
|
+
return size + ' byte' + (size == 1 ? '' : 's');
|
13
|
+
}
|
14
|
+
},
|
15
|
+
timespan: function(date) {
|
16
|
+
var today = new Date();
|
17
|
+
var seconds = (today.getTime() - date.getTime())/1000;
|
18
|
+
|
19
|
+
if (seconds < 30) {
|
20
|
+
return 'just now';
|
21
|
+
} else if (seconds < 90) {
|
22
|
+
return 'a minute ago';
|
23
|
+
}
|
24
|
+
|
25
|
+
var minutes = seconds/60;
|
26
|
+
if (minutes < 20) {
|
27
|
+
return 'few minutes ago';
|
28
|
+
} else if (minutes < 45) {
|
29
|
+
return 'half hour ago';
|
30
|
+
} else if (minutes < 90) {
|
31
|
+
return 'an hour ago';
|
32
|
+
}
|
33
|
+
|
34
|
+
var hours = minutes/60;
|
35
|
+
if (hours < today.getHours()) {
|
36
|
+
return 'earlier today';
|
37
|
+
} else if (hours < today.getHours() + 24) {
|
38
|
+
return 'yesterday';
|
39
|
+
}
|
40
|
+
|
41
|
+
var days = hours/24;
|
42
|
+
if (days < today.getDay()) {
|
43
|
+
return 'earlier this week';
|
44
|
+
} else if (days < today.getDay() + 7) {
|
45
|
+
return 'last week';
|
46
|
+
} else if (days < 30) {
|
47
|
+
return 'a few weeks ago';
|
48
|
+
}
|
49
|
+
|
50
|
+
var months = [
|
51
|
+
"January", "February", "March", "April", "May", "June",
|
52
|
+
"July", "August", "September", "October", "November",
|
53
|
+
"December"
|
54
|
+
];
|
55
|
+
var year = date.getFullYear();
|
56
|
+
var month = date.getMonth();
|
57
|
+
if (year == today.getFullYear()) {
|
58
|
+
if (month == today.getMonth()) {
|
59
|
+
return 'earlier this month';
|
60
|
+
} else if (month == today.getMonth() - 1) {
|
61
|
+
return 'last month';
|
62
|
+
} else {
|
63
|
+
return 'last ' + months[month];
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
67
|
+
return months[month] + ' ' + year;
|
68
|
+
},
|
69
|
+
count: function(value, singular, plural) {
|
70
|
+
return value + ' ' + (value === 1 ? singular : plural ? plural : singular + 's');
|
71
|
+
}
|
72
|
+
};
|
73
|
+
}());
|
@@ -0,0 +1,205 @@
|
|
1
|
+
var closet = closet || {};
|
2
|
+
|
3
|
+
(function($) {
|
4
|
+
closet.render = (function() {
|
5
|
+
return {
|
6
|
+
bars: function($root, kvs, opts) {
|
7
|
+
opts = opts || {};
|
8
|
+
opts.label = opts.label || '';
|
9
|
+
|
10
|
+
var series = [];
|
11
|
+
$.each(kvs.rows, function(i, row) {
|
12
|
+
series.push([ row.key, row.value ]);
|
13
|
+
});
|
14
|
+
|
15
|
+
var html = [];
|
16
|
+
html.push('<div style="margin-left: 20px; margin-bottom: 20px; width:800px; height:300px;"></div>');
|
17
|
+
$root = $root.html(html.join('')).find('div');
|
18
|
+
$.plot($root, [ { label: opts.label, data: series } ], {
|
19
|
+
colors: [ '#e68000' ],
|
20
|
+
bars: { show: true },
|
21
|
+
grid: { borderWidth: 1, backgroundColor: { colors: ["#fff", "#eee"] } },
|
22
|
+
yaxis: {
|
23
|
+
labelHeight: 4,
|
24
|
+
tickFormatter: function(val, axis) {
|
25
|
+
return val.toFixed(0);
|
26
|
+
}
|
27
|
+
},
|
28
|
+
legend: { show: true }
|
29
|
+
});
|
30
|
+
},
|
31
|
+
cloud: function(kvs, cb) {
|
32
|
+
var min = null, max = null;
|
33
|
+
$.each(kvs.rows, function(i, kv) {
|
34
|
+
min = Math.min(kv.value, min || kv.value);
|
35
|
+
max = Math.max(kv.value, max || kv.value);
|
36
|
+
});
|
37
|
+
|
38
|
+
var minLog = Math.log(min);
|
39
|
+
var maxLog = Math.log(max);
|
40
|
+
var rangeLog = Math.max(1, maxLog - minLog);
|
41
|
+
var minFontSize = 10;
|
42
|
+
var maxFontSize = 50;
|
43
|
+
|
44
|
+
var html = [];
|
45
|
+
$.each(kvs.rows, function(i, kv) {
|
46
|
+
var value = Math.max(1, kv.value);
|
47
|
+
var ratio = (Math.log(value) - minLog) / rangeLog;
|
48
|
+
var size = minFontSize + Math.round(((maxFontSize - minFontSize) * ratio));
|
49
|
+
|
50
|
+
html = html.concat(cb(kv, size));
|
51
|
+
});
|
52
|
+
|
53
|
+
return html.join('');
|
54
|
+
},
|
55
|
+
// Options
|
56
|
+
// {
|
57
|
+
// limit: <number>|''
|
58
|
+
// order: 'key'|'value'
|
59
|
+
// descending: true|false,
|
60
|
+
// normalize: true|false
|
61
|
+
// value: 'count' || 'bytes'
|
62
|
+
// }
|
63
|
+
table: function($root, kvs, opts, cb, morecb) {
|
64
|
+
opts = opts || {};
|
65
|
+
opts.limit = opts.limit ? opts.limit : (opts.limit === '' ? kvs.rows.length : 10);
|
66
|
+
opts.order = opts.order || 'value';
|
67
|
+
if (opts.descending === undefined) {
|
68
|
+
opts.descending = true;
|
69
|
+
}
|
70
|
+
|
71
|
+
kvs.rows.sort(function(a, b) {
|
72
|
+
var _a = opts.descending ? a[opts.order] : b[opts.order];
|
73
|
+
var _b = opts.descending ? b[opts.order] : a[opts.order];
|
74
|
+
return _b > _a ? 1 : _b < _a ? -1 : 0;
|
75
|
+
});
|
76
|
+
|
77
|
+
var top = kvs.rows.slice(0, opts.limit);
|
78
|
+
var max = 0;
|
79
|
+
var total = 0;
|
80
|
+
$.each(kvs.rows, function(i, kv) {
|
81
|
+
max = Math.max(kv.value, max);
|
82
|
+
total += kv.value;
|
83
|
+
});
|
84
|
+
|
85
|
+
var html = [];
|
86
|
+
if (kvs.rows.length > 0) {
|
87
|
+
html.push('<table style="margin-bottom: 20px">');
|
88
|
+
$.each(top, function(i, kv) {
|
89
|
+
var width = Math.max((kv.value/max*400).toFixed(0), 1);
|
90
|
+
|
91
|
+
if (typeof(kv.key) === 'string' && kv.key.length > 96) {
|
92
|
+
kv.key = kv.key.slice(0, 95) + '*';
|
93
|
+
}
|
94
|
+
|
95
|
+
var value = kv.value;
|
96
|
+
if (opts.normalize) {
|
97
|
+
value = (Math.ceil(kv.value/total*100) + '%');
|
98
|
+
} else {
|
99
|
+
if (opts.value && opts.value === 'bytes') {
|
100
|
+
value = closet.quantity.bytes(value);
|
101
|
+
}
|
102
|
+
}
|
103
|
+
|
104
|
+
html.push('<tr>');
|
105
|
+
html.push('<td align="right">' + value + '</td>');
|
106
|
+
html.push('<td>');
|
107
|
+
html.push('<div style="position:absolute;margin-left:10px">');
|
108
|
+
html.push(cb ? cb(kv) : closet.util.escapeHTML(kv.key));
|
109
|
+
html.push('</div>');
|
110
|
+
html.push('<img src="/static/image/bar-orange.gif" style="opacity:1.0;border:none;height:18px;width:' + width + 'px"/>');
|
111
|
+
html.push('</td>');
|
112
|
+
html.push('</tr>');
|
113
|
+
});
|
114
|
+
html.push('</table>');
|
115
|
+
|
116
|
+
if (kvs.rows.length > top.length && morecb) {
|
117
|
+
html.push(morecb());
|
118
|
+
}
|
119
|
+
} else {
|
120
|
+
html.push("<span class=info>Hmm...Your query didn't seem to match anything.</span>");
|
121
|
+
}
|
122
|
+
|
123
|
+
$root.html(html.join(''));
|
124
|
+
},
|
125
|
+
minmax: function($root, kvs, opts, cb, morecb) {
|
126
|
+
opts = opts || {};
|
127
|
+
opts.limit = opts.limit ? opts.limit : (opts.limit === '' ? kvs.rows.length : 10);
|
128
|
+
if (opts.order !== 'min' && opts.order !== 'max' && opts.order !== 'count' && opts.order !== 'spread') {
|
129
|
+
opts.order = 'spread';
|
130
|
+
}
|
131
|
+
|
132
|
+
if (opts.descending === undefined) {
|
133
|
+
opts.descending = true;
|
134
|
+
}
|
135
|
+
|
136
|
+
// Compute the min-of-min and max-of-max as well as the spread
|
137
|
+
// between the max and the min
|
138
|
+
var minOfMin;
|
139
|
+
var maxOfMax;
|
140
|
+
var integer = true;
|
141
|
+
$.each(kvs.rows, function(i, kv) {
|
142
|
+
minOfMin = Math.min(kv.value.min, minOfMin || kv.value.min);
|
143
|
+
maxOfMax = Math.max(kv.value.max, maxOfMax || kv.value.max);
|
144
|
+
kv.value.spread = Math.max(kv.value.max - kv.value.min, 0);
|
145
|
+
if (kv.value.min.toString().indexOf('.') > 0) {
|
146
|
+
integer = false;
|
147
|
+
} else if (kv.value.max.toString().indexOf('.') > 0) {
|
148
|
+
integer = false;
|
149
|
+
}
|
150
|
+
});
|
151
|
+
var range = Math.max(maxOfMax - minOfMin, 1);
|
152
|
+
|
153
|
+
// Sort based on the user-defined criteria
|
154
|
+
kvs.rows.sort(function(a, b) {
|
155
|
+
var _a = opts.descending ? a.value[opts.order] : b.value[opts.order];
|
156
|
+
var _b = opts.descending ? b.value[opts.order] : a.value[opts.order];
|
157
|
+
return _b > _a ? 1 : _b < _a ? -1 : 0;
|
158
|
+
});
|
159
|
+
|
160
|
+
var html = [];
|
161
|
+
if (kvs.rows.length > 0) {
|
162
|
+
html.push('<table style="margin-bottom: 20px">');
|
163
|
+
html.push('<thead style="font-weight:bold">');
|
164
|
+
html.push('<tr>');
|
165
|
+
html.push('<td>Count</td>');
|
166
|
+
html.push('<td>Min</td>');
|
167
|
+
html.push('<td>Max</td>');
|
168
|
+
html.push('<td>Spread</td>');
|
169
|
+
html.push('</tr>');
|
170
|
+
html.push('</thead>');
|
171
|
+
html.push('<tbody>');
|
172
|
+
var top = kvs.rows.slice(0, opts.limit);
|
173
|
+
$.each(top, function(i, kv) {
|
174
|
+
var width = Math.max(((kv.value.max - kv.value.min)*400/range).toFixed(0), 2);
|
175
|
+
var margin = ((kv.value.min - minOfMin)*400/range).toFixed(0);
|
176
|
+
html.push('<tr>');
|
177
|
+
html.push('<td>' + kv.value.count + '</td>');
|
178
|
+
html.push('<td>' + kv.value.min.toFixed(integer ? 0 : 4) + '</td>');
|
179
|
+
html.push('<td>' + kv.value.max.toFixed(integer ? 0 : 4) + '</td>');
|
180
|
+
html.push('<td>');
|
181
|
+
if (typeof(kv.key) === 'string' && kv.key.length > 96) {
|
182
|
+
kv.key = kv.key.slice(0, 95) + '*';
|
183
|
+
}
|
184
|
+
html.push('<div style="position:absolute;margin-left:10px">');
|
185
|
+
html.push(cb ? cb(kv) : closet.util.escapeHTML(kv.key));
|
186
|
+
html.push('</div>');
|
187
|
+
html.push('<img src="/static/image/bar-orange.gif" style="border:none;height:18px;width:' + width + 'px;margin-left:' + margin + 'px"/>');
|
188
|
+
html.push('</td>');
|
189
|
+
html.push('</tr>');
|
190
|
+
});
|
191
|
+
html.push('</tbody>');
|
192
|
+
html.push('</table>');
|
193
|
+
|
194
|
+
if (kvs.rows.length > top.length && morecb) {
|
195
|
+
html.push(morecb());
|
196
|
+
}
|
197
|
+
} else {
|
198
|
+
html.push("<span class=info>Hmm...Your query didn't seem to match anything.</span>");
|
199
|
+
}
|
200
|
+
|
201
|
+
$root.html(html.join(''));
|
202
|
+
}
|
203
|
+
};
|
204
|
+
}());
|
205
|
+
}(jQuery));
|
@@ -0,0 +1,86 @@
|
|
1
|
+
var closet = closet || {};
|
2
|
+
(function($) {
|
3
|
+
closet.report = (function() {
|
4
|
+
return {
|
5
|
+
load: function(ctx, $root, pcap, cb) {
|
6
|
+
closet.api.fields.list(pcap._id, function(fields) {
|
7
|
+
var fieldMap = {};
|
8
|
+
$.each(fields, function(i, v) { fieldMap[v] = true; });
|
9
|
+
|
10
|
+
closet.reports.list = closet.reports.list || [];
|
11
|
+
var html = [ '<option>Pick one</option>' ];
|
12
|
+
$.each(closet.reports, function(_, category) {
|
13
|
+
if (category.hasOwnProperty('apply') === false || category.apply(pcap, fieldMap)) {
|
14
|
+
var html2 = [];
|
15
|
+
$.each(category.items, function(index, report) {
|
16
|
+
report.category = category.name;
|
17
|
+
report.index = index;
|
18
|
+
if (report.hasOwnProperty('apply') === false || report.apply(pcap, fieldMap)) {
|
19
|
+
html2.push('<option id="' + closet.reports.list.length + '">' + report.title + '</option>');
|
20
|
+
closet.reports.list.push(report);
|
21
|
+
}
|
22
|
+
});
|
23
|
+
|
24
|
+
if (html2.length > 0) {
|
25
|
+
html.push('<optgroup label="' + category.title + '">');
|
26
|
+
html = html.concat(html2);
|
27
|
+
html.push('</optgroup>');
|
28
|
+
}
|
29
|
+
}
|
30
|
+
});
|
31
|
+
|
32
|
+
var $report = $root.find('div.report');
|
33
|
+
var $select = $root.find('select.reports');
|
34
|
+
var $showonload = $root.find('span.showonload');
|
35
|
+
|
36
|
+
$select.html(html.join('')).change(function() {
|
37
|
+
var id = $(this).find('option:selected').attr('id');
|
38
|
+
if (id) {
|
39
|
+
var index = parseInt(id, 10);
|
40
|
+
var report = closet.reports.list[index];
|
41
|
+
ctx.app.setLocation('#/browse/report/' + pcap._id + '/' + report.category + '/' + report.name);
|
42
|
+
}
|
43
|
+
});
|
44
|
+
$showonload.css('display', '');
|
45
|
+
$report.empty();
|
46
|
+
if (cb) { cb(); }
|
47
|
+
});
|
48
|
+
},
|
49
|
+
create: function(ctx, $root, pcap, category, report, opts) {
|
50
|
+
$.each(closet.reports, function(_, c) {
|
51
|
+
if (c.name === category) {
|
52
|
+
$.each(c.items, function(_, r) {
|
53
|
+
if (r.name === report) {
|
54
|
+
var $report = $root.find('div.report');
|
55
|
+
var $title = $root.find('h3.title').html(c.title + '|' + r.title);
|
56
|
+
var $settings = $root.find('div.settings');
|
57
|
+
var $toggler = $settings.find('a.toggler');
|
58
|
+
var $options = $settings.find('div.options');
|
59
|
+
|
60
|
+
$report.html('<span class="throbber">generating...</span>');
|
61
|
+
if (r.options) {
|
62
|
+
closet.options.create(function(maker) {
|
63
|
+
r.options(pcap, maker, function() {
|
64
|
+
var $maker = maker.build(opts, function(_opts) {
|
65
|
+
$report.html('<span class="throbber">generating...</span>');
|
66
|
+
r.create(ctx, $report, pcap, _opts);
|
67
|
+
});
|
68
|
+
$settings.css('display', '');
|
69
|
+
$toggler.click(function() { $options.slideToggle(); });
|
70
|
+
$options.append($maker);
|
71
|
+
r.create(ctx, $report, pcap, maker.reconcile(opts));
|
72
|
+
});
|
73
|
+
});
|
74
|
+
} else {
|
75
|
+
r.create(ctx, $report, pcap, opts);
|
76
|
+
}
|
77
|
+
return false;
|
78
|
+
}
|
79
|
+
});
|
80
|
+
return false;
|
81
|
+
}
|
82
|
+
});
|
83
|
+
}
|
84
|
+
};
|
85
|
+
}());
|
86
|
+
}(jQuery));
|
@@ -0,0 +1,135 @@
|
|
1
|
+
var closet = closet || {};
|
2
|
+
closet.reports = closet.reports || [];
|
3
|
+
closet.reports.push({
|
4
|
+
name: 'http',
|
5
|
+
title: 'HTTP',
|
6
|
+
apply: function(pcap, fields) {
|
7
|
+
return fields.hasOwnProperty('http.request.method');
|
8
|
+
},
|
9
|
+
items: [{
|
10
|
+
name: 'latency',
|
11
|
+
title: 'Response Times',
|
12
|
+
options: function(pcap, opts, cb) {
|
13
|
+
opts.choice('limit', 10, { 'values': [ '', 10, 20, 50, 100 ] });
|
14
|
+
opts.choice('order', 'spread', { values: ['min', 'max', 'count', 'spread'] });
|
15
|
+
opts.boolean('descending', true);
|
16
|
+
cb();
|
17
|
+
},
|
18
|
+
create: function(ctx, $root, pcap, opts) {
|
19
|
+
var q = 'flow.service:http*';
|
20
|
+
var r = closet.mr.minmax('http.request.uri', 'flow.duration');
|
21
|
+
closet.api.flows.report(pcap._id, q, r, function(data) {
|
22
|
+
closet.render.minmax($root, data, opts);
|
23
|
+
});
|
24
|
+
}
|
25
|
+
}, {
|
26
|
+
name: 'bandwidth',
|
27
|
+
title: 'Bandwidth Utilization',
|
28
|
+
options: function(pcap, opts, cb) {
|
29
|
+
var q = 'flow.service:http*';
|
30
|
+
closet.api.flows.servers(pcap._id, q, 0.0, pcap.index.about.duration, function(data) {
|
31
|
+
var servers = $.map(data.rows, function(row) { return row.key; });
|
32
|
+
opts.choice('server', '', { 'values': [''].concat(servers) });
|
33
|
+
opts.choice('limit', 10, { 'values': [ '', 10, 20, 50, 100 ] });
|
34
|
+
opts.choice('order', 'bytes', { values: [ 'bytes', 'uri' ] });
|
35
|
+
opts.boolean('descending', true);
|
36
|
+
opts.boolean('normalize', false);
|
37
|
+
cb();
|
38
|
+
});
|
39
|
+
},
|
40
|
+
create: function(ctx, $root, pcap, opts) {
|
41
|
+
opts = $.extend({}, opts, { value: 'bytes' });
|
42
|
+
if (opts.order) {
|
43
|
+
opts.order = { uri: 'value', host: 'key' }[opts.order]
|
44
|
+
}
|
45
|
+
|
46
|
+
var q = 'flow.service:http*';
|
47
|
+
q = q + (opts.server ? ' flow.dst:' + opts.server : '');
|
48
|
+
var r = closet.mr.sum('http.request.uri', 'flow.bytes');
|
49
|
+
closet.api.flows.report(pcap._id, q, r, function(data) {
|
50
|
+
closet.render.table($root, data, opts);
|
51
|
+
});
|
52
|
+
}
|
53
|
+
}, {
|
54
|
+
name: 'browsers',
|
55
|
+
title: 'Web Browsers',
|
56
|
+
options: function(pcap, opts, cb) {
|
57
|
+
var q = 'flow.service:http*';
|
58
|
+
closet.api.flows.servers(pcap._id, q, 0.0, pcap.index.about.duration, function(data) {
|
59
|
+
var servers = $.map(data.rows, function(row) { return row.key; });
|
60
|
+
opts.choice('server', '', { 'values': [''].concat(servers) });
|
61
|
+
opts.choice('limit', 10, { 'values': [ '', 10, 20, 50, 100 ] });
|
62
|
+
opts.choice('order', 'count', { values: [ 'count', 'browser' ] });
|
63
|
+
opts.boolean('descending', true);
|
64
|
+
opts.boolean('normalize', true);
|
65
|
+
cb();
|
66
|
+
});
|
67
|
+
},
|
68
|
+
create: function(ctx, $root, pcap, opts) {
|
69
|
+
opts = $.extend({}, opts, { value: 'count' });
|
70
|
+
if (opts.order) {
|
71
|
+
opts.order = { count: 'value', browser: 'key' }[opts.order]
|
72
|
+
}
|
73
|
+
|
74
|
+
var q = 'flow.service:http*';
|
75
|
+
q = q + (opts.server ? ' flow.dst:' + opts.server : '');
|
76
|
+
var r = closet.mr.count('http.user.agent');
|
77
|
+
closet.api.flows.report(pcap._id, q, r, function(data) {
|
78
|
+
closet.render.table($root, data, opts);
|
79
|
+
});
|
80
|
+
}
|
81
|
+
}, {
|
82
|
+
name: 'servers',
|
83
|
+
title: 'Web Servers',
|
84
|
+
options: function(pcap, opts, cb) {
|
85
|
+
opts.choice('limit', 10, { 'values': [ '', 10, 20, 50, 100 ] });
|
86
|
+
opts.choice('order', 'count', { values: [ 'count', 'server' ] });
|
87
|
+
opts.boolean('descending', true);
|
88
|
+
opts.boolean('normalize', true);
|
89
|
+
cb();
|
90
|
+
},
|
91
|
+
create: function(ctx, $root, pcap, opts) {
|
92
|
+
opts = $.extend({}, opts, { value: 'count' });
|
93
|
+
if (opts.order) {
|
94
|
+
opts.order = { count: 'value', server: 'key' }[opts.order]
|
95
|
+
}
|
96
|
+
|
97
|
+
var q = 'flow.service:http*';
|
98
|
+
var r = closet.mr.count('http.server');
|
99
|
+
closet.api.flows.report(pcap._id, q, r, function(data) {
|
100
|
+
closet.render.table($root, data, opts);
|
101
|
+
});
|
102
|
+
}
|
103
|
+
}, {
|
104
|
+
name: 'content',
|
105
|
+
title: 'Content Types',
|
106
|
+
options: function(pcap, opts, cb) {
|
107
|
+
var q = 'flow.service:http*';
|
108
|
+
closet.api.flows.servers(pcap._id, q, 0.0, pcap.index.about.duration, function(data) {
|
109
|
+
var servers = $.map(data.rows, function(row) { return row.key; });
|
110
|
+
opts.choice('server', '', { 'values': [''].concat(servers) });
|
111
|
+
opts.choice('limit', 10, { 'values': [ '', 10, 20, 50, 100 ] });
|
112
|
+
opts.choice('order', 'count', { values: [ 'count', 'type' ] });
|
113
|
+
opts.boolean('descending', true);
|
114
|
+
opts.boolean('normalize', true);
|
115
|
+
cb();
|
116
|
+
});
|
117
|
+
},
|
118
|
+
create: function(ctx, $root, pcap, opts) {
|
119
|
+
opts = $.extend({}, opts, { value: 'count' });
|
120
|
+
if (opts.order) {
|
121
|
+
opts.order = { count: 'value', type: 'key' }[opts.order]
|
122
|
+
}
|
123
|
+
|
124
|
+
var q = 'flow.service:http*';
|
125
|
+
var r = closet.mr.count('http.content.type');
|
126
|
+
closet.api.flows.report(pcap._id, q, r, function(data) {
|
127
|
+
closet.render.table($root, data, opts);
|
128
|
+
});
|
129
|
+
}
|
130
|
+
}
|
131
|
+
// TODO:
|
132
|
+
// - connection rate
|
133
|
+
// - scans
|
134
|
+
]
|
135
|
+
});
|