fluent-plugin-ssl-check 0.1.1 → 1.0.0

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: 17021668aaaa4b2915fb786079c8d822fd58db627488b3443eba0e0e2dfebf6d
4
- data.tar.gz: ca284af707c9893d7b980a350915a3f64f11b255ba64806e383a5adb3537d8ae
3
+ metadata.gz: db98f212ffba0fa6f4caad4e3dcedb88da99d298f1ee2f2e71a42374fdca90df
4
+ data.tar.gz: 301dcadeb5f03df68afab76dd3a8c170fea09cb6bd5e5eab5a7d79aa204cf794
5
5
  SHA512:
6
- metadata.gz: ef5caa0b92f69d743bed93e76916759270b719af0de1e2be6710ceaef4c589d43402fbec52eec829612cc92b340ea25d8d9d6945d64dae3882d1423b150d0990
7
- data.tar.gz: ffaf22e836a4ac4a744366ec67dd75515e5329d8cfcd774f741fab9c609a1fcf43f0031dbd06d31d76764cac3e99be6d455987e42fd2db04e879448787fc4008
6
+ metadata.gz: 1efffe3228c31202824cbfb64e85b9c0a72cb54ecf618b23f5270c6f834b41005134df4f2c6880ba53fa84f2aac4763e05084f34dae35c7ee2e964c13e6f2a42
7
+ data.tar.gz: 2d993e6609baccf618080b6ec80d764db82a81e5321f6485687ac874c16ab483f0c288a96c8f71ca6a0a3fcf4d68d37bdd1ed26afcb1621ae6b6c42912cbe8bf
data/.rubocop.yml CHANGED
@@ -2,9 +2,12 @@ require:
2
2
  - rubocop-rake
3
3
 
4
4
  AllCops:
5
- TargetRubyVersion: 2.4
5
+ TargetRubyVersion: 2.7
6
6
  NewCops: enable
7
7
 
8
+ Gemspec/DevelopmentDependencies:
9
+ Enabled: false
10
+
8
11
  Metrics/BlockLength:
9
12
  Exclude:
10
13
  - fluent-plugin-ssl-check.gemspec
@@ -13,6 +16,7 @@ Metrics/BlockLength:
13
16
  Metrics/ClassLength:
14
17
  Exclude:
15
18
  - test/**/*.rb
19
+ - lib/fluent/plugin/in_ssl_check.rb
16
20
 
17
21
  Metrics/MethodLength:
18
22
  Max: 20
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.4.10
1
+ 2.7.7
data/Gemfile.lock CHANGED
@@ -1,85 +1,95 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fluent-plugin-ssl-check (0.1.1)
4
+ fluent-plugin-ssl-check (1.0.0)
5
5
  fluentd (>= 0.14.10, < 2)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
10
  ast (2.4.2)
11
+ base64 (0.1.1)
11
12
  bump (0.10.0)
12
13
  byebug (11.1.3)
13
14
  concurrent-ruby (1.2.2)
14
- cool.io (1.7.1)
15
- fluentd (1.16.1)
15
+ cool.io (1.8.0)
16
+ fluentd (1.16.2)
16
17
  bundler
17
18
  cool.io (>= 1.4.5, < 2.0.0)
18
19
  http_parser.rb (>= 0.5.1, < 0.9.0)
19
20
  msgpack (>= 1.3.1, < 2.0.0)
20
21
  serverengine (>= 2.3.2, < 3.0.0)
21
- sigdump (~> 0.2.2)
22
+ sigdump (~> 0.2.5)
22
23
  strptime (>= 0.2.4, < 1.0.0)
23
24
  tzinfo (>= 1.0, < 3.0)
24
25
  tzinfo-data (~> 1.0)
25
26
  webrick (~> 1.4)
26
27
  yajl-ruby (~> 1.0)
27
28
  http_parser.rb (0.8.0)
29
+ json (2.6.3)
28
30
  kwalify (0.7.2)
