class Flapjack::Gateways::SmsNexmo

Attributes

sent[RW]

Public Class Methods

new(opts = {}) click to toggle source
# File lib/flapjack/gateways/sms_nexmo.rb, line 22
def initialize(opts = {})
  @lock = opts[:lock]
  @config = opts[:config]

  # TODO support for config reloading
  @queue = Flapjack::RecordQueue.new(@config['queue'] || 'sms_nexmo_notifications',
             Flapjack::Data::Alert)

  @sent = 0
end

Public Instance Methods

start() click to toggle source
# File lib/flapjack/gateways/sms_nexmo.rb, line 33
def start
  Flapjack.logger.debug("new sms_nexmo gateway pikelet with the following options: #{@config.inspect}")

  begin
    Zermelo.redis = Flapjack.redis

    loop do
      @lock.synchronize do
        @queue.foreach {|alert| handle_alert(alert) }
      end

      @queue.wait
    end
  ensure
    Flapjack.redis.quit
  end
end
stop_type() click to toggle source
# File lib/flapjack/gateways/sms_nexmo.rb, line 51
def stop_type
  :exception
end

Private Instance Methods

handle_alert(alert) click to toggle source
# File lib/flapjack/gateways/sms_nexmo.rb, line 57
def handle_alert(alert)
  Flapjack.logger.debug "Woo, got an alert to send out: #{alert.inspect}"

  api_key = @config["api_key"]
  secret = @config["secret"]
  from = @config["from"]

  address = alert.medium.address
  message_type    = alert.rollup ? 'rollup' : 'alert'

  sms_dir = File.join(File.dirname(__FILE__), 'sms_nexmo')
  sms_nexmo_template_erb, sms_nexmo_template =
    load_template(@config['templates'], message_type, 'text', sms_dir)

  @alert  = alert
  bnd     = binding

  begin
    message = sms_nexmo_template_erb.result(bnd).chomp
  rescue => e
    Flapjack.logger.error "Error while executing the ERB for a Nexmo SMS: " +
      "ERB being executed: #{sms_nexmo_template}"
    raise
  end

  if @config.nil? || (@config.respond_to?(:empty?) && @config.empty?)
    Flapjack.logger.error "Nexmo SMS config is missing"
    return
  end

  errors = []

  safe_message = (message.length > 159) ?
                  message[0..158].gsub(/...$/, '...') : message,

  [[api_key, "Nexmo api_key is missing"],
   [secret, "Nexmo auth_token is missing"],
   [from,  "Nexmo from address is missing"],
   [address,  "Nexmo address is missing"]].each do |val_err|

    next unless val_err.first.nil? || (val_err.first.respond_to?(:empty?) && val_err.first.empty?)
    errors << val_err.last
  end

  unless errors.empty?
    errors.each {|err| Flapjack.logger.error err }
    return
  end

  begin
    nexmo = Nexmo::Client.new(:key => api_key, :secret => secret)
    nexmo.send_message(:from => from, :to => address, :text => safe_message)
    @sent += 1
  rescue => e
    Flapjack.logger.error "Error sending SMS via Nexmo: #{e.message}"
  end
rescue => e
  Flapjack.logger.error "Error generating or delivering Nexmo SMS message to #{alert.medium.address}: #{e.class}: #{e.message}"
  Flapjack.logger.error e.backtrace.join("\n")
  raise
end