class Chef::Provider::User

Attributes

change_desc[RW]
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 29
def initialize(new_resource, run_context)
  super
  @user_exists = true
  @locked = nil
  @shadow_lib_ok = true
  @group_name_resolved = true
end

Public Instance Methods

check_lock() click to toggle source
# File lib/chef/provider/user.rb, line 210
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 110
def compare_user
  @change_desc = []
  if !new_resource.home.nil? && Pathname.new(new_resource.home).cleanpath != Pathname.new(current_resource.home).cleanpath
    @change_desc << "change homedir from #{current_resource.home} to #{new_resource.home}"
  end

  %i{comment shell password uid gid}.each do |user_attrib|
    new_val = new_resource.send(user_attrib)
    cur_val = current_resource.send(user_attrib)
    if !new_val.nil? && new_val.to_s != cur_val.to_s
      @change_desc << "change #{user_attrib} from #{cur_val} to #{new_val}"
    end
  end

  !@change_desc.empty?
end
convert_group_name() click to toggle source
# File lib/chef/provider/user.rb, line 37
def convert_group_name
  if new_resource.gid.is_a?(String) && new_resource.gid.to_i == 0
    new_resource.gid(Etc.getgrnam(new_resource.gid).gid)
  end
rescue ArgumentError
  @group_name_resolved = false
end
create_user() click to toggle source
# File lib/chef/provider/user.rb, line 190
def create_user
  raise NotImplementedError
end
define_resource_requirements() click to toggle source
# File lib/chef/provider/user.rb, line 86
def define_resource_requirements
  requirements.assert(:create, :modify, :manage, :lock, :unlock) 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 45
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
    @user_exists = false
    logger.trace("#{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.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 202
def lock_user
  raise NotImplementedError
end
manage_user() click to toggle source
# File lib/chef/provider/user.rb, line 198
def manage_user
  raise NotImplementedError
end
remove_user() click to toggle source
# File lib/chef/provider/user.rb, line 194
def remove_user
  raise NotImplementedError
end
unlock_user() click to toggle source
# File lib/chef/provider/user.rb, line 206
def unlock_user
  raise NotImplementedError
end

Private Instance Methods

should_set?(sym) click to toggle source

helpers for subclasses

# File lib/chef/provider/user.rb, line 220
def should_set?(sym)
  current_resource.send(sym).to_s != new_resource.send(sym).to_s && new_resource.send(sym)
end
updating_home?() click to toggle source
# File lib/chef/provider/user.rb, line 224
def updating_home?
  return false if new_resource.home.nil?
  return true if current_resource.home.nil?

  # Pathname#cleanpath matches more edge conditions than File.expand_path()
  new_resource.home && Pathname.new(current_resource.home).cleanpath != Pathname.new(new_resource.home).cleanpath
end