sensu 0.20.6-java → 0.21.0-java

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: c0a54f2050a55757840257922d75b5fc25b2ecb2
4
- data.tar.gz: f74d4efbc2ba470a991b09fc2fe3e1d026c28364
3
+ metadata.gz: ba8ef39150e8ccea80ed1c70c3505883adcd96ca
4
+ data.tar.gz: 9a68124c0830410ab045359d95d38bf386954927
5
5
  SHA512:
6
- metadata.gz: 6432bd38ff20bbd9879b8bdfbf54a525d24620adff8f34625a2b182a0da0db8842afe65930447999379ecc83ff12baeb143b8410d283a2a634d7a24b6b2dedf6
7
- data.tar.gz: b2e98918ef1b2e8ae76e7bb84335a5b7e33adbbf8380f080ff1e032a94dad7e17be6316098137faeee0341153b3b845b8c363e3fbf25543ec01b9cc138a4fe27
6
+ metadata.gz: de923be5fff12555e295791fb0fc50a57f89470affb79580b5e5347a37188688e3230d166f4c696c3c1dd4161cc4bf9b0af7086b82cb08268369a34271c64ce2
7
+ data.tar.gz: d077590556a9fea40603a0404b852b5f6eb34a21c331c22633b749d9e69faf6323b62b864b00871a0b9e0f66977ad84b0e97dbf58b43b186afccc8ec27c10496
data/CHANGELOG.md CHANGED
@@ -1,3 +1,48 @@
1
+ ## 0.21.0 - 2015-11-13
2
+
3
+ ### Features
4
+
5
+ Added a Sensu plugin installation tool, `sensu-install`, making it easier
6
+ to install Sensu community plugins. The `sensu-install` tool will use the
7
+ appropriate Ruby when installing plugins. The tool aims to produce verbose
8
+ and useful output to help when debugging plugin installation issues.
9
+
10
+ Added the Sensu API DELETE /results/:client/:check endpoint, supporting
11
+ check result deletion via the Sensu API. This feature allows users to
12
+ clean up "stale" check result data for checks that have been removed.
13
+
14
+ Added the Sensu API POST /results endpoint, supporting check result input
15
+ via the Sensu API. The JIT client feature added in 0.20 enabled this
16
+ functionality. Services that do not have access to a local Sensu client
17
+ socket can make use of this feature.
18
+
19
+ ### Other
20
+
21
+ Improved the Sensu test suite to reduce the number of timeout triggered
22
+ failures. These changes make Sensu development much more pleasant.
23
+
24
+ Fixed a few inline documentation typos, e.g. sbuded -> subdued.
25
+
26
+ Moved the Sensu bins (e.g. `sensu-client`) from `bin` to `exe` to avoid
27
+ the conflict with Ruby bundler bin stubs.
28
+
29
+ Fixed Sensu API and client socket input validation, no longer accepting
30
+ multi-line values.
31
+
32
+ Fixed check request publishing for checks that make use of check
33
+ extensions, e.g. `"extension": "check_http_endpoints`.
34
+
35
+ Fixed the handler `"filters"` bug that caused Sensu to mutate handler
36
+ definitions, removing filters for successive executions.
37
+
38
+ Fixed Sensu API POST /request endpoint check request publishing to
39
+ round-robin client subscriptions.
40
+
41
+ Fixed the Windows job handle leak when spawning processes for checks.
42
+
43
+ Updated the Redis client library (em-redis-unified) to remove duplicate
44
+ Ruby hash key warnings.
45
+
1
46
  ## 0.20.6 - 2015-09-22
2
47
 
3
48
  ### Other
