chef 12.17.44 → 12.18.31

Sign up to get free protection for your applications and to get access to all the features.
Files changed (178) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -1
  3. data/README.md +3 -2
  4. data/Rakefile +9 -0
  5. data/VERSION +1 -1
  6. data/acceptance/Gemfile.lock +17 -17
  7. data/distro/common/html/knife_environment.html +4 -8
  8. data/distro/common/man/man1/knife-environment.1 +4 -16
  9. data/distro/powershell/chef/chef.psm1 +139 -24
  10. data/lib/chef/application.rb +5 -4
  11. data/lib/chef/application/windows_service_manager.rb +6 -4
  12. data/lib/chef/chef_fs/chef_fs_data_store.rb +1 -1
  13. data/lib/chef/chef_fs/command_line.rb +1 -1
  14. data/lib/chef/chef_fs/file_system/chef_server/rest_list_entry.rb +8 -1
  15. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_root_dir.rb +1 -1
  16. data/lib/chef/chef_fs/file_system/repository/nodes_dir.rb +1 -1
  17. data/lib/chef/cookbook/chefignore.rb +1 -1
  18. data/lib/chef/cookbook/cookbook_version_loader.rb +4 -4
  19. data/lib/chef/cookbook/metadata.rb +2 -2
  20. data/lib/chef/cookbook_loader.rb +1 -1
  21. data/lib/chef/data_collector.rb +24 -13
  22. data/lib/chef/data_collector/messages.rb +8 -6
  23. data/lib/chef/data_collector/messages/helpers.rb +1 -1
  24. data/lib/chef/deprecated.rb +30 -0
  25. data/lib/chef/dsl/platform_introspection.rb +2 -2
  26. data/lib/chef/encrypted_data_bag_item.rb +1 -1
  27. data/lib/chef/encrypted_data_bag_item/decryptor.rb +2 -2
  28. data/lib/chef/environment.rb +1 -1
  29. data/lib/chef/exceptions.rb +5 -5
  30. data/lib/chef/file_access_control/unix.rb +5 -5
  31. data/lib/chef/formatters/error_description.rb +1 -1
  32. data/lib/chef/http/basic_client.rb +1 -1
  33. data/lib/chef/http/json_input.rb +2 -2
  34. data/lib/chef/knife.rb +1 -1
  35. data/lib/chef/knife/cookbook_site_install.rb +1 -1
  36. data/lib/chef/knife/core/cookbook_scm_repo.rb +1 -1
  37. data/lib/chef/knife/core/ui.rb +1 -1
  38. data/lib/chef/mixin/command.rb +1 -0
  39. data/lib/chef/mixin/deep_merge.rb +1 -1
  40. data/lib/chef/mixin/shell_out.rb +58 -3
  41. data/lib/chef/mixin/which.rb +5 -9
  42. data/lib/chef/mixin/wide_string.rb +1 -1
  43. data/lib/chef/node.rb +1 -1
  44. data/lib/chef/node/attribute.rb +4 -5
  45. data/lib/chef/node_map.rb +18 -2
  46. data/lib/chef/platform/provider_handler_map.rb +2 -2
  47. data/lib/chef/platform/provider_mapping.rb +5 -0
  48. data/lib/chef/platform/resource_handler_map.rb +2 -2
  49. data/lib/chef/provider/env/windows.rb +1 -1
  50. data/lib/chef/provider/git.rb +1 -1
  51. data/lib/chef/provider/group.rb +41 -46
  52. data/lib/chef/provider/group/aix.rb +12 -19
  53. data/lib/chef/provider/group/dscl.rb +46 -43
  54. data/lib/chef/provider/group/gpasswd.rb +7 -7
  55. data/lib/chef/provider/group/groupadd.rb +29 -34
  56. data/lib/chef/provider/group/groupmod.rb +26 -31
  57. data/lib/chef/provider/group/pw.rb +28 -31
  58. data/lib/chef/provider/group/suse.rb +9 -9
  59. data/lib/chef/provider/group/usermod.rb +10 -11
  60. data/lib/chef/provider/group/windows.rb +18 -20
  61. data/lib/chef/provider/ifconfig.rb +52 -63
  62. data/lib/chef/provider/ifconfig/aix.rb +23 -28
  63. data/lib/chef/provider/ifconfig/debian.rb +23 -22
  64. data/lib/chef/provider/ifconfig/redhat.rb +12 -12
  65. data/lib/chef/provider/mount/mount.rb +1 -1
  66. data/lib/chef/provider/osx_profile.rb +4 -2
  67. data/lib/chef/provider/package.rb +16 -7
  68. data/lib/chef/provider/package/chocolatey.rb +3 -1
  69. data/lib/chef/provider/package/dnf.rb +183 -0
  70. data/lib/chef/provider/package/dnf/dnf_helper.py +91 -0
  71. data/lib/chef/provider/package/dnf/python_helper.rb +120 -0
  72. data/lib/chef/provider/package/dnf/version.rb +56 -0
  73. data/lib/chef/provider/package/easy_install.rb +1 -1
  74. data/lib/chef/provider/package/freebsd/base.rb +1 -1
  75. data/lib/chef/provider/package/freebsd/pkgng.rb +1 -1
  76. data/lib/chef/provider/package/powershell.rb +3 -3
  77. data/lib/chef/provider/package/windows.rb +1 -1
  78. data/lib/chef/provider/package/zypper.rb +1 -1
  79. data/lib/chef/provider/route.rb +186 -184
  80. data/lib/chef/provider/service/arch.rb +2 -2
  81. data/lib/chef/provider/service/freebsd.rb +1 -1
  82. data/lib/chef/provider/service/gentoo.rb +2 -2
  83. data/lib/chef/provider/service/insserv.rb +2 -2
  84. data/lib/chef/provider/service/macosx.rb +2 -2
  85. data/lib/chef/provider/service/openbsd.rb +1 -1
  86. data/lib/chef/provider/service/redhat.rb +2 -2
  87. data/lib/chef/provider/support/yum_repo.erb +10 -3
  88. data/lib/chef/provider/user.rb +17 -20
  89. data/lib/chef/provider/user/aix.rb +23 -24
  90. data/lib/chef/provider/user/dscl.rb +56 -53
  91. data/lib/chef/provider/user/linux.rb +13 -16
  92. data/lib/chef/provider/user/pw.rb +26 -30
  93. data/lib/chef/provider/user/solaris.rb +11 -12
  94. data/lib/chef/provider/user/useradd.rb +20 -22
  95. data/lib/chef/provider/user/windows.rb +19 -22
  96. data/lib/chef/provider_resolver.rb +4 -2
  97. data/lib/chef/providers.rb +1 -0
  98. data/lib/chef/resource.rb +7 -0
  99. data/lib/chef/resource/chocolatey_package.rb +1 -0
  100. data/lib/chef/resource/dnf_package.rb +64 -0
  101. data/lib/chef/resource/file/verification.rb +6 -4
  102. data/lib/chef/resource/yum_package.rb +18 -14
  103. data/lib/chef/resource/yum_repository.rb +1 -1
  104. data/lib/chef/resource_reporter.rb +11 -0
  105. data/lib/chef/resources.rb +1 -0
  106. data/lib/chef/scan_access_control.rb +4 -4
  107. data/lib/chef/util/dsc/resource_store.rb +1 -1
  108. data/lib/chef/version.rb +1 -1
  109. data/lib/chef/win32/memory.rb +1 -1
  110. data/lib/chef/win32/security.rb +2 -2
  111. data/lib/chef/win32/security/sid.rb +2 -2
  112. data/spec/functional/assets/yumrepo/chef_rpm-1.10-1.fc24.i686.rpm +0 -0
  113. data/spec/functional/assets/yumrepo/chef_rpm-1.10-1.fc24.src.rpm +0 -0
  114. data/spec/functional/assets/yumrepo/chef_rpm-1.10-1.fc24.x86_64.rpm +0 -0
  115. data/spec/functional/assets/yumrepo/chef_rpm-1.2-1.fc24.i686.rpm +0 -0
  116. data/spec/functional/assets/yumrepo/chef_rpm-1.2-1.fc24.src.rpm +0 -0
  117. data/spec/functional/assets/yumrepo/chef_rpm-1.2-1.fc24.x86_64.rpm +0 -0
  118. data/spec/functional/assets/yumrepo/repodata/313329137b55fd333b2dc66394a6661a2befa6cc535d8460d92a4a78a9c581f0-primary.sqlite.bz2 +0 -0
  119. data/spec/functional/assets/yumrepo/repodata/31ac4db5d5ac593728fcc26aef82b7b93c4cc4dbec843786b1845b939b658553-other.xml.gz +0 -0
  120. data/spec/functional/assets/yumrepo/repodata/4ac40fa3c6728c1401318e2e20a997436624e83dcf7a5f952b851ef422637773-filelists.sqlite.bz2 +0 -0
  121. data/spec/functional/assets/yumrepo/repodata/66391e53f0510b98b3f0b79f40ba1048026d9a1ef20905d9c40ba6f5411f3243-primary.xml.gz +0 -0
  122. data/spec/functional/assets/yumrepo/repodata/8b34697595fcc87928e12d24644dda9462c3857bd932861e28bc77ae1f31be16-filelists.xml.gz +0 -0
  123. data/spec/functional/assets/yumrepo/repodata/b97cca3fe14bcf06c52be4449b6108f7731239ff221111dcce8aada5467f60dc-other.sqlite.bz2 +0 -0
  124. data/spec/functional/assets/yumrepo/repodata/repomd.xml +55 -0
  125. data/spec/functional/resource/dnf_package_spec.rb +686 -0
  126. data/spec/functional/resource/dsc_script_spec.rb +1 -0
  127. data/spec/functional/resource/user/useradd_spec.rb +10 -1
  128. data/spec/integration/knife/chef_repo_path_spec.rb +2 -2
  129. data/spec/integration/recipes/recipe_dsl_spec.rb +3 -0
  130. data/spec/integration/recipes/resource_load_spec.rb +3 -3
  131. data/spec/spec_helper.rb +5 -3
  132. data/spec/support/lib/chef/provider/snakeoil.rb +1 -0
  133. data/spec/support/lib/chef/resource/cat.rb +1 -0
  134. data/spec/support/lib/chef/resource/one_two_three_four.rb +1 -0
  135. data/spec/support/lib/chef/resource/openldap_includer.rb +2 -0
  136. data/spec/support/lib/chef/resource/with_state.rb +2 -0
  137. data/spec/support/lib/chef/resource/zen_master.rb +1 -0
  138. data/spec/unit/cookbook/metadata_spec.rb +3 -3
  139. data/spec/unit/data_collector/messages/helpers_spec.rb +7 -0
  140. data/spec/unit/data_collector_spec.rb +56 -0
  141. data/spec/unit/decorator/lazy_spec.rb +1 -1
  142. data/spec/unit/environment_spec.rb +1 -1
  143. data/spec/unit/lwrp_spec.rb +3 -4
  144. data/spec/unit/node_spec.rb +23 -2
  145. data/spec/unit/platform_spec.rb +1 -0
  146. data/spec/unit/provider/group/dscl_spec.rb +29 -29
  147. data/spec/unit/provider/group/gpasswd_spec.rb +10 -10
  148. data/spec/unit/provider/group/groupadd_spec.rb +31 -30
  149. data/spec/unit/provider/group/groupmod_spec.rb +16 -16
  150. data/spec/unit/provider/group/pw_spec.rb +11 -11
  151. data/spec/unit/provider/group/suse_spec.rb +5 -5
  152. data/spec/unit/provider/group/usermod_spec.rb +15 -15
  153. data/spec/unit/provider/ifconfig/aix_spec.rb +14 -14
  154. data/spec/unit/provider/ifconfig/debian_spec.rb +10 -22
  155. data/spec/unit/provider/ifconfig/redhat_spec.rb +4 -4
  156. data/spec/unit/provider/ifconfig_spec.rb +18 -19
  157. data/spec/unit/provider/package/chocolatey_spec.rb +21 -21
  158. data/spec/unit/provider/package/msu_spec.rb +1 -1
  159. data/spec/unit/provider/route_spec.rb +21 -21
  160. data/spec/unit/provider/user/dscl_spec.rb +54 -57
  161. data/spec/unit/provider/user/linux_spec.rb +5 -5
  162. data/spec/unit/provider/user/pw_spec.rb +26 -22
  163. data/spec/unit/provider/user/windows_spec.rb +4 -4
  164. data/spec/unit/provider/user_spec.rb +19 -21
  165. data/spec/unit/provider_resolver_spec.rb +1 -0
  166. data/spec/unit/resource/chocolatey_package_spec.rb +12 -0
  167. data/spec/unit/resource/dnf_package_spec.rb +99 -0
  168. data/spec/unit/resource/remote_file_spec.rb +2 -2
  169. data/spec/unit/resource/yum_package_spec.rb +20 -0
  170. data/spec/unit/resource_reporter_spec.rb +24 -0
  171. data/spec/unit/resource_spec.rb +2 -0
  172. data/spec/unit/runner_spec.rb +1 -0
  173. data/tasks/bin/bundle-platform +1 -1
  174. data/tasks/gemfile_util.rb +2 -2
  175. data/tasks/templates/prerelease.md.erb +1 -10
  176. data/tasks/templates/release.md.erb +1 -9
  177. metadata +24 -5
  178. data/lib/chef/platform/handler_map.rb +0 -40
