| 
									
										
										
										
											2015-01-26 15:02:58 +03:00
										 |  |  | require "sinatra/base" | 
					
						
							|  |  |  | require "sinatra/streaming" | 
					
						
							|  |  |  | require "helpers/version_2" | 
					
						
							| 
									
										
										
										
											2015-01-27 13:18:26 +03:00
										 |  |  | 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" | 
					
						
							| 
									
										
										
										
											2015-02-25 16:01:22 +03:00
										 |  |  | require "routes/routes_container" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require "auth/devops_auth" | 
					
						
							| 
									
										
										
										
											2015-01-26 15:02:58 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  | module Devops | 
					
						
							|  |  |  |   module Version2_0 | 
					
						
							| 
									
										
										
										
											2015-01-26 15:02:58 +03:00
										 |  |  |     class Application < Sinatra::Base | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-25 16:01:22 +03:00
										 |  |  |       extend Devops::RoutesContainer | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-26 15:02:58 +03:00
										 |  |  |       class << self | 
					
						
							| 
									
										
										
										
											2015-02-25 16:01:22 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |         @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 | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-06 17:21:13 +03:00
										 |  |  |         def init | 
					
						
							|  |  |  |           config = DevopsConfig.config | 
					
						
							| 
									
										
										
										
											2015-01-26 15:02:58 +03:00
										 |  |  |           set :devops_home, config[:devops_dir] | 
					
						
							| 
									
										
										
										
											2015-02-06 17:21:13 +03:00
										 |  |  |           #set :config, config | 
					
						
							| 
									
										
										
										
											2015-01-26 15:02:58 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |           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 | 
					
						
							| 
									
										
										
										
											2015-02-06 17:21:13 +03:00
										 |  |  |           set :mongo, Devops::Db.connector | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-26 15:02:58 +03:00
										 |  |  |         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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-25 16:01:22 +03:00
										 |  |  | =begin | 
					
						
							| 
									
										
										
										
											2015-01-26 15:02:58 +03:00
										 |  |  |       use Rack::Auth::Basic do |username, password| | 
					
						
							|  |  |  |         begin | 
					
						
							|  |  |  |           settings.mongo.user_auth(username, password) | 
					
						
							|  |  |  |           true | 
					
						
							|  |  |  |         rescue RecordNotFound => e | 
					
						
							|  |  |  |           false | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2015-02-25 16:01:22 +03:00
										 |  |  | =end | 
					
						
							| 
									
										
										
										
											2015-01-26 15:02:58 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |       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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-12 13:30:49 +03:00
										 |  |  | =begin | 
					
						
							|  |  |  |       error ::Excon::Errors::Unauthorized do | 
					
						
							| 
									
										
										
										
											2015-01-26 15:02:58 +03:00
										 |  |  |         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 | 
					
						
							| 
									
										
										
										
											2015-02-12 13:30:49 +03:00
										 |  |  | =end | 
					
						
							| 
									
										
										
										
											2015-01-26 15:02:58 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |       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) | 
					
						
							| 
									
										
										
										
											2014-05-08 15:34:26 +04:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |