Class: Puppet::Provider::Exec
- Inherits:
-
Puppet::Provider
- Object
- Puppet::Provider
- Puppet::Provider::Exec
- 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
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
Instance Attribute Summary
Attributes inherited from Puppet::Provider
Attributes included from Util::Docs
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 |