sensu 0.9.5 → 0.9.6.beta
Sign up to get free protection for your applications and to get access to all the features.
- 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
|