DIY-pcap 0.2.7 → 0.2.8
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/diy/controller.rb +5 -2
- data/lib/diy/live.rb +9 -1
- data/lib/diy/offline.rb +1 -1
- data/lib/diy/packet.rb +10 -1
- data/lib/diy/strategy.rb +11 -0
- data/lib/diy/utils.rb +8 -4
- data/lib/diy/version.rb +1 -1
- data/lib/diy/worker.rb +17 -2
- data/lib/diy/worker_keeper.rb +14 -3
- data/spec/controller_spec.rb +88 -0
- data/spec/helper/long.dat +0 -0
- data/spec/packet_spec.rb +15 -0
- data/spec/utils_spec.rb +4 -0
- metadata +11 -8
- data/spec/usererror_spec.rb +0 -85
data/lib/diy/controller.rb
CHANGED
@@ -28,7 +28,7 @@ module DIY
|
|
28
28
|
one_round( client, server, pkts )
|
29
29
|
client, server = server, client
|
30
30
|
rescue HopePacketTimeoutError, UserError, FFI::PCap::LibError => e
|
31
|
-
DIY::Logger.warn( "Timeout: Hope packet is #{pkts[0].
|
31
|
+
DIY::Logger.warn( "Timeout: Hope packet is #{pkts[0].pretty_print} ") if e.kind_of?(HopePacketTimeoutError)
|
32
32
|
@fail_count += 1
|
33
33
|
begin
|
34
34
|
@offline.next_pcap
|
@@ -53,7 +53,10 @@ module DIY
|
|
53
53
|
@error_flag = nil
|
54
54
|
@round_count = 0 unless @round_count
|
55
55
|
@round_count += 1
|
56
|
-
DIY::Logger.info "round #{@round_count}: (c:#{client.__drburi} / s:#{server.__drburi}) #{pkts[0].
|
56
|
+
DIY::Logger.info "round #{@round_count}: (c:#{client.__drburi} / s:#{server.__drburi}) #{pkts[0].pretty_print}:(queue= #{pkts.size})"
|
57
|
+
if pkts.size >= 10
|
58
|
+
DIY::Logger.warn "queue size too big: #{pkts.size}, maybe something error"
|
59
|
+
end
|
57
60
|
server.ready do |recv_pkt|
|
58
61
|
next if @error_flag # error accur waiting other thread do with it
|
59
62
|
recv_pkt = Packet.new(recv_pkt)
|
data/lib/diy/live.rb
CHANGED
@@ -8,6 +8,7 @@ module DIY
|
|
8
8
|
DIY::Logger.info( "Initialize Live: #{device_name}" )
|
9
9
|
@live = FFI::PCap::Live.new(:dev=>device_name, :handler => FFI::PCap::CopyHandler, :promisc => true)
|
10
10
|
DIY::Logger.info( "Listen on: #{net} " )
|
11
|
+
@running = false
|
11
12
|
#~ @live.non_blocking= true
|
12
13
|
end
|
13
14
|
attr_reader :live
|
@@ -19,13 +20,20 @@ module DIY
|
|
19
20
|
alias send_packet inject
|
20
21
|
|
21
22
|
def loop(&block)
|
22
|
-
|
23
|
+
@running = true
|
24
|
+
while @running do
|
23
25
|
@live.dispatch do |this, pkt|
|
24
26
|
next unless pkt
|
25
27
|
block.call(this, pkt)
|
26
28
|
end
|
27
29
|
sleep 0.1
|
28
30
|
end
|
31
|
+
DIY::Logger.debug "stopped loop recv..."
|
32
|
+
end
|
33
|
+
|
34
|
+
def break
|
35
|
+
DIY::Logger.debug "stopping loop recv..."
|
36
|
+
@running = false
|
29
37
|
end
|
30
38
|
|
31
39
|
def net
|
data/lib/diy/offline.rb
CHANGED
@@ -113,7 +113,7 @@ module DIY
|
|
113
113
|
raise EOFError, " end of pcaps "
|
114
114
|
end
|
115
115
|
@position += 1
|
116
|
-
DIY::Logger.info("pcap file changed: #{@pcap_files[@position]}")
|
116
|
+
DIY::Logger.info("pcap file changed: #{@pcap_files[@position]} ( #{@position} of #{@pcap_files.size} )")
|
117
117
|
@off = FFI::PCap::Offline.new(@pcap_files[@position])
|
118
118
|
@num = 0
|
119
119
|
clear_cached_mac
|
data/lib/diy/packet.rb
CHANGED
@@ -12,7 +12,16 @@ module DIY
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def inspect
|
15
|
-
"#{Utils.pp(@content)}
|
15
|
+
"#<#{self.class.name}: #{Utils.pp(@content)}, from #{@detail_msg}>"
|
16
|
+
end
|
17
|
+
|
18
|
+
def pretty_print(lsize = 150)
|
19
|
+
real = Utils.pp(@content, false)
|
20
|
+
dot = nil
|
21
|
+
if inspect.size >= lsize
|
22
|
+
dot = "..."
|
23
|
+
end
|
24
|
+
sprintf "%-#{lsize+2}.#{lsize}s%3s (size= %4d), from %20s", real,dot,@content.size,@detail_msg
|
16
25
|
end
|
17
26
|
end
|
18
27
|
end
|
data/lib/diy/strategy.rb
CHANGED
data/lib/diy/utils.rb
CHANGED
@@ -2,17 +2,21 @@ module DIY
|
|
2
2
|
module Utils
|
3
3
|
class << self
|
4
4
|
# 漂亮输出包的前十个内容
|
5
|
-
def pp(pkt)
|
5
|
+
def pp(pkt, size_print = true)
|
6
6
|
pkt = pkt.content if pkt.kind_of?(DIY::Packet)
|
7
7
|
return nil if pkt.nil?
|
8
8
|
#~ ( pkt[0..10] + "..." ).dump + "(#{pkt.size} sizes)"
|
9
9
|
size = pkt.size
|
10
|
+
size_print_str = ""
|
11
|
+
if size_print
|
12
|
+
size_print_str = "(#{size} sizes)"
|
13
|
+
end
|
10
14
|
begin
|
11
15
|
new_pkt = pkt.dup
|
12
|
-
Mu::Pcap::Ethernet.from_bytes(new_pkt).to_s +
|
16
|
+
Mu::Pcap::Ethernet.from_bytes(new_pkt).to_s + size_print_str
|
13
17
|
rescue Mu::Pcap::ParseError =>e
|
14
|
-
DIY::Logger.warn "parse error from pkt: " + ( pkt[0..10] + "..." ).dump +
|
15
|
-
return ( pkt[0..10] + "..." ).dump +
|
18
|
+
DIY::Logger.warn "parse error from pkt: " + ( pkt[0..10] + "..." ).dump + size_print_str
|
19
|
+
return ( pkt[0..10] + "..." ).dump + size_print_str
|
16
20
|
end
|
17
21
|
end
|
18
22
|
|
data/lib/diy/version.rb
CHANGED
data/lib/diy/worker.rb
CHANGED
@@ -13,6 +13,7 @@ module DIY
|
|
13
13
|
@recv_t = nil
|
14
14
|
@start = false
|
15
15
|
@queue = Queue.new
|
16
|
+
@running = false
|
16
17
|
loop_recv
|
17
18
|
loop_callback
|
18
19
|
end
|
@@ -20,7 +21,7 @@ module DIY
|
|
20
21
|
# 发包
|
21
22
|
def inject(pkts)
|
22
23
|
pkts.each do |pkt|
|
23
|
-
DIY::Logger.info "send pkt: #{pkt.
|
24
|
+
DIY::Logger.info "send pkt: #{pkt.pretty_print}"
|
24
25
|
@live.send_packet(pkt.content)
|
25
26
|
end
|
26
27
|
end
|
@@ -32,21 +33,25 @@ module DIY
|
|
32
33
|
next unless @start
|
33
34
|
@queue.push(pkt.body)
|
34
35
|
end
|
36
|
+
DIY::Logger.debug "worker: stopped loop recv"
|
35
37
|
end
|
36
38
|
end
|
37
39
|
|
38
40
|
def loop_callback
|
41
|
+
@running = true
|
39
42
|
@callback_t = Thread.new do
|
40
43
|
#~ DIY::Logger.info "start thread callbacking pkt..."
|
41
|
-
|
44
|
+
while @running do
|
42
45
|
begin
|
43
46
|
pkt = @queue.pop
|
44
47
|
#~ DIY::Logger.info "callback: #{pkt}"
|
45
48
|
@block.call(pkt) if @block
|
46
49
|
rescue DRb::DRbConnError
|
47
50
|
DIY::Logger.info "closed connection by controller"
|
51
|
+
@queue.clear
|
48
52
|
end
|
49
53
|
end
|
54
|
+
DIY::Logger.debug "stopped loop callback"
|
50
55
|
end
|
51
56
|
end
|
52
57
|
|
@@ -58,12 +63,22 @@ module DIY
|
|
58
63
|
@start = true
|
59
64
|
end
|
60
65
|
|
66
|
+
# 停止收发
|
61
67
|
def terminal
|
62
68
|
DIY::Logger.info("stop recv pkt")
|
63
69
|
@start = false
|
64
70
|
@queue.clear
|
65
71
|
end
|
66
72
|
|
73
|
+
# 停止线程
|
74
|
+
def stop
|
75
|
+
@running = false
|
76
|
+
@queue.push nil
|
77
|
+
@live.break
|
78
|
+
Utils.wait_until { @recv_t && ! @recv_t.alive? }
|
79
|
+
Utils.wait_until { @callback_t && ! @callback_t.alive? }
|
80
|
+
end
|
81
|
+
|
67
82
|
def inspect
|
68
83
|
"<Worker: #{@live.net}>"
|
69
84
|
end
|
data/lib/diy/worker_keeper.rb
CHANGED
@@ -8,8 +8,11 @@ module DIY
|
|
8
8
|
def initialize(worker, uri)
|
9
9
|
@worker = worker
|
10
10
|
@uri = uri
|
11
|
+
@running = false
|
12
|
+
@over = false
|
11
13
|
yield self if block_given?
|
12
14
|
end
|
15
|
+
attr_accessor :running
|
13
16
|
|
14
17
|
def use_timeridconv
|
15
18
|
require 'drb/timeridconv'
|
@@ -20,13 +23,21 @@ module DIY
|
|
20
23
|
Thread.abort_on_exception = true
|
21
24
|
DIY::Logger.info "serving at #{@uri}"
|
22
25
|
DRb.start_service(@uri, @worker)
|
23
|
-
running = true
|
24
|
-
|
25
|
-
|
26
|
+
@running = true
|
27
|
+
@over = false
|
28
|
+
trap("INT") { @running = false }
|
29
|
+
while @running
|
26
30
|
sleep 0.5
|
27
31
|
end
|
28
32
|
DIY::Logger.info "bye..."
|
33
|
+
@worker.stop
|
29
34
|
DRb.stop_service
|
35
|
+
@over = true
|
36
|
+
end
|
37
|
+
|
38
|
+
def stop
|
39
|
+
@running = false
|
40
|
+
Utils.wait_until { @over }
|
30
41
|
end
|
31
42
|
end
|
32
43
|
end
|
data/spec/controller_spec.rb
CHANGED
@@ -0,0 +1,88 @@
|
|
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
|
+
Thread.abort_on_exception = true
|
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
|
+
@c1 = @s1 = nil
|
18
|
+
# client create
|
19
|
+
Thread.abort_on_exception = true
|
20
|
+
@client_t ||= Thread.new do
|
21
|
+
client = DIY::Worker.new(@live)
|
22
|
+
@c1 = DIY::WorkerKeeper.new(client, @curi)
|
23
|
+
@c1.run
|
24
|
+
end
|
25
|
+
|
26
|
+
@server_t ||= Thread.new do
|
27
|
+
server = DIY::Worker.new(@live2)
|
28
|
+
@s1 = DIY::WorkerKeeper.new(server, @suri)
|
29
|
+
@s1.run
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
after(:all) do
|
34
|
+
#~ @c1.stop #if @c
|
35
|
+
#~ @s1.stop #if @s
|
36
|
+
#~ DIY::Utils.wait_until { ! @client_t.alive? && ! @server_t.alive? }
|
37
|
+
end
|
38
|
+
|
39
|
+
it "#run " do
|
40
|
+
sleep 1
|
41
|
+
builder = DIY::Builder.new do
|
42
|
+
pcapfiles "helper/http.pcap"
|
43
|
+
use DIY::SimpleStrategy.new
|
44
|
+
timeout 10
|
45
|
+
end
|
46
|
+
lambda { builder.run }.should_not raise_error
|
47
|
+
end
|
48
|
+
|
49
|
+
it "#run stragety error" do
|
50
|
+
|
51
|
+
|
52
|
+
wrongUserStragety = lambda {
|
53
|
+
raise_me
|
54
|
+
#~ raise "error one me"
|
55
|
+
}
|
56
|
+
|
57
|
+
sleep 1
|
58
|
+
builder = DIY::Builder.new do
|
59
|
+
pcapfiles "helper/http.pcap"
|
60
|
+
use wrongUserStragety
|
61
|
+
timeout 10
|
62
|
+
end
|
63
|
+
lambda { builder.run }.should_not raise_error
|
64
|
+
end
|
65
|
+
|
66
|
+
it "#run before_send error" do
|
67
|
+
sleep 1
|
68
|
+
build2 = DIY::Builder.new do
|
69
|
+
before_send do
|
70
|
+
raise "error on me"
|
71
|
+
end
|
72
|
+
pcapfiles "helper/http.pcap"
|
73
|
+
end
|
74
|
+
lambda { build2.run }.should_not raise_error
|
75
|
+
end
|
76
|
+
|
77
|
+
it "#run big packet " do
|
78
|
+
sleep 1
|
79
|
+
build2 = DIY::Builder.new do
|
80
|
+
before_send do |pkt|
|
81
|
+
new_pkt = "a" * 10000
|
82
|
+
end
|
83
|
+
pcapfiles "helper/http.pcap"
|
84
|
+
end
|
85
|
+
lambda { build2.run }.should_not raise_error
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
Binary file
|
data/spec/packet_spec.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DIY::Packet do
|
4
|
+
let(:normal_content) { File.open('helper/tcp.dat', 'rb') { |io| io.read } }
|
5
|
+
let(:long_content) { File.open('helper/long.dat', 'rb') { |io| io.read } }
|
6
|
+
it "#pretty_print normal_content" do
|
7
|
+
pkt = DIY::Packet.new(normal_content, "xxx")
|
8
|
+
puts pkt.pretty_print
|
9
|
+
end
|
10
|
+
|
11
|
+
it "#pretty_print long_content" do
|
12
|
+
pkt = DIY::Packet.new(long_content, "xxx")
|
13
|
+
puts pkt.pretty_print
|
14
|
+
end
|
15
|
+
end
|
data/spec/utils_spec.rb
CHANGED
@@ -5,6 +5,10 @@ describe DIY::Utils do
|
|
5
5
|
DIY::Utils.pp('a' * 100).should match(/\(100 sizes\)/)
|
6
6
|
end
|
7
7
|
|
8
|
+
it "#pp false" do
|
9
|
+
DIY::Utils.pp('a' * 100, false).should_not match(/\(100 sizes\)/)
|
10
|
+
end
|
11
|
+
|
8
12
|
it "#src_mac" do
|
9
13
|
DIY::Utils.src_mac( 'a' * 100 ).should == "a" * 6
|
10
14
|
end
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: DIY-pcap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 7
|
5
|
+
prerelease:
|
5
6
|
segments:
|
6
7
|
- 0
|
7
8
|
- 2
|
8
|
-
-
|
9
|
-
version: 0.2.
|
9
|
+
- 8
|
10
|
+
version: 0.2.8
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- yafei Lee
|
@@ -14,8 +15,7 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date: 2012-10-
|
18
|
-
default_executable:
|
18
|
+
date: 2012-10-11 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: ffi-pcap
|
@@ -25,6 +25,7 @@ dependencies:
|
|
25
25
|
requirements:
|
26
26
|
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
+
hash: 23
|
28
29
|
segments:
|
29
30
|
- 0
|
30
31
|
- 2
|
@@ -129,6 +130,7 @@ files:
|
|
129
130
|
- spec/helper/app.pcap
|
130
131
|
- spec/helper/gre.pcap
|
131
132
|
- spec/helper/http.pcap
|
133
|
+
- spec/helper/long.dat
|
132
134
|
- spec/helper/pkt1
|
133
135
|
- spec/helper/pkt2
|
134
136
|
- spec/helper/pkt3
|
@@ -140,11 +142,10 @@ files:
|
|
140
142
|
- spec/logger_spec.rb
|
141
143
|
- spec/mu_parser_spec.rb
|
142
144
|
- spec/offline_spec.rb
|
145
|
+
- spec/packet_spec.rb
|
143
146
|
- spec/spec_helper.rb
|
144
|
-
- spec/usererror_spec.rb
|
145
147
|
- spec/utils_spec.rb
|
146
148
|
- spec/worker_spec.rb
|
147
|
-
has_rdoc: true
|
148
149
|
homepage: ""
|
149
150
|
licenses: []
|
150
151
|
|
@@ -158,6 +159,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
158
159
|
requirements:
|
159
160
|
- - ">="
|
160
161
|
- !ruby/object:Gem::Version
|
162
|
+
hash: 3
|
161
163
|
segments:
|
162
164
|
- 0
|
163
165
|
version: "0"
|
@@ -166,13 +168,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
166
168
|
requirements:
|
167
169
|
- - ">="
|
168
170
|
- !ruby/object:Gem::Version
|
171
|
+
hash: 3
|
169
172
|
segments:
|
170
173
|
- 0
|
171
174
|
version: "0"
|
172
175
|
requirements: []
|
173
176
|
|
174
177
|
rubyforge_project:
|
175
|
-
rubygems_version: 1.
|
178
|
+
rubygems_version: 1.8.24
|
176
179
|
signing_key:
|
177
180
|
specification_version: 3
|
178
181
|
summary: DIY pcap send and recv
|
data/spec/usererror_spec.rb
DELETED
@@ -1,85 +0,0 @@
|
|
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
|