29
- msgpack (1.6.1)
30
- parallel (1.20.1)
31
- parser (3.0.3.2)
31
+ language_server-protocol (3.17.0.3)
32
+ msgpack (1.7.2)
33
+ parallel (1.23.0)
34
+ parser (3.2.2.3)
32
35
  ast (~> 2.4.1)
36
+ racc
33
37
  power_assert (2.0.3)
38
+ racc (1.7.1)
34
39
  rainbow (3.1.1)
35
40
  rake (13.0.6)
36
- reek (6.0.6)
41
+ reek (6.1.4)
37
42
  kwalify (~> 0.7.0)
38
- parser (~> 3.0.0)
43
+ parser (~> 3.2.0)
39
44
  rainbow (>= 2.0, < 4.0)
40
45
  regexp_parser (2.8.1)
41
- rexml (3.2.5)
42
- rubocop (1.12.1)
46
+ rexml (3.2.6)
47
+ rubocop (1.56.0)
48
+ base64 (~> 0.1.1)
49
+ json (~> 2.3)
50
+ language_server-protocol (>= 3.17.0)
43
51
  parallel (~> 1.10)
44
- parser (>= 3.0.0.0)
52
+ parser (>= 3.2.2.3)
45
53
  rainbow (>= 2.2.2, < 4.0)
46
54
  regexp_parser (>= 1.8, < 3.0)
47
- rexml
48
- rubocop-ast (>= 1.2.0, < 2.0)
55
+ rexml (>= 3.2.5, < 4.0)
56
+ rubocop-ast (>= 1.28.1, < 2.0)
49
57
  ruby-progressbar (~> 1.7)
50
- unicode-display_width (>= 1.4.0, < 3.0)
51
- rubocop-ast (1.4.1)
52
- parser (>= 2.7.1.5)
53
- rubocop-rake (0.5.1)
54
- rubocop
58
+ unicode-display_width (>= 2.4.0, < 3.0)
59
+ rubocop-ast (1.29.0)
60
+ parser (>= 3.2.1.0)
61
+ rubocop-rake (0.6.0)
62
+ rubocop (~> 1.0)
55
63
  ruby-progressbar (1.13.0)
56
64
  serverengine (2.3.2)
57
65
  sigdump (~> 0.2.2)
58
66
  sigdump (0.2.5)
59
67
  strptime (0.2.5)
60
- test-unit (3.5.9)
68
+ test-unit (3.6.1)
61
69
  power_assert
70
+ timecop (0.9.6)
62
71
  tzinfo (2.0.6)
63
72
  concurrent-ruby (~> 1.0)
64
73
  tzinfo-data (1.2023.3)
65
74
  tzinfo (>= 1.0.0)
66
75
  unicode-display_width (2.4.2)
67
76
  webrick (1.8.1)
68
- yajl-ruby (1.4.1)
77
+ yajl-ruby (1.4.3)
69
78
 
70
79
  PLATFORMS
71
80
  x86_64-linux
72
81
 
73
82
  DEPENDENCIES
74
83
  bump (~> 0.10.0)
75
- bundler (~> 2.2)
84
+ bundler (~> 2.4)
76
85
  byebug (~> 11.1, >= 11.1.3)
77
86
  fluent-plugin-ssl-check!
78
- rake (~> 13.0.6)
79
- reek (~> 6.0.6)
80
- rubocop (~> 1.12.1)
81
- rubocop-rake (~> 0.5.1)
82
- test-unit (~> 3.5.7)
87
+ rake (~> 13.0, >= 13.0.6)
88
+ reek (~> 6.1, >= 6.1.4)
89
+ rubocop (~> 1.56)
90
+ rubocop-rake (~> 0.6.0)
91
+ test-unit (~> 3.6, >= 3.6.1)
92
+ timecop (~> 0.9.6)
83
93
 
84
94
  BUNDLED WITH
