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
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
output, status = Puppet::Util::SUIDManager.
run_and_capture(command, resource[:user], resource[:group],
:override_locale => false,
:custom_environment => environment)
end
if status.exitstatus == 127
raise ArgumentError, output
end
end
rescue Errno::ENOENT => detail
self.fail detail.to_s
end
return output, status
end