# 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
# 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
# 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
# File lib/sensu/api/process.rb, line 79 def start start_server super end
# 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
# 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
# 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
# File lib/sensu/api/process.rb, line 93 def test(options={}) bootstrap(options) setup_connections do start yield end end
# File lib/sensu/api/process.rb, line 164 def accepted!(response) status 202 body response end
# File lib/sensu/api/process.rb, line 143 def bad_request! ahalt 400 end
# File lib/sensu/api/process.rb, line 159 def created!(response) status 201 body response end
# File lib/sensu/api/process.rb, line 197 def integer_parameter(parameter) parameter =~ /\A[0-9]+\z/ ? parameter.to_i : nil end
# File lib/sensu/api/process.rb, line 169 def issued! accepted!(Sensu::JSON.dump(:issued => Time.now.to_i)) end
# File lib/sensu/api/process.rb, line 173 def no_content! status 204 body "" end
# File lib/sensu/api/process.rb, line 151 def not_found! ahalt 404 end
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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