auxesis-flapjack 0.3.8 → 0.4.1

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/README.md CHANGED
@@ -47,10 +47,13 @@ Install the following software through your package manager or from source:
47
47
  Installation
48
48
  ------------
49
49
 
50
- From the checked out code, build + install the gem:
50
+ Add GitHub's RubyGems server to your Gem sources:
51
51
 
52
- rake build
53
- sudo gem install pkg/flapjack-<latest>.gem
52
+ sudo gem sources -a http://gems.github.com
53
+
54
+ Install the Flapjack gem:
55
+
56
+ sudo gem install auxesis-flapjack
54
57
 
55
58
  Then run the magic configuration script to set up init scripts:
56
59
 
data/Rakefile CHANGED
@@ -63,3 +63,13 @@ if require 'yard'
63
63
  end
64
64
 
65
65
  end
66
+
67
+ desc "display FIXMEs in the codebase"
68
+ task :fixmes do
69
+ output = `grep -nR FIXME lib/* spec/* bin/`
70
+ output.split("\n").each do |line|
71
+ parts = line.split(':')
72
+ puts "#{parts[0].strip} +#{parts[1].strip}"
73
+ puts " - #{parts[3].strip}"
74
+ end
75
+ end
data/TODO.md CHANGED
@@ -1,10 +1,20 @@
1
- * daemonise notifier
1
+ * daemonise notifier - DONE
2
2
  * provide config file for notifier
3
- * specify which notifier plugins to load
4
- * specify configuration for plugins (from address/xmmp login)
5
- * write init scripts for notifier/worker-manager
3
+ * specify which notifier plugins to load - DONE
4
+ * specify configuration for plugins (from address/xmmp login) - DONE
5
+ * write init scripts for notifier/worker-manager - DONE
6
6
  * hook notifier into web interface
7
- * update status of checks
8
- * relationships + cascading notifications
7
+ * update status of checks - DONE
8
+ * relationships + cascading notifications - DONE
9
+ * simple graphs
9
10
  * package with pallet
10
11
  * generate .deb/.rpms
12
+ * build packages for gem dependencies
13
+ * provide common interface for loading checks into beanstalk
14
+ * write check generator
15
+ * include a collection of common functions
16
+ (logging to rrd, retreiving values, executing check)
17
+ * write zeroconf/avahi notifier
18
+ * write growl notifier
19
+ * write way to customise notifier messages (email body, xmpp format)
20
+ * write sms notifier
@@ -10,8 +10,6 @@ require 'log4r'
10
10
  require 'log4r/outputter/syslogoutputter'
11
11
  require 'flapjack/result'
12
12
  require 'flapjack/notifier'
13
- require 'flapjack/notifiers/mailer'
14
- require 'flapjack/notifiers/xmpp'
15
13
  require 'daemons'
16
14
  require 'flapjack/patches'
17
15
 
@@ -24,15 +22,9 @@ require 'flapjack/cli/notifier'
24
22
  ncli = Flapjack::NotifierCLI.new
25
23
  ncli.setup_loggers
26
24
  ncli.setup_recipients(:filename => @options.recipients)
27
-
28
- ncli.log.debug("Loading Mailer notifier")
29
- mailer = Flapjack::Notifiers::Mailer.new
30
- ncli.log.debug("Loading XMPP notifier")
31
- xmpp = Flapjack::Notifiers::Xmpp.new(:jid => "flapjack-test@jabber.org", :password => "test")
32
- ncli.log.debug("Bringing up notifier subsystem")
33
- ncli.notifier = Notifier.new(:logger => ncli.log,
34
- :notifiers => [mailer], #, xmpp],
35
- :recipients => ncli.recipients)
25
+ ncli.setup_config(:filename => @options.config_filename)
26
+ ncli.setup_notifier
27
+ ncli.setup_database(:database_uri => @options.database_uri)
36
28
 
37
29
  begin
38
30
 
data/flapjack.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'flapjack'
3
- s.version = '0.3.8'
3
+ s.version = '0.4.1'
4
4
  s.date = '2009-05-26'
5
5
 
6
6
  s.summary = "a scalable and distributed monitoring system"
@@ -16,10 +16,16 @@ Gem::Specification.new do |s|
16
16
  s.add_dependency('log4r', '>= 1.0.5')
17
17
  s.add_dependency('xmpp4r-simple', '>= 0.8.8')