File without changes
File without changes
data/exe/sensu-install ADDED
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "optparse"
4
+
5
+ module Sensu
6
+ class Install
7
+ class << self
8
+ def cli_options(arguments=ARGV)
9
+ options = {
10
+ :verbose => false,
11
+ :plugins => []
12
+ }
13
+ optparse = OptionParser.new do |opts|
14
+ opts.on("-h", "--help", "Display this message") do
15
+ puts opts
16
+ exit
17
+ end
18
+ opts.on("-v", "--verbose", "Enable verbose logging") do
19
+ options[:verbose] = true
20
+ end
21
+ opts.on("-p", "--plugin PLUGIN", "Install a Sensu PLUGIN") do |plugin|
22
+ options[:plugins] << plugin
23
+ end
24
+ opts.on("-P", "--plugins PLUGIN[,PLUGIN]", "PLUGIN or comma-delimited list of Sensu plugins to install") do |plugins|
25
+ options[:plugins].concat(plugins.split(","))
26
+ end
27
+ opts.on("-s", "--source SOURCE", "Install Sensu plugins from a custom SOURCE") do |source|
28
+ options[:source] = source
29
+ end
30
+ end
31
+ optparse.parse!(arguments)
32
+ options
33
+ end
34
+
35
+ def log(message)
36
+ puts "[SENSU-INSTALL] #{message}"
37
+ end
38
+
39
+ def install_plugins(plugins, options={})
40
+ log "installing Sensu plugins ..."
41
+ log "provided Sensu plugins: #{plugins}" if options[:verbose]
42
+ gems = plugins.map do |plugin|
43
+ if plugin.start_with?("sensu-plugins-")
44
+ plugin
45
+ else
46
+ "sensu-plugins-#{plugin}"
47
+ end
48
+ end
49
+ log "Sensu plugin gems to be installed: #{gems}" if options[:verbose]
50
+ gem_options = "--no-ri --no-rdoc"
51
+ gem_options << " --verbose" if options[:verbose]
52
+ gem_options << " --source #{options[:source]}" if options[:source]
53
+ gems.each do |gem|
54
+ log "installing Sensu plugin gem: #{gem}"
55
+ gem_command = "gem install #{gem} #{gem_options}"
56
+ log gem_command if options[:verbose]
57
+ unless system(gem_command)
58
+ log "failed to install Sensu plugin gem: #{gem}"
59
+ log "you can run the sensu-install command again with --verbose for more info" unless options[:verbose]
60
+ log "please take note of any failure messages above"
61
+ log "make sure you have build tools installed (e.g. gcc)"
62
+ log "trying to determine Sensu plugin homepage for #{gem} ..."
63
+ clean_gem = gem.split(":").first
64
+ system("gem specification #{clean_gem} -r | grep homepage")
65
+ exit 2
66
+ end
67
+ end
68
+ log "successfully install Sensu plugins: #{plugins}"
69
+ end
70
+
71
+ def run
72
+ options = cli_options
73
+ unless options[:plugins].empty?
74
+ install_plugins(options[:plugins], options)
75
+ else
76
+ log "nothing to do"
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+ Sensu::Install.run
File without changes
@@ -177,7 +177,8 @@ module Sensu
177
177
  valid = rules.all? do |key, rule|
178
178
  value = data[key]
179
179
  (value.is_a?(rule[:type]) || (rule[:nil_ok] && value.nil?)) &&
180
- rule[:regex].nil? || (rule[:regex] && (value =~ rule[:regex]) == 0)
180
+ (value.nil? || rule[:regex].nil?) ||
181
+ (rule[:regex] && (value =~ rule[:regex]) == 0)
181
182
  end
182
183
  if valid
183
184
  callback.call(data)
@@ -190,7 +191,7 @@ module Sensu
190
191
  end
191
192
 
192
193
  def integer_parameter(parameter)
193
- parameter =~ /^[0-9]+$/ ? parameter.to_i : nil
194
+ parameter =~ /\A[0-9]+\z/ ? parameter.to_i : nil
194
195
  end
195
196
 
196
197
  def pagination(items)
@@ -234,18 +235,12 @@ module Sensu
234
235
  end
235
236
  end
236
237
 
