Module: RightScale::RightPopen::Utilities

Defined in:
lib/right_popen/linux/utilities.rb

Constant Summary collapse

SIGNAL_LOOKUP =
Signal.list.invert

Class Method Summary collapse

Class Method Details

.reason(status) ⇒ Object



34
35
36
37
38
39
40
# File 'lib/right_popen/linux/utilities.rb', line 34

def reason(status)
  if status.exitstatus
    "with exit status #{status.exitstatus}"
  else
    "due to SIG#{SIGNAL_LOOKUP[status.termsig]}"
  end
end

.run(cmd, parameters = {}) ⇒ Object



43
44
45
46
47
48
49
50
# File 'lib/right_popen/linux/utilities.rb', line 43

def run(cmd, parameters={})
  status, out, err = run_collecting_output(cmd, parameters)
  unless status.success?
    raise "Command \"#{cmd}\" failed #{reason(status)}: " +
      "stdout #{out}, stderr #{err}"
  end
  [out, err]
end

.run_collecting_output(cmd, parameters = {}) ⇒ Object Also known as: spawn



70
71
72
73
74
75
76
# File 'lib/right_popen/linux/utilities.rb', line 70

def run_collecting_output(cmd, parameters={})
  out = StringIO.new
  err = StringIO.new
  status = run_with_blocks(cmd, nil, Proc.new {|s| out.write(s)},
                           Proc.new {|s| err.write(s)})
  [status, out.string, err.string]
end

.run_with_blocks(cmd, stdin_block, stdout_block, stderr_block, parameters = {}) ⇒ Object



79
80
81
82
83
84
85
86
87
88
# File 'lib/right_popen/linux/utilities.rb', line 79

def run_with_blocks(cmd, stdin_block, stdout_block, stderr_block, parameters={})
  process = Process.new(parameters)
  process.fork(cmd)
  process.wait_for_exec
  a = Accumulator.new(process,
                      [process.stdout, process.stderr], [stdout_block, stderr_block],
                      [process.stdin], [stdin_block])
  a.run_to_completion
  process.status[1]
end

.run_with_stdin_collecting_output(cmd, input, parameters = {}) ⇒ Object Also known as: run_input



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/right_popen/linux/utilities.rb', line 52

def run_with_stdin_collecting_output(cmd, input, parameters={})
  out = StringIO.new
  err = StringIO.new
  first = true
  status = run_with_blocks(cmd,
                           Proc.new {
                             if (first)
                               first = false
                               input
                             else
                               nil
                             end},
                           Proc.new {|s| out.write(s)},
                           Proc.new {|s| err.write(s)})
  [status, out.string, err.string]
end