Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Pushover support #1

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lib/mauve/configuration_builders/person.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ def builder_setup(username)
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"
Expand Down
1 change: 1 addition & 0 deletions lib/mauve/notifiers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
require 'mauve/notifiers/sms_clockwork'
require 'mauve/notifiers/xmpp'
require 'mauve/notifiers/hipchat'
require 'mauve/notifiers/pushover'

module Mauve
#
Expand Down
1 change: 0 additions & 1 deletion lib/mauve/notifiers/hipchat.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ def send_alert(destination, alert, all_alerts, conditions = {})
"notify" => true,
}


uri = @gateway.dup

#
Expand Down
114 changes: 114 additions & 0 deletions lib/mauve/notifiers/pushover.rb
Original file line number Diff line number Diff line change
@@ -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

22 changes: 22 additions & 0 deletions lib/mauve/notifiers/templates/pushover.html.erb
Original file line number Diff line number Diff line change
@@ -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
%>
10 changes: 9 additions & 1 deletion lib/mauve/person.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def initialize(username)
@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
Expand Down Expand Up @@ -92,6 +92,14 @@ def hipchat=(arg)
@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
#
#
Expand Down