aboutsummaryrefslogtreecommitdiff
path: root/lib/mauve/alert.rb
diff options
context:
space:
mode:
authorPatrick J Cherry <patrick@bytemark.co.uk>2012-03-22 17:31:27 +0000
committerPatrick J Cherry <patrick@bytemark.co.uk>2012-03-22 17:31:27 +0000
commit24554e44478fadb3c86dea76773d456c5284596d (patch)
tree817319e8d2f579a8f690d756d0fb62e74100ac30 /lib/mauve/alert.rb
parent53c5b4412c46dd289eeac08a9a4768aaf9d069ff (diff)
Rejigged caching of alert_group, and the way source lists are searched, to
(hopefully) cut down on DNS resolving.
Diffstat (limited to 'lib/mauve/alert.rb')
-rw-r--r--lib/mauve/alert.rb124
1 files changed, 91 insertions, 33 deletions
diff --git a/lib/mauve/alert.rb b/lib/mauve/alert.rb
index d867ccd..edaa2ad 100644
--- a/lib/mauve/alert.rb
+++ b/lib/mauve/alert.rb
@@ -146,15 +146,18 @@ module Mauve
#
# Find the AlertGroup by name if we've got a cached value
#
- @alert_group = AlertGroup.all.find{|a| self.cached_alert_group == a.name} if @alert_group.nil? and self.cached_alert_group
+ alert_group = AlertGroup.all.find{|a| self.cached_alert_group == a.name} if self.cached_alert_group
- #
- # If we've not found the alert group by name, or the object hasn't been
- # saved since the alert group was last resolved, look for it again.
- #
- @alert_group = AlertGroup.matches(self).first if @alert_group.nil?
+ if alert_group.nil?
+ #
+ # If we've not found the alert group by name look for it again, the
+ # proper way.
+ #
+ alert_group = AlertGroup.matches(self).first
+ self.cached_alert_group = alert_group.name unless alert_group.nil?
+ end
- @alert_group
+ alert_group
end
# Pick out the source lists that match this alert by subject.
@@ -169,32 +172,53 @@ module Mauve
# @param [String] listname
# @return [Boolean]
def in_source_list?(listname)
- list = Mauve::Configuration.current.source_lists[listname]
- return false unless list.is_a?(SourceList)
- self.subject_hosts_and_ips.any?{|host| list.includes?(host) }
- end
+ source_list = Mauve::Configuration.current.source_lists[listname]
+ return false unless source_list.is_a?(SourceList)
- def subject_hosts_and_ips
- if @subject_hosts_and_ips.nil? or @subject_hosts_and_ips_last_resolved_at.nil? or (Time.now - 1800) > @subject_hosts_and_ips_last_resolved_at
- host = self.subject
- #
- # Pick out hostnames from URIs.
- #
- if host =~ /^[a-z][a-z0-9+-]+:\/\//
- begin
- uri = URI.parse(host)
- host = uri.host unless uri.host.nil?
- rescue URI::InvalidURIError => ex
- # ugh
- logger.warn "Did not recognise URI #{host}"
- end
+ host = self.subject
+
+ #
+ # Pick out hostnames from URIs.
+ #
+ if host =~ /^[a-z][a-z0-9+-]+:\/\//
+ begin
+ uri = URI.parse(host)
+ host = uri.host unless uri.host.nil?
+ rescue URI::InvalidURIError => ex
+ # ugh
+ logger.warn "Did not recognise URI #{host}"
end
+ end
- @subject_hosts_and_ips = ([host] + MauveResolv.get_ips_for(host)).flatten
- @subject_hosts_and_ips_last_resolved_at = Time.now
+ return true if source_list.list.any? do |l|
+ case l
+ when String
+ host == l
+ when Regexp
+ host =~ l
+ when IPAddr
+ begin
+ l.include?(IPAddr.new(host))
+ rescue ArgumentError
+ # rescue random IPAddr argument errors
+ false
+ end
+ else
+ false
+ end
end
- @subject_hosts_and_ips
+ return false unless source_list.list.any?{|l| l.is_a?(IPAddr)}
+
+ @subject_ips ||= MauveResolv.get_ips_for(host).collect{|i| IPAddr.new(i)}
+
+ return false if @subject_ips.nil? or @subject_ips.empty?
+
+ return source_list.list.select{|i| i.is_a?(IPAddr)}.any? do |list_ip|
+ @subject_ips.any?{|ip| list_ip.include?(ip)}
+ end
+
+ return false
end
# Returns the alert level
@@ -229,6 +253,38 @@ module Mauve
#
# @return [String]
def detail; attribute_get(:detail) || "_No detail set._" ; end
+
+ #
+ # Set the subject -- this clears the cached_alert_group.
+ #
+ def subject=(s)
+ attribute_set(:subject, s)
+ self.cached_alert_group = nil
+ end
+
+ #
+ # Set the detail -- this clears the cached_alert_group.
+ #
+ def detail=(s)
+ attribute_set(:detail, s)
+ self.cached_alert_group = nil
+ end
+
+ #
+ # Set the source -- this clears the cached_alert_group.
+ #
+ def source=(s)
+ attribute_set(:source, s)
+ self.cached_alert_group = nil
+ end
+
+ #
+ # Set the summary -- this clears the cached_alert_group.
+ #
+ def summary=(s)
+ attribute_set(:summary, s)
+ self.cached_alert_group = nil
+ end
protected
@@ -326,6 +382,10 @@ module Mauve
true
end
+ #
+ #
+ #
+
# Remove all history for an alert, when an alert is destroyed.
#
#
@@ -372,9 +432,8 @@ module Mauve
#
# Re-cache the alert group.
#
- @alert_group = nil
self.cached_alert_group = nil
- self.cached_alert_group = self.alert_group.name
+ self.alert_group
unless save
logger.error("Couldn't save #{self}")
@@ -428,9 +487,8 @@ module Mauve
#
# Re-cache the alert group.
#
- @alert_group = nil
self.cached_alert_group = nil
- self.cached_alert_group = self.alert_group.name
+ self.alert_group
logger.info("Postponing raise of #{self} until #{postpone_until} as it was last updated in a prior run of Mauve.")
else
@@ -446,7 +504,7 @@ module Mauve
#
# Cache the alert group, but only if not already set.
#
- self.cached_alert_group = self.alert_group.name if self.cached_alert_group.nil?
+ self.alert_group
end
unless save