class Voltron::Defender

Constants

VERSION

Public Class Methods

new(app) click to toggle source
# File lib/voltron/defender.rb, line 18
def initialize(app)
  @app = app

  @slack = ::Voltron::Defender::SlackAdapter.new

  @slack.commander.listen_to(::Voltron::Defender::When)
  @slack.commander.listen_to(::Voltron::Defender::Trace)
  @slack.commander.listen_to(::Voltron::Defender::Http)
  @slack.commander.listen_to(::Voltron::Defender::Trello)
  @slack.commander.listen_to(::Voltron::Defender::Stop)
  @slack.commander.listen_to(::Voltron::Defender::Help)
  @slack.commander.listen_to(::Voltron::Defender::Defender)
end

Public Instance Methods

call(env) click to toggle source
# File lib/voltron/defender.rb, line 32
def call(env)
  begin
    @app.call(env)
  rescue Exception => e
    if Voltron.config.defender.enabled?
      error = Voltron::Defender::Error.new(exception_params(e, env))
      handle(error) if error.save
    end

    if Voltron.config.defender.ip_restrict_errors
      if Voltron.config.defender.has_ip?(env.try(:[], 'REMOTE_ADDR'))
        env['action_dispatch.show_detailed_exceptions'] = true
      end
    end
    raise e
  end
end
handle(error) click to toggle source
# File lib/voltron/defender.rb, line 50
def handle(error)
  @slack.client.start_async unless @slack.client.started?

  if @slack.client.started?
    @slack.attach(error.name, error.message, :danger)
  end
end

Private Instance Methods

exception_params(ex, env) click to toggle source
# File lib/voltron/defender.rb, line 60
def exception_params(ex, env)
  last_line = (ex.backtrace.first || 'Unknown:Unknown').split(':')
  headers = (env ||= {}).select { |k,v| /^[A-Z_]+$/.match(k.to_s) }

  { error: ex.message, file: last_line[0], line: last_line[1], trace: ex.backtrace.join("\n"), headers: headers.to_json }
end