class Chef::Provider::Group

Attributes

change_desc[RW]
group_exists[RW]

Public Class Methods

new(new_resource, run_context) click to toggle source
Calls superclass method Chef::Provider.new
# File lib/chef/provider/group.rb, line 30
def initialize(new_resource, run_context)
  super
  @group_exists = true
end

Public Instance Methods

action_create() click to toggle source
# File lib/chef/provider/group.rb, line 124
def action_create
  case @group_exists
  when false
    converge_by("create group #{new_resource.group_name}") do
      create_group
      logger.info("#{new_resource} created")
    end
  else
    if compare_group
      converge_by(["alter group #{new_resource.group_name}"] + change_desc) do
        manage_group
        logger.info("#{new_resource} altered")
      end
    end
  end
end
action_manage() click to toggle source
# File lib/chef/provider/group.rb, line 149
def action_manage
  return unless @group_exists && compare_group
  converge_by(["manage group #{new_resource.group_name}"] + change_desc) do
    manage_group
    logger.info("#{new_resource} managed")
  end
end
action_modify() click to toggle source
# File lib/chef/provider/group.rb, line 157
def action_modify
  return unless compare_group
  converge_by(["modify group #{new_resource.group_name}"] + change_desc) do
    manage_group
    logger.info("#{new_resource} modified")
  end
end
action_remove() click to toggle source
# File lib/chef/provider/group.rb, line 141
def action_remove
  return unless @group_exists
  converge_by("remove group #{new_resource.group_name}") do
    remove_group
    logger.info("#{new_resource} removed")
  end
end
compare_group() click to toggle source

Check to see if a group needs any changes. Populate @change_desc with a description of why a change must occur

Returns

<true>

If a change is required

<false>

If a change is not required

# File lib/chef/provider/group.rb, line 81
def compare_group
  @change_desc = [ ]
  if new_resource.gid.to_s != current_resource.gid.to_s
    @change_desc << "change gid #{current_resource.gid} to #{new_resource.gid}"
  end

  if new_resource.append
    missing_members = []
    new_resource.members.each do |member|
      next if has_current_group_member?(member)
      validate_member!(member)
      missing_members << member
    end
    unless missing_members.empty?
      @change_desc << "add missing member(s): #{missing_members.join(', ')}"
    end

    members_to_be_removed = []
    new_resource.excluded_members.each do |member|
      if has_current_group_member?(member)
        members_to_be_removed << member
      end
    end
    unless members_to_be_removed.empty?
      @change_desc << "remove existing member(s): #{members_to_be_removed.join(', ')}"
    end
  elsif new_resource.members != current_resource.members
    @change_desc << "replace group members with new list of members"
  end

  !@change_desc.empty?
end
create_group() click to toggle source
# File lib/chef/provider/group.rb, line 165
def create_group
  raise NotImplementedError, "subclasses of Chef::Provider::Group should define #create_group"
end
define_resource_requirements() click to toggle source
# File lib/chef/provider/group.rb, line 56
def define_resource_requirements
  requirements.assert(:modify) do |a|
    a.assertion { @group_exists }
    a.failure_message(Chef::Exceptions::Group, "Cannot modify #{new_resource} - group does not exist!")
    a.whyrun("Group #{new_resource} does not exist. Unless it would have been created earlier in this run, this attempt to modify it would fail.")
  end

  requirements.assert(:all_actions) do |a|
    # Make sure that the resource doesn't contain any common
    # user names in the members and exclude_members properties.
    if !new_resource.members.nil? && !new_resource.excluded_members.nil?
      common_members = new_resource.members & new_resource.excluded_members
      a.assertion { common_members.empty? }
      a.failure_message(Chef::Exceptions::ConflictingMembersInGroup, "Attempting to both add and remove users from a group: '#{common_members.join(', ')}'")
      # No why-run alternative
    end
  end
end
has_current_group_member?(member) click to toggle source
# File lib/chef/provider/group.rb, line 114
def has_current_group_member?(member)
  current_resource.members.include?(member)
end
load_current_resource() click to toggle source
# File lib/chef/provider/group.rb, line 35
def load_current_resource
  @current_resource = Chef::Resource::Group.new(new_resource.name)
  current_resource.group_name(new_resource.group_name)

  group_info = nil
  begin
    group_info = Etc.getgrnam(new_resource.group_name)
  rescue ArgumentError
    @group_exists = false
    logger.trace("#{new_resource} group does not exist")
  end

  if group_info
    new_resource.gid(group_info.gid) unless new_resource.gid
    current_resource.gid(group_info.gid)
    current_resource.members(group_info.mem)
  end

  current_resource
end
manage_group() click to toggle source
# File lib/chef/provider/group.rb, line 169
def manage_group
  raise NotImplementedError, "subclasses of Chef::Provider::Group should define #manage_group"
end
remove_group() click to toggle source
# File lib/chef/provider/group.rb, line 173
def remove_group
  raise NotImplementedError, "subclasses of Chef::Provider::Group should define #remove_group"
end
validate_member!(member) click to toggle source
# File lib/chef/provider/group.rb, line 118
def validate_member!(member)
  # Sub-classes can do any validation if needed
  # and raise an error if validation fails
  true
end