flapjack 0.6.39 → 0.6.40
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/.gitignore +2 -2
- data/Gemfile +5 -1
- data/README.md +3 -2
- data/Rakefile +2 -1
- data/bin/flapjack +2 -2
- data/bin/flapjack-nagios-receiver +2 -8
- data/bin/flapjack-populator +11 -11
- data/etc/flapjack_config.yaml.example +28 -0
- data/features/steps/events_steps.rb +1 -1
- data/features/steps/notifications_steps.rb +7 -4
- data/features/support/env.rb +17 -6
- data/flapjack.gemspec +1 -0
- data/lib/flapjack/api.rb +72 -28
- data/lib/flapjack/configuration.rb +9 -1
- data/lib/flapjack/coordinator.rb +138 -162
- data/lib/flapjack/data/contact.rb +3 -1
- data/lib/flapjack/data/entity.rb +10 -1
- data/lib/flapjack/data/entity_check.rb +19 -21
- data/lib/flapjack/data/event.rb +26 -27
- data/lib/flapjack/data/message.rb +45 -0
- data/lib/flapjack/data/notification.rb +49 -0
- data/lib/flapjack/executive.rb +53 -74
- data/lib/flapjack/filters/acknowledgement.rb +14 -11
- data/lib/flapjack/jabber.rb +84 -18
- data/lib/flapjack/notification/email.rb +67 -37
- data/lib/flapjack/notification/sms.rb +40 -28
- data/lib/flapjack/oobetet.rb +1 -1
- data/lib/flapjack/pagerduty.rb +24 -15
- data/lib/flapjack/patches.rb +3 -1
- data/lib/flapjack/pikelet.rb +51 -20
- data/lib/flapjack/rack_logger.rb +8 -0
- data/lib/flapjack/version.rb +1 -1
- data/lib/flapjack/web.rb +51 -27
- data/spec/lib/flapjack/api_spec.rb +28 -3
- data/spec/lib/flapjack/coordinator_spec.rb +69 -43
- data/spec/lib/flapjack/data/contact_spec.rb +17 -9
- data/spec/lib/flapjack/data/entity_check_spec.rb +0 -25
- data/spec/lib/flapjack/data/entity_spec.rb +4 -0
- data/spec/lib/flapjack/data/global_spec.rb +6 -0
- data/spec/lib/flapjack/data/message_spec.rb +6 -0
- data/spec/lib/flapjack/data/notification_spec.rb +6 -0
- data/spec/lib/flapjack/executive_spec.rb +2 -2
- data/spec/lib/flapjack/jabber_spec.rb +8 -9
- data/spec/lib/flapjack/pagerduty_spec.rb +53 -45
- data/spec/lib/flapjack/utility_spec.rb +55 -0
- data/spec/lib/flapjack/web_spec.rb +7 -5
- data/tasks/events.rake +26 -59
- data/tasks/profile.rake +366 -0
- metadata +30 -19
- data/lib/flapjack/notification/common.rb +0 -23
- data/lib/flapjack/persistence/couch.rb +0 -5
- data/lib/flapjack/persistence/couch/connection.rb +0 -66
- data/lib/flapjack/persistence/couch/couch.rb +0 -63
- data/lib/flapjack/persistence/data_mapper.rb +0 -3
- data/lib/flapjack/persistence/data_mapper/data_mapper.rb +0 -67
- data/lib/flapjack/persistence/data_mapper/models/check.rb +0 -90
- data/lib/flapjack/persistence/data_mapper/models/check_template.rb +0 -20
- data/lib/flapjack/persistence/data_mapper/models/event.rb +0 -19
- data/lib/flapjack/persistence/data_mapper/models/node.rb +0 -18
- data/lib/flapjack/persistence/data_mapper/models/related_check.rb +0 -15
- data/lib/flapjack/persistence/sqlite3.rb +0 -3
- data/lib/flapjack/persistence/sqlite3/sqlite3.rb +0 -166
- data/lib/flapjack/transports/beanstalkd.rb +0 -50
- data/lib/flapjack/transports/result.rb +0 -58
- data/lib/flapjack/worker/application.rb +0 -121
- data/lib/flapjack/worker/cli.rb +0 -49
data/lib/flapjack/jabber.rb
CHANGED
|
@@ -18,6 +18,7 @@ require 'yajl/json_gem'
|
|
|
18
18
|
|
|
19
19
|
require 'flapjack/data/entity_check'
|
|
20
20
|
require 'flapjack/pikelet'
|
|
21
|
+
require 'flapjack/redis_pool'
|
|
21
22
|
require 'flapjack/utility'
|
|
22
23
|
require 'flapjack/version'
|
|
23
24
|
|
|
@@ -25,7 +26,7 @@ module Flapjack
|
|
|
25
26
|
|
|
26
27
|
class Jabber < Blather::Client
|
|
27
28
|
|
|
28
|
-
include Flapjack::
|
|
29
|
+
include Flapjack::GenericPikelet
|
|
29
30
|
include Flapjack::Utility
|
|
30
31
|
|
|
31
32
|
log = Logger.new(STDOUT)
|
|
@@ -33,14 +34,26 @@ module Flapjack
|
|
|
33
34
|
log.level = Logger::INFO
|
|
34
35
|
Blather.logger = log
|
|
35
36
|
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
alias_method :generic_bootstrap, :bootstrap
|
|
38
|
+
alias_method :generic_cleanup, :cleanup
|
|
39
|
+
|
|
40
|
+
def bootstrap(opts = {})
|
|
41
|
+
generic_bootstrap(opts)
|
|
42
|
+
|
|
43
|
+
@redis_config = opts[:redis_config]
|
|
44
|
+
@redis = Flapjack::RedisPool.new(:config => @redis_config, :size => 1)
|
|
45
|
+
|
|
38
46
|
@buffer = []
|
|
39
47
|
@hostname = Socket.gethostname
|
|
40
48
|
end
|
|
41
49
|
|
|
50
|
+
def cleanup
|
|
51
|
+
@redis.empty! if @redis
|
|
52
|
+
@redis_handler.empty! if @redis_handler
|
|
53
|
+
generic_cleanup
|
|
54
|
+
end
|
|
55
|
+
|
|
42
56
|
def setup
|
|
43
|
-
@redis = build_redis_connection_pool
|
|
44
57
|
@flapjack_jid = Blather::JID.new((@config['jabberid'] || 'flapjack') + '/' + @hostname)
|
|
45
58
|
|
|
46
59
|
super(@flapjack_jid, @config['password'], @config['server'], @config['port'].to_i)
|
|
@@ -79,8 +92,8 @@ module Flapjack
|
|
|
79
92
|
|
|
80
93
|
# Join the MUC Chat room after connecting.
|
|
81
94
|
def on_ready(stanza)
|
|
82
|
-
return if should_quit?
|
|
83
|
-
@redis_handler ||=
|
|
95
|
+
return if should_quit? && @shutting_down
|
|
96
|
+
@redis_handler ||= Flapjack::RedisPool.new(:config => @redis_config, :size => 1)
|
|
84
97
|
@connected_at = Time.now.to_i
|
|
85
98
|
logger.info("Jabber Connected")
|
|
86
99
|
if @config['rooms'] && @config['rooms'].length > 0
|
|
@@ -150,6 +163,8 @@ module Flapjack
|
|
|
150
163
|
when command =~ /^help$/
|
|
151
164
|
msg = "commands: \n"
|
|
152
165
|
msg += " ACKID <id> <comment> [duration: <time spec>] \n"
|
|
166
|
+
msg += " find entities matching /pattern/ \n"
|
|
167
|
+
msg += " test notifications for <entity>[:<check>] \n"
|
|
153
168
|
msg += " identify \n"
|
|
154
169
|
msg += " help \n"
|
|
155
170
|
|
|
@@ -162,6 +177,43 @@ module Flapjack
|
|
|
162
177
|
msg += "System CPU Time: #{t.stime}\n"
|
|
163
178
|
msg += `uname -a`.chomp + "\n"
|
|
164
179
|
|
|
180
|
+
when command =~ /^test notifications for\s+([a-z0-9-]+)(:(.+))?$/i
|
|
181
|
+
entity_name = $1
|
|
182
|
+
check_name = $3 ? $3 : 'test'
|
|
183
|
+
|
|
184
|
+
msg = "so you want me to test notifications for entity: #{entity_name}, check: #{check_name} eh? ... well OK!"
|
|
185
|
+
|
|
186
|
+
entity = Flapjack::Data::Entity.find_by_name(entity_name, :redis => @redis_handler)
|
|
187
|
+
if entity
|
|
188
|
+
summary = "Testing notifications to all contacts interested in entity: #{entity.name}, check: #{check_name}"
|
|
189
|
+
|
|
190
|
+
entity_check = Flapjack::Data::EntityCheck.for_entity(entity, check_name, :redis => @redis_handler)
|
|
191
|
+
puts entity_check.inspect
|
|
192
|
+
entity_check.test_notifications('summary' => summary)
|
|
193
|
+
|
|
194
|
+
else
|
|
195
|
+
msg = "yeah, no i can't see #{entity_name} in my systems"
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
when command =~ /^(find )?entities matching\s+\/(.*)\/.*$/i
|
|
199
|
+
pattern = $2.chomp.strip
|
|
200
|
+
entity_list = Flapjack::Data::Entity.find_all_name_matching(pattern, :redis => @redis_handler)
|
|
201
|
+
max_showable = 30
|
|
202
|
+
number_found = entity_list.length
|
|
203
|
+
entity_list = entity_list[0..(max_showable - 1)] if number_found > max_showable
|
|
204
|
+
|
|
205
|
+
case
|
|
206
|
+
when number_found == 0
|
|
207
|
+
msg = "found no entities matching /#{pattern}/"
|
|
208
|
+
when number_found == 1
|
|
209
|
+
msg = "found #{number_found} entity matching /#{pattern}/ ... \n"
|
|
210
|
+
when number_found > max_showable
|
|
211
|
+
msg = "showing first #{max_showable} of #{number_found} entities found matching /#{pattern}/\n"
|
|
212
|
+
else
|
|
213
|
+
msg = "found #{number_found} entities matching /#{pattern}/ ... \n"
|
|
214
|
+
end
|
|
215
|
+
msg += entity_list.join(', ') unless entity_list.empty?
|
|
216
|
+
|
|
165
217
|
when command =~ /^(.*)/
|
|
166
218
|
words = $1
|
|
167
219
|
msg = "what do you mean, '#{words}'? Type 'help' for a list of acceptable commands."
|
|
@@ -172,7 +224,7 @@ module Flapjack
|
|
|
172
224
|
end
|
|
173
225
|
|
|
174
226
|
def on_groupchat(stanza)
|
|
175
|
-
return if should_quit?
|
|
227
|
+
return if should_quit? && @shutting_down
|
|
176
228
|
logger.debug("groupchat message received: #{stanza.inspect}")
|
|
177
229
|
|
|
178
230
|
if stanza.body =~ /^flapjack:\s+(.*)/
|
|
@@ -191,7 +243,7 @@ module Flapjack
|
|
|
191
243
|
end
|
|
192
244
|
|
|
193
245
|
def on_chat(stanza)
|
|
194
|
-
return if should_quit?
|
|
246
|
+
return if should_quit? && @shutting_down
|
|
195
247
|
logger.debug("chat message received: #{stanza.inspect}")
|
|
196
248
|
|
|
197
249
|
if stanza.body =~ /^flapjack:\s+(.*)/
|
|
@@ -213,7 +265,7 @@ module Flapjack
|
|
|
213
265
|
|
|
214
266
|
# returning true to prevent the reactor loop from stopping
|
|
215
267
|
def on_disconnect(stanza)
|
|
216
|
-
return true if should_quit?
|
|
268
|
+
return true if should_quit? && @shutting_down
|
|
217
269
|
logger.warn("jabbers disconnected! reconnecting in 1 second ...")
|
|
218
270
|
EventMachine::Timer.new(1) do
|
|
219
271
|
connect # Blather::Client.connect
|
|
@@ -256,7 +308,7 @@ module Flapjack
|
|
|
256
308
|
queue = @config['queue']
|
|
257
309
|
events = {}
|
|
258
310
|
|
|
259
|
-
until should_quit?
|
|
311
|
+
until should_quit? && @shutting_down
|
|
260
312
|
|
|
261
313
|
# FIXME: should also check if presence has been established in any group chat rooms that are
|
|
262
314
|
# configured before starting to process events, otherwise the first few may get lost (send
|
|
@@ -265,11 +317,12 @@ module Flapjack
|
|
|
265
317
|
logger.debug("jabber is connected so commencing blpop on #{queue}")
|
|
266
318
|
events[queue] = @redis.blpop(queue, 0)
|
|
267
319
|
event = Yajl::Parser.parse(events[queue][1])
|
|
268
|
-
type = event['notification_type']
|
|
320
|
+
type = event['notification_type'] || 'unknown'
|
|
269
321
|
logger.debug('jabber notification event received')
|
|
270
322
|
logger.debug(event.inspect)
|
|
271
323
|
if 'shutdown'.eql?(type)
|
|
272
324
|
if should_quit?
|
|
325
|
+
@shutting_down = true
|
|
273
326
|
EventMachine::Synchrony.next_tick do
|
|
274
327
|
# get delays without the next_tick
|
|
275
328
|
close # Blather::Client.close
|
|
@@ -284,14 +337,30 @@ module Flapjack
|
|
|
284
337
|
|
|
285
338
|
logger.debug("processing jabber notification address: #{address}, event: #{entity}:#{check}, state: #{state}, summary: #{summary}")
|
|
286
339
|
|
|
287
|
-
ack_str =
|
|
340
|
+
ack_str =
|
|
341
|
+
event['event_count'] &&
|
|
342
|
+
!state.eql?('ok') &&
|
|
343
|
+
!'acknowledgement'.eql?(type) &&
|
|
344
|
+
!'test'.eql?(type) ?
|
|
288
345
|
"::: flapjack: ACKID #{event['event_count']} " : ''
|
|
289
346
|
|
|
290
|
-
|
|
291
|
-
|
|
347
|
+
type = 'unknown' unless type
|
|
348
|
+
|
|
349
|
+
maint_str = case type
|
|
350
|
+
when 'acknowledgement'
|
|
351
|
+
"has been acknowledged, unscheduled maintenance created for #{duration}"
|
|
352
|
+
when 'test'
|
|
353
|
+
''
|
|
354
|
+
else
|
|
292
355
|
"is #{state.upcase}"
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
# FIXME - should probably put all the message composition stuff in one place so
|
|
359
|
+
# the logic isn't duplicated in each notification channel.
|
|
360
|
+
# TODO - templatise the messages so they can be customised without changing core code
|
|
361
|
+
headline = "test".eql?(type.downcase) ? "TEST NOTIFICATION" : type.upcase
|
|
293
362
|
|
|
294
|
-
msg = "#{
|
|
363
|
+
msg = "#{headline} #{ack_str}::: \"#{check}\" on #{entity} #{maint_str} ::: #{summary}"
|
|
295
364
|
|
|
296
365
|
chat_type = :chat
|
|
297
366
|
chat_type = :groupchat if @config['rooms'] && @config['rooms'].include?(address)
|
|
@@ -307,9 +376,6 @@ module Flapjack
|
|
|
307
376
|
|
|
308
377
|
count_timer.cancel
|
|
309
378
|
keepalive_timer.cancel
|
|
310
|
-
|
|
311
|
-
@redis.empty! if @redis
|
|
312
|
-
@redis_handler.empty! if @redis_handler
|
|
313
379
|
end
|
|
314
380
|
|
|
315
381
|
end
|
|
@@ -5,47 +5,76 @@ require 'erb'
|
|
|
5
5
|
require 'haml'
|
|
6
6
|
require 'socket'
|
|
7
7
|
|
|
8
|
+
require 'flapjack/pikelet'
|
|
8
9
|
require 'flapjack/data/entity_check'
|
|
9
|
-
require 'flapjack/notification/common'
|
|
10
10
|
|
|
11
11
|
module Flapjack
|
|
12
12
|
module Notification
|
|
13
13
|
|
|
14
14
|
class Email
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
15
|
+
|
|
16
|
+
extend Flapjack::ResquePikelet
|
|
17
|
+
|
|
18
|
+
class << self
|
|
19
|
+
|
|
20
|
+
alias_method :orig_bootstrap, :bootstrap
|
|
21
|
+
|
|
22
|
+
# See https://github.com/mikel/mail/blob/master/lib/mail/mail.rb#L53
|
|
23
|
+
# & https://github.com/mikel/mail/blob/master/spec/mail/configuration_spec.rb
|
|
24
|
+
# for details of configuring mail gem. defaults to SMTP, localhost, port 25
|
|
25
|
+
def bootstrap(opts = {})
|
|
26
|
+
return if @bootstrapped
|
|
27
|
+
|
|
28
|
+
sc = opts[:config].delete('smtp_config')
|
|
29
|
+
|
|
30
|
+
if sc
|
|
31
|
+
smtp_config = sc.keys.inject({}) do |ret,obj|
|
|
32
|
+
ret[obj.to_sym] = sc[obj]
|
|
33
|
+
ret
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
Mail.defaults {
|
|
37
|
+
delivery_method :smtp, {:enable_starttls_auto => false}.merge(smtp_config)
|
|
38
|
+
}
|
|
39
|
+
end
|
|
40
|
+
orig_bootstrap(opts)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def perform(notification)
|
|
44
|
+
@logger.debug "Woo, got a notification to send out: #{notification.inspect}"
|
|
45
|
+
opts = {:logger => @logger}
|
|
46
|
+
|
|
47
|
+
notification_type = notification['notification_type']
|
|
48
|
+
contact_first_name = notification['contact_first_name']
|
|
49
|
+
contact_last_name = notification['contact_last_name']
|
|
50
|
+
state = notification['state']
|
|
51
|
+
summary = notification['summary']
|
|
52
|
+
time = notification['time']
|
|
53
|
+
entity, check = notification['event_id'].split(':')
|
|
54
|
+
|
|
55
|
+
entity_check = Flapjack::Data::EntityCheck.for_event_id(notification['event_id'],
|
|
56
|
+
:redis => ::Resque.redis)
|
|
57
|
+
|
|
58
|
+
headline_map = {'problem' => 'Problem: ',
|
|
59
|
+
'recovery' => 'Recovery: ',
|
|
60
|
+
'acknowledgement' => 'Acknowledgement: ',
|
|
61
|
+
'test' => 'Test Notification: ',
|
|
62
|
+
'unknown' => ''
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
headline = headline_map[notification_type] || ''
|
|
66
|
+
|
|
67
|
+
subject = "#{headline}'#{check}' on #{entity}"
|
|
68
|
+
subject += " is #{state.upcase}" unless ['acknowledgement', 'test'].include?(notification_type)
|
|
69
|
+
|
|
70
|
+
notification['subject'] = subject
|
|
71
|
+
|
|
72
|
+
mail = prepare_email(notification, :logger => @logger,
|
|
73
|
+
:in_scheduled_maintenance => entity_check.in_scheduled_maintenance?,
|
|
74
|
+
:in_unscheduled_maintenance => entity_check.in_unscheduled_maintenance?)
|
|
75
|
+
mail.deliver!
|
|
76
|
+
end
|
|
77
|
+
|
|
49
78
|
end
|
|
50
79
|
|
|
51
80
|
private
|
|
@@ -54,7 +83,7 @@ module Flapjack
|
|
|
54
83
|
|
|
55
84
|
logger = opts[:logger]
|
|
56
85
|
|
|
57
|
-
# not
|
|
86
|
+
# not using socket and gethostname as that doesn't give you a fqdn.
|
|
58
87
|
# see the facter issue: https://projects.puppetlabs.com/issues/3898
|
|
59
88
|
fqdn = `/bin/hostname -f`.chomp
|
|
60
89
|
m_from = "flapjack@#{fqdn}"
|
|
@@ -64,7 +93,8 @@ module Flapjack
|
|
|
64
93
|
m_to = notification['address']
|
|
65
94
|
m_subject = notification['subject']
|
|
66
95
|
|
|
67
|
-
logger.debug("Flapjack::Notification::
|
|
96
|
+
logger.debug("sending Flapjack::Notification::Email " +
|
|
97
|
+
"#{notification['id']} to: #{m_to} subject: #{m_subject}")
|
|
68
98
|
|
|
69
99
|
@notification_type = notification['notification_type']
|
|
70
100
|
@contact_first_name = notification['contact_first_name']
|
|
@@ -1,39 +1,51 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
|
|
3
|
+
require 'flapjack/pikelet'
|
|
3
4
|
require 'flapjack/notification/sms/messagenet'
|
|
4
5
|
|
|
5
6
|
module Flapjack
|
|
6
7
|
module Notification
|
|
7
8
|
|
|
8
9
|
class Sms
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
10
|
+
|
|
11
|
+
extend Flapjack::ResquePikelet
|
|
12
|
+
|
|
13
|
+
class << self
|
|
14
|
+
|
|
15
|
+
def perform(notification)
|
|
16
|
+
@logger.debug "Woo, got a notification to send out: #{notification.inspect}"
|
|
17
|
+
dispatch(notification, :logger => @logger, :redis => ::Resque.redis)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def dispatch(notification, opts = {})
|
|
21
|
+
notification_type = notification['notification_type']
|
|
22
|
+
contact_first_name = notification['contact_first_name']
|
|
23
|
+
contact_last_name = notification['contact_last_name']
|
|
24
|
+
state = notification['state']
|
|
25
|
+
summary = notification['summary']
|
|
26
|
+
time = notification['time']
|
|
27
|
+
entity, check = notification['event_id'].split(':')
|
|
28
|
+
|
|
29
|
+
headline_map = {'problem' => 'PROBLEM: ',
|
|
30
|
+
'recovery' => 'RECOVERY: ',
|
|
31
|
+
'acknowledgement' => 'ACK: ',
|
|
32
|
+
'test' => 'TEST NOTIFICATION: ',
|
|
33
|
+
'unknown' => '',
|
|
34
|
+
'' => '',
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
headline = headline_map[notification_type] || ''
|
|
38
|
+
|
|
39
|
+
message = "#{headline}'#{check}' on #{entity}"
|
|
40
|
+
message += " is #{state.upcase}" unless ['acknowledgement', 'test'].include?(notification_type)
|
|
41
|
+
message += " at #{Time.at(time).strftime('%-d %b %H:%M')}, #{summary}"
|
|
42
|
+
|
|
43
|
+
notification['message'] = message
|
|
44
|
+
Flapjack::Notification::Sms::Messagenet.sender(notification,
|
|
45
|
+
:logger => opts[:logger],
|
|
46
|
+
:config => Flapjack::Notification::Sms.instance_variable_get('@config'))
|
|
47
|
+
end
|
|
48
|
+
|
|
37
49
|
end
|
|
38
50
|
|
|
39
51
|
end
|
data/lib/flapjack/oobetet.rb
CHANGED
data/lib/flapjack/pagerduty.rb
CHANGED
|
@@ -1,44 +1,50 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
|
|
3
|
-
require 'eventmachine'
|
|
4
|
-
# the redis/synchrony gems need to be required in this particular order, see
|
|
5
|
-
# the redis-rb README for details
|
|
6
|
-
require 'hiredis'
|
|
7
3
|
require 'em-synchrony'
|
|
8
4
|
require 'em-synchrony/em-http'
|
|
9
|
-
require 'redis/connection/synchrony'
|
|
10
|
-
require 'redis'
|
|
11
5
|
|
|
12
6
|
require 'yajl/json_gem'
|
|
13
7
|
|
|
14
8
|
require 'flapjack/data/entity_check'
|
|
15
9
|
require 'flapjack/data/global'
|
|
16
10
|
require 'flapjack/pikelet'
|
|
11
|
+
require 'flapjack/redis_pool'
|
|
17
12
|
|
|
18
13
|
module Flapjack
|
|
19
14
|
|
|
20
15
|
class Pagerduty
|
|
21
16
|
|
|
22
|
-
include Flapjack::
|
|
17
|
+
include Flapjack::GenericPikelet
|
|
23
18
|
|
|
24
19
|
PAGERDUTY_EVENTS_API_URL = 'https://events.pagerduty.com/generic/2010-04-15/create_event.json'
|
|
25
20
|
SEM_PAGERDUTY_ACKS_RUNNING = 'sem_pagerduty_acks_running'
|
|
26
21
|
|
|
27
|
-
|
|
28
|
-
|
|
22
|
+
alias_method :generic_bootstrap, :bootstrap
|
|
23
|
+
alias_method :generic_cleanup, :cleanup
|
|
24
|
+
|
|
25
|
+
def bootstrap(opts = {})
|
|
26
|
+
generic_bootstrap(opts)
|
|
27
|
+
|
|
28
|
+
@redis_config = opts[:redis_config]
|
|
29
|
+
@redis = Flapjack::RedisPool.new(:config => @redis_config, :size => 1)
|
|
30
|
+
|
|
29
31
|
logger.debug("New Pagerduty pikelet with the following options: #{@config.inspect}")
|
|
30
32
|
|
|
31
33
|
@pagerduty_acks_started = nil
|
|
32
34
|
end
|
|
33
35
|
|
|
36
|
+
def cleanup
|
|
37
|
+
@redis.empty! if @redis
|
|
38
|
+
@redis_timer.empty! if @redis_timer
|
|
39
|
+
generic_cleanup
|
|
40
|
+
end
|
|
41
|
+
|
|
34
42
|
def add_shutdown_event(opts = {})
|
|
35
43
|
return unless redis = opts[:redis]
|
|
36
44
|
redis.rpush(@config['queue'], JSON.generate('notification_type' => 'shutdown'))
|
|
37
45
|
end
|
|
38
46
|
|
|
39
47
|
def main
|
|
40
|
-
setup
|
|
41
|
-
|
|
42
48
|
logger.debug("pagerduty gateway - commencing main method")
|
|
43
49
|
raise "Can't connect to the pagerduty API" unless test_pagerduty_connection
|
|
44
50
|
|
|
@@ -47,7 +53,7 @@ module Flapjack
|
|
|
47
53
|
@redis.del(SEM_PAGERDUTY_ACKS_RUNNING)
|
|
48
54
|
|
|
49
55
|
acknowledgement_timer = EM::Synchrony.add_periodic_timer(10) do
|
|
50
|
-
@redis_timer ||=
|
|
56
|
+
@redis_timer ||= Flapjack::RedisPool.new(:config => @redis_config, :size => 1)
|
|
51
57
|
find_pagerduty_acknowledgements_if_safe
|
|
52
58
|
end
|
|
53
59
|
|
|
@@ -67,6 +73,8 @@ module Flapjack
|
|
|
67
73
|
summary = event['summary']
|
|
68
74
|
address = event['address']
|
|
69
75
|
|
|
76
|
+
headline = type.upcase
|
|
77
|
+
|
|
70
78
|
case type.downcase
|
|
71
79
|
when 'acknowledgement'
|
|
72
80
|
maint_str = "has been acknowledged"
|
|
@@ -77,6 +85,10 @@ module Flapjack
|
|
|
77
85
|
when 'recovery'
|
|
78
86
|
maint_str = "is #{state.upcase}"
|
|
79
87
|
pagerduty_type = "resolve"
|
|
88
|
+
when 'test'
|
|
89
|
+
maint_str = ""
|
|
90
|
+
pagerduty_type = "trigger"
|
|
91
|
+
headline = "TEST NOTIFICATION"
|
|
80
92
|
end
|
|
81
93
|
|
|
82
94
|
message = "#{type.upcase} - \"#{check}\" on #{entity} #{maint_str} - #{summary}"
|
|
@@ -91,9 +103,6 @@ module Flapjack
|
|
|
91
103
|
end
|
|
92
104
|
|
|
93
105
|
acknowledgement_timer.cancel
|
|
94
|
-
|
|
95
|
-
@redis.empty! if @redis
|
|
96
|
-
@redis_timer.empty! if @redis_timer
|
|
97
106
|
end
|
|
98
107
|
|
|
99
108
|
# considering this as part of the public API -- exposes it for testing.
|