require "sinatra/base" require "sinatra/streaming" require "json" require "fog" require "exceptions/invalid_record" require "exceptions/record_not_found" require "exceptions/dependency_error" require "exceptions/conflict_exception" require "exceptions/parser_error" require "exceptions/validation_error" require "exceptions/knife_config_error" require 'core/devops-logger' require_relative "../helpers/version_2" module Devops class Api2 < Sinatra::Base include Sinatra::JSON helpers Sinatra::Streaming helpers Devops::API2_0::Helpers register Sinatra::DevopsAuth @@logger = nil @@access_logger = DevopsLogger.access_logger(File.join(DevopsConfig.config[:log_dir], "devops-api2.access.log")) configure :production do config = DevopsConfig.config log_file = File.join(config[:log_dir], "devops-api2.log") @@logger = DevopsLogger.create(log_file, Logger::INFO) # use Rack::CommonLogger, logger disable :dump_errors disable :show_exceptions #set :logging, Logger::INFO @@logger.info "Production mode" end configure :development do config = DevopsConfig.config log_file = File.join(config[:log_dir], "devops-api2.dev.log") @@logger = DevopsLogger.create(log_file, Logger::DEBUG) # logger = DevopsLogger.create(log_file, Logger::DEBUG) # logger = Logger.new STDOUT # use Rack::CommonLogger, logger disable :raise_errors #set :show_exceptions, :after_handler set :show_exceptions, false #set :dump_errors, false @@logger.info "Development mode" end not_found do "Not found" end # set current logger and call handlers def call env DevopsLogger.logger = @@logger begin res = super(env) rescue DevopsError => e return [e.code, {}, e.message] end @@access_logger.info(env["REQUEST_METHOD"] + " " + env["REQUEST_URI"] + " - from #{env["HTTP_USER_AGENT"]} (#{env["REMOTE_USER"]}) / #{res.inspect}") res end error Devops::ValidationError do e = env["sinatra.error"] #logger.warn e.message halt_response(e.message, 400) end error Devops::ParserError do e = env["sinatra.error"] #logger.warn e.message halt_response(e.message, 400) end error RecordNotFound do e = env["sinatra.error"] logger.warn e.message halt_response(e.message, 404) end error InvalidRecord do e = env["sinatra.error"] logger.warn e.message logger.warn "Request body: #{request.body.read}" halt_response(e.message, 400) end error InvalidCommand do e = env["sinatra.error"] logger.warn e.message halt_response(e.message, 400) end error DependencyError do e = env["sinatra.error"] logger.warn e.message halt_response(e.message, 400) end error ConflictException do e = env["sinatra.error"] logger.warn e.message halt_response(e.message, 409) end error InvalidPrivileges do e = env["sinatra.error"] logger.warn e.message halt_response(e.message, 401) end error Excon::Errors::Error do e = env["sinatra.error"] logger.warn e.message halt_response(e.message, 400) end error ::Excon::Errors::Unauthorized do e = env["sinatra.error"] resp = e.response ct = resp.headers["Content-Type"] msg = unless ct.nil? if ct.include?("application/json") json = ::Chef::JSONCompat.from_json(resp.body) m = "ERROR: Unauthorized (#{json['error']['code']}): #{json['error']['message']}" logger.error(m) else end m else "Unauthorized: #{e.inspect}" end halt_response(msg, 500) end error Fog::Compute::AWS::Error do e = env["sinatra.error"] logger.error e.message halt_response(e.message, 500) end error do e = env["sinatra.error"] logger.error e.message halt_response(e.message, 500) end end end