class Chef::Provider::Execute

Public Instance Methods

action_run() click to toggle source
# File lib/chef/provider/execute.rb, line 50
def action_run
  if creates && sentinel_file.exist?
    logger.debug("#{new_resource} sentinel file #{sentinel_file} exists - nothing to do")
    return false
  end

  converge_by("execute #{description}") do
    begin
      shell_out!(command, opts)
    rescue Mixlib::ShellOut::ShellCommandFailed
      if sensitive?
        ex = Mixlib::ShellOut::ShellCommandFailed.new("Command execution failed. STDOUT/STDERR suppressed for sensitive resource")
        # Forcibly hide the exception cause chain here so we don't log the unredacted version
        def ex.cause
          nil
        end
        raise ex
      else
        raise
      end
    end
    logger.info("#{new_resource} ran successfully")
  end
end
define_resource_requirements() click to toggle source
# File lib/chef/provider/execute.rb, line 37
def define_resource_requirements
  if creates && creates_relative? && !cwd
    # FIXME? move this onto the resource?
    raise Chef::Exceptions::Execute, "Please either specify a full path for the creates property, or specify a cwd property to the #{new_resource} resource"
  end
end
load_current_resource() click to toggle source
# File lib/chef/provider/execute.rb, line 32
def load_current_resource
  current_resource = Chef::Resource::Execute.new(new_resource.name)
  current_resource
end
timeout() click to toggle source
# File lib/chef/provider/execute.rb, line 44
def timeout
  # original implementation did not specify a timeout, but ShellOut
  # *always* times out. So, set a very long default timeout
  new_resource.timeout || 3600
end

Private Instance Methods

creates_relative?() click to toggle source
# File lib/chef/provider/execute.rb, line 118
def creates_relative?
  Pathname(creates).relative?
end
description() click to toggle source
# File lib/chef/provider/execute.rb, line 114
def description
  sensitive? ? "sensitive resource" : command
end
live_stream?() click to toggle source
# File lib/chef/provider/execute.rb, line 81
def live_stream?
  Chef::Config[:stream_execute_output] || !!new_resource.live_stream
end
opts() click to toggle source
# File lib/chef/provider/execute.rb, line 89
def opts
  opts = {}
  opts[:timeout]     = timeout
  opts[:returns]     = returns if returns
  opts[:environment] = environment if environment
  opts[:user]        = user if user
  opts[:domain]      = domain if domain
  opts[:password]    = password if password
  opts[:group]       = group if group
  opts[:cwd]         = cwd if cwd
  opts[:umask]       = umask if umask
  opts[:default_env] = default_env
  opts[:log_level]   = :info
  opts[:log_tag]     = new_resource.to_s
  if (logger.info? || live_stream?) && !sensitive?
    if run_context.events.formatter?
      opts[:live_stream] = Chef::EventDispatch::EventsOutputStream.new(run_context.events, name: :execute)
    elsif stream_to_stdout?
      opts[:live_stream] = STDOUT
    end
  end
  opts[:elevated] = elevated if elevated
  opts
end
sensitive?() click to toggle source
# File lib/chef/provider/execute.rb, line 77
def sensitive?
  !!new_resource.sensitive
end
sentinel_file() click to toggle source
# File lib/chef/provider/execute.rb, line 122
def sentinel_file
  Pathname.new(Chef::Util::PathHelper.cleanpath(
     ( cwd && creates_relative? ) ? ::File.join(cwd, creates) : creates
  ))
end
stream_to_stdout?() click to toggle source
# File lib/chef/provider/execute.rb, line 85
def stream_to_stdout?
  STDOUT.tty? && !Chef::Config[:daemon]
end