diff options
| -rw-r--r-- | lib/mauve/configuration_builders/person.rb | 1 | ||||
| -rw-r--r-- | lib/mauve/notifiers.rb | 1 | ||||
| -rw-r--r-- | lib/mauve/notifiers/hipchat.rb | 1 | ||||
| -rw-r--r-- | lib/mauve/notifiers/pushover.rb | 114 | ||||
| -rw-r--r-- | lib/mauve/notifiers/templates/pushover.html.erb | 22 | ||||
| -rw-r--r-- | lib/mauve/person.rb | 10 | 
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      #      # | 
