sensu-plugins-dns 1.1.0 → 1.2.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
  SHA1:
3
- metadata.gz: 664c93fc6c8a257e432477013bb4c30ca3e65dcc
4
- data.tar.gz: 62dd7664dfedde6cabc6aa218347f35bf93997a5
3
+ metadata.gz: 4ea5d5beab135be6075b0d6852baed6faee580ff
4
+ data.tar.gz: 9a96a200a5b29a3b825d854511b0c07d7e0a8fe3
5
5
  SHA512:
6
- metadata.gz: ffa2592d77b836dd07b2a8ebdbd9cea08f6b4f84700a64a4867908303b083a571df07c8d2766f1d15122ccfcaa73be8e8691e46a379ad8b68f43e3e35387501f
7
- data.tar.gz: f9834ffedaf0c1fee9d0eaa287896eb547625d4c38ee2532c4d2a9d4fc2e9e9fd39379fb9bb957c27f12f7aaa2e59061513a53404b13b13c8a17eb9f7334d125
6
+ metadata.gz: 08a0d341fdae3693ad67acb449ed7774ac82684686a59b468001c7757429e176d3a063ecca927bac9982996146bce8fb9cb0428ab1dd07a75c20a516a977d419
7
+ data.tar.gz: ecc6d2fb556c02325f110727f27f4407b98ff2612989a7075d5154c8be3640c16e015ae2745df25cf1aea85c84da38b7cf7f948fb52374a914d7088b1a521e95
data/CHANGELOG.md CHANGED
@@ -4,6 +4,10 @@ This project adheres to [Semantic Versioning](http://semver.org/).
4
4
  This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachangelog.com/)
5
5
 
6
6
  ## [Unreleased]
7
+ ## [1.2.0] - 2017-05-16
8
+ ### Added
9
+ - Add support for making multiple requests, with a threshold for success
10
+
7
11
  ## [1.1.0]
8
12
  ### Added
9
13
  - Added option for DNS server port (@apriljo)
@@ -49,7 +53,8 @@ This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachang
49
53
  ### Changed
50
54
  - removed cruft from /lib
51
55
 
52
- [Unreleased]: https://github.com/sensu-plugins/sensu-plugins-dns/compare/1.1.0...HEAD
56
+ [Unreleased]: https://github.com/sensu-plugins/sensu-plugins-dns/compare/1.2.0...HEAD
57
+ [1.2.0]: https://github.com/sensu-plugins/sensu-plugins-dns/compare/1.1.0...1/1.2
53
58
  [1.1.0]: https://github.com/sensu-plugins/sensu-plugins-dns/compare/1.0.0...1/1.0
54
59
  [1.0.0]: https://github.com/sensu-plugins/sensu-plugins-dns/compare/0.0.6...1.0.0
55
60
  [0.0.6]: https://github.com/sensu-plugins/sensu-plugins-dns/compare/0.0.5...0.0.6
data/bin/check-dns.rb CHANGED
@@ -97,6 +97,20 @@ class DNS < Sensu::Plugin::Check::CLI
97
97
  long: '--use-tcp',
98
98
  boolean: true
99
99
 
100
+ option :request_count,
101
+ description: 'Number of DNS requests to send',
102
+ short: '-c COUNT',
103
+ long: '--request_count COUNT',
104
+ proc: proc(&:to_i),
105
+ default: 1
106
+
107
+ option :threshold,
108
+ description: 'Percentage of DNS queries that must succeed',
109
+ short: '-l PERCENT',
110
+ long: '--threshold PERCENT',
111
+ proc: proc(&:to_i),
112
+ default: 100
113
+
100
114
  option :timeout,
101
115
  description: 'Set timeout for query',
102
116
  short: '-T TIMEOUT',
@@ -111,9 +125,20 @@ class DNS < Sensu::Plugin::Check::CLI
111
125
  dnsruby_config[:use_tcp] = config[:use_tcp] unless config[:use_tcp].nil?
112
126
  resolv = Dnsruby::Resolver.new(dnsruby_config)
113
127
  resolv.do_validation = true if config[:validate]
114
- entries = resolv.query(config[:domain], config[:type], config[:class])
115
- resolv.query_timeout = config[:timeout]
116
- puts "Entries: #{entries}" if config[:debug]
128
+
129
+ entries = []
130
+ count = 0
131
+ while count < config[:request_count]
132
+ begin
133
+ entry = resolv.query(config[:domain], config[:type], config[:class])
134
+ resolv.query_timeout = config[:timeout]
135
+ rescue => e
136
+ entry = e
137
+ end
138
+ entries << entry
139
+ puts "Entry #{count}: #{entry}" if config[:debug]
140
+ count += 1
141
+ end
117
142
 
118
143
  entries
119
144
  end
@@ -133,6 +158,59 @@ class DNS < Sensu::Plugin::Check::CLI
133
158
  critical "Resolved #{config[:domain]} #{config[:type]} did not match #{regex}"
134
159
  end
135
160
 
