fluent-plugin-filter-list 0.5.0 → 0.7.2
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.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +8 -0
- data/.rubocop.yml +15 -9
- data/.travis.yml +5 -6
- data/Gemfile +1 -1
- data/README.md +21 -4
- data/fluent-plugin-out_filter_list.gemspec +5 -4
- data/lib/base.rb +8 -0
- data/lib/fluent/plugin/filter_filter_list.rb +8 -3
- data/lib/fluent/plugin/out_filter_list.rb +9 -10
- data/lib/fluent/plugin/out_filter_list/version.rb +1 -1
- data/lib/matcher.rb +17 -4
- metadata +17 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d213a158b64257afde99c26284bf0215c1a5d208362f0f00012580852654244e
|
4
|
+
data.tar.gz: 37c5a0219f4bab0de18b6aac6c75d6d90f63bd60f5eddb5399bfb0522c563706
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 776d9222ea8997eda4506348282ed67415296da63c4dcd16569f2a7db35863a5844b3e3869cff5d9dcd9a077d4738a9733e4cf3b3436bc7ec08a26b8d4d84503
|
7
|
+
data.tar.gz: b73678d3bd2ba2a415499256cf6b8b7ba1c8c0a88800745d6668aaea1ba049d59343ca2665063cb4a11c1d099ce9ce825fffc57465dde845ee62c34b39f3a49a
|
data/.rubocop.yml
CHANGED
@@ -1,6 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.5
|
3
|
+
NewCops: enable
|
4
|
+
|
5
|
+
|
6
|
+
Naming/MethodParameterName:
|
7
|
+
Enabled: false
|
8
|
+
Layout/LineLength:
|
4
9
|
Max: 160
|
5
10
|
Style/FormatString:
|
6
11
|
EnforcedStyle: sprintf
|
@@ -35,16 +40,17 @@ Metrics/PerceivedComplexity:
|
|
35
40
|
Style/GlobalVars:
|
36
41
|
Exclude:
|
37
42
|
- 'test/test_helper.rb'
|
38
|
-
|
43
|
+
Lint/MissingSuper:
|
44
|
+
Exclude:
|
45
|
+
- 'test/test_helper.rb'
|
46
|
+
Style/MissingRespondToMissing:
|
39
47
|
Exclude:
|
40
48
|
- 'test/test_helper.rb'
|
41
49
|
Style/TernaryParentheses:
|
42
50
|
Enabled: false
|
43
51
|
Style/BlockDelimiters:
|
44
52
|
AutoCorrect: false
|
45
|
-
|
46
|
-
AutoCorrect: false
|
47
|
-
Style/BracesAroundHashParameters:
|
48
|
-
Enabled: false
|
49
|
-
Layout/IndentHash:
|
53
|
+
Layout/FirstHashElementIndentation:
|
50
54
|
EnforcedStyle: consistent
|
55
|
+
Style/RedundantSelfAssignment:
|
56
|
+
Enabled: false
|
data/.travis.yml
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
|
-
- 2.
|
4
|
-
- 2.
|
5
|
-
- 2.
|
6
|
-
- 2.5.1
|
3
|
+
- 2.5
|
4
|
+
- 2.6
|
5
|
+
- 2.7
|
7
6
|
before_install:
|
8
|
-
- gem update --remote bundler
|
9
7
|
- gem update --system
|
10
|
-
- gem
|
8
|
+
- gem update --remote bundler
|
11
9
|
script:
|
10
|
+
- bundle exec rubocop -d
|
12
11
|
- bundle exec rake
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -29,13 +29,16 @@ This repository contains two plugins: _Filter_ and _Output_, and expects two mai
|
|
29
29
|
Use the `filter_list` filter. Configure fluentd as follows.
|
30
30
|
|
31
31
|
#### ACMatcher
|
32
|
+
|
33
|
+
_ACMatcher_ is a matcher using [Aho–Corasick algorithm](https://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_algorithm) to enable faster multiple-pattern matching.
|
34
|
+
|
32
35
|
```
|
33
36
|
<filter pattern>
|
34
37
|
@type filter_list
|
35
38
|
|
36
39
|
filter AC
|
37
40
|
key_to_filter x
|
38
|
-
|
41
|
+
pattern_file_paths ["blacklist_1.txt", "blacklist_2.txt"]
|
39
42
|
filter_empty true
|
40
43
|
</filter>
|
41
44
|
```
|
@@ -66,7 +69,7 @@ While the following message is passed through as the target field specified in t
|
|
66
69
|
}
|
67
70
|
```
|
68
71
|
|
69
|
-
Additionally, the following message is also omitted since `filter_empty` is `true`. The value is determined to be empty when the
|
72
|
+
Additionally, the following message is also omitted since `filter_empty` is `true`. The value is determined to be empty when the trimmed value is empty.
|
70
73
|
|
71
74
|
```json
|
72
75
|
{
|
@@ -75,6 +78,19 @@ Additionally, the following message is also omitted since `filter_empty` is `tru
|
|
75
78
|
}
|
76
79
|
```
|
77
80
|
|
81
|
+
All these examples are _blacklisting_. That is, a text matched to a pattern will be determined to be filtered. The plugin provides the other type of filtering: _whitelisting_. With the type you can filter records that don't match any pattern. You can enable _whitelisting_ by specifying the `action` (the default value is _blacklist_) explicitly as follows.
|
82
|
+
|
83
|
+
```
|
84
|
+
<filter>
|
85
|
+
@type filter_list
|
86
|
+
|
87
|
+
filter AC
|
88
|
+
key_to_filter foo
|
89
|
+
pattern_file_paths blacklist.txt
|
90
|
+
action whitelist
|
91
|
+
</filter>
|
92
|
+
```
|
93
|
+
|
78
94
|
#### IPMatcher
|
79
95
|
```
|
80
96
|
<filter pattern>
|
@@ -82,7 +98,7 @@ Additionally, the following message is also omitted since `filter_empty` is `tru
|
|
82
98
|
|
83
99
|
filter IP
|
84
100
|
key_to_filter ip
|
85
|
-
|
101
|
+
pattern_file_paths blacklist.txt
|
86
102
|
</filter>
|
87
103
|
```
|
88
104
|
|
@@ -130,8 +146,9 @@ The other use case is to filter messages likewise, but process the filtered mess
|
|
130
146
|
@type filter_list
|
131
147
|
|
132
148
|
key_to_filter field_name_you_want_to_filter
|
133
|
-
|
149
|
+
pattern_file_paths ["file_including_patterns_separated_by_new_line"]
|
134
150
|
filter_empty true
|
151
|
+
action blacklist
|
135
152
|
|
136
153
|
<retag>
|
137
154
|
add_prefix x # retag non-filtered messages whose tag will be "x.your_tag"
|
@@ -8,6 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Fluent::Plugin::FilterList::VERSION
|
9
9
|
spec.authors = ['Shun Yanaura']
|
10
10
|
spec.email = ['metroplexity@gmail.com']
|
11
|
+
spec.required_ruby_version = '>= 2.5.0'
|
11
12
|
|
12
13
|
spec.summary = 'A fluentd output plugin to filter keywords from messages'
|
13
14
|
spec.description = 'A fluentd output plugin to filter keywords from messages'
|
@@ -21,9 +22,9 @@ Gem::Specification.new do |spec|
|
|
21
22
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
22
23
|
spec.require_paths = ['lib']
|
23
24
|
|
24
|
-
spec.add_development_dependency 'bundler', '~> 1
|
25
|
-
spec.add_development_dependency 'minitest', '~> 5.
|
26
|
-
spec.add_development_dependency 'rake', '~>
|
27
|
-
spec.add_development_dependency 'test-unit', '~> 3.
|
25
|
+
spec.add_development_dependency 'bundler', '~> 2.1'
|
26
|
+
spec.add_development_dependency 'minitest', '~> 5.13'
|
27
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
28
|
+
spec.add_development_dependency 'test-unit', '~> 3.3'
|
28
29
|
spec.add_runtime_dependency 'fluentd', '>= 0.14.0', '< 2.0.0'
|
29
30
|
end
|
data/lib/base.rb
ADDED
@@ -2,29 +2,34 @@ require 'fluent/plugin/out_filter_list/version'
|
|
2
2
|
require 'matcher'
|
3
3
|
require 'fluent/plugin/filter'
|
4
4
|
require 'ip'
|
5
|
+
require 'base'
|
5
6
|
|
6
7
|
module Fluent
|
7
8
|
module Plugin
|
8
9
|
class FilterListFilter < Filter
|
9
10
|
include Matchers
|
10
11
|
include IP
|
12
|
+
include BaseFilter
|
11
13
|
|
12
14
|
Plugin.register_filter('filter_list', self)
|
13
15
|
|
14
16
|
config_param :filter, :string, default: 'AC'
|
15
17
|
config_param :key_to_filter, :string, default: nil
|
16
|
-
config_param :
|
18
|
+
config_param :pattern_file_paths, :array, default: [], value_type: :string
|
17
19
|
config_param :filter_empty, :bool, default: false
|
20
|
+
config_param :action, :enum, list: %i[blacklist whitelist], default: :blacklist
|
18
21
|
|
19
22
|
def configure(conf)
|
20
23
|
super
|
21
|
-
patterns = @
|
24
|
+
patterns = @pattern_file_paths.flat_map { |p| File.readlines(p).map(&:chomp).reject(&:empty?) }
|
22
25
|
@matcher = (@filter == 'IP') ? IPMatcher.new(patterns) : ACMatcher.new(patterns)
|
23
26
|
end
|
24
27
|
|
25
28
|
def filter(_tag, _time, record)
|
26
29
|
target = record[@key_to_filter]
|
27
|
-
|
30
|
+
|
31
|
+
return nil if should_filter?(target)
|
32
|
+
|
28
33
|
record
|
29
34
|
end
|
30
35
|
end
|
@@ -2,12 +2,14 @@ require 'fluent/plugin/output'
|
|
2
2
|
require 'fluent/plugin/out_filter_list/version'
|
3
3
|
require 'matcher'
|
4
4
|
require 'ip'
|
5
|
+
require 'base'
|
5
6
|
|
6
7
|
module Fluent
|
7
8
|
module Plugin
|
8
9
|
class FilterListOutput < Output
|
9
10
|
include Matchers
|
10
11
|
include IP
|
12
|
+
include BaseFilter
|
11
13
|
|
12
14
|
Plugin.register_output('filter_list', self)
|
13
15
|
|
@@ -15,8 +17,9 @@ module Fluent
|
|
15
17
|
|
16
18
|
config_param :filter, :string, default: 'AC'
|
17
19
|
config_param :key_to_filter, :string, default: nil
|
18
|
-
config_param :
|
20
|
+
config_param :pattern_file_paths, :array, default: [], value_type: :string
|
19
21
|
config_param :filter_empty, :bool, default: false
|
22
|
+
config_param :action, :enum, list: %i[blacklist whitelist], default: :blacklist
|
20
23
|
|
21
24
|
config_section :retag, required: true, multi: false do
|
22
25
|
config_param :tag, :string, default: nil
|
@@ -28,10 +31,6 @@ module Fluent
|
|
28
31
|
config_param :add_prefix, :string, default: nil
|
29
32
|
end
|
30
33
|
|
31
|
-
def initialize
|
32
|
-
super
|
33
|
-
end
|
34
|
-
|
35
34
|
def validate(retag)
|
36
35
|
return unless retag
|
37
36
|
raise Fluent::ConfigError, "missing tag and add_prefix" unless retag.tag || retag.add_prefix
|
@@ -39,15 +38,15 @@ module Fluent
|
|
39
38
|
end
|
40
39
|
|
41
40
|
def configure_prefixes
|
42
|
-
@prefix_for_filtered_tag = @retag_for_filtered.add_prefix
|
43
|
-
@prefix_for_filtered_tag = @retag_for_filtered
|
44
|
-
@prefix = @retag
|
41
|
+
@prefix_for_filtered_tag = "#{@retag_for_filtered.add_prefix}." if @retag_for_filtered&.add_prefix
|
42
|
+
@prefix_for_filtered_tag = @retag_for_filtered&.add_prefix ? "#{@retag_for_filtered.add_prefix}." : ''
|
43
|
+
@prefix = @retag&.add_prefix ? "#{@retag.add_prefix}." : ''
|
45
44
|
end
|
46
45
|
|
47
46
|
def configure(conf)
|
48
47
|
super
|
49
48
|
[@retag, @retag_for_filtered].each { |c| validate c }
|
50
|
-
patterns = @
|
49
|
+
patterns = @pattern_file_paths.flat_map { |p| File.readlines(p).map(&:strip).reject(&:empty?) }
|
51
50
|
@matcher = (@filter == 'IP') ? IPMatcher.new(patterns) : ACMatcher.new(patterns)
|
52
51
|
configure_prefixes
|
53
52
|
end
|
@@ -72,7 +71,7 @@ module Fluent
|
|
72
71
|
target = record[@key_to_filter]
|
73
72
|
log.debug "target: #{target}"
|
74
73
|
# Do filter
|
75
|
-
if
|
74
|
+
if should_filter?(target)
|
76
75
|
if @retag_for_filtered
|
77
76
|
t = @retag_for_filtered.tag || ((tag && !tag.empty?) ? @prefix_for_filtered_tag + tag : @retag_for_filtered.add_prefix)
|
78
77
|
log.debug "re-emit with the tag: '#{t}', originally: '#{tag}'"
|
data/lib/matcher.rb
CHANGED
@@ -13,16 +13,25 @@ module Matchers
|
|
13
13
|
def matches?(text)
|
14
14
|
node = @trie.root
|
15
15
|
text.to_s.chars.each do |char|
|
16
|
-
|
16
|
+
failure = node.failure
|
17
17
|
node = node.children[char]
|
18
|
-
|
18
|
+
|
19
|
+
return true unless node.nil? || node.output.nil?
|
20
|
+
return true unless failure.nil? || failure.output.nil?
|
21
|
+
|
22
|
+
# Follow failure if it exists in case pattern doesn't match
|
23
|
+
node = failure if node.nil?
|
19
24
|
end
|
20
|
-
|
25
|
+
|
26
|
+
return false if node.failure.nil?
|
27
|
+
|
28
|
+
!node.failure.output.nil?
|
21
29
|
end
|
22
30
|
end
|
23
31
|
|
24
32
|
class IPMatcher
|
25
33
|
attr_reader :trie
|
34
|
+
|
26
35
|
include IP
|
27
36
|
|
28
37
|
def initialize(patterns)
|
@@ -32,6 +41,7 @@ module Matchers
|
|
32
41
|
|
33
42
|
def matches?(text)
|
34
43
|
return false if text.nil?
|
44
|
+
|
35
45
|
ip = IPAddr.new(text).to_i.to_s(2).rjust(32, '0')
|
36
46
|
trie.forward_match(ip)
|
37
47
|
end
|
@@ -39,6 +49,7 @@ module Matchers
|
|
39
49
|
|
40
50
|
class Trie
|
41
51
|
attr_reader :root
|
52
|
+
|
42
53
|
def initialize(patterns)
|
43
54
|
@root = Node.new
|
44
55
|
@root.children.default = @root
|
@@ -58,7 +69,7 @@ module Matchers
|
|
58
69
|
|
59
70
|
def new_queue
|
60
71
|
q = Queue.new
|
61
|
-
@root.children.
|
72
|
+
@root.children.each_value do |child|
|
62
73
|
q.push(child)
|
63
74
|
child.failure = @root # set root on root's children's failure
|
64
75
|
end
|
@@ -82,10 +93,12 @@ module Matchers
|
|
82
93
|
|
83
94
|
def forward_match(pattern)
|
84
95
|
return false if @root.children.empty?
|
96
|
+
|
85
97
|
cur_node = @root
|
86
98
|
pattern.chars.each do |char|
|
87
99
|
return true if cur_node.children.empty?
|
88
100
|
return false unless cur_node.children.key?(char)
|
101
|
+
|
89
102
|
cur_node = cur_node.children[char]
|
90
103
|
end
|
91
104
|
true
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-filter-list
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shun Yanaura
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-10-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,56 +16,56 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1
|
19
|
+
version: '2.1'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1
|
26
|
+
version: '2.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: minitest
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '5.
|
33
|
+
version: '5.13'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '5.
|
40
|
+
version: '5.13'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '13.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '13.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: test-unit
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '3.
|
61
|
+
version: '3.3'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '3.
|
68
|
+
version: '3.3'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: fluentd
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -95,6 +95,7 @@ executables:
|
|
95
95
|
extensions: []
|
96
96
|
extra_rdoc_files: []
|
97
97
|
files:
|
98
|
+
- ".github/dependabot.yml"
|
98
99
|
- ".gitignore"
|
99
100
|
- ".rubocop.yml"
|
100
101
|
- ".travis.yml"
|
@@ -106,6 +107,7 @@ files:
|
|
106
107
|
- bin/console
|
107
108
|
- bin/setup
|
108
109
|
- fluent-plugin-out_filter_list.gemspec
|
110
|
+
- lib/base.rb
|
109
111
|
- lib/fluent/plugin/filter_filter_list.rb
|
110
112
|
- lib/fluent/plugin/out_filter_list.rb
|
111
113
|
- lib/fluent/plugin/out_filter_list/version.rb
|
@@ -115,7 +117,7 @@ homepage: https://github.com/yanana/fluent-plugin-filter-list
|
|
115
117
|
licenses:
|
116
118
|
- MIT
|
117
119
|
metadata: {}
|
118
|
-
post_install_message:
|
120
|
+
post_install_message:
|
119
121
|
rdoc_options: []
|
120
122
|
require_paths:
|
121
123
|
- lib
|
@@ -123,16 +125,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
123
125
|
requirements:
|
124
126
|
- - ">="
|
125
127
|
- !ruby/object:Gem::Version
|
126
|
-
version:
|
128
|
+
version: 2.5.0
|
127
129
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
130
|
requirements:
|
129
131
|
- - ">="
|
130
132
|
- !ruby/object:Gem::Version
|
131
133
|
version: '0'
|
132
134
|
requirements: []
|
133
|
-
|
134
|
-
|
135
|
-
signing_key:
|
135
|
+
rubygems_version: 3.1.4
|
136
|
+
signing_key:
|
136
137
|
specification_version: 4
|
137
138
|
summary: A fluentd output plugin to filter keywords from messages
|
138
139
|
test_files: []
|