diff options
author | Patrick J Cherry <patrick@bytemark.co.uk> | 2011-06-13 11:02:37 +0100 |
---|---|---|
committer | Patrick J Cherry <patrick@bytemark.co.uk> | 2011-06-13 11:02:37 +0100 |
commit | b22cbc87927553f6dbb5754281e95fe9bad2eed1 (patch) | |
tree | 5575791fe84492648a8cc92433c267815056507a /lib/mauve/alert.rb | |
parent | 495c44445642cfae8f23fadde299ad5307f5be58 (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.rb | 91 |
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 |