161
+ def check_results(entries)
162
+ errors = []
163
+ success = []
164
+
165
+ entries.each do |entry|
166
+ if entry.class == Dnsruby::NXDomain
167
+ errors << "Could not resolve #{config[:domain]} #{config[:type]} record"
168
+ next
169
+ elsif entry.class == Dnsruby::ResolvTimeout
170
+ errors << "Could not resolve #{config[:domain]}: Query timed out"
171
+ next
172
+ elsif entry.is_a?(Exception)
173
+ errors << "Could not resolve #{config[:domain]}: #{entry}"
174
+ next
175
+ end
176
+
177
+ puts entry.answer if config[:debug]
178
+ if entry.answer.length.zero?
179
+ success << "Could not resolve #{config[:domain]} #{config[:type]} record"
180
+ elsif config[:result]
181
+ # special logic for checking ipaddresses with result
182
+ # mostly for ipv6 but decided to use the same logic for
183
+ # consistency reasons
184
+ if config[:type] == 'A' || config[:type] == 'AAAA'
185
+ check_ips(entries)
186
+ # non ip type
187
+ else
188
+ b = if entry.answer.count > 1
189
+ entry.answer.rrsets(config[:type].to_s).to_s
190
+ else
191
+ entry.answer.first.to_s
192
+ end
193
+ if b.include?(config[:result])
194
+ success << "Resolved #{entry.security_level} #{config[:domain]} #{config[:type]} included #{config[:result]}"
195
+ else
196
+ errors << "Resolved #{config[:domain]} #{config[:type]} did not include #{config[:result]}"
197
+ end
198
+ end
199
+ elsif config[:regex]
200
+ check_against_regex(entry, Regexp.new(config[:regex]))
201
+
202
+ elsif config[:validate]
203
+ if entry.security_level != 'SECURE'
204
+ error << "Resolved #{entry.security_level} #{config[:domain]} #{config[:type]}"
205
+ end
206
+ success << "Resolved #{entry.security_level} #{config[:domain]} #{config[:type]}"
207
+ else
208
+ success << "Resolved #{config[:domain]} #{config[:type]}"
209
+ end
210
+ end
211
+ [errors, success]
212
+ end
213
+
136
214
  def check_ips(entries)
137
215
  ips = entries.answer.rrsets(config[:type]).flat_map(&:rrs).map(&:address).map(&:to_s)
138
216
  result = IPAddr.new config[:result]
@@ -145,52 +223,17 @@ class DNS < Sensu::Plugin::Check::CLI
145
223
 
146
224
  def run
147
225
  unknown 'No domain specified' if config[:domain].nil?
226
+ unknown 'Count must be 1 or more' if config[:request_count] < 1
148
227
 
149
- begin
150
- entries = resolve_domain
151
- rescue Dnsruby::NXDomain
152
- output = "Could not resolve #{config[:domain]} #{config[:type]} record"
153
- critical(output)
154
- return
155
- rescue => e
156
- output = "Could not resolve #{config[:domain]}: #{e}"
157
- config[:warn_only] ? warning(output) : critical(output)
158
- return
159
- end
160
- puts entries.answer if config[:debug]
161
- if entries.answer.length.zero?
162
- output = "Could not resolve #{config[:domain]} #{config[:type]} record"
163
- config[:warn_only] ? warning(output) : critical(output)
164
- elsif config[:result]
165
- # special logic for checking ipaddresses with result
166
- # mostly for ipv6 but decided to use the same logic for
167
- # consistency reasons
168
- if config[:type] == 'A' || config[:type] == 'AAAA'
169
- check_ips(entries)
170
- # non ip type
171
- else
172
- b = if entries.answer.count > 1
173
- entries.answer.rrsets(config[:type].to_s).to_s
174
- else
175
- entries.answer.first.to_s
176
- end
177
- if b.include?(config[:result])
178
- ok "Resolved #{entries.security_level} #{config[:domain]} #{config[:type]} included #{config[:result]}"
179
- else
180
- critical "Resolved #{config[:domain]} #{config[:type]} did not include #{config[:result]}"
181
- end
182
- end
183
-
184
- elsif config[:regex]
185
- check_against_regex(entries, Regexp.new(config[:regex]))
228
+ entries = resolve_domain
229
+ errors, success = check_results(entries)
186
230
 
187
- elsif config[:validate]
188
- if entries.security_level != 'SECURE'
189
- critical "Resolved #{entries.security_level} #{config[:domain]} #{config[:type]}"
190
- end
191
- ok "Resolved #{entries.security_level} #{config[:domain]} #{config[:type]}"
231
+ percent = success.count.to_f / config[:request_count] * 100
232
+ if percent < config[:threshold]
233
+ output = "#{percent.to_i}% of tests succeeded: #{errors.uniq.join(', ')}"
234
+ config[:warn_only] ? warning(output) : critical(output)
192
235
  else
193
- ok "Resolved #{config[:domain]} #{config[:type]}"
236
+ ok(success.uniq.join(', '))
194
237
  end
195
238
  end
196
239
  end
@@ -1,7 +1,7 @@
1
1
  module SensuPluginsDNS
2
2
  module Version
3
3
  MAJOR = 1
4
- MINOR = 1
4
+ MINOR = 2
5
5
  PATCH = 0
6
6
 
7
7
  VER_STRING = [MAJOR, MINOR, PATCH].compact.join('.')
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.1.0
4
+ version: 1.2.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: 2017-05-07 00:00:00.000000000 Z
11
+ date: 2017-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sensu-plugin