class Puppet::Provider::Exec

Public Instance Methods

extractexe(command) click to toggle source
# File lib/puppet/provider/exec.rb, line 73
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) click to toggle source
# File lib/puppet/provider/exec.rb, line 7
def run(command, check = false)
  output = nil
  status = nil
  dir = nil

  checkexe(command)

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

  dir ||= Dir.pwd

  debug "Executing#{check ? " check": ""} '#{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}'"
            end
            environment[env_name] = value
          else
            warning "Cannot understand environment setting #{setting.inspect}"
          end
        end
      end


      Timeout::timeout(resource[:timeout]) 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, status = Puppet::Util::SUIDManager.
            run_and_capture(command, resource[:user], resource[:group],
                            :override_locale => false,
                            :custom_environment => environment)
      end
      # The shell returns 127 if the command is missing.
      if status.exitstatus == 127
        raise ArgumentError, output
      end

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

  return output, status
end
validatecmd(command) click to toggle source
# File lib/puppet/provider/exec.rb, line 84
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." if !absolute_path?(exe) and resource[:path].nil?
end