class Sensu::API

Public Class Methods

bootstrap(options) click to toggle source
# File lib/sensu/api.rb, line 38
def bootstrap(options)
  setup_logger(options)
  set :logger, @logger
  load_settings(options)
  set :api, @settings[:api]
  set :checks, @settings[:checks]
  set :all_checks, @settings.checks
  set :cors, @settings[:cors] || {
    'Origin' => '*',
    'Methods' => 'GET, POST, PUT, DELETE, OPTIONS',
    'Credentials' => 'true',
    'Headers' => 'Origin, X-Requested-With, Content-Type, Accept, Authorization'
  }
  on_reactor_run
  self
end
on_reactor_run() click to toggle source
# File lib/sensu/api.rb, line 29
def on_reactor_run
  EM::next_tick do
    setup_redis
    set :redis, @redis
    setup_transport
    set :transport, @transport
  end
end
run(options={}) click to toggle source
# File lib/sensu/api.rb, line 20
def run(options={})
  bootstrap(options)
  setup_process(options)
  EM::run do
    start
    setup_signal_traps
  end
end
start() click to toggle source
Calls superclass method Sensu::Daemon#start
# File lib/sensu/api.rb, line 72
def start
  start_server
  super
end
start_server() click to toggle source
# File lib/sensu/api.rb, line 55
def start_server
  Thin::Logging.silent = true
  bind = @settings[:api][:bind] || '0.0.0.0'
  @thin = Thin::Server.new(bind, @settings[:api][:port], self)
  @thin.start
end
stop() click to toggle source
Calls superclass method Sensu::Daemon#stop
# File lib/sensu/api.rb, line 77
def stop
  @logger.warn('stopping')
  stop_server do
    @redis.close
    @transport.close
    super
  end
end
stop_server(&block) click to toggle source
# File lib/sensu/api.rb, line 62
def stop_server(&block)
  @thin.stop
  retry_until_true do
    unless @thin.running?
      block.call
      true
    end
  end
end
test(options={}) click to toggle source
# File lib/sensu/api.rb, line 86
def test(options={})
  bootstrap(options)
  start
end

Public Instance Methods

accepted!(response) click to toggle source
# File lib/sensu/api.rb, line 154
def accepted!(response)
  status 202
  body response
end
authorized?() click to toggle source
# File lib/sensu/api.rb, line 125
def authorized?
  @auth ||=  Rack::Auth::Basic::Request.new(request.env)
  @auth.provided? &&
    @auth.basic? &&
    @auth.credentials &&
    @auth.credentials == [settings.api[:user], settings.api[:password]]
end
bad_request!() click to toggle source
# File lib/sensu/api.rb, line 133
def bad_request!
  ahalt 400
end
created!(response) click to toggle source
# File lib/sensu/api.rb, line 149
def created!(response)
  status 201
  body response
end
integer_parameter(parameter) click to toggle source
# File lib/sensu/api.rb, line 184
def integer_parameter(parameter)
  parameter =~ /^[0-9]+$/ ? parameter.to_i : nil
end
issued!() click to toggle source
# File lib/sensu/api.rb, line 159
def issued!
  accepted!(MultiJson.dump(:issued => Time.now.to_i))
end
no_content!() click to toggle source
# File lib/sensu/api.rb, line 163
def no_content!
  status 204
  body ''
end
not_found!() click to toggle source
# File lib/sensu/api.rb, line 141
def not_found!
  ahalt 404
end
pagination(items) click to toggle source
# File lib/sensu/api.rb, line 188
def pagination(items)
  limit = integer_parameter(params[:limit])
  offset = integer_parameter(params[:offset]) || 0
  unless limit.nil?
    headers['X-Pagination'] = MultiJson.dump(
      :limit => limit,
      :offset => offset,
      :total => items.size
    )
    paginated = items.slice(offset, limit)
    Array(paginated)
  else
    items
  end
end
protected!() click to toggle source
# File lib/sensu/api.rb, line 117
def protected!
  if settings.api[:user] && settings.api[:password]
    return if !(settings.api[:user] && settings.api[:password]) || authorized?
    headers['WWW-Authenticate'] = 'Basic realm="Restricted Area"'
    unauthorized!
  end
end
read_data(rules={}, &block) click to toggle source
# File lib/sensu/api.rb, line 168
def read_data(rules={}, &block)
  begin
    data = MultiJson.load(env['rack.input'].read)
    valid = rules.all? do |key, rule|
      data[key].is_a?(rule[:type]) || (rule[:nil_ok] && data[key].nil?)
    end
    if valid
      block.call(data)
    else
      bad_request!
    end
  rescue MultiJson::ParseError
    bad_request!
  end
end
request_log_line() click to toggle source
# File lib/sensu/api.rb, line 106
def request_log_line
  settings.logger.info([env['REQUEST_METHOD'], env['REQUEST_PATH']].join(' '), {
    :remote_address => env['REMOTE_ADDR'],
    :user_agent => env['HTTP_USER_AGENT'],
    :request_method => env['REQUEST_METHOD'],
    :request_uri => env['REQUEST_URI'],
    :request_body => env['rack.input'].read
  })
  env['rack.input'].rewind
end
resolve_event(event_json) click to toggle source
# File lib/sensu/api.rb, line 229
def resolve_event(event_json)
  event = MultiJson.load(event_json)
  check = event[:check].merge(
    :output => 'Resolving on request of the API',
    :status => 0,
    :issued => Time.now.to_i,
    :executed => Time.now.to_i,
    :force_resolve => true
  )
  check.delete(:history)
  payload = {
    :client => event[:client][:name],
    :check => check
  }
  settings.logger.info('publishing check result', {
    :payload => payload
  })
  settings.transport.publish(:direct, 'results', MultiJson.dump(payload)) do |info|
    if info[:error]
      settings.logger.error('failed to publish check result', {
        :payload => payload,
        :error => info[:error].to_s
      })
    end
  end
end
transport_info(&block) click to toggle source
# File lib/sensu/api.rb, line 204
def transport_info(&block)
  info = {
    :keepalives => {
      :messages => nil,
      :consumers => nil
    },
    :results => {
      :messages => nil,
      :consumers => nil
    },
    :connected => settings.transport.connected?
  }
  if settings.transport.connected?
    settings.transport.stats('keepalives') do |stats|
      info[:keepalives] = stats
      settings.transport.stats('results') do |stats|
        info[:results] = stats
        block.call(info)
      end
    end
  else
    block.call(info)
  end
end
unauthorized!() click to toggle source
# File lib/sensu/api.rb, line 137
def unauthorized!
  throw(:halt, [401, ''])
end
unavailable!() click to toggle source
# File lib/sensu/api.rb, line 145
def unavailable!
  ahalt 503
end