| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  | require "providers/provider_factory" | 
					
						
							|  |  |  | require "fileutils" | 
					
						
							|  |  |  | require "commands/status" | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  | require "app/api2/parsers/script" | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  | require_relative "request_handler" | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | module Devops | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |   module API2_0 | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |     module Handler | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |       class Script < RequestHandler | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |         set_parser Devops::API2_0::Parser::ScriptParser | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |         def scripts | 
					
						
							|  |  |  |           res = [] | 
					
						
							|  |  |  |           Dir.foreach(DevopsConfig.config[:scripts_dir]) {|f| res.push(f) unless f.start_with?(".")} | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |         def execute_command out, node_name | 
					
						
							|  |  |  |           cmd = parse.execute_command | 
					
						
							|  |  |  |           user = parser.current_user | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |           s = ::Devops::Db.connector.server_by_chef_node_name node_name | 
					
						
							|  |  |  |           ::Devops::Db.connector.check_project_auth s.project, s.deploy_env, user | 
					
						
							|  |  |  |           cert = ::Devops::Db.connector.key s.key | 
					
						
							|  |  |  |           addr = "#{s.remote_user}@#{s.public_ip || s.private_ip}" | 
					
						
							|  |  |  |           ssh_cmd = "ssh -i %s #{addr} '#{cmd}'" | 
					
						
							|  |  |  |           out << ssh_cmd % File.basename(cert.path) | 
					
						
							|  |  |  |           out << "\n" | 
					
						
							|  |  |  |           IO.popen((ssh_cmd % cert.path) + " 2>&1") do |so| | 
					
						
							|  |  |  |             while line = so.gets do | 
					
						
							|  |  |  |               out << line | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |             end | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |           end | 
					
						
							|  |  |  |           out << "\nDone" | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |         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 '#{file_name}' does not exist\n" | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |           servers = ::Devops::Db.connector.servers_by_names(nodes) | 
					
						
							|  |  |  |           if servers.empty? | 
					
						
							|  |  |  |             out << "No servers found for names '#{nodes.join("', '")}'\n" | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |           user = @request.env['REMOTE_USER'] | 
					
						
							|  |  |  |           servers.each do |s| | 
					
						
							|  |  |  |             ::Devops::Db.connector.check_project_auth s.project, s.deploy_env, user | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |           status = [] | 
					
						
							|  |  |  |           servers.each do |s| | 
					
						
							|  |  |  |             cert = begin | 
					
						
							|  |  |  |               ::Devops::Db.connector.key s.key | 
					
						
							|  |  |  |             rescue | 
					
						
							|  |  |  |               out << "No key found for '#{s.chef_node_name}'" | 
					
						
							|  |  |  |               status.push 2
 | 
					
						
							|  |  |  |               next | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |             end | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |             ssh_cmd = "ssh -i #{cert.path} #{s.remote_user}@#{s.public_ip || s.private_ip} 'bash -s' < %s" | 
					
						
							|  |  |  |             out << "\nRun script on '#{s.chef_node_name}'\n" | 
					
						
							|  |  |  |             unless script_params.nil? | 
					
						
							|  |  |  |               ssh_cmd += " " + script_params.join(" ") | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |             end | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |             out << (ssh_cmd % [file_name]) | 
					
						
							|  |  |  |             out << "\n" | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |             begin | 
					
						
							|  |  |  |               IO.popen( (ssh_cmd % [file]) + " 2>&1") do |so| | 
					
						
							|  |  |  |                 while line = so.gets do | 
					
						
							|  |  |  |                   out << line | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |                 end | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |                 so.close | 
					
						
							|  |  |  |                 status.push $?.to_i | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |               end | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |             rescue IOError => e | 
					
						
							|  |  |  |               logger.error e.message | 
					
						
							|  |  |  |               out << e.message | 
					
						
							|  |  |  |               status.push 3
 | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |             end | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |           end | 
					
						
							|  |  |  |           status | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |         def create_script file_name | 
					
						
							| 
									
										
										
										
											2015-07-27 18:27:52 +03:00
										 |  |  |           file = File.join(Devops::Api2.settings.scripts_dir, file_name) | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |           raise RecordNotFound.new("File '#{file_name}' already exist") if File.exists?(file) | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |           File.open(file, "w") {|f| f.write(parser.create_script)} | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |         def delete_script file_name | 
					
						
							| 
									
										
										
										
											2015-07-27 18:27:52 +03:00
										 |  |  |           file = File.join(Devops::Api2.settings.scripts_dir, file_name) | 
					
						
							| 
									
										
										
										
											2015-07-30 15:37:43 +03:00
										 |  |  |           raise RecordNotFound.new("File '#{file_name}' does not exist") unless File.exists?(file) | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  |           FileUtils.rm(file) | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2015-07-23 16:56:51 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-22 14:22:04 +03:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 |