fluent-plugin-netflow-enchanced 1.0.0.rc1

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.
@@ -0,0 +1,223 @@
1
+ require 'helper'
2
+
3
+ class Netflow9ParserTest < Test::Unit::TestCase
4
+ def setup
5
+ Fluent::Test.setup
6
+ end
7
+
8
+ def create_parser(conf={})
9
+ parser = Fluent::Plugin::NetflowParser.new
10
+ parser.configure(Fluent::Config::Element.new('ROOT', '', conf, []))
11
+ parser
12
+ end
13
+
14
+ def raw_template
15
+ @raw_template ||= File.read(File.expand_path('../dump/netflow.v9.template.dump', __FILE__))
16
+ end
17
+
18
+ def raw_flowStartMilliseconds_template
19
+ @raw_flowStartMilliseconds_template ||= File.read(File.expand_path('../dump/netflow.v9.template.flowStartMilliseconds.dump', __FILE__))
20
+ end
21
+
22
+ def raw_mpls_template
23
+ @raw_mpls_template ||= File.read(File.expand_path('../dump/netflow.v9.mpls-template.dump', __FILE__))
24
+ end
25
+
26
+ def raw_data
27
+ @raw_data ||= File.read(File.expand_path('../dump/netflow.v9.dump', __FILE__))
28
+ end
29
+
30
+ def raw_flowStartMilliseconds_data
31
+ @raw_flowStartMilliseconds_data ||= File.read(File.expand_path('../dump/netflow.v9.flowStartMilliseconds.dump', __FILE__))
32
+ end
33
+
34
+ def raw_mpls_data
35
+ @raw_mpls_data ||= File.read(File.expand_path('../dump/netflow.v9.mpls-data.dump', __FILE__))
36
+ end
37
+
38
+ def raw_sampler_template
39
+ @raw_sampler_template ||= File.read(File.expand_path('../dump/netflow.v9.sampler_template.dump', __FILE__))
40
+ end
41
+
42
+ def raw_sampler_data
43
+ @raw_sampler_data ||= File.read(File.expand_path('../dump/netflow.v9.sampler.dump', __FILE__))
44
+ end
45
+
46
+ def raw_2byte_as_template
47
+ @raw_2byte_as_template ||= File.read(File.expand_path('../dump/netflow.v9.template.as2.dump', __FILE__))
48
+ end
49
+
50
+ DEFAULT_HOST = '127.0.0.1'
51
+
52
+ test 'parse netflow v9 binary data before loading corresponding template' do
53
+ parser = create_parser
54
+
55
+ assert_equal 92, raw_data.size
56
+ parser.call(raw_data, DEFAULT_HOST) do |time, record|
57
+ assert false, 'nothing emitted'
58
+ end
59
+ end
60
+
61
+ test 'parse netflow v9 binary data' do
62
+ parser = create_parser
63
+
64
+ parsed = []
65
+ parser.call raw_template, DEFAULT_HOST
66
+ parser.call(raw_data, DEFAULT_HOST) do |time, record|
67
+ parsed << [time, record]
68
+ end
69
+
70
+ assert_equal 1, parsed.size
71
+ assert_equal Time.parse('2016-02-12T04:02:25Z').to_i, parsed.first[0]
72
+ expected_record = {
73
+ # header
74
+ 'version' => 9,
75
+ 'flow_seq_num' => 4645895,
76
+ 'flowset_id' => 260,
77
+
78
+ # flowset
79
+ 'in_pkts' => 1,
80
+ 'in_bytes' => 60,
81
+ 'ipv4_src_addr' => '192.168.0.1',
82
+ 'ipv4_dst_addr' => '192.168.0.2',
83
+ 'input_snmp' => 54,
84
+ 'output_snmp' => 29,
85
+ 'last_switched' => '2016-02-12T04:02:09.053Z',
86
+ 'first_switched' => '2016-02-12T04:02:09.053Z',
87
+ 'l4_src_port' => 80,
88
+ 'l4_dst_port' => 32822,
89
+ 'src_as' => 0,
90
+ 'dst_as' => 65000,
91
+ 'bgp_ipv4_next_hop' => '192.168.0.3',
92
+ 'src_mask' => 24,
93
+ 'dst_mask' => 24,
94
+ 'protocol' => 6,
95
+ 'tcp_flags' => 0x12,
96
+ 'src_tos' => 0x0,
97
+ 'direction' => 0,
98
+ 'forwarding_status' => 0b01000000,
99
+ 'flow_sampler_id' => 1,
100
+ 'ingress_vrf_id' => 1610612736,
101
+ 'egress_vrf_id' => 1610612736
102
+ }
103
+ assert_equal expected_record, parsed.first[1]
104
+ end
105
+
106
+ test 'parse netflow v9 binary data (flowStartMilliseconds)' do
107
+ parser = create_parser
108
+
109
+ parsed = []
110
+ parser.call raw_flowStartMilliseconds_template, DEFAULT_HOST
111
+ parser.call(raw_flowStartMilliseconds_data, DEFAULT_HOST) do |time, record|
112
+ parsed << [time, record]
113
+ end
114
+
115
+ assert_equal 1, parsed.size
116
+ assert_equal Time.parse('2016-02-12T04:02:25Z').to_i, parsed.first[0]
117
+ expected_record = {
118
+ # header
119
+ 'version' => 9,
120
+ 'flow_seq_num' => 4645895,
121
+ 'flowset_id' => 261,
122
+
123
+ # flowset
124
+ 'in_pkts' => 1,
125
+ 'in_bytes' => 60,
126
+ 'ipv4_src_addr' => '192.168.0.1',
127
+ 'ipv4_dst_addr' => '192.168.0.2',
128
+ 'input_snmp' => 54,
129
+ 'output_snmp' => 29,
130
+ 'flowEndMilliseconds' => '2016-02-12T04:02:09.053Z',
131
+ 'flowStartMilliseconds' => '2016-02-12T04:02:09.053Z',
132
+ 'l4_src_port' => 80,
133
+ 'l4_dst_port' => 32822,
134
+ 'src_as' => 0,
135
+ 'dst_as' => 65000,
136
+ 'bgp_ipv4_next_hop' => '192.168.0.3',
137
+ 'src_mask' => 24,
138
+ 'dst_mask' => 24,
139
+ 'protocol' => 6,
140
+ 'tcp_flags' => 0x12,
141
+ 'src_tos' => 0x0,
142
+ 'direction' => 0,
143
+ 'forwarding_status' => 0b01000000,
144
+ 'flow_sampler_id' => 1,
145
+ 'ingress_vrf_id' => 1610612736,
146
+ 'egress_vrf_id' => 1610612736
147
+ }
148
+ assert_equal expected_record, parsed.first[1]
149
+ end
150
+
151
+ test 'parse netflow v9 binary data after sampler data is cached' do
152
+ parser = create_parser
153
+
154
+ parsed = []
155
+ [raw_sampler_template, raw_sampler_data, raw_template].each {|raw| parser.call(raw, DEFAULT_HOST){} }
156
+ parser.call(raw_data, DEFAULT_HOST) do |time, record|
157
+ parsed << [time, record]
158
+ end
159
+
160
+ assert_equal 2, parsed.first[1]['sampling_algorithm']
161
+ assert_equal 5000, parsed.first[1]['sampling_interval']
162
+ end
163
+
164
+ test 'parse netflow v9 binary data with host-based template cache' do
165
+ parser = create_parser
166
+ another_host = DEFAULT_HOST.next
167
+
168
+ parsed = []
169
+ parser.call raw_template, DEFAULT_HOST
170
+ parser.call(raw_data, another_host) do |time, record|
171
+ assert false, 'nothing emitted'
172
+ end
173
+ parser.call raw_template, another_host
174
+ parser.call(raw_data, another_host) do |time, record|
175
+ parsed << [time, record]
176
+ end
177
+
178
+ assert_equal 1, parsed.size
179
+ end
180
+
181
+ test 'parse netflow v9 binary data with host-based sampler cache' do
182
+ parser = create_parser
183
+ another_host = DEFAULT_HOST.next
184
+
185
+ parsed = []
186
+ [raw_sampler_template, raw_sampler_data, raw_template].each {|raw| parser.call(raw, DEFAULT_HOST){} }
187
+ parser.call(raw_template, another_host){}
188
+ parser.call(raw_data, another_host) do |time, record|
189
+ parsed << [time, record]
190
+ end
191
+
192
+ assert_equal nil, parsed.first[1]['sampling_algorithm']
193
+ assert_equal nil, parsed.first[1]['sampling_interval']
194
+ end
195
+
196
+ test 'parse netflow v9 binary data with templates whose AS field length varies' do
197
+ parser = create_parser
198
+
199
+ parsed = []
200
+ [raw_2byte_as_template, raw_template].each {|raw| parser.call(raw, DEFAULT_HOST){} }
201
+ parser.call(raw_data, DEFAULT_HOST) do |time, record|
202
+ parsed << [time, record]
203
+ end
204
+
205
+ assert_equal 1, parsed.size
206
+ assert_equal 0, parsed.first[1]['src_as']
207
+ assert_equal 65000, parsed.first[1]['dst_as']
208
+ end
209
+
210
+ test 'parse netflow v9 binary data contains mpls information' do
211
+ parser = create_parser
212
+
213
+ parsed = []
214
+ [raw_sampler_template, raw_sampler_data, raw_mpls_template].each {|raw| parser.call(raw, DEFAULT_HOST){} }
215
+ parser.call(raw_mpls_data, DEFAULT_HOST) do |time, record|
216
+ parsed << [time, record]
217
+ end
218
+
219
+ assert_equal 24002, parsed.first[1]['mpls_label_1']
220
+ assert_equal '192.168.32.100', parsed.first[1]['ipv4_src_addr']
221
+ assert_equal '172.16.32.2', parsed.first[1]['ipv4_dst_addr']
222
+ end
223
+ end
metadata ADDED
@@ -0,0 +1,132 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-netflow-enchanced
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.rc1
5
+ platform: ruby
6
+ authors:
7
+ - Masahiro Nakagawa
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-04-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: fluentd
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.14.10
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '2'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 0.14.10
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '2'
33
+ - !ruby/object:Gem::Dependency
34
+ name: bindata
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.1'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '2.1'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 0.9.2
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 0.9.2
61
+ - !ruby/object:Gem::Dependency
62
+ name: test-unit
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '3.0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '3.0'
75
+ description: Netflow plugin for Fluentd
76
+ email: repeatedly@gmail.com
77
+ executables: []
78
+ extensions: []
79
+ extra_rdoc_files: []
80
+ files:
81
+ - ".gitignore"
82
+ - ".travis.yml"
83
+ - Gemfile
84
+ - README.md
85
+ - Rakefile
86
+ - VERSION
87
+ - example/fluentd.conf
88
+ - fluent-plugin-netflow.gemspec
89
+ - lib/fluent/plugin/in_netflow.rb
90
+ - lib/fluent/plugin/netflow_fields.yaml
91
+ - lib/fluent/plugin/netflow_records.rb
92
+ - lib/fluent/plugin/parser_netflow.rb
93
+ - lib/fluent/plugin/vash.rb
94
+ - test/dump/netflow.v5.dump
95
+ - test/dump/netflow.v9.dump
96
+ - test/dump/netflow.v9.flowStartMilliseconds.dump
97
+ - test/dump/netflow.v9.mpls-data.dump
98
+ - test/dump/netflow.v9.mpls-template.dump
99
+ - test/dump/netflow.v9.sampler.dump
100
+ - test/dump/netflow.v9.sampler_template.dump
101
+ - test/dump/netflow.v9.template.as2.dump
102
+ - test/dump/netflow.v9.template.dump
103
+ - test/dump/netflow.v9.template.flowStartMilliseconds.dump
104
+ - test/helper.rb
105
+ - test/test_in_netflow.rb
106
+ - test/test_parser_netflow.rb
107
+ - test/test_parser_netflow9.rb
108
+ homepage: https://github.com/repeatedly/fluent-plugin-netflow
109
+ licenses:
110
+ - Apache License (2.0)
111
+ metadata: {}
112
+ post_install_message:
113
+ rdoc_options: []
114
+ require_paths:
115
+ - lib
116
+ required_ruby_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ required_rubygems_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">"
124
+ - !ruby/object:Gem::Version
125
+ version: 1.3.1
126
+ requirements: []
127
+ rubyforge_project:
128
+ rubygems_version: 2.6.8
129
+ signing_key:
130
+ specification_version: 4
131
+ summary: Netflow plugin for Fluentd
132
+ test_files: []