fluent-plugin-filter-list 0.6.1 → 0.7.4

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: f6a90e5e975c2bcf76c8c30418dff2ccf2e3f4728b964fc952423c7e28004218
4
- data.tar.gz: b6094adbcd3973449b473025d04c1c5e050f2fd68ea7d8f4884d755c495c9c8a
3
+ metadata.gz: 6025312b2ef8ab49eba3c259f54a37d835ccac19e74bb781210cfc18e661791a
4
+ data.tar.gz: e646c57736caf246e975543f5f0dafdeda23b4a62c5e3053e0316cc73477d3a4
5
5
  SHA512:
6
- metadata.gz: 1c2a1269f37ae68f68bb657b0832c6e311ac1d0e03cf56122c33077077e837f5fada77e347f3aff29f89866f0011e7a32ea67343f2465774c25f50855518c689
7
- data.tar.gz: 9ff01be81c9bb97d6e97234d97ac0744ed62b71419378f039b13d0dbdd3d4a0bc4c1337623ed0b770e781ffa92fdf9a7db6937d44fb9e25971b4982b157ca234
6
+ metadata.gz: 28746a246fc18ab753febab8b7af0647b6e7e3fe661401d10b783668c6341cd42ecca70ac3522091c447c26af8c0862de56f5bf9567c316fd25d7d9755435df8
7
+ data.tar.gz: 757804606fb9536d34a9f96fe003af127b850c8bcb48b2680e93ed5acaa1cc843d8545bbbf7d6d5e3d0263ecf5396231be7a82a457f20a4c95446cb03ae82565
@@ -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
data/.rubocop.yml CHANGED
@@ -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,7 +40,7 @@ Metrics/PerceivedComplexity:
35
40
  Style/GlobalVars:
36
41
  Exclude:
37
42
  - 'test/test_helper.rb'
38
- Style/MethodMissingSuper:
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
- Style/BlockDelimiters:
49
- AutoCorrect: false
50
- Style/BracesAroundHashParameters:
51
- Enabled: false
52
- Layout/IndentFirstHashElement:
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 install rubocop bundler
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.72.0', require: false, group: [:development]
7
+ gem 'rubocop', '~> 1.16.1', require: false, group: [:development]
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # fluent-plugin-filter-list
2
2
 
3
- [![Build Status](https://travis-ci.org/yanana/fluent-plugin-filter-list.svg?branch=master)](https://travis-ci.org/yanana/fluent-plugin-filter-list)
3
+ [![Build Status](https://travis-ci.com/yanana/fluent-plugin-filter-list.svg?branch=master)](https://travis-ci.com/yanana/fluent-plugin-filter-list)
4
4
 
5
5
  Want to filter fluentd messages containing black-listed words in the list effectively? Use the _fluent-plugin-filter-list_ plugin. The plugin enables you to filter messages in the list of words you provide. You can either discard such messages simply, or process them in a different flow by retagging them.
6
6
 
@@ -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 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>
@@ -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.0'
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
data/lib/base.rb ADDED
@@ -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,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
- return nil if target && (@matcher.matches?(target) || (@filter_empty && target.strip.empty?))
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 + '.' if @retag_for_filtered&.add_prefix
43
- @prefix_for_filtered_tag = @retag_for_filtered&.add_prefix ? @retag_for_filtered.add_prefix + '.' : ''
44
- @prefix = @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 = @pattern_file_paths.flat_map { |p| File.readlines(p).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.6.1"
4
+ VERSION = "0.7.4"
5
5
  end
6
6
  end
7
7
  end
data/lib/matcher.rb CHANGED
@@ -13,16 +13,27 @@ 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.children[char] if node.nil?
24
+ node = failure if node.nil?
19
25
  end
20
- false
26
+
27
+ return false if node.nil?
28
+ return true unless node.failure.nil? || node.failure.output.nil?
29
+
30
+ !node.output.nil?
21
31
  end
22
32
  end
23
33
 
24
34
  class IPMatcher
25
35
  attr_reader :trie
36
+
26
37
  include IP
27
38
 
28
39
  def initialize(patterns)
@@ -40,6 +51,7 @@ module Matchers
40
51
 
41
52
  class Trie
42
53
  attr_reader :root
54
+
43
55
  def initialize(patterns)
44
56
  @root = Node.new
45
57
  @root.children.default = @root
@@ -59,7 +71,7 @@ module Matchers
59
71
 
60
72
  def new_queue
61
73
  q = Queue.new
62
- @root.children.values.each do |child|
74
+ @root.children.each_value do |child|
63
75
  q.push(child)
64
76
  child.failure = @root # set root on root's children's failure
65
77
  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.6.1
4
+ version: 0.7.4
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: 2019-07-11 00:00:00.000000000 Z
11
+ date: 2021-06-21 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.0'
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.0'
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,15 +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
- rubygems_version: 3.0.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: []