Class: Puppet::Provider::Exec

Inherits:
Puppet::Provider show all
Includes:
Util::Execution
Defined in:
lib/puppet/provider/exec.rb

Constant Summary

Constants included from Util::Execution

Util::Execution::NoOptionsSpecified

Constants inherited from Puppet::Provider

Confine

Constants included from Util::Logging

Util::Logging::FILE_AND_LINE, Util::Logging::FILE_NO_LINE, Util::Logging::MM, Util::Logging::NO_FILE_LINE, Util::Logging::SUPPRESS_FILE_LINE

Constants included from Util

Util::AbsolutePathPosix, Util::AbsolutePathWindows, Util::DEFAULT_POSIX_MODE, Util::DEFAULT_WINDOWS_MODE

Constants included from Util::POSIX

Util::POSIX::LOCALE_ENV_VARS, Util::POSIX::USER_ENV_VARS

Constants included from Util::SymbolicFileMode

Util::SymbolicFileMode::SetGIDBit, Util::SymbolicFileMode::SetUIDBit, Util::SymbolicFileMode::StickyBit, Util::SymbolicFileMode::SymbolicMode, Util::SymbolicFileMode::SymbolicSpecialToBit

Constants included from Util::Docs

Util::Docs::HEADER_LEVELS

Instance Attribute Summary

Attributes inherited from Puppet::Provider

#resource

Attributes included from Util::Docs

#doc, #nodoc

Instance Method Summary collapse

Methods included from Util::Execution

execfail, execpipe, execute, ruby_path

Methods inherited from Puppet::Provider

#<=>, #clear, #command, command, commands, declared_feature?, default?, default_match, defaultfor, execfail, #execfail, execpipe, #execpipe, execute, #execute, fact_match, feature_match, #flush, #get, has_command, #initialize, initvars, #inspect, instances, mk_resource_methods, #name, optional_commands, post_resource_eval, prefetch, #set, specificity, supports_parameter?, #to_s

Methods included from Util::Logging

#clear_deprecation_warnings, #debug, #deprecation_warning, #format_exception, #get_deprecation_offender, #log_and_raise, #log_deprecations_to_file, #log_exception, #puppet_deprecation_warning, #send_log, setup_facter_logging!, #warn_once

Methods included from Util

absolute_path?, benchmark, chuser, clear_environment, default_env, deterministic_rand, deterministic_rand_int, exit_on_fail, get_env, get_environment, logmethods, merge_environment, path_to_uri, pretty_backtrace, replace_file, safe_posix_fork, set_env, symbolizehash, thinmark, uri_encode, uri_query_encode, uri_to_path, which, withenv, withumask

Methods included from Util::POSIX

#get_posix_field, #gid, #idfield, #methodbyid, #methodbyname, #search_posix_field, #uid

Methods included from Util::SymbolicFileMode

#normalize_symbolic_mode, #symbolic_mode_to_int, #valid_symbolic_mode?

Methods included from Util::Docs

#desc, #dochook, #doctable, #markdown_definitionlist, #markdown_header, #nodoc?, #pad, scrub

Methods included from Util::Warnings

clear_warnings, debug_once, notice_once, warnonce

Methods included from Confiner

#confine, #confine_collection, #suitable?

Methods included from Util::Errors

#adderrorcontext, #devfail, #error_context, #exceptwrap, #fail

Constructor Details

This class inherits a constructor from Puppet::Provider

Instance Method Details

#extractexe(command) ⇒ Object



82
83
84
85
86
87
88
89
90
91
# File 'lib/puppet/provider/exec.rb', line 82

def extractexe(command)
  if command.is_a? Array
    command.first
  elsif match = /^"([^"]+)"|^'([^']+)'/.match(command)
    # extract whichever of the two sides matched the content.
    match[1] or match[2]
  else
    command.split(/ /)[0]
  end
end

#run(command, check = false) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/puppet/provider/exec.rb', line 7

def run(command, check = false)
  output = nil
  status = nil
  dir = nil
  sensitive = resource.parameters[:command].sensitive

  checkexe(command)

  if dir = resource[:cwd]
    unless File.directory?(dir)
      if check
        dir = nil
      else
        self.fail _("Working directory '%{dir}' does not exist") % { dir: dir }
      end
    end
  end

  dir ||= Dir.pwd

  debug "Executing#{check ? " check": ""} '#{sensitive ? '[redacted]' : command}'"
  begin
    # Do our chdir
    Dir.chdir(dir) do
      environment = {}

      environment[:PATH] = resource[:path].join(File::PATH_SEPARATOR) if resource[:path]

      if envlist = resource[:environment]
        envlist = [envlist] unless envlist.is_a? Array
        envlist.each do |setting|
          if setting =~ /^(\w+)=((.|\n)+)$/
            env_name = $1
            value = $2
            if environment.include?(env_name) || environment.include?(env_name.to_sym)
              warning _("Overriding environment setting '%{env_name}' with '%{value}'") % { env_name: env_name, value: value }
            end
            environment[env_name] = value
          else
            warning _("Cannot understand environment setting %{setting}") % { setting: setting.inspect }
          end
        end
      end

      # Ruby 2.1 and later interrupt execution in a way that bypasses error
      # handling by default. Passing Timeout::Error causes an exception to be
      # raised that can be rescued inside of the block by cleanup routines.
      #
      # This is backwards compatible all the way to Ruby 1.8.7.
      Timeout::timeout(resource[:timeout], Timeout::Error) do
        # note that we are passing "false" for the "override_locale" parameter, which ensures that the user's
        # default/system locale will be respected.  Callers may override this behavior by setting locale-related
        # environment variables (LANG, LC_ALL, etc.) in their 'environment' configuration.
        output = Puppet::Util::Execution.execute(command, :failonfail => false, :combine => true,
                                :uid => resource[:user], :gid => resource[:group],
                                :override_locale => false,
                                :custom_environment => environment,
                                :sensitive => sensitive)
      end
      # The shell returns 127 if the command is missing.
      if output.exitstatus == 127
        raise ArgumentError, output
      end

    end
  rescue Errno::ENOENT => detail
    self.fail Puppet::Error, detail.to_s, detail
  end

  # Return output twice as processstatus was returned before, but only exitstatus was ever called.
  # Output has the exitstatus on it so it is returned instead. This is here twice as changing this
  #  would result in a change to the underlying API.
  return output, output
end

#validatecmd(command) ⇒ Object



93
94
95
96
97
# File 'lib/puppet/provider/exec.rb', line 93

def validatecmd(command)
  exe = extractexe(command)
  # if we're not fully qualified, require a path
  self.fail _("'%{command}' is not qualified and no path was specified. Please qualify the command or specify a path.") % { command: command } if !absolute_path?(exe) and resource[:path].nil?
end