sensu-plugins-dns 1.4.1 → 2.0.0

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: c1ceb72ff80b957d392d07a70a9080b33822c6133a1c767e03a2d0464998c2be
4
- data.tar.gz: cc4872df6c352ce370cd2fb11cc09c48722b9f8fbde77ab617e925fa4321f35e
3
+ metadata.gz: 9baf92765cfd62035a6b839ac3ad7675ce33efa5495882da84dc22337bf5cb36
4
+ data.tar.gz: 61babc44dc892281dbcff81dadb790c97bb6b4d9e5a615910603cc21037246f4
5
5
  SHA512:
6
- metadata.gz: 74eb6ec643f3b9cf448ca684eb7ff38466574f93b0bb45b27e6d9e64d7df9416f40b8ae49c00a322414d968abfdda6c581820a6df6288dff2c3ae7e3a960c0b0
7
- data.tar.gz: aaad2de134ac9b340cc30c7bb07d0be62aad1782ba90c255a7748c468765405767c9a9b5933f0ea1314eda6047056e95e63ad81300efe6f60478410856d1c1be
6
+ metadata.gz: a332c8c0cd2bf7b0cad5e3ed88cece9e7a0955132ddf34dfdedae7ff3c8f286b9faeaa1d429aa9a5f5f16c253ca14a6247e23a68faa3922dee3eb9b99dd984df
7
+ data.tar.gz: a65a420f79058d667b07fe78ff3bac32d20507329c18ad1fc23fbcbdd8f5e7d9ce17a5ede27cbfad1adddc884c0976e11c70e53988f0e6ffb18287643514d44f
data/CHANGELOG.md CHANGED
@@ -5,10 +5,16 @@ This CHANGELOG follows the format listed [here](https://github.com/sensu-plugins
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [2.0.0] - 03-29-2018
9
+ ### Breaking Changes
10
+ - Dropping ruby `< 2.2` support (@yuri-zubov)
8
11
 
9
- ## [1.4.1] - 2018-07-15
10
- ### Fixed
11
- - explicitly depend on `public_suffix` version `~> 2` to keep support for ruby `2.0` (@mandre)
12
+ ### Security
13
+ - updated yard dependency to `~> 0.9.11` per: https://nvd.nist.gov/vuln/detail/CVE-2017-17042 (@yuri-zubov sponsored by Actility, https://www.actility.com)
14
+ - updated rubocop dependency to `~> 0.51.0` per: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-8418. (@yuri-zubov sponsored by Actility, https://www.actility.com)
15
+
16
+ ### Added
17
+ - Added many checks for DNS zone (@yuri-zubov sponsored by Actility, https://www.actility.com)
12
18
 
13
19
  ## [1.4.0] - 2018-03-21
14
20
  ### Added
@@ -85,7 +91,8 @@ This CHANGELOG follows the format listed [here](https://github.com/sensu-plugins
85
91
  ### Changed
86
92
  - removed cruft from /lib
87
93
 
88
- [Unreleased]: https://github.com/sensu-plugins/sensu-plugins-dns/compare/1.4.0...HEAD
94
+ [Unreleased]: https://github.com/sensu-plugins/sensu-plugins-dns/compare/2.0.0...HEAD
95
+ [2.0.0]: https://github.com/sensu-plugins/sensu-plugins-dns/compare/1.4.0...2.0.0
89
96
  [1.4.0]: https://github.com/sensu-plugins/sensu-plugins-dns/compare/1.3.0...1.4.0
90
97
  [1.3.0]: https://github.com/sensu-plugins/sensu-plugins-dns/compare/1.2.1...1.3.0
91
98
  [1.2.1]: https://github.com/sensu-plugins/sensu-plugins-dns/compare/1.2.0...1/1.2.1
@@ -0,0 +1,193 @@
1
+ #! /usr/bin/env ruby
2
+ #
3
+ # check-dns
4
+ #
5
+ # DESCRIPTION:
6
+ # This plugin checks DNS Zone using dnsruby and whois.
7
+ #
8
+ # OUTPUT:
9
+ # plain text
10
+ #
11
+ # PLATFORMS:
12
+ # Linux, BSD
13
+ #
14
+ # DEPENDENCIES:
15
+ # gem: sensu-plugin
16
+ # gem: dnsruby
17
+ # gem: whois
18
+ #
19
+ # USAGE:
20
+ # example commands
21
+ #
22
+ # NOTES:
23
+ # Does it behave differently on specific platforms, specific use cases, etc
24
+ #
25
+ # LICENSE:
26
+ # Zubov Yuri <yury.zubau@gmail.com> sponsored by Actility, https://www.actility.com
27
+ # Released under the same terms as Sensu (the MIT license); see LICENSE
28
+ # for details.
29
+ #
30
+
31
+ require 'sensu-plugin/check/cli'
32
+ require 'dnsruby'
33
+ require 'whois'
34
+ require 'whois/parser'
35
+ require 'ipaddr'
36
+ require 'resolv'
37
+
38
+ #
39
+ # DNS
40
+ #
41
+ class DNSZone < Sensu::Plugin::Check::CLI
42
+ option :domain,
43
+ description: 'Domain to resolve (or ip if type PTR)',
44
+ short: '-d DOMAIN',
45
+ long: '--domain DOMAIN'
46
+
47
+ option :threshold,
48
+ description: 'Percentage of DNS queries that must succeed',
49
+ short: '-l PERCENT',
50
+ long: '--threshold PERCENT',
51
+ proc: proc(&:to_i),
52
+ default: 100
53
+
54
+ option :timeout,
55
+ description: 'Set timeout for query',
56
+ short: '-T TIMEOUT',
57
+ long: '--timeout TIMEOUT',
58
+ proc: proc(&:to_i),
59
+ default: 5
60
+
61
+ option :warn_only,
62
+ description: 'Warn instead of critical on failure',
63
+ short: '-w',
64
+ long: '--warn-only',
65
+ boolean: true
66
+
67
+ def resolve_ns
68
+ Resolv::DNS.new.getresources(config[:domain], Resolv::DNS::Resource::IN::NS).map { |e| e.name.to_s }
69
+ end
70
+
71
+ def check_whois(entries)
72
+ errors = []
73
+ success = []
74
+ record = Whois.whois(config[:domain])
75
+ parser = record.parser
76
+ additional_text = "(whois #{parser.nameservers.map(&:name)}) (dig #{entries})"
77
+ if Set.new(parser.nameservers.map(&:name)) == Set.new(entries)
78
+ success << "Resolved #{config[:domain]} #{config[:type]} equal with whois #{additional_text}"
79
+ else
80
+ errors << "Resolved #{config[:domain]} #{config[:type]} did not include #{config[:result]} #{additional_text}"
81
+ end
82
+ [errors, success]
83
+ end
84
+
85
+ def check_results(entries)
86
+ errors = []
87
+ success = []
88
+
89
+ %w[check_whois check_axfr soa_query].each do |check|
90
+ result = send(check, entries)
91
+ errors.push(*result[0])
92
+ success.push(*result[1])
93
+ end
94
+
95
+ result = check_dns_connection(entries, true)
96
+ errors.push(*result[0])
97
+ success.push(*result[1])
98
+
99
+ result = check_dns_connection(entries, false)
100
+ errors.push(*result[0])
101
+ success.push(*result[1])
102
+
103
+ [errors, success]
104
+ end
105
+
106
+ def check_dns_connection(entries, use_tcp = false)
107
+ errors = []
108
+ success = []
109
+
110
+ entries.each do |ns|
111
+ Dnsruby::Resolv.getaddresses(ns).each do |ip|
112
+ begin
113
+ resolv = Dnsruby::Resolver.new(nameserver: ip.to_s, do_caching: false, use_tcp: use_tcp)
114
+ resolv.query_timeout = config[:timeout]
115
+ resolv.query(config[:domain], Dnsruby::Types.ANY)
116
+ type_of_connection = use_tcp ? 'tcp' : 'udp'
117
+ success << "Resolved DNS #{ns}(#{ip}) uses #{type_of_connection}"
118
+ rescue StandardError
119
+ errors << "Resolved DNS #{ns}(#{ip}) doesn't use #{type_of_connection}"
120
+ end
121
+ end
122
+ end
123
+ [errors, success]
124
+ end
125
+
126
+ def check_axfr(entries)
127
+ errors = []
128
+ success = []
129
+
130
+ entries.each do |ns|
131
+ Dnsruby::Resolv.new.getaddresses(ns).each do |ip|
132
+ begin
133
+ resolv = Dnsruby::Resolver.new(nameserver: ip.to_s, do_caching: false)
134
+ resolv.query_timeout = config[:timeout]
135
+ resolv.query(config[:domain], 'AXFR', 'IN')
136
+
137
+ errors << "Resolved DNS #{ns}(#{ip}) has AXFR"
138
+ rescue StandardError
139
+ success << "Resolved DNS #{ns}(#{ip}) doesn't have AXFR"
140
+ end
141
+ end
142
+ end
143
+ [errors, success]
144
+ end
145
+
146
+ def soa_query(entries)
147
+ errors = []
148
+ success = []
149
+ resp = ::Resolv::DNS.new.getresources(config[:domain], Resolv::DNS::Resource::IN::SOA)
150
+ primary_serial_number = resp.map(&:serial).first
151
+ primary_server = resp.map { |r| r.mname.to_s }
152
+ primary_server_name = resp.map { |r| r.rname.to_s }
153
+
154
+ entries.each_with_index do |ns, _index|
155
+ ::Resolv::DNS.new.getaddresses(ns).each do |ip|
156
+ serial_number = nil
157
+ server_name = nil
158
+ server = nil
159
+
160
+ ::Resolv::DNS.open nameserver: ip.to_s, ndots: 1 do |dns|
161
+ resp = dns.getresources(config[:domain], Resolv::DNS::Resource::IN::SOA)
162
+ serial_number = resp.map(&:serial).first
163
+ server_name = resp.map { |r| r.rname.to_s }
164
+ server = resp.map { |r| r.mname.to_s }
165
+ end
166
+
167
+ if serial_number == primary_serial_number
168
+ success << "SOA Query correct for server #{ns}(#{ip})} SOA #{server_name} (#{serial_number}) #{server} - \
169
+ SOA primary server #{primary_server_name} (#{primary_serial_number}) #{primary_server}"
170
+ else
171
+ errors << "SOA Query wrong for server #{ns}(#{ip})} SOA #{server_name} (#{serial_number}) #{server} - \
172
+ SOA primary server #{primary_server_name} (#{primary_serial_number}) #{primary_server}"
173
+ end
174
+ end
175
+ end
176
+
177
+ [errors, success]
178
+ end
179
+
180
+ def run
181
+ unknown 'No domain specified' if config[:domain].nil?
182
+
183
+ entries = resolve_ns
184
+ errors, success = check_results(entries)
185
+ percent = success.count.to_f / (success.count.to_f + errors.count.to_f) * 100
186
+ if percent < config[:threshold]
187
+ output = "#{percent.to_i}% of tests succeeded: #{errors.uniq.join(", \n")}"
188
+ config[:warn_only] ? warning(output) : critical(output)
189
+ else
190
+ ok(success.uniq.join(", \n"))
191
+ end
192
+ end
193
+ end
data/bin/check-dns.rb CHANGED
@@ -133,7 +133,7 @@ class DNS < Sensu::Plugin::Check::CLI
133
133
  begin
134
134
  entry = resolv.query(config[:domain], config[:type], config[:class])
135
135
  resolv.query_timeout = config[:timeout]
136
- rescue => e
136
+ rescue StandardError => e
137
137
  entry = e
138
138
  end
139
139
  entries << entry
@@ -155,7 +155,7 @@ class DNS < Sensu::Plugin::Check::CLI
155
155
  if answer.match(regex)
156
156
  ok "Resolved #{config[:domain]} #{config[:type]} matched #{regex}"
157
157
  end
158
- end # b.each()
158
+ end
159
159
  critical "Resolved #{config[:domain]} #{config[:type]} did not match #{regex}"
160
160
  end
161
161
 
data/bin/metrics-dns.rb CHANGED
@@ -78,7 +78,7 @@ class DNSGraphite < Sensu::Plugin::Metric::CLI::Graphite
78
78
  output "#{config[:scheme]}.#{config[:type]}.#{key_name}.response_time", result.to_f.round(8)
79
79
  rescue Dnsruby::NXDomain
80
80
  critical "Could not resolve #{config[:domain]} #{config[:type]} record"
81
- rescue => e
81
+ rescue StandardError => e
82
82
  unknown e
83
83
  end
84
84
 
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SensuPluginsDNS
2
4
  module Version
3
- MAJOR = 1
4
- MINOR = 4
5
- PATCH = 1
5
+ MAJOR = 2
6
+ MINOR = -
7
+ PATCH = 0
6
8
 
7
9
  VER_STRING = [MAJOR, MINOR, PATCH].compact.join('.')
8
10
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu-plugins-dns
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sensu Plugins and contributors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-16 00:00:00.000000000 Z
11
+ date: 2018-03-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sensu-plugin
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.7'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.7'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: dnsruby
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -45,61 +59,61 @@ dependencies:
45
59
  - !ruby/object:Gem::Version
46
60
  version: 1.59.2
47
61
  - !ruby/object:Gem::Dependency
48
- name: public_suffix
62
+ name: codeclimate-test-reporter
49
63
  requirement: !ruby/object:Gem::Requirement
50
64
  requirements:
51
65
  - - "~>"
52
66
  - !ruby/object:Gem::Version
53
- version: '2'
54
- type: :runtime
67
+ version: '0.4'
68
+ type: :development
55
69
  prerelease: false
56
70
  version_requirements: !ruby/object:Gem::Requirement
57
71
  requirements:
58
72
  - - "~>"
59
73
  - !ruby/object:Gem::Version
60
- version: '2'
74
+ version: '0.4'
61
75
  - !ruby/object:Gem::Dependency
62
- name: bundler
76
+ name: github-markup
63
77
  requirement: !ruby/object:Gem::Requirement
64
78
  requirements:
65
79
  - - "~>"
66
80
  - !ruby/object:Gem::Version
67
- version: '1.7'
81
+ version: '1.3'
68
82
  type: :development
69
83
  prerelease: false
70
84
  version_requirements: !ruby/object:Gem::Requirement
71
85
  requirements:
72
86
  - - "~>"
73
87
  - !ruby/object:Gem::Version
74
- version: '1.7'
88
+ version: '1.3'
75
89
  - !ruby/object:Gem::Dependency
76
- name: codeclimate-test-reporter
90
+ name: whois
77
91
  requirement: !ruby/object:Gem::Requirement
78
92
  requirements:
79
93
  - - "~>"
80
94
  - !ruby/object:Gem::Version
81
- version: '0.4'
82
- type: :development
95
+ version: '4.0'
96
+ type: :runtime
83
97
  prerelease: false
84
98
  version_requirements: !ruby/object:Gem::Requirement
85
99
  requirements:
86
100
  - - "~>"
87
101
  - !ruby/object:Gem::Version
88
- version: '0.4'
102
+ version: '4.0'
89
103
  - !ruby/object:Gem::Dependency
90
- name: github-markup
104
+ name: whois-parser
91
105
  requirement: !ruby/object:Gem::Requirement
92
106
  requirements:
93
107
  - - "~>"
94
108
  - !ruby/object:Gem::Version
95
- version: '1.3'
96
- type: :development
109
+ version: '1.0'
110
+ type: :runtime
97
111
  prerelease: false
98
112
  version_requirements: !ruby/object:Gem::Requirement
99
113
  requirements:
100
114
  - - "~>"
101
115
  - !ruby/object:Gem::Version
102
- version: '1.3'
116
+ version: '1.0'
103
117
  - !ruby/object:Gem::Dependency
104
118
  name: kitchen-docker
105
119
  requirement: !ruby/object:Gem::Requirement
@@ -210,14 +224,14 @@ dependencies:
210
224
  requirements:
211
225
  - - "~>"
212
226
  - !ruby/object:Gem::Version
213
- version: 0.49.0
227
+ version: 0.51.0
214
228
  type: :development
215
229
  prerelease: false
216
230
  version_requirements: !ruby/object:Gem::Requirement
217
231
  requirements:
218
232
  - - "~>"
219
233
  - !ruby/object:Gem::Version
220
- version: 0.49.0
234
+ version: 0.51.0
221
235
  - !ruby/object:Gem::Dependency
222
236
  name: test-kitchen
223
237
  requirement: !ruby/object:Gem::Requirement
@@ -238,19 +252,20 @@ dependencies:
238
252
  requirements:
239
253
  - - "~>"
240
254
  - !ruby/object:Gem::Version
241
- version: '0.8'
255
+ version: 0.9.11
242
256
  type: :development
243
257
  prerelease: false
244
258
  version_requirements: !ruby/object:Gem::Requirement
245
259
  requirements:
246
260
  - - "~>"
247
261
  - !ruby/object:Gem::Version
248
- version: '0.8'
262
+ version: 0.9.11
249
263
  description: |-
250
264
  This plugin provides native DNS instrumentation
251
265
  for monitoring, including: record resolution
252
266
  email: "<sensu-users@googlegroups.com>"
253
267
  executables:
268
+ - check-dns-zone.rb
254
269
  - metrics-dns.rb
255
270
  - check-dns.rb
256
271
  extensions: []
@@ -259,6 +274,7 @@ files:
259
274
  - CHANGELOG.md
260
275
  - LICENSE
261
276
  - README.md
277
+ - bin/check-dns-zone.rb
262
278
  - bin/check-dns.rb
263
279
  - bin/metrics-dns.rb
264
280
  - lib/sensu-plugins-dns.rb
@@ -281,7 +297,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
281
297
  requirements:
282
298
  - - ">="
283
299
  - !ruby/object:Gem::Version
284
- version: 2.0.0
300
+ version: 2.2.0
285
301
  required_rubygems_version: !ruby/object:Gem::Requirement
286
302
  requirements:
287
303
  - - ">="
@@ -289,7 +305,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
289
305
  version: '0'
290
306
  requirements: []
291
307
  rubyforge_project:
292
- rubygems_version: 2.7.7
308
+ rubygems_version: 2.7.6
293
309
  signing_key:
294
310
  specification_version: 4
295
311
  summary: Sensu plugins for dns