aboutsummaryrefslogtreecommitdiff
path: root/lib/mauve/alert.rb
diff options
context:
space:
mode:
authorPatrick J Cherry <patrick@bytemark.co.uk>2011-06-13 11:02:37 +0100
committerPatrick J Cherry <patrick@bytemark.co.uk>2011-06-13 11:02:37 +0100
commitb22cbc87927553f6dbb5754281e95fe9bad2eed1 (patch)
tree5575791fe84492648a8cc92433c267815056507a /lib/mauve/alert.rb
parent495c44445642cfae8f23fadde299ad5307f5be58 (diff)
* Tidied up mauveserver to handle HUP restarts
* Added HTML santizing to the alert class, so bad HTML is stripped as part of processing. * Alert#cleared? now means "not raised" * Better error handling in the Timer class, making sure that the timer never gets permanently frozen. * Moved notification and packet buffers to the Server class, meaning that if the Processor or Notifier threads crash, we don't lose all the items waiting to be processed/notified. * XMPP/Email Alerts now use templates, instead of instance methods. * Emails now get sent as multipart with HTML to allow detail fields to be shown as nature intended.
Diffstat (limited to 'lib/mauve/alert.rb')
-rw-r--r--lib/mauve/alert.rb91
1 files changed, 62 insertions, 29 deletions
diff --git a/lib/mauve/alert.rb b/lib/mauve/alert.rb
index b98866c..d0f134b 100644
--- a/lib/mauve/alert.rb
+++ b/lib/mauve/alert.rb
@@ -1,7 +1,7 @@
require 'mauve/proto'
require 'mauve/alert_changed'
require 'mauve/datamapper'
-
+require 'sanitize'
module Mauve
class AlertEarliestDate
@@ -172,16 +172,14 @@ module Mauve
self.alert_group.level
end
- def subject
- attribute_get(:subject) || source
- end
-
- def subject=(subject); set_changed_if_different(:subject, subject); end
- def summary=(summary); set_changed_if_different(:summary, summary); end
-# def detail=(detail); set_changed_if_different(:detail, detail); end
- def detail=(detail); attribute_set(:detail, detail) ; end
+ def subject=(subject); set_changed_if_different( :subject, subject ); end
+ def summary=(summary); set_changed_if_different( :summary, summary ); end
+
+ # def source=(source); attribute_set( :source, source ); end
+ # def detail=(detail); attribute_set( :detail, detail ); end
protected
+
def set_changed_if_different(attribute, value)
return if self.__send__(attribute) == value
self.update_type ||= :changed
@@ -244,7 +242,7 @@ module Mauve
end
def raised?
- !raised_at.nil? && cleared_at.nil?
+ !raised_at.nil? and (cleared_at.nil? or raised_at > cleared_at)
end
def acknowledged?
@@ -252,11 +250,32 @@ module Mauve
end
def cleared?
- new? || !cleared_at.nil?
+ !raised?
end
class << self
+ #
+ # Utility methods to clean/remove html
+ #
+ def remove_html(txt)
+ Sanitize.clean(
+ txt.to_s,
+ Sanitize::Config::DEFAULT
+ )
+ end
+
+ def clean_html(txt)
+ Sanitize.clean(
+ txt.to_s,
+ Sanitize::Config::RELAXED.merge({:remove_contents => true})
+ )
+ end
+
+ #
+ # Find stuff
+ #
+ #
def all_raised
all(:raised_at.not => nil, :cleared_at => nil)
end
@@ -341,20 +360,28 @@ module Mauve
logger.debug("received at #{reception_time}, transmitted at #{transmission_time}, raised at #{raise_time}, clear at #{clear_time}")
- do_clear = clear_time && clear_time <= reception_time
- do_raise = raise_time && raise_time <= reception_time
-
+ #
+ # Make sure there's no HTML in the ID... paranoia. The rest of the
+ # HTML removal is done elsewhere.
+ #
+ alert.id = Alert.remove_html(alert.id)
+
alert_db = first(:alert_id => alert.id, :source => update.source) ||
new(:alert_id => alert.id, :source => update.source)
-
- pre_raised = alert_db.raised?
- pre_cleared = alert_db.cleared?
- pre_acknowledged = alert_db.acknowledged?
+
+ #
+ # Work out what state the alert was in before receiving this update.
+ #
+ was_raised = alert_db.raised?
+ was_cleared = alert_db.cleared?
+ was_acknowledged = alert_db.acknowledged?
alert_db.update_type = nil
##
#
+ # Work out if we're raising now, or in the future.
+ #
# Allow a 5s offset in timings.
#
if raise_time
@@ -372,9 +399,9 @@ module Mauve
alert_db.will_clear_at = clear_time
end
end
-
+
#
- # Re-raise if raised_at and cleared_at are set.
+ # Clear old cleared_at time, if the raised_at time is newer
#
if alert_db.cleared_at && alert_db.raised_at && alert_db.cleared_at < alert_db.raised_at
alert_db.cleared_at = nil
@@ -383,24 +410,30 @@ module Mauve
#
#
#
- if (pre_raised or pre_cleared) && alert_db.raised?
- alert_db.update_type = :raised
- elsif pre_raised && alert_db.cleared?
+ if alert_db.cleared?
alert_db.update_type = :cleared
+ else
+ alert_db.update_type = :raised
end
+ #
# Changing any of these attributes causes the alert to be sent back
# out to the notification system with an update_type of :changed.
#
- alert_db.subject = alert.subject if alert.subject && !alert.subject.empty?
- alert_db.summary = alert.summary if alert.summary && !alert.summary.empty?
- alert_db.detail = alert.detail if alert.detail && !alert.detail.empty?
+ # Each of these should be just text, no HTML, so remove any tags we
+ # find.
+ #
+
+ alert_db.subject = Alert.remove_html(alert.subject) if alert.subject && !alert.subject.empty?
+ alert_db.summary = Alert.remove_html(alert.summary) if alert.summary && !alert.summary.empty?
- # These updates happen but do not sent the alert back to the
- # notification system.
#
+ # The detail can be HTML -- scrub out unwanted parts.
+ #
+ alert_db.detail = Alert.clean_html(alert.detail) if alert.detail && !alert.detail.empty?
+
alert_db.importance = alert.importance if alert.importance != 0
-
+
# FIXME: this logic ought to be clearer as it may get more complicated
#
if alert_db.update_type