# class Chef::Provider::User

### Attributes

locked[RW]
user_exists[RW]

### Public Class Methods

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

    # File lib/chef/provider/user.rb, line 31
    def initialize(new_resource, run_context)
      super
      @user_exists = true
      @locked = nil
      @shadow_lib_ok = true
      @group_name_resolved = true
    end

### Public Instance Methods

action_create() click to toggle source

    # File lib/chef/provider/user.rb, line 128
    def action_create

      if !@user_exists
        converge_by("create user #{@new_resource}") do
          create_user
          Chef::Log.info("#{@new_resource} created")
        end
      elsif compare_user
        converge_by("alter user #{@new_resource}") do
          manage_user
          Chef::Log.info("#{@new_resource} altered")
        end
      end
    end

action_lock() click to toggle source

    # File lib/chef/provider/user.rb, line 178
    def action_lock
      if check_lock() == false
        converge_by("lock the user #{@new_resource}") do
          lock_user
          Chef::Log.info("#{@new_resource} locked")
        end
       else
        Chef::Log.debug("#{@new_resource} already locked - nothing to do")
      end
    end

action_manage() click to toggle source

    # File lib/chef/provider/user.rb, line 156
    def action_manage
      if @user_exists && compare_user
        converge_by("manage user #{@new_resource}") do
          manage_user
          Chef::Log.info("#{@new_resource} managed")
        end
      end
    end

action_modify() click to toggle source

    # File lib/chef/provider/user.rb, line 169
    def action_modify
      if compare_user
        converge_by("modify user #{@new_resource}") do
          manage_user
          Chef::Log.info("#{@new_resource} modified")
        end
      end
    end

action_remove() click to toggle source

    # File lib/chef/provider/user.rb, line 143
    def action_remove
      if @user_exists
        converge_by("remove user #{@new_resource}") do
          remove_user
          Chef::Log.info("#{@new_resource} removed")
        end
      end
    end

action_unlock() click to toggle source

    # File lib/chef/provider/user.rb, line 197
    def action_unlock
      if check_lock() == true
        converge_by("unlock user #{@new_resource}") do
          unlock_user
          Chef::Log.info("#{@new_resource} unlocked")
        end
      else
        Chef::Log.debug("#{@new_resource} already unlocked - nothing to do")
      end
    end

check_lock() click to toggle source

    # File lib/chef/provider/user.rb, line 189
    def check_lock
      raise NotImplementedError
    end

compare_user() click to toggle source

Check to see if the user needs any changes

### Returns¶ ↑

<true>

  If a change is required

<false>

  If the users are identical

    # File lib/chef/provider/user.rb, line 116
    def compare_user
      changed = [ :comment, :home, :shell, :password ].select do |user_attrib|
        !@new_resource.send(user_attrib).nil? && @new_resource.send(user_attrib) != @current_resource.send(user_attrib)
      end

      changed += [ :uid, :gid ].select do |user_attrib|
        !@new_resource.send(user_attrib).nil? && @new_resource.send(user_attrib).to_s != @current_resource.send(user_attrib).to_s
      end

      changed.any?
    end

convert_group_name() click to toggle source

    # File lib/chef/provider/user.rb, line 39
    def convert_group_name
      if @new_resource.gid.is_a? String
        @new_resource.gid(Etc.getgrnam(@new_resource.gid).gid)
      end
    rescue ArgumentError => e
      @group_name_resolved = false
    end

define_resource_requirements() click to toggle source

    # File lib/chef/provider/user.rb, line 92
    def define_resource_requirements
      requirements.assert(:all_actions) do |a|
        a.assertion { @group_name_resolved }
        a.failure_message Chef::Exceptions::User, "Couldn't lookup integer GID for group name #{@new_resource.gid}"
        a.whyrun "group name #{@new_resource.gid} does not exist.  This will cause group assignment to fail.  Assuming this group will have been created previously."
      end
      requirements.assert(:all_actions) do |a|
        a.assertion { @shadow_lib_ok }
        a.failure_message Chef::Exceptions::MissingLibrary, "You must have ruby-shadow installed for password support!"
        a.whyrun "ruby-shadow is not installed. Attempts to set user password will cause failure.  Assuming that this gem will have been previously installed." +
                 "Note that user update converge may report false-positive on the basis of mismatched password. "
      end
      requirements.assert(:modify, :lock, :unlock) do |a|
        a.assertion { @user_exists }
        a.failure_message(Chef::Exceptions::User, "Cannot modify user #{@new_resource} - does not exist!")
        a.whyrun("Assuming user #{@new_resource} would have been created")
      end
    end

load_current_resource() click to toggle source

    # File lib/chef/provider/user.rb, line 51
    def load_current_resource
      @current_resource = Chef::Resource::User.new(@new_resource.name)
      @current_resource.username(@new_resource.username)

      begin
        user_info = Etc.getpwnam(@new_resource.username)
      rescue ArgumentError => e
        @user_exists = false
        Chef::Log.debug("#{@new_resource} user does not exist")
        user_info = nil
      end

      if user_info
        @current_resource.uid(user_info.uid)
        @current_resource.gid(user_info.gid)
        @current_resource.home(user_info.dir)
        @current_resource.shell(user_info.shell)
        @current_resource.password(user_info.passwd)

        if @new_resource.comment && user_info.gecos.respond_to?(:force_encoding)
          user_info.gecos.force_encoding(@new_resource.comment.encoding)
        end
        @current_resource.comment(user_info.gecos)

        if @new_resource.password && @current_resource.password == 'x'
          begin
            require 'shadow'
          rescue LoadError
            @shadow_lib_ok = false
          else
            shadow_info = Shadow::Passwd.getspnam(@new_resource.username)
            @current_resource.password(shadow_info.sp_pwdp)
          end
        end

        convert_group_name if @new_resource.gid
      end

      @current_resource
    end

lock_user() click to toggle source

    # File lib/chef/provider/user.rb, line 193
    def lock_user
      raise NotImplementedError
    end

manage_user() click to toggle source

    # File lib/chef/provider/user.rb, line 165
    def manage_user
      raise NotImplementedError
    end

remove_user() click to toggle source

    # File lib/chef/provider/user.rb, line 152
    def remove_user
      raise NotImplementedError
    end

unlock_user() click to toggle source

    # File lib/chef/provider/user.rb, line 208
    def unlock_user
      raise NotImplementedError
    end

whyrun_supported?() click to toggle source

    # File lib/chef/provider/user.rb, line 47
    def whyrun_supported?
      true
    end