class Knife::Pkg::ShellCommand

Public Class Methods

exec(cmd, session, password = '') click to toggle source
# File lib/knife-pkg/shell_command.rb, line 21
def self.exec(cmd, session, password = '')

  stdout_data, stderr_data = "", ""
  exit_code, exit_signal = nil, nil
  session.open_channel do |channel|
    channel.request_pty
    channel.exec(cmd) do |_, success|
      raise RuntimeError, "Command \"#{@cmd}\" could not be executed!" if !success
      channel.on_data do |_, data|
        if data =~ /^knife sudo password: /
          Chef::Log.debug("sudo password required, sending password")
          if password.respond_to?(:call)
            channel.send_data(password.call + "\n")
          else
            channel.send_data(password + "\n")
          end
        else
          stdout_data += data
        end
      end

      channel.on_extended_data do |_,_,data|
        stderr_data += data
      end

      channel.on_request("exit-status") do |_,data|
        exit_code = data.read_long
      end

      channel.on_request("exit-signal") do |_, data|
        exit_signal = data.read_long
      end
    end
  end
  session.loop

  result = ShellCommandResult.new(cmd, stdout_data, stderr_data, exit_code.to_i)

  raise_error!(result) unless result.succeeded?

  return result
end
raise_error!(result) click to toggle source
# File lib/knife-pkg/shell_command.rb, line 64
def self.raise_error!(result)
  raise RuntimeError, "Command failed! #{result.to_s}" 
end