fluent-plugin-filter-list 0.6.0 → 0.7.3
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 +12 -9
- data/.travis.yml +3 -4
- data/Gemfile +1 -1
- data/README.md +18 -1
- data/fluent-plugin-out_filter_list.gemspec +5 -4
- data/lib/base.rb +8 -0
- data/lib/fluent/plugin/filter_filter_list.rb +5 -1
- data/lib/fluent/plugin/out_filter_list.rb +8 -9
- data/lib/fluent/plugin/out_filter_list/version.rb +1 -1
- data/lib/matcher.rb +15 -4
- metadata +17 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 43e0a813287433d553675fa915bf85f371e693a06284f9b6b459de6541009798
|
4
|
+
data.tar.gz: 2d0774d211c5d2ea449dd25be10ea238a0208bc3ed051923ab43bd2bc0c14e85
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 63650ac66d20e8d8df80e27c8e3e677111bab9201dd375aa96ea57088e6fb32cc66a176b2f2d468630ab0f553dcddca8188dee724ca87ded717cedbf7cb5efb2
|
7
|
+
data.tar.gz: 26fe217237f2ea7c2406894ff4991646560234c62073efb6fbd0ab048cac41499917c557377de3a7f8a435792854d4e6b445437e777998373f7c2248414ffb73
|
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,7 +40,7 @@ Metrics/PerceivedComplexity:
|
|
35
40
|
Style/GlobalVars:
|
36
41
|
Exclude:
|
37
42
|
- 'test/test_helper.rb'
|
38
|
-
|
43
|
+
Lint/MissingSuper:
|
39
44
|
Exclude:
|
40
45
|
- 'test/test_helper.rb'
|
41
46
|
Style/MissingRespondToMissing:
|
@@ -45,9 +50,7 @@ Style/TernaryParentheses:
|
|
45
50
|
Enabled: false
|
46
51
|
Style/BlockDelimiters:
|
47
52
|
AutoCorrect: false
|
48
|
-
|
49
|
-
AutoCorrect: false
|
50
|
-
Style/BracesAroundHashParameters:
|
51
|
-
Enabled: false
|
52
|
-
Layout/IndentHash:
|
53
|
+
Layout/FirstHashElementIndentation:
|
53
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.3
|
4
|
-
- 2.4
|
5
3
|
- 2.5
|
6
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,6 +29,9 @@ 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
|
@@ -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>
|
@@ -132,6 +148,7 @@ The other use case is to filter messages likewise, but process the filtered mess
|
|
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', '~> 2.
|
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,12 +2,14 @@ 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
|
|
@@ -15,6 +17,7 @@ module Fluent
|
|
15
17
|
config_param :key_to_filter, :string, default: nil
|
16
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
|
@@ -24,7 +27,8 @@ module Fluent
|
|
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)
|
28
32
|
|
29
33
|
record
|
30
34
|
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
|
|
@@ -17,6 +19,7 @@ module Fluent
|
|
17
19
|
config_param :key_to_filter, :string, default: nil
|
18
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 = @pattern_file_paths.flat_map { |p| File.readlines(p).map(&:
|
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,26 @@ 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.children[char] if node.nil?
|
19
24
|
end
|
20
|
-
|
25
|
+
|
26
|
+
return false if node.nil?
|
27
|
+
return true unless node.failure.nil? || node.failure.output.nil?
|
28
|
+
|
29
|
+
!node.output.nil?
|
21
30
|
end
|
22
31
|
end
|
23
32
|
|
24
33
|
class IPMatcher
|
25
34
|
attr_reader :trie
|
35
|
+
|
26
36
|
include IP
|
27
37
|
|
28
38
|
def initialize(patterns)
|
@@ -40,6 +50,7 @@ module Matchers
|
|
40
50
|
|
41
51
|
class Trie
|
42
52
|
attr_reader :root
|
53
|
+
|
43
54
|
def initialize(patterns)
|
44
55
|
@root = Node.new
|
45
56
|
@root.children.default = @root
|
@@ -59,7 +70,7 @@ module Matchers
|
|
59
70
|
|
60
71
|
def new_queue
|
61
72
|
q = Queue.new
|
62
|
-
@root.children.
|
73
|
+
@root.children.each_value do |child|
|
63
74
|
q.push(child)
|
64
75
|
child.failure = @root # set root on root's children's failure
|
65
76
|
end
|
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.3
|
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: 2021-06-14 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: '2.
|
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: '2.
|
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,15 +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
|
-
rubygems_version: 3.
|
134
|
-
signing_key:
|
135
|
+
rubygems_version: 3.1.4
|
136
|
+
signing_key:
|
135
137
|
specification_version: 4
|
136
138
|
summary: A fluentd output plugin to filter keywords from messages
|
137
139
|
test_files: []
|