aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/mauve/configuration_builders/person.rb1
-rw-r--r--lib/mauve/notifiers.rb1
-rw-r--r--lib/mauve/notifiers/hipchat.rb1
-rw-r--r--lib/mauve/notifiers/pushover.rb114
-rw-r--r--lib/mauve/notifiers/templates/pushover.html.erb22
-rw-r--r--lib/mauve/person.rb10
6 files changed, 147 insertions, 2 deletions
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 @@
+<a href="<%=WebInterface.url_for(alert)%>"><%= alert.id%>: <%= alert.update_type.upcase %></a> (<%= 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
+%>: <strong><%= alert.subject %></strong> <%= 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
+%><br /><em>Normal service for <%= alert.level %> alerts has resumed.</em><%
+ elsif will_suppress and not was_suppressed
+%><br /><em>Further <%= alert.level %> alerts suppressed until things calm down.</em><%
+ 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
#
#