lib/chef/provisioning/transport.rb in chef-provisioning-2.0.1 vs lib/chef/provisioning/transport.rb in chef-provisioning-2.0.2

- old
+ new

@@ -1,100 +1,100 @@ -require 'timeout' - -class Chef -module Provisioning - class Transport - DEFAULT_TIMEOUT = 15*60 - - # Execute a program on the remote host. - # - # == Arguments - # command: command to run. May be a shell-escaped string or a pre-split - # array containing [PROGRAM, ARG1, ARG2, ...]. - # options: hash of options, including but not limited to: - # :timeout => NUM_SECONDS - time to wait before program finishes - # (throws an exception otherwise). Set to nil or 0 to - # run with no timeout. Defaults to 15 minutes. - # :stream => BOOLEAN - true to stream stdout and stderr to the console. - # :stream => BLOCK - block to stream stdout and stderr to - # (block.call(stdout_chunk, stderr_chunk)) - # :stream_stdout => FD - FD to stream stdout to (defaults to IO.stdout) - # :stream_stderr => FD - FD to stream stderr to (defaults to IO.stderr) - # :read_only => BOOLEAN - true if command is guaranteed not to - # change system state (useful for Docker) - def execute(command, options = {}) - raise "execute not overridden on #{self.class}" - end - - # TODO: make exceptions for these instead of just returning nil / silently failing - def read_file(path) - raise "read_file not overridden on #{self.class}" - end - - def write_file(path, content) - raise "write_file not overridden on #{self.class}" - end - - def download_file(path, local_path) - IO.write(local_path, read_file(path)) - end - - def upload_file(local_path, path) - write_file(path, IO.read(local_path)) - end - - def make_url_available_to_remote(local_url) - raise "make_url_available_to_remote not overridden on #{self.class}" - end - - def disconnect - raise "disconnect not overridden on #{self.class}" - end - - def available? - raise "available? not overridden on #{self.class}" - end - - # Config hash, including :log_level and :logger as keys - def config - raise "config not overridden on #{self.class}" - end - - protected - - # Helper to implement stdout/stderr streaming in execute - def stream_chunk(options, stdout_chunk, stderr_chunk) - if options[:stream].is_a?(Proc) - options[:stream].call(stdout_chunk, stderr_chunk) - else - if stdout_chunk - if options.has_key?(:stream_stdout) - stream = options[:stream_stdout] - elsif options[:stream] || config[:log_level] == :debug - stream = config[:stdout] || STDOUT - end - - stream.print stdout_chunk if stream - end - - if stderr_chunk - if options.has_key?(:stream_stderr) - stream = options[:stream_stderr] - elsif options[:stream] || config[:log_level] == :debug - stream = config[:stderr] || STDERR - end - - stream.print stderr_chunk if stream - end - end - end - - def with_execute_timeout(options, &block) - Timeout::timeout(execute_timeout(options), &block) - end - - def execute_timeout(options) - options.has_key?(:timeout) ? options[:timeout] : DEFAULT_TIMEOUT - end - end -end -end +require 'timeout' + +class Chef +module Provisioning + class Transport + DEFAULT_TIMEOUT = 15*60 + + # Execute a program on the remote host. + # + # == Arguments + # command: command to run. May be a shell-escaped string or a pre-split + # array containing [PROGRAM, ARG1, ARG2, ...]. + # options: hash of options, including but not limited to: + # :timeout => NUM_SECONDS - time to wait before program finishes + # (throws an exception otherwise). Set to nil or 0 to + # run with no timeout. Defaults to 15 minutes. + # :stream => BOOLEAN - true to stream stdout and stderr to the console. + # :stream => BLOCK - block to stream stdout and stderr to + # (block.call(stdout_chunk, stderr_chunk)) + # :stream_stdout => FD - FD to stream stdout to (defaults to IO.stdout) + # :stream_stderr => FD - FD to stream stderr to (defaults to IO.stderr) + # :read_only => BOOLEAN - true if command is guaranteed not to + # change system state (useful for Docker) + def execute(command, options = {}) + raise "execute not overridden on #{self.class}" + end + + # TODO: make exceptions for these instead of just returning nil / silently failing + def read_file(path) + raise "read_file not overridden on #{self.class}" + end + + def write_file(path, content) + raise "write_file not overridden on #{self.class}" + end + + def download_file(path, local_path) + IO.write(local_path, read_file(path)) + end + + def upload_file(local_path, path) + write_file(path, IO.read(local_path)) + end + + def make_url_available_to_remote(local_url) + raise "make_url_available_to_remote not overridden on #{self.class}" + end + + def disconnect + raise "disconnect not overridden on #{self.class}" + end + + def available? + raise "available? not overridden on #{self.class}" + end + + # Config hash, including :log_level and :logger as keys + def config + raise "config not overridden on #{self.class}" + end + + protected + + # Helper to implement stdout/stderr streaming in execute + def stream_chunk(options, stdout_chunk, stderr_chunk) + if options[:stream].is_a?(Proc) + options[:stream].call(stdout_chunk, stderr_chunk) + else + if stdout_chunk + if options.has_key?(:stream_stdout) + stream = options[:stream_stdout] + elsif options[:stream] || config[:log_level] == :debug + stream = config[:stdout] || STDOUT + end + + stream.print stdout_chunk if stream + end + + if stderr_chunk + if options.has_key?(:stream_stderr) + stream = options[:stream_stderr] + elsif options[:stream] || config[:log_level] == :debug + stream = config[:stderr] || STDERR + end + + stream.print stderr_chunk if stream + end + end + end + + def with_execute_timeout(options, &block) + Timeout::timeout(execute_timeout(options), &block) + end + + def execute_timeout(options) + options.has_key?(:timeout) ? options[:timeout] : DEFAULT_TIMEOUT + end + end +end +end