Class: Chef::Provider::User

Inherits:
Chef::Provider show all
Includes:
Mixin::Command
Defined in:
lib/chef/provider/user.rb,
lib/chef/provider/user/pw.rb,
lib/chef/provider/user/useradd.rb

Direct Known Subclasses

Pw, Useradd

Defined Under Namespace

Classes: Pw, Useradd

Instance Attribute Summary collapse

Attributes inherited from Chef::Provider

#current_resource, #new_resource, #node

Instance Method Summary collapse

Methods included from Mixin::Command

handle_command_failures, not_if, only_if, output_of_command, popen4, run_command, run_command_with_systems_locale

Methods inherited from Chef::Provider

#action_nothing, build_from_file

Methods included from Mixin::ConvertToClassName

#convert_to_class_name, #filename_to_qualified_string

Methods included from Mixin::RecipeDefinitionDSLCore

#method_missing

Constructor Details

#initialize(node, new_resource, collection = nil, definitions = nil, cookbook_loader = nil) ⇒ User

Returns a new instance of User.



32
33
34
35
36
# File 'lib/chef/provider/user.rb', line 32

def initialize(node, new_resource, collection=nil, definitions=nil, cookbook_loader=nil)
  super(node, new_resource, collection, definitions, cookbook_loader)
  @user_exists = true
  @locked = nil
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Chef::Mixin::RecipeDefinitionDSLCore

Instance Attribute Details

#lockedObject

Returns the value of attribute locked.



30
31
32
# File 'lib/chef/provider/user.rb', line 30

def locked
  @locked
end

#user_existsObject

Returns the value of attribute user_exists.



30
31
32
# File 'lib/chef/provider/user.rb', line 30

def user_exists
  @user_exists
end

Instance Method Details

#action_createObject



97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/chef/provider/user.rb', line 97

def action_create
  case @user_exists
  when false
    create_user
    Chef::Log.info("Created #{@new_resource}")
    @new_resource.updated = true
  else 
    if compare_user
      manage_user
      Chef::Log.info("Altered #{@new_resource}")
      @new_resource.updated = true
    end
  end
end

#action_lockObject



140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/chef/provider/user.rb', line 140

def action_lock
  if @user_exists
    if check_lock() == false
      lock_user
      @new_resource.updated = true
      Chef::Log.info("Locked #{@new_resource}")
    else
      Chef::Log.debug("No need to lock #{@new_resource}")
    end
  else
    raise Chef::Exceptions::User, "Cannot lock #{@new_resource} - user does not exist!"
  end
end

#action_manageObject



120
121
122
123
124
125
126
# File 'lib/chef/provider/user.rb', line 120

def action_manage
  if @user_exists && compare_user
    manage_user 
    @new_resource.updated = true
    Chef::Log.info("Managed #{@new_resource}")
  end
end

#action_modifyObject



128
129
130
131
132
133
134
135
136
137
138
# File 'lib/chef/provider/user.rb', line 128

def action_modify
  if @user_exists 
    if compare_user
      manage_user
      @new_resource.updated = true
      Chef::Log.info("Modified #{@new_resource}")
    end
  else
    raise Chef::Exceptions::User, "Cannot modify #{@new_resource} - user does not exist!"
  end
end

#action_removeObject



112
113
114
115
116
117
118
# File 'lib/chef/provider/user.rb', line 112

def action_remove
  if @user_exists
    remove_user
    @new_resource.updated = true
    Chef::Log.info("Removed #{@new_resource}")
  end
end

#action_unlockObject



154
155
156
157
158
159
160
161
162
163
164
165
166
# File 'lib/chef/provider/user.rb', line 154

def action_unlock
  if @user_exists
    if check_lock() == true
      unlock_user
      @new_resource.updated = true
      Chef::Log.info("Unlocked #{@new_resource}")
    else
      Chef::Log.debug("No need to unlock #{@new_resource}")
    end
  else
    raise Chef::Exceptions::User, "Cannot unlock #{@new_resource} - user does not exist!"
  end
end

#compare_userObject

Check to see if the user needs any changes

Returns

<true>

If a change is required

<false>

If the users are identical



91
92
93
94
95
# File 'lib/chef/provider/user.rb', line 91

def compare_user
  [ :uid, :gid, :comment, :home, :shell, :password ].any? do |user_attrib|
    !@new_resource.send(user_attrib).nil? && @new_resource.send(user_attrib) != @current_resource.send(user_attrib)
  end
end

#convert_group_nameObject



38
39
40
41
42
43
44
# File 'lib/chef/provider/user.rb', line 38

def convert_group_name
  if @new_resource.gid.is_a? String
    @new_resource.gid Etc.getgrnam(@new_resource.gid).gid
  end
rescue ArgumentError => e
  raise Chef::Exceptions::User, "Couldn't lookup integer GID for group name #{@new_resource.gid}"
end

#load_current_resourceObject



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/chef/provider/user.rb', line 46

def load_current_resource
  @current_resource = Chef::Resource::User.new(@new_resource.name)
  @current_resource.username(@new_resource.username)

   = nil
  begin
     = Etc.getpwnam(@new_resource.username)
  rescue ArgumentError => e
    @user_exists = false
    Chef::Log.debug("User #{@new_resource.username} does not exist")
  end
  
  if 
    @current_resource.uid(.uid)
    @current_resource.gid(.gid)
    @current_resource.comment(.gecos)
    @current_resource.home(.dir)
    @current_resource.shell(.shell)
    @current_resource.password(.passwd)
  
    if @new_resource.password && @current_resource.password == 'x'
      begin
        require 'shadow'
      rescue LoadError
        Chef::Log.error("You must have ruby-shadow installed for password support!")
        raise Chef::Exceptions::MissingLibrary, "You must have ruby-shadow installed for password support!"
      else
        shadow_info = Shadow::Passwd.getspnam(@new_resource.username)
        @current_resource.password(shadow_info.sp_pwdp)
      end
    end
    
    if @new_resource.gid
      convert_group_name
    end
  end
  
  @current_resource
end