trisulrp 1.2.4 → 1.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +7 -4
- data/VERSION +1 -1
- data/lib/trisulrp/protocol.rb +199 -45
- data/lib/trisulrp/trp.proto +3 -3
- data/test/test_alerts.rb +37 -72
- data/test/test_cap.rb +23 -43
- data/test/test_key_flows.rb +34 -51
- data/test/test_resources.rb +42 -65
- data/test/test_trisulrp.rb +1 -2
- data/trisulrp.gemspec +2 -2
- metadata +4 -4
data/README.rdoc
CHANGED
@@ -1,13 +1,17 @@
|
|
1
1
|
= trisulrp
|
2
2
|
|
3
|
-
Trisul Remote Protocol
|
4
|
-
|
3
|
+
== Trisul Remote Protocol
|
4
|
+
|
5
|
+
This gem allows you to automate incident response or network forensics tasks on the Trisul Network Metering and Forensics platform.
|
6
|
+
|
7
|
+
|
5
8
|
|
6
9
|
Key Features :
|
7
10
|
* Analysis done remotely (at Trisul server)
|
8
11
|
* All communications over TLS
|
9
12
|
* Strong authentication using Client Certificates
|
10
13
|
* Easy to use
|
14
|
+
* Can do everything from getting statistics, flows, and pcaps
|
11
15
|
|
12
16
|
|
13
17
|
|
@@ -23,6 +27,5 @@ Key Features :
|
|
23
27
|
|
24
28
|
== Copyright
|
25
29
|
|
26
|
-
Copyright (c) 2010
|
27
|
-
further details.
|
30
|
+
Copyright (c) 2010-11 Unleash Networks. See LICENSE.txt for further details.
|
28
31
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.2.
|
1
|
+
1.2.5
|
data/lib/trisulrp/protocol.rb
CHANGED
@@ -7,22 +7,41 @@ require 'openssl'
|
|
7
7
|
require 'socket'
|
8
8
|
require 'time'
|
9
9
|
|
10
|
+
# ==== TrisulRP::Protocol
|
11
|
+
# Contains methods to help with common TRP tasks like
|
12
|
+
# * creating connections
|
13
|
+
# * interacting with Trisul via requests/responses
|
14
|
+
# * helpers to create objects
|
15
|
+
#
|
16
|
+
#
|
17
|
+
|
10
18
|
module TrisulRP::Protocol
|
11
19
|
include TrisulRP::Guids
|
12
20
|
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
21
|
+
# Establish a TLS connection to a Trisul instance
|
22
|
+
#
|
23
|
+
# [server] IP Address or hostname
|
24
|
+
# [port] TRP port, typically 12001 (see trisulConfig.xml)
|
25
|
+
# [client_cert_file] Client certificate file issued by admin
|
26
|
+
# [client_key_file] Client key file issued by admin
|
18
27
|
#
|
19
|
-
# yields or returns a connection object that can be used in subsequent
|
20
|
-
# calls to communicate to the trisul instance
|
21
28
|
#
|
29
|
+
# ==== Returns
|
30
|
+
# ==== Yields
|
31
|
+
# a connection object that can be used in subsequent calls
|
22
32
|
#
|
23
|
-
|
33
|
+
# ==== On error
|
34
|
+
# If a connection cannot be established, an exception is thrown which can point
|
35
|
+
# to the actual cause. The most common causes are
|
36
|
+
#
|
37
|
+
# * Trisul is not running
|
38
|
+
# * Trisul is not running in trp mode (see the docs for runmode)
|
39
|
+
# * Using the wrong port ( check netstat to verify trisul remote protocol port - typically 12001)
|
40
|
+
# * The Access Control List does not permit connections from client IP
|
41
|
+
#
|
42
|
+
def connect(server,port,client_cert_file,client_key_file)
|
24
43
|
tcp_sock=TCPSocket.open(server,port)
|
25
|
-
ctx = OpenSSL::SSL::SSLContext.new
|
44
|
+
ctx = OpenSSL::SSL::SSLContext.new(:TLSv1)
|
26
45
|
ctx.cert = OpenSSL::X509::Certificate.new(File.read(client_cert_file))
|
27
46
|
ctx.key = OpenSSL::PKey::RSA.new(File.read(client_key_file))
|
28
47
|
ssl_sock = OpenSSL::SSL::SSLSocket.new(tcp_sock, ctx)
|
@@ -31,14 +50,20 @@ module TrisulRP::Protocol
|
|
31
50
|
return ssl_sock
|
32
51
|
end
|
33
52
|
|
34
|
-
#
|
35
|
-
#
|
36
|
-
#
|
53
|
+
# Dispatch request to server & get response
|
54
|
+
# [conn] TRP connection previously opened via TrisulRP::Protocol::connect
|
55
|
+
# [trp_request] a TRP request object, created directly or using the mk_request helper
|
37
56
|
#
|
38
|
-
#
|
39
|
-
#
|
57
|
+
# ==== Returns
|
58
|
+
# ==== Yields
|
59
|
+
# a response object, you can then inspect the fields in the response and spawn additional
|
60
|
+
# requests if required
|
40
61
|
#
|
41
|
-
|
62
|
+
# ==== On error
|
63
|
+
# raises an error if the server returns an ErrorResponse - this contains an error_message field
|
64
|
+
# which can tell you what went wrong
|
65
|
+
#
|
66
|
+
def get_response(conn,trp_request)
|
42
67
|
outbuf=""
|
43
68
|
outbuf=trp_request.serialize_to_string
|
44
69
|
trp_socket.write([outbuf.length].pack("N*"))
|
@@ -55,49 +80,178 @@ module TrisulRP::Protocol
|
|
55
80
|
end
|
56
81
|
|
57
82
|
|
58
|
-
|
59
|
-
|
83
|
+
# Query the total time window available in Trisul
|
84
|
+
#
|
85
|
+
# [conn] TRP connection previously opened via connect
|
86
|
+
#
|
87
|
+
# ==== Returns
|
88
|
+
# returns an array of two Time objects [Time_from, Time_to] representing start and end time
|
89
|
+
#
|
90
|
+
# ==== Typical usage
|
91
|
+
#
|
92
|
+
# You pass the output of this method to mk_time_interval to get an object you can attach to a
|
93
|
+
# TRP request.
|
94
|
+
#
|
95
|
+
# <code>
|
96
|
+
#
|
97
|
+
# tmarr = TrisulRP::Protocol::get_avaiable_time(conn)
|
98
|
+
# req =TrisulRP::Protocol.mk_request( :source_ip => target_ip,...
|
99
|
+
# :time_interval => TrisulRP::Protocol::mk_time_interval(tm_arr))
|
100
|
+
#
|
101
|
+
# </code>
|
102
|
+
#
|
103
|
+
def get_available_time(conn)
|
60
104
|
from_tm=to_tm=nil
|
61
105
|
req=mk_request(TRP::Message::Command::COUNTER_GROUP_INFO_REQUEST,
|
62
|
-
|
106
|
+
:counter_group => TrisulRP::Guids::CG_AGGREGATE)
|
63
107
|
get_response(conn,req) do |resp|
|
64
108
|
from_tm = Time.at(resp.counter_group_info_response.group_details[0].time_interval.from.tv_sec)
|
65
109
|
to_tm = Time.at(resp.counter_group_info_response.group_details[0].time_interval.to.tv_sec)
|
66
110
|
end
|
67
111
|
return [from_tm,to_tm]
|
68
|
-
|
112
|
+
end
|
69
113
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
114
|
+
# convert a set of keys into labels
|
115
|
+
#
|
116
|
+
# This method accepts an array of keys (which are references to counter items in Trisul) and sends
|
117
|
+
# a key lookup request to Trisul. Trisul responds with labels for those keys that had labels. Finally a
|
118
|
+
# ready to use map is constructed and returned to the caller.
|
119
|
+
#
|
120
|
+
# [conn] a TRP connection opened earlier via connect(..)
|
121
|
+
# [cgguid] a counter group id. See TrisulRP::Guids for a list of common guids
|
122
|
+
# [key_arr] an array of keys, possibly obtained as a result of an earlier command
|
123
|
+
#
|
124
|
+
# ==== Returns
|
125
|
+
# a hash of Key => Label. All keys in the incoming array will have a hash entry. If Trisul could not
|
126
|
+
# find a label for a key, it will store the key itself as the hash value.
|
127
|
+
#
|
128
|
+
# ==== Typical usage
|
129
|
+
#
|
130
|
+
# You use this method as a bulk resolving mechanism.
|
131
|
+
# <code>
|
132
|
+
#
|
133
|
+
# host_keys = ["0A.0A.18.E0", "B1.01.8F.01",...]
|
134
|
+
# host_names = TrisulRP::Protocol.get_labels_for_keys(conn,
|
135
|
+
# TrisulRP::Guids::CG_HOSTS, host_keys)
|
136
|
+
#
|
137
|
+
# host_names["0A.0A.18.E0"] = "demo.trisul.org" # ok
|
138
|
+
# host_names["B1.01.8F.01"] = "B1.01.8F.01" # no label for this key
|
139
|
+
#
|
140
|
+
# </code>
|
141
|
+
#
|
142
|
+
def get_labels_for_keys(conn, cgguid, key_arr)
|
143
|
+
req = mk_request(TRP::Message::Command::KEY_LOOKUP_REQUEST,
|
144
|
+
:counter_group => cgguid, :keys => key_arr.uniq )
|
145
|
+
h = key_arr.inject({}) { |m,i| m.store(i,i); m }
|
146
|
+
get_response(conn,req) do |resp|
|
147
|
+
resp.key_lookup_response.key_details.each { |d| h.store(d.key,d.label) }
|
148
|
+
end
|
149
|
+
return h
|
150
|
+
end
|
80
151
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
152
|
+
# Helper to create a TRP TimeInterval object
|
153
|
+
#
|
154
|
+
# [tmarr] An array of two Time objects representing a window
|
155
|
+
#
|
156
|
+
# ==== Returns
|
157
|
+
# A TRP::TimeInterval object which can be attached to any :time_interval field of a TRP request
|
158
|
+
#
|
159
|
+
def mk_time_interval(tmarr)
|
160
|
+
tint=TRP::TimeInterval.new
|
161
|
+
tint.from=TRP::Timestamp.new(:tv_sec => tmarr[0].tv_sec, :tv_usec => 0)
|
162
|
+
tint.to=TRP::Timestamp.new(:tv_sec => tmarr[1].tv_sec, :tv_usec => 0)
|
163
|
+
return tint
|
164
|
+
end
|
88
165
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
166
|
+
# Helper to create a TRP request object
|
167
|
+
#
|
168
|
+
# Read the TRP documentation wiki for a description of each command.
|
169
|
+
#
|
170
|
+
# [cmd_id] The command ID.
|
171
|
+
# [params] A hash containing command parameters
|
172
|
+
#
|
173
|
+
# ==== Typical usage
|
174
|
+
#
|
175
|
+
# <code>
|
176
|
+
#
|
177
|
+
# # create a new command of type KeySessionActivityRequest
|
178
|
+
# req = TrisulRP::Protocol.mk_request(TRP::Message::Command::KEY_SESS_ACTIVITY_REQUEST,
|
179
|
+
# :key => target_key ,
|
180
|
+
# :time_interval => mk_time_interval(tmarr))
|
181
|
+
#
|
182
|
+
# ... now you can use the req object ...
|
183
|
+
#
|
184
|
+
# </code>
|
185
|
+
#
|
186
|
+
# You can also create the request objects directly, just a little too verbose for our liking
|
187
|
+
#
|
188
|
+
# <code>
|
189
|
+
#
|
190
|
+
# # create a new command of type CounterItemRequest
|
191
|
+
# req =TRP::Message.new(:trp_command => TRP::Message::Command::KEY_SESS_ACTIVITY_REQUEST )
|
192
|
+
# req.key_session_activity_request = TRP::KeySessionActivityRequest.new(
|
193
|
+
# :key => target_key ,
|
194
|
+
# :time_interval => mk_time_interval(tmarr))
|
195
|
+
#
|
196
|
+
# ... now you can use the req object ...
|
197
|
+
#
|
198
|
+
# </code>
|
199
|
+
#
|
200
|
+
#
|
201
|
+
def mk_request(cmd_id,params)
|
202
|
+
req = TRP::Message.new(:trp_command => cmd_id)
|
203
|
+
case cmd_id
|
204
|
+
when TRP::Message::Command::HELLO_REQUEST
|
205
|
+
req.hello_request = TRP::HelloRequest.new(params)
|
206
|
+
when TRP::Message::Command::COUNTER_GROUP_REQUEST
|
207
|
+
req.counter_group_request = TRP::CounterGroupRequest.new(params)
|
208
|
+
when TRP::Message::Command::COUNTER_ITEM_REQUEST
|
209
|
+
req.counter_item_request = TRP::CounterItemRequest.new(params)
|
210
|
+
when TRP::Message::Command::RELEASE_RESOURCE_REQUEST
|
211
|
+
req.release_resource_request = TRP::ReleaseResourceRequest.new(params)
|
212
|
+
when TRP::Message::Command::CONTROLLED_COUNTER_GROUP_REQUEST
|
213
|
+
req.controlled_counter_group_request = TRP::ControlledCounterGroupRequest.new(params)
|
214
|
+
when TRP::Message::Command::FILTERED_DATAGRAMS_REQUEST
|
215
|
+
req.filtered_datagrams_request = TRP::FilteredDatagramsRequest.new(params)
|
216
|
+
when TRP::Message::Command::CONTROLLED_CONTEXT_REQUEST
|
217
|
+
req.controlled_context_request = TRP::ControlledContextRequest.new(params)
|
218
|
+
when TRP::Message::Command::SEARCH_KEYS_REQUEST
|
219
|
+
req.search_keys_request = TRP::SearchKeysRequest.new(params)
|
220
|
+
when TRP::Message::Command::BULK_COUNTER_ITEM_REQUEST
|
221
|
+
req.bulk_counter_item_request = TRP::BulkItemRequest.new(params)
|
222
|
+
when TRP::Message::Command:: CGMONITOR_REQUEST
|
223
|
+
req.cgmonitor_request = TRP::CgmonitorRequest.new(params)
|
224
|
+
when TRP::Message::Command::TOPPER_SNAPSHOT_REQUEST
|
225
|
+
req.topper_snapshot_request = TRP::TopperSnapshotRequest.new(params)
|
226
|
+
when TRP::Message::Command::UPDATE_KEY_REQUEST
|
227
|
+
req.update_key_request = TRP::UpdateKeyRequest.new(params)
|
228
|
+
when TRP::Message::Command::RING_STATS_REQUEST
|
229
|
+
req.ring_stats_request = TRP::RingStatsRequest.new(params)
|
230
|
+
when TRP::Message::Command::SERVER_STATS_REQUEST
|
231
|
+
req.server_stats_request = TRP::ServerStatsRequest.new(params)
|
232
|
+
when TRP::Message::Command::SESSION_ITEM_REQUEST
|
233
|
+
req.session_item_request = TRP::SessionItemRequest.new(params)
|
234
|
+
when TRP::Message::Command::SESSION_GROUP_REQUEST
|
235
|
+
req.session_group_request = TRP::SessionGroupRequest.new(params)
|
236
|
+
when TRP::Message::Command::ALERT_ITEM_REQUEST
|
237
|
+
req.alert_item_request = TRP::AlertItemRequest.new(params)
|
238
|
+
when TRP::Message::Command::ALERT_GROUP_REQUEST
|
239
|
+
req.alert_group_request = TRP::AlertGroupRequest.new(params)
|
240
|
+
when TRP::Message::Command::RESOURCE_ITEM_REQUEST
|
241
|
+
req.resource_item_request = TRP::ResourceItemRequest.new(params)
|
242
|
+
when TRP::Message::Command::RESOURCE_GROUP_REQUEST
|
243
|
+
req.resource_group_request = TRP::ResourceGroupRequest.new(params)
|
95
244
|
when TRP::Message::Command::KEY_LOOKUP_REQUEST
|
96
|
-
|
245
|
+
req.key_lookup_request = TRP::KeyLookupRequest.new(params)
|
246
|
+
when TRP::Message::Command::COUNTER_GROUP_INFO_REQUEST
|
247
|
+
req.counter_group_info_request = TRP::CounterGroupInfoRequest.new(params)
|
248
|
+
when TRP::Message::Command::KEY_SESS_ACTIVITY_REQUEST
|
249
|
+
req.key_session_activity_request = TRP::KeySessionActivityRequest.new(params)
|
97
250
|
else
|
98
251
|
raise "Unknown TRP command ID"
|
252
|
+
end
|
253
|
+
return req
|
99
254
|
end
|
100
|
-
return req
|
101
|
-
end
|
102
255
|
|
103
256
|
end
|
257
|
+
|
data/lib/trisulrp/trp.proto
CHANGED
@@ -76,7 +76,7 @@ enum PcapFormat {
|
|
76
76
|
}
|
77
77
|
|
78
78
|
message Message {
|
79
|
-
enum Command {
|
79
|
+
enum Command { HELLO_REQUEST=1;
|
80
80
|
HELLO_RESPONSE=2;
|
81
81
|
OK_RESPONSE=3;
|
82
82
|
ERROR_RESPONSE=5;
|
@@ -105,7 +105,7 @@ message Message {
|
|
105
105
|
CGMONITOR_REQUEST=28;
|
106
106
|
CGMONITOR_RESPONSE=29;
|
107
107
|
TOPPER_SNAPSHOT_REQUEST=30;
|
108
|
-
|
108
|
+
TOPPER_SNAPSHOT_RESPONSE=31;
|
109
109
|
UPDATE_KEY_REQUEST=32;
|
110
110
|
UPDATE_KEY_RESPONSE=33;
|
111
111
|
KEY_SESS_ACTIVITY_REQUEST=34;
|
@@ -113,7 +113,7 @@ message Message {
|
|
113
113
|
RING_STATS_REQUEST=36;
|
114
114
|
RING_STATS_RESPONSE=37;
|
115
115
|
SERVER_STATS_REQUEST=38;
|
116
|
-
|
116
|
+
SERVER_STATS_RESPONSE=39;
|
117
117
|
SESSION_GROUP_REQUEST=40;
|
118
118
|
SESSION_GROUP_RESPONSE=41;
|
119
119
|
ALERT_ITEM_REQUEST=42;
|
data/test/test_alerts.rb
CHANGED
@@ -4,81 +4,46 @@
|
|
4
4
|
require 'rubygems'
|
5
5
|
|
6
6
|
require './helper'
|
7
|
-
include
|
8
|
-
|
9
|
-
GUID_CG_APP = "{C51B48D4-7876-479E-B0D9-BD9EFF03CE2E}"
|
10
|
-
|
11
|
-
AG_IDS = "{9AFD8C08-07EB-47E0-BF05-28B4A7AE8DC9}"
|
12
|
-
CG_SIGDS = "{A0FA9464-B496-4A20-A9AB-4D2D09AFF902}"
|
13
|
-
|
14
|
-
CG_HOSTS = "{4CD742B1-C1CA-4708-BE78-0FCA2EB01A86}"
|
15
|
-
CG_APPS = "{C51B48D4-7876-479E-B0D9-BD9EFF03CE2E}"
|
16
|
-
|
17
|
-
|
7
|
+
include TrisulRP::Protocol
|
8
|
+
require guidmap
|
18
9
|
class TestTrisulrp < Test::Unit::TestCase
|
19
10
|
|
20
|
-
def setup
|
21
|
-
if @trp_conn.nil?
|
22
|
-
@trp_conn=TRPLib::connect_trp("127.0.0.1",
|
23
|
-
12001,
|
24
|
-
"Demo_Client.crt",
|
25
|
-
"Demo_Client.key")
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
|
30
11
|
def test_query_alerts
|
31
12
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
resp.items.each do |item|
|
69
|
-
print "#{Time.at(item.time.tv_sec)} "
|
70
|
-
print "#{sip_names[item.source_ip]}".ljust(28)
|
71
|
-
print "#{sport_names[item.source_port]}".ljust(11)
|
72
|
-
print "#{dip_names[item.destination_ip]}".ljust(28)
|
73
|
-
print "#{dport_names[item.destination_port]}".ljust(11)
|
74
|
-
print "#{sigid_names[item.sigid]}".rjust(10)
|
75
|
-
print "\n"
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
|
81
|
-
end
|
13
|
+
target_ip = "0A.02.C7.EB" # 10.2.199.235"
|
14
|
+
TrisulRP::Protocol.connect("127.0.0.1",12001,"Demo_Client.crt","Demo_Client.key") do |conn|
|
15
|
+
tm_arr = TrisulRP::Protocol.get_available_time(conn)
|
16
|
+
req =TrisulRP::Protocol.mk_request(:context => 0,:alert_group =>TrisulRP::Guids::AG_IDS, :source_ip => target_ip,
|
17
|
+
:maxitems => 1000,
|
18
|
+
:time_interval => TRPLib.mk_time_interval(tm_arr))
|
19
|
+
|
20
|
+
TrisulRP::Protocol.get_response(conn,req) do |resp|
|
21
|
+
follow_up = TrisulRP::Protocol.mk_request(:alert_group => TrisulRP::Guids::AG_IDS)
|
22
|
+
resp.alert_group_response.alerts.each do |al|
|
23
|
+
follow_up.alert_item_request.alert_ids << TRP::AlertID.new(:slice_id => al.slice_id, :alert_id => al.alert_id)
|
24
|
+
end
|
25
|
+
|
26
|
+
TrisulRP::Protocol.getresponse(conn,follow_up) do | resp2 |
|
27
|
+
resp=resp2.alert_item_response
|
28
|
+
resolv_candidates = resp.items.collect { |item| [item.source_ip, item.source_port, item.destination_ip, item.destination_port,item.sigid] }
|
29
|
+
resolv_arr = resolv_candidates.transpose
|
30
|
+
sip_names = TrisulRP::Protocol.get_labels_for_keys(conn,TrisulRP::Guids::CG_HOSTS, resolv_arr[0])
|
31
|
+
sport_names = TrisulRP::Protocol.get_labels_for_keys(conn,TrisulRP::Guids::CG_APPS, resolv_arr[1])
|
32
|
+
dip_names = TrisulRP::Protocol.get_labels_for_keys(conn,TrisulRP::Guids::CG_HOSTS, resolv_arr[2])
|
33
|
+
dport_names = TrisulRP::Protocol.get_labels_for_keys(conn,TrisulRP::Guids::CG_APPS, resolv_arr[3])
|
34
|
+
sigid_names = TrisulRP::Protocol.get_labels_for_keys(conn,TrisulRP::Guids::CG_SIGDS, resolv_arr[4])
|
35
|
+
resp.items.each do |item|
|
36
|
+
print "#{Time.at(item.time.tv_sec)} "
|
37
|
+
print "#{sip_names[item.source_ip]}".ljust(28)
|
38
|
+
print "#{sport_names[item.source_port]}".ljust(11)
|
39
|
+
print "#{dip_names[item.destination_ip]}".ljust(28)
|
40
|
+
print "#{dport_names[item.destination_port]}".ljust(11)
|
41
|
+
print "#{sigid_names[item.sigid]}".rjust(10)
|
42
|
+
print "\n"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
82
48
|
end
|
83
49
|
|
84
|
-
|
data/test/test_cap.rb
CHANGED
@@ -2,54 +2,34 @@
|
|
2
2
|
# Akhil.M & Dhinesh.K (c) 2010 Unleash Networks
|
3
3
|
# Testing change
|
4
4
|
require 'rubygems'
|
5
|
-
|
6
5
|
require './helper'
|
7
|
-
include
|
6
|
+
include TrisulRP::Protocol
|
8
7
|
require 'guidmap'
|
9
8
|
|
10
9
|
|
11
10
|
class TestCap < Test::Unit::TestCase
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
follow_up = TRP::Message.new(:trp_command => TRP::Message::Command::FILTERED_DATAGRAMS_REQUEST)
|
35
|
-
follow_up.filtered_datagram_request = TRP::FilteredDatagramRequest.new(
|
36
|
-
:filter_expression => "#{GUIDMap::SG_TCP}=#{si.session_key}",
|
37
|
-
:time_interval => si.time_interval )
|
38
|
-
TRPLib::get_trp_response(@trp_conn,follow_up) do |resp|
|
39
|
-
fdr=resp.filtered_datagram_response
|
40
|
-
|
41
|
-
p "Number of bytes = #{fdr.num_bytes}\n"
|
42
|
-
p "Number of pkts = #{fdr.num_datagrams}\n"
|
43
|
-
p "Hash = #{fdr.sha1}\n"
|
44
|
-
|
45
|
-
File.open("t.pcap","wb") do |f|
|
46
|
-
f.write(fdr.contents)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
11
|
+
def test_dpi
|
12
|
+
target_sess = TRP::SessionID.new(:slice_id => 2, :session_id => 207)
|
13
|
+
TrisulRP::Protocol.connect("127.0.0.1", 12001,"Demo_Client.crt","Demo_Client.key") do |conn|
|
14
|
+
req = TrisulRP::Protocol.mk_request(TRP::Message::Command::SESSION_ITEM_REQUEST,
|
15
|
+
:session_ids => [target_sess])
|
16
|
+
TrisulRP::Protocol.get_response(conn,req) do |resp|
|
17
|
+
si = resp.session_item_response.items[0]
|
18
|
+
follow_up = TrisulRP::Protocol.mk_request(:filter_expression => "#{GUIDMap::SG_TCP}=#{si.session_key}",
|
19
|
+
:time_interval => si.time_interval )
|
20
|
+
TrisulRP::Protocol.get_response(conn,follow_up) do |resp|
|
21
|
+
fdr=resp.filtered_datagram_response
|
22
|
+
p "Number of bytes = #{fdr.num_bytes}\n"
|
23
|
+
p "Number of pkts = #{fdr.num_datagrams}\n"
|
24
|
+
p "Hash = #{fdr.sha1}\n"
|
25
|
+
|
26
|
+
File.open("t.pcap","wb") do |f|
|
27
|
+
f.write(fdr.contents)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
53
33
|
end
|
54
34
|
|
55
35
|
|
data/test/test_key_flows.rb
CHANGED
@@ -2,60 +2,43 @@
|
|
2
2
|
# Akhil.M & Dhinesh.K (c) 2010 Unleash Networks
|
3
3
|
# Testing change
|
4
4
|
require 'rubygems'
|
5
|
-
|
6
|
-
|
7
5
|
require './helper'
|
8
|
-
include
|
9
|
-
|
10
|
-
GUID_CG_APP = "{C51B48D4-7876-479E-B0D9-BD9EFF03CE2E}"
|
6
|
+
include TrisulRP::Protocol
|
7
|
+
require guidmap
|
11
8
|
|
12
9
|
class TestTrisulrp < Test::Unit::TestCase
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
print "#{item.key1A.label}".ljust(28)
|
46
|
-
print "#{item.key2A.label}".ljust(11)
|
47
|
-
print "#{item.key1Z.label}".ljust(28)
|
48
|
-
print "#{item.key2Z.label}".ljust(11)
|
49
|
-
print "#{item.az_bytes}".rjust(10)
|
50
|
-
print "#{item.za_bytes}".rjust(10)
|
51
|
-
print "\n"
|
52
|
-
end
|
53
|
-
|
54
|
-
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
10
|
+
def test_flows_for_host
|
11
|
+
|
12
|
+
target_key = "0A.01.3C.BB"
|
13
|
+
TrisulRP::Protocol.connect("127.0.0.1",12001,"Demo_Client.crt","Demo_Client.key") do |conn|
|
14
|
+
|
15
|
+
tmarr = TrisulRP::Protocol.get_available_time(conn)
|
16
|
+
|
17
|
+
req = TrisulRP::Protocol.mk_request(TRP::Message::Command::KEY_SESS_ACTIVITY_REQUEST,
|
18
|
+
:key => target_key ,:time_interval =>TrisulRP::Protocol.mk_time_interval(tmarr))
|
19
|
+
TrisulRP::Protocol.get_response(conn,req) do |resp|
|
20
|
+
all_sids = resp.key_session_activity_response.sessions.collect{ |ai| TRP::SessionID.new(
|
21
|
+
:slice_id => ai.slice_id,
|
22
|
+
:session_id => ai.session_id ) }
|
23
|
+
|
24
|
+
follow_up = TrisulRP::Protocol.mk_request(:session_ids => all_sids)
|
25
|
+
TrisulRP::Protocol.get_response(conn,follow_up) do |resp|
|
26
|
+
resp.session_item_response.items.each do |item|
|
27
|
+
print "#{item.state} "
|
28
|
+
print "#{Time.at(item.time_interval.from.tv_sec)} "
|
29
|
+
print "#{item.time_interval.to.tv_sec-item.time_interval.from.tv_sec} ".rjust(8)
|
30
|
+
print "#{item.key1A.label}".ljust(28)
|
31
|
+
print "#{item.key2A.label}".ljust(11)
|
32
|
+
print "#{item.key1Z.label}".ljust(28)
|
33
|
+
print "#{item.key2Z.label}".ljust(11)
|
34
|
+
print "#{item.az_bytes}".rjust(10)
|
35
|
+
print "#{item.za_bytes}".rjust(10)
|
36
|
+
print "\n"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
59
42
|
end
|
60
43
|
|
61
44
|
|
data/test/test_resources.rb
CHANGED
@@ -2,75 +2,52 @@
|
|
2
2
|
# Akhil.M & Dhinesh.K (c) 2010 Unleash Networks
|
3
3
|
# Testing change
|
4
4
|
require 'rubygems'
|
5
|
-
|
6
|
-
|
7
5
|
require './helper'
|
8
|
-
include
|
9
|
-
|
10
|
-
GUID_CG_APP = "{C51B48D4-7876-479E-B0D9-BD9EFF03CE2E}"
|
6
|
+
include TrisulRP::Protocol
|
7
|
+
require guidmap
|
11
8
|
|
12
9
|
class TestTrisulrp < Test::Unit::TestCase
|
13
10
|
|
14
|
-
def setup
|
15
|
-
if @trp_conn.nil?
|
16
|
-
@trp_conn=TRPLib::connect_trp("127.0.0.1",
|
17
|
-
12001,
|
18
|
-
"Demo_Client.crt",
|
19
|
-
"Demo_Client.key")
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
|
24
|
-
def itest_resource_items
|
25
|
-
req=TRPLib::mk_resource_item_request(1,[574,575])
|
26
|
-
get_trp_response(@trp_conn,req) do |resp|
|
27
|
-
TRPLib::print_resource_item_response(resp)
|
28
|
-
end
|
29
|
-
end
|
30
11
|
|
12
|
+
# demonstrates getting all HTTP requests getting a *DLL
|
31
13
|
def test_query_resources
|
32
14
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
|
15
|
+
target_ip = "0A.02.C7.EB" # 10.2.199.235"
|
16
|
+
|
17
|
+
TrisulRP::Protocol.connect_trp("127.0.0.1", 12001,"Demo_Client.crt","Demo_Client.key") do |conn|
|
18
|
+
|
19
|
+
tm_arr = TrisulRP::Protocol. get_available_time(conn)
|
20
|
+
req = TrisulRP::Protocol.mk_request(TRP::Message::Command::RESOURCE_GROUP_REQUEST,
|
21
|
+
:context => 0,
|
22
|
+
:resource_group => TrisulRP::Guids::RG_URL,
|
23
|
+
:uri_pattern => "dll",:maxitems => 1000, :time_interval => mk_time_interval(tm_arr))
|
24
|
+
|
25
|
+
TrisulRP::Protocol.get_response(conn,req) do |resp|
|
26
|
+
|
27
|
+
# matching resource ids
|
28
|
+
resource_ids = resp.resource_group_response.resources.collect do |res|
|
29
|
+
TRP::ResourceID.new(:slice_id => res.slice_id, :resource_id => res.resource_id)
|
30
|
+
end
|
31
|
+
|
32
|
+
follow_up = TrisulRP::Protocol.mk_request( TRP::Message::Command::RESOURCE_ITEM_REQUEST,
|
33
|
+
:context => 0, :resource_group => TrisulRP::Guids::RG_URL,
|
34
|
+
:resource_ids => resource_ids)
|
35
|
+
|
36
|
+
TrisulRP::Protocol.get_response(conn,follow_up) do | resp2 |
|
37
|
+
resp=resp2.resource_item_response
|
38
|
+
resp.items.each do |item|
|
39
|
+
print "#{Time.at(item.time.tv_sec)} "
|
40
|
+
print "#{item.source_ip}".ljust(28)
|
41
|
+
print "#{item.source_port}".ljust(11)
|
42
|
+
print "#{item.destination_ip}".ljust(28)
|
43
|
+
print "#{item.destination_port}".ljust(11)
|
44
|
+
print "#{item.uri}".rjust(10)
|
45
|
+
print "\n"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
data/test/test_trisulrp.rb
CHANGED
@@ -6,8 +6,7 @@ class TestTrisulrp < Test::Unit::TestCase
|
|
6
6
|
|
7
7
|
def test_basic
|
8
8
|
|
9
|
-
TrisulRP::Protocol.connect("127.0.0.1", 12001,
|
10
|
-
"Demo_Client.crt", "Demo_Client.key") do |conn|
|
9
|
+
TrisulRP::Protocol.connect("127.0.0.1", 12001,"Demo_Client.crt", "Demo_Client.key") do |conn|
|
11
10
|
TrisulRP::Protocol.get_available_time(conn)
|
12
11
|
end
|
13
12
|
|
data/trisulrp.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{trisulrp}
|
8
|
-
s.version = "1.2.
|
8
|
+
s.version = "1.2.5"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["vivek"]
|
12
|
-
s.date = %q{2011-01-
|
12
|
+
s.date = %q{2011-01-17}
|
13
13
|
s.description = %q{This gem deals about the trisul remote protocol}
|
14
14
|
s.email = %q{vivek_rajagopal@yahoo.com}
|
15
15
|
s.extra_rdoc_files = [
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 1
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
version: 1.2.
|
8
|
+
- 5
|
9
|
+
version: 1.2.5
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- vivek
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-01-
|
17
|
+
date: 2011-01-17 00:00:00 +05:30
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -149,7 +149,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
149
149
|
requirements:
|
150
150
|
- - ">="
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
hash:
|
152
|
+
hash: 236447741
|
153
153
|
segments:
|
154
154
|
- 0
|
155
155
|
version: "0"
|