From 99eb81c4447f093f9e4b19a263ab8d1f5e8f8986 Mon Sep 17 00:00:00 2001 From: James Hannah Date: Thu, 26 Jan 2017 10:28:14 +0000 Subject: Pushover support Based on the Hipchat notifier. API Reference: https://pushover.net/api --- lib/mauve/configuration_builders/person.rb | 1 + lib/mauve/notifiers.rb | 1 + lib/mauve/notifiers/hipchat.rb | 1 - lib/mauve/notifiers/pushover.rb | 114 ++++++++++++++++++++++++ lib/mauve/notifiers/templates/pushover.html.erb | 22 +++++ lib/mauve/person.rb | 10 ++- 6 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 lib/mauve/notifiers/pushover.rb create mode 100644 lib/mauve/notifiers/templates/pushover.html.erb diff --git a/lib/mauve/configuration_builders/person.rb b/lib/mauve/configuration_builders/person.rb index aac5f69..39b5306 100644 --- a/lib/mauve/configuration_builders/person.rb +++ b/lib/mauve/configuration_builders/person.rb @@ -25,6 +25,7 @@ module Mauve is_attribute "email" is_attribute "xmpp" is_attribute "hipchat" + is_attribute "pushover" 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 383db5e..1195860 100644 --- a/lib/mauve/notifiers.rb +++ b/lib/mauve/notifiers.rb @@ -4,6 +4,7 @@ require 'mauve/notifiers/sms_aql' require 'mauve/notifiers/sms_clockwork' require 'mauve/notifiers/xmpp' require 'mauve/notifiers/hipchat' +require 'mauve/notifiers/pushover' module Mauve # diff --git a/lib/mauve/notifiers/hipchat.rb b/lib/mauve/notifiers/hipchat.rb index 7537bc5..dd549ac 100644 --- a/lib/mauve/notifiers/hipchat.rb +++ b/lib/mauve/notifiers/hipchat.rb @@ -42,7 +42,6 @@ module Mauve "notify" => true, } - uri = @gateway.dup # diff --git a/lib/mauve/notifiers/pushover.rb b/lib/mauve/notifiers/pushover.rb new file mode 100644 index 0000000..39caaf6 --- /dev/null +++ b/lib/mauve/notifiers/pushover.rb @@ -0,0 +1,114 @@ +require 'mauve/notifiers/debug' + +module Mauve + module Notifiers + require 'net/https' + require 'json' + require 'cgi' + require 'uri' + + class Pushover + + 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) + + priority = case alert.level + when :urgent + 1 + when :normal + 0 + else + -1 + end + + opts = { + "priority" => priority, + "message" => msg, + "url" => WebInterface.url_for(alert), + "url_title" => "View alert", + "html" => 1, + } + + uri = @gateway.dup + uri.path = "/1/messages.json" + + # + # If the destination is an email, it is a user + # + if destination =~ /@/ + (device,user) = destination.split(/@/,2) + opts['device'] = device + opts['user'] = user + else + opts['user'] = user + 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 + + case alert.update_type + when "cleared" + opts['timestamp'] = alert.cleared_at + when "acknowledged" + opts['timestamp'] = alert.acknowledged_at + else + opts['timestamp'] = alert.raised_at + 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 + + template_file = File.join(File.dirname(__FILE__),"templates","pushover.html.erb") + + 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/pushover.html.erb b/lib/mauve/notifiers/templates/pushover.html.erb new file mode 100644 index 0000000..4506c57 --- /dev/null +++ b/lib/mauve/notifiers/templates/pushover.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/person.rb b/lib/mauve/person.rb index 1e26835..9a5644e 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 = @hipchat = nil + @email = @sms = @xmpp = @hipchat = @pushover = nil @notify_when_on_holiday = @notify_when_off_sick = false end @@ -92,6 +92,14 @@ module Mauve @hipchat = arg end + # Sets up the pushover parameter + # + # + def pushover=(arg) + raise ArgumentError, "pushover expected a string, not a #{arg.class}" unless arg.is_a?(String) + @pushover = arg + end + # Sets the password parameter # # -- cgit v1.2.1