18
18
  s.add_dependency('mailfactory', '>= 1.4.0')
19
+ s.add_dependency('dm-core', '>= 0.9.11')
20
+ s.add_dependency('dm-timestamps', '>= 0.9.11')
21
+ s.add_dependency('dm-types', '>= 0.9.11')
22
+ s.add_dependency('dm-validations', '>= 0.9.11')
23
+ s.add_dependency('data_objects', '>= 0.9.12')
24
+ s.add_dependency('do_sqlite3', '>= 0.9.12')
19
25
 
20
26
  s.bindir = "bin"
21
27
  s.executables = ["flapjack-notifier", "flapjack-notifier-manager", "flapjack-stats", "flapjack-worker", "flapjack-worker-manager", "install-flapjack-systemwide"]
22
- s.files = ["README.md", "Rakefile", "TODO.md", "bin/flapjack-notifier", "bin/flapjack-notifier-manager", "bin/flapjack-stats", "bin/flapjack-worker", "bin/flapjack-worker-manager", "bin/install-flapjack-systemwide", "etc/default/flapjack-notifier", "etc/default/flapjack-workers", "etc/flapjack/recipients.yaml", "etc/init.d/flapjack-notifier", "etc/init.d/flapjack-workers", "flapjack.gemspec", "lib/flapjack/cli/notifier.rb", "lib/flapjack/cli/notifier_manager.rb", "lib/flapjack/cli/worker.rb", "lib/flapjack/cli/worker_manager.rb", "lib/flapjack/notifier.rb", "lib/flapjack/notifiers/mailer.rb", "lib/flapjack/notifiers/xmpp.rb", "lib/flapjack/patches.rb", "lib/flapjack/result.rb"]
28
+ s.files = ["README.md", "Rakefile", "TODO.md", "bin/flapjack-notifier", "bin/flapjack-notifier-manager", "bin/flapjack-stats", "bin/flapjack-worker", "bin/flapjack-worker-manager", "bin/install-flapjack-systemwide", "etc/default/flapjack-notifier", "etc/default/flapjack-workers", "etc/flapjack/recipients.yaml", "etc/init.d/flapjack-notifier", "etc/init.d/flapjack-workers", "flapjack.gemspec", "lib/flapjack/cli/notifier.rb", "lib/flapjack/cli/notifier_manager.rb", "lib/flapjack/cli/worker.rb", "lib/flapjack/cli/worker_manager.rb", "lib/flapjack/database.rb", "lib/flapjack/models/check.rb", "lib/flapjack/models/check_template.rb", "lib/flapjack/models/node.rb", "lib/flapjack/models/related_check.rb", "lib/flapjack/notifier.rb", "lib/flapjack/notifiers/mailer/init.rb", "lib/flapjack/notifiers/mailer/mailer.rb", "lib/flapjack/notifiers/xmpp/init.rb", "lib/flapjack/notifiers/xmpp/xmpp.rb", "lib/flapjack/patches.rb", "lib/flapjack/result.rb"]
23
29
  end
24
30
 
25
31
 
@@ -5,6 +5,7 @@ require 'ostruct'
5
5
  require 'optparse'
6
6
  require 'log4r'
7
7
  require 'log4r/outputter/syslogoutputter'
8
+ require File.join(File.dirname(__FILE__), '..', 'database')
8
9
 
9
10
  module Flapjack
10
11
  class NotifierOptions
@@ -21,6 +22,12 @@ module Flapjack
21
22
  opts.on('-r', '--recipients FILE', 'recipients file') do |recipients|
22
23
  options.recipients = recipients.to_s
23
24
  end
25
+ opts.on('-c', '--config FILE', 'config file') do |config|
26
+ options.config_filename = config.to_s
27
+ end
28
+ opts.on('-d', '--database-uri URI', 'location of the checks database') do |db|
29
+ options.database_uri = db.to_s
30
+ end
24
31
  opts.on_tail("-h", "--help", "Show this message") do
25
32
  puts opts
26
33
  exit
@@ -43,10 +50,27 @@ module Flapjack
43
50
 
44
51
  @errors = []
45
52
  # check that recipients file exists
46
- unless File.exists?(options.recipients.to_s)
47
- @errors << "The specified recipients file doesn't exist!"
53
+ if options.recipients
54
+ unless File.exists?(options.recipients.to_s)
55
+ @errors << "The specified recipients file doesn't exist!"
56
+ end
57
+ else
58
+ @errors << "You need to specify a recipients file with [-r|--recipients]."
48
59
  end
