flapjack 0.6.53 → 0.6.54
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/bin/flapjack +103 -19
- data/bin/flapjack-nagios-receiver +166 -52
- data/bin/flapper +107 -18
- data/etc/flapjack_config.yaml.example +16 -0
- data/features/events.feature +63 -0
- data/features/steps/events_steps.rb +5 -5
- data/features/steps/notifications_steps.rb +8 -6
- data/features/steps/time_travel_steps.rb +4 -4
- data/features/support/env.rb +1 -2
- data/flapjack.gemspec +1 -1
- data/lib/flapjack/configuration.rb +11 -13
- data/lib/flapjack/coordinator.rb +100 -220
- data/lib/flapjack/data/entity_check.rb +2 -2
- data/lib/flapjack/data/event.rb +3 -3
- data/lib/flapjack/executive.rb +30 -40
- data/lib/flapjack/filters/delays.rb +1 -1
- data/lib/flapjack/gateways/api.rb +6 -23
- data/lib/flapjack/gateways/email.rb +4 -10
- data/lib/flapjack/gateways/email/alert.html.haml +0 -5
- data/lib/flapjack/gateways/email/alert.text.erb +0 -1
- data/lib/flapjack/gateways/jabber.rb +80 -67
- data/lib/flapjack/gateways/oobetet.rb +29 -25
- data/lib/flapjack/gateways/pagerduty.rb +26 -45
- data/lib/flapjack/gateways/sms_messagenet.rb +10 -17
- data/lib/flapjack/gateways/web.rb +7 -21
- data/lib/flapjack/gateways/web/views/_css.haml +3 -0
- data/lib/flapjack/gateways/web/views/check.haml +1 -1
- data/lib/flapjack/logger.rb +57 -0
- data/lib/flapjack/patches.rb +0 -10
- data/lib/flapjack/pikelet.rb +214 -30
- data/lib/flapjack/redis_pool.rb +2 -17
- data/lib/flapjack/version.rb +1 -1
- data/spec/lib/flapjack/coordinator_spec.rb +116 -136
- data/spec/lib/flapjack/data/entity_check_spec.rb +3 -3
- data/spec/lib/flapjack/executive_spec.rb +33 -34
- data/spec/lib/flapjack/gateways/api_spec.rb +4 -2
- data/spec/lib/flapjack/gateways/jabber_spec.rb +39 -36
- data/spec/lib/flapjack/gateways/oobetet_spec.rb +14 -24
- data/spec/lib/flapjack/gateways/pagerduty_spec.rb +43 -45
- data/spec/lib/flapjack/gateways/web_spec.rb +42 -35
- data/spec/lib/flapjack/logger_spec.rb +32 -0
- data/spec/lib/flapjack/pikelet_spec.rb +124 -15
- data/spec/lib/flapjack/redis_pool_spec.rb +1 -3
- data/spec/spec_helper.rb +34 -1
- data/tasks/events.rake +1 -0
- data/tmp/create_event_ok.rb +31 -0
- data/tmp/create_event_unknown.rb +31 -0
- data/tmp/create_events_ok.rb +1 -1
- metadata +10 -11
- data/bin/flapjack-nagios-receiver-control +0 -15
- data/bin/flapper-control +0 -15
- data/lib/flapjack/daemonizing.rb +0 -186
- data/lib/flapjack/gateways/base.rb +0 -38
data/tasks/events.rake
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'redis'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
#id = "%.2d" % (1..10).to_a[rand(9)]
|
7
|
+
|
8
|
+
events = []
|
9
|
+
|
10
|
+
events << {
|
11
|
+
'entity' => "client1-localhost-test-1",
|
12
|
+
'check' => 'foo',
|
13
|
+
'type' => 'service',
|
14
|
+
'state' => 'ok',
|
15
|
+
}.to_json
|
16
|
+
|
17
|
+
redis = Redis.new(:db => 13)
|
18
|
+
|
19
|
+
events.each {|event|
|
20
|
+
redis.rpush 'events', event
|
21
|
+
}
|
22
|
+
|
23
|
+
puts "#{Time.now} - finished loading up events"
|
24
|
+
previous_events_size = redis.llen 'events'
|
25
|
+
while previous_events_size > 0
|
26
|
+
sleep 1
|
27
|
+
events_size = redis.llen 'events'
|
28
|
+
throughput = previous_events_size - events_size
|
29
|
+
previous_events_size = events_size
|
30
|
+
puts "#{Time.now} - #{events_size} (#{throughput})"
|
31
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'redis'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
#id = "%.2d" % (1..10).to_a[rand(9)]
|
7
|
+
|
8
|
+
events = []
|
9
|
+
|
10
|
+
events << {
|
11
|
+
'entity' => "client1-localhost-test-1",
|
12
|
+
'check' => 'foo',
|
13
|
+
'type' => 'service',
|
14
|
+
'state' => 'unknown',
|
15
|
+
}.to_json
|
16
|
+
|
17
|
+
redis = Redis.new(:db => 13)
|
18
|
+
|
19
|
+
events.each {|event|
|
20
|
+
redis.rpush 'events', event
|
21
|
+
}
|
22
|
+
|
23
|
+
puts "#{Time.now} - finished loading up events"
|
24
|
+
previous_events_size = redis.llen 'events'
|
25
|
+
while previous_events_size > 0
|
26
|
+
sleep 1
|
27
|
+
events_size = redis.llen 'events'
|
28
|
+
throughput = previous_events_size - events_size
|
29
|
+
previous_events_size = events_size
|
30
|
+
puts "#{Time.now} - #{events_size} (#{throughput})"
|
31
|
+
end
|
data/tmp/create_events_ok.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flapjack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.54
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,10 +11,10 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2012-12-
|
14
|
+
date: 2012-12-27 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
|
-
name:
|
17
|
+
name: dante
|
18
18
|
requirement: !ruby/object:Gem::Requirement
|
19
19
|
none: false
|
20
20
|
requirements:
|
@@ -308,11 +308,9 @@ email: lindsay@holmwood.id.au
|
|
308
308
|
executables:
|
309
309
|
- flapjack
|
310
310
|
- flapjack-nagios-receiver
|
311
|
-
- flapjack-nagios-receiver-control
|
312
311
|
- flapjack-netsaint-parser
|
313
312
|
- flapjack-populator
|
314
313
|
- flapper
|
315
|
-
- flapper-control
|
316
314
|
extensions: []
|
317
315
|
extra_rdoc_files: []
|
318
316
|
files:
|
@@ -328,11 +326,9 @@ files:
|
|
328
326
|
- Rakefile
|
329
327
|
- bin/flapjack
|
330
328
|
- bin/flapjack-nagios-receiver
|
331
|
-
- bin/flapjack-nagios-receiver-control
|
332
329
|
- bin/flapjack-netsaint-parser
|
333
330
|
- bin/flapjack-populator
|
334
331
|
- bin/flapper
|
335
|
-
- bin/flapper-control
|
336
332
|
- config.ru
|
337
333
|
- dist/etc/default/flapjack-notifier
|
338
334
|
- dist/etc/default/flapjack-workers
|
@@ -366,7 +362,6 @@ files:
|
|
366
362
|
- lib/flapjack/checks/ping
|
367
363
|
- lib/flapjack/configuration.rb
|
368
364
|
- lib/flapjack/coordinator.rb
|
369
|
-
- lib/flapjack/daemonizing.rb
|
370
365
|
- lib/flapjack/data/contact.rb
|
371
366
|
- lib/flapjack/data/entity.rb
|
372
367
|
- lib/flapjack/data/entity_check.rb
|
@@ -386,7 +381,6 @@ files:
|
|
386
381
|
- lib/flapjack/gateways/api.rb
|
387
382
|
- lib/flapjack/gateways/api/entity_check_presenter.rb
|
388
383
|
- lib/flapjack/gateways/api/entity_presenter.rb
|
389
|
-
- lib/flapjack/gateways/base.rb
|
390
384
|
- lib/flapjack/gateways/email.rb
|
391
385
|
- lib/flapjack/gateways/email/alert.html.haml
|
392
386
|
- lib/flapjack/gateways/email/alert.text.erb
|
@@ -402,6 +396,7 @@ files:
|
|
402
396
|
- lib/flapjack/gateways/web/views/contacts.haml
|
403
397
|
- lib/flapjack/gateways/web/views/index.haml
|
404
398
|
- lib/flapjack/gateways/web/views/self_stats.haml
|
399
|
+
- lib/flapjack/logger.rb
|
405
400
|
- lib/flapjack/patches.rb
|
406
401
|
- lib/flapjack/pikelet.rb
|
407
402
|
- lib/flapjack/rack_logger.rb
|
@@ -436,6 +431,7 @@ files:
|
|
436
431
|
- spec/lib/flapjack/gateways/web/views/contact.haml_spec.rb
|
437
432
|
- spec/lib/flapjack/gateways/web/views/index.haml_spec.rb
|
438
433
|
- spec/lib/flapjack/gateways/web_spec.rb
|
434
|
+
- spec/lib/flapjack/logger_spec.rb
|
439
435
|
- spec/lib/flapjack/pikelet_spec.rb
|
440
436
|
- spec/lib/flapjack/redis_pool_spec.rb
|
441
437
|
- spec/lib/flapjack/utility_spec.rb
|
@@ -447,6 +443,8 @@ files:
|
|
447
443
|
- tasks/profile.rake
|
448
444
|
- tmp/acknowledge.rb
|
449
445
|
- tmp/create_config_yaml.rb
|
446
|
+
- tmp/create_event_ok.rb
|
447
|
+
- tmp/create_event_unknown.rb
|
450
448
|
- tmp/create_events_failure.rb
|
451
449
|
- tmp/create_events_ok.rb
|
452
450
|
- tmp/create_events_ok_fail_ack_ok.rb
|
@@ -471,7 +469,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
471
469
|
version: '0'
|
472
470
|
segments:
|
473
471
|
- 0
|
474
|
-
hash:
|
472
|
+
hash: -3074875956567986285
|
475
473
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
476
474
|
none: false
|
477
475
|
requirements:
|
@@ -480,7 +478,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
480
478
|
version: '0'
|
481
479
|
segments:
|
482
480
|
- 0
|
483
|
-
hash:
|
481
|
+
hash: -3074875956567986285
|
484
482
|
requirements: []
|
485
483
|
rubyforge_project:
|
486
484
|
rubygems_version: 1.8.23
|
@@ -526,6 +524,7 @@ test_files:
|
|
526
524
|
- spec/lib/flapjack/gateways/web/views/contact.haml_spec.rb
|
527
525
|
- spec/lib/flapjack/gateways/web/views/index.haml_spec.rb
|
528
526
|
- spec/lib/flapjack/gateways/web_spec.rb
|
527
|
+
- spec/lib/flapjack/logger_spec.rb
|
529
528
|
- spec/lib/flapjack/pikelet_spec.rb
|
530
529
|
- spec/lib/flapjack/redis_pool_spec.rb
|
531
530
|
- spec/lib/flapjack/utility_spec.rb
|
@@ -1,15 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'daemons'
|
4
|
-
opts = {
|
5
|
-
:app_name => 'flapjack-nagios-receiver',
|
6
|
-
:dir_mode => :normal,
|
7
|
-
:dir => '/var/run/flapjack',
|
8
|
-
:multiple => false,
|
9
|
-
:backtrace => true,
|
10
|
-
:monitor => false,
|
11
|
-
:log_dir => '/var/log/flapjack',
|
12
|
-
:log_output => true,
|
13
|
-
}
|
14
|
-
Daemons.run(File.join(File.dirname(__FILE__) ,'flapjack-nagios-receiver'), opts)
|
15
|
-
|
data/bin/flapper-control
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'daemons'
|
4
|
-
opts = {
|
5
|
-
:app_name => 'flapper',
|
6
|
-
:dir_mode => :normal,
|
7
|
-
:dir => '/var/run/flapjack',
|
8
|
-
:multiple => false,
|
9
|
-
:backtrace => true,
|
10
|
-
:monitor => false,
|
11
|
-
:log_dir => '/var/log/flapjack',
|
12
|
-
:log_output => true,
|
13
|
-
}
|
14
|
-
Daemons.run(File.join(File.dirname(__FILE__) ,'flapper'), opts)
|
15
|
-
|
data/lib/flapjack/daemonizing.rb
DELETED
@@ -1,186 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
# Copied from thin.
|
4
|
-
|
5
|
-
require 'etc'
|
6
|
-
require 'daemons' unless RUBY_PLATFORM =~ /mswin/
|
7
|
-
|
8
|
-
module Process
|
9
|
-
# Returns +true+ the process identified by +pid+ is running.
|
10
|
-
def running?(pid)
|
11
|
-
Process.getpgid(pid) != -1
|
12
|
-
rescue Errno::EPERM
|
13
|
-
true
|
14
|
-
rescue Errno::ESRCH
|
15
|
-
false
|
16
|
-
end
|
17
|
-
module_function :running?
|
18
|
-
end
|
19
|
-
|
20
|
-
module Flapjack
|
21
|
-
# Raised when the pid file already exist starting as a daemon.
|
22
|
-
class PidFileExist < RuntimeError; end
|
23
|
-
|
24
|
-
# Module included in classes that can be turned into a daemon.
|
25
|
-
# Handle stuff like:
|
26
|
-
# * storing the PID in a file
|
27
|
-
# * redirecting output to the log file
|
28
|
-
# * changing process privileges
|
29
|
-
# * killing the process gracefully
|
30
|
-
module Daemonizable
|
31
|
-
attr_accessor :pid_file, :log_file
|
32
|
-
|
33
|
-
def self.included(base)
|
34
|
-
base.extend ClassMethods
|
35
|
-
end
|
36
|
-
|
37
|
-
def pid
|
38
|
-
File.exist?(pid_file) ? open(pid_file).read.to_i : nil
|
39
|
-
end
|
40
|
-
|
41
|
-
# Turns the current script into a daemon process that detaches from the console.
|
42
|
-
def daemonize
|
43
|
-
raise PlatformNotSupported, 'Daemonizing is not supported on Windows' if RUBY_PLATFORM =~ /mswin/
|
44
|
-
raise ArgumentError, 'You must specify a pid_file to daemonize' unless @pid_file
|
45
|
-
|
46
|
-
remove_stale_pid_file
|
47
|
-
|
48
|
-
pwd = Dir.pwd # Current directory is changed during daemonization, so store it
|
49
|
-
|
50
|
-
# HACK we need to create the directory before daemonization to prevent a bug under 1.9
|
51
|
-
# ignoring all signals when the directory is created after daemonization.
|
52
|
-
FileUtils.mkdir_p File.dirname(@pid_file)
|
53
|
-
FileUtils.mkdir_p File.dirname(@log_file)
|
54
|
-
|
55
|
-
Daemonize.daemonize(File.expand_path(@log_file), 'flapjack server')
|
56
|
-
|
57
|
-
Dir.chdir(pwd)
|
58
|
-
|
59
|
-
write_pid_file
|
60
|
-
|
61
|
-
self.after_daemonize if self.respond_to? :after_daemonize
|
62
|
-
|
63
|
-
at_exit do
|
64
|
-
puts ">> Exiting!"
|
65
|
-
remove_pid_file
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
# Change privileges of the process
|
70
|
-
# to the specified user and group.
|
71
|
-
def change_privilege(user, group=user)
|
72
|
-
puts ">> Changing process privilege to #{user}:#{group}"
|
73
|
-
|
74
|
-
uid, gid = Process.euid, Process.egid
|
75
|
-
target_uid = Etc.getpwnam(user).uid
|
76
|
-
target_gid = Etc.getgrnam(group).gid
|
77
|
-
|
78
|
-
if uid != target_uid || gid != target_gid
|
79
|
-
# Change process ownership
|
80
|
-
Process.initgroups(user, target_gid)
|
81
|
-
Process::GID.change_privilege(target_gid)
|
82
|
-
Process::UID.change_privilege(target_uid)
|
83
|
-
end
|
84
|
-
rescue Errno::EPERM => e
|
85
|
-
puts "Couldn't change user and group to #{user}:#{group}: #{e}"
|
86
|
-
end
|
87
|
-
|
88
|
-
# Register a proc to be called to restart the server.
|
89
|
-
def on_restart(&block)
|
90
|
-
@on_restart = block
|
91
|
-
end
|
92
|
-
|
93
|
-
# Restart the server.
|
94
|
-
def restart
|
95
|
-
if @on_restart
|
96
|
-
puts '>> Restarting ...'
|
97
|
-
stop
|
98
|
-
remove_pid_file
|
99
|
-
@on_restart.call
|
100
|
-
exit!
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
module ClassMethods
|
105
|
-
# Send a QUIT or INT (if timeout is +0+) signal the process which
|
106
|
-
# PID is stored in +pid_file+.
|
107
|
-
# If the process is still running after +timeout+, KILL signal is
|
108
|
-
# sent.
|
109
|
-
def kill(pid_file, timeout=60)
|
110
|
-
if timeout == 0
|
111
|
-
send_signal('INT', pid_file, timeout)
|
112
|
-
else
|
113
|
-
send_signal('QUIT', pid_file, timeout)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
# Restart the server by sending HUP signal.
|
118
|
-
def restart(pid_file)
|
119
|
-
send_signal('HUP', pid_file)
|
120
|
-
end
|
121
|
-
|
122
|
-
# Send a +signal+ to the process which PID is stored in +pid_file+.
|
123
|
-
def send_signal(signal, pid_file, timeout=60)
|
124
|
-
if pid = read_pid_file(pid_file)
|
125
|
-
puts "Sending #{signal} signal to process #{pid} ... "
|
126
|
-
Process.kill(signal, pid)
|
127
|
-
Timeout.timeout(timeout) do
|
128
|
-
sleep 0.1 while Process.running?(pid)
|
129
|
-
end
|
130
|
-
else
|
131
|
-
puts "Can't stop process, no PID found in #{pid_file}"
|
132
|
-
end
|
133
|
-
rescue Timeout::Error
|
134
|
-
puts "Timeout!"
|
135
|
-
force_kill pid_file
|
136
|
-
rescue Interrupt
|
137
|
-
force_kill pid_file
|
138
|
-
rescue Errno::ESRCH # No such process
|
139
|
-
puts "process not found!"
|
140
|
-
force_kill pid_file
|
141
|
-
end
|
142
|
-
|
143
|
-
def force_kill(pid_file)
|
144
|
-
if pid = read_pid_file(pid_file)
|
145
|
-
puts "Sending KILL signal to process #{pid} ... "
|
146
|
-
Process.kill("KILL", pid)
|
147
|
-
File.delete(pid_file) if File.exist?(pid_file)
|
148
|
-
else
|
149
|
-
puts "Can't stop process, no PID found in #{pid_file}"
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
def read_pid_file(file)
|
154
|
-
if File.file?(file) && pid = File.read(file)
|
155
|
-
pid.to_i
|
156
|
-
else
|
157
|
-
nil
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
protected
|
163
|
-
def remove_pid_file
|
164
|
-
File.delete(@pid_file) if @pid_file && File.exists?(@pid_file)
|
165
|
-
end
|
166
|
-
|
167
|
-
def write_pid_file
|
168
|
-
puts ">> Writing PID to #{@pid_file}"
|
169
|
-
open(@pid_file,"w") { |f| f.write(Process.pid) }
|
170
|
-
File.chmod(0644, @pid_file)
|
171
|
-
end
|
172
|
-
|
173
|
-
# If PID file is stale, remove it.
|
174
|
-
def remove_stale_pid_file
|
175
|
-
if File.exist?(@pid_file)
|
176
|
-
if pid && Process.running?(pid)
|
177
|
-
raise PidFileExist, "#{@pid_file} already exists, seems like it's already running (process ID: #{pid}). " +
|
178
|
-
"Stop the process or delete #{@pid_file}."
|
179
|
-
else
|
180
|
-
puts ">> Deleting stale PID file #{@pid_file}"
|
181
|
-
remove_pid_file
|
182
|
-
end
|
183
|
-
end
|
184
|
-
end
|
185
|
-
end
|
186
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'flapjack/pikelet'
|
4
|
-
|
5
|
-
module Flapjack
|
6
|
-
module Gateways
|
7
|
-
|
8
|
-
module Generic
|
9
|
-
include Flapjack::GenericPikelet
|
10
|
-
end
|
11
|
-
|
12
|
-
module Resque
|
13
|
-
include Flapjack::Pikelet
|
14
|
-
end
|
15
|
-
|
16
|
-
module Thin
|
17
|
-
include Flapjack::Pikelet
|
18
|
-
|
19
|
-
attr_accessor :port
|
20
|
-
|
21
|
-
alias_method :orig_bootstrap, :bootstrap
|
22
|
-
|
23
|
-
def bootstrap(opts = {})
|
24
|
-
return if @bootstrapped
|
25
|
-
|
26
|
-
if config = opts[:config]
|
27
|
-
@port = config['port'] ? config['port'].to_i : nil
|
28
|
-
@port = 3001 if (@port.nil? || @port <= 0 || @port > 65535)
|
29
|
-
end
|
30
|
-
|
31
|
-
orig_bootstrap(opts)
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|