class Paknife::Context

Constants

COLOR_CODES

Attributes

backend[R]
index[R]
knife_options[R]
logger[R]
node[R]
subcommand[R]

Public Class Methods

new(index, backend, subcommand, node, knife_options, options = {}) click to toggle source
# File lib/paknife/context.rb, line 9
def initialize(index, backend, subcommand, node, knife_options, options = {})
  @index = index
  @backend = backend
  @subcommand = subcommand
  @node = node
  @knife_options = knife_options
  @options = options

  setup_logger
end

Public Instance Methods

command() click to toggle source
# File lib/paknife/context.rb, line 45
def command
  [
    @options[:knife],
    backend,
    subcommand,
    node,
    knife_options,
  ].flatten.compact.join(" ")
end
run() click to toggle source
# File lib/paknife/context.rb, line 20
def run
  logger.info command
  Open3.popen3(command) do |stdin, stdout, stderr, wait_thr|
    stdin.close_write

    begin
      loop do
        IO.select([stdout, stderr]).flatten.compact.each do |io|
          io.each do |line|
            next if line.nil? || line.empty?

            if io == stdout
              logger.info line
            elsif io == stderr
              logger.warn line
            end
          end
        end
        break if stdout.eof? && stderr.eof?
      end
    rescue EOFError
    end
  end
end

Private Instance Methods

setup_logger() click to toggle source
# File lib/paknife/context.rb, line 59
def setup_logger
  color = COLOR_CODES[index % COLOR_CODES.length]
  colored_node = Term::ANSIColor.color(color, node)

  @logger = Logger.new(STDOUT)
  @logger.formatter = proc { |severity, datetime, progname, msg| "[#{colored_node}] #{msg.chomp}\n" }
  @logger.level =
    if @options[:log_level]
      Logger.const_get(@options[:log_level].upcase)
    else
      Logger::INFO
    end
end