DIY-pcap 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/diy/controller.rb +1 -1
- data/lib/diy/offline.rb +2 -0
- data/lib/diy/parser/mu/pcap/ethernet.rb +15 -3
- data/lib/diy/strategy.rb +7 -5
- data/lib/diy/strategy_builder.rb +4 -0
- data/lib/diy/version.rb +1 -1
- data/spec/controller_spec.rb +21 -0
- data/spec/helper/vlan.dat +0 -0
- data/spec/mu_parser_spec.rb +8 -0
- data/spec/offline_spec.rb +13 -0
- metadata +10 -7
data/lib/diy/controller.rb
CHANGED
@@ -56,7 +56,7 @@ module DIY
|
|
56
56
|
@round_count += 1
|
57
57
|
DIY::Logger.info "round #{@round_count}: (c:#{client.__drburi} / s:#{server.__drburi}) #{pkts[0].pretty_print}:(queue= #{pkts.size})"
|
58
58
|
if pkts.size >= 10
|
59
|
-
DIY::Logger.
|
59
|
+
DIY::Logger.info "queue size too big: #{pkts.size}, maybe something error"
|
60
60
|
end
|
61
61
|
server.ready do |recv_pkt|
|
62
62
|
next if @error_flag # error accur waiting other thread do with it
|
data/lib/diy/offline.rb
CHANGED
@@ -112,6 +112,8 @@ module DIY
|
|
112
112
|
if @position >= @pcap_files.size - 1
|
113
113
|
raise EOFError, " end of pcaps "
|
114
114
|
end
|
115
|
+
# must close before's handle
|
116
|
+
@off.close
|
115
117
|
@position += 1
|
116
118
|
DIY::Logger.info("pcap file changed: #{@pcap_files[@position]} ( #{@position} of #{@pcap_files.size} )")
|
117
119
|
@off = FFI::PCap::Offline.new(@pcap_files[@position])
|
@@ -21,7 +21,13 @@ class Ethernet < Packet
|
|
21
21
|
super()
|
22
22
|
@src = src
|
23
23
|
@dst = dst
|
24
|
-
@type = type
|
24
|
+
@type = type
|
25
|
+
@vlan = false
|
26
|
+
end
|
27
|
+
attr_accessor :vlan
|
28
|
+
|
29
|
+
def vlan?
|
30
|
+
vlan
|
25
31
|
end
|
26
32
|
|
27
33
|
def flow_id
|
@@ -44,13 +50,19 @@ class Ethernet < Packet
|
|
44
50
|
dst = MAC_TEMPLATE % dst
|
45
51
|
src = bytes.slice!(0,6).unpack FMT_MAC
|
46
52
|
src = MAC_TEMPLATE % src
|
47
|
-
type = bytes.slice!(0,2).unpack(FMT_n)[0]
|
53
|
+
type = bytes.slice!(0,2).unpack(FMT_n)[0]
|
54
|
+
if type == ETHERTYPE_802_1Q
|
55
|
+
@vlan = true
|
56
|
+
else
|
57
|
+
@vlan = false
|
58
|
+
end
|
48
59
|
while (type == ETHERTYPE_802_1Q)
|
49
60
|
# Skip 4 bytes for 802.1q vlan tag field
|
50
61
|
bytes.slice!(0,2)
|
51
62
|
type = bytes.slice!(0,2).unpack(FMT_n)[0]
|
52
63
|
end
|
53
|
-
ethernet = Ethernet.new src, dst, type
|
64
|
+
ethernet = Ethernet.new src, dst, type
|
65
|
+
ethernet.vlan = @vlan
|
54
66
|
ethernet.payload = bytes
|
55
67
|
ethernet.payload_raw = bytes
|
56
68
|
begin
|
data/lib/diy/strategy.rb
CHANGED
@@ -2,10 +2,11 @@ module DIY
|
|
2
2
|
# 这个策略是一个最基本的:
|
3
3
|
# 具体返回值含义见 @BasicStrategy
|
4
4
|
class Strategy
|
5
|
-
OK =
|
6
|
-
OK_NO_POP = SKIP =
|
7
|
-
FAIL =
|
8
|
-
NONE =
|
5
|
+
OK = "S_OK"
|
6
|
+
OK_NO_POP = SKIP = "S_OK_NO_POP"
|
7
|
+
FAIL = "S_FAIL"
|
8
|
+
NONE = "S_NONE"
|
9
|
+
NONE_HOPE_SKIP = NONE_HOPE_POP = "S_NONE_HOPE_POP"
|
9
10
|
end
|
10
11
|
|
11
12
|
class BasicStrategy < Strategy
|
@@ -21,6 +22,7 @@ module DIY
|
|
21
22
|
# SKIP: 同上, 可用于跳过以后所有策略队列使用.
|
22
23
|
# FAIL: 肯定失败时使用
|
23
24
|
# NONE: 不匹配, 让框架进行下一个报文匹配
|
25
|
+
# NONE_HOPE_POP: 跳过期望报文, 但继续让框架进行下一个报文匹配
|
24
26
|
def call(hope_pkt, recv_pkt, queue)
|
25
27
|
raise "write code here"
|
26
28
|
end
|
@@ -41,7 +43,7 @@ module DIY
|
|
41
43
|
class SkipSameMacStrategy < BasicStrategy
|
42
44
|
def call(hope_pkt, recv_pkt, queue)
|
43
45
|
if hope_pkt[0..5] == hope_pkt[6..11]
|
44
|
-
return
|
46
|
+
return NONE_HOPE_POP
|
45
47
|
else
|
46
48
|
return NONE
|
47
49
|
end
|
data/lib/diy/strategy_builder.rb
CHANGED
data/lib/diy/version.rb
CHANGED
data/spec/controller_spec.rb
CHANGED
@@ -45,6 +45,27 @@ describe "Controller" do
|
|
45
45
|
end
|
46
46
|
lambda { builder.run }.should_not raise_error
|
47
47
|
end
|
48
|
+
|
49
|
+
it "#run none_hope_skip" do
|
50
|
+
running = false
|
51
|
+
hope_skip = lambda { |h, r, q|
|
52
|
+
if running == false
|
53
|
+
running == true
|
54
|
+
return DIY::Strategy::NONE_HOPE_SKIP
|
55
|
+
else
|
56
|
+
return DIY::Strategy::NONE
|
57
|
+
end
|
58
|
+
}
|
59
|
+
|
60
|
+
sleep 1
|
61
|
+
builder = DIY::Builder.new do
|
62
|
+
pcapfiles "helper/http.pcap"
|
63
|
+
use hope_skip
|
64
|
+
use DIY::SimpleStrategy.new
|
65
|
+
timeout 10
|
66
|
+
end
|
67
|
+
lambda { builder.run }.should_not raise_error
|
68
|
+
end
|
48
69
|
|
49
70
|
it "#run stragety error" do
|
50
71
|
|
Binary file
|
data/spec/mu_parser_spec.rb
CHANGED
@@ -2,11 +2,19 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Mu do
|
4
4
|
let(:pkt) { File.open("helper/tcp.dat", "rb") { |f| f.read } }
|
5
|
+
let(:vlan_pkt) { File.open("helper/vlan.dat", "rb") { |f| f.read } }
|
5
6
|
it "#ethernet parse" do
|
6
7
|
eth = Mu::Pcap::Ethernet.from_bytes(pkt)
|
8
|
+
eth.vlan.should == false
|
7
9
|
eth.should be_ip
|
8
10
|
ip = eth.payload
|
9
11
|
tcp = ip.payload
|
10
12
|
tcp.should be_kind_of(Mu::Pcap::TCP)
|
11
13
|
end
|
14
|
+
|
15
|
+
it "#ethernet vlan" do
|
16
|
+
eth = Mu::Pcap::Ethernet.from_bytes(vlan_pkt)
|
17
|
+
eth.vlan.should == true
|
18
|
+
eth.should be_vlan
|
19
|
+
end
|
12
20
|
end
|
data/spec/offline_spec.rb
CHANGED
@@ -41,4 +41,17 @@ describe DIY::Offline do
|
|
41
41
|
lambda { loop do offline.nexts end }.should raise_error(DIY::EOFError)
|
42
42
|
end
|
43
43
|
|
44
|
+
it "should open many files" do
|
45
|
+
files = []
|
46
|
+
600.times do
|
47
|
+
files << "helper/http.pcap"
|
48
|
+
end
|
49
|
+
puts "files size = #{files.size}"
|
50
|
+
offline = DIY::Offline.new(files)
|
51
|
+
lambda {
|
52
|
+
loop do
|
53
|
+
offline.next_pcap
|
54
|
+
end }.should raise_error(DIY::EOFError)
|
55
|
+
end
|
56
|
+
|
44
57
|
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: 17
|
5
|
+
prerelease:
|
5
6
|
segments:
|
6
7
|
- 0
|
7
8
|
- 3
|
8
|
-
-
|
9
|
-
version: 0.3.
|
9
|
+
- 1
|
10
|
+
version: 0.3.1
|
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-12 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
|
@@ -137,6 +138,7 @@ files:
|
|
137
138
|
- spec/helper/pkt5
|
138
139
|
- spec/helper/ssh.pcap
|
139
140
|
- spec/helper/tcp.dat
|
141
|
+
- spec/helper/vlan.dat
|
140
142
|
- spec/live_spec.rb
|
141
143
|
- spec/logger_spec.rb
|
142
144
|
- spec/mu_parser_spec.rb
|
@@ -145,7 +147,6 @@ files:
|
|
145
147
|
- spec/spec_helper.rb
|
146
148
|
- spec/utils_spec.rb
|
147
149
|
- spec/worker_spec.rb
|
148
|
-
has_rdoc: true
|
149
150
|
homepage: ""
|
150
151
|
licenses: []
|
151
152
|
|
@@ -159,6 +160,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
159
160
|
requirements:
|
160
161
|
- - ">="
|
161
162
|
- !ruby/object:Gem::Version
|
163
|
+
hash: 3
|
162
164
|
segments:
|
163
165
|
- 0
|
164
166
|
version: "0"
|
@@ -167,13 +169,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
167
169
|
requirements:
|
168
170
|
- - ">="
|
169
171
|
- !ruby/object:Gem::Version
|
172
|
+
hash: 3
|
170
173
|
segments:
|
171
174
|
- 0
|
172
175
|
version: "0"
|
173
176
|
requirements: []
|
174
177
|
|
175
178
|
rubyforge_project:
|
176
|
-
rubygems_version: 1.
|
179
|
+
rubygems_version: 1.8.24
|
177
180
|
signing_key:
|
178
181
|
specification_version: 3
|
179
182
|
summary: DIY pcap send and recv
|