@@ -17,7 +17,6 @@
17
17
  #
18
18
 
19
19
  require "chef/provider/group/groupadd"
20
- require "chef/mixin/shell_out"
21
20
 
22
21
  class Chef
23
22
  class Provider
@@ -33,48 +32,42 @@ class Chef
33
32
  end
34
33
 
35
34
  def create_group
36
- command = "mkgroup"
37
- command << set_options << " #{@new_resource.group_name}"
38
- run_command(:command => command)
35
+ shell_out_compact!("mkgroup", set_options, new_resource.group_name)
39
36
  modify_group_members
40
37
  end
41
38
 
42
39
  def manage_group
43
- command = "chgroup"
44
40
  options = set_options
45
- #Usage: chgroup [-R load_module] "attr=value" ... group
46
41
  if options.size > 0
47
- command << options << " #{@new_resource.group_name}"
48
- run_command(:command => command)
42
+ shell_out_compact!("chgroup", options, new_resource.group_name)
49
43
  end
50
44
  modify_group_members
51
45
  end
52
46
 
53
47
  def remove_group
54
- run_command(:command => "rmgroup #{@new_resource.group_name}")
48
+ shell_out_compact!("rmgroup", new_resource.group_name)
55
49
  end
56
50
 
57
51
  def add_member(member)
