Parent

Included Modules

Class/Module Index [+]

Quicksearch

Backup::Pipeline

Attributes

errors[R]
stderr[R]

Public Class Methods

new() click to toggle source
# File lib/backup/pipeline.rb, line 8
def initialize
  @commands = []
  @errors = []
  @stderr = ''
end

Public Instance Methods

<<(command) click to toggle source

Adds a command to be executed in the pipeline. Each command will be run in the order in which it was added, with it's output being piped to the next command.

# File lib/backup/pipeline.rb, line 18
def <<(command)
  @commands << command
end
error_messages() click to toggle source

Returns a multi-line String, reporting all STDERR messages received from the commands in the pipeline (if any), along with the SystemCallError (Errno) message for each command which had a non-zero exit status.

Each error is wrapped by Backup::Errors to provide formatting.

# File lib/backup/pipeline.rb, line 65
def error_messages
  @error_messages ||= (stderr_messages || '') +
      "The following system errors were returned:\n" +
      @errors.map {|err| Errors::Error.wrap(err).message }.join("\n")
end
run() click to toggle source

Runs the command line from `pipeline` and collects STDOUT/STDERR. STDOUT is then parsed to determine the exit status of each command. For each command with a non-zero exit status, a SystemCallError is created and added to @errors. All STDERR output is set in @stderr.

Note that there is no accumulated STDOUT from the commands themselves. Also, the last command should not attempt to write to STDOUT. Any output on STDOUT from the final command will be sent to STDERR. This in itself will not cause run to fail, but will log warnings when all commands exit with non-zero status.

Use `success?` to determine if all commands in the pipeline succeeded. If `success?` returns `false`, use `error_messages` to get an error report.

# File lib/backup/pipeline.rb, line 36
def run
  Open4.popen4(pipeline) do |pid, stdin, stdout, stderr|
    pipestatus = stdout.read.gsub("\n", '').split(':').sort
    pipestatus.each do |status|
      index, exitstatus = status.split('|').map(&:to_i)
      if exitstatus > 0
        command = command_name(@commands[index])
        @errors << SystemCallError.new(
          "'#{ command }' returned exit code: #{ exitstatus }", exitstatus
        )
      end
    end
    @stderr = stderr.read.strip
  end
  Logger.warn(stderr_messages) if success? && stderr_messages
rescue Exception => e
  raise Errors::Pipeline::ExecutionError.wrap(e)
end
success?() click to toggle source
# File lib/backup/pipeline.rb, line 55
def success?
  @errors.empty?
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.