49
-
60
+
61
+ # check that config file exists
62
+ if options.config_filename
63
+ unless File.exists?(options.config_filename.to_s)
64
+ @errors << "The specified config file doesn't exist!"
65
+ end
66
+ else
67
+ options.config_filename ||= "/etc/flapjack/flapjack-notifier.yaml"
68
+ unless File.exists?(options.config_filename.to_s)
69
+ @errors << "The default config file (#{options.config_filename}) doesn't exist!"
70
+ @errors << "Set one up, or specify one with [-c|--config]."
71
+ end
72
+ end
73
+
50
74
  # if there are errors, print them out and exit
51
75
  if @errors.size > 0
52
76
  puts "Errors:"
@@ -63,11 +87,13 @@ module Flapjack
63
87
  end
64
88
 
65
89
  class NotifierCLI
66
- attr_accessor :log, :recipients, :notifier, :results_queue
90
+ attr_accessor :log, :recipients, :results_queue, :config
91
+ attr_accessor :notifier, :notifiers
67
92
  attr_accessor :condition
68
93
 
69
- def initialize
70
- @log = Log4r::Logger.new("notifier")
94
+ def initialize(opts={})
95
+ @log = opts[:logger]
96
+ @log ||= Log4r::Logger.new("notifier")
71
97
  end
72
98
 
73
99
  def setup_loggers
@@ -83,11 +109,81 @@ module Flapjack
83
109
  opts[:filename] ||= File.join(Dir.pwd, "recipients.yaml")
84
110
  yaml = YAML::load(File.read(opts[:filename]))
85
111
  end
86
-
112
+
113
+ # FIXME: add error detection for passing in dumb things
114
+
87
115
  @recipients = yaml.map do |r|
88
116
  OpenStruct.new(r)
89
117
  end
90
118
  end
119
+
120
+ def setup_config(opts={})
121
+ if opts[:yaml]
122
+ yaml = opts[:yaml]
123
+ else
124
+ opts[:filename] ||= File.join(Dir.pwd, "flapjack-notifier.yaml")
125
+ yaml = YAML::load(File.read(opts[:filename]))
126
+ end
127
+
128
+ @config = OpenStruct.new(yaml)
129
+ end
130
+
131
+ def setup_database(opts={})
132
+ uri = (opts[:database_uri] || @config.database_uri)
133
+ raise ArgumentError, "database URI wasn't specified!" unless uri
134
+ DataMapper.setup(:default, uri)
135
+ validate_database
136
+ end
137
+
138
+ def validate_database
139
+ begin
140
+ DataMapper.repository(:default).adapter.execute("SELECT 'id' FROM 'checks';")
141
+ rescue Sqlite3Error
142
+ @log.warning("The specified database doesn't appear to have any structure!")
143
+ @log.warning("You need to investigate this.")
144
+ end
145
+ # FIXME: add more rescues in here!
146
+ end
147
+
148
+ def initialize_notifiers(opts={})
149
+ notifiers_directory = opts[:notifiers_directory]
150
+ notifiers_directory ||= File.expand_path(File.join(File.dirname(__FILE__), '..', 'notifiers'))
151
+
152
+ raise ArgumentError, "notifiers directory doesn't exist!" unless File.exists?(notifiers_directory)
153
+
154
+ @notifiers = []
155
+
156
+ @config.notifiers.each_pair do |notifier, config|
157
+ filename = File.join(notifiers_directory, notifier.to_s, 'init')
158
+ if File.exists?(filename + '.rb')
159
+ @log.debug("Loading the #{notifier.to_s.capitalize} notifier")
160
+ require filename
161
+ @notifiers << Flapjack::Notifiers.const_get("#{notifier.to_s.capitalize}").new(config)
162
+ else
163
+ @log.warning("Flapjack::Notifiers::#{notifier.to_s.capitalize} doesn't exist!")
164
+ end
165
+ end
166
+
167
+ @notifiers
168
+ end
169
+
170
+ # Sets up notifier to do the grunt work of notifying people when checks
171
+ # return badly.
172
+ #
173
+ # Accepts a list of recipients (:recipients) and a logger (:logger) as
174
+ # arguments. If neither of these are specified, it will default to an
175
+ # existing list of recipients and the current logger.
176
+ #
177
+ # Sets up and returns @notifier, an instance of Flapjack::Notifier
178
+ def setup_notifier(opts={})
179
+ recipients = (opts[:recipients] || @recipients)
180
+ log = (opts[:logger] || @log)
181
+ initialize_notifiers
182
+ notifiers = @notifiers # should we accept a list of notifiers?
183
+ @notifier = Flapjack::Notifier.new(:logger => log,
184
+ :notifiers => notifiers,
185
+ :recipients => recipients)
186
+ end
91
187
 
