203 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| 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/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/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
 | |
|         ]
 | |
| 
 | |
|         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)
 | |
|           Wisper::GlobalListeners.subscribe(TestSubscriber2.new)
 | |
|           Wisper.subscribe(TestSubscriber.new)
 | |
| 
 | |
|         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
 | |
| 
 | |
| =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
 | |
| 
 | |
| =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
 | 
