Class: Chef::Provider::Group

Inherits:
Chef::Provider show all
Includes:
Mixin::Command
Defined in:
lib/chef/provider/group.rb,
lib/chef/provider/group/pw.rb,
lib/chef/provider/group/aix.rb,
lib/chef/provider/group/dscl.rb,
lib/chef/provider/group/suse.rb,
lib/chef/provider/group/gpasswd.rb,
lib/chef/provider/group/usermod.rb,
lib/chef/provider/group/windows.rb,
lib/chef/provider/group/groupadd.rb,
lib/chef/provider/group/groupmod.rb

Direct Known Subclasses

Dscl, Groupadd, Groupmod, Pw, Windows

Defined Under Namespace

Classes: Aix, Dscl, Gpasswd, Groupadd, Groupmod, Pw, Suse, Usermod, Windows

Instance Attribute Summary collapse

Attributes inherited from Chef::Provider

#action, #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, #cleanup_after_converge, #cookbook_name, #events, #node, #process_resource_requirements, #requirements, #resource_collection, #run_action, #set_updated_status, #whyrun_mode?

Methods included from Mixin::ConvertToClassName

#convert_to_class_name, #convert_to_snake_case, #filename_to_qualified_string, #snake_case_basename

Methods included from Mixin::EnforceOwnershipAndPermissions

#access_controls, #enforce_ownership_and_permissions

Methods included from Mixin::RecipeDefinitionDSLCore

#method_missing

Methods included from Mixin::Language

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

Constructor Details

#initialize(new_resource, run_context) ⇒ Group

Returns a new instance of Group.



35
36
37
38
# File 'lib/chef/provider/group.rb', line 35

def initialize(new_resource, run_context)
  super
  @group_exists = true
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Chef::Mixin::RecipeDefinitionDSLCore

Instance Attribute Details

#change_descObject

Returns the value of attribute change_desc.



29
30
31
# File 'lib/chef/provider/group.rb', line 29

def change_desc
  @change_desc
end

#group_existsObject

Returns the value of attribute group_exists.



28
29
30
# File 'lib/chef/provider/group.rb', line 28

def group_exists
  @group_exists
end

Instance Method Details

#action_createObject



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/chef/provider/group.rb', line 120

def action_create
  case @group_exists
  when false
    converge_by("create #{@new_resource}") do
      create_group
      Chef::Log.info("#{@new_resource} created")
    end
  else
    if compare_group
      converge_by(["alter group #{@new_resource}"] + change_desc) do
        manage_group
        Chef::Log.info("#{@new_resource} altered")
      end
    end
  end
end

#action_manageObject



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

def action_manage
  if @group_exists && compare_group
    converge_by(["manage group #{@new_resource}"] + change_desc) do
      manage_group
      Chef::Log.info("#{@new_resource} managed")
    end
  end
end

#action_modifyObject



155
156
157
158
159
160
161
162
# File 'lib/chef/provider/group.rb', line 155

def action_modify
  if compare_group
    converge_by(["modify group #{@new_resource}"] + change_desc) do
      manage_group
      Chef::Log.info("#{@new_resource} modified")
    end
  end
end

#action_removeObject



137
138
139
140
141
142
143
144
# File 'lib/chef/provider/group.rb', line 137

def action_remove
  if @group_exists
    converge_by("remove group #{@new_resource}") do
      remove_group
      Chef::Log.info("#{@new_resource} removed")
    end
  end
end

#compare_groupObject

Check to see if a group needs any changes. Populate

Returns

<true>

If a change is required

<false>

If a change is not required



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/chef/provider/group.rb', line 86

def compare_group
  @change_desc = [ ]
  if @new_resource.gid != @current_resource.gid
    @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 @current_resource.members.include?(member)
      missing_members << member
    end
    if missing_members.length > 0
      @change_desc << "add missing member(s): #{missing_members.join(", ")}"
    end

    members_to_be_removed = []
    @new_resource.excluded_members.each do |member|
      if @current_resource.members.include?(member)
        members_to_be_removed << member
      end
    end
    if members_to_be_removed.length > 0
      @change_desc << "remove existing member(s): #{members_to_be_removed.join(", ")}"
    end
  else
    if @new_resource.members != @current_resource.members
      @change_desc << "replace group members with new list of members"
    end
  end

  !@change_desc.empty?
end

#create_groupObject

Raises:

  • (NotImplementedError)


164
165
166
# File 'lib/chef/provider/group.rb', line 164

def create_group
  raise NotImplementedError, "subclasses of Chef::Provider::Group should define #create_group"
end

#define_resource_requirementsObject



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/chef/provider/group.rb', line 61

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

#load_current_resourceObject



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/chef/provider/group.rb', line 40

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 => e
    @group_exists = false
    Chef::Log.debug("#{@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_groupObject

Raises:

  • (NotImplementedError)


168
169
170
# File 'lib/chef/provider/group.rb', line 168

def manage_group
  raise NotImplementedError, "subclasses of Chef::Provider::Group should define #manage_group"
end

#remove_groupObject

Raises:

  • (NotImplementedError)


172
173
174
# File 'lib/chef/provider/group.rb', line 172

def remove_group
  raise NotImplementedError, "subclasses of Chef::Provider::Group should define #remove_group"
end

#whyrun_supported?Boolean

Returns:

  • (Boolean)


31
32
33
# File 'lib/chef/provider/group.rb', line 31

def whyrun_supported?
  true
end