85
- 2.2.15
95
+ 2.4.18
data/README.md CHANGED
@@ -13,7 +13,7 @@ Example:
13
13
  ``` conf
14
14
  <source>
15
15
  @type ssl_check
16
- tag ssh_check
16
+ tag ssl_check
17
17
 
18
18
  host my-service.com
19
19
  port 443
@@ -5,7 +5,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = 'fluent-plugin-ssl-check'
8
- spec.version = '0.1.1'
8
+ spec.version = '1.0.0'
9
9
  spec.authors = ['Thomas Tych']
10
10
  spec.email = ['thomas.tych@gmail.com']
11
11
 
@@ -13,28 +13,26 @@ Gem::Specification.new do |spec|
13
13
  spec.homepage = 'https://gitlab.com/ttych/fluent-plugin-ssl-check'
14
14
  spec.license = 'Apache-2.0'
15
15
 
16
- spec.required_ruby_version = '>= 2.4.0'
16
+ spec.required_ruby_version = '>= 2.7.0'
17
17
 
18
- test_files, files = `git ls-files -z`.split("\x0").partition do |f|
18
+ spec.metadata['rubygems_mfa_required'] = 'true'
19
+
20
+ _, files = `git ls-files -z`.split("\x0").partition do |f|
19
21
  f.match(%r{^(test|spec|features)/})
20
22
  end
21
23
  spec.files = files
22
24
  spec.executables = files.grep(%r{^bin/}) { |f| File.basename(f) }
23
- spec.test_files = test_files
24
25
  spec.require_paths = ['lib']
25
26
 
26
- # commented dependency use blocked old versions
27
- # for compatibility with ruby 2.4.10
28
- # for old version of td-agent
29
-
30
27
  spec.add_development_dependency 'bump', '~> 0.10.0'
31
- spec.add_development_dependency 'bundler', '~> 2.2'
28
+ spec.add_development_dependency 'bundler', '~> 2.4'
32
29
  spec.add_development_dependency 'byebug', '~> 11.1', '>= 11.1.3'
33
- spec.add_development_dependency 'rake', '~> 13.0.6'
34
- spec.add_development_dependency 'reek', '~> 6.0.6' # < 6.1.x to work with ruby 2.4.10
35
- spec.add_development_dependency 'rubocop', '~> 1.12.1' # < 1.13.x to work with ruby 2.4.10
36
- spec.add_development_dependency 'rubocop-rake', '~> 0.5.1' # < 0.6.x to work with ruby 2.4.10
37
- spec.add_development_dependency 'test-unit', '~> 3.5.7'
30
+ spec.add_development_dependency 'rake', '~> 13.0', '>= 13.0.6'
31
+ spec.add_development_dependency 'reek', '~> 6.1', '>= 6.1.4'
32
+ spec.add_development_dependency 'rubocop', '~> 1.56'
33
+ spec.add_development_dependency 'rubocop-rake', '~> 0.6.0'
34
+ spec.add_development_dependency 'test-unit', '~> 3.6', '>= 3.6.1'
35
+ spec.add_development_dependency 'timecop', '~> 0.9.6'
38
36
 
39
37
  spec.add_runtime_dependency 'fluentd', ['>= 0.14.10', '< 2']
40
38
  end
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Fluent
4
- # extension
5
- class EventTime
6
- def to_epochmillis
7
- @sec * 1_000 + @nsec / 1_000_000
8
- end
3
+
4
+ class Time
5
+ def to_epochmillis
6
+ (to_f * 1000).to_i
7
+ end
8
+
9
+ def to_iso
10
+ iso8601(3)
9
11
  end
10
12
  end
@@ -37,6 +37,9 @@ module Fluent
37
37
  DEFAULT_PORT = 443
38
38
  DEFAULT_TIME = 600
39
39
  DEFAULT_TIMEOUT = 5
40
+ DEFAULT_LOG_EVENTS = true
41
+ DEFAULT_METRIC_EVENTS = false
42
+ DEFAULT_EVENT_PREFIX = ''
40
43
 
41
44
  desc 'Tag to emit events on'
42
45
  config_param :tag, :string, default: DEFAULT_TAG
@@ -55,6 +58,15 @@ module Fluent
55
58
  desc 'Timeout for check'
56
59
  config_param :timeout, :integer, default: DEFAULT_TIMEOUT
57
60
 
61
+ desc 'Emit log events'
62
+ config_param :log_events, :bool, default: DEFAULT_LOG_EVENTS
63
+ desc 'Emit metric events'
64
+ config_param :metric_events, :bool, default: DEFAULT_METRIC_EVENTS
65
+ desc 'Event prefix'
66
+ config_param :event_prefix, :string, default: DEFAULT_EVENT_PREFIX
67
+ desc 'Timestamp format'
68
+ config_param :timestamp_format, :enum, list: %i[iso epochmillis], default: :iso
69
+
58
70
  helpers :timer
59
71
 
60
72
  # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
@@ -83,69 +95,103 @@ module Fluent
83
95
  end
84
96
 
85
97
  def check
86
- time = now
87
-
88
98
  ssl_info = fetch_ssl_info
89
- router.emit(tag, time, event_status(time, ssl_info))
90
- router.emit(tag, time, event_expirency(time, ssl_info))
91
- rescue StandardError
92
- router.emit(tag, time, event_status_failure(time))
99
+
100
+ emit_logs(ssl_info) if log_events
101
+ emit_metrics(ssl_info) if metric_events
93
102
  end
94
103
 
95
104
  def fetch_ssl_info
96
105
  @ssl_client.ssl_info
97
106
  end
98
107
 
99
- def event_status(time, ssl_info)
100
- {
101
- 'timestamp' => time.to_epochmillis,
102
- 'name' => 'ssl_status',
103
- 'value' => 1,
108
+ def emit_logs(ssl_info)
109
+ record = {
110
+ 'timestamp' => ssl_info.time.send("to_#{timestamp_format}"),
111
+ 'status' => ssl_info.status,
104
112
  'host' => host,
105
113
  'port' => port,
106
114
  'ssl_version' => ssl_info.ssl_version,
107
- 'ssl_dn' => ssl_info.subject_s
115
+ 'ssl_dn' => ssl_info.subject_s,
116
+ 'ssl_not_after' => ssl_info.not_after,
117
+ 'expire_in_days' => ssl_info.expire_in_days
108
118
  }
119
+ router.emit(tag, Fluent::EventTime.from_time(ssl_info.time), record)
109
120
  end
110
121
 
111
- def event_status_failure(time)
112
- {
113
- 'timestamp' => time.to_epochmillis,
114
- 'name' => 'ssl_status',
115
- 'value' => 0,
116
- 'host' => host,
117
- 'port' => port
118
- }
122
+ def emit_metrics(ssl_info)
123
+ emit_metric_status(ssl_info)
124
+ emit_metric_expirency(ssl_info)
119
125
  end
120
126
 
121
- def event_expirency(time, ssl_info)
122
- {
123
- 'timestamp' => time.to_epochmillis,
124
- 'name' => 'ssl_expirency',
125
- 'value' => ssl_info.expire_in_day(time),
126
- 'host' => host,
127
- 'port' => port,
128
- 'ssl_version' => ssl_info.ssl_version,
129
- 'ssl_dn' => ssl_info.subject_s
127
+ # rubocop:disable Metrics/AbcSize
128
+ def emit_metric_status(ssl_info)
129
+ record = {
130
+ 'timestamp' => ssl_info.time.send("to_#{timestamp_format}"),
131
+ 'metric_name' => 'ssl_status',
132
+ 'metric_value' => ssl_info.status,
133
+ "#{event_prefix}host" => host,
134
+ "#{event_prefix}port" => port,
135
+ "#{event_prefix}ssl_dn" => ssl_info.subject_s,
136
+ "#{event_prefix}ssl_version" => ssl_info.ssl_version,
137
+ "#{event_prefix}ssl_not_after" => ssl_info.not_after
130
138
  }
139
+ router.emit(tag, Fluent::EventTime.from_time(ssl_info.time), record)
131
140
  end
132
-
133
- def now
134
- Fluent::Engine.now
141
+ # rubocop:enable Metrics/AbcSize
142
+
143
+ def emit_metric_expirency(ssl_info)
144
+ return if ssl_info.error
145
+
146
+ record = {
147
+ 'timestamp' => ssl_info.time.send("to_#{timestamp_format}"),
148
+ 'metric_name' => 'ssl_expirency',
149
+ 'metric_value' => ssl_info.expire_in_days,
150
+ "#{event_prefix}host" => host,
151
+ "#{event_prefix}port" => port,
152
+ "#{event_prefix}ssl_dn" => ssl_info.subject_s
153
+ }
154
+ router.emit(tag, Fluent::EventTime.from_time(ssl_info.time), record)
135
155
  end
136
156
 
137
157
  # ssl info
138
158
  # to encapsulate extracted ssl information
139
- SslInfo = Struct.new(:cert, :cert_chain, :ssl_version) do
159
+ class SslInfo
160
+ OK = 1
161
+ KO = 0
162
+
163
+ attr_reader :time
164
+ attr_accessor :cert, :cert_chain, :ssl_version, :error
165
+
166
+ def initialize(cert: nil, cert_chain: nil, ssl_version: nil, error: nil, time: Time.now)
167
+ @cert = cert
168
+ @cert_chain = cert_chain
169
+ @ssl_version = ssl_version
170
+ @error = error
171
+ @time = time
172
+ end
173
+
140
174
  def subject_s
141
- cert.subject.to_s
175
+ cert.subject.to_s if cert&.subject
142
176
  end
143
177
 
144
- def expire_in_day(from = Date.today)
145
- from = from.to_time.to_date
146
- expire_in = cert.not_after.to_date
178
+ def expire_in_days
179
+ return unless cert&.not_after
147
180
 
148
- (expire_in - from).to_i
181
+ expire_in = cert.not_after
182
+ ((expire_in - time) / 3600 / 24).to_i
183
+ end
184
+
185
+ def not_after
186
+ return unless cert
187
+
188
+ cert.not_after.iso8601(3)
189
+ end
190
+
191
+ def status
192
+ return KO if error
193
+
194
+ OK
149
195
  end
150
196
  end
151
197
 
@@ -162,33 +208,34 @@ module Fluent
162
208
  @timeout = timeout
163
209
  end
164
210
 
211
+ # rubocop:disable Metrics/AbcSize
165
212
  def ssl_info
166
- Timeout.timeout(timeout) do
167
- tcp_socket = TCPSocket.open(host, port)
168
- ssl_socket = OpenSSL::SSL::SSLSocket.new(tcp_socket, ssl_context)
169
- ssl_socket.connect
170
-
171
- # cert_store.verify(ssl_socket.peer_cert, ssl_socket.peer_cert_chain)
172
-
173
- ssl_info = SslInfo.new(
174
- OpenSSL::X509::Certificate.new(ssl_socket.peer_cert),
175
- ssl_socket.peer_cert_chain,
176
- ssl_socket.ssl_socket.ssl_version
177
- )
178
-
179
- ssl_socket.sysclose
180
- tcp_socket.close
181
-
182
- ssl_info
213
+ info = SslInfo.new
214
+ begin
215
+ Timeout.timeout(timeout) do
216
+ tcp_socket = TCPSocket.open(host, port)
217
+ ssl_socket = OpenSSL::SSL::SSLSocket.new(tcp_socket, ssl_context)
218
+ ssl_socket.connect
219
+ ssl_socket.sysclose
220
+ tcp_socket.close
221
+
222
+ # cert_store.verify(ssl_socket.peer_cert, ssl_socket.peer_cert_chain)
223
+ info.cert = ssl_socket.peer_cert
224
+ info.cert_chain = ssl_socket.peer_cert_chain
225
+ info.ssl_version = ssl_socket.ssl_version
226
+ end
227
+ rescue StandardError => e
228
+ info.error = e.to_s
183
229
  end
230
+ info
184
231
  end
232
+ # rubocop:enable Metrics/AbcSize
185
233
 
186
234
  def store
187
235
  OpenSSL::X509::Store.new.tap do |store|
188
- store.set_default_paths if !ca_path && !ca_file
189
-
190
- cert_store.add_path(ca_path) if ca_path
191
- cert_store.add_file(ca_file) if ca_file
236
+ store.set_default_paths
237
+ store.add_path(ca_path) if ca_path
238
+ store.add_file(ca_file) if ca_file
192
239
  end
193
240
  end
194
241
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-ssl-check
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Tych
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-07-10 00:00:00.000000000 Z
11
+ date: 2023-08-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bump
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '2.2'
33
+ version: '2.4'
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: '2.2'
40
+ version: '2.4'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: byebug
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -63,6 +63,9 @@ dependencies:
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '13.0'
68
+ - - ">="
66
69
  - !ruby/object:Gem::Version
67
70
  version: 13.0.6
68
71
  type: :development
@@ -70,6 +73,9 @@ dependencies:
70
73
  version_requirements: !ruby/object:Gem::Requirement
71
74
  requirements:
72
75
  - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '13.0'
78
+ - - ">="
73
79
  - !ruby/object:Gem::Version
74
80
  version: 13.0.6
75
81
  - !ruby/object:Gem::Dependency
@@ -78,56 +84,82 @@ dependencies:
78
84
  requirements:
79
85
  - - "~>"
80
86
  - !ruby/object:Gem::Version
81
- version: 6.0.6
87
+ version: '6.1'
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: 6.1.4
82
91
  type: :development
83
92
  prerelease: false
84
93
  version_requirements: !ruby/object:Gem::Requirement
85
94
  requirements:
86
95
  - - "~>"
87
96
  - !ruby/object:Gem::Version
88
- version: 6.0.6
97
+ version: '6.1'
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: 6.1.4
89
101
  - !ruby/object:Gem::Dependency
90
102
  name: rubocop
91
103
  requirement: !ruby/object:Gem::Requirement
92
104
  requirements:
93
105
  - - "~>"
94
106
  - !ruby/object:Gem::Version
95
- version: 1.12.1
107
+ version: '1.56'
96
108
  type: :development
97
109
  prerelease: false
98
110
  version_requirements: !ruby/object:Gem::Requirement
99
111
  requirements:
100
112
  - - "~>"
101
113
  - !ruby/object:Gem::Version
102
- version: 1.12.1
114
+ version: '1.56'
103
115
  - !ruby/object:Gem::Dependency
104
116
  name: rubocop-rake
105
117
  requirement: !ruby/object:Gem::Requirement
106
118
  requirements:
107
119
  - - "~>"
108
120
  - !ruby/object:Gem::Version
109
- version: 0.5.1
121
+ version: 0.6.0
110
122
  type: :development
111
123
  prerelease: false
112
124
  version_requirements: !ruby/object:Gem::Requirement
113
125
  requirements:
114
126
  - - "~>"
115
127
  - !ruby/object:Gem::Version
116
- version: 0.5.1
128
+ version: 0.6.0
117
129
  - !ruby/object:Gem::Dependency
118
130
  name: test-unit
119
131
  requirement: !ruby/object:Gem::Requirement
120
132
  requirements:
121
133
  - - "~>"
122
134
  - !ruby/object:Gem::Version
123
- version: 3.5.7
135
+ version: '3.6'
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: 3.6.1
139
+ type: :development
140
+ prerelease: false
141
+ version_requirements: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '3.6'
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: 3.6.1
149
+ - !ruby/object:Gem::Dependency
150
+ name: timecop
151
+ requirement: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - "~>"
154
+ - !ruby/object:Gem::Version
155
+ version: 0.9.6
124
156
  type: :development
125
157
  prerelease: false
126
158
  version_requirements: !ruby/object:Gem::Requirement
127
159
  requirements:
128
160
  - - "~>"
129
161
  - !ruby/object:Gem::Version
130
- version: 3.5.7
162
+ version: 0.9.6
131
163
  - !ruby/object:Gem::Dependency
132
164
  name: fluentd
133
165
  requirement: !ruby/object:Gem::Requirement
@@ -166,12 +198,11 @@ files:
166
198
  - fluent-plugin-ssl-check.gemspec
167
199
  - lib/fluent/plugin/extensions/time.rb
168
200
  - lib/fluent/plugin/in_ssl_check.rb
169
- - test/fluent/plugin/test_in_ssl_check.rb
170
- - test/helper.rb
171
201
  homepage: https://gitlab.com/ttych/fluent-plugin-ssl-check
172
202
  licenses:
173
203
  - Apache-2.0
174
- metadata: {}
204
+ metadata:
205
+ rubygems_mfa_required: 'true'
175
206
  post_install_message:
176
207
  rdoc_options: []
177
208
  require_paths:
@@ -180,7 +211,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
180
211
  requirements:
181
212
  - - ">="
182
213
  - !ruby/object:Gem::Version
183
- version: 2.4.0
214
+ version: 2.7.0
184
215
  required_rubygems_version: !ruby/object:Gem::Requirement
185
216
  requirements:
186
217
  - - ">="
@@ -191,6 +222,4 @@ rubygems_version: 3.1.6
191
222
  signing_key:
192
223
  specification_version: 4
193
224
  summary: fluentd plugin to check ssl endpoint
194
- test_files:
195
- - test/fluent/plugin/test_in_ssl_check.rb
196
- - test/helper.rb
225
+ test_files: []
@@ -1,171 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'helper'
4
- require 'fluent/plugin/in_ssl_check'
5
-
6
- # unit test for SslCheckInputTest / ssl_check input plugin
7
- class SslCheckInputTest < Test::Unit::TestCase
8
- setup do
9
- Fluent::Test.setup
10
- end
11
-
12
- # configuration
13
- sub_test_case 'configuration' do
14
- test 'default configuration' do
15
- driver = create_driver
16
- input = driver.instance
17
-
18
- assert_equal Fluent::Plugin::SslCheckInput::DEFAULT_TAG, input.tag
19
- assert_equal Fluent::Plugin::SslCheckInput::DEFAULT_HOST, input.host
20
- assert_equal Fluent::Plugin::SslCheckInput::DEFAULT_PORT, input.port
21
- assert_equal Fluent::Plugin::SslCheckInput::DEFAULT_TIME, input.interval
22
- assert_equal nil, input.ca_path
23
- assert_equal nil, input.ca_file
24
- assert_equal Fluent::Plugin::SslCheckInput::DEFAULT_TIMEOUT, input.timeout
25
- end
26
-
27
- test 'tag can not be empty' do
28
- conf = %(
29
- #{DEFAULT_CONF}
30
- tag
31
- )
32
- assert_raise(Fluent::ConfigError) do
33
- create_driver(conf)
34
- end
35
- end
36
-
37
- test 'host can not be empty' do
38
- conf = %(
39
- #{DEFAULT_CONF}
40
- host
41
- )
42
- assert_raise(Fluent::ConfigError) do
43
- create_driver(conf)
44
- end
45
- end
46
-
47
- test 'port can not be < 1' do
48
- conf = %(
49
- #{DEFAULT_CONF}
50
- port 0
51
- )
52
- assert_raise(Fluent::ConfigError) do
53
- create_driver(conf)
54
- end
55
- end
56
-
57
- test 'interval can not be < 1' do
58
- conf = %(
59
- #{DEFAULT_CONF}
60
- interval 0
61
- )
62
- assert_raise(Fluent::ConfigError) do
63
- create_driver(conf)
64
- end
65
- end
66
-
67
- test 'ca_path should be a valid directory' do
68
- conf = %(
69
- #{DEFAULT_CONF}
70
- ca_path /nonexistent/dir
71
- )
72
- assert_raise(Fluent::ConfigError) do
73
- create_driver(conf)
74
- end
75
- end
76
-
77
- test 'ca_file should be a valid file' do
78
- conf = %(
79
- #{DEFAULT_CONF}
80
- ca_file /nonexistent/file
81
- )
82
- assert_raise(Fluent::ConfigError) do
83
- create_driver(conf)
84
- end
85
- end
86
- end
87
-
88
- # check
89
- sub_test_case 'check' do
90
- # test 'check non existing service' do
91
- # conf = %(
92
- # #{DEFAULT_CONF}
93
- # host 127.0.0.2
94
- # port 1272
95
- # interval 1
96
- # )
97
- # driver = create_driver(conf)
98
- # mock_driver_timer(driver)
99
- # # driver.run(expect_emits: 1, timeout: 5)
100
- # driver.instance.check
101
-
102
- # events = driver.events
103
-
104
- # assert_equal 1, events.size
105
- # assert_equal Fluent::Plugin::SslCheckInput::DEFAULT_TAG, events.first.first
106
- # assert_equal({"host" => "127.0.0.2",
107
- # "name" => "ssl_status",
108
- # "port" => 1272,
109
- # "timestamp" => 1688680800000,
110
- # "value" => 0}, events.first.last)
111
- # end
112
-
113
- test 'check with fake ssl_info' do
114
- driver = create_driver
115
- mock_driver_timer(driver)
116
- mock_driver_ssl_info(driver)
117
-
118
- # driver.run(expect_emits: 2, timeout: 5)
119
- driver.instance.check
120
-
121
- events = driver.events
122
-
123
- assert_equal 2, events.size
124
- assert_equal Fluent::Plugin::SslCheckInput::DEFAULT_TAG, events[0].first
125
- assert_equal({ 'host' => 'localhost',
126
- 'name' => 'ssl_status',
127
- 'port' => 443,
128
- 'timestamp' => 1_688_680_800_000,
129
- 'value' => 1,
130
- 'ssl_dn' => '/CN=TEST',
131
- 'ssl_version' => 'ssl_version' }, events[0].last)
132
- assert_equal Fluent::Plugin::SslCheckInput::DEFAULT_TAG, events[1].first
133
- assert_equal({ 'host' => 'localhost',
134
- 'name' => 'ssl_expirency',
135
- 'port' => 443,
136
- 'timestamp' => 1_688_680_800_000,
137
- 'value' => 729,
138
- 'ssl_dn' => '/CN=TEST',
139
- 'ssl_version' => 'ssl_version' }, events[1].last)
140
- end
141
- end
142
-
143
- private
144
-
145
- DEFAULT_CONF = %()
146
- MOCKED_TIME = Time.parse('2023-07-07')
147
- def create_driver(conf = DEFAULT_CONF)
148
- Fluent::Test::Driver::Input.new(Fluent::Plugin::SslCheckInput).configure(conf)
149
- end
150
-
151
- def mock_driver_timer(driver)
152
- driver.instance.define_singleton_method :now do
153
- Fluent::EventTime.from_time(MOCKED_TIME)
154
- end
155
- end
156
-
157
- def mock_driver_ssl_info(driver)
158
- driver.instance.define_singleton_method :fetch_ssl_info do
159
- certificate = OpenSSL::X509::Certificate.new.tap do |cert|
160
- cert.subject = OpenSSL::X509::Name.parse '/CN=TEST'
161
- cert.not_after = MOCKED_TIME + 2 * 365 * 24 * 60 * 60 # 2 years
162
- end
163
-
164
- Fluent::Plugin::SslCheckInput::SslInfo.new(
165
- certificate,
166
- nil,
167
- 'ssl_version'
168
- )
169
- end
170
- end
171
- end
data/test/helper.rb DELETED
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test-unit'
4
- require 'fluent/test'
5
- require 'fluent/test/driver/input'
6
- require 'fluent/test/helpers'
7
-
8
- Test::Unit::TestCase.include(Fluent::Test::Helpers)
9
- Test::Unit::TestCase.extend(Fluent::Test::Helpers)