require "sinatra/base" require "sinatra/streaming" require "helpers/version_2" require "json" require "routes/v2.0/flavor" require "routes/v2.0/image" require "routes/v2.0/filter" require "routes/v2.0/network" require "routes/v2.0/group" require "routes/v2.0/deploy" require "routes/v2.0/project" require "routes/v2.0/key" require "routes/v2.0/user" require "routes/v2.0/provider" require "routes/v2.0/tag" require "routes/v2.0/server" require "routes/v2.0/script" require "routes/v2.0/status" require "routes/v2.0/bootstrap_templates" require "routes/v2.0/stack_template" require "routes/v2.0/stack" require "routes/v2.0/handlers/provider" require "routes/v2.0/handlers/bootstrap_templates" require "routes/v2.0/handlers/deploy" require "routes/v2.0/handlers/filter" require "routes/v2.0/handlers/flavor" require "routes/v2.0/handlers/group" require "routes/v2.0/handlers/image" require "routes/v2.0/handlers/network" require "routes/v2.0/handlers/key" require "routes/v2.0/handlers/project" require "routes/v2.0/handlers/script" require "routes/v2.0/handlers/status" require "routes/v2.0/handlers/tag" require "routes/v2.0/handlers/user" require "routes/v2.0/handlers/server" require "routes/v2.0/handlers/stack_template" require "routes/v2.0/handlers/stack" require "routes/routes_container" require "auth/devops_auth" module Devops module Version2_0 class Application < Sinatra::Base extend Devops::RoutesContainer class << self @routes = [ Devops::Version2_0::Routes::ProviderRoutes, Devops::Version2_0::Routes::BootstrapTemplatesRoutes, Devops::Version2_0::Routes::UserRoutes, Devops::Version2_0::Routes::FilterRoutes, Devops::Version2_0::Routes::FlavorRoutes, Devops::Version2_0::Routes::GroupRoutes, Devops::Version2_0::Routes::ImageRoutes, Devops::Version2_0::Routes::KeyRoutes, Devops::Version2_0::Routes::NetworkRoutes, Devops::Version2_0::Routes::ProjectRoutes, Devops::Version2_0::Routes::ScriptRoutes, Devops::Version2_0::Routes::ServerRoutes, Devops::Version2_0::Routes::StatusRoutes, Devops::Version2_0::Routes::TagRoutes, Devops::Version2_0::Routes::DeployRoutes, Devops::Version2_0::Routes::StackTemplateRoutes, Devops::Version2_0::Routes::StackRoutes ] def init config = DevopsConfig.config set :devops_home, config[:devops_dir] #set :config, config set :keys_dir, (config[:keys_dir] || File.join(config[:devops_dir], "files/keys")) set :scripts_dir, (config[:scripts_dir] || File.join(config[:devops_dir], "files/scripts")) [:keys_dir, :scripts_dir].each {|key| d = settings.send(key); FileUtils.mkdir_p(d) unless File.exists?(d) } init_mongo settings.mongo.create_root_user ::Provider::ProviderFactory.init(config) #set_up_providers_keys!(::Provider::ProviderFactory.all, mongo) end def init_mongo set :mongo, Devops::Db.connector end private def set_up_providers_keys!(providers, mongo) providers.each do |provider| next if provider.certificate_path.nil? begin mongo.key provider.ssh_key, Key::SYSTEM rescue RecordNotFound => e k = Key.new({"id" => provider.ssh_key, "path" => provider.certificate_path, "scope" => Key::SYSTEM}) mongo.key_insert k end end end end include Sinatra::JSON helpers Sinatra::Streaming helpers Devops::Version2_0::Helpers register Sinatra::DevopsAuth =begin use Rack::Auth::Basic do |username, password| begin settings.mongo.user_auth(username, password) true rescue RecordNotFound => e false end end =end configure :production do disable :dump_errors disable :show_exceptions set :logging, Logger::INFO puts "TODO2" end configure :development do set :logging, Logger::DEBUG disable :raise_errors # disable :dump_errors set :show_exceptions, :after_handler puts "TODO1" end not_found do "Not found" 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 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 =begin 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 =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 end