class Vana::Element::Shell

shell element

Public Instance Methods

action(host, *_args) click to toggle source
# File lib/vana/element/shell.rb, line 24
def action(host, *_args)
  if host == 'localhost'
    stdout, stderr, status = Open3.capture3(@opts[:cmd])
    {
      cmd: @opts[:cmd],
      stdout: stdout,
      stderr: stderr,
      success: status.success?,
      status: status.exitstatus,
      pid: status.pid
    }
  else
    Net::SSH.start(host) do |ssh|
      output = {
        cmd: @opts[:cmd],
        stdout: '',
        stderr: ''
      }

      ssh.open_channel do |channel|
        channel.exec(@opts[:cmd]) do |_ch, _success|
          # stdout
          channel.on_data { |_ch, data| output[:stdout] << data }

          # stderr
          channel.on_extended_data { |_ch, data| output[:stderr] << data }

          # exit status
          channel.on_request('exit-status') do |_ch, data|
            output[:status] = data.read_long
            output[:success] = output[:status].zero?
          end
        end
      end

      ssh.loop

      output
    end
  end
end
cmd=(cmd) click to toggle source
# File lib/vana/element/shell.rb, line 20
def cmd=(cmd)
  @opts[:cmd] = cmd
end
setup(*args) click to toggle source
# File lib/vana/element/shell.rb, line 15
def setup(*args)
  @opts[:cmd] ||= args.first
  @element_opts[:name] ||= @opts[:cmd]
end