58
- shell_out!("chgrpmem -m + #{member} #{@new_resource.group_name}")
52
+ shell_out_compact!("chgrpmem", "-m", "+", member, new_resource.group_name)
59
53
  end
60
54
 
61
55
  def set_members(members)
62
56
  return if members.empty?
63
- shell_out!("chgrpmem -m = #{members.join(',')} #{@new_resource.group_name}")
57
+ shell_out_compact!("chgrpmem", "-m", "=", members.join(","), new_resource.group_name)
64
58
  end
65
59
 
66
60
  def remove_member(member)
67
- shell_out!("chgrpmem -m - #{member} #{@new_resource.group_name}")
61
+ shell_out_compact!("chgrpmem", "-m", "-", member, new_resource.group_name)
68
62
  end
69
63
 
70
64
  def set_options
71
- opts = ""
72
- { :gid => "id" }.sort { |a, b| a[0] <=> b[0] }.each do |field, option|
73
- if @current_resource.send(field) != @new_resource.send(field)
74
- if @new_resource.send(field)
75
- Chef::Log.debug("#{@new_resource} setting #{field} to #{@new_resource.send(field)}")
76
- opts << " '#{option}=#{@new_resource.send(field)}'"
77
- end
65
+ opts = []
66
+ { gid: "id" }.sort { |a, b| a[0] <=> b[0] }.each do |field, option|
67
+ next unless current_resource.send(field) != new_resource.send(field)
68
+ if new_resource.send(field)
69
+ Chef::Log.debug("#{new_resource} setting #{field} to #{new_resource.send(field)}")
70
+ opts << "#{option}=#{new_resource.send(field)}"
78
71
  end
