module Dopi::Connector::Local

Public Instance Methods

local_command(env, command_string) click to toggle source

The command method executes the command of the step. Returns an array with stdio, sterror and exit code.

# File lib/dopi/connector/local.rb, line 15
def local_command(env, command_string)
  master, slave = PTY.open
  stdout_r, stdout_w = IO.pipe
  stderr_r, stderr_w = IO.pipe
  cmd_stdout = ''
  cmd_stderr = ''
  options = {
    :pgroup          => true,
    :unsetenv_others => true,
    :in              => slave,
    :out             => stdout_w,
    :err             => stderr_w,
  }
  log(:debug, "Executing #{command_string} for command #{name}")
  log(:debug, "Environment: #{env.to_s}")

  pid = Process.spawn(merged_env(env), command_string, options)
  slave.close
  stdout_w.close
  stderr_w.close

  signal_handler = Proc.new do |signal|
    case signal
    when :abort then Process.kill(:TERM, pid)
    when :kill  then Process.kill(:KILL, pid)
    end
  end

  on_signal(signal_handler)
  stdout_thread = Thread.new do
    until ( line = stdout_r.gets ).nil? do
      cmd_stdout << line
      log(:debug, line.gsub("\n", '').gsub("\r", ''))
    end
  end

  stderr_thread = Thread.new do
    until ( line = stderr_r.gets ).nil? do
      cmd_stderr << line
      log(:error, line.gsub("\n", '').gsub("\r", ''))
    end
  end

  _, status = Process.wait2(pid)
  stdout_thread.join
  stderr_thread.join
  delete_on_signal(signal_handler)
  [ cmd_stdout, cmd_stderr, status.exitstatus ]
end

Private Instance Methods

merged_env(env) click to toggle source
# File lib/dopi/connector/local.rb, line 67
def merged_env(env)
  {
    'HOME' => ENV['HOME'],
    'PATH' => '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
  }.merge(env)
end