lib/pec2/pssh.rb in pec2-0.6.1 vs lib/pec2/pssh.rb in pec2-0.6.2

- old
+ new

@@ -32,39 +32,52 @@ @logger = Logger.new(STDOUT) end def exec_pssh_command(command) return false if command.nil? || command.empty? - error_servers = [] - Parallel.each(@servers, in_threads: @parallel) do |server| - begin - Net::SSH.start(server[:host], @user, @ssh_options) do |ssh| - channel = ssh.open_channel do |channel, success| - channel.on_data do |channel, data| - if data =~ /^\[sudo\] password for / - channel.send_data "#{@sudo_password}\n" - else - data.to_s.lines.each do |line| - if @print - print %Q{#{server[:host]}:#{line}}.colorize(server[:color]) - end + exit_status = {} + Parallel.map(@servers, in_threads: @parallel) do |server| + exit_status[server[:host]] = exec_ssh(server, command) + end + errors = exit_status.select {|k, v| v != 0 } + if errors.size > 0 + @logger.error "error servers => #{errors.keys.join(', ')}".colorize(:red) + return false + end + return true + end + + private + + def exec_ssh(server, command) + exit_code = nil + begin + Net::SSH.start(server[:host], @user, @ssh_options) do |ssh| + channel = ssh.open_channel do |channel, success| + channel.on_data do |channel, data| + if data =~ /^\[sudo\] password for / + channel.send_data "#{@sudo_password}\n" + else + data.to_s.lines.each do |line| + if @print + print %Q{#{server[:host]}:#{line}}.colorize(server[:color]) end end end - channel.request_pty - channel.exec(command) - channel.wait end + channel.request_pty + channel.exec(command) do |ch, success| + channel.on_request("exit-status") do |ch,data| + exit_code = data.read_long + end + end channel.wait end - rescue => e - error_servers << server[:host] - puts "\n#{e.message}\n#{e.backtrace.join("\n")}" + channel.wait end + rescue => e + puts "\n#{e.message}\n#{e.backtrace.join("\n")}" end - if error_servers.size > 0 - @logger.error "error servers => #{error_servers.join(', ')}".colorize(:red) - end - return true + return exit_code end end end