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, #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



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

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

#action_lockObject



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

def action_lock
  if @user_exists
    if check_lock() == false
      lock_user
      @new_resource.updated_by_last_action(true)
      Chef::Log.info("#{@new_resource} locked")
    else
      Chef::Log.debug("#{@new_resource} already locked - nothing to do")
    end
  else
    raise Chef::Exceptions::User, "Cannot lock 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_by_last_action(true)
    Chef::Log.info("#{@new_resource} managed")
  end
end

#action_modifyObject



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

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

#action_removeObject



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

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

#action_unlockObject



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

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

#check_lockObject

Raises:

  • (NotImplementedError)


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

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



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

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
# 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("#{@new_resource} user 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
        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)


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

def lock_user
  raise NotImplementedError
end

#manage_userObject

Raises:

  • (NotImplementedError)


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

def manage_user
  raise NotImplementedError
end

#remove_userObject

Raises:

  • (NotImplementedError)


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

def remove_user
  raise NotImplementedError
end

#unlock_userObject

Raises:

  • (NotImplementedError)


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

def unlock_user
  raise NotImplementedError
end