lib/kumogata/post_processing.rb in kumogata-0.4.0 vs lib/kumogata/post_processing.rb in kumogata-0.4.1

- old
+ new

@@ -109,10 +109,12 @@ validate_command_template(name, ssh['user'], outputs) if options and not options.kind_of?(Hash) raise "Invalid post processing ssh options: #{name} => #{options.inspect}" end + + ssh['request_pty'] = !!((ssh['request_pty'] || true).to_s =~ /\Atrue\Z/) end def run_command(attrs, outputs) command, ssh = attrs.values_at(:command, :ssh) @@ -134,37 +136,46 @@ connect_tries = (ssh['connect_tries'] || 36).to_i retry_interval = (ssh['retry_interval'] || 5).to_i stderr_orig = nil + ssh_exec_opts = {:request_pty => ssh['request_pty']} begin stderr_orig = STDERR.dup STDERR.reopen('/dev/null', 'w') begin retryable(:tries => connect_tries, :on => Net::SSH::Disconnect, :sleep => retry_interval) do - Net::SSH.start(*args) {|ssh| ssh_exec!(ssh, command) } + Net::SSH.start(*args) {|ssh| ssh_exec!(ssh, command, ssh_exec_opts) } end rescue Net::SSH::HostKeyMismatch => e e.remember_host! retry end ensure STDERR.reopen(stderr_orig) end end - def ssh_exec!(ssh, command) + def ssh_exec!(ssh, command, options) stdout_data = '' stderr_data = '' exit_code = nil #exit_signal = nil stdout_stream = create_stdout_stream stderr_stream = create_stderr_stream ssh.open_channel do |channel| + if options[:request_pty] + channel.request_pty do |ch, success| + unless success + raise "Couldn't obtain pty (ssh.channel.request_pty)" + end + end + end + channel.exec(command) do |ch, success| unless success raise "Couldn't execute command #{command.inspect} (ssh.channel.exec)" end