Class: Chef::Provider::User::Useradd

Inherits:
Chef::Provider::User show all
Defined in:
lib/chef/provider/user/useradd.rb

Direct Known Subclasses

Aix, Solaris

Constant Summary collapse

UNIVERSAL_OPTIONS =
[[:comment, "-c"], [:gid, "-g"], [:password, "-p"], [:shell, "-s"], [:uid, "-u"]]

Constants included from Mixin::ShellOut

Mixin::ShellOut::DEPRECATED_OPTIONS

Instance Attribute Summary

Attributes inherited from Chef::Provider::User

#locked, #user_exists

Attributes inherited from Chef::Provider

#action, #cookbook_name, #current_resource, #new_resource, #recipe_name, #run_context

Instance Method Summary collapse

Methods inherited from Chef::Provider::User

#action_create, #action_lock, #action_manage, #action_modify, #action_remove, #action_unlock, #compare_user, #convert_group_name, #define_resource_requirements, #initialize, #load_current_resource, #whyrun_supported?

Methods included from Mixin::Command

#chdir_or_tmpdir, #handle_command_failures, #output_of_command, #run_command, #run_command_and_return_stdout_stderr, #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, #cleanup_after_converge, #converge_by, #define_resource_requirements, #events, #initialize, #load_current_resource, #node, node_map, #process_resource_requirements, provides, provides?, #requirements, #resource_collection, #resource_updated?, #run_action, #set_updated_status, supports?, #whyrun_mode?, #whyrun_supported?

Methods included from Mixin::DescendantsTracker

#descendants, descendants, direct_descendants, #direct_descendants, find_descendants_by_name, #find_descendants_by_name, #inherited, store_inherited

Methods included from Mixin::ShellOut

#run_command_compatible_options, #shell_out, #shell_out!, #shell_out_with_systems_locale, #shell_out_with_systems_locale!

Constructor Details

This class inherits a constructor from Chef::Provider::User

Instance Method Details

#check_lockObject

Raises:



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
85
86
87
88
89
90
91
92
# File 'lib/chef/provider/user/useradd.rb', line 54

def check_lock
  # we can get an exit code of 1 even when it's successful on
  # rhel/centos (redhat bug 578534). See additional error checks below.
  passwd_s = shell_out!("passwd", "-S", new_resource.username, :returns => [0,1])
  if whyrun_mode? && passwd_s.stdout.empty? && passwd_s.stderr.match(/does not exist/)
    # if we're in whyrun mode and the user is not yet created we assume it would be
    return false
  end

  raise Chef::Exceptions::User, "Cannot determine if #{@new_resource} is locked!" if passwd_s.stdout.empty?

  status_line = passwd_s.stdout.split(' ')
  case status_line[1]
  when /^P/
    @locked = false
  when /^N/
    @locked = false
  when /^L/
    @locked = true
  end

  unless passwd_s.exitstatus == 0
    raise_lock_error = false
    if ['redhat', 'centos'].include?(node[:platform])
      passwd_version_check = shell_out!('rpm -q passwd')
      passwd_version = passwd_version_check.stdout.chomp

      unless passwd_version == 'passwd-0.73-1'
        raise_lock_error = true
      end
    else
      raise_lock_error = true
    end

    raise Chef::Exceptions::User, "Cannot determine if #{new_resource} is locked!" if raise_lock_error
  end

  @locked
end

#compile_command(base_command) {|base_command| ... } ⇒ Object

Yields:

  • (base_command)


102
103
104
105
106
107
# File 'lib/chef/provider/user/useradd.rb', line 102

def compile_command(base_command)
  base_command = Array(base_command)
  yield base_command
  base_command << new_resource.username
  base_command
end

#create_userObject



29
30
31
32
33
34
35
# File 'lib/chef/provider/user/useradd.rb', line 29

def create_user
  command = compile_command("useradd") do |useradd|
    useradd.concat(universal_options)
    useradd.concat(useradd_options)
  end
  shell_out!(*command)
end

#lock_userObject



94
95
96
# File 'lib/chef/provider/user/useradd.rb', line 94

def lock_user
  shell_out!("usermod", "-L", new_resource.username)
end

#manage_userObject



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

def manage_user
  unless universal_options.empty?
    command = compile_command("usermod") do |u|
      u.concat(universal_options)
    end
    shell_out!(*command)
  end
end

#managing_home_dir?Boolean



155
156
157
# File 'lib/chef/provider/user/useradd.rb', line 155

def managing_home_dir?
  new_resource.manage_home || new_resource.supports[:manage_home]
end

#remove_userObject



46
47
48
49
50
51
52
# File 'lib/chef/provider/user/useradd.rb', line 46

def remove_user
  command = [ "userdel" ]
  command << "-r" if managing_home_dir?
  command << "-f" if new_resource.force
  command << new_resource.username
  shell_out!(*command)
end

#universal_optionsObject



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/chef/provider/user/useradd.rb', line 109

def universal_options
  @universal_options ||=
    begin
      opts = []
      # magic allows UNIVERSAL_OPTIONS to be overridden in a subclass
      self.class::UNIVERSAL_OPTIONS.each do |field, option|
        update_options(field, option, opts)
      end
      if updating_home?
        if managing_home_dir?
          Chef::Log.debug("#{new_resource} managing the users home directory")
          opts << "-d" << new_resource.home << "-m"
        else
          Chef::Log.debug("#{new_resource} setting home to #{new_resource.home}")
          opts << "-d" << new_resource.home
        end
      end
      opts << "-o" if new_resource.non_unique || new_resource.supports[:non_unique]
      opts
    end
end

#unlock_userObject



98
99
100
# File 'lib/chef/provider/user/useradd.rb', line 98

def unlock_user
  shell_out!("usermod", "-U", new_resource.username)
end

#update_options(field, option, opts) ⇒ Object



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

def update_options(field, option, opts)
  if @current_resource.send(field).to_s != new_resource.send(field).to_s
    if new_resource.send(field)
      Chef::Log.debug("#{new_resource} setting #{field} to #{new_resource.send(field)}")
      opts << option << new_resource.send(field).to_s
    end
  end
end

#updating_home?Boolean



146
147
148
149
150
151
152
153
# File 'lib/chef/provider/user/useradd.rb', line 146

def updating_home?
  # will return false if paths are equivalent
  # Pathname#cleanpath does a better job than ::File::expand_path (on both unix and windows)
  # ::File.expand_path("///tmp") == ::File.expand_path("/tmp") => false
  # ::File.expand_path("\\tmp") => "C:/tmp"
  return true if @current_resource.home.nil? && new_resource.home
  new_resource.home and Pathname.new(@current_resource.home).cleanpath != Pathname.new(new_resource.home).cleanpath
end

#useradd_optionsObject



140
141
142
143
144
# File 'lib/chef/provider/user/useradd.rb', line 140

def useradd_options
  opts = []
  opts << "-r" if new_resource.system
  opts
end