DIY-pcap 0.2.6 → 0.2.7
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/lib/diy/controller.rb +36 -11
- data/lib/diy/exceptions.rb +18 -0
- data/lib/diy/strategy_builder.rb +2 -2
- data/lib/diy/utils.rb +22 -0
- data/lib/diy/version.rb +1 -1
- data/spec/controller_spec.rb +0 -37
- data/spec/usererror_spec.rb +85 -0
- metadata +3 -2
data/lib/diy/controller.rb
CHANGED
@@ -27,8 +27,8 @@ module DIY
|
|
27
27
|
pkts = @offline.nexts
|
28
28
|
one_round( client, server, pkts )
|
29
29
|
client, server = server, client
|
30
|
-
rescue HopePacketTimeoutError
|
31
|
-
DIY::Logger.warn( "Timeout: Hope packet is #{pkts[0].inspect} ")
|
30
|
+
rescue HopePacketTimeoutError, UserError, FFI::PCap::LibError => e
|
31
|
+
DIY::Logger.warn( "Timeout: Hope packet is #{pkts[0].inspect} ") if e.kind_of?(HopePacketTimeoutError)
|
32
32
|
@fail_count += 1
|
33
33
|
begin
|
34
34
|
@offline.next_pcap
|
@@ -50,12 +50,22 @@ module DIY
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def one_round( client, server, pkts )
|
53
|
+
@error_flag = nil
|
53
54
|
@round_count = 0 unless @round_count
|
54
55
|
@round_count += 1
|
55
|
-
DIY::Logger.info "round #{@round_count}: (c:#{client.__drburi} / s:#{server.__drburi}) #{pkts[0].inspect}:(
|
56
|
+
DIY::Logger.info "round #{@round_count}: (c:#{client.__drburi} / s:#{server.__drburi}) #{pkts[0].inspect}:(queue= #{pkts.size})"
|
56
57
|
server.ready do |recv_pkt|
|
58
|
+
next if @error_flag # error accur waiting other thread do with it
|
57
59
|
recv_pkt = Packet.new(recv_pkt)
|
58
|
-
|
60
|
+
begin
|
61
|
+
@strategy.call(pkts.first, recv_pkt, pkts)
|
62
|
+
rescue DIY::StrategyCallError =>e
|
63
|
+
DIY::Logger.warn("UserError Catch: " + e.inspect)
|
64
|
+
e.backtrace.each do |msg|
|
65
|
+
DIY::Logger.info(msg)
|
66
|
+
end
|
67
|
+
@error_flag = e
|
68
|
+
end
|
59
69
|
end
|
60
70
|
client_send(client, pkts)
|
61
71
|
wait_recv_ok(pkts)
|
@@ -63,16 +73,26 @@ module DIY
|
|
63
73
|
end
|
64
74
|
|
65
75
|
def client_send(client, pkts)
|
66
|
-
if
|
67
|
-
client.inject(pkts)
|
68
|
-
else
|
76
|
+
if @before_send
|
69
77
|
pkts = pkts.collect do |pkt|
|
70
78
|
content = pkt.content
|
71
|
-
|
79
|
+
begin
|
80
|
+
pkt.content = @before_send.call(content)
|
81
|
+
rescue Exception => e
|
82
|
+
DIY::Logger.warn("UserError Catch: " + error = BeforeSendCallError.new(e) )
|
83
|
+
error.backtrace.each do |msg|
|
84
|
+
DIY::Logger.info(msg)
|
85
|
+
end
|
86
|
+
raise error
|
87
|
+
end
|
72
88
|
pkt
|
73
89
|
end
|
74
|
-
|
90
|
+
end
|
91
|
+
begin
|
75
92
|
client.inject(pkts)
|
93
|
+
rescue FFI::PCap::LibError =>e
|
94
|
+
DIY::Logger.warn("SendPacketError Catch: " + e )
|
95
|
+
raise e
|
76
96
|
end
|
77
97
|
end
|
78
98
|
|
@@ -90,14 +110,19 @@ module DIY
|
|
90
110
|
end
|
91
111
|
|
92
112
|
def wait_recv_ok(pkts)
|
93
|
-
wait_until(@timeout ||= 10)
|
113
|
+
wait_until(@timeout ||= 10) do
|
114
|
+
if @error_flag
|
115
|
+
raise @error_flag
|
116
|
+
end
|
117
|
+
pkts.empty?
|
118
|
+
end
|
94
119
|
end
|
95
120
|
|
96
121
|
def wait_until( timeout = 10, &block )
|
97
122
|
Timeout.timeout(timeout, DIY::HopePacketTimeoutError.new("hope packet wait timeout after #{timeout} seconds") ) do
|
98
123
|
loop do
|
99
124
|
break if block.call
|
100
|
-
sleep 0.
|
125
|
+
sleep 0.1
|
101
126
|
end
|
102
127
|
end
|
103
128
|
end
|
data/lib/diy/exceptions.rb
CHANGED
@@ -12,4 +12,22 @@ module DIY
|
|
12
12
|
# 不可能出现的报文出现
|
13
13
|
class UnExpectPacketError < Error; end
|
14
14
|
|
15
|
+
class UserError < Error
|
16
|
+
def initialize(real_exception)
|
17
|
+
puts "new..."
|
18
|
+
@real_exception = real_exception
|
19
|
+
@name = real_exception.class
|
20
|
+
@message = real_exception.message
|
21
|
+
set_backtrace( Utils.filter_backtrace(real_exception) )
|
22
|
+
end
|
23
|
+
|
24
|
+
def inspect
|
25
|
+
"#<#{self.class.name}: @real_exception=#{@name}, @real_msg=#{@message}>"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# 策略执行异常
|
30
|
+
class StrategyCallError < UserError; end
|
31
|
+
# before_send 异常
|
32
|
+
class BeforeSendCallError < UserError; end
|
15
33
|
end
|
data/lib/diy/strategy_builder.rb
CHANGED
@@ -30,8 +30,8 @@ module DIY
|
|
30
30
|
begin
|
31
31
|
ret = strategy.call(hope_pkt.content, recv_pkt.content, queue)
|
32
32
|
rescue Exception => e
|
33
|
-
logger.error("user strategy exception: #{e.class} -> #{e.message}")
|
34
|
-
raise
|
33
|
+
#~ logger.error("user strategy exception: #{e.class} -> #{e.message}")
|
34
|
+
raise StrategyCallError.new(e)
|
35
35
|
else
|
36
36
|
if ret == Strategy::OK
|
37
37
|
logger.info("pkt same:")
|
data/lib/diy/utils.rb
CHANGED
@@ -34,6 +34,28 @@ module DIY
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
37
|
+
|
38
|
+
def filter_backtrace(e)
|
39
|
+
filter_ary = [ "/lib/diy/controller.rb", "/lib/diy/strategy_builder.rb" ]
|
40
|
+
new_bt = []
|
41
|
+
e.backtrace.each do |msg|
|
42
|
+
if ! Utils.ary_match(filter_ary, msg)
|
43
|
+
new_bt << msg
|
44
|
+
else
|
45
|
+
puts "break"
|
46
|
+
break
|
47
|
+
end
|
48
|
+
end
|
49
|
+
new_bt
|
50
|
+
end
|
51
|
+
|
52
|
+
def ary_match(ary, msg)
|
53
|
+
ary.each do |e|
|
54
|
+
return true if /#{Regexp.escape(e)}/ === msg
|
55
|
+
end
|
56
|
+
nil
|
57
|
+
end
|
58
|
+
|
37
59
|
end
|
38
60
|
end
|
39
61
|
end
|
data/lib/diy/version.rb
CHANGED
data/spec/controller_spec.rb
CHANGED
@@ -1,37 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe DIY::Builder do
|
4
|
-
|
5
|
-
before(:each) do
|
6
|
-
@device_name = FFI::PCap.dump_devices[0][0]
|
7
|
-
DIY::Logger.info( "Initialize Live: #{@device_name}" )
|
8
|
-
@live = DIY::Live.new(@device_name)#FFI::PCap::Live.new(:dev=>@device_name, :handler => FFI::PCap::Handler, :promisc => true)
|
9
|
-
@live2 = DIY::Live.new(@device_name)#FFI::PCap::Live.new(:dev=>@device_name, :handler => FFI::PCap::Handler, :promisc => true)
|
10
|
-
|
11
|
-
@curi = "druby://localhost:7878"
|
12
|
-
@suri = "druby://localhost:7879"
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
it "#run" do
|
17
|
-
# client create
|
18
|
-
Thread.abort_on_exception = true
|
19
|
-
client_t = Thread.new do
|
20
|
-
client = DIY::Worker.new(@live)
|
21
|
-
DIY::WorkerKeeper.new(client, @curi).run
|
22
|
-
end
|
23
|
-
|
24
|
-
server_t = Thread.new do
|
25
|
-
server = DIY::Worker.new(@live2)
|
26
|
-
DIY::WorkerKeeper.new(server, @suri).run
|
27
|
-
end
|
28
|
-
|
29
|
-
sleep 1
|
30
|
-
builder = DIY::Builder.new do
|
31
|
-
pcapfiles "helper/http.pcap"
|
32
|
-
use DIY::SimpleStrategy.new
|
33
|
-
timeout 10
|
34
|
-
end
|
35
|
-
builder.run
|
36
|
-
end
|
37
|
-
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'diy/device_finder'
|
3
|
+
|
4
|
+
def raise_me
|
5
|
+
raise "Error on me"
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "Controller" do
|
9
|
+
|
10
|
+
before(:all) do
|
11
|
+
@device_name = DIY::DeviceFinder.smart_select
|
12
|
+
@live = DIY::Live.new(@device_name)
|
13
|
+
@live2 = DIY::Live.new(@device_name)
|
14
|
+
|
15
|
+
@curi = "druby://localhost:7878"
|
16
|
+
@suri = "druby://localhost:7879"
|
17
|
+
|
18
|
+
# client create
|
19
|
+
Thread.abort_on_exception = true
|
20
|
+
@client_t ||= Thread.new do
|
21
|
+
client = DIY::Worker.new(@live)
|
22
|
+
DIY::WorkerKeeper.new(client, @curi).run
|
23
|
+
end
|
24
|
+
|
25
|
+
@server_t ||= Thread.new do
|
26
|
+
server = DIY::Worker.new(@live2)
|
27
|
+
DIY::WorkerKeeper.new(server, @suri).run
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
after(:all) do
|
32
|
+
@client_t.kill
|
33
|
+
@server_t.kill
|
34
|
+
end
|
35
|
+
|
36
|
+
it "#run " do
|
37
|
+
sleep 1
|
38
|
+
builder = DIY::Builder.new do
|
39
|
+
pcapfiles "helper/http.pcap"
|
40
|
+
use DIY::SimpleStrategy.new
|
41
|
+
timeout 10
|
42
|
+
end
|
43
|
+
lambda { builder.run }.should_not raise_error
|
44
|
+
end
|
45
|
+
|
46
|
+
it "#run stragety error" do
|
47
|
+
|
48
|
+
|
49
|
+
wrongUserStragety = lambda {
|
50
|
+
raise_me
|
51
|
+
#~ raise "error one me"
|
52
|
+
}
|
53
|
+
|
54
|
+
sleep 1
|
55
|
+
builder = DIY::Builder.new do
|
56
|
+
pcapfiles "helper/http.pcap"
|
57
|
+
use wrongUserStragety
|
58
|
+
timeout 10
|
59
|
+
end
|
60
|
+
lambda { builder.run }.should_not raise_error
|
61
|
+
end
|
62
|
+
|
63
|
+
it "#run before_send error" do
|
64
|
+
sleep 1
|
65
|
+
build2 = DIY::Builder.new do
|
66
|
+
before_send do
|
67
|
+
raise "error on me"
|
68
|
+
end
|
69
|
+
pcapfiles "helper/http.pcap"
|
70
|
+
end
|
71
|
+
lambda { build2.run }.should_not raise_error
|
72
|
+
end
|
73
|
+
|
74
|
+
it "#run big packet " do
|
75
|
+
sleep 1
|
76
|
+
build2 = DIY::Builder.new do
|
77
|
+
before_send do |pkt|
|
78
|
+
new_pkt = "a" * 10000
|
79
|
+
end
|
80
|
+
pcapfiles "helper/http.pcap"
|
81
|
+
end
|
82
|
+
lambda { build2.run }.should_not raise_error
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
version: 0.2.
|
8
|
+
- 7
|
9
|
+
version: 0.2.7
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- yafei Lee
|
@@ -141,6 +141,7 @@ files:
|
|
141
141
|
- spec/mu_parser_spec.rb
|
142
142
|
- spec/offline_spec.rb
|
143
143
|
- spec/spec_helper.rb
|
144
|
+
- spec/usererror_spec.rb
|
144
145
|
- spec/utils_spec.rb
|
145
146
|
- spec/worker_spec.rb
|
146
147
|
has_rdoc: true
|