class Sensu::API::Process

Public Class Methods

bootstrap(options) click to toggle source
# File lib/sensu/api/process.rb, line 42
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"
  }
end
run(options={}) click to toggle source
# File lib/sensu/api/process.rb, line 21
def run(options={})
  bootstrap(options)
  setup_process(options)
  EM::run do
    setup_connections do
      start
      setup_signal_traps
    end
  end
end
setup_connections() { || ... } click to toggle source
# File lib/sensu/api/process.rb, line 32
def setup_connections
  setup_redis do |redis|
    set :redis, redis
    setup_transport do |transport|
      set :transport, transport
      yield if block_given?
    end
  end
end
start() click to toggle source
Calls superclass method Sensu::Daemon#start
# File lib/sensu/api/process.rb, line 79
def start
  start_server
  super
end
start_server() click to toggle source
# File lib/sensu/api/process.rb, line 57
def start_server
  Thin::Logging.silent = true
  bind = settings.api[:bind] || "0.0.0.0"
  port = settings.api[:port] || 4567
  @logger.info("api listening", {
    :bind => bind,
    :port => port
  })
  @thin = Thin::Server.new(bind, port, self)
  @thin.start
end
stop() click to toggle source
Calls superclass method Sensu::Daemon#stop
# File lib/sensu/api/process.rb, line 84
def stop
  @logger.warn("stopping")
  stop_server do
    settings.redis.close if settings.redis
    settings.transport.close if settings.transport
    super
  end
end
stop_server() { || ... } click to toggle source
# File lib/sensu/api/process.rb, line 69
def stop_server
  @thin.stop
  retry_until_true do
    unless @thin.running?
      yield
      true
    end
  end
end
test(options={}) { || ... } click to toggle source
# File lib/sensu/api/process.rb, line 93
def test(options={})
  bootstrap(options)
  setup_connections do
    start
    yield
  end
end

Public Instance Methods

accepted!(response) click to toggle source
# File lib/sensu/api/process.rb, line 164
def accepted!(response)
  status 202
  body response
end
authorized?() click to toggle source
# File lib/sensu/api/process.rb, line 135
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/process.rb, line 143
def bad_request!
  ahalt 400
end
created!(response) click to toggle source
# File lib/sensu/api/process.rb, line 159
def created!(response)
  status 201
  body response
end
integer_parameter(parameter) click to toggle source
# File lib/sensu/api/process.rb, line 197
def integer_parameter(parameter)
  parameter =~ /\A[0-9]+\z/ ? parameter.to_i : nil
end
issued!() click to toggle source
# File lib/sensu/api/process.rb, line 169
def issued!
  accepted!(Sensu::JSON.dump(:issued => Time.now.to_i))
end
no_content!() click to toggle source
# File lib/sensu/api/process.rb, line 173
def no_content!
  status 204
  body ""
end
not_found!() click to toggle source
# File lib/sensu/api/process.rb, line 151
def not_found!
  ahalt 404
end
pagination(items) click to toggle source
# File lib/sensu/api/process.rb, line 201
def pagination(items)
  limit = integer_parameter(params[:limit])
  offset = integer_parameter(params[:offset]) || 0
  unless limit.nil?
    headers["X-Pagination"] = Sensu::JSON.dump(
      :limit => limit,
      :offset => offset,
      :total => items.length
    )
    paginated = items.slice(offset, limit)
    Array(paginated)
  else
    items
  end
end
protected!() click to toggle source
# File lib/sensu/api/process.rb, line 127
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
publish_check_request(check) click to toggle source
# File lib/sensu/api/process.rb, line 282
def publish_check_request(check)
  payload = check.merge(:issued => Time.now.to_i)
  settings.logger.info("publishing check request", {
    :payload => payload,
    :subscribers => check[:subscribers]
  })
  check[:subscribers].each do |subscription|
    options = transport_publish_options(subscription.to_s, Sensu::JSON.dump(payload))
    settings.transport.publish(*options) do |info|
      if info[:error]
        settings.logger.error("failed to publish check request", {
          :subscription => subscription,
          :payload => payload,
          :error => info[:error].to_s
        })
      end
    end
  end
end
publish_check_result(client_name, check) click to toggle source
# File lib/sensu/api/process.rb, line 242
def publish_check_result(client_name, check)
  check[:issued] = Time.now.to_i
  check[:executed] = Time.now.to_i
  check[:status] ||= 0
  payload = {
    :client => client_name,
    :check => check
  }
  settings.logger.info("publishing check result", :payload => payload)
  settings.transport.publish(:direct, "results", Sensu::JSON.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
read_data(rules={}) { |data| ... } click to toggle source
# File lib/sensu/api/process.rb, line 178
def read_data(rules={})
  begin
    data = Sensu::JSON.load(env["rack.input"].read)
    valid = rules.all? do |key, rule|
      value = data[key]
      (value.is_a?(rule[:type]) || (rule[:nil_ok] && value.nil?)) &&
        (value.nil? || rule[:regex].nil?) ||
        (rule[:regex] && (value =~ rule[:regex]) == 0)
    end
    if valid
      yield(data)
    else
      bad_request!
    end
  rescue Sensu::JSON::ParseError
    bad_request!
  end
end
request_log_line() click to toggle source
# File lib/sensu/api/process.rb, line 116
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/process.rb, line 261
def resolve_event(event_json)
  event = Sensu::JSON.load(event_json)
  check = event[:check].merge(
    :output => "Resolving on request of the API",
    :status => 0,
    :force_resolve => true
  )
  check.delete(:history)
  publish_check_result(event[:client][:name], check)
end
transport_info() { |info| ... } click to toggle source
# File lib/sensu/api/process.rb, line 217
def transport_info
  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
        yield(info)
      end
    end
  else
    yield(info)
  end
end
transport_publish_options(subscription, message) click to toggle source
# File lib/sensu/api/process.rb, line 272
def transport_publish_options(subscription, message)
  _, raw_type = subscription.split(":", 2).reverse
  case raw_type
  when "direct", "roundrobin"
    [:direct, subscription, message]
  else
    [:fanout, subscription, message]
  end
end
unauthorized!() click to toggle source
# File lib/sensu/api/process.rb, line 147
def unauthorized!
  throw(:halt, [401, ""])
end
unavailable!() click to toggle source
# File lib/sensu/api/process.rb, line 155
def unavailable!
  ahalt 503
end