92
188
  def process_loop
93
189
  @log.info("Processing results...")
@@ -95,18 +191,42 @@ module Flapjack
95
191
  process_result
96
192
  end
97
193
  end
98
-
194
+
195
+ def save_result(result)
196
+ if check = Check.get(result.id)
197
+ check.status = result.retval
198
+ check.save
199
+ else
200
+ @log.error("Got result for check #{result.id}, but it doesn't exist!")
201
+ end
202
+ end
203
+
204
+ def any_parents_warning_or_critical?(result)
205
+ if check = Check.get(result.id)
206
+ check.worst_parent_status > 0 ? true : false
207
+ else
208
+ @log.error("Got result for check #{result.id}, but it doesn't exist!")
209
+ end
210
+ end
211
+
99
212
  def process_result
100
213
  @log.debug("Waiting for new result...")
101
- result_job = @results_queue.reserve
214
+ result_job = @results_queue.reserve # blocks until a job is reserved
102
215
  result = Result.new(YAML::load(result_job.body))
103
216
 
104
217
  @log.info("Processing result for check '#{result.id}'")
105
218
  if result.warning? || result.critical?
106
- @log.info("Notifying on check '#{result.id}'")
107
- @notifier.notify!(result)
219
+ if any_parents_warning_or_critical?(result)
220
+ @log.info("Not notifying on check '#{result.id}' as parent is failing.")
221
+ else
222
+ @log.info("Notifying on check '#{result.id}'")
223
+ @notifier.notify!(result)
224
+ end
108
225
  end
109
226
 
227
+ @log.info("Storing status of check in database")
228
+ save_result(result)
229
+
110
230
  @log.debug("Deleting result for check '#{result.id}' from queue")
111
231
  result_job.delete
112
232
  end
@@ -116,7 +116,8 @@ module Flapjack
116
116
  def get_check
117
117
  @log.debug("Waiting for check...")
118
118
  job = @jobs.reserve
119
- check = Check.new(YAML::load(job.body))
119
+ # FIXME: maybe wrap Result as Job now that Check is reserved?
120
+ check = Result.new(YAML::load(job.body))
120
121
  @log.info("Got check with id #{check.id}")
121
122
 
