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/dscl.rb,
lib/chef/provider/user/useradd.rb,
lib/chef/provider/user/windows.rb

Direct Known Subclasses

Dscl, Pw, Useradd, Windows

Defined Under Namespace

Classes: Dscl, Pw, Useradd, Windows

Instance Attribute Summary collapse

Attributes inherited from Chef::Provider

#current_resource, #new_resource, #run_context

Instance Method Summary collapse

Methods included from Mixin::Command

#chdir_or_tmpdir, #handle_command_failures, #not_if, #only_if, #output_of_command, #run_command, #run_command_with_systems_locale

Methods included from Mixin::Command::Windows

#popen4

Methods included from Mixin::Command::Unix

#popen4

Methods inherited from Chef::Provider

#action_nothing, build_from_file, #cookbook_name, #node, #resource_collection

Methods included from Mixin::ConvertToClassName

#convert_to_class_name, #convert_to_snake_case, #filename_to_qualified_string, #snake_case_basename

Methods included from Mixin::RecipeDefinitionDSLCore

#method_missing

Methods included from Mixin::Language

#data_bag, #data_bag_item, #platform?, #search, #value_for_platform

Constructor Details

#initialize(new_resource, run_context) ⇒ User

Returns a new instance of User.



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

def initialize(new_resource, run_context)
  super
  @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
# File 'lib/chef/provider/user.rb', line 97

def action_create
  if !@user_exists
    create_user
    Chef::Log.info("Created #{@new_resource}")
    @new_resource.updated_by_last_action(true)
  elsif compare_user
    manage_user
    Chef::Log.info("Altered #{@new_resource}")
    @new_resource.updated_by_last_action(true)
  end
end

#action_lockObject



145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/chef/provider/user.rb', line 145

def action_lock
  if @user_exists
    if check_lock() == false
      lock_user
      @new_resource.updated_by_last_action(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



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

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

#action_modifyObject



133
134
135
136
137
138
139
140
141
142
143
# File 'lib/chef/provider/user.rb', line 133

def action_modify
  if @user_exists
    if compare_user
      manage_user
      @new_resource.updated_by_last_action(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



109
110
111
112
113
114
115
# File 'lib/chef/provider/user.rb', line 109

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

#action_unlockObject



167
168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/chef/provider/user.rb', line 167

def action_unlock
  if @user_exists
    if check_lock() == true
      unlock_user
      @new_resource.updated_by_last_action(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

#check_lockObject

Raises:

  • (NotImplementedError)


159
160
161
# File 'lib/chef/provider/user.rb', line 159

def check_lock
  raise NotImplementedError
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)

  begin
     = Etc.getpwnam(@new_resource.username)
  rescue ArgumentError => e
    @user_exists = false
    Chef::Log.debug("User #{@new_resource.username} does not exist")
     = nil
  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

#lock_userObject

Raises:

  • (NotImplementedError)


163
164
165
# File 'lib/chef/provider/user.rb', line 163

def lock_user
  raise NotImplementedError
end

#manage_userObject

Raises:

  • (NotImplementedError)


129
130
131
# File 'lib/chef/provider/user.rb', line 129

def manage_user
  raise NotImplementedError
end

#remove_userObject

Raises:

  • (NotImplementedError)


117
118
119
# File 'lib/chef/provider/user.rb', line 117

def remove_user
  raise NotImplementedError
end

#unlock_userObject

Raises:

  • (NotImplementedError)


181
182
183
# File 'lib/chef/provider/user.rb', line 181

def unlock_user
  raise NotImplementedError
end