79
72
  end
80
73
  opts
@@ -24,12 +24,15 @@ class Chef
24
24
  provides :group, os: "darwin"
25
25
 
26
26
  def dscl(*args)
27
- host = "."
28
- stdout_result = ""; stderr_result = ""; cmd = "dscl #{host} -#{args.join(' ')}"
29
- status = shell_out(cmd)
27
+ argdup = args.dup
28
+ cmd = argdup.shift
29
+ shellcmd = [ "dscl", ".", "-#{cmd}", argdup ]
30
+ status = shell_out_compact(shellcmd)
31
+ stdout_result = ""
32
+ stderr_result = ""
30
33
  status.stdout.each_line { |line| stdout_result << line }
31
34
  status.stderr.each_line { |line| stderr_result << line }
32
- return [cmd, status, stdout_result, stderr_result]
35
+ [shellcmd.flatten.compact.join(" "), status, stdout_result, stderr_result]
33
36
  end
34
37
 
35
38
  def safe_dscl(*args)
@@ -37,18 +40,18 @@ class Chef
37
40
  return "" if ( args.first =~ /^delete/ ) && ( result[1].exitstatus != 0 )
38
41
  raise(Chef::Exceptions::Group, "dscl error: #{result.inspect}") unless result[1].exitstatus == 0
39
42
  raise(Chef::Exceptions::Group, "dscl error: #{result.inspect}") if result[2] =~ /No such key: /
40
- return result[2]
43
+ result[2]
41
44
  end
42
45
 
43
46
  def load_current_resource
44
- @current_resource = Chef::Resource::Group.new(@new_resource.name)
45
- @current_resource.group_name(@new_resource.group_name)
47
+ @current_resource = Chef::Resource::Group.new(new_resource.name)
48
+ current_resource.group_name(new_resource.group_name)
46
49
  group_info = nil
47
50
  begin
48
- group_info = safe_dscl("read /Groups/#{@new_resource.group_name}")
51
+ group_info = safe_dscl("read", "/Groups/#{new_resource.group_name}")
49
52
  rescue Chef::Exceptions::Group
50
53
  @group_exists = false
51
- Chef::Log.debug("#{@new_resource} group does not exist")
54
+ Chef::Log.debug("#{new_resource} group does not exist")
52
55
  end
53
56
 
54
57
  if group_info
@@ -57,21 +60,21 @@ class Chef
57
60
  val.strip! if val
58
61
  case key.downcase
59
62
  when "primarygroupid"
60
- @new_resource.gid(val) unless @new_resource.gid
61
- @current_resource.gid(val)
63
+ new_resource.gid(val) unless new_resource.gid
64
+ current_resource.gid(val)
62
65
  when "groupmembership"
63
- @current_resource.members(val.split(" "))
66
+ current_resource.members(val.split(" "))
64
67
  end
65
68
  end
66
69
  end
67
70
 
68
- @current_resource
71
+ current_resource
69
72
  end
70
73
 
71
74
  # get a free GID greater than 200
72
75
  def get_free_gid(search_limit = 1000)
73
76
  gid = nil; next_gid_guess = 200
74
- groups_gids = safe_dscl("list /Groups gid")
77
+ groups_gids = safe_dscl("list", "/Groups", "gid")
75
78
  while next_gid_guess < search_limit + 200
