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.username}") do
      create_user
      Chef::Log.info("#{@new_resource} created")
    end
  elsif compare_user
    converge_by("alter user #{@new_resource.username}") 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.username}") 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.username}") 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.username}") 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.username}") 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.username}") 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.username} - does not exist!")
    a.whyrun("Assuming user #{@new_resource.username} 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