237
- def resolve_event(event_json)
238
- event = MultiJson.load(event_json)
239
- check = event[:check].merge(
240
- :output => "Resolving on request of the API",
241
- :status => 0,
242
- :issued => Time.now.to_i,
243
- :executed => Time.now.to_i,
244
- :force_resolve => true
245
- )
246
- check.delete(:history)
238
+ def publish_check_result(client_name, check)
239
+ check[:issued] = Time.now.to_i
240
+ check[:executed] = Time.now.to_i
241
+ check[:status] ||= 0
247
242
  payload = {
248
- :client => event[:client][:name],
243
+ :client => client_name,
249
244
  :check => check
250
245
  }
251
246
  settings.logger.info("publishing check result", :payload => payload)
@@ -258,6 +253,47 @@ module Sensu
258
253
  end
259
254
  end
260
255
  end
256
+
257
+ def resolve_event(event_json)
258
+ event = MultiJson.load(event_json)
259
+ check = event[:check].merge(
260
+ :output => "Resolving on request of the API",
261
+ :status => 0,
262
+ :force_resolve => true
263
+ )
264
+ check.delete(:history)
265
+ publish_check_result(event[:client][:name], check)
266
+ end
267
+
268
+ def transport_publish_options(subscription, message)
269
+ _, raw_type = subscription.split(":", 2).reverse
270
+ case raw_type
271
+ when "direct", "roundrobin"
272
+ [:direct, subscription, message]
273
+ else
274
+ [:fanout, subscription, message]
275
+ end
276
+ end
277
+
278
+ def publish_check_request(check)
279
+ payload = check.merge(:issued => Time.now.to_i)
280
+ settings.logger.info("publishing check request", {
281
+ :payload => payload,
282
+ :subscribers => check[:subscribers]
283
+ })
284
+ check[:subscribers].each do |subscription|
285
+ options = transport_publish_options(subscription.to_s, MultiJson.dump(payload))
286
+ settings.transport.publish(*options) do |info|
287
+ if info[:error]
288
+ settings.logger.error("failed to publish check request", {
289
+ :subscription => subscription,
290
+ :payload => payload,
291
+ :error => info[:error].to_s
292
+ })
293
+ end
294
+ end
295
+ end
296
+ end
261
297
  end
262
298
 
263
299
  before do
@@ -311,7 +347,7 @@ module Sensu
311
347
 
312
348
  apost "/clients/?" do
313
349
  rules = {
314
- :name => {:type => String, :nil_ok => false, :regex => /^[\w\.-]+$/},
350
+ :name => {:type => String, :nil_ok => false, :regex => /\A[\w\.-]+\z/},
315
351
  :address => {:type => String, :nil_ok => false},
316
352
  :subscriptions => {:type => Array, :nil_ok => false}
317
353
  }
@@ -459,28 +495,11 @@ module Sensu
459
495
  }
460
496
  read_data(rules) do |data|
461
497
  if settings.checks[data[:check]]
462
- check = settings.checks[data[:check]]
463
- subscribers = data[:subscribers] || check[:subscribers] || Array.new
464
- payload = {
465
- :name => data[:check],
466
- :command => check[:command],
467
- :issued => Time.now.to_i
468
- }
469
- settings.logger.info("publishing check request", {
470
- :payload => payload,
471
- :subscribers => subscribers
472
- })
473
- subscribers.uniq.each do |exchange_name|
474
- settings.transport.publish(:fanout, exchange_name.to_s, MultiJson.dump(payload)) do |info|
475
- if info[:error]
476
- settings.logger.error("failed to publish check request", {
477
- :exchange_name => exchange_name,
478
- :payload => payload,
479
- :error => info[:error].to_s
480
- })
481
- end
482
- end
483
- end
498
+ check = settings.checks[data[:check]].dup
499
+ check[:name] = data[:check]
500
+ check[:subscribers] ||= Array.new
501
+ check[:subscribers] = data[:subscribers] if data[:subscribers]
502
+ publish_check_request(check)
484
503
  issued!
485
504
  else
486
505
  not_found!
@@ -743,6 +762,19 @@ module Sensu
743
762
  end
744
763
  end
745
764
 
765
+ apost "/results/?" do
766
+ rules = {
767
+ :name => {:type => String, :nil_ok => false, :regex => /\A[\w\.-]+\z/},
768
+ :output => {:type => String, :nil_ok => false},
769
+ :status => {:type => Integer, :nil_ok => true},
770
+ :source => {:type => String, :nil_ok => true, :regex => /\A[\w\.-]+\z/}
771
+ }
772
+ read_data(rules) do |data|
773
+ publish_check_result("sensu-api", data)
774
+ issued!
775
+ end
776
+ end
777
+
746
778
  aget "/results/?" do
747
779
  response = Array.new
748
780
  settings.redis.smembers("clients") do |clients|
@@ -807,6 +839,21 @@ module Sensu
807
839
  end
808
840
  end
809
841
  end
842
+
843
+ adelete %r{^/results?/([\w\.-]+)/([\w\.-]+)/?$} do |client_name, check_name|
844
+ result_key = "result:#{client_name}:#{check_name}"
845
+ settings.redis.exists(result_key) do |result_exists|
846
+ if result_exists
847
+ settings.redis.srem("result:#{client_name}", check_name) do
848
+ settings.redis.del(result_key) do |result_json|
849
+ no_content!
850
+ end
851
+ end
852
+ else
853
+ not_found!
854
+ end
855
+ end
856
+ end
810
857
  end
811
858
  end
812
859
  end
@@ -116,10 +116,10 @@ module Sensu
116
116
  #
117
117
  # @param [Hash] check result to validate.
118
118
  def validate_check_result(check)
119
- unless check[:name] =~ /^[\w\.-]+$/
119
+ unless check[:name] =~ /\A[\w\.-]+\z/
120
120
  raise DataError, "check name must be a string and cannot contain spaces or special characters"
121
121
  end
122
- unless check[:source].nil? || check[:source] =~ /^[\w\.-]+$/
122
+ unless check[:source].nil? || check[:source] =~ /\A[\w\.-]+\z/
123
123
  raise DataError, "check source must be a string and cannot contain spaces or special characters"
124
124
  end
125
125
  unless check[:output].is_a?(String)
@@ -1,7 +1,7 @@
1
1
  module Sensu
2
2
  unless defined?(Sensu::VERSION)
3
3
  # Sensu release version.
4
- VERSION = "0.20.6"
4
+ VERSION = "0.21.0"
5
5
 
6
6
  # Sensu check severities.
7
7
  SEVERITIES = %w[ok warning critical unknown]
data/lib/sensu/daemon.rb CHANGED
@@ -5,10 +5,10 @@ gem "eventmachine", "1.0.8"
5
5
 
6
6
  gem "sensu-logger", "1.1.0"
7
7
  gem "sensu-settings", "3.1.0"
8
- gem "sensu-extension", "1.2.0"
9
- gem "sensu-extensions", "1.3.0"
8
+ gem "sensu-extension", "1.3.0"
9
+ gem "sensu-extensions", "1.4.0"
10
10
  gem "sensu-transport", "3.3.0"
11
- gem "sensu-spawn", "1.5.0"
11
+ gem "sensu-spawn", "1.6.0"
12
12
 
13
13
  require "time"
14
14
  require "uri"
data/lib/sensu/redis.rb CHANGED
@@ -1,4 +1,4 @@
1
- gem "em-redis-unified", "1.0.0"
1
+ gem "em-redis-unified", "1.0.1"
2
2
 
3
3
  require "em-redis-unified"
4
4
 
@@ -179,7 +179,7 @@ module Sensu
179
179
  # @return [TrueClass, FalseClass]
180
180
  def eval_attribute_value(raw_eval_string, value)
181
181
  begin
182
- eval_string = raw_eval_string.gsub(/^eval:(\s+)?/, "")
182
+ eval_string = raw_eval_string.gsub(/\Aeval:(\s+)?/, "")
183
183
  !!Sandbox.eval(eval_string, value)