76
79
  if groups_gids =~ Regexp.new("#{Regexp.escape(next_gid_guess.to_s)}\n")
77
80
  next_gid_guess += 1
@@ -80,51 +83,51 @@ class Chef
80
83
  break
81
84
  end
82
85
  end
83
- return gid || raise("gid not found. Exhausted. Searched #{search_limit} times")
86
+ gid || raise("gid not found. Exhausted. Searched #{search_limit} times")
84
87
  end
85
88
 
86
89
  def gid_used?(gid)
87
90
  return false unless gid
88
- groups_gids = safe_dscl("list /Groups gid")
89
- !! ( groups_gids =~ Regexp.new("#{Regexp.escape(gid.to_s)}\n") )
91
+ groups_gids = safe_dscl("list", "/Groups", "gid")
92
+ !!( groups_gids =~ Regexp.new("#{Regexp.escape(gid.to_s)}\n") )
90
93
  end
91
94
 
92
95
  def set_gid
93
- @new_resource.gid(get_free_gid) if [nil, ""].include? @new_resource.gid
94
- raise(Chef::Exceptions::Group, "gid is already in use") if gid_used?(@new_resource.gid)
95
- safe_dscl("create /Groups/#{@new_resource.group_name} PrimaryGroupID #{@new_resource.gid}")
96
+ new_resource.gid(get_free_gid) if [nil, ""].include? new_resource.gid
97
+ raise(Chef::Exceptions::Group, "gid is already in use") if gid_used?(new_resource.gid)
98
+ safe_dscl("create", "/Groups/#{new_resource.group_name}", "PrimaryGroupID", new_resource.gid)
96
99
  end
97
100
 
98
101
  def set_members
99
102
  # First reset the memberships if the append is not set
100
- unless @new_resource.append
101
- Chef::Log.debug("#{@new_resource} removing group members #{@current_resource.members.join(' ')}") unless @current_resource.members.empty?
102
- safe_dscl("create /Groups/#{@new_resource.group_name} GroupMembers ''") # clear guid list
103
- safe_dscl("create /Groups/#{@new_resource.group_name} GroupMembership ''") # clear user list
104
- @current_resource.members([ ])
103
+ unless new_resource.append
104
+ Chef::Log.debug("#{new_resource} removing group members #{current_resource.members.join(' ')}") unless current_resource.members.empty?
105
+ safe_dscl("create", "/Groups/#{new_resource.group_name}", "GroupMembers", "") # clear guid list
106
+ safe_dscl("create", "/Groups/#{new_resource.group_name}", "GroupMembership", "") # clear user list
107
+ current_resource.members([ ])
105
108
  end
106
109
 
107
110
  # Add any members that need to be added
108
- if @new_resource.members && !@new_resource.members.empty?
111
+ if new_resource.members && !new_resource.members.empty?
109
112
  members_to_be_added = [ ]
110
- @new_resource.members.each do |member|
111
- members_to_be_added << member if !@current_resource.members.include?(member)
113
+ new_resource.members.each do |member|
114
+ members_to_be_added << member unless current_resource.members.include?(member)
112
115
  end
113
116
  unless members_to_be_added.empty?
114
- Chef::Log.debug("#{@new_resource} setting group members #{members_to_be_added.join(', ')}")
115
- safe_dscl("append /Groups/#{@new_resource.group_name} GroupMembership #{members_to_be_added.join(' ')}")
117
+ Chef::Log.debug("#{new_resource} setting group members #{members_to_be_added.join(', ')}")
118
+ safe_dscl("append", "/Groups/#{new_resource.group_name}", "GroupMembership", *members_to_be_added)
116
119
  end
117
120
  end
118
121
 
119
122
  # Remove any members that need to be removed
120
- if @new_resource.excluded_members && !@new_resource.excluded_members.empty?
123
+ if new_resource.excluded_members && !new_resource.excluded_members.empty?
121
124
  members_to_be_removed = [ ]
122
- @new_resource.excluded_members.each do |member|
123
- members_to_be_removed << member if @current_resource.members.include?(member)
125
+ new_resource.excluded_members.each do |member|
126
+ members_to_be_removed << member if current_resource.members.include?(member)
124
127
  end
125
128
  unless members_to_be_removed.empty?
126
- Chef::Log.debug("#{@new_resource} removing group members #{members_to_be_removed.join(', ')}")
127
- safe_dscl("delete /Groups/#{@new_resource.group_name} GroupMembership #{members_to_be_removed.join(' ')}")
129
+ Chef::Log.debug("#{new_resource} removing group members #{members_to_be_removed.join(', ')}")
130
+ safe_dscl("delete", "/Groups/#{new_resource.group_name}", "GroupMembership", *members_to_be_removed)
128
131
  end
129
132
  end
130
133
  end
@@ -132,8 +135,8 @@ class Chef
132
135
  def define_resource_requirements
133
136
  super
