pcapr-local 0.1.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (203) hide show
  1. data/.document +5 -0
  2. data/LICENSE.txt +20 -0
  3. data/README.md +64 -0
  4. data/Rakefile +57 -0
  5. data/VERSION +1 -0
  6. data/bin/pcap2par +49 -0
  7. data/bin/startpcapr +40 -0
  8. data/bin/stoppcapr +33 -0
  9. data/bin/xtractr +5 -0
  10. data/lib/environment.rb +106 -0
  11. data/lib/exe/xtractr +0 -0
  12. data/lib/mu/pcap.rb +110 -0
  13. data/lib/mu/pcap/ethernet.rb +148 -0
  14. data/lib/mu/pcap/header.rb +75 -0
  15. data/lib/mu/pcap/io_pair.rb +67 -0
  16. data/lib/mu/pcap/io_wrapper.rb +76 -0
  17. data/lib/mu/pcap/ip.rb +61 -0
  18. data/lib/mu/pcap/ipv4.rb +257 -0
  19. data/lib/mu/pcap/ipv6.rb +148 -0
  20. data/lib/mu/pcap/packet.rb +104 -0
  21. data/lib/mu/pcap/pkthdr.rb +155 -0
  22. data/lib/mu/pcap/reader.rb +61 -0
  23. data/lib/mu/pcap/reader/http_family.rb +170 -0
  24. data/lib/mu/pcap/sctp.rb +367 -0
  25. data/lib/mu/pcap/sctp/chunk.rb +123 -0
  26. data/lib/mu/pcap/sctp/chunk/data.rb +134 -0
  27. data/lib/mu/pcap/sctp/chunk/init.rb +100 -0
  28. data/lib/mu/pcap/sctp/chunk/init_ack.rb +68 -0
  29. data/lib/mu/pcap/sctp/parameter.rb +110 -0
  30. data/lib/mu/pcap/sctp/parameter/ip_address.rb +48 -0
  31. data/lib/mu/pcap/stream_packetizer.rb +72 -0
  32. data/lib/mu/pcap/tcp.rb +505 -0
  33. data/lib/mu/pcap/udp.rb +69 -0
  34. data/lib/mu/scenario/pcap.rb +164 -0
  35. data/lib/mu/scenario/pcap/fields.rb +50 -0
  36. data/lib/mu/scenario/pcap/rtp.rb +71 -0
  37. data/lib/pcapr_local.rb +159 -0
  38. data/lib/pcapr_local/config.rb +336 -0
  39. data/lib/pcapr_local/db.rb +197 -0
  40. data/lib/pcapr_local/scanner.rb +250 -0
  41. data/lib/pcapr_local/server.rb +178 -0
  42. data/lib/pcapr_local/www/favicon.ico +0 -0
  43. data/lib/pcapr_local/www/favicon.png +0 -0
  44. data/lib/pcapr_local/www/home/index.html +138 -0
  45. data/lib/pcapr_local/www/static/image/16x16/Cancel.png +0 -0
  46. data/lib/pcapr_local/www/static/image/16x16/Cancel.png.1 +0 -0
  47. data/lib/pcapr_local/www/static/image/16x16/Download.png +0 -0
  48. data/lib/pcapr_local/www/static/image/16x16/Folder3.png +0 -0
  49. data/lib/pcapr_local/www/static/image/16x16/Full Size.png +0 -0
  50. data/lib/pcapr_local/www/static/image/16x16/Minus.png +0 -0
  51. data/lib/pcapr_local/www/static/image/16x16/Plus.png +0 -0
  52. data/lib/pcapr_local/www/static/image/16x16/Search.png +0 -0
  53. data/lib/pcapr_local/www/static/image/16x16/User.png +0 -0
  54. data/lib/pcapr_local/www/static/image/48x48/Phone.png +0 -0
  55. data/lib/pcapr_local/www/static/image/48x48/Video.png +0 -0
  56. data/lib/pcapr_local/www/static/image/bar-orange.gif +0 -0
  57. data/lib/pcapr_local/www/static/image/beta.png +0 -0
  58. data/lib/pcapr_local/www/static/image/bg.png +0 -0
  59. data/lib/pcapr_local/www/static/image/blockquote.png +0 -0
  60. data/lib/pcapr_local/www/static/image/body-bg.png +0 -0
  61. data/lib/pcapr_local/www/static/image/body-h3.png +0 -0
  62. data/lib/pcapr_local/www/static/image/body-hl1-bg.png +0 -0
  63. data/lib/pcapr_local/www/static/image/body-hl1-h3.png +0 -0
  64. data/lib/pcapr_local/www/static/image/body-hl1-readmore.png +0 -0
  65. data/lib/pcapr_local/www/static/image/body-hl2-bg.png +0 -0
  66. data/lib/pcapr_local/www/static/image/body-hl2-h3.png +0 -0
  67. data/lib/pcapr_local/www/static/image/body-hl2-readmore.png +0 -0
  68. data/lib/pcapr_local/www/static/image/body-hl3-bg.png +0 -0
  69. data/lib/pcapr_local/www/static/image/body-hl3-h3.png +0 -0
  70. data/lib/pcapr_local/www/static/image/body-hl3-readmore.png +0 -0
  71. data/lib/pcapr_local/www/static/image/body-hl4-bg.png +0 -0
  72. data/lib/pcapr_local/www/static/image/body-hl4-h3.png +0 -0
  73. data/lib/pcapr_local/www/static/image/body-hl4-readmore.png +0 -0
  74. data/lib/pcapr_local/www/static/image/body-hl5-h3.png +0 -0
  75. data/lib/pcapr_local/www/static/image/body-hl6-h3.png +0 -0
  76. data/lib/pcapr_local/www/static/image/body-hl7-h3.png +0 -0
  77. data/lib/pcapr_local/www/static/image/body-hl8-h3.png +0 -0
  78. data/lib/pcapr_local/www/static/image/body-readmore.png +0 -0
  79. data/lib/pcapr_local/www/static/image/bottom-bg.png +0 -0
  80. data/lib/pcapr_local/www/static/image/bottom-l.png +0 -0
  81. data/lib/pcapr_local/www/static/image/bottom-r.png +0 -0
  82. data/lib/pcapr_local/www/static/image/btn-search.png +0 -0
  83. data/lib/pcapr_local/www/static/image/bullet-1.png +0 -0
  84. data/lib/pcapr_local/www/static/image/bullet-2.png +0 -0
  85. data/lib/pcapr_local/www/static/image/bullet-3.png +0 -0
  86. data/lib/pcapr_local/www/static/image/bullet-4.png +0 -0
  87. data/lib/pcapr_local/www/static/image/bullet-5.png +0 -0
  88. data/lib/pcapr_local/www/static/image/bullet-6.png +0 -0
  89. data/lib/pcapr_local/www/static/image/bullet-7.png +0 -0
  90. data/lib/pcapr_local/www/static/image/bullet-hl1.png +0 -0
  91. data/lib/pcapr_local/www/static/image/bullet-hl2.png +0 -0
  92. data/lib/pcapr_local/www/static/image/bullet-hl3.png +0 -0
  93. data/lib/pcapr_local/www/static/image/bullet-hl4.png +0 -0
  94. data/lib/pcapr_local/www/static/image/bullet-pathway.png +0 -0
  95. data/lib/pcapr_local/www/static/image/bullet-section1.png +0 -0
  96. data/lib/pcapr_local/www/static/image/bullet-section2.png +0 -0
  97. data/lib/pcapr_local/www/static/image/collapsed.gif +0 -0
  98. data/lib/pcapr_local/www/static/image/crosslink.png +0 -0
  99. data/lib/pcapr_local/www/static/image/expanded.gif +0 -0
  100. data/lib/pcapr_local/www/static/image/favicon.ico +0 -0
  101. data/lib/pcapr_local/www/static/image/favicon.png +0 -0
  102. data/lib/pcapr_local/www/static/image/icon-author.png +0 -0
  103. data/lib/pcapr_local/www/static/image/icon-created.png +0 -0
  104. data/lib/pcapr_local/www/static/image/p-expand.gif +0 -0
  105. data/lib/pcapr_local/www/static/image/pcapr-logo.png +0 -0
  106. data/lib/pcapr_local/www/static/image/powered-by.png +0 -0
  107. data/lib/pcapr_local/www/static/image/section1-bg.png +0 -0
  108. data/lib/pcapr_local/www/static/image/section1-h3.png +0 -0
  109. data/lib/pcapr_local/www/static/image/section1-readmore.png +0 -0
  110. data/lib/pcapr_local/www/static/image/section2-bg.png +0 -0
  111. data/lib/pcapr_local/www/static/image/section2-h3.png +0 -0
  112. data/lib/pcapr_local/www/static/image/section2-readmore.png +0 -0
  113. data/lib/pcapr_local/www/static/image/status-alert.png +0 -0
  114. data/lib/pcapr_local/www/static/image/status-download.png +0 -0
  115. data/lib/pcapr_local/www/static/image/status-info.png +0 -0
  116. data/lib/pcapr_local/www/static/image/status-note.png +0 -0
  117. data/lib/pcapr_local/www/static/image/tab-round.png +0 -0
  118. data/lib/pcapr_local/www/static/image/throbber.gif +0 -0
  119. data/lib/pcapr_local/www/static/image/user.jpg +0 -0
  120. data/lib/pcapr_local/www/static/script/closet/async.js +421 -0
  121. data/lib/pcapr_local/www/static/script/closet/closet.api.js +241 -0
  122. data/lib/pcapr_local/www/static/script/closet/closet.folders.js +94 -0
  123. data/lib/pcapr_local/www/static/script/closet/closet.js +187 -0
  124. data/lib/pcapr_local/www/static/script/closet/closet.mr.js +219 -0
  125. data/lib/pcapr_local/www/static/script/closet/closet.options.js +359 -0
  126. data/lib/pcapr_local/www/static/script/closet/closet.quantity.js +73 -0
  127. data/lib/pcapr_local/www/static/script/closet/closet.render.js +205 -0
  128. data/lib/pcapr_local/www/static/script/closet/closet.report.js +86 -0
  129. data/lib/pcapr_local/www/static/script/closet/closet.reports.http.js +135 -0
  130. data/lib/pcapr_local/www/static/script/closet/closet.reports.overview.js +163 -0
  131. data/lib/pcapr_local/www/static/script/closet/closet.reports.sip.js +159 -0
  132. data/lib/pcapr_local/www/static/script/closet/closet.reports.tcp.js +72 -0
  133. data/lib/pcapr_local/www/static/script/closet/closet.reports.visualize.js +263 -0
  134. data/lib/pcapr_local/www/static/script/closet/closet.util.js +40 -0
  135. data/lib/pcapr_local/www/static/script/jquery/jquery-1.4.2.min.js +154 -0
  136. data/lib/pcapr_local/www/static/script/jquery/jquery-ui.js +10921 -0
  137. data/lib/pcapr_local/www/static/script/jquery/jquery.flot.js +2123 -0
  138. data/lib/pcapr_local/www/static/script/jquery/jquery.flot.selection.js +184 -0
  139. data/lib/pcapr_local/www/static/script/jquery/jquery.flot.stack.js +184 -0
  140. data/lib/pcapr_local/www/static/script/jquery/jquery.form.js +643 -0
  141. data/lib/pcapr_local/www/static/script/jquery/jquery.jsonp.min.js +3 -0
  142. data/lib/pcapr_local/www/static/script/jquery/jquery.menu.js +142 -0
  143. data/lib/pcapr_local/www/static/script/jquery/jquery.suggest.js +308 -0
  144. data/lib/pcapr_local/www/static/script/jquery/jquery.ui.core.js +203 -0
  145. data/lib/pcapr_local/www/static/script/jquery/jquery.ui.slider.js +629 -0
  146. data/lib/pcapr_local/www/static/script/jquery/jquery.ui.sortable.js +1055 -0
  147. data/lib/pcapr_local/www/static/script/jquery/jquery.ui.widget.js +236 -0
  148. data/lib/pcapr_local/www/static/script/json2.js +481 -0
  149. data/lib/pcapr_local/www/static/script/sammy/plugins/sammy.cache.js +115 -0
  150. data/lib/pcapr_local/www/static/script/sammy/plugins/sammy.template.js +117 -0
  151. data/lib/pcapr_local/www/static/script/sammy/sammy.js +1696 -0
  152. data/lib/pcapr_local/www/static/script/tipsy/jquery.tipsy.js +104 -0
  153. data/lib/pcapr_local/www/static/style/c3p0.css +116 -0
  154. data/lib/pcapr_local/www/static/style/jquery.suggest.css +27 -0
  155. data/lib/pcapr_local/www/static/style/page.css +1113 -0
  156. data/lib/pcapr_local/www/static/style/tipsy.css +7 -0
  157. data/lib/pcapr_local/www/templates/browse.services.template +10 -0
  158. data/lib/pcapr_local/www/templates/browse.template +77 -0
  159. data/lib/pcapr_local/www/templates/flows.template +38 -0
  160. data/lib/pcapr_local/www/templates/pcap.template +63 -0
  161. data/lib/pcapr_local/www/templates/sip.calls.template +35 -0
  162. data/lib/pcapr_local/www/templates/statistics.template +6 -0
  163. data/lib/pcapr_local/xtractr.rb +179 -0
  164. data/lib/pcapr_local/xtractr/instance.rb +172 -0
  165. data/pcapr-local.gemspec +297 -0
  166. data/test/mu/pcap/reader/tc_http_family.rb +251 -0
  167. data/test/mu/pcap/tc_ethernet.rb +71 -0
  168. data/test/mu/pcap/tc_header.rb +56 -0
  169. data/test/mu/pcap/tc_ipv4.rb +103 -0
  170. data/test/mu/pcap/tc_ipv6.rb +83 -0
  171. data/test/mu/pcap/tc_packet.rb +44 -0
  172. data/test/mu/pcap/tc_pair.rb +58 -0
  173. data/test/mu/pcap/tc_pkthdr.rb +33 -0
  174. data/test/mu/pcap/tc_reader.rb +76 -0
  175. data/test/mu/pcap/tc_tcp.rb +426 -0
  176. data/test/mu/pcap/tc_udp.rb +33 -0
  177. data/test/mu/pcap/tc_wrapper.rb +80 -0
  178. data/test/mu/scenario/pcap/tc_fields.rb +67 -0
  179. data/test/mu/scenario/pcap/tc_rtp.rb +135 -0
  180. data/test/mu/scenario/sip_signalled_call_1.pcap +0 -0
  181. data/test/mu/scenario/tc_pcap.rb +190 -0
  182. data/test/mu/scenario/test_data/arp.pcap +0 -0
  183. data/test/mu/scenario/test_data/dns.pcap +0 -0
  184. data/test/mu/scenario/test_data/http-v6.pcap +0 -0
  185. data/test/mu/scenario/test_data/http.pcap +0 -0
  186. data/test/mu/scenario/test_data/http_chunked.pcap +0 -0
  187. data/test/mu/scenario/test_data/http_deflate.pcap +0 -0
  188. data/test/mu/scenario/test_data/httpauth3.pcap +0 -0
  189. data/test/mu/scenario/test_data/icmp.pcap +0 -0
  190. data/test/mu/scenario/test_data/sip_signalled_call_1.pcap +0 -0
  191. data/test/mu/tc_pcap.rb +39 -0
  192. data/test/mu/testcase.rb +86 -0
  193. data/test/pcapr_local/arp.pcap +0 -0
  194. data/test/pcapr_local/data.js +3 -0
  195. data/test/pcapr_local/http_chunked.pcap +0 -0
  196. data/test/pcapr_local/tc_api.rb +181 -0
  197. data/test/pcapr_local/test.tgz +0 -0
  198. data/test/pcapr_local/test_scanner.rb +241 -0
  199. data/test/pcapr_local/test_xtractr.rb +219 -0
  200. data/test/pcapr_local/testcase.rb +107 -0
  201. data/test/test_export_to_scenario.sh +25 -0
  202. data/test/test_pcapr_local.rb +29 -0
  203. 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
+ });