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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 17bee9e79c216bfbdf746e8d7d089d229b2997bccf376d24c5e7311f1931f2b4
4
- data.tar.gz: b00d3238b9a8d775f5f1dc2e7fd03beedde536bc6894d38f22091395d3dde1bf
3
+ metadata.gz: d213a158b64257afde99c26284bf0215c1a5d208362f0f00012580852654244e
4
+ data.tar.gz: 37c5a0219f4bab0de18b6aac6c75d6d90f63bd60f5eddb5399bfb0522c563706
5
5
  SHA512:
6
- metadata.gz: c578ea80823b2c26e70a37cf63b3df24832bef79013fcd7e1c28cbf937d220130581bd2a382a6ef06b5c9d1b96838a12d154b1263512920214041cfdfe467ee5
7
- data.tar.gz: 513142ca73ebf949f94d3f22fea2deff6e5147ffea92d65687ce33c80c6217e9d70d47dc3ec53b47858a5edb725c1b43ba70334e0feece51971978ca9fe886f4
6
+ metadata.gz: 776d9222ea8997eda4506348282ed67415296da63c4dcd16569f2a7db35863a5844b3e3869cff5d9dcd9a077d4738a9733e4cf3b3436bc7ec08a26b8d4d84503
7
+ data.tar.gz: b73678d3bd2ba2a415499256cf6b8b7ba1c8c0a88800745d6668aaea1ba049d59343ca2665063cb4a11c1d099ce9ce825fffc57465dde845ee62c34b39f3a49a
@@ -0,0 +1,8 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: daily
7
+ time: '20:00'
8
+ open-pull-requests-limit: 10
@@ -1,6 +1,11 @@
1
- Naming/UncommunicativeMethodParamName:
2
- Enabled: false
3
- Metrics/LineLength:
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
- Style/MethodMissing:
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
- Style/BlockDelimiters:
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
@@ -1,12 +1,11 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.10
4
- - 2.3.7
5
- - 2.4.4
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 install rubocop
8
+ - gem update --remote bundler
11
9
  script:
10
+ - bundle exec rubocop -d
12
11
  - bundle exec rake
data/Gemfile CHANGED
@@ -4,4 +4,4 @@ source 'https://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  # Added at 2017-08-14 19:47:59 +0900 by 5hun:
7
- gem 'rubocop', '~> 0.54.0', group: [:development]
7
+ gem 'rubocop', '~> 0.92.0', require: false, group: [:development]
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
- patterns_file_path blacklist.txt
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 trimed value is empty.
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
- patterns_file_path blacklist.txt
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
- patterns_file_path file_including_patterns_separated_by_new_line
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.16'
25
- spec.add_development_dependency 'minitest', '~> 5.11'
26
- spec.add_development_dependency 'rake', '~> 12.3'
27
- spec.add_development_dependency 'test-unit', '~> 3.2'
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
@@ -0,0 +1,8 @@
1
+ module BaseFilter
2
+ def should_filter?(target)
3
+ return false if target.nil?
4
+ return true if @filter_empty && target.strip.empty?
5
+
6
+ @action == (@matcher.matches?(target) ? :blacklist : :whitelist)
7
+ end
8
+ end
@@ -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 :patterns_file_path, :string, default: ''
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 = @patterns_file_path.empty? ? [] : File.readlines(@patterns_file_path).map(&:chomp).reject(&:empty?)
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
- return nil if target && (@matcher.matches?(target) || (@filter_empty && target.strip.empty?))
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 :patterns_file_path, :string, default: ''
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 + '.' if @retag_for_filtered && @retag_for_filtered.add_prefix
43
- @prefix_for_filtered_tag = @retag_for_filtered && @retag_for_filtered.add_prefix ? @retag_for_filtered.add_prefix + '.' : ''
44
- @prefix = @retag && @retag.add_prefix ? @retag.add_prefix + '.' : ''
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 = @patterns_file_path.empty? ? [] : File.readlines(@patterns_file_path).map(&:chomp).reject(&:empty?)
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 target && (@matcher.matches?(target) || (@filter_empty && target.strip.empty?))
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}'"
@@ -1,7 +1,7 @@
1
1
  module Fluent
2
2
  module Plugin
3
3
  module FilterList
4
- VERSION = "0.5.0"
4
+ VERSION = "0.7.2"
5
5
  end
6
6
  end
7
7
  end
@@ -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
- node = node.failure while node.children[char].nil? # Follow failure if it exists in case pattern doesn't match
16
+ failure = node.failure
17
17
  node = node.children[char]
18
- return true unless node.output.nil?
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
- false
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.values.each do |child|
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.5.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: 2018-04-26 00:00:00.000000000 Z
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.16'
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.16'
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.11'
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.11'
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: '12.3'
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: '12.3'
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.2'
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.2'
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: '0'
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
- rubyforge_project:
134
- rubygems_version: 2.7.6
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: []