140 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			140 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
|   | require "sinatra/base" | ||
|  | require "sinatra/streaming" | ||
|  | require "json" | ||
|  | 
 | ||
|  | require "fog" | ||
|  | 
 | ||
|  | require "exceptions/invalid_privileges" | ||
|  | require "exceptions/invalid_record" | ||
|  | require "exceptions/configuration_error" | ||
|  | 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 "exceptions/access_error" | ||
|  | require 'core/devops-logger' | ||
|  | 
 | ||
|  | require_relative "../helpers/query" | ||
|  | 
 | ||
|  | require 'swagger/blocks' | ||
|  | 
 | ||
|  | module Devops | ||
|  |   class Api3 < Sinatra::Base | ||
|  | 
 | ||
|  |     include Swagger::Blocks | ||
|  | 
 | ||
|  |     include Sinatra::JSON | ||
|  |     helpers Sinatra::Streaming | ||
|  |     helpers Devops::API3::Helpers | ||
|  | 
 | ||
|  |     register Sinatra::DevopsAuth | ||
|  | 
 | ||
|  |     @@logger = nil | ||
|  |     @@access_logger = DevopsLogger.access_logger(File.join(DevopsConfig.config[:log_dir], "devops-api3.access.log")) | ||
|  | 
 | ||
|  |     set :root, File.expand_path("../../", __FILE__) | ||
|  |     set :public_folder, Proc.new { File.join(root, "public") } | ||
|  | 
 | ||
|  |     configure :production do | ||
|  |       config = DevopsConfig.config | ||
|  |       log_file = File.join(config[:log_dir], "devops-api3.log") | ||
|  |       @@logger = DevopsLogger.create(log_file, Logger::INFO) | ||
|  |       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-api3.dev.log") | ||
|  |       @@logger = DevopsLogger.create(log_file, Logger::DEBUG) | ||
|  |       disable :raise_errors | ||
|  |       set :show_exceptions, false | ||
|  |       disable :show_exceptions | ||
|  |       enable :logging | ||
|  |       use Rack::CommonLogger, @@logger | ||
|  |       @@logger.info "Development mode" | ||
|  |       puts root | ||
|  |       puts public_folder | ||
|  |     end | ||
|  | 
 | ||
|  |     def logger | ||
|  |       @@logger | ||
|  |     end | ||
|  | 
 | ||
|  |     error Sinatra::NotFound do | ||
|  |       content_type 'text/plain' | ||
|  |       [404, "#{request.url} not found"] | ||
|  |     end | ||
|  | 
 | ||
|  |     # set current logger and call handlers | ||
|  |     def call env | ||
|  |       DevopsLogger.logger = @@logger | ||
|  |       res = super(env) | ||
|  |       @@access_logger.info(env["REQUEST_METHOD"] + " " + env["REQUEST_URI"] + " - from #{env["HTTP_USER_AGENT"]} (#{env["REMOTE_USER"]}) / #{res[0]}") if env["REMOTE_USER"] | ||
|  |       res | ||
|  |     end | ||
|  | 
 | ||
|  |     def handle_exception!(boom) | ||
|  |       if boom.is_a?(::Devops::Exception::DevopsError) | ||
|  |         boom.http_response | ||
|  |       elsif boom.is_a?(Mongoid::Errors::Validations) | ||
|  |         Devops::Exception::ValidationError.create_from_db_exception(boom).http_response | ||
|  |       elsif boom.is_a?(Mongoid::Errors::InvalidValue) | ||
|  |         Devops::Exception::ParserError.create_from_db_exception(boom).http_response | ||
|  |       elsif boom.is_a?(Sinatra::NotFound) | ||
|  |         super(boom) | ||
|  |       else | ||
|  |         @@logger.error boom.message + "\n\t" + boom.backtrace.join("\n\t") | ||
|  |         super(boom) | ||
|  |       end | ||
|  |     end | ||
|  | 
 | ||
|  |     error Devops::Exception::KnifeConfigError do | ||
|  |       e = env["sinatra.error"] | ||
|  |       logger.error e.message | ||
|  |       halt_response(e.message, 500) | ||
|  |     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 |