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,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"/> ' +
|
51
|
+
'<a class="link" title="' + path + '">' + kv.key[depth-1] + '</a>' +
|
52
|
+
' ' +
|
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));
|