aboutsummaryrefslogtreecommitdiff
path: root/lib/mauve/notifiers/pushover.rb
blob: 39caaf6809a2418dc1e79a08597770d2fd68221c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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