# class Chef::Provider::File

### Attributes

deployment_strategy[R]

### Public Class Methods

new(new_resource, run_context) click to toggle source
Calls superclass method Chef::Provider.new

    # File lib/chef/provider/file.rb, line 61
    def initialize(new_resource, run_context)
      @content_class ||= Chef::Provider::File::Content
      if new_resource.respond_to?(:atomic_update)
        @deployment_strategy = Chef::FileContentManagement::Deploy.strategy(new_resource.atomic_update)
      end
      super
    end

### Public Instance Methods

action_create() click to toggle source

    # File lib/chef/provider/file.rb, line 118
    def action_create
      do_unlink
      do_create_file
      do_contents_changes
      do_acl_changes
      do_selinux
      load_resource_attributes_from_file(@new_resource)
    end

action_create_if_missing() click to toggle source

    # File lib/chef/provider/file.rb, line 127
    def action_create_if_missing
      if ::File.exists?(@new_resource.path)
        Chef::Log.debug("#{@new_resource} exists at #{@new_resource.path} taking no action.")
      else
        action_create
      end
    end

action_delete() click to toggle source

    # File lib/chef/provider/file.rb, line 135
    def action_delete
      if ::File.exists?(@new_resource.path)
        converge_by("delete file #{@new_resource.path}") do
          do_backup unless file_class.symlink?(@new_resource.path)
          ::File.delete(@new_resource.path)
          Chef::Log.info("#{@new_resource} deleted file at #{@new_resource.path}")
        end
      end
    end

action_touch() click to toggle source

    # File lib/chef/provider/file.rb, line 145
    def action_touch
      action_create
      converge_by("update utime on file #{@new_resource.path}") do
        time = Time.now
        ::File.utime(time, time, @new_resource.path)
        Chef::Log.info("#{@new_resource} updated atime and mtime to #{time}")
      end
    end

define_resource_requirements() click to toggle source

    # File lib/chef/provider/file.rb, line 87
    def define_resource_requirements
      # deep inside FAC we have to assert requirements, so call FACs hook to set that up
      access_controls.define_resource_requirements
      # Make sure the parent directory exists, otherwise fail.  For why-run assume it would have been created.
      requirements.assert(:create, :create_if_missing, :touch) do |a|
        parent_directory = ::File.dirname(@new_resource.path)
        a.assertion { ::File.directory?(parent_directory) }
        a.failure_message(Chef::Exceptions::EnclosingDirectoryDoesNotExist, "Parent directory #{parent_directory} does not exist.")
        a.whyrun("Assuming directory #{parent_directory} would have been created")
      end

      # Make sure the file is deletable if it exists, otherwise fail.
      if ::File.exists?(@new_resource.path)
        requirements.assert(:delete) do |a|
          a.assertion { ::File.writable?(@new_resource.path) }
          a.failure_message(Chef::Exceptions::InsufficientPermissions,"File #{@new_resource.path} exists but is not writable so it cannot be deleted")
        end
      end

      error, reason, whyrun_message = inspect_existing_fs_entry
      requirements.assert(:create) do |a|
        a.assertion { error.nil? }
        a.failure_message(error, reason)
        a.whyrun(whyrun_message)
        # Subsequent attempts to read the fs entry at the path (e.g., for
        # calculating checksums) could blow up, so give up trying to continue
        # why-running.
        a.block_action!
      end
    end

load_current_resource() click to toggle source

    # File lib/chef/provider/file.rb, line 73
    def load_current_resource
      # Let children resources override constructing the @current_resource
      @current_resource ||= Chef::Resource::File.new(@new_resource.name)
      @current_resource.path(@new_resource.path)
      if ::File.exists?(@current_resource.path) && ::File.file?(::File.realpath(@current_resource.path))
        if managing_content?
          Chef::Log.debug("#{@new_resource} checksumming file at #{@new_resource.path}.")
          @current_resource.checksum(checksum(@current_resource.path))
        end
        load_resource_attributes_from_file(@current_resource)
      end
      @current_resource
    end

manage_symlink_access?() click to toggle source

Implementation components should follow symlinks when managing access control (e.g., use chmod instead of lchmod even if the path we’re managing is a symlink).

    # File lib/chef/provider/file.rb, line 157
    def manage_symlink_access?
      false
    end

whyrun_supported?() click to toggle source

    # File lib/chef/provider/file.rb, line 69
    def whyrun_supported?
      true
    end