summaryrefslogtreecommitdiff
path: root/lib/custodian/alerter.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/custodian/alerter.rb')
-rw-r--r--lib/custodian/alerter.rb63
1 files changed, 61 insertions, 2 deletions
diff --git a/lib/custodian/alerter.rb b/lib/custodian/alerter.rb
index 69de28e..f5caa6a 100644
--- a/lib/custodian/alerter.rb
+++ b/lib/custodian/alerter.rb
@@ -11,6 +11,10 @@ require 'socket'
#
# This class encapsulates the raising and clearing of alerts via Mauve.
#
+# There is a helper method to update any alerts with details of whether the
+# affected host is inside/outside the Bytemark network.
+#
+#
class Alerter
@@ -68,13 +72,48 @@ class Alerter
#
+ # Resolve an IP address
+ #
+ def document_address( address )
+
+ raise ArgumentError, "Address must not be nil" if ( address.nil? )
+
+ begin
+ Resolv.new.getname(address)
+ rescue
+ nil
+ end
+ end
+
+
+
+ #
# Raise the alert.
#
def raise( detail )
+ #
+ # Is this alert affecting a machine inside/outside our network
+ #
inside = expand_inside_bytemark( @details["target_host"] )
+ #
+ # Document the hostname if the alert relates to an IP address.
+ #
+ resolved = ""
+ if ( ( @details["target_host"] =~ /^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)$/ ) ||
+ ( @details["target_host"] =~ /^([0-9a-f:]+)$/ ) )
+
+ resolved = document_address( @details["target_host"] )
+ if ( resolved.nil? )
+ resolved = ""
+ else
+ resolved = "The IP address #{@details["target_host"]} resolves to #{resolved}."
+ end
+ end
+
+
update = Mauve::Proto::AlertUpdate.new
update.alert = []
update.source = "custodian"
@@ -90,7 +129,7 @@ class Alerter
alert.subject = @details['target_host']
alert.summary = @details['test_alert']
- alert.detail = "#{inside} <p>The #{@details['test_type']} test failed against #{@details['target_host']}: #{detail}</p>"
+ alert.detail = "#{inside} <p>The #{@details['test_type']} test failed against #{@details['target_host']}: #{detail}</p><p>#{resolved}</p>"
alert.raise_time = Time.now.to_i
update.alert << alert
@@ -103,8 +142,28 @@ class Alerter
#
def clear
+ #
+ # Is this alert affecting a machine inside/outside our network
+ #
inside = expand_inside_bytemark( @details["target_host"] )
+
+ #
+ # Document the hostname if the alert relates to an IP address.
+ #
+ resolved = ""
+ if ( ( @details["target_host"] =~ /^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)$/ ) ||
+ ( @details["target_host"] =~ /^([0-9a-f:]+)$/ ) )
+
+ resolved = document_address( @details["target_host"] )
+ if ( resolved.nil? )
+ resolved = ""
+ else
+ resolved = "The IP address #{@details["target_host"]} resolves to #{resolved}."
+ end
+ end
+
+
update = Mauve::Proto::AlertUpdate.new
update.alert = []
update.source = "custodian"
@@ -121,7 +180,7 @@ class Alerter
alert.subject = @details['target_host']
alert.summary = @details['test_alert']
- alert.detail = "#{inside} <p>The #{@details['test_type']} test succeeded against #{@details['target_host']}</p>"
+ alert.detail = "#{inside} <p>The #{@details['test_type']} test succeeded against #{@details['target_host']}</p><p>#{resolved}</p>"
alert.clear_time = Time.now.to_i
update.alert << alert