# 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
# 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
# File lib/sensu/api.rb, line 20 def run(options={}) bootstrap(options) setup_process(options) EM::run do start setup_signal_traps end end
# File lib/sensu/api.rb, line 72 def start start_server super end
# 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
# File lib/sensu/api.rb, line 77 def stop @logger.warn('stopping') stop_server do @redis.close @transport.close super end end
# 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
# File lib/sensu/api.rb, line 86 def test(options={}) bootstrap(options) start end
# File lib/sensu/api.rb, line 154 def accepted!(response) status 202 body response end
# File lib/sensu/api.rb, line 133 def bad_request! ahalt 400 end
# File lib/sensu/api.rb, line 149 def created!(response) status 201 body response end
# File lib/sensu/api.rb, line 184 def integer_parameter(parameter) parameter =~ /^[0-9]+$/ ? parameter.to_i : nil end
# File lib/sensu/api.rb, line 159 def issued! accepted!(MultiJson.dump(:issued => Time.now.to_i)) end
# File lib/sensu/api.rb, line 163 def no_content! status 204 body '' end
# File lib/sensu/api.rb, line 141 def not_found! ahalt 404 end
# 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
# 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
# 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
# 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
# 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
# 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