flapjack 0.8.5 → 0.8.6
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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/CHANGELOG.md +7 -1
- data/Gemfile +1 -1
- data/bin/flapjack-nsca-receiver +246 -0
- data/etc/flapjack_config.yaml.example +42 -0
- data/flapjack.gemspec +1 -1
- data/lib/flapjack/data/alert.rb +6 -1
- data/lib/flapjack/data/entity_check.rb +20 -0
- data/lib/flapjack/data/event.rb +1 -1
- data/lib/flapjack/data/notification.rb +2 -0
- data/lib/flapjack/gateways/email.rb +19 -11
- data/lib/flapjack/gateways/jabber.rb +13 -9
- data/lib/flapjack/gateways/jsonapi.rb +7 -1
- data/lib/flapjack/gateways/jsonapi/contact_methods.rb +0 -1
- data/lib/flapjack/gateways/pagerduty.rb +7 -3
- data/lib/flapjack/gateways/sms_messagenet.rb +6 -1
- data/lib/flapjack/gateways/web.rb +1 -2
- data/lib/flapjack/processor.rb +6 -5
- data/lib/flapjack/version.rb +1 -1
- data/spec/lib/flapjack/data/entity_check_spec.rb +2 -0
- data/spec/lib/flapjack/gateways/jabber_spec.rb +3 -3
- data/spec/lib/flapjack/gateways/pagerduty_spec.rb +1 -1
- metadata +55 -56
- data/lib/flapjack/data/global.rb +0 -26
- data/spec/lib/flapjack/data/global_spec.rb +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7fc94944c2fb13e947e99bdfe54b0fe6f69a80e3
|
4
|
+
data.tar.gz: 7f090f5ca4504a757a5e773937af868c7eed16ee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b63e5c995f7790525b8eb152a52621e5edb9a1eed65b5abef6e3c0068b8217df0ab34ef6f33c48f694bc19eefd6f247013b8e2eb3e8dd7c480e77c3e4745a5b0
|
7
|
+
data.tar.gz: 6d96a660e3bf02e1bbf820b7ba4d6f14322dc6db76ae621a89266d3d0da5aefa433aa5c4dadd69315a8f317631d649f654d308dddf1316220d331052ff06b2b3
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
## Flapjack Changelog
|
2
2
|
|
3
|
-
# 0.8.
|
3
|
+
# 0.8.6 - 2014-03-14
|
4
|
+
- Bug: tie Thin to < 2.0.0pre gh-442 (@mattdelves)
|
5
|
+
- Feature: Allow site-specific ERB templates for messages. gh-443 (@jswoods)
|
6
|
+
- Feature: Add flapjack-nsca-receiver gh-444 (@giganteous)
|
7
|
+
- Bug: Redis storage leak - unacknowledged_failures gh-446, gh-430 (@ali-graham)
|
8
|
+
|
9
|
+
# 0.8.5 - 2014-02-10
|
4
10
|
- Feature: jsonapi rework now supports PATCH, eg for media under contacts gh-253 (@ali-graham)
|
5
11
|
- Feature: experimental backbone based /edit_contacts page in the web UI has improvements gh-253 (@ali-graham)
|
6
12
|
|
data/Gemfile
CHANGED
@@ -20,6 +20,6 @@ group :test do
|
|
20
20
|
gem 'guard-cucumber'
|
21
21
|
gem 'fuubar'
|
22
22
|
gem 'simplecov', :require => false
|
23
|
-
gem 'debugger-ruby_core_source', '>= 1.3.
|
23
|
+
gem 'debugger-ruby_core_source', '>= 1.3.2' # required for perftools
|
24
24
|
gem 'perftools.rb'
|
25
25
|
end
|
@@ -0,0 +1,246 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Nagios.cfg should be enabled with a command_file:
|
4
|
+
#
|
5
|
+
# command_file=/var/lib/nagios3/rw/nagios.cmd
|
6
|
+
#
|
7
|
+
# The format this script expects looks like:
|
8
|
+
# [$TIMET] PROCESS_SERVICE_CHECK_RESULT;$HOSTNAME$;$SERVICEDESC$;$SERVICESTATE$;$SERVICEOUTPUT$;$SERVICEPERFDATA$
|
9
|
+
#
|
10
|
+
|
11
|
+
unless $:.include?(File.dirname(__FILE__) + '/../lib/')
|
12
|
+
$: << File.dirname(__FILE__) + '/../lib'
|
13
|
+
end
|
14
|
+
|
15
|
+
require 'optparse'
|
16
|
+
require 'ostruct'
|
17
|
+
require 'redis'
|
18
|
+
|
19
|
+
require 'oj'
|
20
|
+
Oj.default_options = { :indent => 0, :mode => :strict }
|
21
|
+
|
22
|
+
require 'dante'
|
23
|
+
|
24
|
+
require 'flapjack/configuration'
|
25
|
+
require 'flapjack/data/event'
|
26
|
+
|
27
|
+
# Nsca example line for a storage-device check:
|
28
|
+
#[1393410685] PROCESS_SERVICE_CHECK_RESULT;db1.dev;STORAGE;0;Raid Set # 000 (800.0GB) is Normal.
|
29
|
+
|
30
|
+
def process_input(opts)
|
31
|
+
redis = opts[:redis]
|
32
|
+
fifo = File.new(opts[:fifo])
|
33
|
+
begin
|
34
|
+
while line = fifo.gets
|
35
|
+
skip unless line
|
36
|
+
split_line = line.split(" ")
|
37
|
+
|
38
|
+
timestamp, passivecheck = split_line
|
39
|
+
split_passive = passivecheck.split(";")
|
40
|
+
timestamp = timestamp.delete('[]')
|
41
|
+
|
42
|
+
check_long_output = ''
|
43
|
+
object_type, entity, check, state, check_output = split_passive
|
44
|
+
|
45
|
+
case
|
46
|
+
when (split_line.length < 2 || split_passive.length < 5)
|
47
|
+
puts "ERROR - rejecting this line; illegal format: [#{line}]"
|
48
|
+
next
|
49
|
+
when (timestamp !~ /^\d+$/)
|
50
|
+
puts "ERROR - rejecting this line; timestamp look like a timestamp: [#{line}]"
|
51
|
+
next
|
52
|
+
when (object_type != 'PROCESS_SERVICE_CHECK_RESULT')
|
53
|
+
puts "ERROR - rejecting this line; identifier 'PROCESS_SERVICE_CHECK_RESULT' is missing: [#{line}]"
|
54
|
+
next
|
55
|
+
end
|
56
|
+
|
57
|
+
puts "#{object_type}, #{timestamp}, #{entity}, #{check}, #{state}, #{check_output}"
|
58
|
+
|
59
|
+
state = {'0' => 'ok', '1' => 'warning', '2' => 'critical'}[state.downcase] || 'unknown'
|
60
|
+
event = {
|
61
|
+
'entity' => entity,
|
62
|
+
'check' => check,
|
63
|
+
'type' => 'service',
|
64
|
+
'state' => state,
|
65
|
+
'summary' => check_output,
|
66
|
+
'details' => nil,
|
67
|
+
'time' => timestamp,
|
68
|
+
}
|
69
|
+
Flapjack::Data::Event.add(event, :redis => redis)
|
70
|
+
end
|
71
|
+
rescue Redis::CannotConnectError
|
72
|
+
puts "Error, unable to to connect to the redis server (#{$!})"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def main(opts)
|
77
|
+
fifo = opts[:fifo]
|
78
|
+
redis = Redis.new(opts[:redis_options])
|
79
|
+
while true
|
80
|
+
process_input(:redis => redis, :fifo => fifo)
|
81
|
+
puts "Whoops with the fifo, restarting main loop in 10 seconds"
|
82
|
+
sleep 10
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
options = OpenStruct.new
|
87
|
+
options.config = Flapjack::Configuration::DEFAULT_CONFIG_PATH
|
88
|
+
options.daemonize = nil
|
89
|
+
|
90
|
+
exe = File.basename(__FILE__)
|
91
|
+
|
92
|
+
optparse = OptionParser.new do |opts|
|
93
|
+
opts.banner = "Usage: #{exe} COMMAND [OPTIONS]"
|
94
|
+
|
95
|
+
opts.separator ""
|
96
|
+
opts.separator "Commands"
|
97
|
+
opts.separator " start #{" " * 25} start #{exe}"
|
98
|
+
opts.separator " stop #{" " * 26} stop #{exe}"
|
99
|
+
opts.separator " restart #{" " * 23} (re)start #{exe}"
|
100
|
+
opts.separator " status #{" " * 24} see if #{exe} is running"
|
101
|
+
opts.separator ""
|
102
|
+
opts.separator "Options"
|
103
|
+
|
104
|
+
opts.on("-c", "--config [PATH]", String, "PATH to the config file to use") do |c|
|
105
|
+
options.config = c
|
106
|
+
end
|
107
|
+
|
108
|
+
opts.on("-f", "--fifo FIFO", String, "Path to the nagios perfdata named pipe") do |f|
|
109
|
+
options.fifo = f
|
110
|
+
end
|
111
|
+
|
112
|
+
opts.on("-d", "--[no-]daemonize", "Daemonize?") do |d|
|
113
|
+
options.daemonize = d
|
114
|
+
end
|
115
|
+
|
116
|
+
opts.on("-p", "--pidfile [PATH]", String, "PATH to the pidfile to write to") do |pid|
|
117
|
+
options.pidfile = pid
|
118
|
+
end
|
119
|
+
|
120
|
+
opts.on("-l", "--logfile [PATH]", String, "PATH to the logfile to write to") do |l|
|
121
|
+
options.logfile = l
|
122
|
+
end
|
123
|
+
|
124
|
+
opts.on_tail("-h", "--help", "Show this usage message") do
|
125
|
+
puts opts
|
126
|
+
puts '
|
127
|
+
Required Nagios Configuration Changes
|
128
|
+
-------------------------------------
|
129
|
+
|
130
|
+
flapjack-nsca-receiver reads events from the nagios "command file" read from by Nagios, written to by the Nsca-daemon.
|
131
|
+
|
132
|
+
The named pipe is automatically created by _nagios_ if it is enabled
|
133
|
+
in the configfile:
|
134
|
+
|
135
|
+
# modified lines:
|
136
|
+
command_file=/var/lib/nagios3/rw/nagios.cmd
|
137
|
+
|
138
|
+
The Nsca daemon is optionally writing to a tempfile if the named pipe does
|
139
|
+
not exist.
|
140
|
+
|
141
|
+
Details on the wiki: https://github.com/flpjck/flapjack/wiki/USING#XXX
|
142
|
+
'
|
143
|
+
|
144
|
+
exit
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
optparse.parse!(ARGV)
|
149
|
+
|
150
|
+
FLAPJACK_ENV = ENV['FLAPJACK_ENV'] || 'production'
|
151
|
+
|
152
|
+
config = Flapjack::Configuration.new
|
153
|
+
config.load(options.config)
|
154
|
+
config_env = config.all
|
155
|
+
redis_options = config.for_redis
|
156
|
+
|
157
|
+
if config_env.nil? || config_env.empty?
|
158
|
+
puts "No config data for environment '#{FLAPJACK_ENV}' found in '#{options.config}'"
|
159
|
+
puts optparse
|
160
|
+
exit 1
|
161
|
+
end
|
162
|
+
|
163
|
+
config_nr = config_env['nsca-receiver'] || {}
|
164
|
+
|
165
|
+
pidfile = options.pidfile.nil? ?
|
166
|
+
(config_nr['pid_file'] || "/var/run/flapjack/#{exe}.pid") :
|
167
|
+
options.pidfile
|
168
|
+
|
169
|
+
logfile = options.logfile.nil? ?
|
170
|
+
(config_nr['log_file'] || "/var/log/flapjack/#{exe}.log") :
|
171
|
+
options.logfile
|
172
|
+
|
173
|
+
fifo = options.fifo.nil? ?
|
174
|
+
(config_nr['fifo'] || '/var/lib/nagios3/rw/nagios.cmd') :
|
175
|
+
options.fifo
|
176
|
+
|
177
|
+
daemonize = options.daemonize.nil? ?
|
178
|
+
!!config_nr['daemonize'] :
|
179
|
+
options.daemonize
|
180
|
+
|
181
|
+
|
182
|
+
runner = Dante::Runner.new(exe, :pid_path => pidfile, :log_path => logfile)
|
183
|
+
case ARGV[0]
|
184
|
+
when "start", "restart"
|
185
|
+
unless File.exist?(fifo)
|
186
|
+
raise "No fifo (named pipe) file found at #{fifo}"
|
187
|
+
end
|
188
|
+
unless File.pipe?(fifo)
|
189
|
+
raise "The file at #{fifo} is not a named pipe, try using mkfifo to make one"
|
190
|
+
end
|
191
|
+
unless File.readable?(fifo)
|
192
|
+
raise "The fifo (named pipe) at #{fifo} is unreadable"
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
case ARGV[0]
|
197
|
+
when "start"
|
198
|
+
if runner.daemon_running?
|
199
|
+
puts "#{exe} is already running."
|
200
|
+
exit 1
|
201
|
+
else
|
202
|
+
print "#{exe} starting..."
|
203
|
+
runner.execute(:daemonize => daemonize) {
|
204
|
+
main(:redis_options => redis_options, :fifo => fifo)
|
205
|
+
}
|
206
|
+
puts " done."
|
207
|
+
end
|
208
|
+
|
209
|
+
when "stop"
|
210
|
+
if runner.daemon_running?
|
211
|
+
print "#{exe} stopping..."
|
212
|
+
runner.execute(:kill => true)
|
213
|
+
puts " done."
|
214
|
+
else
|
215
|
+
puts "#{exe} is not running."
|
216
|
+
exit 1
|
217
|
+
end
|
218
|
+
|
219
|
+
when "restart"
|
220
|
+
print "#{exe} restarting..."
|
221
|
+
runner.execute(:daemonize => true, :restart => true) {
|
222
|
+
main(:redis_options => redis_options, :fifo => fifo)
|
223
|
+
}
|
224
|
+
puts " done."
|
225
|
+
|
226
|
+
when "status"
|
227
|
+
uptime = (runner.daemon_running?) ? Time.now - File.stat(pidfile).ctime : 0
|
228
|
+
if runner.daemon_running?
|
229
|
+
puts "#{exe} is running: #{uptime}"
|
230
|
+
else
|
231
|
+
puts "#{exe} is not running"
|
232
|
+
exit 3
|
233
|
+
end
|
234
|
+
|
235
|
+
else
|
236
|
+
if ARGV.nil? || ARGV.empty?
|
237
|
+
puts "No command provided"
|
238
|
+
else
|
239
|
+
puts "Unknown command provided: '#{ARGV[0]}'"
|
240
|
+
end
|
241
|
+
puts "\n#{optparse}"
|
242
|
+
exit 1
|
243
|
+
|
244
|
+
end
|
245
|
+
|
246
|
+
|
@@ -37,6 +37,10 @@ production:
|
|
37
37
|
fifo: "/var/cache/nagios3/event_stream.fifo"
|
38
38
|
pid_file: "/var/run/flapjack/flapjack-nagios-receiver.pid"
|
39
39
|
log_file: "/var/log/flapjack/flapjack-nagios-receiver.log"
|
40
|
+
nsca-receiver:
|
41
|
+
fifo: "/var/lib/nagios3/rw/nagios.cmd"
|
42
|
+
pid_file: "/var/run/flapjack/flapjack-nsca-receiver.pid"
|
43
|
+
log_file: "/var/log/flapjack/flapjack-nsca-receiver.log"
|
40
44
|
gateways:
|
41
45
|
email:
|
42
46
|
enabled: no
|
@@ -53,6 +57,14 @@ production:
|
|
53
57
|
# type:
|
54
58
|
# username:
|
55
59
|
# password:
|
60
|
+
# location of custom alert templates
|
61
|
+
#templates:
|
62
|
+
# rollup_subject.text: '/etc/flapjack/templates/email/rollup_subject.text.erb'
|
63
|
+
# alert_subject.text: '/etc/flapjack/templates/email/alert_subject.text.erb'
|
64
|
+
# rollup.text: '/etc/flapjack/templates/email/rollup.text.erb'
|
65
|
+
# alert.text: '/etc/flapjack/templates/email/alert.text.erb'
|
66
|
+
# rollup.html: '/etc/flapjack/templates/email/rollup.html.erb'
|
67
|
+
# alert.html: '/etc/flapjack/templates/email/alert.html.erb'
|
56
68
|
sms:
|
57
69
|
enabled: no
|
58
70
|
queue: sms_notifications
|
@@ -62,6 +74,10 @@ production:
|
|
62
74
|
logger:
|
63
75
|
level: INFO
|
64
76
|
syslog_errors: yes
|
77
|
+
# location of custom alert templates
|
78
|
+
#templates:
|
79
|
+
# rollup.text: '/etc/flapjack/templates/sms/rollup.text.erb'
|
80
|
+
# alert.text: '/etc/flapjack/templates/sms/alert.text.erb'
|
65
81
|
jabber:
|
66
82
|
enabled: no
|
67
83
|
queue: jabber_notifications
|
@@ -76,12 +92,19 @@ production:
|
|
76
92
|
logger:
|
77
93
|
level: INFO
|
78
94
|
syslog_errors: yes
|
95
|
+
# location of custom alert templates
|
96
|
+
#templates:
|
97
|
+
# rollup.text: '/etc/flapjack/templates/jabber/rollup.text.erb'
|
98
|
+
# alert.text: '/etc/flapjack/templates/jabber/alert.text.erb'
|
79
99
|
pagerduty:
|
80
100
|
enabled: no
|
81
101
|
queue: pagerduty_notifications
|
82
102
|
logger:
|
83
103
|
level: INFO
|
84
104
|
syslog_errors: yes
|
105
|
+
# location of custom alert templates
|
106
|
+
#templates:
|
107
|
+
# alert.text: '/etc/flapjack/templates/pagerduty/alert.text.erb'
|
85
108
|
web:
|
86
109
|
enabled: yes
|
87
110
|
port: 3080
|
@@ -180,6 +203,14 @@ development:
|
|
180
203
|
# type:
|
181
204
|
# username:
|
182
205
|
# password:
|
206
|
+
# location of custom alert templates
|
207
|
+
#templates:
|
208
|
+
# rollup_subject.text: '/etc/flapjack/templates/email/rollup_subject.text.erb'
|
209
|
+
# alert_subject.text: '/etc/flapjack/templates/email/alert_subject.text.erb'
|
210
|
+
# rollup.text: '/etc/flapjack/templates/email/rollup.text.erb'
|
211
|
+
# alert.text: '/etc/flapjack/templates/email/alert.text.erb'
|
212
|
+
# rollup.html: '/etc/flapjack/templates/email/rollup.html.erb'
|
213
|
+
# alert.html: '/etc/flapjack/templates/email/alert.html.erb'
|
183
214
|
sms:
|
184
215
|
enabled: yes
|
185
216
|
queue: sms_notifications
|
@@ -191,6 +222,10 @@ development:
|
|
191
222
|
logger:
|
192
223
|
level: INFO
|
193
224
|
syslog_errors: yes
|
225
|
+
# location of custom alert templates
|
226
|
+
#templates:
|
227
|
+
# rollup.text: '/etc/flapjack/templates/sms/rollup.text.erb'
|
228
|
+
# alert.text: '/etc/flapjack/templates/sms/alert.text.erb'
|
194
229
|
jabber:
|
195
230
|
enabled: no
|
196
231
|
queue: jabber_notifications
|
@@ -205,12 +240,19 @@ development:
|
|
205
240
|
logger:
|
206
241
|
level: INFO
|
207
242
|
syslog_errors: yes
|
243
|
+
# location of custom alert templates
|
244
|
+
#templates:
|
245
|
+
# rollup.text: '/etc/flapjack/templates/jabber/rollup.text.erb'
|
246
|
+
# alert.text: '/etc/flapjack/templates/jabber/alert.text.erb'
|
208
247
|
pagerduty:
|
209
248
|
enabled: no
|
210
249
|
queue: pagerduty_notifications
|
211
250
|
logger:
|
212
251
|
level: INFO
|
213
252
|
syslog_errors: yes
|
253
|
+
# location of custom alert templates
|
254
|
+
#templates:
|
255
|
+
# alert.text: '/etc/flapjack/templates/pagerduty/alert.text.erb'
|
214
256
|
web:
|
215
257
|
enabled: yes
|
216
258
|
port: 4080
|
data/flapjack.gemspec
CHANGED
@@ -29,7 +29,7 @@ Gem::Specification.new do |gem|
|
|
29
29
|
gem.add_dependency 'resque', '~> 1.23.0'
|
30
30
|
gem.add_dependency 'sinatra'
|
31
31
|
gem.add_dependency 'rack-fiber_pool'
|
32
|
-
gem.add_dependency 'thin'
|
32
|
+
gem.add_dependency 'thin', '~> 1.6.1'
|
33
33
|
gem.add_dependency 'mail'
|
34
34
|
gem.add_dependency 'blather', '~> 0.8.3'
|
35
35
|
gem.add_dependency 'chronic'
|
data/lib/flapjack/data/alert.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
require 'digest'
|
4
|
+
|
3
5
|
require 'active_support/inflector'
|
4
6
|
require 'flapjack/utility'
|
5
7
|
|
@@ -44,7 +46,8 @@ module Flapjack
|
|
44
46
|
# from self
|
45
47
|
attr_reader :entity,
|
46
48
|
:check,
|
47
|
-
:notification_id
|
49
|
+
:notification_id,
|
50
|
+
:event_hash
|
48
51
|
|
49
52
|
include Flapjack::Utility
|
50
53
|
|
@@ -52,6 +55,8 @@ module Flapjack
|
|
52
55
|
raise "no logger supplied" unless @logger = opts[:logger]
|
53
56
|
|
54
57
|
@event_id = contents['event_id']
|
58
|
+
@event_hash = contents['event_hash'] ||
|
59
|
+
Digest.hexencode(Digest::SHA1.new.digest(@event_id))[0..7].downcase
|
55
60
|
@state = contents['state']
|
56
61
|
@summary = contents['summary']
|
57
62
|
@acknowledgement_duration = contents['duration'] # SMELLY
|
@@ -105,6 +105,16 @@ module Flapjack
|
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
108
|
+
def self.unacknowledged_failing(options = {})
|
109
|
+
raise "Redis connection not set" unless redis = options[:redis]
|
110
|
+
|
111
|
+
redis.zrange('failed_checks', '0', '-1').reject {|entity_check|
|
112
|
+
redis.exists(entity_check + ':unscheduled_maintenance')
|
113
|
+
}.collect {|entity_check|
|
114
|
+
Flapjack::Data::EntityCheck.for_event_id(entity_check, :redis => redis)
|
115
|
+
}
|
116
|
+
end
|
117
|
+
|
108
118
|
def self.conflate_to_keys(entity_checks_hash)
|
109
119
|
result = []
|
110
120
|
entity_checks_hash.each {|entity, checks|
|
@@ -617,6 +627,16 @@ module Flapjack
|
|
617
627
|
ta += check.split(' ').map {|x| x.downcase}
|
618
628
|
end
|
619
629
|
|
630
|
+
def ack_hash
|
631
|
+
@ack_hash ||= @redis.hget('check_hashes_by_id', @key)
|
632
|
+
if @ack_hash.nil?
|
633
|
+
sha1 = Digest::SHA1.new
|
634
|
+
@ack_hash = Digest.hexencode(sha1.digest(@key))[0..7].downcase
|
635
|
+
@redis.hset("checks_by_hash", @ack_hash, @key)
|
636
|
+
end
|
637
|
+
@ack_hash
|
638
|
+
end
|
639
|
+
|
620
640
|
private
|
621
641
|
|
622
642
|
def initialize(entity, check, options = {})
|
data/lib/flapjack/data/event.rb
CHANGED
@@ -52,6 +52,7 @@ module Flapjack
|
|
52
52
|
|
53
53
|
tag_data = event.tags.is_a?(Set) ? event.tags.to_a : nil
|
54
54
|
notif = {'event_id' => event.id,
|
55
|
+
'event_hash' => event.id_hash,
|
55
56
|
'state' => event.state,
|
56
57
|
'summary' => event.summary,
|
57
58
|
'details' => event.details,
|
@@ -105,6 +106,7 @@ module Flapjack
|
|
105
106
|
|
106
107
|
def contents
|
107
108
|
@contents ||= {'event_id' => @event_id,
|
109
|
+
'event_hash' => @event_hash,
|
108
110
|
'state' => @state,
|
109
111
|
'summary' => @summary,
|
110
112
|
'duration' => @duration,
|
@@ -107,19 +107,27 @@ module Flapjack
|
|
107
107
|
message_id = opts[:message_id]
|
108
108
|
alert = opts[:alert]
|
109
109
|
|
110
|
-
message_type =
|
111
|
-
when alert.rollup
|
112
|
-
'rollup'
|
113
|
-
else
|
114
|
-
'alert'
|
115
|
-
end
|
110
|
+
message_type = alert.rollup ? 'rollup' : 'alert'
|
116
111
|
|
117
112
|
mydir = File.dirname(__FILE__)
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
113
|
+
subject_template_path = case
|
114
|
+
when @config.has_key?('templates') && @config['templates']["#{message_type}_subject.text"]
|
115
|
+
@config['templates']["#{message_type}_subject.text"]
|
116
|
+
else
|
117
|
+
mydir + "/email/#{message_type}_subject.text.erb"
|
118
|
+
end
|
119
|
+
text_template_path = case
|
120
|
+
when @config.has_key?('templates') && @config['templates']["#{message_type}.text"]
|
121
|
+
@config['templates']["#{message_type}.text"]
|
122
|
+
else
|
123
|
+
mydir + "/email/#{message_type}.text.erb"
|
124
|
+
end
|
125
|
+
html_template_path = case
|
126
|
+
when @config.has_key?('templates') && @config['templates']["#{message_type}.html"]
|
127
|
+
@config['templates']["#{message_type}.html"]
|
128
|
+
else
|
129
|
+
mydir + "/email/#{message_type}.html.erb"
|
130
|
+
end
|
123
131
|
subject_template = ERB.new(File.read(subject_template_path), nil, '-')
|
124
132
|
text_template = ERB.new(File.read(text_template_path), nil, '-')
|
125
133
|
html_template = ERB.new(File.read(html_template_path), nil, '-')
|
@@ -171,7 +171,7 @@ module Flapjack
|
|
171
171
|
command = th.chunks.join(' ')
|
172
172
|
|
173
173
|
case command
|
174
|
-
when /^ACKID\s+(
|
174
|
+
when /^ACKID\s+([0-9A-F]+)(?:\s*(.*?)(?:\s*duration:.*?(\w+.*))?)$/im
|
175
175
|
ackid = $1
|
176
176
|
comment = $2
|
177
177
|
duration_str = $3
|
@@ -189,7 +189,7 @@ module Flapjack
|
|
189
189
|
four_hours = 4 * 60 * 60
|
190
190
|
duration = (dur.nil? || (dur <= 0)) ? four_hours : dur
|
191
191
|
|
192
|
-
event_id = @redis.hget('
|
192
|
+
event_id = @redis.hget('check_hashes', ackid)
|
193
193
|
|
194
194
|
if event_id.nil?
|
195
195
|
error = "not found"
|
@@ -523,17 +523,21 @@ module Flapjack
|
|
523
523
|
@logger.debug("processing jabber notification address: #{alert.address}, entity: #{alert.entity}, " +
|
524
524
|
"check: '#{alert.check}', state: #{alert.state}, summary: #{alert.summary}")
|
525
525
|
|
526
|
-
@ack_str =
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
"#{@config['alias']}: ACKID #{event['event_count']}" : nil
|
526
|
+
@ack_str = if alert.state.eql?('ok') || ['test', 'acknowledgement'].include?(alert.type)
|
527
|
+
nil
|
528
|
+
else
|
529
|
+
"#{@config['alias']}: ACKID #{alert.event_hash}"
|
530
|
+
end
|
532
531
|
|
533
532
|
message_type = alert.rollup ? 'rollup' : 'alert'
|
534
533
|
|
535
534
|
mydir = File.dirname(__FILE__)
|
536
|
-
message_template_path =
|
535
|
+
message_template_path = case
|
536
|
+
when @config.has_key?('templates') && @config['templates']["#{message_type}.text"]
|
537
|
+
@config['templates']["#{message_type}.text"]
|
538
|
+
else
|
539
|
+
mydir + "/jabber/#{message_type}.text.erb"
|
540
|
+
end
|
537
541
|
message_template = ERB.new(File.read(message_template_path), nil, '-')
|
538
542
|
|
539
543
|
@alert = alert
|
@@ -195,8 +195,14 @@ module Flapjack
|
|
195
195
|
query_string = (request.query_string.respond_to?(:length) &&
|
196
196
|
request.query_string.length > 0) ? "?#{request.query_string}" : ""
|
197
197
|
if logger.debug?
|
198
|
+
body_debug = case
|
199
|
+
when response.body.respond_to?(:each)
|
200
|
+
response.body.each_with_index {|r, i| "body[#{i}]: #{r}"}.join(', ')
|
201
|
+
else
|
202
|
+
response.body.to_s
|
203
|
+
end
|
198
204
|
logger.debug("Returning #{response.status} for #{request.request_method} " +
|
199
|
-
"#{request.path_info}#{query_string}, body: #{
|
205
|
+
"#{request.path_info}#{query_string}, body: #{body_debug}")
|
200
206
|
elsif logger.info?
|
201
207
|
logger.info("Returning #{response.status} for #{request.request_method} " +
|
202
208
|
"#{request.path_info}#{query_string}")
|
@@ -130,7 +130,6 @@ module Flapjack
|
|
130
130
|
contacts_data.map {|cd| cd['id']}.to_json
|
131
131
|
end
|
132
132
|
|
133
|
-
|
134
133
|
# Returns all (/contacts) or some (/contacts/1,2,3) or one (/contact/2) contact(s)
|
135
134
|
# https://github.com/flpjck/flapjack/wiki/API#wiki-get_contacts
|
136
135
|
app.get %r{/contacts(?:/)?([^/]+)?$} do
|
@@ -7,7 +7,6 @@ require 'em-synchrony/em-http'
|
|
7
7
|
require 'oj'
|
8
8
|
|
9
9
|
require 'flapjack/data/entity_check'
|
10
|
-
require 'flapjack/data/global'
|
11
10
|
require 'flapjack/data/alert'
|
12
11
|
require 'flapjack/redis_pool'
|
13
12
|
require 'flapjack/utility'
|
@@ -81,7 +80,12 @@ module Flapjack
|
|
81
80
|
"check: '#{alert.check}', state: #{alert.state}, summary: #{alert.summary}")
|
82
81
|
|
83
82
|
mydir = File.dirname(__FILE__)
|
84
|
-
message_template_path =
|
83
|
+
message_template_path = case
|
84
|
+
when @config.has_key?('templates') && @config['templates']['alert.text']
|
85
|
+
@config['templates']['alert.text']
|
86
|
+
else
|
87
|
+
mydir + "/pagerduty/alert.text.erb"
|
88
|
+
end
|
85
89
|
message_template = ERB.new(File.read(message_template_path), nil, '-')
|
86
90
|
|
87
91
|
@alert = alert
|
@@ -174,7 +178,7 @@ module Flapjack
|
|
174
178
|
def find_pagerduty_acknowledgements
|
175
179
|
@logger.debug("looking for acks in pagerduty for unack'd problems")
|
176
180
|
|
177
|
-
unacknowledged_failing_checks = Flapjack::Data::
|
181
|
+
unacknowledged_failing_checks = Flapjack::Data::EntityCheck.unacknowledged_failing(:redis => @redis)
|
178
182
|
|
179
183
|
@logger.debug "found unacknowledged failing checks as follows: " + unacknowledged_failing_checks.join(', ')
|
180
184
|
|
@@ -34,7 +34,12 @@ module Flapjack
|
|
34
34
|
message_type = alert.rollup ? 'rollup' : 'alert'
|
35
35
|
|
36
36
|
my_dir = File.dirname(__FILE__)
|
37
|
-
sms_template_path =
|
37
|
+
sms_template_path = case
|
38
|
+
when @config.has_key?('templates') && @config['templates']["#{message_type}.text"]
|
39
|
+
@config['templates']["#{message_type}.text"]
|
40
|
+
else
|
41
|
+
my_dir + "/sms_messagenet/#{message_type}.text.erb"
|
42
|
+
end
|
38
43
|
sms_template = ERB.new(File.read(sms_template_path), nil, '-')
|
39
44
|
|
40
45
|
@alert = alert
|
@@ -218,8 +218,7 @@ module Flapjack
|
|
218
218
|
@last_notifications = last_notification_data(entity_check)
|
219
219
|
|
220
220
|
@scheduled_maintenances = entity_check.maintenances(nil, nil, :scheduled => true)
|
221
|
-
@acknowledgement_id = entity_check.failed? ?
|
222
|
-
entity_check.event_count_at(entity_check.last_change) : nil
|
221
|
+
@acknowledgement_id = entity_check.failed? ? entity_check.ack_hash : nil
|
223
222
|
|
224
223
|
@current_scheduled_maintenance = entity_check.current_maintenance(:scheduled => true)
|
225
224
|
@current_unscheduled_maintenance = entity_check.current_maintenance(:scheduled => false)
|
data/lib/flapjack/processor.rb
CHANGED
@@ -175,6 +175,12 @@ module Flapjack
|
|
175
175
|
case event.type
|
176
176
|
# Service events represent current state of checks on monitored systems
|
177
177
|
when 'service'
|
178
|
+
if event.failure?
|
179
|
+
# ensure that the check's hash is stored for later lookup
|
180
|
+
# can't happen inside the multi as it must get a value
|
181
|
+
event.id_hash = entity_check.ack_hash
|
182
|
+
end
|
183
|
+
|
178
184
|
@redis.multi
|
179
185
|
if event.ok?
|
180
186
|
@redis.hincrby('event_counters', 'ok', 1)
|
@@ -182,7 +188,6 @@ module Flapjack
|
|
182
188
|
elsif event.failure?
|
183
189
|
@redis.hincrby('event_counters', 'failure', 1)
|
184
190
|
@redis.hincrby("event_counters:#{@instance_id}", 'failure', 1)
|
185
|
-
@redis.hset('unacknowledged_failures', event.counter, event.id)
|
186
191
|
end
|
187
192
|
@redis.exec
|
188
193
|
|
@@ -217,10 +222,6 @@ module Flapjack
|
|
217
222
|
@redis.hset(event.id + ':actions', timestamp, event.state)
|
218
223
|
@redis.hincrby('event_counters', 'action', 1)
|
219
224
|
@redis.hincrby("event_counters:#{@instance_id}", 'action', 1)
|
220
|
-
|
221
|
-
if event.acknowledgement? && event.acknowledgement_id
|
222
|
-
@redis.hdel('unacknowledged_failures', event.acknowledgement_id)
|
223
|
-
end
|
224
225
|
@redis.exec
|
225
226
|
end
|
226
227
|
|
data/lib/flapjack/version.rb
CHANGED
@@ -52,13 +52,13 @@ describe Flapjack::Gateways::Jabber, :logger => true do
|
|
52
52
|
end
|
53
53
|
|
54
54
|
it "receives an acknowledgement message" do
|
55
|
-
expect(stanza).to receive(:body).and_return('flapjack: ACKID
|
55
|
+
expect(stanza).to receive(:body).and_return('flapjack: ACKID 1f8ac10f fixing now duration: 90m')
|
56
56
|
from = double('from')
|
57
57
|
expect(from).to receive(:stripped).and_return('sender')
|
58
58
|
expect(stanza).to receive(:from).and_return(from)
|
59
59
|
|
60
60
|
redis = double('redis')
|
61
|
-
expect(redis).to receive(:hget).with('
|
61
|
+
expect(redis).to receive(:hget).with('check_hashes', '1f8ac10f').
|
62
62
|
and_return('main-example.com:ping')
|
63
63
|
|
64
64
|
entity_check = double(Flapjack::Data::EntityCheck)
|
@@ -66,7 +66,7 @@ describe Flapjack::Gateways::Jabber, :logger => true do
|
|
66
66
|
|
67
67
|
expect(Flapjack::Data::Event).to receive(:create_acknowledgement).
|
68
68
|
with('main-example.com', 'ping', :summary => 'fixing now',
|
69
|
-
:acknowledgement_id => '
|
69
|
+
:acknowledgement_id => '1f8ac10f',
|
70
70
|
:duration => (90 * 60), :redis => redis)
|
71
71
|
|
72
72
|
expect(Flapjack::Data::EntityCheck).to receive(:for_event_id).
|
@@ -109,7 +109,7 @@ describe Flapjack::Gateways::Pagerduty, :logger => true do
|
|
109
109
|
expect(Flapjack::Data::Event).to receive(:create_acknowledgement).with('foo-app-01.bar.net', 'PING',
|
110
110
|
:summary => 'Acknowledged on PagerDuty', :duration => 14400, :redis => redis)
|
111
111
|
|
112
|
-
expect(Flapjack::Data::
|
112
|
+
expect(Flapjack::Data::EntityCheck).to receive(:unacknowledged_failing).and_return([entity_check])
|
113
113
|
|
114
114
|
expect(fp).to receive(:pagerduty_acknowledged?).and_return({})
|
115
115
|
|
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.8.
|
4
|
+
version: 0.8.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lindsay Holmwood
|
@@ -10,300 +10,300 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-
|
13
|
+
date: 2014-03-14 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: dante
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
|
-
- -
|
26
|
+
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
version: '0'
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: oj
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- -
|
33
|
+
- - ">="
|
34
34
|
- !ruby/object:Gem::Version
|
35
35
|
version: '0'
|
36
36
|
type: :runtime
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- -
|
40
|
+
- - ">="
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
version: '0'
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: eventmachine
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
|
-
- - ~>
|
47
|
+
- - "~>"
|
48
48
|
- !ruby/object:Gem::Version
|
49
49
|
version: 1.0.0
|
50
50
|
type: :runtime
|
51
51
|
prerelease: false
|
52
52
|
version_requirements: !ruby/object:Gem::Requirement
|
53
53
|
requirements:
|
54
|
-
- - ~>
|
54
|
+
- - "~>"
|
55
55
|
- !ruby/object:Gem::Version
|
56
56
|
version: 1.0.0
|
57
57
|
- !ruby/object:Gem::Dependency
|
58
58
|
name: hiredis
|
59
59
|
requirement: !ruby/object:Gem::Requirement
|
60
60
|
requirements:
|
61
|
-
- -
|
61
|
+
- - ">="
|
62
62
|
- !ruby/object:Gem::Version
|
63
63
|
version: '0'
|
64
64
|
type: :runtime
|
65
65
|
prerelease: false
|
66
66
|
version_requirements: !ruby/object:Gem::Requirement
|
67
67
|
requirements:
|
68
|
-
- -
|
68
|
+
- - ">="
|
69
69
|
- !ruby/object:Gem::Version
|
70
70
|
version: '0'
|
71
71
|
- !ruby/object:Gem::Dependency
|
72
72
|
name: em-synchrony
|
73
73
|
requirement: !ruby/object:Gem::Requirement
|
74
74
|
requirements:
|
75
|
-
- - ~>
|
75
|
+
- - "~>"
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: 1.0.2
|
78
78
|
type: :runtime
|
79
79
|
prerelease: false
|
80
80
|
version_requirements: !ruby/object:Gem::Requirement
|
81
81
|
requirements:
|
82
|
-
- - ~>
|
82
|
+
- - "~>"
|
83
83
|
- !ruby/object:Gem::Version
|
84
84
|
version: 1.0.2
|
85
85
|
- !ruby/object:Gem::Dependency
|
86
86
|
name: em-http-request
|
87
87
|
requirement: !ruby/object:Gem::Requirement
|
88
88
|
requirements:
|
89
|
-
- -
|
89
|
+
- - ">="
|
90
90
|
- !ruby/object:Gem::Version
|
91
91
|
version: '0'
|
92
92
|
type: :runtime
|
93
93
|
prerelease: false
|
94
94
|
version_requirements: !ruby/object:Gem::Requirement
|
95
95
|
requirements:
|
96
|
-
- -
|
96
|
+
- - ">="
|
97
97
|
- !ruby/object:Gem::Version
|
98
98
|
version: '0'
|
99
99
|
- !ruby/object:Gem::Dependency
|
100
100
|
name: redis
|
101
101
|
requirement: !ruby/object:Gem::Requirement
|
102
102
|
requirements:
|
103
|
-
- - ~>
|
103
|
+
- - "~>"
|
104
104
|
- !ruby/object:Gem::Version
|
105
105
|
version: 3.0.6
|
106
106
|
type: :runtime
|
107
107
|
prerelease: false
|
108
108
|
version_requirements: !ruby/object:Gem::Requirement
|
109
109
|
requirements:
|
110
|
-
- - ~>
|
110
|
+
- - "~>"
|
111
111
|
- !ruby/object:Gem::Version
|
112
112
|
version: 3.0.6
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: em-resque
|
115
115
|
requirement: !ruby/object:Gem::Requirement
|
116
116
|
requirements:
|
117
|
-
- -
|
117
|
+
- - ">="
|
118
118
|
- !ruby/object:Gem::Version
|
119
119
|
version: '0'
|
120
120
|
type: :runtime
|
121
121
|
prerelease: false
|
122
122
|
version_requirements: !ruby/object:Gem::Requirement
|
123
123
|
requirements:
|
124
|
-
- -
|
124
|
+
- - ">="
|
125
125
|
- !ruby/object:Gem::Version
|
126
126
|
version: '0'
|
127
127
|
- !ruby/object:Gem::Dependency
|
128
128
|
name: resque
|
129
129
|
requirement: !ruby/object:Gem::Requirement
|
130
130
|
requirements:
|
131
|
-
- - ~>
|
131
|
+
- - "~>"
|
132
132
|
- !ruby/object:Gem::Version
|
133
133
|
version: 1.23.0
|
134
134
|
type: :runtime
|
135
135
|
prerelease: false
|
136
136
|
version_requirements: !ruby/object:Gem::Requirement
|
137
137
|
requirements:
|
138
|
-
- - ~>
|
138
|
+
- - "~>"
|
139
139
|
- !ruby/object:Gem::Version
|
140
140
|
version: 1.23.0
|
141
141
|
- !ruby/object:Gem::Dependency
|
142
142
|
name: sinatra
|
143
143
|
requirement: !ruby/object:Gem::Requirement
|
144
144
|
requirements:
|
145
|
-
- -
|
145
|
+
- - ">="
|
146
146
|
- !ruby/object:Gem::Version
|
147
147
|
version: '0'
|
148
148
|
type: :runtime
|
149
149
|
prerelease: false
|
150
150
|
version_requirements: !ruby/object:Gem::Requirement
|
151
151
|
requirements:
|
152
|
-
- -
|
152
|
+
- - ">="
|
153
153
|
- !ruby/object:Gem::Version
|
154
154
|
version: '0'
|
155
155
|
- !ruby/object:Gem::Dependency
|
156
156
|
name: rack-fiber_pool
|
157
157
|
requirement: !ruby/object:Gem::Requirement
|
158
158
|
requirements:
|
159
|
-
- -
|
159
|
+
- - ">="
|
160
160
|
- !ruby/object:Gem::Version
|
161
161
|
version: '0'
|
162
162
|
type: :runtime
|
163
163
|
prerelease: false
|
164
164
|
version_requirements: !ruby/object:Gem::Requirement
|
165
165
|
requirements:
|
166
|
-
- -
|
166
|
+
- - ">="
|
167
167
|
- !ruby/object:Gem::Version
|
168
168
|
version: '0'
|
169
169
|
- !ruby/object:Gem::Dependency
|
170
170
|
name: thin
|
171
171
|
requirement: !ruby/object:Gem::Requirement
|
172
172
|
requirements:
|
173
|
-
- -
|
173
|
+
- - "~>"
|
174
174
|
- !ruby/object:Gem::Version
|
175
|
-
version:
|
175
|
+
version: 1.6.1
|
176
176
|
type: :runtime
|
177
177
|
prerelease: false
|
178
178
|
version_requirements: !ruby/object:Gem::Requirement
|
179
179
|
requirements:
|
180
|
-
- -
|
180
|
+
- - "~>"
|
181
181
|
- !ruby/object:Gem::Version
|
182
|
-
version:
|
182
|
+
version: 1.6.1
|
183
183
|
- !ruby/object:Gem::Dependency
|
184
184
|
name: mail
|
185
185
|
requirement: !ruby/object:Gem::Requirement
|
186
186
|
requirements:
|
187
|
-
- -
|
187
|
+
- - ">="
|
188
188
|
- !ruby/object:Gem::Version
|
189
189
|
version: '0'
|
190
190
|
type: :runtime
|
191
191
|
prerelease: false
|
192
192
|
version_requirements: !ruby/object:Gem::Requirement
|
193
193
|
requirements:
|
194
|
-
- -
|
194
|
+
- - ">="
|
195
195
|
- !ruby/object:Gem::Version
|
196
196
|
version: '0'
|
197
197
|
- !ruby/object:Gem::Dependency
|
198
198
|
name: blather
|
199
199
|
requirement: !ruby/object:Gem::Requirement
|
200
200
|
requirements:
|
201
|
-
- - ~>
|
201
|
+
- - "~>"
|
202
202
|
- !ruby/object:Gem::Version
|
203
203
|
version: 0.8.3
|
204
204
|
type: :runtime
|
205
205
|
prerelease: false
|
206
206
|
version_requirements: !ruby/object:Gem::Requirement
|
207
207
|
requirements:
|
208
|
-
- - ~>
|
208
|
+
- - "~>"
|
209
209
|
- !ruby/object:Gem::Version
|
210
210
|
version: 0.8.3
|
211
211
|
- !ruby/object:Gem::Dependency
|
212
212
|
name: chronic
|
213
213
|
requirement: !ruby/object:Gem::Requirement
|
214
214
|
requirements:
|
215
|
-
- -
|
215
|
+
- - ">="
|
216
216
|
- !ruby/object:Gem::Version
|
217
217
|
version: '0'
|
218
218
|
type: :runtime
|
219
219
|
prerelease: false
|
220
220
|
version_requirements: !ruby/object:Gem::Requirement
|
221
221
|
requirements:
|
222
|
-
- -
|
222
|
+
- - ">="
|
223
223
|
- !ruby/object:Gem::Version
|
224
224
|
version: '0'
|
225
225
|
- !ruby/object:Gem::Dependency
|
226
226
|
name: chronic_duration
|
227
227
|
requirement: !ruby/object:Gem::Requirement
|
228
228
|
requirements:
|
229
|
-
- -
|
229
|
+
- - ">="
|
230
230
|
- !ruby/object:Gem::Version
|
231
231
|
version: '0'
|
232
232
|
type: :runtime
|
233
233
|
prerelease: false
|
234
234
|
version_requirements: !ruby/object:Gem::Requirement
|
235
235
|
requirements:
|
236
|
-
- -
|
236
|
+
- - ">="
|
237
237
|
- !ruby/object:Gem::Version
|
238
238
|
version: '0'
|
239
239
|
- !ruby/object:Gem::Dependency
|
240
240
|
name: activesupport
|
241
241
|
requirement: !ruby/object:Gem::Requirement
|
242
242
|
requirements:
|
243
|
-
- - ~>
|
243
|
+
- - "~>"
|
244
244
|
- !ruby/object:Gem::Version
|
245
245
|
version: 3.2.14
|
246
246
|
type: :runtime
|
247
247
|
prerelease: false
|
248
248
|
version_requirements: !ruby/object:Gem::Requirement
|
249
249
|
requirements:
|
250
|
-
- - ~>
|
250
|
+
- - "~>"
|
251
251
|
- !ruby/object:Gem::Version
|
252
252
|
version: 3.2.14
|
253
253
|
- !ruby/object:Gem::Dependency
|
254
254
|
name: ice_cube
|
255
255
|
requirement: !ruby/object:Gem::Requirement
|
256
256
|
requirements:
|
257
|
-
- -
|
257
|
+
- - ">="
|
258
258
|
- !ruby/object:Gem::Version
|
259
259
|
version: '0'
|
260
260
|
type: :runtime
|
261
261
|
prerelease: false
|
262
262
|
version_requirements: !ruby/object:Gem::Requirement
|
263
263
|
requirements:
|
264
|
-
- -
|
264
|
+
- - ">="
|
265
265
|
- !ruby/object:Gem::Version
|
266
266
|
version: '0'
|
267
267
|
- !ruby/object:Gem::Dependency
|
268
268
|
name: tzinfo
|
269
269
|
requirement: !ruby/object:Gem::Requirement
|
270
270
|
requirements:
|
271
|
-
- - ~>
|
271
|
+
- - "~>"
|
272
272
|
- !ruby/object:Gem::Version
|
273
273
|
version: 1.0.1
|
274
274
|
type: :runtime
|
275
275
|
prerelease: false
|
276
276
|
version_requirements: !ruby/object:Gem::Requirement
|
277
277
|
requirements:
|
278
|
-
- - ~>
|
278
|
+
- - "~>"
|
279
279
|
- !ruby/object:Gem::Version
|
280
280
|
version: 1.0.1
|
281
281
|
- !ruby/object:Gem::Dependency
|
282
282
|
name: tzinfo-data
|
283
283
|
requirement: !ruby/object:Gem::Requirement
|
284
284
|
requirements:
|
285
|
-
- -
|
285
|
+
- - ">="
|
286
286
|
- !ruby/object:Gem::Version
|
287
287
|
version: '0'
|
288
288
|
type: :runtime
|
289
289
|
prerelease: false
|
290
290
|
version_requirements: !ruby/object:Gem::Requirement
|
291
291
|
requirements:
|
292
|
-
- -
|
292
|
+
- - ">="
|
293
293
|
- !ruby/object:Gem::Version
|
294
294
|
version: '0'
|
295
295
|
- !ruby/object:Gem::Dependency
|
296
296
|
name: rake
|
297
297
|
requirement: !ruby/object:Gem::Requirement
|
298
298
|
requirements:
|
299
|
-
- -
|
299
|
+
- - ">="
|
300
300
|
- !ruby/object:Gem::Version
|
301
301
|
version: '0'
|
302
302
|
type: :development
|
303
303
|
prerelease: false
|
304
304
|
version_requirements: !ruby/object:Gem::Requirement
|
305
305
|
requirements:
|
306
|
-
- -
|
306
|
+
- - ">="
|
307
307
|
- !ruby/object:Gem::Version
|
308
308
|
version: '0'
|
309
309
|
description: Flapjack is a distributed monitoring notification system that provides
|
@@ -313,6 +313,7 @@ email: lindsay@holmwood.id.au
|
|
313
313
|
executables:
|
314
314
|
- flapjack
|
315
315
|
- flapjack-nagios-receiver
|
316
|
+
- flapjack-nsca-receiver
|
316
317
|
- flapjack-populator
|
317
318
|
- flapper
|
318
319
|
- receive-events
|
@@ -320,10 +321,10 @@ executables:
|
|
320
321
|
extensions: []
|
321
322
|
extra_rdoc_files: []
|
322
323
|
files:
|
323
|
-
- .gitignore
|
324
|
-
- .gitmodules
|
325
|
-
- .rspec
|
326
|
-
- .travis.yml
|
324
|
+
- ".gitignore"
|
325
|
+
- ".gitmodules"
|
326
|
+
- ".rspec"
|
327
|
+
- ".travis.yml"
|
327
328
|
- CHANGELOG.md
|
328
329
|
- Gemfile
|
329
330
|
- Guardfile
|
@@ -332,6 +333,7 @@ files:
|
|
332
333
|
- Rakefile
|
333
334
|
- bin/flapjack
|
334
335
|
- bin/flapjack-nagios-receiver
|
336
|
+
- bin/flapjack-nsca-receiver
|
335
337
|
- bin/flapjack-populator
|
336
338
|
- bin/flapper
|
337
339
|
- bin/receive-events
|
@@ -370,7 +372,6 @@ files:
|
|
370
372
|
- lib/flapjack/data/entity.rb
|
371
373
|
- lib/flapjack/data/entity_check.rb
|
372
374
|
- lib/flapjack/data/event.rb
|
373
|
-
- lib/flapjack/data/global.rb
|
374
375
|
- lib/flapjack/data/message.rb
|
375
376
|
- lib/flapjack/data/notification.rb
|
376
377
|
- lib/flapjack/data/notification_rule.rb
|
@@ -486,7 +487,6 @@ files:
|
|
486
487
|
- spec/lib/flapjack/data/entity_check_spec.rb
|
487
488
|
- spec/lib/flapjack/data/entity_spec.rb
|
488
489
|
- spec/lib/flapjack/data/event_spec.rb
|
489
|
-
- spec/lib/flapjack/data/global_spec.rb
|
490
490
|
- spec/lib/flapjack/data/message_spec.rb
|
491
491
|
- spec/lib/flapjack/data/notification_rule_spec.rb
|
492
492
|
- spec/lib/flapjack/data/notification_spec.rb
|
@@ -557,17 +557,17 @@ require_paths:
|
|
557
557
|
- lib
|
558
558
|
required_ruby_version: !ruby/object:Gem::Requirement
|
559
559
|
requirements:
|
560
|
-
- -
|
560
|
+
- - ">="
|
561
561
|
- !ruby/object:Gem::Version
|
562
562
|
version: '0'
|
563
563
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
564
564
|
requirements:
|
565
|
-
- -
|
565
|
+
- - ">="
|
566
566
|
- !ruby/object:Gem::Version
|
567
567
|
version: '0'
|
568
568
|
requirements: []
|
569
569
|
rubyforge_project:
|
570
|
-
rubygems_version: 2.
|
570
|
+
rubygems_version: 2.2.2
|
571
571
|
signing_key:
|
572
572
|
specification_version: 4
|
573
573
|
summary: Intelligent, scalable, distributed monitoring notification system.
|
@@ -598,7 +598,6 @@ test_files:
|
|
598
598
|
- spec/lib/flapjack/data/entity_check_spec.rb
|
599
599
|
- spec/lib/flapjack/data/entity_spec.rb
|
600
600
|
- spec/lib/flapjack/data/event_spec.rb
|
601
|
-
- spec/lib/flapjack/data/global_spec.rb
|
602
601
|
- spec/lib/flapjack/data/message_spec.rb
|
603
602
|
- spec/lib/flapjack/data/notification_rule_spec.rb
|
604
603
|
- spec/lib/flapjack/data/notification_spec.rb
|
data/lib/flapjack/data/global.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'flapjack/data/entity_check'
|
4
|
-
|
5
|
-
module Flapjack
|
6
|
-
|
7
|
-
module Data
|
8
|
-
|
9
|
-
class Global
|
10
|
-
|
11
|
-
# TODO maybe this should be an EntityCheck class method?
|
12
|
-
def self.unacknowledged_failing_checks(options = {})
|
13
|
-
raise "Redis connection not set" unless redis = options[:redis]
|
14
|
-
|
15
|
-
redis.zrange('failed_checks', '0', '-1').reject {|entity_check|
|
16
|
-
redis.exists(entity_check + ':unscheduled_maintenance')
|
17
|
-
}.collect {|entity_check|
|
18
|
-
Flapjack::Data::EntityCheck.for_event_id(entity_check, :redis => redis)
|
19
|
-
}
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|