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,241 @@
1
+ var closet = closet || {};
2
+
3
+ (function($) {
4
+ closet.api = (function() {
5
+
6
+ var throbber = function() {
7
+ var span = null;
8
+ var count = 0;
9
+ return {
10
+ show: function(text) {
11
+ span = span || $('span.throbber');
12
+ span.text(text || 'hang on...');
13
+ if (count++ === 0) {
14
+ span.show();
15
+ }
16
+ },
17
+ hide: function() {
18
+ span = span || $('span.throbber');
19
+ if (--count <= 0) {
20
+ span.hide();
21
+ count = 0;
22
+ }
23
+ }
24
+ };
25
+ }();
26
+
27
+ return {
28
+ PAGE_SIZE: 20,
29
+ call: function(url, query, scb, ecb) {
30
+ throbber.show();
31
+ $.jsonp({
32
+ url: url,
33
+ data: query,
34
+ dataFilter: function(data) {
35
+ return JSON.parse(JSON.stringify(data));
36
+ },
37
+ callbackParameter: 'callback',
38
+ success: function(data) {
39
+ scb(data);
40
+ },
41
+ complete: function(xopts, status) {
42
+ throbber.hide();
43
+ if (status !== 'success' && ecb) {
44
+ ecb();
45
+ }
46
+ }
47
+ });
48
+ },
49
+ pcaps: {
50
+ list_by_date: function(query, scb, ecb) {
51
+ var url = '/pcaps/1/list?by=date';
52
+ var _query = {
53
+ include_docs: true,
54
+ limit: closet.api.PAGE_SIZE+1,
55
+ descending: true
56
+ };
57
+
58
+ if (query) {
59
+ if (query.startkey) { _query.startkey = unescape(query.startkey); }
60
+ if (query.startkey_docid) { _query.startkey_docid = query.startkey_docid; }
61
+ if (query.limit) { _query.limit = query.limit; }
62
+ }
63
+
64
+ closet.api.call(url, _query, scb, ecb);
65
+ },
66
+ // Expect 'dirs' to be an array of path components
67
+ list_by_dir: function(dirs, query, scb, ecb) {
68
+ dirs = dirs.concat([]);
69
+ if (dirs.length === 1 && dirs[0].length === 0) { dirs.pop(); }
70
+ dirs.unshift(dirs.length);
71
+
72
+ var url = '/pcaps/1/list?by=directory&endkey=' + JSON.stringify(dirs);
73
+ var _query = {
74
+ reduce: false,
75
+ include_docs: true,
76
+ limit: closet.api.PAGE_SIZE+1,
77
+ descending: true
78
+ };
79
+
80
+ if (query) {
81
+ _query.startkey = query.startkey ? unescape(query.startkey) : JSON.stringify(dirs.concat([""]));
82
+ if (query.startkey_docid) { _query.startkey_docid = query.startkey_docid; }
83
+ if (query.limit) { _query.limit = query.limit; }
84
+ }
85
+
86
+ closet.api.call(url, _query, scb, ecb);
87
+ },
88
+ list_by_keyword: function(keyword, query, scb, ecb) {
89
+ var url = '/pcaps/1/list?by=keyword';
90
+ var _query = {
91
+ startkey: '["' + keyword + '\\u9999"]',
92
+ endkey: '["' + keyword + '"]',
93
+ reduce: false,
94
+ include_docs: true,
95
+ limit: closet.api.PAGE_SIZE,
96
+ descending: true
97
+ };
98
+
99
+ if (query) {
100
+ if (query.limit) { _query.limit = query.limit; }
101
+ }
102
+
103
+ closet.api.call(url, _query, scb, ecb);
104
+ },
105
+ list_by_service: function(service, query, scb, ecb) {
106
+ var url = '/pcaps/1/list?by=service&endkey=[' + service + ']';
107
+ var _query = {
108
+ reduce: false,
109
+ include_docs: true,
110
+ limit: closet.api.PAGE_SIZE+1,
111
+ descending: true
112
+ };
113
+
114
+ if (query) {
115
+ _query.startkey = query.startkey ? unescape(query.startkey) : ('[' + service + ',""]');
116
+ if (query.startkey_docid) { _query.startkey_docid = query.startkey_docid; }
117
+ if (query.limit) { _query.limit = query.limit; }
118
+ }
119
+
120
+ closet.api.call(url, _query, scb, ecb);
121
+ },
122
+ list_by_status: function(status, query, scb, ecb) {
123
+ var url = '/pcaps/1/list?by=status&endkey=[' + status + ']';
124
+ var _query = {
125
+ reduce: false,
126
+ include_docs: true,
127
+ limit: closet.api.PAGE_SIZE+1,
128
+ descending: true
129
+ };
130
+
131
+ if (query) {
132
+ _query.startkey = query.startkey ? unescape(query.startkey) : ('[' + status + ',""]');
133
+ if (query.startkey_docid) { _query.startkey_docid = query.startkey_docid; }
134
+ if (query.limit) { _query.limit = query.limit; }
135
+ }
136
+
137
+ closet.api.call(url, _query, scb, ecb);
138
+ },
139
+ services: function(scb, ecb) {
140
+ var url = '/pcaps/1/list?by=service';
141
+ closet.api.call(url, { group_level: 1 }, scb, ecb);
142
+ },
143
+ statistics: function(scb, ecb) {
144
+ var url = '/pcaps/1/statistics';
145
+ closet.api.call(url, null, scb, ecb);
146
+ }
147
+ },
148
+ pcap: {
149
+ about: function(pcap, scb, ecb) {
150
+ var url = '/pcaps/1/about/' + pcap;
151
+ closet.api.call(url, null, scb, ecb);
152
+ },
153
+ remove: function(pcap, scb, ecb) {
154
+ var url = '/pcaps/1/remove/' + pcap;
155
+ closet.api.call(url, null, scb, ecb);
156
+ }
157
+ },
158
+ fields: {
159
+ list: function(pcap, scb, ecb) {
160
+ var url = '/pcaps/1/pcap/' + pcap + '/api/fields';
161
+ closet.api.call(url, null, scb, ecb);
162
+ }
163
+ },
164
+ field: {
165
+ terms: function(pcap, field, start, limit, scb, ecb) {
166
+ var url = '/pcaps/1/pcap/' + pcap + '/api/field/' + field + '/terms';
167
+ var query = { };
168
+ if (start !== null && start !== undefined) { query.start = start; }
169
+ if (limit != null && limit !== undefined) { query.limit = limit; }
170
+ closet.api.call(url, query, scb);
171
+ }
172
+ },
173
+ flows: {
174
+ list: function(pcap, query, scb, ecb) {
175
+ var url = '/pcaps/1/pcap/' + pcap + '/api/flows';
176
+ closet.api.call(url, query, scb, ecb);
177
+ },
178
+ report: function(pcap, query, report, scb, ecb) {
179
+ var url = '/pcaps/1/pcap/' + pcap + '/api/flows/report';
180
+ closet.api.call(url, { q: query, r: report }, scb, ecb);
181
+ },
182
+ clients: function(pcap, query, start, end, scb, ecb) {
183
+ var url = '/pcaps/1/pcap/' + pcap + '/api/flows/clients';
184
+ var query = { q: query, start: start, end: end };
185
+ closet.api.call(url, query, scb, ecb);
186
+ },
187
+ servers: function(pcap, query, start, end, scb, ecb) {
188
+ var url = '/pcaps/1/pcap/' + pcap + '/api/flows/servers';
189
+ var query = { q: query, start: start, end: end };
190
+ closet.api.call(url, query, scb, ecb);
191
+ },
192
+ services: function(pcap, query, start, end, scb, ecb) {
193
+ var url = '/pcaps/1/pcap/' + pcap + '/api/flows/services';
194
+ var query = { q: query, start: start, end: end };
195
+ closet.api.call(url, query, scb, ecb);
196
+ }
197
+ },
198
+ flow: {
199
+ about: function(pcap, id, scb, ecb) {
200
+ var url = '/pcaps/1/pcap/' + pcap + '/api/flows';
201
+ var query = { q: 'flow.id:' + id, limit: 1 };
202
+ closet.api.call(url, query, function(data) {
203
+ if (data.rows.length === 1) {
204
+ scb(data.rows[0]);
205
+ } else {
206
+ (ecb || function() {})();
207
+ }
208
+ }, ecb);
209
+ }
210
+ },
211
+ packets: {
212
+ fields: function(pcap, query, scb, ecb) {
213
+ var url = '/pcaps/1/pcap/' + pcap + '/api/packets/fields';
214
+ closet.api.call(url, query, scb, ecb);
215
+ },
216
+ list: function(pcap, query, scb, ecb) {
217
+ var url = '/pcaps/1/pcap/' + pcap + '/api/packets';
218
+ closet.api.call(url, query, scb, ecb);
219
+ },
220
+ report: function(pcap, query, report, scb, ecb) {
221
+ var url = '/pcaps/1/pcap/' + pcap + '/api/packets/report';
222
+ closet.api.call(url, { q: query, r: report }, scb, ecb);
223
+ }
224
+ },
225
+ packet: {
226
+ about: function(pcap, packet, scb, ecb) {
227
+ var url = '/pcaps/1/pcap/' + pcap + '/api/packet/' + packet + '/about';
228
+ closet.api.call(url, null, scb, ecb);
229
+ },
230
+ pdml: function(pcap, packet, scb, ecb) {
231
+ var url = '/pcaps/1/pcap/' + pcap + '/api/packet/' + packet + '/pdml';
232
+ closet.api.call(url, null, scb, ecb);
233
+ },
234
+ bytes: function(pcap, packet, scb, ecb) {
235
+ var url = '/pcaps/1/pcap/' + pcap + '/api/packet/' + packet + '/bytes';
236
+ closet.api.call(url, null, scb, ecb);
237
+ }
238
+ }
239
+ };
240
+ }());
241
+ }(jQuery));
@@ -0,0 +1,94 @@
1
+ var closet = closet || {};
2
+
3
+ (function($) {
4
+ closet.folders = (function() {
5
+ var iconPlus = '<img class="icon" style="width:10px" src="/static/image/16x16/Plus.png"/>';
6
+ var iconMinus = '<img class="icon" style="width:10px" src="/static/image/16x16/Minus.png"/>';
7
+ var iconEmpty = '<img class="icon" style="width:10px" src="/static/image/16x16/Folder3.png"/>';
8
+
9
+ var toggle = function($root) {
10
+ var $children = $root.children('div.children');
11
+ var $toggle = $root.children('a.toggle');
12
+ if ($children.css('display') === 'none') {
13
+ $children.css('display', '');
14
+ $toggle.html(iconMinus);
15
+ } else {
16
+ $children.css('display', 'none');
17
+ $toggle.html(iconPlus);
18
+ }
19
+ };
20
+
21
+ var addFolders = function($root, depth, cb) {
22
+ var root = $root.data('path');
23
+ var $children = $root.children('div.children');
24
+ toggle($root);
25
+
26
+ var url = '/pcaps/1/list?by=path';
27
+ if (depth > 1) {
28
+ var paths = root.split('/');
29
+ var startkey = paths.concat([0]);
30
+ var endkey = paths.concat([{}]);
31
+ url += '&startkey=' + JSON.stringify(startkey);
32
+ url += '&endkey=' + JSON.stringify(endkey);
33
+ }
34
+
35
+ $.ajax({
36
+ url: url,
37
+ data: { group_level: depth, limit: 20 },
38
+ dataType: 'json',
39
+ success: function(kvs) {
40
+ if (kvs.rows.length === 0 && depth > 1) {
41
+ $root.find('a.toggle').replaceWith(iconEmpty);
42
+ return;
43
+ }
44
+
45
+ $.each(kvs.rows, function(_, kv) {
46
+ if (kv.key.length !== depth) { return; }
47
+ var path = kv.key.join('/');
48
+ $children.append(
49
+ '<div class="folder">' +
50
+ '<a class="toggle"/>&nbsp;' +
51
+ '<a class="link" title="' + path + '">' + kv.key[depth-1] + '</a>' +
52
+ '&nbsp;' +
53
+ '<sup style="font-size:smaller">' + kv.value + '</sup>' +
54
+ '<div class="children" style="margin-left:20px;display:none"/>' +
55
+ '</div>'
56
+ ).find('div.folder:last').data('path', path);
57
+ });
58
+
59
+ $children
60
+ .find('a.toggle').attr('href', 'javascript:void(0)')
61
+ .html('<img class="icon" style="width:10px" src="/static/image/16x16/Plus.png"/>')
62
+ .click(function() {
63
+ var folder = $(this).parent('div.folder');
64
+ var children = $(this).nextAll('div.children');
65
+ if (children.children().length === 0) {
66
+ addFolders(folder, depth+1, cb);
67
+ } else {
68
+ toggle(folder);
69
+ }
70
+ })
71
+ .end()
72
+ .find('a.link').attr('href', 'javascript:void(0)')
73
+ .click(function() {
74
+ cb($(this).parent('div.folder').data('path'));
75
+ });
76
+ }
77
+ });
78
+ };
79
+
80
+ return {
81
+ manage: function($root, cb) {
82
+ var $f = $root.data('folders');
83
+ if (!$f) {
84
+ $f = $('<div class="folder" style="margin-top: 20px;margin-bottom:20px"><div class="children" style="display:none"/></div>');
85
+ $f.data('path', '/');
86
+ $root.data('folders', $f);
87
+ addFolders($f, 1, cb);
88
+ }
89
+
90
+ $root.empty().append($f);
91
+ }
92
+ };
93
+ }());
94
+ }(jQuery));
@@ -0,0 +1,187 @@
1
+ var closet = closet || {};
2
+
3
+ (function($) {
4
+ closet.load = (function() {
5
+ $('ul.tab a').click(function() {
6
+ var id = $(this).attr('id');
7
+ $('ul.tab li.active').removeClass('active').end();
8
+ $(this).parent('li').addClass('active');
9
+ });
10
+
11
+ var refresh = function(ctx) {
12
+ closet.api.pcaps.statistics(function(stats) {
13
+ ctx.render('/templates/statistics.template', { stats: stats }, function(content) {
14
+ $('div.statistics').html(content);
15
+ });
16
+ });
17
+ };
18
+
19
+ var browse = function(ctx, data) {
20
+ ctx.render('/templates/browse.template', data, function(content) {
21
+ ctx.$element().html(content).find('a.remove').click(function() {
22
+ var $self = $(this);
23
+ var id = $self.attr('id');
24
+ if (confirm('Are you sure you want to delete this pcap and the index?')) {
25
+ closet.api.pcap.remove(id, function(result) {
26
+ if (result.ok) {
27
+ $self.parents('li.l0').css('background', '#DD1122').fadeOut(function() {
28
+ $self.remove();
29
+ });
30
+ }
31
+ });
32
+ }
33
+ });
34
+ });
35
+ };
36
+
37
+ var app = $.sammy(function() {
38
+ this.element_selector = $('div.browse-tab');
39
+ this.use(Sammy.Template);
40
+
41
+ // 1. Select the appropriate tab on click
42
+ // 2. Update the statistics on each click
43
+ this.before(/^#\/(create|browse|services|folders)/, function(ctx) {
44
+ var id = RegExp.$1;
45
+ $('ul.tab a#' + id).click();
46
+
47
+ // Especially for the folders, we need to keep the contents
48
+ // around since it contains the expanded/collapsed states of
49
+ // the subfolders as well as all of the events.
50
+ if (ctx.$element().data('closet.detach')) {
51
+ ctx.$element().data('closet.detach', false);
52
+ ctx.$element().contents().detach();
53
+ }
54
+ ctx.$element().html('<div><p/><span class="throbber">hang on</span><p/></div>');
55
+ refresh(ctx);
56
+ });
57
+
58
+ // Create scenarios from HAR files
59
+ this.get('#/create', function(ctx) {
60
+ ctx.render('/templates/har.upload.template', {}, function(content) {
61
+ ctx.$element().html(content);
62
+ closet.create.har(ctx);
63
+ });
64
+ });
65
+
66
+ // Browse the pcaps by date (and handle paging)
67
+ this.get('#/browse', function(ctx) {
68
+ var path = ctx.path.replace(/\?.*$/, '');
69
+ closet.api.pcaps.list_by_date({
70
+ startkey: ctx.params.nextkey,
71
+ startkey_docid: ctx.params.nextid,
72
+ }, function(pcaps) {
73
+ browse(ctx, { path: path, pcaps: pcaps });
74
+ });
75
+ });
76
+
77
+ // Filter the pcaps by service (and handle paging)
78
+ this.get(/^#\/browse\/service\/(.*)/, function(ctx) {
79
+ var path = ctx.path.replace(/\?.*$/, '');
80
+ var service = JSON.stringify(ctx.params.splat[0]);
81
+ closet.api.pcaps.list_by_service(service, {
82
+ startkey: ctx.params.nextkey,
83
+ startkey_docid: ctx.params.nextid
84
+ }, function(pcaps) {
85
+ pcaps.filter = true;
86
+ browse(ctx, { path: path, pcaps: pcaps });
87
+ });
88
+ });
89
+
90
+ // Filter the pcaps by status (and handle paging)
91
+ this.get('#/browse/status/:name', function(ctx) {
92
+ var path = ctx.path.replace(/\?.*$/, '');
93
+ var status = JSON.stringify(ctx.params.name);
94
+ closet.api.pcaps.list_by_status(status, {
95
+ startkey: ctx.params.nextkey,
96
+ startkey_docid: ctx.params.nextid
97
+ }, function(pcaps) {
98
+ pcaps.filter = true;
99
+ browse(ctx, { path: path, pcaps: pcaps });
100
+ });
101
+ });
102
+
103
+ // Filter the pcaps by directory path (and handle paging)
104
+ this.get(/^#\/browse\/dir\/(.*)/, function(ctx) {
105
+ var path = ctx.path.replace(/\?.*$/, '');
106
+ var dirs = ctx.params.splat[0].split('/');
107
+ closet.api.pcaps.list_by_dir(dirs, {
108
+ startkey: ctx.params.nextkey,
109
+ startkey_docid: ctx.params.nextid
110
+ }, function(pcaps) {
111
+ pcaps.filter = true;
112
+ browse(ctx, { path: path, pcaps: pcaps });
113
+ });
114
+ });
115
+
116
+ // Filter the pcaps by keyword
117
+ this.get('#/browse/keyword/:name', function(ctx) {
118
+ var path = ctx.path.replace(/\?.*$/, '');
119
+ closet.api.pcaps.list_by_keyword(ctx.params.name, null, function(pcaps) {
120
+ pcaps.filter = true;
121
+ browse(ctx, { path: path, pcaps: pcaps });
122
+ });
123
+ });
124
+
125
+ // View a given pcap
126
+ this.get('#/browse/pcap/:pcap', function(ctx) {
127
+ closet.api.pcap.about(ctx.params.pcap, function(pcap) {
128
+ ctx.render('/templates/pcap.template', { pcap: pcap }, function(content) {
129
+ var $reports = ctx.swap(content).find('div.reports');
130
+ closet.report.load(ctx, $reports, pcap);
131
+ });
132
+ });
133
+ });
134
+
135
+ // Report on a given pcap (with optional filters and other settings)
136
+ this.get('#/browse/report/:pcap/:category/:report', function(ctx) {
137
+ closet.api.pcap.about(ctx.params.pcap, function(pcap) {
138
+ ctx.render('/templates/pcap.template', { pcap: pcap }, function(content) {
139
+ var $reports = ctx.swap(content).find('div.reports');
140
+ var category = ctx.params.category;
141
+ var report = ctx.params.report;
142
+ closet.report.load(ctx, $reports, pcap, function() {
143
+ closet.report.create(ctx, $reports, pcap, category, report, ctx.params);
144
+ });
145
+ });
146
+ });
147
+ });
148
+
149
+ // Generate a scenario for a given flow
150
+ // this.get('#/browse/pcap/:pcap/flow/:id', function(ctx) {
151
+ // var pcap = { _id: ctx.params.pcap };
152
+ // closet.scenario(ctx.$element(), pcap, ctx.params.id);
153
+ // });
154
+
155
+ // Expand/collapse folders
156
+ this.get('#/folders', function(ctx) {
157
+ ctx.$element().data('closet.detach', true);
158
+ closet.folders.manage(ctx.$element(), function(path) {
159
+ app.setLocation('#/browse/dir/' + path);
160
+ });
161
+ });
162
+
163
+ // Show services across all pcaps
164
+ this.get('#/services', function(ctx) {
165
+ closet.api.pcaps.services(function(kvs) {
166
+ ctx.partial('/templates/browse.services.template', { kvs: kvs });
167
+ });
168
+ });
169
+ });
170
+
171
+ (function() {
172
+ var timerId;
173
+ var lastVal = '';
174
+ var timer = function() {
175
+ app.setLocation(lastVal.length < 2 ? '#/browse' : ('#/browse/keyword/' + lastVal));
176
+ };
177
+
178
+ $('input#search').keyup(function() {
179
+ lastVal = $(this).val();
180
+ if (timerId) { clearTimeout(timerId); }
181
+ timerId = setTimeout(timer, 250);
182
+ });
183
+ }());
184
+
185
+ app.run('#/browse');
186
+ });
187
+ }(jQuery));