sensu-plugins-dns 1.1.0 → 1.2.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
  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