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
 | |
| 
 | 
