DIY-pcap 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +14 -6
- data/lib/diy/builder.rb +34 -3
- data/lib/diy/controller.rb +39 -4
- data/lib/diy/packet.rb +1 -0
- data/lib/diy/utils.rb +1 -1
- data/lib/diy/version.rb +1 -1
- data/simple/diy-strategy-pcap.rb +2 -0
- data/simple/pcap.rb +2 -0
- data/spec/utils_spec.rb +1 -1
- metadata +2 -2
data/README.md
CHANGED
@@ -9,7 +9,7 @@ DIY-pcap
|
|
9
9
|
|
10
10
|
1. 安装很简单
|
11
11
|
|
12
|
-
```
|
12
|
+
```bash
|
13
13
|
gem install DIY-pcap
|
14
14
|
```
|
15
15
|
|
@@ -32,9 +32,9 @@ DIY-pcap
|
|
32
32
|
|
33
33
|
3. 开始发送与接收数据
|
34
34
|
|
35
|
-
* 服务端,执行 `rpcap spec.rb`
|
35
|
+
* 服务端,执行 `rpcap -f spec.rb`
|
36
36
|
|
37
|
-
* 本机, 执行 `pcap spec.rb`
|
37
|
+
* 本机, 执行 `pcap -f spec.rb`
|
38
38
|
|
39
39
|
## 使用方法, 回放pcap报文 ( 二 )
|
40
40
|
|
@@ -46,10 +46,18 @@ DIY-pcap
|
|
46
46
|
DIY::Builder.new do
|
47
47
|
pcapfile "pcaps/simple.pcap"
|
48
48
|
use DIY::SimpleStrategy.new
|
49
|
+
client "x.x.x.x" # 配置客户端ip, 缺省端口为7878
|
50
|
+
server "x.x.x.x" # 配置服务端ip, 缺省端口为7879, 以上都可以写为 x.x.x.x:x 的形式, 与 rpcap或pcap的 -i 参数对应
|
49
51
|
end
|
50
52
|
```
|
51
|
-
3.
|
53
|
+
3. 使用方法( 准备三台主机或逻辑主机 )
|
54
|
+
|
55
|
+
* 服务端, 执行 `rpcap` ( 如果启动出错, 请参考 rpcap -h 中参数 -i 与 -n )
|
56
|
+
|
57
|
+
* 客户端, 执行 `pcap` ( 如果启动出错, 请参考 pcap -h 中参数 -i 与 -n )
|
58
|
+
|
59
|
+
* 控制端, 执行 `ruby spec.rb`, OK, 开始交互, 结束后, 会有 cost time 与 fail count 输出.
|
52
60
|
|
53
|
-
4. (其他说明) 扩展策略, 自定义日志,
|
61
|
+
4. (其他说明) 扩展策略, 自定义日志, 修改报文内容参见 [Wiki Home](/windy/DIY-pcap/wiki).
|
54
62
|
|
55
|
-
OK,
|
63
|
+
OK, 一切如故.
|
data/lib/diy/builder.rb
CHANGED
@@ -11,8 +11,12 @@ module DIY
|
|
11
11
|
@strategies.unshift(what)
|
12
12
|
end
|
13
13
|
|
14
|
-
def before_send(&block)
|
15
|
-
|
14
|
+
def before_send(arg= nil, &block)
|
15
|
+
if arg
|
16
|
+
@before_send_hook = arg
|
17
|
+
else
|
18
|
+
@before_send_hook = block
|
19
|
+
end
|
16
20
|
end
|
17
21
|
|
18
22
|
def find_worker_keepers
|
@@ -23,6 +27,33 @@ module DIY
|
|
23
27
|
@server = DRbObject.new_with_uri(@suri)
|
24
28
|
end
|
25
29
|
|
30
|
+
def client(ip_or_iport)
|
31
|
+
default_port = "7878"
|
32
|
+
if ! ip_or_iport.include?(':')
|
33
|
+
iport = ip_or_iport + ':' + default_port
|
34
|
+
else
|
35
|
+
iport = ip_or_iport
|
36
|
+
end
|
37
|
+
@curi = ip2druby(iport)
|
38
|
+
end
|
39
|
+
|
40
|
+
def server(ip_or_iport)
|
41
|
+
default_port = "7879"
|
42
|
+
if ! ip_or_iport.include?(':')
|
43
|
+
iport = ip_or_iport + ':' + default_port
|
44
|
+
else
|
45
|
+
iport = ip_or_iport
|
46
|
+
end
|
47
|
+
@suri = ip2druby(iport)
|
48
|
+
end
|
49
|
+
|
50
|
+
def ip2druby(ip)
|
51
|
+
if ! ip.include?('://')
|
52
|
+
return "druby://" + ip
|
53
|
+
end
|
54
|
+
return ip
|
55
|
+
end
|
56
|
+
|
26
57
|
def pcapfile(pcaps)
|
27
58
|
DIY::Logger.info( "Initialize Offline: #{pcaps.to_a.join(', ')}" )
|
28
59
|
@offline = DIY::Offline.new(pcaps)
|
@@ -35,7 +66,7 @@ module DIY
|
|
35
66
|
@strategies.each { |builder| @strategy_builder.add(builder) }
|
36
67
|
find_worker_keepers
|
37
68
|
controller = Controller.new( @client, @server, @offline, @strategy_builder )
|
38
|
-
|
69
|
+
controller.before_send(&@before_send_hook)
|
39
70
|
controller.run
|
40
71
|
end
|
41
72
|
|
data/lib/diy/controller.rb
CHANGED
@@ -8,12 +8,15 @@ module DIY
|
|
8
8
|
@server = server
|
9
9
|
@offline = offline
|
10
10
|
@strategy = strategy
|
11
|
+
@before_send = nil
|
11
12
|
end
|
12
13
|
|
13
14
|
def run
|
14
15
|
client = @client
|
15
16
|
server = @server
|
16
17
|
|
18
|
+
@fail_count = 0
|
19
|
+
start_time = Time.now
|
17
20
|
#clear
|
18
21
|
client.terminal
|
19
22
|
server.terminal
|
@@ -25,7 +28,14 @@ module DIY
|
|
25
28
|
client, server = server, client
|
26
29
|
rescue HopePacketTimeoutError
|
27
30
|
DIY::Logger.warn( "Timeout: Hope packet is #{pkts[0].inspect} ")
|
31
|
+
@fail_count += 1
|
32
|
+
begin
|
28
33
|
@offline.next_pcap
|
34
|
+
rescue EOFError
|
35
|
+
client.terminal
|
36
|
+
server.terminal
|
37
|
+
break
|
38
|
+
end
|
29
39
|
client,server = @client, @server
|
30
40
|
rescue EOFError
|
31
41
|
client.terminal
|
@@ -33,27 +43,52 @@ module DIY
|
|
33
43
|
break
|
34
44
|
end
|
35
45
|
end
|
46
|
+
end_time = Time.now
|
47
|
+
stats_result( end_time - start_time, @fail_count )
|
36
48
|
end
|
37
49
|
|
38
50
|
def one_round( client, server, pkts )
|
39
51
|
@round_count = 0 unless @round_count
|
40
52
|
@round_count += 1
|
41
|
-
DIY::Logger.info "round #{@round_count}:
|
53
|
+
DIY::Logger.info "round #{@round_count}: (c:#{client.__drburi} / s:#{server.__drburi}) #{pkts[0].inspect}:(size= #{pkts.size})"
|
42
54
|
server.ready do |recv_pkt|
|
43
55
|
recv_pkt = Packet.new(recv_pkt)
|
44
56
|
@strategy.call(pkts.first, recv_pkt, pkts)
|
45
57
|
end
|
46
|
-
client
|
58
|
+
client_send(client, pkts)
|
47
59
|
wait_recv_ok(pkts)
|
48
60
|
server.terminal
|
49
61
|
end
|
50
62
|
|
63
|
+
def client_send(client, pkts)
|
64
|
+
if ! @before_send
|
65
|
+
client.inject(pkts)
|
66
|
+
else
|
67
|
+
pkts = pkts.collect do |pkt|
|
68
|
+
content = pkt.content
|
69
|
+
pkt.content = @before_send.call(content)
|
70
|
+
pkt
|
71
|
+
end
|
72
|
+
|
73
|
+
client.inject(pkts)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def before_send(&block)
|
78
|
+
@before_send = block
|
79
|
+
end
|
80
|
+
|
81
|
+
def stats_result( cost_time, fail_count )
|
82
|
+
DIY::Logger.info " ====== Finished in #{cost_time} seconds"
|
83
|
+
DIY::Logger.info " ====== Total fail_count: #{fail_count} failures"
|
84
|
+
end
|
85
|
+
|
51
86
|
def wait_recv_ok(pkts)
|
52
87
|
wait_until { pkts.empty? }
|
53
88
|
end
|
54
89
|
|
55
|
-
def wait_until( timeout =
|
56
|
-
timeout(timeout, DIY::HopePacketTimeoutError.new("hope packet wait timeout after #{timeout}
|
90
|
+
def wait_until( timeout = 10, &block )
|
91
|
+
timeout(timeout, DIY::HopePacketTimeoutError.new("hope packet wait timeout after #{timeout} seconds") ) do
|
57
92
|
loop do
|
58
93
|
break if block.call
|
59
94
|
sleep 0.01
|
data/lib/diy/packet.rb
CHANGED
data/lib/diy/utils.rb
CHANGED
data/lib/diy/version.rb
CHANGED
data/simple/diy-strategy-pcap.rb
CHANGED
data/simple/pcap.rb
CHANGED
data/spec/utils_spec.rb
CHANGED