fluent-plugin-filter-list 0.5.0 → 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
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: []