# module Chef::FileAccessControl::Unix

### Constants

UID_MAX
UINT

### Public Instance Methods

current_gid() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 103
    def current_gid
      gid_from_resource(current_resource)
    end

current_mode() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 171
    def current_mode
      mode_from_resource(current_resource)
    end

current_uid() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 63
    def current_uid
      uid_from_resource(current_resource)
    end

define_resource_requirements() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 46
    def define_resource_requirements
      uid_from_resource(resource)
      gid_from_resource(resource)
    end

describe_changes() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 51
    def describe_changes
      changes = []
      changes << "change mode from '#{mode_to_s(current_mode)}' to '#{mode_to_s(target_mode)}'" if should_update_mode?
      changes << "change owner from '#{current_resource.owner}' to '#{resource.owner}'" if should_update_owner?
      changes << "change group from '#{current_resource.group}' to '#{resource.group}'" if should_update_group?
      changes
    end

gid_from_resource(resource) click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 107
    def gid_from_resource(resource)
      return nil if resource == nil or resource.group.nil?
      if resource.group.kind_of?(String)
        diminished_radix_complement( Etc.getgrnam(resource.group).gid )
      elsif resource.group.kind_of?(Integer)
        resource.group
      else
        Chef::Log.error("The `group` parameter of the #@resource resource is set to an invalid value (#{resource.owner.inspect})")
        raise ArgumentError, "cannot resolve #{resource.group.inspect} to gid, group must be a string or integer"
      end
    rescue ArgumentError
      provider.requirements.assert(:create, :create_if_missing, :touch) do |a|
        a.assertion { false }
        a.failure_message(Chef::Exceptions::GroupIDNotFound, "cannot determine group id for '#{resource.group}', does the group exist on this system?")
        a.whyrun("Assuming group #{resource.group} would have been created")
      end
      return nil
    end

manage_symlink_attrs?() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 215
    def manage_symlink_attrs?
      @provider.manage_symlink_access?
    end

mode_from_resource(res) click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 158
    def mode_from_resource(res)
      return nil if res == nil or res.mode.nil?
      (res.mode.respond_to?(:oct) ? res.mode.oct : res.mode.to_i) & 007777
    end

mode_to_s(mode) click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 167
    def mode_to_s(mode)
      mode.nil? ? "" : "0#{mode.to_s(8)}"
    end

requires_changes?() click to toggle source

TODO factor this up

    # File lib/chef/file_access_control/unix.rb, line 42
    def requires_changes?
      should_update_mode? || should_update_owner? || should_update_group?
    end

set_all() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 35
    def set_all
      set_owner
      set_group
      set_mode
    end

set_all!() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 29
    def set_all!
      set_owner!
      set_group!
      set_mode!
    end

set_group() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 154
    def set_group
      set_group! if should_update_group?
    end

set_group!() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 146
    def set_group!
      unless target_gid.nil?
        chown(nil, target_gid, file)
        Chef::Log.info("#{log_string} group changed to #{target_gid}")
        modified
      end
    end

set_mode() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 203
    def set_mode
      set_mode! if should_update_mode?
    end

set_mode!() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 195
    def set_mode!
      unless target_mode.nil?
        chmod(target_mode, file)
        Chef::Log.info("#{log_string} mode changed to #{target_mode.to_s(8)}")
        modified
      end
    end

set_owner() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 95
    def set_owner
      set_owner! if should_update_owner?
    end

set_owner!() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 87
    def set_owner!
      unless target_uid.nil?
        chown(target_uid, nil, file)
        Chef::Log.info("#{log_string} owner changed to #{target_uid}")
        modified
      end
    end

should_update_group?() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 126
    def should_update_group?
      if target_gid.nil?
        # the user has not specified a permission on the new resource, so we never manage it with FAC
        Chef::Log.debug("found target_gid == nil, so no group was specified on resource, not managing group")
        return false
      elsif current_gid.nil?
        # the user has specified a permission, and we are creating a file, so always enforce permissions
        Chef::Log.debug("found current_gid == nil, so we are creating a new file, updating group")
        return true
      elsif target_gid != current_gid
        # the user has specified a permission, and it does not match the file, so fix the permission
        Chef::Log.debug("found target_gid != current_gid, updating group")
        return true
      else
        Chef::Log.debug("found target_gid == current_gid, not updating group")
        # the user has specified a permission, but it matches the file, so behave idempotently
        return false
      end
    end

should_update_mode?() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 175
    def should_update_mode?
      if target_mode.nil?
        # the user has not specified a permission on the new resource, so we never manage it with FAC
        Chef::Log.debug("found target_mode == nil, so no mode was specified on resource, not managing mode")
        return false
      elsif current_mode.nil?
        # the user has specified a permission, and we are creating a file, so always enforce permissions
        Chef::Log.debug("found current_mode == nil, so we are creating a new file, updating mode")
        return true
      elsif target_mode != current_mode
        # the user has specified a permission, and it does not match the file, so fix the permission
        Chef::Log.debug("found target_mode != current_mode, updating mode")
        return true
      else
        Chef::Log.debug("found target_mode == current_mode, not updating mode")
        # the user has specified a permission, but it matches the file, so behave idempotently
        return false
      end
    end

should_update_owner?() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 67
    def should_update_owner?
      if target_uid.nil?
        # the user has not specified a permission on the new resource, so we never manage it with FAC
        Chef::Log.debug("found target_uid == nil, so no owner was specified on resource, not managing owner")
        return false
      elsif current_uid.nil?
        # the user has specified a permission, and we are creating a file, so always enforce permissions
        Chef::Log.debug("found current_uid == nil, so we are creating a new file, updating owner")
        return true
      elsif target_uid != current_uid
        # the user has specified a permission, and it does not match the file, so fix the permission
        Chef::Log.debug("found target_uid != current_uid, updating owner")
        return true
      else
        Chef::Log.debug("found target_uid == current_uid, not updating owner")
        # the user has specified a permission, but it matches the file, so behave idempotently
        return false
      end
    end

stat() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 207
    def stat
      if manage_symlink_attrs?
        @stat ||= File.lstat(file)
      else
        @stat ||= File.stat(file)
      end
    end

target_gid() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 99
    def target_gid
      gid_from_resource(resource)
    end

target_mode() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 163
    def target_mode
      mode_from_resource(resource)
    end

target_uid() click to toggle source

    # File lib/chef/file_access_control/unix.rb, line 59
    def target_uid
      uid_from_resource(resource)
    end