fluke/devops-service/app/api2/handlers/script.rb

99 lines
3.3 KiB
Ruby
Raw Normal View History

2014-12-22 14:22:04 +03:00
require "providers/provider_factory"
require "fileutils"
require "commands/status"
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-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-23 16:56:51 +03:00
def execute_command out, cmd, node_name
user = @request.env['REMOTE_USER']
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-23 16:56:51 +03:00
def run_script out, file_name, nodes, script_params
file = File.join(DevopsConfig.config[:scripts_dir], file_name)
unless File.exists?(file)
out << "File '#{file_name}' does not exist\n"
return
end
2015-02-18 11:08:44 +03:00
servers = ::Devops::Db.connector.servers_by_names(nodes)
2015-07-23 16:56:51 +03:00
if servers.empty?
out << "No servers found for names '#{nodes.join("', '")}'\n"
return
end
user = @request.env['REMOTE_USER']
2014-12-22 14:22:04 +03:00
servers.each do |s|
2015-02-18 11:08:44 +03:00
::Devops::Db.connector.check_project_auth s.project, s.deploy_env, user
2014-12-22 14:22:04 +03:00
end
2015-07-23 16:56:51 +03:00
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
end
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(" ")
end
out << (ssh_cmd % [file_name])
out << "\n"
2014-12-22 14:22:04 +03:00
2015-07-23 16:56:51 +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-23 16:56:51 +03:00
so.close
status.push $?.to_i
2014-12-22 14:22:04 +03:00
end
rescue IOError => e
logger.error e.message
2015-07-23 16:56:51 +03:00
out << e.message
status.push 3
2014-12-22 14:22:04 +03:00
end
end
2015-07-23 16:56:51 +03:00
out << create_status(status)
2014-12-22 14:22:04 +03:00
end
2015-07-23 16:56:51 +03:00
def create_script file_name
file = File.join(settings.scripts_dir, file_name)
raise RecordNotFound.new("File '#{file_name}' already exist") if File.exists?(file)
File.open(file, "w") {|f| f.write(@request.body.read)}
2014-12-22 14:22:04 +03:00
end
2015-07-23 16:56:51 +03:00
def delete_script file_name
file = File.join(settings.scripts_dir, file_nsme)
raise RecordNotFound.new("File '#{file_name}' does not exist", 404) unless File.exists?(file)
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