class Chef::FileContentManagement::Tempfile
Attributes
new_resource[R]
Public Class Methods
new(new_resource)
click to toggle source
# File lib/chef/file_content_management/tempfile.rb, line 27 def initialize(new_resource) @new_resource = new_resource end
Public Instance Methods
tempfile()
click to toggle source
# File lib/chef/file_content_management/tempfile.rb, line 31 def tempfile @tempfile ||= tempfile_open end
Private Instance Methods
tempfile_basename()
click to toggle source
These are important for windows to get permissions right, and may be useful for SELinux
and other ACL approaches. Please use them as the arguments to Tempfile.new()
consistently.
# File lib/chef/file_content_management/tempfile.rb, line 66 def tempfile_basename basename = ::File.basename(@new_resource.path, tempfile_extension) # the leading "[.]chef-" here should be considered a public API and should not be changed basename.insert 0, "chef-" basename.insert 0, "." unless ChefUtils.windows? # dotfile if we're not on windows basename.scrub end
tempfile_dirnames()
click to toggle source
Returns the possible directories for the tempfile to be created in.
# File lib/chef/file_content_management/tempfile.rb, line 83 def tempfile_dirnames # in why-run mode we need to create a Tempfile to compare against, which we will never # wind up deploying, but our enclosing directory for the destdir may not exist yet, so # instead we can reliably always create a Tempfile to compare against in Dir::tmpdir if Chef::Config[:why_run] [ Dir.tmpdir ] else case Chef::Config[:file_staging_uses_destdir] when :auto # In auto mode we try the destination directory first and fallback to ENV['TMP'] if # that doesn't work. [ ::File.dirname(@new_resource.path), Dir.tmpdir ] when true [ ::File.dirname(@new_resource.path) ] when false [ Dir.tmpdir ] else raise Chef::Exceptions::ConfigurationError, "Unknown setting '#{Chef::Config[:file_staging_uses_destdir]}' for Chef::Config[:file_staging_uses_destdir]. Possible values are :auto, true or false." end end end
tempfile_extension()
click to toggle source
this is similar to File.extname() but greedy about the extension (from the first dot, not the last dot)
# File lib/chef/file_content_management/tempfile.rb, line 75 def tempfile_extension # complexity here is due to supporting mangling non-UTF8 strings (e.g. latin-1 filenames with characters that are illegal in UTF-8) b = File.basename(@new_resource.path) i = b.index(".") i.nil? ? "" : b[i..].scrub end
tempfile_open()
click to toggle source
# File lib/chef/file_content_management/tempfile.rb, line 37 def tempfile_open tf = nil errors = [ ] tempfile_dirnames.each do |tempfile_dirname| # preserving the file extension of the target filename should be considered a public API tf = ::Tempfile.open([tempfile_basename, tempfile_extension], tempfile_dirname) break rescue SystemCallError => e message = "Creating temp file under '#{tempfile_dirname}' failed with: '#{e.message}'" Chef::Log.trace(message) errors << message end raise Chef::Exceptions::FileContentStagingError, errors if tf.nil? # We always process the tempfile in binmode so that we # preserve the line endings of the content. tf.binmode tf end