fluke/devops-service/devops-service.rb

192 lines
4.4 KiB
Ruby
Raw Normal View History

2014-05-08 15:34:26 +04:00
#!/usr/bin/env ruby
require "rubygems"
require "sinatra/base"
require "sinatra/streaming"
require "fileutils"
2014-12-22 14:22:04 +03:00
require "wisper"
2014-05-08 15:34:26 +04:00
$:.push File.dirname(__FILE__)
require "db/exceptions/invalid_record"
require "db/exceptions/record_not_found"
2014-12-22 14:22:04 +03:00
require "exceptions/dependency_error"
2014-11-26 16:59:46 +03:00
require "db/validators/all"
2014-11-26 18:46:04 +03:00
require "db/mongo/mongo_connector"
2014-05-08 15:34:26 +04:00
require "providers/provider_factory"
2014-12-22 14:22:04 +03:00
require "loader"
2014-05-08 15:34:26 +04:00
require "routes/v2.0"
2014-12-12 17:00:06 +03:00
require "helpers/version_2"
2014-12-22 14:22:04 +03:00
require "test_subscriber"
require "test_subscriber_2"
2014-05-08 15:34:26 +04:00
class DevopsService < Sinatra::Base
helpers Sinatra::Streaming
2014-12-15 14:26:54 +03:00
2014-12-22 14:22:04 +03:00
include Wisper::Publisher
helpers Devops::Version2_0::Helpers
include Devops::Loader
register Devops::Version2_0::Routes
2014-05-08 15:34:26 +04:00
def initialize config
super()
2014-12-15 14:26:54 +03:00
puts "Devops home: #{config[:devops_dir]}"
unless File.exists?(config[:devops_dir])
FileUtils.mkdir_p config[:devops_dir]
puts "Directory '#{config[:devops_dir]}' has been created"
end
self.class.set :devops_home, config[:devops_dir]
2014-12-12 17:00:06 +03:00
self.class.set :config, config
2014-05-08 15:34:26 +04:00
@@config = config
root = File.dirname(__FILE__)
@@config[:keys_dir] = File.join(root, "../.devops_files/keys")
if @@config[:scripts_dir].nil?
#default scripts dir
@@config[:scripts_dir] = File.join(root, "../.devops_files/scripts")
end
[:keys_dir, :scripts_dir].each {|key| d = @@config[key]; FileUtils.mkdir_p(d) unless File.exists?(d) }
mongo = DevopsService.mongo
2014-12-12 17:00:06 +03:00
self.class.set :mongo, mongo
2014-05-08 15:34:26 +04:00
mongo.create_root_user
2014-11-20 15:08:42 +03:00
::Provider::ProviderFactory.init(config)
2014-12-12 17:00:06 +03:00
#set_up_providers_keys!(::Provider::ProviderFactory.all, mongo)
2014-12-22 14:22:04 +03:00
Wisper::GlobalListeners.subscribe(TestSubscriber2.new)
Wisper.subscribe(TestSubscriber.new)
2014-05-08 15:34:26 +04:00
end
@@mongo
# Returns mongo connector
def self.mongo
@@mongo ||= MongoConnector.new(@@config[:mongo_db], @@config[:mongo_host], @@config[:mongo_port], @@config[:mongo_user], @@config[:mongo_password])
end
# Returns config hash
def self.config
@@config
end
use Rack::Auth::Basic do |username, password|
begin
2014-12-15 14:26:54 +03:00
settings.mongo.user_auth(username, password)
2014-05-08 15:34:26 +04:00
true
rescue RecordNotFound => e
false
end
end
2014-12-22 14:22:04 +03:00
def self.create_method name, &block
send(:generate_method, name, &block)
end
2014-12-12 17:00:06 +03:00
include Sinatra::JSON
configure :production do
disable :dump_errors
disable :show_exceptions
set :logging, Logger::INFO
2014-12-15 14:26:54 +03:00
puts "TODO2"
2014-12-12 17:00:06 +03:00
end
configure :development do
set :logging, Logger::DEBUG
disable :raise_errors
# disable :dump_errors
set :show_exceptions, :after_handler
2014-12-15 14:26:54 +03:00
puts "TODO1"
2014-12-12 17:00:06 +03:00
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::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
# def self.mongo
# DevopsService.mongo
# end
# use ::Version2_0::V2_0
2014-05-08 15:34:26 +04:00
2014-11-21 14:45:52 +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
2014-11-26 15:45:33 +03:00
k = Key.new({"id" => provider.ssh_key, "path" => provider.certificate_path, "scope" => Key::SYSTEM})
mongo.key_insert k
2014-11-21 14:45:52 +03:00
end
end
end
2014-05-08 15:34:26 +04:00
end
2014-12-22 14:22:04 +03:00
require "wisper_fix"