184
184
  rescue => error
185
185
  @logger.error("filter attribute eval error", {
@@ -258,7 +258,7 @@ module Sensu
258
258
  # @param callback [Proc]
259
259
  def event_filtered?(handler, event, &callback)
260
260
  if handler.has_key?(:filters) || handler.has_key?(:filter)
261
- filter_list = Array(handler[:filters] || handler[:filter])
261
+ filter_list = Array(handler[:filters] || handler[:filter]).dup
262
262
  filter = Proc.new do |filter_list|
263
263
  filter_name = filter_list.shift
264
264
  if filter_name.nil?
@@ -278,7 +278,7 @@ module Sensu
278
278
  # Attempt to filter an event for a handler. This method will
279
279
  # check to see if handling is disabled, if the event action is
280
280
  # handled, if the event check severity is handled, if the
281
- # handler is sbuded, and if the event is filtered by any of the
281
+ # handler is subdued, and if the event is filtered by any of the
282
282
  # filters specified in the handler definition.
283
283
  #
284
284
  # @param handler [Hash] definition.
@@ -483,12 +483,12 @@ module Sensu
483
483
  end
484
484
 
485
485
  # Publish a check request to the transport. A check request is
486
- # composted of a check `:name`, an `:issued` timestamp, and a
487
- # check `:command` if available. The check request is published
488
- # to a transport pipe, for each of the check `:subscribers` in
489
- # its definition, eg. "webserver". JSON serialization is used
490
- # when publishing the check request payload to the transport
491
- # pipes. Transport errors are logged.
486
+ # composed of a check `:name`, an `:issued` timestamp, a check
487
+ # `:command` if available, and a check `:extension if available.
488
+ # The check request is published to a transport pipe, for each
489
+ # of the check `:subscribers` in its definition, eg. "webserver".
490
+ # JSON serialization is used when publishing the check request
491
+ # payload to the transport pipes. Transport errors are logged.
492
492
  #
493
493
  # @param check [Hash] definition.
494
494
  def publish_check_request(check)
@@ -498,6 +498,7 @@ module Sensu
498
498
  }
499
499
  payload[:command] = check[:command] if check.has_key?(:command)
500
500
  payload[:source] = check[:source] if check.has_key?(:source)
501
+ payload[:extension] = check[:extension] if check.has_key?(:extension)
501
502
  @logger.info("publishing check request", {
502
503
  :payload => payload,
503
504
  :subscribers => check[:subscribers]
data/sensu.gemspec CHANGED
@@ -19,11 +19,11 @@ Gem::Specification.new do |s|
19
19
  s.add_dependency "eventmachine", "1.0.8"
20
20
  s.add_dependency "sensu-logger", "1.1.0"
21
21
  s.add_dependency "sensu-settings", "3.1.0"
22
- s.add_dependency "sensu-extension", "1.2.0"
23
- s.add_dependency "sensu-extensions", "1.3.0"
22
+ s.add_dependency "sensu-extension", "1.3.0"
23
+ s.add_dependency "sensu-extensions", "1.4.0"
24
24
  s.add_dependency "sensu-transport", "3.3.0"
25
- s.add_dependency "sensu-spawn", "1.5.0"
26
- s.add_dependency "em-redis-unified", "1.0.0"
25
+ s.add_dependency "sensu-spawn", "1.6.0"
26
+ s.add_dependency "em-redis-unified", "1.0.1"
27
27
  s.add_dependency "sinatra", "1.4.6"
28
28
  s.add_dependency "async_sinatra", "1.2.0"
29
29
  s.add_dependency "thin", "1.6.3" unless RUBY_PLATFORM =~ /java/
@@ -32,7 +32,8 @@ Gem::Specification.new do |s|
32
32
  s.add_development_dependency "rspec", "~> 3.0.0"
33
33
  s.add_development_dependency "em-http-request", "~> 1.1"
34
34
 
35
- s.files = Dir.glob("{bin,lib}/**/*") + %w[sensu.gemspec README.md CHANGELOG.md MIT-LICENSE.txt]
36
- s.executables = Dir.glob("bin/**/*").map { |file| File.basename(file) }
35
+ s.files = Dir.glob("{exe,lib}/**/*") + %w[sensu.gemspec README.md CHANGELOG.md MIT-LICENSE.txt]
36
+ s.executables = s.files.grep(%r{^exe/}) { |file| File.basename(file) }
37
+ s.bindir = "exe"
37
38
  s.require_paths = ["lib"]
38
39
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.20.6
4
+ version: 0.21.0
5
5
  platform: java
6
6
  authors:
7
7
  - Sean Porter
8
8
  - Justin Kolberg
9
9
  autorequire:
10
- bindir: bin
10
+ bindir: exe
11
11
  cert_chain: []
12
- date: 2015-09-22 00:00:00.000000000 Z
12
+ date: 2015-11-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: multi_json
@@ -87,12 +87,12 @@ dependencies:
87
87
  requirements:
88
88
  - - '='
89
89
  - !ruby/object:Gem::Version
90
- version: 1.2.0
90
+ version: 1.3.0
91
91
  requirement: !ruby/object:Gem::Requirement
92
92
  requirements:
93
93
  - - '='
94
94
  - !ruby/object:Gem::Version
95
- version: 1.2.0
95
+ version: 1.3.0
96
96
  prerelease: false
97
97
  type: :runtime
98
98
  - !ruby/object:Gem::Dependency
@@ -101,12 +101,12 @@ dependencies:
101
101
  requirements:
102
102
  - - '='
103
103
  - !ruby/object:Gem::Version
104
- version: 1.3.0
104
+ version: 1.4.0
105
105
  requirement: !ruby/object:Gem::Requirement
106
106
  requirements:
107
107
  - - '='
108
108
  - !ruby/object:Gem::Version
109
- version: 1.3.0
109
+ version: 1.4.0
110
110
  prerelease: false
111
111
  type: :runtime
112
112
  - !ruby/object:Gem::Dependency
@@ -129,12 +129,12 @@ dependencies:
129
129
  requirements:
130
130
  - - '='
131
131
  - !ruby/object:Gem::Version
132
- version: 1.5.0
132
+ version: 1.6.0
133
133
  requirement: !ruby/object:Gem::Requirement
134
134
  requirements:
135
135
  - - '='
136
136
  - !ruby/object:Gem::Version
137
- version: 1.5.0
137
+ version: 1.6.0
138
138
  prerelease: false
139
139
  type: :runtime
140
140
  - !ruby/object:Gem::Dependency
@@ -143,12 +143,12 @@ dependencies:
143
143
  requirements:
144
144
  - - '='
145
145
  - !ruby/object:Gem::Version
146
- version: 1.0.0
146
+ version: 1.0.1
147
147
  requirement: !ruby/object:Gem::Requirement
148
148
  requirements:
149
149
  - - '='
150
150
  - !ruby/object:Gem::Version
151
- version: 1.0.0
151
+ version: 1.0.1
152
152
  prerelease: false
153
153
  type: :runtime
154
154
  - !ruby/object:Gem::Dependency
@@ -226,15 +226,17 @@ email:
226
226
  - portertech@gmail.com
227
227
  - amdprophet@gmail.com
228
228
  executables:
229
+ - sensu-install
229
230
  - sensu-server
230
231
  - sensu-client
231
232
  - sensu-api
232
233
  extensions: []
233
234
  extra_rdoc_files: []
234
235
  files:
235
- - bin/sensu-server
236
- - bin/sensu-client
237
- - bin/sensu-api
236
+ - exe/sensu-install
237
+ - exe/sensu-server
238
+ - exe/sensu-client
239
+ - exe/sensu-api
238
240
  - lib/sensu.rb
239
241
  - lib/sensu/constants.rb
240
242
  - lib/sensu/daemon.rb