122
123
  return job, check
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'dm-core'
4
+ require 'dm-validations'
5
+ require 'dm-types'
6
+ require 'dm-timestamps'
7
+
8
+ Dir.glob(File.join(File.dirname(__FILE__), 'models', '*.rb')).each do |model|
9
+ require model
10
+ end
@@ -0,0 +1,91 @@
1
+ class Check
2
+ include DataMapper::Resource
3
+
4
+ timestamps :at
5
+
6
+ has n, :related_checks, :child_key => [:child_id, :parent_id]
7
+
8
+ #has n, :parent_checks, :through => :related_checks,
9
+ # :child_key => :child_id, :class_name => "Check"
10
+ #has n, :child_checks, :through => :related_checks,
11
+ # :child_key => :parent_id, :class_name => "Check"
12
+
13
+ belongs_to :node
14
+ belongs_to :check_template
15
+
16
+ property :id, Serial, :key => true
17
+ property :command, Text, :nullable => false
18
+ property :params, Yaml
19
+ property :name, String, :nullable => false
20
+ property :enabled, Boolean, :default => false
21
+ property :status, Integer, :default => 0
22
+
23
+ # dm-timestamps
24
+ property :created_at, DateTime
25
+ property :updated_at, DateTime
26
+ property :deleted_at, ParanoidDateTime
27
+
28
+ # copy command onto check
29
+ before :valid? do
30
+ if self.check_template && self.command.blank?
31
+ self.command = self.check_template.command
32
+ self.name = self.check_template.name
33
+ self.params = (self.check_template.params || {})
34
+ end
35
+ end
36
+
37
+ def parameters_and_values
38
+ names = parameter_names_from_command
39
+ hash = {}
40
+ names.each { |name| hash[name] = params ? params[name] : "" }
41
+ hash["$FQDN"] = self.node_fqdn # pkey of node check belongs to
42
+ hash
43
+ end
44
+
45
+ def parameter_names_from_command
46
+ self.command.split.grep(/\$\w/)
47
+ end
48
+
49
+ def executed_command
50
+ c = self.command
51
+ parameters_and_values.each_pair do |param, value|
52
+ value = value.to_s
53
+ c.gsub!(param, value)
54
+ end
55
+ return c
56
+ end
57
+
58
+ # FIXME: this should work through related checks association, but doesn't
59
+ def parent_checks
60
+ RelatedCheck.all(:child_id => self.id).map {|rc| rc.parent_check}
61
+ end
62
+
63
+ def child_checks
64
+ RelatedCheck.all(:parent_id => self.id).map {|rc| rc.child_check}
65
+ end
66
+
67
+ def worst_parent_status
68
+ if parent_checks.size > 0
69
+ self.parent_checks.map { |parent| parent.status }.sort.pop
70
+ else
71
+ 0
72
+ end
73
+ end
74
+
75
+
76
+ GOOD = 0
77
+ BAD = 1
78
+ UGLY = 2
79
+
80
+ def pretty_print_status
81
+ case self.status
82
+ when GOOD
83
+ "good"
84
+ when BAD
85
+ "bad"
86
+ when UGLY
87
+ "ugly"
88
+ end
89
+ end
90
+
91
+ end
@@ -0,0 +1,18 @@
1
+ class CheckTemplate
2
+ include DataMapper::Resource
3
+
4
+ has n, :checks
5
+
6
+ property :id, Serial
7
+ property :command, Text, :nullable => false
8
+ property :name, String, :nullable => false
9
+ property :params, Yaml
10
+
11
+ validates_is_unique :command, :name
12
+
13
+ def name_for_select
14
+ cmd = (self.command.size > 30 ? "#{self.command[0..50]}..." : self.command)
15
+ "#{self.name} (#{cmd})"
16
+ end
17
+
18
+ end
@@ -0,0 +1,16 @@
1
+ class Node
2
+ include DataMapper::Resource
3
+
4
+ has n, :checks
5
+
6
+ property :fqdn, String, :key => true
7
+
8
+ validates_is_unique :fqdn
9
+ validates_format :fqdn, :with => /^[0-9|a-z|A-Z|\-|\.]*$/,
10
+ :message => "not a RFC1035-formatted FQDN (see section 2.3.1)"
11
+
12
+ def hostname
13
+ self.fqdn.split('.').first
14
+ end
15
+
16
+ end
@@ -0,0 +1,13 @@
1
+ class RelatedCheck
2
+ include DataMapper::Resource
3
+
4
+ belongs_to :parent_check, :class_name => "Check", :child_key => [:parent_id]
5
+ belongs_to :child_check, :class_name => "Check", :child_key => [:child_id]
6
+
7
+ property :id, Serial, :key => true
8
+ #property :parent_check_id, Integer, :nullable => false
9
+ #property :child_check_id, Integer, :nullable => false
10
+
11
+
12
+
13
+ end
@@ -2,33 +2,34 @@
2
2
 
3
3
  require 'ostruct'
4
4
 
5
- class Notifier
6
-
7
- attr_reader :recipients, :log
8
-
9
- def initialize(opts={})
10
- @log = opts[:logger]
11
- raise "you have to specify a logger" unless @log
12
- @recipients = (opts[:recipients] || [])
13
-
14
- @notifiers = []
15
- if opts[:notifiers]
16
- opts[:notifiers].each do |n|
17
- @notifiers << n
18
- @log.info("using the #{n.class.to_s.split("::").last} notifier")
19
- end
20
- else
21
- @log.warning("there are no notifiers")
22
- end
23
- end
5
+ module Flapjack
6
+ class Notifier
7
+
8
+ attr_reader :recipients, :log
24
9
 
