lib/perus/server/models/alert.rb in perus-0.1.7 vs lib/perus/server/models/alert.rb in perus-0.1.8
- old
+ new
@@ -1,9 +1,68 @@
module Perus::Server
class Alert < Sequel::Model
- def execute(systems)
- systems.select do |system|
- system.instance_eval(code)
+ one_to_many :active_alerts
+
+ def execute(system)
+ system.instance_eval(code)
+ end
+
+ def execute_errors
+ values[:errors]
+ end
+
+ def severity_level
+ if active_alerts_dataset.empty?
+ 0
+ elsif severity == 'notice'
+ 1
+ elsif severity == 'warning'
+ 2
+ elsif severity == 'error'
+ 3
end
+ end
+
+ def after_destroy
+ super
+ active_alerts.each(&:destroy)
+ end
+
+ def self.cache_active_alerts
+ puts 'Caching active alerts'
+ start = Time.now
+ systems = System.all
+
+ Alert.each do |alert|
+ begin
+ # active_alerts are left as is if they are still active
+ currently_active = {}
+ alert.active_alerts.each do |active_alert|
+ currently_active[active_alert.system_id] = active_alert
+ end
+
+ # remove active alerts if they're no longer valid, add new
+ # ones as needed.
+ systems.each do |system|
+ active = alert.execute(system)
+ if active && !currently_active.include?(system.id)
+ ActiveAlert.add(alert, system)
+ elsif !active && currently_active.include?(system.id)
+ currently_active[system.id].destroy
+ end
+ end
+
+ # no errors occurred by this point, so remove the error
+ # string if it exists from a previous run
+ alert.errors = nil
+ rescue => e
+ alert.errors = e.inspect
+ end
+
+ # update alert.errors
+ alert.save
+ end
+
+ puts "Caching complete, took #{Time.now - start}s"
end
end
end