From 5c62ccc2858f8f8245cb6e8f7058c58de9363419 Mon Sep 17 00:00:00 2001 From: Patrick J Cherry Date: Wed, 7 Oct 2015 12:24:28 +0100 Subject: Added hipchat notification --- lib/mauve/configuration_builders/person.rb | 1 + lib/mauve/notifiers.rb | 1 + lib/mauve/notifiers/hipchat.rb | 107 +++++++++++++++++++++++++ lib/mauve/notifiers/templates/hipchat.html.erb | 22 +++++ lib/mauve/notifiers/templates/hipchat.txt.erb | 1 + lib/mauve/person.rb | 10 ++- 6 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 lib/mauve/notifiers/hipchat.rb create mode 100644 lib/mauve/notifiers/templates/hipchat.html.erb create mode 120000 lib/mauve/notifiers/templates/hipchat.txt.erb diff --git a/lib/mauve/configuration_builders/person.rb b/lib/mauve/configuration_builders/person.rb index 5f08d19..aac5f69 100644 --- a/lib/mauve/configuration_builders/person.rb +++ b/lib/mauve/configuration_builders/person.rb @@ -24,6 +24,7 @@ module Mauve is_attribute "sms" is_attribute "email" is_attribute "xmpp" + is_attribute "hipchat" is_flag_attribute "notify_when_on_holiday" is_flag_attribute "notify_when_off_sick" diff --git a/lib/mauve/notifiers.rb b/lib/mauve/notifiers.rb index 5a7acc0..383db5e 100644 --- a/lib/mauve/notifiers.rb +++ b/lib/mauve/notifiers.rb @@ -3,6 +3,7 @@ require 'mauve/notifiers/sms_default' require 'mauve/notifiers/sms_aql' require 'mauve/notifiers/sms_clockwork' require 'mauve/notifiers/xmpp' +require 'mauve/notifiers/hipchat' module Mauve # diff --git a/lib/mauve/notifiers/hipchat.rb b/lib/mauve/notifiers/hipchat.rb new file mode 100644 index 0000000..7537bc5 --- /dev/null +++ b/lib/mauve/notifiers/hipchat.rb @@ -0,0 +1,107 @@ +require 'mauve/notifiers/debug' + +module Mauve + module Notifiers + require 'net/https' + require 'json' + require 'cgi' + require 'uri' + + class Hipchat + + attr_accessor :token + attr_reader :name + + def initialize(name) + @name = name + end + + def gateway + @gateway + end + + def gateway=(uri) + @gateway = URI.parse(uri) + end + + def send_alert(destination, alert, all_alerts, conditions = {}) + msg = prepare_message(destination, alert, all_alerts, conditions) + + colour = case alert.level + when :urgent + "red" + when :normal + "yellow" + else + "green" + end + + opts = { + "color" => colour, + "message" => msg, + "notify" => true, + } + + + uri = @gateway.dup + + # + # If the destination is an email, it is a user + # + if destination =~ /@/ + uri.path = "/v2/user/"+ CGI::escape(destination) +"/message" + opts["message_type"] = "text" + else + uri.path = "/v2/room/"+CGI::escape(destination)+"/notification" + opts["message_type"] = "html" + end + + uri.query = "auth_token="+CGI::escape(self.token) + + http = Net::HTTP.new(uri.host, uri.port) + + if uri.port == 443 + http.use_ssl = true + http.verify_mode = OpenSSL::SSL::VERIFY_PEER + end + + response, data = http.post(uri.request_uri, opts, { + 'Content-Type' => 'application/json', + 'Content-Length' => opts.length.to_s + }) + + if response.kind_of?(Net::HTTPSuccess) + # + # Woo -- return true! + # + true + else + false + end + + end + + protected + + def prepare_message(destination, alert, all_alerts, conditions={}) + was_suppressed = conditions[:was_suppressed] || false + will_suppress = conditions[:will_suppress] || false + + if destination =~ /@/ + template_file = File.join(File.dirname(__FILE__),"templates","hipchat.txt.erb") + else + template_file = File.join(File.dirname(__FILE__),"templates","hipchat.html.erb") + end + + txt = if File.exists?(template_file) + ERB.new(File.read(template_file)).result(binding).chomp + else + logger.error("Could not find #{template_file} template") + alert.to_s + end + end + + end + end +end + diff --git a/lib/mauve/notifiers/templates/hipchat.html.erb b/lib/mauve/notifiers/templates/hipchat.html.erb new file mode 100644 index 0000000..4506c57 --- /dev/null +++ b/lib/mauve/notifiers/templates/hipchat.html.erb @@ -0,0 +1,22 @@ +<%= alert.id%>: <%= alert.update_type.upcase %> (<%= alert.level %>): <% +case alert.update_type +when "cleared" +%><%= alert.cleared_at.to_s_relative %><% +when "acknowledged" +%><%= alert.acknowledged_at.to_s_relative %> by <%= alert.acknowledged_by %> until <%= alert.will_unacknowledge_at.to_s_human %><% +else +%><%= alert.raised_at.to_s_relative %><% +end +%>: <%= alert.subject %> <%= alert.summary %><% +if alert.source != alert.subject +%> -- from <%= alert.source %><% +end +%>.<% +if defined? was_suppressed and defined? will_suppress + if was_suppressed and not will_suppress +%>
Normal service for <%= alert.level %> alerts has resumed.<% + elsif will_suppress and not was_suppressed +%>
Further <%= alert.level %> alerts suppressed until things calm down.<% + end +end +%> diff --git a/lib/mauve/notifiers/templates/hipchat.txt.erb b/lib/mauve/notifiers/templates/hipchat.txt.erb new file mode 120000 index 0000000..802c711 --- /dev/null +++ b/lib/mauve/notifiers/templates/hipchat.txt.erb @@ -0,0 +1 @@ +xmpp.txt.erb \ No newline at end of file diff --git a/lib/mauve/person.rb b/lib/mauve/person.rb index 021a393..1e26835 100644 --- a/lib/mauve/person.rb +++ b/lib/mauve/person.rb @@ -18,7 +18,7 @@ module Mauve @username = username @password = nil @urgent = @normal = @low = nil - @email = @sms = @xmpp = nil + @email = @sms = @xmpp = @hipchat = nil @notify_when_on_holiday = @notify_when_off_sick = false end @@ -84,6 +84,14 @@ module Mauve @xmpp = arg end + # Sets up the hipchat parameter + # + # + def hipchat=(arg) + raise ArgumentError, "hipchat expected a string, not a #{arg.class}" unless arg.is_a?(String) + @hipchat = arg + end + # Sets the password parameter # # -- cgit v1.2.1