sensu 0.9.5 → 0.9.6.beta
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.
- data/README.org +8 -42
- data/bin/sensu-api +5 -2
- data/bin/sensu-client +5 -2
- data/bin/sensu-server +5 -2
- data/lib/sensu/api.rb +125 -95
- data/lib/sensu/base.rb +57 -0
- data/lib/sensu/cli.rb +37 -0
- data/lib/sensu/client.rb +126 -129
- data/lib/sensu/constants.rb +8 -0
- data/lib/sensu/logger.rb +39 -0
- data/lib/sensu/patches/ruby.rb +4 -80
- data/lib/sensu/process.rb +57 -0
- data/lib/sensu/server.rb +229 -163
- data/lib/sensu/settings.rb +280 -0
- data/lib/sensu/socket.rb +52 -0
- data/sensu.gemspec +22 -23
- metadata +171 -185
- data/lib/sensu/config.rb +0 -266
- data/lib/sensu/version.rb +0 -3
@@ -0,0 +1,280 @@
|
|
1
|
+
module Sensu
|
2
|
+
class Settings
|
3
|
+
attr_reader :indifferent_access, :loaded_env, :loaded_files
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@logger = Cabin::Channel.get
|
7
|
+
@settings = Hash.new
|
8
|
+
@indifferent_access = false
|
9
|
+
@loaded_env = false
|
10
|
+
@loaded_files = Array.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def [](key)
|
14
|
+
unless @indifferent_access
|
15
|
+
indifferent_access!
|
16
|
+
end
|
17
|
+
@settings[key.to_sym]
|
18
|
+
end
|
19
|
+
|
20
|
+
def indifferent_access!
|
21
|
+
@settings = indifferent_access(@settings)
|
22
|
+
@indifferent_access = true
|
23
|
+
end
|
24
|
+
|
25
|
+
def load_env
|
26
|
+
if ENV['RABBITMQ_URL']
|
27
|
+
@settings[:rabbitmq] = ENV['RABBITMQ_URL']
|
28
|
+
@logger.warn('using rabbitmq url environment variable', {
|
29
|
+
:rabbitmq_url => ENV['RABBITMQ_URL']
|
30
|
+
})
|
31
|
+
end
|
32
|
+
ENV['REDIS_URL'] ||= ENV['REDISTOGO_URL']
|
33
|
+
if ENV['REDIS_URL']
|
34
|
+
@settings[:redis] = ENV['REDIS_URL']
|
35
|
+
@logger.warn('using redis url environment variable', {
|
36
|
+
:redis_url => ENV['REDIS_URL']
|
37
|
+
})
|
38
|
+
end
|
39
|
+
ENV['API_PORT'] ||= ENV['PORT']
|
40
|
+
if ENV['API_PORT']
|
41
|
+
@settings[:api] ||= Hash.new
|
42
|
+
@settings[:api][:port] = ENV['API_PORT']
|
43
|
+
@logger.warn('using api port environment variable', {
|
44
|
+
:api_port => ENV['API_PORT']
|
45
|
+
})
|
46
|
+
end
|
47
|
+
@indifferent_access = false
|
48
|
+
@loaded_env = true
|
49
|
+
end
|
50
|
+
|
51
|
+
def load_file(file)
|
52
|
+
if File.readable?(file)
|
53
|
+
begin
|
54
|
+
contents = File.open(file, 'r').read
|
55
|
+
config = JSON.parse(contents, :symbolize_names => true)
|
56
|
+
merged = deep_merge(@settings, config)
|
57
|
+
unless @loaded_files.empty?
|
58
|
+
@logger.warn('config file applied changes', {
|
59
|
+
:config_file => file,
|
60
|
+
:changes => deep_diff(@settings, merged)
|
61
|
+
})
|
62
|
+
end
|
63
|
+
@settings = merged
|
64
|
+
@indifferent_access = false
|
65
|
+
@loaded_files.push(file)
|
66
|
+
rescue JSON::ParserError => error
|
67
|
+
@logger.error('config file must be valid json', {
|
68
|
+
:config_file => file,
|
69
|
+
:error => error.to_s
|
70
|
+
})
|
71
|
+
@logger.warn('ignoring config file', {
|
72
|
+
:config_file => file
|
73
|
+
})
|
74
|
+
end
|
75
|
+
else
|
76
|
+
@logger.error('config file does not exist or is not readable', {
|
77
|
+
:config_file => file
|
78
|
+
})
|
79
|
+
@logger.warn('ignoring config file', {
|
80
|
+
:config_file => file
|
81
|
+
})
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def checks
|
86
|
+
@settings[:checks].map do |check_name, check_details|
|
87
|
+
check_details.merge(:name => check_name.to_s)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def handlers
|
92
|
+
@settings[:handlers].map do |handler_name, handler_details|
|
93
|
+
handler_details.merge(:name => handler_name.to_s)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def check_exists?(check_name)
|
98
|
+
@settings[:checks].has_key?(check_name.to_sym)
|
99
|
+
end
|
100
|
+
|
101
|
+
def handler_exists?(handler_name)
|
102
|
+
@settings[:handlers].has_key?(handler_name.to_sym)
|
103
|
+
end
|
104
|
+
|
105
|
+
def validate
|
106
|
+
@logger.debug('validating settings')
|
107
|
+
validate_checks
|
108
|
+
case File.basename($0)
|
109
|
+
when 'rake'
|
110
|
+
validate_client
|
111
|
+
validate_api
|
112
|
+
validate_server
|
113
|
+
when 'sensu-client'
|
114
|
+
validate_client
|
115
|
+
when 'sensu-api'
|
116
|
+
validate_api
|
117
|
+
when 'sensu-server'
|
118
|
+
validate_server
|
119
|
+
end
|
120
|
+
@logger.debug('settings are valid')
|
121
|
+
end
|
122
|
+
|
123
|
+
private
|
124
|
+
|
125
|
+
def indifferent_access(hash)
|
126
|
+
hash = indifferent_hash.merge(hash)
|
127
|
+
hash.each do |key, value|
|
128
|
+
if value.is_a?(Hash)
|
129
|
+
hash[key] = indifferent_access(value)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def indifferent_hash
|
135
|
+
Hash.new do |hash, key|
|
136
|
+
if key.is_a?(String)
|
137
|
+
hash[key.to_sym]
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def deep_merge(hash_one, hash_two)
|
143
|
+
merged = hash_one.dup
|
144
|
+
hash_two.each do |key, value|
|
145
|
+
merged[key] = case
|
146
|
+
when hash_one[key].is_a?(Hash) && value.is_a?(Hash)
|
147
|
+
deep_merge(hash_one[key], value)
|
148
|
+
when hash_one[key].is_a?(Array) && value.is_a?(Array)
|
149
|
+
hash_one[key].concat(value).uniq
|
150
|
+
else
|
151
|
+
value
|
152
|
+
end
|
153
|
+
end
|
154
|
+
merged
|
155
|
+
end
|
156
|
+
|
157
|
+
def deep_diff(hash_one, hash_two)
|
158
|
+
keys = hash_one.keys.concat(hash_two.keys).uniq
|
159
|
+
keys.inject(Hash.new) do |diff, key|
|
160
|
+
unless hash_one[key] == hash_two[key]
|
161
|
+
if hash_one[key].is_a?(Hash) && hash_two[key].is_a?(Hash)
|
162
|
+
diff[key] = deep_diff(hash_one[key], hash_two[key])
|
163
|
+
else
|
164
|
+
diff[key] = [hash_one[key], hash_two[key]]
|
165
|
+
end
|
166
|
+
end
|
167
|
+
diff
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def validate_checks
|
172
|
+
unless @settings[:checks].is_a?(Hash)
|
173
|
+
raise('missing check configuration')
|
174
|
+
end
|
175
|
+
checks.each do |check|
|
176
|
+
unless check[:interval].is_a?(Integer) && check[:interval] > 0
|
177
|
+
raise('missing interval for check: ' + check[:name])
|
178
|
+
end
|
179
|
+
unless check[:command].is_a?(String)
|
180
|
+
raise('missing command for check: ' + check[:name])
|
181
|
+
end
|
182
|
+
unless check[:standalone]
|
183
|
+
unless check[:subscribers].is_a?(Array) && check[:subscribers].count > 0
|
184
|
+
raise('missing subscribers for check: ' + check[:name])
|
185
|
+
end
|
186
|
+
check[:subscribers].each do |subscriber|
|
187
|
+
unless subscriber.is_a?(String) && !subscriber.empty?
|
188
|
+
raise('a check subscriber must be a string for check: ' + check[:name])
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
if check.has_key?(:handler)
|
193
|
+
unless check[:handler].is_a?(String)
|
194
|
+
raise('handler must be a string for check: ' + check[:name])
|
195
|
+
end
|
196
|
+
end
|
197
|
+
if check.has_key?(:handlers)
|
198
|
+
unless check[:handlers].is_a?(Array)
|
199
|
+
raise('handlers must be an array for check: ' + check[:name])
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
def validate_client
|
206
|
+
unless @settings[:client].is_a?(Hash)
|
207
|
+
raise('missing client configuration')
|
208
|
+
end
|
209
|
+
unless @settings[:client][:name].is_a?(String)
|
210
|
+
raise('client must have a name')
|
211
|
+
end
|
212
|
+
unless @settings[:client][:address].is_a?(String)
|
213
|
+
raise('client must have an address')
|
214
|
+
end
|
215
|
+
unless @settings[:client][:subscriptions].is_a?(Array) && @settings[:client][:subscriptions].count > 0
|
216
|
+
raise('client must have subscriptions')
|
217
|
+
end
|
218
|
+
@settings[:client][:subscriptions].each do |subscription|
|
219
|
+
unless subscription.is_a?(String) && !subscription.empty?
|
220
|
+
raise('a client subscription must be a string')
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
def validate_api
|
226
|
+
unless @settings[:api].is_a?(Hash)
|
227
|
+
raise('missing api configuration')
|
228
|
+
end
|
229
|
+
unless @settings[:api][:port].is_a?(Integer)
|
230
|
+
raise('api port must be an integer')
|
231
|
+
end
|
232
|
+
if @settings[:api].has_key?(:user) || @settings[:api].has_key?(:password)
|
233
|
+
unless @settings[:api][:user].is_a?(String)
|
234
|
+
raise('api user must be a string')
|
235
|
+
end
|
236
|
+
unless @settings[:api][:password].is_a?(String)
|
237
|
+
raise('api password must be a string')
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
def validate_server
|
243
|
+
unless @settings[:handlers].is_a?(Hash)
|
244
|
+
raise('missing handler configuration')
|
245
|
+
end
|
246
|
+
unless @settings[:handlers].include?(:default)
|
247
|
+
raise('missing default handler')
|
248
|
+
end
|
249
|
+
handlers.each do |handler|
|
250
|
+
unless handler[:type].is_a?(String)
|
251
|
+
raise('missing type for handler: ' + handler[:name])
|
252
|
+
end
|
253
|
+
case handler[:type]
|
254
|
+
when 'pipe'
|
255
|
+
unless handler[:command].is_a?(String)
|
256
|
+
raise('missing command for pipe handler: ' + handler[:name])
|
257
|
+
end
|
258
|
+
when 'amqp'
|
259
|
+
unless handler[:exchange].is_a?(Hash)
|
260
|
+
raise('missing exchange details for amqp handler: ' + handler[:name])
|
261
|
+
end
|
262
|
+
unless handler[:exchange][:name].is_a?(String)
|
263
|
+
raise('missing exchange name for amqp handler: ' + handler[:name])
|
264
|
+
end
|
265
|
+
if handler[:exchange].has_key?(:type)
|
266
|
+
unless %w[direct fanout topic].include?(handler[:exchange][:type])
|
267
|
+
raise('invalid exchange type for amqp handler: ' + handler[:name])
|
268
|
+
end
|
269
|
+
end
|
270
|
+
when 'set'
|
271
|
+
unless handler[:handlers].is_a?(Array) && handler[:handlers].count > 0
|
272
|
+
raise('missing handler set for handler: ' + handler[:name])
|
273
|
+
end
|
274
|
+
else
|
275
|
+
raise('unknown type for handler: ' + handler[:name])
|
276
|
+
end
|
277
|
+
end
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
data/lib/sensu/socket.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
module Sensu
|
2
|
+
class Socket < EM::Connection
|
3
|
+
attr_accessor :protocol, :logger, :settings, :amq
|
4
|
+
|
5
|
+
def reply(data)
|
6
|
+
if @protocol == :tcp
|
7
|
+
send_data(data)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def receive_data(data)
|
12
|
+
if data == 'ping'
|
13
|
+
@logger.debug('socket received ping')
|
14
|
+
reply('pong')
|
15
|
+
else
|
16
|
+
@logger.debug('socket received data', {
|
17
|
+
:data => data
|
18
|
+
})
|
19
|
+
begin
|
20
|
+
check = JSON.parse(data, :symbolize_names => true)
|
21
|
+
validates = [:name, :output].all? do |key|
|
22
|
+
check[key].is_a?(String)
|
23
|
+
end
|
24
|
+
check[:issued] = Time.now.to_i
|
25
|
+
check[:status] ||= 0
|
26
|
+
if validates && check[:status].is_a?(Integer)
|
27
|
+
payload = {
|
28
|
+
:client => @settings[:client][:name],
|
29
|
+
:check => check
|
30
|
+
}
|
31
|
+
@logger.info('publishing check result', {
|
32
|
+
:payload => payload
|
33
|
+
})
|
34
|
+
@amq.queue('results').publish(payload.to_json)
|
35
|
+
reply('ok')
|
36
|
+
else
|
37
|
+
@logger.warn('invalid check result', {
|
38
|
+
:check => check
|
39
|
+
})
|
40
|
+
reply('invalid')
|
41
|
+
end
|
42
|
+
rescue JSON::ParserError => error
|
43
|
+
@logger.warn('check result must be valid json', {
|
44
|
+
:data => data,
|
45
|
+
:error => error.to_s
|
46
|
+
})
|
47
|
+
reply('invalid')
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/sensu.gemspec
CHANGED
@@ -1,32 +1,31 @@
|
|
1
|
-
require File.
|
1
|
+
require File.join(File.dirname(__FILE__), 'lib', 'sensu', 'constants')
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
|
-
s.name =
|
4
|
+
s.name = 'sensu'
|
5
5
|
s.version = Sensu::VERSION
|
6
6
|
s.platform = Gem::Platform::RUBY
|
7
|
-
s.authors = [
|
8
|
-
s.email = [
|
9
|
-
s.homepage =
|
10
|
-
s.summary =
|
11
|
-
s.description =
|
12
|
-
s.license =
|
7
|
+
s.authors = ['Sean Porter', 'Justin Kolberg']
|
8
|
+
s.email = ['sean.porter@sonian.net', 'justin.kolberg@sonian.net']
|
9
|
+
s.homepage = 'https://github.com/sensu/sensu'
|
10
|
+
s.summary = 'A monitoring framework'
|
11
|
+
s.description = 'A monitoring framework that aims to be simple, malleable, and scalable. Uses the publish/subscribe model.'
|
12
|
+
s.license = 'MIT'
|
13
13
|
s.has_rdoc = false
|
14
14
|
|
15
|
-
s.add_dependency(
|
16
|
-
s.add_dependency(
|
17
|
-
s.add_dependency(
|
18
|
-
s.add_dependency(
|
19
|
-
s.add_dependency(
|
20
|
-
s.add_dependency(
|
21
|
-
s.add_dependency(
|
22
|
-
s.add_dependency(
|
23
|
-
s.add_dependency("thin")
|
15
|
+
s.add_dependency('bundler')
|
16
|
+
s.add_dependency('eventmachine', '~> 1.0.0.beta.4')
|
17
|
+
s.add_dependency('amqp', '0.7.4')
|
18
|
+
s.add_dependency('json')
|
19
|
+
s.add_dependency('cabin', '0.4.4')
|
20
|
+
s.add_dependency('ruby-redis')
|
21
|
+
s.add_dependency('async_sinatra', '1.0.0')
|
22
|
+
s.add_dependency('thin')
|
24
23
|
|
25
|
-
s.add_development_dependency(
|
26
|
-
s.add_development_dependency(
|
27
|
-
s.add_development_dependency(
|
24
|
+
s.add_development_dependency('rake')
|
25
|
+
s.add_development_dependency('em-spec')
|
26
|
+
s.add_development_dependency('em-http-request')
|
28
27
|
|
29
|
-
s.files = Dir.glob(
|
30
|
-
s.executables = Dir.glob(
|
31
|
-
s.require_paths = [
|
28
|
+
s.files = Dir.glob('{bin,lib}/**/*') + %w[sensu.gemspec README.org MIT-LICENSE.txt]
|
29
|
+
s.executables = Dir.glob('bin/**/*').map { |file| File.basename(file) }
|
30
|
+
s.require_paths = ['lib']
|
32
31
|
end
|
metadata
CHANGED
@@ -1,263 +1,249 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: sensu
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 9
|
9
|
-
- 5
|
10
|
-
version: 0.9.5
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.9.6.beta
|
5
|
+
prerelease: 6
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Sean Porter
|
14
9
|
- Justin Kolberg
|
15
10
|
autorequire:
|
16
11
|
bindir: bin
|
17
12
|
cert_chain: []
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
dependencies:
|
22
|
-
- !ruby/object:Gem::Dependency
|
13
|
+
date: 2012-05-03 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
23
16
|
name: bundler
|
24
|
-
|
25
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
26
18
|
none: false
|
27
|
-
requirements:
|
28
|
-
- -
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
|
31
|
-
segments:
|
32
|
-
- 0
|
33
|
-
version: "0"
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
34
23
|
type: :runtime
|
35
|
-
version_requirements: *id001
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: eventmachine
|
38
24
|
prerelease: false
|
39
|
-
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '0'
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: eventmachine
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
40
34
|
none: false
|
41
|
-
requirements:
|
35
|
+
requirements:
|
42
36
|
- - ~>
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
hash: 62196363
|
45
|
-
segments:
|
46
|
-
- 1
|
47
|
-
- 0
|
48
|
-
- 0
|
49
|
-
- beta
|
50
|
-
- 4
|
37
|
+
- !ruby/object:Gem::Version
|
51
38
|
version: 1.0.0.beta.4
|
52
39
|
type: :runtime
|
53
|
-
version_requirements: *id002
|
54
|
-
- !ruby/object:Gem::Dependency
|
55
|
-
name: amqp
|
56
40
|
prerelease: false
|
57
|
-
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 1.0.0.beta.4
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: amqp
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
58
50
|
none: false
|
59
|
-
requirements:
|
60
|
-
- -
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
hash: 11
|
63
|
-
segments:
|
64
|
-
- 0
|
65
|
-
- 7
|
66
|
-
- 4
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
67
54
|
version: 0.7.4
|
68
55
|
type: :runtime
|
69
|
-
version_requirements: *id003
|
70
|
-
- !ruby/object:Gem::Dependency
|
71
|
-
name: json
|
72
56
|
prerelease: false
|
73
|
-
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
58
|
none: false
|
75
|
-
requirements:
|
76
|
-
- -
|
77
|
-
- !ruby/object:Gem::Version
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
59
|
+
requirements:
|
60
|
+
- - '='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 0.7.4
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: json
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
82
71
|
type: :runtime
|
83
|
-
version_requirements: *id004
|
84
|
-
- !ruby/object:Gem::Dependency
|
85
|
-
name: hashie
|
86
72
|
prerelease: false
|
87
|
-
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
88
74
|
none: false
|
89
|
-
requirements:
|
90
|
-
- -
|
91
|
-
- !ruby/object:Gem::Version
|
92
|
-
|
93
|
-
|
94
|
-
- 0
|
95
|
-
version: "0"
|
96
|
-
type: :runtime
|
97
|
-
version_requirements: *id005
|
98
|
-
- !ruby/object:Gem::Dependency
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
- !ruby/object:Gem::Dependency
|
99
80
|
name: cabin
|
100
|
-
|
101
|
-
requirement: &id006 !ruby/object:Gem::Requirement
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
102
82
|
none: false
|
103
|
-
requirements:
|
104
|
-
- -
|
105
|
-
- !ruby/object:Gem::Version
|
106
|
-
|
107
|
-
segments:
|
108
|
-
- 0
|
109
|
-
- 1
|
110
|
-
- 8
|
111
|
-
version: 0.1.8
|
83
|
+
requirements:
|
84
|
+
- - '='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: 0.4.4
|
112
87
|
type: :runtime
|
113
|
-
version_requirements: *id006
|
114
|
-
- !ruby/object:Gem::Dependency
|
115
|
-
name: ruby-redis
|
116
88
|
prerelease: false
|
117
|
-
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - '='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: 0.4.4
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: ruby-redis
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
118
98
|
none: false
|
119
|
-
requirements:
|
120
|
-
- -
|
121
|
-
- !ruby/object:Gem::Version
|
122
|
-
|
123
|
-
segments:
|
124
|
-
- 0
|
125
|
-
version: "0"
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
126
103
|
type: :runtime
|
127
|
-
version_requirements: *id007
|
128
|
-
- !ruby/object:Gem::Dependency
|
129
|
-
name: async_sinatra
|
130
104
|
prerelease: false
|
131
|
-
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: async_sinatra
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
132
114
|
none: false
|
133
|
-
requirements:
|
134
|
-
- -
|
135
|
-
- !ruby/object:Gem::Version
|
136
|
-
hash: 23
|
137
|
-
segments:
|
138
|
-
- 1
|
139
|
-
- 0
|
140
|
-
- 0
|
115
|
+
requirements:
|
116
|
+
- - '='
|
117
|
+
- !ruby/object:Gem::Version
|
141
118
|
version: 1.0.0
|
142
119
|
type: :runtime
|
143
|
-
version_requirements: *id008
|
144
|
-
- !ruby/object:Gem::Dependency
|
145
|
-
name: thin
|
146
120
|
prerelease: false
|
147
|
-
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
148
122
|
none: false
|
149
|
-
requirements:
|
150
|
-
- -
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
123
|
+
requirements:
|
124
|
+
- - '='
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: 1.0.0
|
127
|
+
- !ruby/object:Gem::Dependency
|
128
|
+
name: thin
|
129
|
+
requirement: !ruby/object:Gem::Requirement
|
130
|
+
none: false
|
131
|
+
requirements:
|
132
|
+
- - ! '>='
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '0'
|
156
135
|
type: :runtime
|
157
|
-
version_requirements: *id009
|
158
|
-
- !ruby/object:Gem::Dependency
|
159
|
-
name: rake
|
160
136
|
prerelease: false
|
161
|
-
|
137
|
+
version_requirements: !ruby/object:Gem::Requirement
|
138
|
+
none: false
|
139
|
+
requirements:
|
140
|
+
- - ! '>='
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0'
|
143
|
+
- !ruby/object:Gem::Dependency
|
144
|
+
name: rake
|
145
|
+
requirement: !ruby/object:Gem::Requirement
|
162
146
|
none: false
|
163
|
-
requirements:
|
164
|
-
- -
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
|
167
|
-
segments:
|
168
|
-
- 0
|
169
|
-
version: "0"
|
147
|
+
requirements:
|
148
|
+
- - ! '>='
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '0'
|
170
151
|
type: :development
|
171
|
-
version_requirements: *id010
|
172
|
-
- !ruby/object:Gem::Dependency
|
173
|
-
name: em-spec
|
174
152
|
prerelease: false
|
175
|
-
|
153
|
+
version_requirements: !ruby/object:Gem::Requirement
|
176
154
|
none: false
|
177
|
-
requirements:
|
178
|
-
- -
|
179
|
-
- !ruby/object:Gem::Version
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
155
|
+
requirements:
|
156
|
+
- - ! '>='
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0'
|
159
|
+
- !ruby/object:Gem::Dependency
|
160
|
+
name: em-spec
|
161
|
+
requirement: !ruby/object:Gem::Requirement
|
162
|
+
none: false
|
163
|
+
requirements:
|
164
|
+
- - ! '>='
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
184
167
|
type: :development
|
185
|
-
version_requirements: *id011
|
186
|
-
- !ruby/object:Gem::Dependency
|
187
|
-
name: em-http-request
|
188
168
|
prerelease: false
|
189
|
-
|
169
|
+
version_requirements: !ruby/object:Gem::Requirement
|
190
170
|
none: false
|
191
|
-
requirements:
|
192
|
-
- -
|
193
|
-
- !ruby/object:Gem::Version
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
171
|
+
requirements:
|
172
|
+
- - ! '>='
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: '0'
|
175
|
+
- !ruby/object:Gem::Dependency
|
176
|
+
name: em-http-request
|
177
|
+
requirement: !ruby/object:Gem::Requirement
|
178
|
+
none: false
|
179
|
+
requirements:
|
180
|
+
- - ! '>='
|
181
|
+
- !ruby/object:Gem::Version
|
182
|
+
version: '0'
|
198
183
|
type: :development
|
199
|
-
|
200
|
-
|
201
|
-
|
184
|
+
prerelease: false
|
185
|
+
version_requirements: !ruby/object:Gem::Requirement
|
186
|
+
none: false
|
187
|
+
requirements:
|
188
|
+
- - ! '>='
|
189
|
+
- !ruby/object:Gem::Version
|
190
|
+
version: '0'
|
191
|
+
description: A monitoring framework that aims to be simple, malleable, and scalable.
|
192
|
+
Uses the publish/subscribe model.
|
193
|
+
email:
|
202
194
|
- sean.porter@sonian.net
|
203
195
|
- justin.kolberg@sonian.net
|
204
|
-
executables:
|
196
|
+
executables:
|
205
197
|
- sensu-api
|
206
198
|
- sensu-client
|
207
199
|
- sensu-server
|
208
200
|
extensions: []
|
209
|
-
|
210
201
|
extra_rdoc_files: []
|
211
|
-
|
212
|
-
files:
|
202
|
+
files:
|
213
203
|
- bin/sensu-api
|
214
204
|
- bin/sensu-client
|
215
205
|
- bin/sensu-server
|
216
206
|
- lib/sensu/api.rb
|
207
|
+
- lib/sensu/base.rb
|
208
|
+
- lib/sensu/cli.rb
|
217
209
|
- lib/sensu/client.rb
|
218
|
-
- lib/sensu/
|
210
|
+
- lib/sensu/constants.rb
|
211
|
+
- lib/sensu/logger.rb
|
219
212
|
- lib/sensu/patches/amqp.rb
|
220
213
|
- lib/sensu/patches/redis.rb
|
221
214
|
- lib/sensu/patches/ruby.rb
|
215
|
+
- lib/sensu/process.rb
|
222
216
|
- lib/sensu/server.rb
|
223
|
-
- lib/sensu/
|
217
|
+
- lib/sensu/settings.rb
|
218
|
+
- lib/sensu/socket.rb
|
224
219
|
- lib/sensu.rb
|
225
220
|
- sensu.gemspec
|
226
221
|
- README.org
|
227
222
|
- MIT-LICENSE.txt
|
228
|
-
|
229
|
-
|
230
|
-
licenses:
|
223
|
+
homepage: https://github.com/sensu/sensu
|
224
|
+
licenses:
|
231
225
|
- MIT
|
232
226
|
post_install_message:
|
233
227
|
rdoc_options: []
|
234
|
-
|
235
|
-
require_paths:
|
228
|
+
require_paths:
|
236
229
|
- lib
|
237
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
230
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
238
231
|
none: false
|
239
|
-
requirements:
|
240
|
-
- -
|
241
|
-
- !ruby/object:Gem::Version
|
242
|
-
|
243
|
-
|
244
|
-
- 0
|
245
|
-
version: "0"
|
246
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
232
|
+
requirements:
|
233
|
+
- - ! '>='
|
234
|
+
- !ruby/object:Gem::Version
|
235
|
+
version: '0'
|
236
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
247
237
|
none: false
|
248
|
-
requirements:
|
249
|
-
- -
|
250
|
-
- !ruby/object:Gem::Version
|
251
|
-
|
252
|
-
segments:
|
253
|
-
- 0
|
254
|
-
version: "0"
|
238
|
+
requirements:
|
239
|
+
- - ! '>'
|
240
|
+
- !ruby/object:Gem::Version
|
241
|
+
version: 1.3.1
|
255
242
|
requirements: []
|
256
|
-
|
257
243
|
rubyforge_project:
|
258
|
-
rubygems_version: 1.
|
244
|
+
rubygems_version: 1.8.24
|
259
245
|
signing_key:
|
260
246
|
specification_version: 3
|
261
247
|
summary: A monitoring framework
|
262
248
|
test_files: []
|
263
|
-
|
249
|
+
has_rdoc: false
|