134
137
  requirements.assert(:all_actions) do |a|
135
- a.assertion { ::File.exists?("/usr/bin/dscl") }
136
- a.failure_message Chef::Exceptions::Group, "Could not find binary /usr/bin/dscl for #{@new_resource.name}"
138
+ a.assertion { ::File.exist?("/usr/bin/dscl") }
139
+ a.failure_message Chef::Exceptions::Group, "Could not find binary /usr/bin/dscl for #{new_resource.name}"
137
140
  # No whyrun alternative: this component should be available in the base install of any given system that uses it
138
141
  end
139
142
  end
@@ -145,24 +148,24 @@ class Chef
145
148
  end
146
149
 
147
150
  def manage_group
148
- if @new_resource.group_name && (@current_resource.group_name != @new_resource.group_name)
151
+ if new_resource.group_name && (current_resource.group_name != new_resource.group_name)
149
152
  dscl_create_group
150
153
  end
151
- if @new_resource.gid && (@current_resource.gid != @new_resource.gid)
154
+ if new_resource.gid && (current_resource.gid != new_resource.gid)
152
155
  set_gid
153
156
  end
154
- if @new_resource.members || @new_resource.excluded_members
157
+ if new_resource.members || new_resource.excluded_members
155
158
  set_members
156
159
  end
157
160
  end
158
161
 
159
162
  def dscl_create_group
160
- safe_dscl("create /Groups/#{@new_resource.group_name}")
161
- safe_dscl("create /Groups/#{@new_resource.group_name} Password '*'")
163
+ safe_dscl("create", "/Groups/#{new_resource.group_name}")
164
+ safe_dscl("create", "/Groups/#{new_resource.group_name}", "Password", "*")
162
165
  end
163
166
 
164
167
  def remove_group
165
- safe_dscl("delete /Groups/#{@new_resource.group_name}")
168
+ safe_dscl("delete", "/Groups/#{new_resource.group_name}")
166
169
  end
167
170
  end
168
171
  end
@@ -31,26 +31,26 @@ class Chef
31
31
  def define_resource_requirements
32
32
  super
33
33
  requirements.assert(:all_actions) do |a|
34
- a.assertion { ::File.exists?("/usr/bin/gpasswd") }
35
- a.failure_message Chef::Exceptions::Group, "Could not find binary /usr/bin/gpasswd for #{@new_resource}"
34
+ a.assertion { ::File.exist?("/usr/bin/gpasswd") }
35
+ a.failure_message Chef::Exceptions::Group, "Could not find binary /usr/bin/gpasswd for #{new_resource}"
36
36
  # No whyrun alternative: this component should be available in the base install of any given system that uses it
37
37
  end
38
38
  end
39
39
 
40
40
  def set_members(members)
41
- unless members.empty?
42
- shell_out!("gpasswd -M #{members.join(',')} #{@new_resource.group_name}")
41
+ if members.empty?
42
+ shell_out_compact!("gpasswd", "-M", "", new_resource.group_name)
43
43
  else
44
- shell_out!("gpasswd -M \"\" #{@new_resource.group_name}")
44
+ shell_out_compact!("gpasswd", "-M", members.join(","), new_resource.group_name)
45
45
  end
46
46
  end
47
47
 
48
48
  def add_member(member)
49
- shell_out!("gpasswd -a #{member} #{@new_resource.group_name}")
49
+ shell_out_compact!("gpasswd", "-a", member, new_resource.group_name)
50
50
  end
51
51
 
52
52
  def remove_member(member)
53
- shell_out!("gpasswd -d #{member} #{@new_resource.group_name}")
53
+ shell_out_compact!("gpasswd", "-d", member, new_resource.group_name)
54
54
  end
55
55
  end
56
56
  end
@@ -35,8 +35,8 @@ class Chef
35
35
  super
36
36
  required_binaries.each do |required_binary|
37
37
  requirements.assert(:all_actions) do |a|
38
- a.assertion { ::File.exists?(required_binary) }
39
- a.failure_message Chef::Exceptions::Group, "Could not find binary #{required_binary} for #{@new_resource}"
38
+ a.assertion { ::File.exist?(required_binary) }
39
+ a.failure_message Chef::Exceptions::Group, "Could not find binary #{required_binary} for #{new_resource}"
40
40
  # No whyrun alternative: this component should be available in the base install of any given system that uses it
41
41
  end
42
42
  end
@@ -44,54 +44,49 @@ class Chef
44
44
 
45
45
  # Create the group
46
46
  def create_group
47
- command = "groupadd"
48
- command << set_options
49
- command << groupadd_options
50
- run_command(:command => command)
47
+ shell_out_compact!("groupadd", set_options, groupadd_options)
51
48
  modify_group_members
52
49
  end
53
50
 
54
51
  # Manage the group when it already exists
55
52
  def manage_group
56
- command = "groupmod"
57
- command << set_options
58
- run_command(:command => command)
53
+ shell_out_compact!("groupmod", set_options)
59
54
  modify_group_members
