flapjack 1.2.1 → 1.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +11 -12
- data/CHANGELOG.md +10 -0
- data/Gemfile +0 -7
- data/Rakefile +0 -1
- data/bin/flapjack +2 -0
- data/etc/flapjack_config.yaml.example +20 -0
- data/features/ack_after_sched_maint.feature +1 -1
- data/features/cli.feature +1 -1
- data/features/notification_rules.feature +1 -1
- data/features/notifications.feature +0 -9
- data/features/rollup.feature +1 -1
- data/features/steps/events_steps.rb +20 -8
- data/features/steps/notifications_steps.rb +62 -75
- data/features/support/env.rb +17 -8
- data/flapjack.gemspec +4 -4
- data/lib/flapjack.rb +3 -0
- data/lib/flapjack/cli/import.rb +1 -0
- data/lib/flapjack/cli/maintenance.rb +1 -0
- data/lib/flapjack/cli/purge.rb +2 -0
- data/lib/flapjack/cli/receiver.rb +1 -0
- data/lib/flapjack/cli/simulate.rb +1 -0
- data/lib/flapjack/data/alert.rb +28 -1
- data/lib/flapjack/data/contact.rb +1 -1
- data/lib/flapjack/data/entity.rb +18 -8
- data/lib/flapjack/data/entity_check.rb +17 -0
- data/lib/flapjack/data/event.rb +33 -15
- data/lib/flapjack/data/migration.rb +46 -23
- data/lib/flapjack/filters/delays.rb +13 -6
- data/lib/flapjack/gateways/aws_sns.rb +115 -88
- data/lib/flapjack/gateways/aws_sns/alert.text.erb +2 -1
- data/lib/flapjack/gateways/email.rb +145 -135
- data/lib/flapjack/gateways/email/alert.html.erb +6 -4
- data/lib/flapjack/gateways/email/alert.text.erb +2 -0
- data/lib/flapjack/gateways/jabber.rb +61 -1
- data/lib/flapjack/gateways/jabber/alert.text.erb +1 -1
- data/lib/flapjack/gateways/pagerduty/alert.text.erb +1 -1
- data/lib/flapjack/gateways/sms_gammu.rb +119 -0
- data/lib/flapjack/gateways/sms_messagenet.rb +95 -67
- data/lib/flapjack/gateways/sms_messagenet/alert.text.erb +2 -1
- data/lib/flapjack/gateways/sms_twilio.rb +102 -74
- data/lib/flapjack/gateways/sms_twilio/alert.text.erb +2 -1
- data/lib/flapjack/logger.rb +1 -1
- data/lib/flapjack/notifier.rb +5 -14
- data/lib/flapjack/patches.rb +0 -58
- data/lib/flapjack/pikelet.rb +8 -78
- data/lib/flapjack/processor.rb +3 -1
- data/lib/flapjack/redis_pool.rb +2 -0
- data/lib/flapjack/version.rb +1 -1
- data/spec/lib/flapjack/data/contact_spec.rb +2 -2
- data/spec/lib/flapjack/data/entity_spec.rb +15 -0
- data/spec/lib/flapjack/data/event_spec.rb +2 -2
- data/spec/lib/flapjack/data/migration_spec.rb +11 -0
- data/spec/lib/flapjack/gateways/aws_sns_spec.rb +12 -8
- data/spec/lib/flapjack/gateways/email_spec.rb +56 -51
- data/spec/lib/flapjack/gateways/sms_messagenet_spec.rb +17 -12
- data/spec/lib/flapjack/gateways/sms_twilio_spec.rb +17 -12
- data/spec/lib/flapjack/pikelet_spec.rb +9 -23
- data/spec/lib/flapjack/redis_pool_spec.rb +1 -0
- data/tasks/profile.rake +25 -109
- metadata +37 -39
- data/Gemfile-ruby1.9 +0 -30
- data/Gemfile-ruby1.9.lock +0 -250
- data/tasks/benchmarks.rake +0 -237
@@ -4,6 +4,8 @@ require 'em-synchrony'
|
|
4
4
|
require 'em-synchrony/em-http'
|
5
5
|
require 'active_support/inflector'
|
6
6
|
|
7
|
+
require 'flapjack/redis_pool'
|
8
|
+
|
7
9
|
require 'flapjack/data/alert'
|
8
10
|
require 'flapjack/utility'
|
9
11
|
|
@@ -17,98 +19,124 @@ module Flapjack
|
|
17
19
|
# --data-urlencode 'Body=Sausage' \
|
18
20
|
# -u [AccountSid]:[AuthToken]
|
19
21
|
|
20
|
-
|
22
|
+
include Flapjack::Utility
|
21
23
|
|
22
|
-
|
24
|
+
def initialize(opts = {})
|
25
|
+
@config = opts[:config]
|
26
|
+
@logger = opts[:logger]
|
27
|
+
@redis_config = opts[:redis_config] || {}
|
28
|
+
@redis = Flapjack::RedisPool.new(:config => @redis_config, :size => 1, :logger => @logger)
|
23
29
|
|
24
|
-
|
25
|
-
|
26
|
-
end
|
30
|
+
@logger.info("starting")
|
31
|
+
@logger.debug("new sms_twilio gateway pikelet with the following options: #{@config.inspect}")
|
27
32
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
my_dir = File.dirname(__FILE__)
|
42
|
-
sms_template_path = case
|
43
|
-
when @config.has_key?('templates') && @config['templates']["#{message_type}.text"]
|
44
|
-
@config['templates']["#{message_type}.text"]
|
45
|
-
else
|
46
|
-
my_dir + "/sms_twilio/#{message_type}.text.erb"
|
47
|
-
end
|
48
|
-
sms_template = ERB.new(File.read(sms_template_path), nil, '-')
|
33
|
+
@sent = 0
|
34
|
+
end
|
35
|
+
|
36
|
+
def stop
|
37
|
+
@logger.info("stopping")
|
38
|
+
@should_quit = true
|
39
|
+
|
40
|
+
redis_uri = @redis_config[:path] ||
|
41
|
+
"redis://#{@redis_config[:host] || '127.0.0.1'}:#{@redis_config[:port] || '6379'}/#{@redis_config[:db] || '0'}"
|
42
|
+
shutdown_redis = EM::Hiredis.connect(redis_uri)
|
43
|
+
shutdown_redis.rpush(@config['queue'], Flapjack.dump_json('notification_type' => 'shutdown'))
|
44
|
+
end
|
49
45
|
|
50
|
-
|
51
|
-
|
46
|
+
def start
|
47
|
+
queue = @config['queue']
|
52
48
|
|
49
|
+
until @should_quit
|
53
50
|
begin
|
54
|
-
|
51
|
+
@logger.debug("sms_twilio gateway is going into blpop mode on #{queue}")
|
52
|
+
deliver( Flapjack::Data::Alert.next(queue, :redis => @redis, :logger => @logger) )
|
55
53
|
rescue => e
|
56
|
-
@logger.error "Error
|
57
|
-
"
|
58
|
-
raise
|
54
|
+
@logger.error "Error generating or dispatching SMS Twilio message: #{e.class}: #{e.message}\n" +
|
55
|
+
e.backtrace.join("\n")
|
59
56
|
end
|
57
|
+
end
|
58
|
+
end
|
60
59
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
60
|
+
def deliver(alert)
|
61
|
+
account_sid = @config["account_sid"]
|
62
|
+
auth_token = @config["auth_token"]
|
63
|
+
from = @config["from"]
|
64
|
+
endpoint = @config["endpoint"] || "https://api.twilio.com/2010-04-01/Accounts/#{account_sid}/Messages.json"
|
65
|
+
|
66
|
+
address = alert.address
|
67
|
+
notification_id = alert.notification_id
|
68
|
+
message_type = alert.rollup ? 'rollup' : 'alert'
|
69
|
+
|
70
|
+
my_dir = File.dirname(__FILE__)
|
71
|
+
sms_template_path = case
|
72
|
+
when @config.has_key?('templates') && @config['templates']["#{message_type}.text"]
|
73
|
+
@config['templates']["#{message_type}.text"]
|
74
|
+
else
|
75
|
+
my_dir + "/sms_twilio/#{message_type}.text.erb"
|
76
|
+
end
|
77
|
+
sms_template = ERB.new(File.read(sms_template_path), nil, '-')
|
65
78
|
|
66
|
-
|
79
|
+
@alert = alert
|
80
|
+
bnd = binding
|
67
81
|
|
68
|
-
|
82
|
+
begin
|
83
|
+
message = sms_template.result(bnd).chomp
|
84
|
+
rescue => e
|
85
|
+
@logger.error "Error while excuting the ERB for an sms: " +
|
86
|
+
"ERB being executed: #{sms_template_path}"
|
87
|
+
raise
|
88
|
+
end
|
69
89
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
[notification_id, "Notification id is missing"]].each do |val_err|
|
90
|
+
if @config.nil? || (@config.respond_to?(:empty?) && @config.empty?)
|
91
|
+
@logger.error "sms_twilio config is missing"
|
92
|
+
return
|
93
|
+
end
|
75
94
|
|
76
|
-
|
77
|
-
errors << val_err.last
|
78
|
-
end
|
95
|
+
errors = []
|
79
96
|
|
80
|
-
|
81
|
-
errors.each {|err| @logger.error err }
|
82
|
-
return
|
83
|
-
end
|
97
|
+
safe_message = truncate(message, 159)
|
84
98
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
alert.record_send_success!
|
99
|
-
@logger.debug "Sent SMS via Twilio, response status is #{status}, " +
|
100
|
-
"notification_id: #{notification_id}"
|
101
|
-
else
|
102
|
-
@logger.error "Failed to send SMS via Twilio, response status is #{status}, " +
|
103
|
-
"notification_id: #{notification_id}"
|
104
|
-
end
|
105
|
-
rescue => e
|
106
|
-
@logger.error "Error generating or delivering sms to #{contents['address']}: #{e.class}: #{e.message}"
|
107
|
-
@logger.error e.backtrace.join("\n")
|
108
|
-
raise
|
99
|
+
[[account_sid, "Twilio account_sid is missing"],
|
100
|
+
[auth_token, "Twilio auth_token is missing"],
|
101
|
+
[from, "SMS from address is missing"],
|
102
|
+
[address, "SMS address is missing"],
|
103
|
+
[notification_id, "Notification id is missing"]].each do |val_err|
|
104
|
+
|
105
|
+
next unless val_err.first.nil? || (val_err.first.respond_to?(:empty?) && val_err.first.empty?)
|
106
|
+
errors << val_err.last
|
107
|
+
end
|
108
|
+
|
109
|
+
unless errors.empty?
|
110
|
+
errors.each {|err| @logger.error err }
|
111
|
+
return
|
109
112
|
end
|
110
113
|
|
114
|
+
body_data = {'To' => address,
|
115
|
+
'From' => from,
|
116
|
+
'Body' => safe_message}
|
117
|
+
@logger.debug "body_data: #{body_data.inspect}"
|
118
|
+
@logger.debug "authorization: [#{account_sid}, #{auth_token[0..2]}...#{auth_token[-3..-1]}]"
|
119
|
+
|
120
|
+
http = EM::HttpRequest.new(endpoint).post(:body => body_data, :head => {'authorization' => [account_sid, auth_token]})
|
121
|
+
|
122
|
+
@logger.debug "server response: #{http.response}"
|
123
|
+
|
124
|
+
status = (http.nil? || http.response_header.nil?) ? nil : http.response_header.status
|
125
|
+
if (status >= 200) && (status <= 206)
|
126
|
+
@sent += 1
|
127
|
+
alert.record_send_success!
|
128
|
+
@logger.debug "Sent SMS via Twilio, response status is #{status}, " +
|
129
|
+
"notification_id: #{notification_id}"
|
130
|
+
else
|
131
|
+
@logger.error "Failed to send SMS via Twilio, response status is #{status}, " +
|
132
|
+
"notification_id: #{notification_id}"
|
133
|
+
end
|
134
|
+
rescue => e
|
135
|
+
@logger.error "Error generating or delivering sms to #{alert.address}: #{e.class}: #{e.message}"
|
136
|
+
@logger.error e.backtrace.join("\n")
|
137
|
+
raise
|
111
138
|
end
|
139
|
+
|
112
140
|
end
|
113
141
|
end
|
114
142
|
end
|
@@ -1,5 +1,6 @@
|
|
1
|
+
<% summary = @alert.summary -%>
|
1
2
|
<%= @alert.type_sentence_case %>: '<%= @alert.check %>' on <%= @alert.entity -%>
|
2
3
|
<% unless ['acknowledgement', 'test'].include?(@alert.notification_type) -%>
|
3
4
|
is <%= @alert.state_title_case -%>
|
4
5
|
<% end -%>
|
5
|
-
at <%= Time.at(@alert.time).strftime('%-d %b %H:%M')
|
6
|
+
at <%= Time.at(@alert.time).strftime('%-d %b %H:%M') %><%= (summary.nil? || summary.empty?) ? '' : ", #{summary}" -%>
|
data/lib/flapjack/logger.rb
CHANGED
data/lib/flapjack/notifier.rb
CHANGED
@@ -4,6 +4,8 @@ require 'active_support/time'
|
|
4
4
|
|
5
5
|
require 'em-hiredis'
|
6
6
|
|
7
|
+
require 'flapjack/data/alert'
|
8
|
+
|
7
9
|
require 'flapjack/data/contact'
|
8
10
|
require 'flapjack/data/entity_check'
|
9
11
|
require 'flapjack/data/notification'
|
@@ -14,6 +16,7 @@ require 'flapjack/utility'
|
|
14
16
|
require 'flapjack/gateways/email'
|
15
17
|
require 'flapjack/gateways/sms_messagenet'
|
16
18
|
require 'flapjack/gateways/sms_twilio'
|
19
|
+
require 'flapjack/gateways/sms_gammu'
|
17
20
|
require 'flapjack/gateways/aws_sns'
|
18
21
|
|
19
22
|
module Flapjack
|
@@ -127,7 +130,7 @@ module Flapjack
|
|
127
130
|
@notifylog.info("#{event_id} | " +
|
128
131
|
"#{notification.type} | #{message.contact.id} | #{media_type} | #{address}")
|
129
132
|
|
130
|
-
|
133
|
+
if @queues[media_type.to_s].nil?
|
131
134
|
@logger.error("no queue for media type: #{media_type}")
|
132
135
|
return
|
133
136
|
end
|
@@ -154,19 +157,7 @@ module Flapjack
|
|
154
157
|
contents_tags = contents['tags']
|
155
158
|
contents['tags'] = contents_tags.is_a?(Set) ? contents_tags.to_a : contents_tags
|
156
159
|
|
157
|
-
|
158
|
-
case media_type.to_sym
|
159
|
-
when :sms
|
160
|
-
Resque.enqueue_to(@queues['sms'], Flapjack::Gateways::SmsMessagenet, contents)
|
161
|
-
when :sms_twilio
|
162
|
-
Resque.enqueue_to(@queues['sms_twilio'], Flapjack::Gateways::SmsTwilio, contents)
|
163
|
-
when :email
|
164
|
-
Resque.enqueue_to(@queues['email'], Flapjack::Gateways::Email, contents)
|
165
|
-
when :sns
|
166
|
-
Resque.enqueue_to(@queues['sns'], Flapjack::Gateways::AwsSns, contents)
|
167
|
-
else
|
168
|
-
@redis.rpush(@queues[media_type.to_s], Flapjack.dump_json(contents))
|
169
|
-
end
|
160
|
+
Flapjack::Data::Alert.add(@queues[media_type.to_s], contents, :redis => @redis)
|
170
161
|
end
|
171
162
|
end
|
172
163
|
|
data/lib/flapjack/patches.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'thin'
|
4
|
-
require 'resque'
|
5
4
|
require 'redis'
|
6
5
|
|
7
6
|
# we don't want to stop the entire EM reactor when we stop a web server
|
@@ -46,63 +45,6 @@ module Thin
|
|
46
45
|
end
|
47
46
|
end
|
48
47
|
|
49
|
-
# Resque is really designed around a multiprocess model, so we here we
|
50
|
-
# stub some that behaviour away.
|
51
|
-
module Resque
|
52
|
-
|
53
|
-
class Worker
|
54
|
-
|
55
|
-
def procline(string)
|
56
|
-
# $0 = "resque-#{Resque::Version}: #{string}"
|
57
|
-
# log! $0
|
58
|
-
end
|
59
|
-
|
60
|
-
# Redefining the entire method to stop the direct access to $0 :(
|
61
|
-
def work(interval = 5.0, &block)
|
62
|
-
interval = Float(interval)
|
63
|
-
# $0 = "resque: Starting"
|
64
|
-
startup
|
65
|
-
|
66
|
-
loop do
|
67
|
-
|
68
|
-
break if shutdown?
|
69
|
-
|
70
|
-
if not paused? and job = reserve
|
71
|
-
log "got: #{job.inspect}"
|
72
|
-
job.worker = self
|
73
|
-
run_hook :before_fork, job
|
74
|
-
working_on job
|
75
|
-
|
76
|
-
if @child = fork
|
77
|
-
srand # Reseeding
|
78
|
-
procline "Forked #{@child} at #{Time.now.to_i}"
|
79
|
-
Process.wait(@child)
|
80
|
-
else
|
81
|
-
unregister_signal_handlers if !@cant_fork && term_child
|
82
|
-
procline "Processing #{job.queue} since #{Time.now.to_i}"
|
83
|
-
redis.client.reconnect if !@cant_fork # Don't share connection with parent
|
84
|
-
perform(job, &block)
|
85
|
-
exit! unless @cant_fork
|
86
|
-
end
|
87
|
-
|
88
|
-
done_working
|
89
|
-
@child = nil
|
90
|
-
else
|
91
|
-
break if interval.zero?
|
92
|
-
log! "Sleeping for #{interval} seconds"
|
93
|
-
procline paused? ? "Paused" : "Waiting for #{@queues.join(',')}"
|
94
|
-
sleep interval
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
unregister_worker
|
99
|
-
rescue Exception => exception
|
100
|
-
unregister_worker(exception)
|
101
|
-
end
|
102
|
-
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
48
|
# As Redis::Future objects inherit from BasicObject, it's difficult to
|
107
49
|
# distinguish between them and other objects in collected data from
|
108
50
|
# pipelined queries.
|
data/lib/flapjack/pikelet.rb
CHANGED
@@ -13,8 +13,6 @@
|
|
13
13
|
require 'hiredis'
|
14
14
|
require 'redis/connection/synchrony'
|
15
15
|
require 'redis'
|
16
|
-
require 'em-resque'
|
17
|
-
require 'em-resque/worker'
|
18
16
|
require 'thin'
|
19
17
|
|
20
18
|
require 'flapjack/notifier'
|
@@ -26,6 +24,7 @@ require 'flapjack/gateways/pagerduty'
|
|
26
24
|
require 'flapjack/gateways/email'
|
27
25
|
require 'flapjack/gateways/sms_messagenet'
|
28
26
|
require 'flapjack/gateways/sms_twilio'
|
27
|
+
require 'flapjack/gateways/sms_gammu'
|
29
28
|
require 'flapjack/gateways/aws_sns'
|
30
29
|
require 'flapjack/gateways/web'
|
31
30
|
require 'flapjack/logger'
|
@@ -45,7 +44,7 @@ module Flapjack
|
|
45
44
|
|
46
45
|
# TODO find a better way of expressing these two methods
|
47
46
|
def self.is_pikelet?(type)
|
48
|
-
type_klass = [Flapjack::Pikelet::Generic,
|
47
|
+
type_klass = [Flapjack::Pikelet::Generic,
|
49
48
|
Flapjack::Pikelet::Thin].detect do |kl|
|
50
49
|
|
51
50
|
kl::PIKELET_TYPES[type]
|
@@ -57,7 +56,6 @@ module Flapjack
|
|
57
56
|
def self.create(type, opts = {})
|
58
57
|
pikelet = nil
|
59
58
|
[Flapjack::Pikelet::Generic,
|
60
|
-
Flapjack::Pikelet::Resque,
|
61
59
|
Flapjack::Pikelet::Thin].each do |kl|
|
62
60
|
next unless kl::PIKELET_TYPES[type]
|
63
61
|
break if pikelet = kl.create(type, opts)
|
@@ -95,14 +93,6 @@ module Flapjack
|
|
95
93
|
@status = 'stopping'
|
96
94
|
end
|
97
95
|
|
98
|
-
def configure_resque
|
99
|
-
unless ::Resque.instance_variable_defined?('@flapjack_pool') && !::Resque.instance_variable_get('@flapjack_pool').nil?
|
100
|
-
resque_pool = Flapjack::RedisPool.new(:config => @redis_config, :logger => @logger)
|
101
|
-
::Resque.instance_variable_set('@flapjack_pool', resque_pool)
|
102
|
-
::Resque.redis = resque_pool
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
96
|
end
|
107
97
|
|
108
98
|
class Generic < Flapjack::Pikelet::Base
|
@@ -111,7 +101,12 @@ module Flapjack
|
|
111
101
|
'processor' => Flapjack::Processor,
|
112
102
|
'jabber' => Flapjack::Gateways::Jabber,
|
113
103
|
'pagerduty' => Flapjack::Gateways::Pagerduty,
|
114
|
-
'oobetet' => Flapjack::Gateways::Oobetet
|
104
|
+
'oobetet' => Flapjack::Gateways::Oobetet,
|
105
|
+
'email' => Flapjack::Gateways::Email,
|
106
|
+
'sms' => Flapjack::Gateways::SmsMessagenet,
|
107
|
+
'sms_gammu' => Flapjack::Gateways::SmsGammu,
|
108
|
+
'sms_twilio' => Flapjack::Gateways::SmsTwilio,
|
109
|
+
'sns' => Flapjack::Gateways::AwsSns}
|
115
110
|
|
116
111
|
def self.create(type, opts = {})
|
117
112
|
self.new(type, PIKELET_TYPES[type], :config => opts[:config],
|
@@ -123,8 +118,6 @@ module Flapjack
|
|
123
118
|
def initialize(type, pikelet_klass, opts = {})
|
124
119
|
super(type, pikelet_klass, opts)
|
125
120
|
|
126
|
-
configure_resque if type == 'notifier'
|
127
|
-
|
128
121
|
@pikelet = @klass.new(opts.merge(:logger => @logger))
|
129
122
|
end
|
130
123
|
|
@@ -155,69 +148,6 @@ module Flapjack
|
|
155
148
|
|
156
149
|
end
|
157
150
|
|
158
|
-
class Resque < Flapjack::Pikelet::Base
|
159
|
-
|
160
|
-
PIKELET_TYPES = {'email' => Flapjack::Gateways::Email,
|
161
|
-
'sms' => Flapjack::Gateways::SmsMessagenet,
|
162
|
-
'sms_twilio' => Flapjack::Gateways::SmsTwilio,
|
163
|
-
'sns' => Flapjack::Gateways::AwsSns}
|
164
|
-
|
165
|
-
def self.create(type, opts = {})
|
166
|
-
self.new(type, PIKELET_TYPES[type], :config => opts[:config],
|
167
|
-
:redis_config => opts[:redis_config],
|
168
|
-
:boot_time => opts[:boot_time])
|
169
|
-
end
|
170
|
-
|
171
|
-
def initialize(type, pikelet_klass, opts = {})
|
172
|
-
super(type, pikelet_klass, opts)
|
173
|
-
|
174
|
-
configure_resque
|
175
|
-
|
176
|
-
# guard against another Resque pikelet having created the pool already
|
177
|
-
unless defined?(@@redis_connection) && !@@redis_connection.nil?
|
178
|
-
@@redis_connection = Flapjack::RedisPool.new(:config => @redis_config, :logger => @logger)
|
179
|
-
end
|
180
|
-
|
181
|
-
pikelet_klass.instance_variable_set('@config', @config)
|
182
|
-
pikelet_klass.instance_variable_set('@redis', @@redis_connection)
|
183
|
-
pikelet_klass.instance_variable_set('@logger', @logger)
|
184
|
-
|
185
|
-
# TODO error if config['queue'].nil?
|
186
|
-
|
187
|
-
@worker = EM::Resque::Worker.new(@config['queue'])
|
188
|
-
# # Use these to debug the resque workers
|
189
|
-
# worker.verbose = true
|
190
|
-
# worker.very_verbose = true
|
191
|
-
end
|
192
|
-
|
193
|
-
def start
|
194
|
-
@fiber = Fiber.new {
|
195
|
-
@worker.work(0.1)
|
196
|
-
}
|
197
|
-
super
|
198
|
-
@klass.start if @klass.respond_to?(:start)
|
199
|
-
@fiber.resume
|
200
|
-
end
|
201
|
-
|
202
|
-
# this should only reload if all changes can be applied -- will
|
203
|
-
# return false to log warning otherwise
|
204
|
-
def reload(cfg)
|
205
|
-
@klass.respond_to?(:reload) ?
|
206
|
-
(@klass.reload(cfg) && super(cfg)) : super(cfg)
|
207
|
-
end
|
208
|
-
|
209
|
-
def stop
|
210
|
-
@worker.shutdown if @worker && @fiber && @fiber.alive?
|
211
|
-
@klass.stop if @klass.respond_to?(:stop)
|
212
|
-
super
|
213
|
-
end
|
214
|
-
|
215
|
-
def update_status
|
216
|
-
return @status unless 'stopping'.eql?(@status)
|
217
|
-
@status = 'stopped' if @fiber && !@fiber.alive?
|
218
|
-
end
|
219
|
-
end
|
220
|
-
|
221
151
|
class Thin < Flapjack::Pikelet::Base
|
222
152
|
|
223
153
|
PIKELET_TYPES = {'web' => Flapjack::Gateways::Web,
|