require 'net/ssh' require 'pathname' namespace :create_site do desc "Change Site Server Name" task :change_site_server_name,[:id,:server_name] => :environment do |task,args| begin site_construct = SiteConstruct.find(args.id) site_server = site_construct.site_server if !site_server.nil? @password = site_server.password Net::SSH.start(site_server.ip , site_server.account , password: site_server.password) do |ssh| nginx_file_content = exec_command_by_user(ssh,"cat #{site_construct.nginx_file}") nginx_file_content = nginx_file_content.gsub(/^[ \t]*server_name[ \t]+.*;/," server_name #{args.server_name};") puts nginx_file_content cmd = "x='#{nginx_file_content}'; echo '#{@password}' | sudo -S sh -c \"echo '$x' > #{site_construct.nginx_file}\"" exec_command_by_user(ssh,cmd) exec_ssh_command_by_sudo(ssh,"service nginx restart") end site_construct.update(:domain_name=>args.server_name) end rescue => e puts [e,e.backtrace] end end def exec_command_by_user(session,command) output = session.exec!(command) return output[0...-1].gsub(/^\n[\n]+/,'') end def exec_ssh_command_by_sudo(session,command) output = session.exec!("echo '#{@password}' | sudo -S #{command}") if output.include?("sudo:") && output.include?("command not found") output = session.exec!(command) end return output end end