60
55
  end
61
56
 
62
57
  # Remove the group
63
58
  def remove_group
64
- run_command(:command => "groupdel #{@new_resource.group_name}")
59
+ shell_out_compact!("groupdel", new_resource.group_name)
65
60
  end
66
61
 
67
62
  def modify_group_members
68
- if @new_resource.append
69
- if @new_resource.members && !@new_resource.members.empty?
63
+ if new_resource.append
64
+ if new_resource.members && !new_resource.members.empty?
70
65
  members_to_be_added = [ ]
71
- @new_resource.members.each do |member|
72
- members_to_be_added << member if !@current_resource.members.include?(member)
66
+ new_resource.members.each do |member|
67
+ members_to_be_added << member unless current_resource.members.include?(member)
73
68
  end
74
69
  members_to_be_added.each do |member|
75
- Chef::Log.debug("#{@new_resource} appending member #{member} to group #{@new_resource.group_name}")
70
+ Chef::Log.debug("#{new_resource} appending member #{member} to group #{new_resource.group_name}")
76
71
  add_member(member)
77
72
  end
78
73
  end
79
74
 
80
- if @new_resource.excluded_members && !@new_resource.excluded_members.empty?
75
+ if new_resource.excluded_members && !new_resource.excluded_members.empty?
81
76
  members_to_be_removed = [ ]
82
- @new_resource.excluded_members.each do |member|
83
- members_to_be_removed << member if @current_resource.members.include?(member)
77
+ new_resource.excluded_members.each do |member|
78
+ members_to_be_removed << member if current_resource.members.include?(member)
84
79
  end
85
80
 
86
81
  members_to_be_removed.each do |member|
87
- Chef::Log.debug("#{@new_resource} removing member #{member} from group #{@new_resource.group_name}")
82
+ Chef::Log.debug("#{new_resource} removing member #{member} from group #{new_resource.group_name}")
88
83
  remove_member(member)
89
84
  end
90
85
  end
91
86
  else
92
- members_description = @new_resource.members.empty? ? "none" : @new_resource.members.join(", ")
93
- Chef::Log.debug("#{@new_resource} setting group members to: #{members_description}")
94
- set_members(@new_resource.members)
87
+ members_description = new_resource.members.empty? ? "none" : new_resource.members.join(", ")
88
+ Chef::Log.debug("#{new_resource} setting group members to: #{members_description}")
89
+ set_members(new_resource.members)
95
90
  end
96
91
  end
97
92
 
@@ -112,23 +107,23 @@ class Chef
112
107
  # ==== Returns
113
108
  # <string>:: A string containing the option and then the quoted value
114
109
  def set_options
115
- opts = ""
116
- { :gid => "-g" }.sort { |a, b| a[0] <=> b[0] }.each do |field, option|
117
- if @current_resource.send(field) != @new_resource.send(field)
118
- if @new_resource.send(field)
119
- opts << " #{option} '#{@new_resource.send(field)}'"
120
- Chef::Log.debug("#{@new_resource} set #{field} to #{@new_resource.send(field)}")
121
- end
122
- end
110
+ opts = []
111
+ { gid: "-g" }.sort { |a, b| a[0] <=> b[0] }.each do |field, option|
112
+ next unless current_resource.send(field) != new_resource.send(field)
113
+ next unless new_resource.send(field)
114
+ opts << option
115
+ opts << new_resource.send(field)
116
+ Chef::Log.debug("#{new_resource} set #{field} to #{new_resource.send(field)}")
123
117
  end
124
- opts << " #{@new_resource.group_name}"
118
+ opts << new_resource.group_name
119
+ opts
125
120
  end
126
121
 
127
122
  def groupadd_options
128
- opts = ""
123
+ opts = []
129
124
  # Solaris doesn't support system groups.
130
- opts << " -r" if @new_resource.system && !node.platform?("solaris2")
131
- opts << " -o" if @new_resource.non_unique
125
+ opts << "-r" if new_resource.system && !node.platform?("solaris2")
126
+ opts << "-o" if new_resource.non_unique
132
127
  opts
133
128
  end
134
129
 
@@ -26,28 +26,26 @@ class Chef
26
26
  def load_current_resource
27
27
  super
28
28
  %w{group user}.each do |binary|
29
- raise Chef::Exceptions::Group, "Could not find binary /usr/sbin/#{binary} for #{@new_resource}" unless ::File.exists?("/usr/sbin/#{binary}")
29
+ raise Chef::Exceptions::Group, "Could not find binary /usr/sbin/#{binary} for #{new_resource}" unless ::File.exist?("/usr/sbin/#{binary}")
30
30
  end
31
31
  end
32
32
 
33
33
  # Create the group
34
34
  def create_group
35
- command = "group add"
36
- command << set_options
37
- shell_out!(command)
35
+ shell_out_compact!("group", "add", set_options)
38
36
 
39
- add_group_members(@new_resource.members)
37
+ add_group_members(new_resource.members)
40
38
  end
