flapjack 0.6.39 → 0.6.40
Sign up to get free protection for your applications and to get access to all the features.
- 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.
|