Adds a list of usernames to the group using `user mod`
# File lib/chef/provider/group/groupmod.rb, line 90 def add_group_members(members) Chef::Log.debug("#{@new_resource} adding members #{members.join(', ')}") if !members.empty? members.each do |user| shell_out!("user mod -G #{@new_resource.group_name} #{user}") end end
Create the group
# File lib/chef/provider/group/groupmod.rb, line 36 def create_group command = "group add" command << set_options shell_out!(command) add_group_members(@new_resource.members) end
# File lib/chef/provider/group/groupmod.rb, line 28 def load_current_resource super [ "group", "user" ].each do |binary| raise Chef::Exceptions::Group, "Could not find binary /usr/sbin/#{binary} for #{@new_resource}" unless ::File.exists?("/usr/sbin/#{binary}") end end
Manage the group when it already exists
# File lib/chef/provider/group/groupmod.rb, line 45 def manage_group if @new_resource.append members_to_be_added = [ ] if @new_resource.excluded_members && !@new_resource.excluded_members.empty? # First find out if any member needs to be removed members_to_be_removed = [ ] @new_resource.excluded_members.each do |member| members_to_be_removed << member if @current_resource.members.include?(member) end unless members_to_be_removed.empty? # We are using a magic trick to remove the groups. reset_group_membership # Capture the members we need to add in # members_to_be_added to be added later on. @current_resource.members.each do |member| members_to_be_added << member unless members_to_be_removed.include?(member) end end end if @new_resource.members && !@new_resource.members.empty? @new_resource.members.each do |member| members_to_be_added << member if !@current_resource.members.include?(member) end end Chef::Log.debug("#{@new_resource} not changing group members, the group has no members to add") if members_to_be_added.empty? add_group_members(members_to_be_added) else # We are resetting the members of a group so use the same trick reset_group_membership Chef::Log.debug("#{@new_resource} setting group members to: none") if @new_resource.members.empty? add_group_members(@new_resource.members) end end
Remove the group
# File lib/chef/provider/group/groupmod.rb, line 85 def remove_group shell_out!("group del #{@new_resource.group_name}") end
This is tricky, but works: rename the existing group to “<name>_bak”, create a new group with the same GID and “<name>”, then set correct members on that group
# File lib/chef/provider/group/groupmod.rb, line 100 def reset_group_membership rename = "group mod -n #{@new_resource.group_name}_bak #{@new_resource.group_name}" shell_out!(rename) create = "group add" create << set_options(:overwrite_gid => true) shell_out!(create) remove = "group del #{@new_resource.group_name}_bak" shell_out!(remove) end
Little bit of magic as per Adam’s useradd provider to pull and assign the command line flags
<string> |
A string containing the option and then the quoted value |
# File lib/chef/provider/group/groupmod.rb, line 116 def set_options(overwrite_gid=false) opts = "" if overwrite_gid || @new_resource.gid && (@current_resource.gid != @new_resource.gid) opts << " -g '#{@new_resource.gid}'" end if overwrite_gid opts << " -o" end opts << " #{@new_resource.group_name}" opts end
Generated with the Darkfish Rdoc Generator 2.