41
39
 
42
40
  # Manage the group when it already exists
43
41
  def manage_group
44
- if @new_resource.append
42
+ if new_resource.append
45
43
  members_to_be_added = [ ]
46
- if @new_resource.excluded_members && !@new_resource.excluded_members.empty?
44
+ if new_resource.excluded_members && !new_resource.excluded_members.empty?
47
45
  # First find out if any member needs to be removed
48
46
  members_to_be_removed = [ ]
49
- @new_resource.excluded_members.each do |member|
50
- members_to_be_removed << member if @current_resource.members.include?(member)
47
+ new_resource.excluded_members.each do |member|
48
+ members_to_be_removed << member if current_resource.members.include?(member)
51
49
  end
52
50
 
53
51
  unless members_to_be_removed.empty?
@@ -56,39 +54,39 @@ class Chef
56
54
 
57
55
  # Capture the members we need to add in
58
56
  # members_to_be_added to be added later on.
59
- @current_resource.members.each do |member|
57
+ current_resource.members.each do |member|
60
58
  members_to_be_added << member unless members_to_be_removed.include?(member)
61
59
  end
62
60
  end
63
61
  end
64
62
 
65
- if @new_resource.members && !@new_resource.members.empty?
66
- @new_resource.members.each do |member|
67
- members_to_be_added << member if !@current_resource.members.include?(member)
63
+ if new_resource.members && !new_resource.members.empty?
64
+ new_resource.members.each do |member|
65
+ members_to_be_added << member unless current_resource.members.include?(member)
68
66
  end
69
67
  end
70
68
 
71
- Chef::Log.debug("#{@new_resource} not changing group members, the group has no members to add") if members_to_be_added.empty?
69
+ Chef::Log.debug("#{new_resource} not changing group members, the group has no members to add") if members_to_be_added.empty?
72
70
 
73
71
  add_group_members(members_to_be_added)
74
72
  else
75
73
  # We are resetting the members of a group so use the same trick
76
74
  reset_group_membership
77
- Chef::Log.debug("#{@new_resource} setting group members to: none") if @new_resource.members.empty?
78
- add_group_members(@new_resource.members)
75
+ Chef::Log.debug("#{new_resource} setting group members to: none") if new_resource.members.empty?
76
+ add_group_members(new_resource.members)
79
77
  end
80
78
  end
81
79
 
82
80
  # Remove the group
83
81
  def remove_group
84
- shell_out!("group del #{@new_resource.group_name}")
82
+ shell_out_compact!("group", "del", new_resource.group_name)
85
83
  end
86
84
 
87
85
  # Adds a list of usernames to the group using `user mod`
88
86
  def add_group_members(members)
89
- Chef::Log.debug("#{@new_resource} adding members #{members.join(', ')}") if !members.empty?
87
+ Chef::Log.debug("#{new_resource} adding members #{members.join(', ')}") unless members.empty?
90
88
  members.each do |user|
91
- shell_out!("user mod -G #{@new_resource.group_name} #{user}")
89
+ shell_out_compact!("user", "mod", "-G", new_resource.group_name, user)
92
90
  end
93
91
  end
94
92
 
@@ -96,15 +94,11 @@ class Chef
96
94
  # "<name>_bak", create a new group with the same GID and
97
95
  # "<name>", then set correct members on that group
98
96
  def reset_group_membership
99
- rename = "group mod -n #{@new_resource.group_name}_bak #{@new_resource.group_name}"
100
- shell_out!(rename)
97
+ shell_out_compact!("group", "mod", "-n", "#{new_resource.group_name}_bak", new_resource.group_name)
101
98
 
102
- create = "group add"
103
- create << set_options(:overwrite_gid => true)
104
- shell_out!(create)
99
+ shell_out_compact!("group", "add", set_options(overwrite_gid: true))
105
100
 
106
- remove = "group del #{@new_resource.group_name}_bak"
107
- shell_out!(remove)
101
+ shell_out_compact!("group", "del", "#{new_resource.group_name}_bak")
108
102
  end
109
103
 
110
104
  # Little bit of magic as per Adam's useradd provider to pull and assign the command line flags
@@ -112,14 +106,15 @@ class Chef
112
106
  # ==== Returns
113
107
  # <string>:: A string containing the option and then the quoted value
114
108
  def set_options(overwrite_gid = false)
115
- opts = ""
116
- if overwrite_gid || @new_resource.gid && (@current_resource.gid != @new_resource.gid)
117
- opts << " -g '#{@new_resource.gid}'"
109
+ opts = []
110
+ if overwrite_gid || new_resource.gid && (current_resource.gid != new_resource.gid)
111
+ opts << "-g"
112
+ opts << new_resource.gid
118
113
  end
119
114
  if overwrite_gid
120
- opts << " -o"
115
+ opts << "-o"
121
116
  end
122
- opts << " #{@new_resource.group_name}"
117
+ opts << new_resource.group_name
123
118
  opts
124
119
  end
125
120
  end