flapjack 1.0.0rc1 → 1.0.0rc2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e16bef3e8503fd14954e5bdf4b843e9d92e598a6
4
- data.tar.gz: b85df2a0ca05163744d236b6c6237c63ad1b2520
3
+ metadata.gz: dcd6cb806d57b78108cc67f2064b1b435a73f79e
4
+ data.tar.gz: 753950c0c1decff7c6d5fc954eede8a0e686d0ec
5
5
  SHA512:
6
- metadata.gz: c0daf6b0e65f5810b695de85af843dfab1cafcda10d0e750c5e93adf6f4f0b9bf8506f19341cd0e29c5b06db47382a1016248d1f356fc335f47207187f8da9ce
7
- data.tar.gz: 71fe02a6300726b86393640e1d919c43537b6f07a90d95e3a22ba366f05836dea16966227d11643530b1acf1e9dc0407464bbd73c23b54689ed70f413734183a
6
+ metadata.gz: 08641c26fb0307d9d9df4d97cc28876d962e883ea5094e719a2837eaad608f8f03d5c936a495cb42aba8d67c651c89dfc1a70da2a22e4aaf5caa70d5414c61b3
7
+ data.tar.gz: 7011a9ad02bf9bebed297f288496f7e1dc5af7a91e9fffa1d85e78a040514fc069e9cbe021917533f32b3f224b3f1b7c63f5f5d981749c0420afcbd04f52a1dc
data/.gitignore CHANGED
@@ -29,3 +29,11 @@ _site/*
29
29
  .ruby-version
30
30
  .rvmrc
31
31
  artifacts/*
32
+ libexec/httpbroker
33
+ libexec/httpbroker.linux_386
34
+ libexec/httpbroker.linux_amd64
35
+ libexec/oneoff
36
+ libexec/oneoff.linux_386
37
+ libexec/oneoff.linux_amd64
38
+ src/github.com
39
+ src/gopkg.in
data/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  ## Flapjack Changelog
2
2
 
3
+ # 1.0.0rc2 - 2014-07-17
4
+ - Feature: jsonapi GET /checks badab0d (@ali-graham)
5
+ - Feature: Add HTTP broker, one-off event submitter, general Go support #553 (@auxesis)
6
+ - Feature: Add ability to disable check via JSON API #529 (@ali-graham)
7
+ - Feature: Jabber - Resource in JID should be supported in the config #557 (@jessereynolds)
8
+ - Feature: Jabber - add an 'identifiers' list to the config #558 (@jessereynolds)
9
+ - Feature: Jabber - handle HipChat style status updates as per XEP-0085 #559 (@jessereynolds)
10
+ - Feature: auto generate entity ID on creation if none supplied #568 (@jessereynolds)
11
+ - Feature: Use friendly help if you run the server with old syntax #564 (@Hobbsee)
12
+ - Bug: Decommission Check button returning a 404 #538 (@ali-graham)
13
+ - Bug: incorrect default config path in flapjack gli #554 (@jessereynolds)
14
+ - Bug: make sure that base_url isn't escaped so that links work correctly #556 (@mattdelves)
15
+ - Chore: Update development section of example config file #546 (@Hobbsee)
16
+
17
+
3
18
  # 1.0.0rc1 - 2014-06-25
4
19
  - Feature: Allow ncsm to be skipped using a configured whitelist #485 (@StephenWeber)
5
20
  - Feature: GLI the CLI (one command to rule them all) #478 (@auxesis, @ali-graham)
data/README.md CHANGED
@@ -15,6 +15,10 @@ Flapjack will be immediately useful to you if:
15
15
  * Your monitoring infrastructure is **multitenant**, and each customer has a **bespoke alerting strategy**.
16
16
  * You want to dip your toe in the water and try alternative check execution engines like Sensu, Icinga, or cron in parallel to Nagios.
17
17
 
18
+ ### Try it out with the Quickstart Guide
19
+
20
+ The [Quickstart](http://flapjack.io/quickstart/) guide will help you get Flapjack up and running in a VM locally using Vagrant and VirtualBox.
21
+
18
22
  ### The technical low-down
19
23
 
20
24
  Flapjack provides a scalable method for dealing with events representing changes in system state (OK -> WARNING -> CRITICAL transitions) and alerting appropriate people as necessary.
data/bin/flapjack CHANGED
@@ -12,7 +12,7 @@ program_desc 'Flexible monitoring notification routing system'
12
12
  version Flapjack::VERSION
13
13
 
14
14
  desc 'Configuration file to use'
15
- default_value '/etc/flapjack/flapjack.yaml'
15
+ default_value '/etc/flapjack/flapjack_config.yaml'
16
16
  arg_name '/path/to/flapjack.yaml'
17
17
  flag [:c,:config]
18
18
 
@@ -34,7 +34,20 @@ post do |global,command,options,args|
34
34
  end
35
35
 
36
36
  on_error do |exception|
37
- true
37
+ # We've changed the commands to control the flapjack server. If we detect
38
+ # the user has tried one of the old commands, show them what they should
39
+ # have used instead.
40
+ SERVER_COMMANDS = %w(start stop restart reload status)
41
+ message = exception.message
42
+ input = message.split("'").last.downcase
43
+ old_command = message.start_with?('Unknown command') && SERVER_COMMANDS.include?(input)
44
+ if old_command
45
+ puts exception.message
46
+ puts "\nDid you mean: #{$PROGRAM_NAME} server #{input}?"
47
+ puts "\nTry #{$PROGRAM_NAME} help"
48
+ end
49
+ # If this wasn't an old server command, return true to show the standard error dialog
50
+ !old_command
38
51
  end
39
52
 
40
53
  exit run(ARGV)
data/build.sh ADDED
@@ -0,0 +1,22 @@
1
+ #!/bin/bash
2
+
3
+ set -e
4
+
5
+ export GOPATH=$(pwd):$GOPATH
6
+
7
+ go get github.com/garyburd/redigo/redis
8
+ go get github.com/go-martini/martini
9
+ go get gopkg.in/alecthomas/kingpin.v1
10
+
11
+ go test flapjack
12
+
13
+ go build -x -o libexec/httpbroker libexec/httpbroker.go
14
+ go build -x -o libexec/oneoff libexec/oneoff.go
15
+
16
+
17
+ if [ ! -z "$CROSSCOMPILE" ]; then
18
+ for command in httpbroker oneoff; do
19
+ GOOS=linux GOARCH=amd64 CGOENABLED=0 go build -x -o libexec/$command.linux_amd64 libexec/$command.go
20
+ GOOS=linux GOARCH=386 CGOENABLED=0 go build -x -o libexec/$command.linux_386 libexec/$command.go
21
+ done
22
+ fi
@@ -25,7 +25,7 @@ if [ ! $(which flapjack) ]; then
25
25
  fi
26
26
 
27
27
  # Evaluate command
28
- flapjack $1
28
+ flapjack server $@
29
29
 
30
30
  RETVAL=$?
31
31
  exit $RETVAL
@@ -8,14 +8,14 @@
8
8
 
9
9
  PATH=/opt/flapjack/bin:$PATH
10
10
 
11
- if [ ! $(which flapjack-nagios-receiver) ]; then
12
- echo "Error: flapjack-nagios-receiver isn't in PATH."
11
+ if [ ! $(which flapjack) ]; then
12
+ echo "Error: flapjack isn't in PATH."
13
13
  echo "Refusing to do anything!"
14
14
  exit 1
15
15
  fi
16
16
 
17
17
  # Evaluate command
18
- flapjack-nagios-receiver $1 --daemonize
18
+ flapjack receiver nagios $1 --daemonize
19
19
 
20
20
  RETVAL=$?
21
21
  exit $RETVAL
@@ -5,14 +5,14 @@
5
5
 
6
6
  PATH=/opt/flapjack/bin:$PATH
7
7
 
8
- if [ ! $(which flapper) ]; then
9
- echo "Error: flapper isn't in PATH."
8
+ if [ ! $(which flapjack) ]; then
9
+ echo "Error: flapjack isn't in PATH."
10
10
  echo "Refusing to do anything!"
11
11
  exit 1
12
12
  fi
13
13
 
14
14
  # Evaluate command
15
- flapper $1
15
+ flapjack flapper $1
16
16
 
17
17
  RETVAL=$?
18
18
  exit $RETVAL
@@ -90,6 +90,8 @@ production:
90
90
  jabberid: "flapjack@jabber.example.com"
91
91
  password: "good-password"
92
92
  alias: "flapjack"
93
+ identifiers:
94
+ - "@flapjack"
93
95
  rooms:
94
96
  - "gimp@conference.jabber.example.com"
95
97
  - "log@conference.jabber.example.com"
@@ -152,7 +154,7 @@ development:
152
154
  log_file: log/flapjack.log
153
155
  daemonize: yes
154
156
  logger:
155
- level: INFO
157
+ level: DEBUG
156
158
  syslog_errors: yes
157
159
  redis:
158
160
  host: 127.0.0.1
@@ -165,7 +167,8 @@ development:
165
167
  archive_events: true
166
168
  events_archive_maxage: 10800
167
169
  new_check_scheduled_maintenance_duration: 100 years
168
- new_check_scheduled_maintenance_ignore: onetime
170
+ new_check_scheduled_maintenance_ignore_tags:
171
+ - bypass_ncsm
169
172
  logger:
170
173
  level: DEBUG
171
174
  syslog_errors: yes
@@ -182,19 +185,25 @@ development:
182
185
  level: DEBUG
183
186
  syslog_errors: yes
184
187
  nagios-receiver:
185
- fifo: "/usr/local/var/lib/nagios/event_stream.fifo"
188
+ fifo: "/var/cache/nagios3/event_stream.fifo"
186
189
  pid_file: "tmp/pids/flapjack-nagios-receiver.pid"
187
190
  log_file: "log/flapjack-nagios-receiver.log"
191
+ nsca-receiver:
192
+ fifo: "/var/lib/nagios3/rw/nagios.cmd"
193
+ pid_file: "/var/run/flapjack/flapjack-nsca-receiver.pid"
194
+ log_file: "/var/log/flapjack/flapjack-nsca-receiver.log"
188
195
  gateways:
189
196
  email:
190
- enabled: yes
197
+ enabled: no
191
198
  queue: email_notifications
192
199
  logger:
193
- level: INFO
200
+ level: DEBUG
194
201
  syslog_errors: yes
195
202
  smtp_config:
196
- # port 1025 is the default port for http://mailcatcher.me
203
+ # from: "Flapjack Example <flapjack@noreply.example>"
204
+ # reply_to: "flapjack@support.example"
197
205
  host: 127.0.0.1
206
+ # 1025 is the default port for http://mailcatcher.me
198
207
  port: 1025
199
208
  starttls: false
200
209
  #auth:
@@ -210,15 +219,13 @@ development:
210
219
  # rollup.html: '/etc/flapjack/templates/email/rollup.html.erb'
211
220
  # alert.html: '/etc/flapjack/templates/email/alert.html.erb'
212
221
  sms:
213
- enabled: yes
222
+ enabled: no
214
223
  queue: sms_notifications
215
- # if you run up something like 200ok locally you can then view the
216
- # sms messages being emitted
217
- endpoint: 'http://localhost:9292/FakeMessagenetAPI.aspx'
218
- username: "gretta"
224
+ endpoint: 'https://www.messagenet.com.au/dotnet/Lodge.asmx/LodgeSMSMessage'
225
+ username: "ermahgerd"
219
226
  password: "xxxx"
220
227
  logger:
221
- level: INFO
228
+ level: DEBUG
222
229
  syslog_errors: yes
223
230
  # location of custom alert templates
224
231
  #templates:
@@ -230,13 +237,13 @@ development:
230
237
  server: "jabber.example.com"
231
238
  port: 5222
232
239
  jabberid: "flapjack@jabber.example.com"
233
- password: "xxxx"
240
+ password: "good-password"
234
241
  alias: "flapjack"
235
242
  rooms:
236
243
  - "gimp@conference.jabber.example.com"
237
244
  - "log@conference.jabber.example.com"
238
245
  logger:
239
- level: INFO
246
+ level: DEBUG
240
247
  syslog_errors: yes
241
248
  # location of custom alert templates
242
249
  #templates:
@@ -253,11 +260,22 @@ development:
253
260
  # alert.text: '/etc/flapjack/templates/pagerduty/alert.text.erb'
254
261
  web:
255
262
  enabled: yes
256
- port: 4080
263
+ port: 3080
257
264
  timeout: 300
258
265
  access_log: "log/web_access.log"
266
+ api_url: "http://localhost:3081/"
267
+ #logo_image_path: "/etc/flapjack/web/custom_logo/flapjack-2013-notext-transparent-300-300.png"
259
268
  logger:
260
- level: INFO
269
+ level: DEBUG
270
+ syslog_errors: yes
271
+ jsonapi:
272
+ enabled: yes
273
+ port: 3081
274
+ timeout: 300
275
+ access_log: "log/jsonapi_access.log"
276
+ base_url: "http://localhost:3081/"
277
+ logger:
278
+ level: DEBUG
261
279
  syslog_errors: yes
262
280
  oobetet:
263
281
  enabled: no
@@ -275,7 +293,7 @@ development:
275
293
  - "gimp@conference.jabber.example.com"
276
294
  - "log@conference.jabber.example.com"
277
295
  logger:
278
- level: INFO
296
+ level: DEBUG
279
297
  syslog_errors: yes
280
298
 
281
299
  test:
@@ -8,6 +8,7 @@ Oj.default_options = { :indent => 0, :mode => :strict }
8
8
 
9
9
  require 'flapjack/configuration'
10
10
  require 'flapjack/data/event'
11
+ require 'flapjack/patches'
11
12
 
12
13
  # TODO options should be overridden by similar config file options
13
14
 
@@ -630,8 +631,31 @@ command :receiver do |receiver|
630
631
  end
631
632
  end
632
633
 
633
- end
634
634
 
635
+ receiver.desc 'One-off event submitter'
636
+ receiver.command :oneoff do |oneoff|
637
+ oneoff.passthrough = true
638
+ oneoff.action do |global_options, options, args|
639
+ libexec = Pathname.new(__FILE__).parent.parent.parent.parent.join('libexec').expand_path
640
+ oneoff = libexec.join('oneoff')
641
+ if oneoff.exist?
642
+ Kernel.exec(oneoff.to_s, *ARGV)
643
+ end
644
+ end
645
+ end
646
+
647
+ receiver.desc 'HTTP API that caches and submits events'
648
+ receiver.command :httpbroker do |httpbroker|
649
+ httpbroker.passthrough = true
650
+ httpbroker.action do |global_options, options, args|
651
+ libexec = Pathname.new(__FILE__).parent.parent.parent.parent.join('libexec').expand_path
652
+ httpbroker = libexec.join('httpbroker')
653
+ if httpbroker.exist?
654
+ Kernel.exec(httpbroker.to_s, *ARGV)
655
+ end
656
+ end
657
+ end
658
+ end
635
659
 
636
660
 
637
661
  # # Nsca example line for a storage-device check:
@@ -1,6 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ require 'eventmachine'
4
+ require 'em-synchrony'
3
5
  require 'redis'
6
+ require 'redis/connection/synchrony'
4
7
 
5
8
  require 'flapjack/configuration'
6
9
  require 'flapjack/data/event'
@@ -66,25 +69,29 @@ module Flapjack
66
69
  recovery = event.merge('state' => 'ok', 'summary' => 'Simulated check output (test by operator)')
67
70
  key = "#{event['entity']}:#{event['check']}"
68
71
 
69
- puts "#{Time.now}: sending failure event (#{state}) for #{key}"
70
- Flapjack::Data::Event.add(failure, :redis => redis)
72
+ EM.synchrony do
71
73
 
72
- EM.run do
74
+ puts "#{Time.now}: sending failure event (#{state}) for #{key}"
75
+ Flapjack::Data::Event.add(failure, :redis => redis)
73
76
 
74
77
  EM.add_timer(stop_after) do
75
78
  puts "#{Time.now}: stopping"
76
79
  if recover
77
- puts "#{Time.now}: sending recovery event for #{key}"
78
- Flapjack::Data::Event.add(recovery.merge('time' => Time.now.to_i),
79
- :redis => redis)
80
+ EM.synchrony do
81
+ puts "#{Time.now}: sending recovery event for #{key}"
82
+ Flapjack::Data::Event.add(recovery.merge('time' => Time.now.to_i),
83
+ :redis => redis)
84
+ end
80
85
  end
81
86
  EM.stop
82
87
  end
83
88
 
84
89
  EM.add_periodic_timer(opts[:interval]) do
85
- puts "#{Time.now}: sending failure event (#{state}) for #{key}"
86
- Flapjack::Data::Event.add(failure.merge('time' => Time.now.to_i),
87
- :redis => redis)
90
+ EM.synchrony do
91
+ puts "#{Time.now}: sending failure event (#{state}) for #{key}"
92
+ Flapjack::Data::Event.add(failure.merge('time' => Time.now.to_i),
93
+ :redis => redis)
94
+ end
88
95
  end
89
96
 
90
97
  end
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ require 'securerandom'
4
+
3
5
  require 'flapjack/data/contact'
4
6
  require 'flapjack/data/tag'
5
7
  require 'flapjack/data/tag_set'
@@ -34,28 +36,22 @@ module Flapjack
34
36
 
35
37
  #FIXME: should probably raise an exception if trying to create a new entity with the
36
38
  # same name or id as an existing entity. (Go away and use update instead.)
37
- if entity['id']
38
- existing_name = redis.hget("entity:#{entity['id']}", 'name')
39
- redis.del("entity_id:#{existing_name}") unless existing_name == entity['name']
40
- redis.set("entity_id:#{entity['name']}", entity['id'])
41
- redis.hset("entity:#{entity['id']}", 'name', entity['name'])
42
-
43
- redis.del("contacts_for:#{entity['id']}")
44
- if entity['contacts'] && entity['contacts'].respond_to?(:each)
45
- entity['contacts'].each {|contact_id|
46
- next if Flapjack::Data::Contact.find_by_id(contact_id, :redis => redis).nil?
47
- redis.sadd("contacts_for:#{entity['id']}", contact_id)
48
- }
49
- end
50
- self.new(:name => entity['name'],
51
- :id => entity['id'],
52
- :redis => redis)
53
- else
54
- # empty string is the redis equivalent of a Ruby nil, i.e. key with
55
- # no value
56
- redis.set("entity_id:#{entity['name']}", '')
57
- nil
39
+ entity_id = entity['id'] ? entity['id'] : SecureRandom.uuid
40
+ existing_name = redis.hget("entity:#{entity_id}", 'name')
41
+ redis.del("entity_id:#{existing_name}") unless existing_name == entity['name']
42
+ redis.set("entity_id:#{entity['name']}", entity_id)
43
+ redis.hset("entity:#{entity_id}", 'name', entity['name'])
44
+
45
+ redis.del("contacts_for:#{entity_id}")
46
+ if entity['contacts'] && entity['contacts'].respond_to?(:each)
47
+ entity['contacts'].each {|contact_id|
48
+ next if Flapjack::Data::Contact.find_by_id(contact_id, :redis => redis).nil?
49
+ redis.sadd("contacts_for:#{entity_id}", contact_id)
50
+ }
58
51
  end
52
+ self.new(:name => entity['name'],
53
+ :id => entity_id,
54
+ :redis => redis)
59
55
  end
60
56
 
61
57
  def self.find_by_name(entity_name, options = {})
@@ -661,6 +661,16 @@ module Flapjack
661
661
  @ack_hash
662
662
  end
663
663
 
664
+ def to_jsonapi(opts = {})
665
+ {
666
+ "name" => @check,
667
+ "entity_name" => @entity.name,
668
+ "links" => {
669
+ :entities => opts[:entity_ids] || [],
670
+ }
671
+ }.to_json
672
+ end
673
+
664
674
  private
665
675
 
666
676
  def initialize(entity, check, options = {})