84 lines
2.9 KiB
Ruby
84 lines
2.9 KiB
Ruby
require "fileutils"
|
|
require "commands/status"
|
|
require "app/api3/parsers/script"
|
|
require "lib/ssh/ssh_utils"
|
|
require_relative "request_handler"
|
|
|
|
module Devops
|
|
module API3
|
|
module Handler
|
|
class Script < RequestHandler
|
|
|
|
set_parser Devops::API3::Parser::ScriptParser
|
|
|
|
def scripts
|
|
res = []
|
|
Dir.foreach(DevopsConfig.config[:scripts_dir]) {|f| res.push(f) unless f.start_with?(".")}
|
|
end
|
|
|
|
def execute_command out, server_id
|
|
cmd = parse.body
|
|
s = begin
|
|
Devops::Model::Server.find(server_id)
|
|
rescue Mongoid::Errors::DocumentNotFound
|
|
raise Devops::Exception::RecordNotFound.new("Server '#{id}' not found")
|
|
end
|
|
Devops::Model::Project.check_user_authorization(s.project, s.environment, parser.current_user)
|
|
cert = begin
|
|
Devops::Model::Key.find(s.ssh_key)
|
|
rescue Mongoid::Errors::DocumentNotFound
|
|
raise Devops::Exception::RecordNotFound.new("SSH key '#{s.ssh_key}' not found")
|
|
end
|
|
Devops::SSH::Utils.run_command_out(cmd, s.public_ip || s.private_ip, s.remote_user, cert.path, out)
|
|
end
|
|
|
|
def run_script out, script_name
|
|
nodes, script_params = parser.run_script
|
|
file = File.join(DevopsConfig.config[:scripts_dir], script_name)
|
|
unless File.exists?(file)
|
|
out << "File '#{script_name}' does not exist\n"
|
|
return
|
|
end
|
|
servers = ::Devops::Model::Server.where('id.in' => nodes)
|
|
if servers.empty?
|
|
out << "No servers found for ids '#{nodes.join("', '")}'\n"
|
|
return
|
|
end
|
|
user = parser.current_user
|
|
servers.each do |s|
|
|
Devops::Model::Project.check_user_authorization(s.project, s.environment, user)
|
|
end
|
|
status = []
|
|
servers.each do |s|
|
|
cert = begin
|
|
Devops::Model::Key.find(s.ssh_key)
|
|
rescue Mongoid::Errors::DocumentNotFound
|
|
out.puts "No SSH key found for '#{s.id}'"
|
|
out.flush
|
|
status.push 2
|
|
next
|
|
end
|
|
out.puts "\nRun script on '#{s.id}'"
|
|
status.push(Devops::SSH::Utils.run_script(file, s.public_ip || s.private_ip, s.remote_user, cert.path, out))
|
|
end
|
|
status
|
|
end
|
|
|
|
def create_script file_name
|
|
file = File.join(DevopsConfig.config[:scripts_dir], file_name)
|
|
raise Devops::Exception::ConflictError.new("File '#{file_name}' already exist") if File.exists?(file)
|
|
File.open(file, "w") {|f| f.write(parser.body)}
|
|
end
|
|
|
|
def delete_script file_name
|
|
file = File.join(DevopsConfig.config[:scripts_dir], file_name)
|
|
raise Devops::Exception::RecordNotFound.new("File '#{file_name}' does not exist") unless File.exists?(file)
|
|
FileUtils.rm(file)
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|