25
- def notify!(result)
26
- @notifiers.each do |n|
27
- @recipients.each do |recipient|
28
- @log.info("Notifying #{recipient.name} via #{n.class} about check #{result.id}")
29
- n.notify(:result => result, :who => recipient)
10
+ def initialize(opts={})
11
+ @log = opts[:logger]
12
+ raise "you have to specify a logger" unless @log
13
+ @recipients = (opts[:recipients] || [])
14
+
15
+ @notifiers = []
16
+ if opts[:notifiers]
17
+ opts[:notifiers].each do |n|
18
+ @notifiers << n
19
+ @log.info("using the #{n.class.to_s.split("::").last} notifier")
20
+ end
21
+ else
22
+ @log.warning("there are no notifiers")
23
+ end
24
+ end
25
+
26
+ def notify!(result)
27
+ @notifiers.each do |n|
28
+ @recipients.each do |recipient|
29
+ @log.info("Notifying #{recipient.name} via #{n.class} about check #{result.id}")
30
+ n.notify(:result => result, :who => recipient)
31
+ end
30
32
  end
31
33
  end
32
34
  end
33
35
  end
34
-
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.join(File.dirname(__FILE__), 'mailer')
@@ -8,13 +8,17 @@ module Flapjack
8
8
  module Notifiers
9
9
 
10
10
  class Mailer
11
-
11
+
12
+ def initialize(opts={})
13
+ @from_address = opts[:from_address]
14
+ end
15
+
12
16
  def notify(opts={})
13
17
  raise unless (opts[:who] && opts[:result])
14
18
 
15
19
  mail = MailFactory.new
16
20
  mail.to = opts[:who].email
17
- mail.from = "notifications@flapjack-project.com"
21
+ mail.from = @from_address
18
22
  mail.subject = "Check: #{opts[:result].id}, Status: #{opts[:result].status}"
19
23
  mail.text = <<-DESC
20
24
  Check #{opts[:result].id} returned the status "#{opts[:result].status}".
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.join(File.dirname(__FILE__), 'xmpp')
File without changes
@@ -43,5 +43,3 @@ class Result < OpenStruct
43
43
 
44
44
  end
45
45
 
46
- class Check < Result
47
- end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: auxesis-flapjack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.8
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lindsay Holmwood
@@ -62,6 +62,66 @@ dependencies:
62
62
  - !ruby/object:Gem::Version
63
63
  version: 1.4.0
64
64
  version:
65
+ - !ruby/object:Gem::Dependency
66
+ name: dm-core
67
+ type: :runtime
68
+ version_requirement:
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: 0.9.11
74
+ version:
75
+ - !ruby/object:Gem::Dependency
76
+ name: dm-timestamps
77
+ type: :runtime
78
+ version_requirement:
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: 0.9.11
84
+ version:
85
+ - !ruby/object:Gem::Dependency
86
+ name: dm-types
87
+ type: :runtime
88
+ version_requirement:
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: 0.9.11
94
+ version:
95
+ - !ruby/object:Gem::Dependency
96
+ name: dm-validations
97
+ type: :runtime
98
+ version_requirement:
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: 0.9.11
104
+ version:
105
+ - !ruby/object:Gem::Dependency
106
+ name: data_objects
107
+ type: :runtime
108
+ version_requirement:
109
+ version_requirements: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: 0.9.12
114
+ version:
115
+ - !ruby/object:Gem::Dependency
116
+ name: do_sqlite3
117
+ type: :runtime
118
+ version_requirement:
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: 0.9.12
124
+ version:
65
125
  description: Flapjack is highly scalable and distributed monitoring system. It understands the Nagios plugin format, and can easily be scaled from 1 server to 1000.
66
126
  email: lindsay@holmwood.id.au
67
127
  executables:
@@ -95,9 +155,16 @@ files:
95
155
  - lib/flapjack/cli/notifier_manager.rb
96
156
  - lib/flapjack/cli/worker.rb
97
157
  - lib/flapjack/cli/worker_manager.rb
158
+ - lib/flapjack/database.rb
159
+ - lib/flapjack/models/check.rb
160
+ - lib/flapjack/models/check_template.rb
161
+ - lib/flapjack/models/node.rb
162
+ - lib/flapjack/models/related_check.rb
98
163
  - lib/flapjack/notifier.rb
99
- - lib/flapjack/notifiers/mailer.rb
100
- - lib/flapjack/notifiers/xmpp.rb
164
+ - lib/flapjack/notifiers/mailer/init.rb
165
+ - lib/flapjack/notifiers/mailer/mailer.rb
166
+ - lib/flapjack/notifiers/xmpp/init.rb
167
+ - lib/flapjack/notifiers/xmpp/xmpp.rb
101
168
  - lib/flapjack/patches.rb
102
169
  - lib/flapjack/result.rb
103
170
  has_rdoc: false