aboutsummaryrefslogtreecommitdiff
path: root/lib/mauve/notifiers/sms_aql.rb
blob: 1cf8c047df8eb06febec5187b77fa963022f2044 (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
require 'mauve/notifiers/debug'
require 'cgi'

module Mauve
  module Notifiers
    module Sms
      
      require 'net/https'
      class AQL
        GATEWAY = "https://gw1.aql.com/sms/sms_gw.php"

        attr :username, true
        attr :password, true
        attr :from, true
        attr :max_messages_per_alert, true
        attr_reader :name

        def initialize(name)
          @name = name
        end

        def send_alert(destination, alert, all_alerts, conditions = nil)
          uri = URI.parse(GATEWAY)
                  
          opts_string = {
            :username => @username,
            :password => @password,
            :destination => normalize_number(destination),
            :message => prepare_message(destination, alert, all_alerts, conditions),
            :originator => @from,
            :flash => @flash ? 1 : 0
          }.map { |k,v| "#{k}=#{CGI::escape(v.to_s)}" }.join("&")
          
          http = Net::HTTP.new(uri.host, uri.port)
          if uri.port == 443
            http.use_ssl = true
            http.verify_mode = OpenSSL::SSL::VERIFY_NONE
          end
          response, data = http.post(uri.path, opts_string, {
            'Content-Type' => 'application/x-www-form-urlencoded',
            'Content-Length' => opts_string.length.to_s
          })
          
          raise response unless response.kind_of?(Net::HTTPSuccess)
        end
        
        protected
        def prepare_message(destination, alert, all_alerts, conditions=nil)
          if conditions
            @suppressed_changed = conditions[:suppressed_changed]
          end
          
          txt = case @suppressed_changed
            when true then "TOO MUCH NOISE!  Last notification: "
            when false then "BACK TO NORMAL: "
            else 
              ""
          end
          
          txt += "#{alert.update_type.upcase}: "
          txt += alert.summary_one_line
          
          others = all_alerts-[alert]
          if !others.empty?
            txt += (1 == others.length)? 
              "and a lone other." : 
              "and #{others.length} others."
            #txt += "and #{others.length} others: "
            #txt += others.map { |alert| alert.summary_one_line }.join(", ")
          end

          txt += "link: https://alert.bytemark.co.uk/alerts"

          ## @TODO:  Add a link to acknowledge the alert in the text?
          #txt += "Acknoweledge alert: "+
          #       "https://alert.bytemark.co.uk/alert/acknowledge/"+
          #       "#{alert.id}/#{alert.get_default_acknowledge_time}

          txt
        end
        
        def normalize_number(n)
          n.split("").select { |s| (?0..?9).include?(s[0]) }.join.gsub(/^0/, "44")
        end
        include Debug
      end
    end
  end
end