Class: Chef::Provider::Group::Dscl
- Inherits:
-
Chef::Provider::Group
- Object
- Chef::Provider
- Chef::Provider::Group
- Chef::Provider::Group::Dscl
- Defined in:
- lib/chef/provider/group/dscl.rb
Instance Attribute Summary
Attributes inherited from Chef::Provider::Group
Attributes inherited from Chef::Provider
#current_resource, #new_resource, #node
Instance Method Summary collapse
- #create_group ⇒ Object
- #dscl(*args) ⇒ Object
-
#get_free_gid(search_limit = 1000) ⇒ Object
get a free GID greater than 200.
- #gid_used?(gid) ⇒ Boolean
- #load_current_resource ⇒ Object
- #manage_group(manage = true) ⇒ Object
- #remove_group ⇒ Object
- #safe_dscl(*args) ⇒ Object
- #set_gid ⇒ Object
- #set_members ⇒ Object
Methods inherited from Chef::Provider::Group
#action_create, #action_manage, #action_modify, #action_remove, #compare_group, #initialize
Methods included from Mixin::Command
handle_command_failures, not_if, only_if, output_of_command, popen4, run_command, run_command_with_systems_locale
Methods inherited from Chef::Provider
#action_nothing, build_from_file, #initialize
Methods included from Mixin::ConvertToClassName
#convert_to_class_name, #convert_to_snake_case, #filename_to_qualified_string
Methods included from Mixin::RecipeDefinitionDSLCore
Methods included from Mixin::Language
#data_bag, #data_bag_item, #platform?, #search, #value_for_platform
Constructor Details
This class inherits a constructor from Chef::Provider::Group
Dynamic Method Handling
This class handles dynamic methods through the method_missing method in the class Chef::Mixin::RecipeDefinitionDSLCore
Instance Method Details
#create_group ⇒ Object
90 91 92 |
# File 'lib/chef/provider/group/dscl.rb', line 90 def create_group manage_group(false) end |
#dscl(*args) ⇒ Object
24 25 26 27 28 29 30 31 32 |
# File 'lib/chef/provider/group/dscl.rb', line 24 def dscl(*args) host = "." stdout_result = ""; stderr_result = ""; cmd = "dscl #{host} -#{args.join(' ')}" status = popen4(cmd) do |pid, stdin, stdout, stderr| stdout.each { |line| stdout_result << line } stderr.each { |line| stderr_result << line } end return [cmd, status, stdout_result, stderr_result] end |
#get_free_gid(search_limit = 1000) ⇒ Object
get a free GID greater than 200
49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/chef/provider/group/dscl.rb', line 49 def get_free_gid(search_limit=1000) gid = nil; next_gid_guess = 200 groups_gids = safe_dscl("list /Groups gid") while(next_gid_guess < search_limit + 200) if groups_gids =~ Regexp.new("#{next_gid_guess}\n") next_gid_guess += 1 else gid = next_gid_guess break end end return gid || raise("gid not found. Exhausted. Searched #{search_limit} times") end |
#gid_used?(gid) ⇒ Boolean
63 64 65 66 67 |
# File 'lib/chef/provider/group/dscl.rb', line 63 def gid_used?(gid) return false unless gid groups_gids = safe_dscl("list /Groups gid") !! ( groups_gids =~ Regexp.new("#{gid}\n") ) end |
#load_current_resource ⇒ Object
85 86 87 88 |
# File 'lib/chef/provider/group/dscl.rb', line 85 def load_current_resource super raise Chef::Exceptions::Group, "Could not find binary /usr/bin/dscl for #{@new_resource}" unless ::File.exists?("/usr/bin/dscl") end |
#manage_group(manage = true) ⇒ Object
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 119 120 |
# File 'lib/chef/provider/group/dscl.rb', line 94 def manage_group(manage=true)# fields = [] if manage [:group_name,:gid,:members].each do |field| if @current_resource.send(field) != @new_resource.send(field) fields << field if @new_resource.send(field) end end else # create fields = [:group_name,:gid,:members] end fields.each do |field| case field when :group_name safe_dscl("create /Groups/#{@new_resource.group_name}") safe_dscl("create /Groups/#{@new_resource.group_name} Password '*'") when :gid set_gid when :members set_members end end end |
#remove_group ⇒ Object
122 123 124 |
# File 'lib/chef/provider/group/dscl.rb', line 122 def remove_group safe_dscl("delete /Groups/#{@new_resource.group_name}") end |
#safe_dscl(*args) ⇒ Object
34 35 36 37 38 39 40 |
# File 'lib/chef/provider/group/dscl.rb', line 34 def safe_dscl(*args) result = dscl(*args) return "" if ( args.first =~ /^delete/ ) && ( result[1].exitstatus != 0 ) raise(Chef::Exceptions::Group,"dscl error: #{result.inspect}") unless result[1].exitstatus == 0 raise(Chef::Exceptions::Group,"dscl error: #{result.inspect}") if result[2] =~ /No such key: / return result[2] end |
#set_gid ⇒ Object
69 70 71 72 73 |
# File 'lib/chef/provider/group/dscl.rb', line 69 def set_gid @new_resource.gid(get_free_gid) if [nil,""].include? @new_resource.gid raise(Chef::Exceptions::Group,"gid is already in use") if gid_used?(@new_resource.gid) safe_dscl("create /Groups/#{@new_resource.group_name} PrimaryGroupID #{@new_resource.gid}") end |
#set_members ⇒ Object
75 76 77 78 79 80 81 82 83 |
# File 'lib/chef/provider/group/dscl.rb', line 75 def set_members unless @new_resource.append Chef::Log.debug("#{@new_resource}: removing group members #{@current_resource.members.join(' ')}") unless @current_resource.members.empty? safe_dscl("create /Groups/#{@new_resource.group_name} GroupMembers") # clear guid list safe_dscl("create /Groups/#{@new_resource.group_name} GroupMembership") # clear user list end Chef::Log.debug("#{@new_resource}: setting group members #{@new_resource.members.join(', ')}") unless @new_resource.members.empty? safe_dscl("append /Groups/#{@new_resource.group_name} GroupMembership #{@new_resource.members.join(' ')}") end |