chef 15.11.3-universal-mingw32 → 15.15.0-universal-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +7 -9
  3. data/README.md +3 -3
  4. data/chef-universal-mingw32.gemspec +2 -2
  5. data/chef.gemspec +12 -3
  6. data/distro/powershell/chef/chef.psm1 +3 -3
  7. data/distro/templates/powershell/chef/chef.psm1.erb +3 -3
  8. data/lib/chef/api_client/registration.rb +2 -2
  9. data/lib/chef/application/apply.rb +1 -1
  10. data/lib/chef/chef_fs/file_system/repository/base_file.rb +1 -0
  11. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir.rb +2 -2
  12. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_entry.rb +1 -1
  13. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_root_dir.rb +2 -2
  14. data/lib/chef/chef_fs/file_system/repository/directory.rb +1 -1
  15. data/lib/chef/chef_fs/file_system/repository/file_system_entry.rb +1 -1
  16. data/lib/chef/chef_fs/path_utils.rb +3 -3
  17. data/lib/chef/cookbook/file_system_file_vendor.rb +1 -1
  18. data/lib/chef/data_bag.rb +2 -2
  19. data/lib/chef/data_collector/error_handlers.rb +1 -1
  20. data/lib/chef/deprecated.rb +12 -0
  21. data/lib/chef/dsl/declare_resource.rb +1 -1
  22. data/lib/chef/dsl/platform_introspection.rb +2 -0
  23. data/lib/chef/environment.rb +2 -2
  24. data/lib/chef/exceptions.rb +3 -0
  25. data/lib/chef/http.rb +2 -1
  26. data/lib/chef/knife/bootstrap.rb +8 -10
  27. data/lib/chef/knife/bootstrap/templates/chef-full.erb +9 -9
  28. data/lib/chef/knife/bootstrap/train_connector.rb +1 -0
  29. data/lib/chef/knife/cookbook_download.rb +1 -1
  30. data/lib/chef/knife/cookbook_metadata.rb +1 -1
  31. data/lib/chef/knife/core/gem_glob_loader.rb +1 -1
  32. data/lib/chef/knife/core/hashed_command_loader.rb +3 -2
  33. data/lib/chef/knife/core/subcommand_loader.rb +1 -1
  34. data/lib/chef/knife/exec.rb +2 -2
  35. data/lib/chef/knife/ssh.rb +20 -1
  36. data/lib/chef/log.rb +1 -1
  37. data/lib/chef/mixin/openssl_helper.rb +26 -3
  38. data/lib/chef/mixin/template.rb +1 -0
  39. data/lib/chef/node_map.rb +5 -2
  40. data/lib/chef/provider/mount/solaris.rb +0 -1
  41. data/lib/chef/provider/package/cab.rb +1 -1
  42. data/lib/chef/provider/package/chocolatey.rb +1 -1
  43. data/lib/chef/provider/package/msu.rb +1 -0
  44. data/lib/chef/provider/package/powershell.rb +5 -1
  45. data/lib/chef/provider/package/snap.rb +96 -27
  46. data/lib/chef/provider/package/zypper.rb +0 -1
  47. data/lib/chef/provider/service/arch.rb +2 -2
  48. data/lib/chef/provider/service/debian.rb +1 -1
  49. data/lib/chef/provider/service/gentoo.rb +2 -2
  50. data/lib/chef/provider/service/macosx.rb +2 -2
  51. data/lib/chef/provider/service/openbsd.rb +1 -1
  52. data/lib/chef/provider/service/redhat.rb +2 -2
  53. data/lib/chef/provider/service/upstart.rb +1 -1
  54. data/lib/chef/provider/yum_repository.rb +1 -1
  55. data/lib/chef/provider/zypper_repository.rb +31 -11
  56. data/lib/chef/resource.rb +2 -0
  57. data/lib/chef/resource/archive_file.rb +28 -8
  58. data/lib/chef/resource/cron_access.rb +13 -5
  59. data/lib/chef/resource/cron_d.rb +2 -1
  60. data/lib/chef/resource/homebrew_cask.rb +3 -3
  61. data/lib/chef/resource/hostname.rb +19 -18
  62. data/lib/chef/resource/locale.rb +1 -1
  63. data/lib/chef/resource/lwrp_base.rb +7 -0
  64. data/lib/chef/resource/msu_package.rb +5 -0
  65. data/lib/chef/resource/ssh_known_hosts_entry.rb +1 -1
  66. data/lib/chef/resource/sudo.rb +2 -2
  67. data/lib/chef/resource/windows_feature_powershell.rb +6 -2
  68. data/lib/chef/resource/windows_font.rb +2 -1
  69. data/lib/chef/role.rb +2 -2
  70. data/lib/chef/shell.rb +1 -1
  71. data/lib/chef/shell/shell_session.rb +2 -0
  72. data/lib/chef/util/diff.rb +1 -1
  73. data/lib/chef/util/powershell/cmdlet.rb +1 -1
  74. data/lib/chef/version.rb +2 -2
  75. data/lib/chef/win32/file.rb +2 -2
  76. data/spec/functional/knife/ssh_spec.rb +4 -4
  77. data/spec/functional/resource/aix_service_spec.rb +0 -1
  78. data/spec/functional/resource/aixinit_service_spec.rb +7 -8
  79. data/spec/functional/resource/apt_package_spec.rb +0 -1
  80. data/spec/functional/resource/bff_spec.rb +2 -2
  81. data/spec/functional/resource/cookbook_file_spec.rb +1 -1
  82. data/spec/functional/resource/cron_spec.rb +0 -1
  83. data/spec/functional/resource/dsc_resource_spec.rb +1 -1
  84. data/spec/functional/resource/insserv_spec.rb +4 -5
  85. data/spec/functional/resource/link_spec.rb +17 -17
  86. data/spec/functional/resource/msu_package_spec.rb +5 -2
  87. data/spec/functional/resource/rpm_spec.rb +2 -2
  88. data/spec/functional/resource/user/dscl_spec.rb +1 -1
  89. data/spec/functional/resource/user/mac_user_spec.rb +1 -1
  90. data/spec/functional/resource/windows_certificate_spec.rb +3 -3
  91. data/spec/functional/resource/windows_font_spec.rb +49 -0
  92. data/spec/functional/resource/windows_task_spec.rb +8 -8
  93. data/spec/functional/run_lock_spec.rb +2 -1
  94. data/spec/functional/shell_spec.rb +5 -5
  95. data/spec/functional/util/powershell/cmdlet_spec.rb +1 -1
  96. data/spec/functional/version_spec.rb +1 -1
  97. data/spec/functional/win32/service_manager_spec.rb +1 -1
  98. data/spec/integration/recipes/accumulator_spec.rb +1 -1
  99. data/spec/integration/recipes/lwrp_inline_resources_spec.rb +2 -2
  100. data/spec/integration/recipes/lwrp_spec.rb +1 -1
  101. data/spec/integration/recipes/notifies_spec.rb +1 -1
  102. data/spec/integration/recipes/notifying_block_spec.rb +1 -1
  103. data/spec/integration/recipes/recipe_dsl_spec.rb +1 -1
  104. data/spec/integration/recipes/resource_converge_if_changed_spec.rb +2 -0
  105. data/spec/integration/recipes/resource_load_spec.rb +1 -0
  106. data/spec/integration/recipes/unified_mode_spec.rb +1 -1
  107. data/spec/scripts/ssl-serve.rb +1 -1
  108. data/spec/spec_helper.rb +26 -8
  109. data/spec/support/chef_helpers.rb +1 -1
  110. data/spec/support/platform_helpers.rb +12 -42
  111. data/spec/support/platforms/win32/spec_service.rb +1 -1
  112. data/spec/support/shared/functional/directory_resource.rb +1 -1
  113. data/spec/support/shared/functional/execute_resource.rb +1 -1
  114. data/spec/support/shared/functional/file_resource.rb +2 -2
  115. data/spec/support/shared/functional/win32_service.rb +1 -1
  116. data/spec/support/shared/functional/windows_script.rb +3 -3
  117. data/spec/support/shared/integration/knife_support.rb +2 -5
  118. data/spec/unit/application_spec.rb +7 -0
  119. data/spec/unit/chef_fs/file_system/operation_failed_error_spec.rb +2 -4
  120. data/spec/unit/cookbook/gem_installer_spec.rb +2 -1
  121. data/spec/unit/data_bag_spec.rb +1 -1
  122. data/spec/unit/data_collector_spec.rb +1 -1
  123. data/spec/unit/dsl/platform_introspection_spec.rb +1 -0
  124. data/spec/unit/environment_spec.rb +7 -7
  125. data/spec/unit/event_dispatch/dispatcher_spec.rb +3 -0
  126. data/spec/unit/file_access_control_spec.rb +1 -1
  127. data/spec/unit/json_compat_spec.rb +1 -1
  128. data/spec/unit/knife/bootstrap_spec.rb +16 -16
  129. data/spec/unit/knife/cookbook_download_spec.rb +4 -4
  130. data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +1 -1
  131. data/spec/unit/knife/cookbook_upload_spec.rb +5 -6
  132. data/spec/unit/knife/core/hashed_command_loader_spec.rb +3 -3
  133. data/spec/unit/knife/ssh_spec.rb +2 -2
  134. data/spec/unit/knife/supermarket_share_spec.rb +1 -1
  135. data/spec/unit/lwrp_spec.rb +4 -4
  136. data/spec/unit/mixin/securable_spec.rb +0 -1
  137. data/spec/unit/mixin/user_context_spec.rb +1 -9
  138. data/spec/unit/property_spec.rb +6 -6
  139. data/spec/unit/provider/apt_repository_spec.rb +2 -2
  140. data/spec/unit/provider/package/dnf/python_helper_spec.rb +1 -1
  141. data/spec/unit/provider/package/powershell_spec.rb +95 -86
  142. data/spec/unit/provider/package/rubygems_spec.rb +5 -10
  143. data/spec/unit/provider/package/snap_spec.rb +1 -1
  144. data/spec/unit/provider/package/windows_spec.rb +30 -53
  145. data/spec/unit/provider/service/arch_service_spec.rb +3 -2
  146. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  147. data/spec/unit/provider/service/gentoo_service_spec.rb +7 -7
  148. data/spec/unit/provider/service/macosx_spec.rb +3 -3
  149. data/spec/unit/provider/service/redhat_spec.rb +2 -2
  150. data/spec/unit/provider/service/upstart_service_spec.rb +3 -3
  151. data/spec/unit/provider/service/windows_spec.rb +2 -6
  152. data/spec/unit/provider/systemd_unit_spec.rb +28 -24
  153. data/spec/unit/provider/zypper_repository_spec.rb +75 -25
  154. data/spec/unit/provider_spec.rb +1 -0
  155. data/spec/unit/resource/archive_file_spec.rb +11 -2
  156. data/spec/unit/resource/msu_package_spec.rb +4 -0
  157. data/spec/unit/resource/windows_dns_record_spec.rb +3 -3
  158. data/spec/unit/resource/windows_dns_zone_spec.rb +2 -2
  159. data/spec/unit/resource/windows_feature_powershell_spec.rb +30 -4
  160. data/spec/unit/resource/windows_package_spec.rb +1 -0
  161. data/spec/unit/resource/windows_task_spec.rb +1 -1
  162. data/spec/unit/resource/windows_uac_spec.rb +2 -2
  163. data/spec/unit/resource/yum_repository_spec.rb +21 -21
  164. data/spec/unit/resource_reporter_spec.rb +1 -1
  165. data/spec/unit/resource_spec.rb +1 -1
  166. data/spec/unit/role_spec.rb +11 -11
  167. data/spec/unit/run_context/cookbook_compiler_spec.rb +1 -1
  168. data/spec/unit/run_lock_spec.rb +1 -1
  169. data/spec/unit/scan_access_control_spec.rb +1 -1
  170. data/spec/unit/util/threaded_job_queue_spec.rb +9 -0
  171. data/spec/unit/win32/security_spec.rb +4 -3
  172. data/tasks/rspec.rb +5 -13
  173. metadata +38 -19
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  #
3
2
  # Authors:: Adam Jacob (<adam@chef.io>)
4
3
  # Ionuț Arțăriși (<iartarisi@suse.cz>)
@@ -32,8 +32,8 @@ class Chef::Provider::Service::Arch < Chef::Provider::Service::Init
32
32
  end
33
33
 
34
34
  def load_current_resource
35
- raise Chef::Exceptions::Service, "Could not find /etc/rc.conf" unless ::File.exists?("/etc/rc.conf")
36
- raise Chef::Exceptions::Service, "No DAEMONS found in /etc/rc.conf" unless ::File.read("/etc/rc.conf") =~ /DAEMONS=\((.*)\)/m
35
+ raise Chef::Exceptions::Service, "Could not find /etc/rc.conf" unless ::File.exist?("/etc/rc.conf")
36
+ raise Chef::Exceptions::Service, "No DAEMONS found in /etc/rc.conf" unless /DAEMONS=\((.*)\)/m.match?(::File.read("/etc/rc.conf"))
37
37
 
38
38
  super
39
39
 
@@ -45,7 +45,7 @@ class Chef
45
45
  shared_resource_requirements
46
46
  requirements.assert(:all_actions) do |a|
47
47
  update_rcd = "/usr/sbin/update-rc.d"
48
- a.assertion { ::File.exists? update_rcd }
48
+ a.assertion { ::File.exist? update_rcd }
49
49
  a.failure_message Chef::Exceptions::Service, "#{update_rcd} does not exist!"
50
50
  # no whyrun recovery - this is a base system component of debian
51
51
  # distros and must be present
@@ -34,7 +34,7 @@ class Chef::Provider::Service::Gentoo < Chef::Provider::Service::Init
34
34
  @current_resource.enabled(
35
35
  Dir.glob("/etc/runlevels/**/#{Chef::Util::PathHelper.escape_glob_dir(@current_resource.service_name)}").any? do |file|
36
36
  @found_script = true
37
- exists = ::File.exists? file
37
+ exists = ::File.exist? file
38
38
  readable = ::File.readable? file
39
39
  logger.trace "#{@new_resource} exists: #{exists}, readable: #{readable}"
40
40
  exists && readable
@@ -47,7 +47,7 @@ class Chef::Provider::Service::Gentoo < Chef::Provider::Service::Init
47
47
 
48
48
  def define_resource_requirements
49
49
  requirements.assert(:all_actions) do |a|
50
- a.assertion { ::File.exists?("/sbin/rc-update") }
50
+ a.assertion { ::File.exist?("/sbin/rc-update") }
51
51
  a.failure_message Chef::Exceptions::Service, "/sbin/rc-update does not exist"
52
52
  # no whyrun recovery -t his is a core component whose presence is
53
53
  # unlikely to be affected by what we do in the course of a chef run
@@ -84,7 +84,7 @@ class Chef
84
84
  end
85
85
 
86
86
  requirements.assert(:all_actions) do |a|
87
- a.assertion { ::File.exists?(@plist.to_s) }
87
+ a.assertion { ::File.exist?(@plist.to_s) }
88
88
  a.failure_message Chef::Exceptions::Service,
89
89
  "Could not find plist for #{@new_resource}"
90
90
  end
@@ -215,7 +215,7 @@ class Chef
215
215
  return nil if @plist.nil?
216
216
 
217
217
  # Plist must exist by this point
218
- raise Chef::Exceptions::FileNotFound, "Cannot find #{@plist}!" unless ::File.exists?(@plist)
218
+ raise Chef::Exceptions::FileNotFound, "Cannot find #{@plist}!" unless ::File.exist?(@plist)
219
219
 
220
220
  # Most services have the same internal label as the name of the
221
221
  # plist file. However, there is no rule saying that *has* to be
@@ -132,7 +132,7 @@ class Chef
132
132
  end
133
133
 
134
134
  def update_rcl(value)
135
- FileUtils.touch RC_CONF_LOCAL_PATH unless ::File.exists? RC_CONF_LOCAL_PATH
135
+ FileUtils.touch RC_CONF_LOCAL_PATH unless ::File.exist? RC_CONF_LOCAL_PATH
136
136
  ::File.write(RC_CONF_LOCAL_PATH, value)
137
137
  @rc_conf_local = value
138
138
  end
@@ -56,7 +56,7 @@ class Chef
56
56
 
57
57
  requirements.assert(:all_actions) do |a|
58
58
  chkconfig_file = "/sbin/chkconfig"
59
- a.assertion { ::File.exists? chkconfig_file }
59
+ a.assertion { ::File.exist? chkconfig_file }
60
60
  a.failure_message Chef::Exceptions::Service, "#{chkconfig_file} does not exist!"
61
61
  end
62
62
 
@@ -80,7 +80,7 @@ class Chef
80
80
 
81
81
  super
82
82
 
83
- if ::File.exists?("/sbin/chkconfig")
83
+ if ::File.exist?("/sbin/chkconfig")
84
84
  chkconfig = shell_out!("/sbin/chkconfig --list #{current_resource.service_name}", returns: [0, 1])
85
85
  unless run_levels.nil? || run_levels.empty?
86
86
  all_levels_match = true
@@ -135,7 +135,7 @@ class Chef
135
135
  end
136
136
  end
137
137
  # Get enabled/disabled state by reading job configuration file
138
- if ::File.exists?("#{@upstart_job_dir}/#{@new_resource.service_name}#{@upstart_conf_suffix}")
138
+ if ::File.exist?("#{@upstart_job_dir}/#{@new_resource.service_name}#{@upstart_conf_suffix}")
139
139
  logger.trace("#{@new_resource} found #{@upstart_job_dir}/#{@new_resource.service_name}#{@upstart_conf_suffix}")
140
140
  ::File.open("#{@upstart_job_dir}/#{@new_resource.service_name}#{@upstart_conf_suffix}", "r") do |file|
141
141
  while line = file.gets
@@ -37,7 +37,7 @@ class Chef
37
37
  if template_available?(new_resource.source)
38
38
  source new_resource.source
39
39
  else
40
- source ::File.expand_path("../support/yum_repo.erb", __FILE__)
40
+ source ::File.expand_path("support/yum_repo.erb", __dir__)
41
41
  local true
42
42
  end
43
43
  sensitive new_resource.sensitive
@@ -41,7 +41,7 @@ class Chef
41
41
  if template_available?(new_resource.source)
42
42
  source new_resource.source
43
43
  else
44
- source ::File.expand_path("../support/zypper_repo.erb", __FILE__)
44
+ source ::File.expand_path("support/zypper_repo.erb", __dir__)
45
45
  local true
46
46
  end
47
47
  sensitive new_resource.sensitive
@@ -115,28 +115,48 @@ class Chef
115
115
  end
116
116
  end
117
117
 
118
+ # the version of gpg installed on the system
119
+ #
120
+ # @return [Gem::Version] the version of GPG
121
+ def gpg_version
122
+ so = shell_out!("gpg --version")
123
+ # matches 2.0 and 2.2 versions from SLES 12 and 15: https://rubular.com/r/e6D0WfGK6SXvUp
124
+ version = /gpg \(GnuPG\)\s*(.*)/.match(so.stdout)[1]
125
+ logger.trace("GPG package version is #{version}")
126
+ Gem::Version.new(version)
127
+ end
128
+
118
129
  # is the provided key already installed
119
130
  # @param [String] key_path the path to the key on the local filesystem
120
131
  #
121
132
  # @return [boolean] is the key already known by rpm
122
133
  def key_installed?(key_path)
123
- so = shell_out("rpm -qa gpg-pubkey*")
134
+ so = shell_out("/bin/rpm -qa gpg-pubkey*")
124
135
  # expected output & match: http://rubular.com/r/RdF7EcXEtb
125
- status = /gpg-pubkey-#{key_fingerprint(key_path)}/.match(so.stdout)
136
+ status = /gpg-pubkey-#{short_key_id(key_path)}/.match(so.stdout)
126
137
  logger.trace("GPG key at #{key_path} is known by rpm? #{status ? "true" : "false"}")
127
138
  status
128
139
  end
129
140
 
130
- # extract the gpg key fingerprint from a local file
141
+ # extract the gpg key's short key id from a local file. Learning moment: This 8 hex value ID
142
+ # is sometimes incorrectly called the fingerprint. The fingerprint is the full length value
143
+ # and googling for that will just result in sad times.
144
+ #
131
145
  # @param [String] key_path the path to the key on the local filesystem
132
146
  #
133
- # @return [String] the fingerprint of the key
134
- def key_fingerprint(key_path)
135
- so = shell_out!("gpg --with-fingerprint #{key_path}")
136
- # expected output and match: http://rubular.com/r/BpfMjxySQM
137
- fingerprint = %r{pub\s*\S*/(\S*)}.match(so.stdout)[1].downcase
138
- logger.trace("GPG fingerprint of key at #{key_path} is #{fingerprint}")
139
- fingerprint
147
+ # @return [String] the short key id of the key
148
+ def short_key_id(key_path)
149
+ if gpg_version >= Gem::Version.new("2.2") # SLES 15+
150
+ so = shell_out!("gpg --import-options import-show --dry-run --import --with-colons #{key_path}")
151
+ # expected output and match: https://rubular.com/r/uXWJo3yfkli1qA
152
+ short_key_id = /fpr:*\h*(\h{8}):/.match(so.stdout)[1].downcase
153
+ else # SLES 12 and earlier
154
+ so = shell_out!("gpg --with-fingerprint #{key_path}")
155
+ # expected output and match: http://rubular.com/r/BpfMjxySQM
156
+ short_key_id = %r{pub\s*\S*/(\S*)}.match(so.stdout)[1].downcase
157
+ end
158
+ logger.trace("GPG short key ID of key at #{key_path} is #{short_key_id}")
159
+ short_key_id
140
160
  end
141
161
 
142
162
  # install the provided gpg key
@@ -613,6 +613,7 @@ class Chef
613
613
  # Do NOT use this. It may be removed. It is for internal purposes only.
614
614
  # @api private
615
615
  attr_reader :resource_initializing
616
+
616
617
  def resource_initializing=(value)
617
618
  if value
618
619
  @resource_initializing = true
@@ -863,6 +864,7 @@ class Chef
863
864
  # have.
864
865
  #
865
866
  attr_writer :allowed_actions
867
+
866
868
  def allowed_actions(value = NOT_PASSED)
867
869
  if value != NOT_PASSED
868
870
  self.allowed_actions = value
@@ -19,6 +19,7 @@
19
19
  #
20
20
 
21
21
  require_relative "../resource"
22
+ require "fileutils" unless defined?(FileUtils)
22
23
 
23
24
  class Chef
24
25
  class Resource
@@ -38,6 +39,18 @@ class Chef
38
39
  destination '/srv/files'
39
40
  end
40
41
  ```
42
+
43
+ **Set specific permissions on the extracted files**:
44
+
45
+ ```ruby
46
+ archive_file 'Precompiled.zip' do
47
+ owner 'tsmith'
48
+ group 'staff'
49
+ mode '700'
50
+ path '/tmp/Precompiled.zip'
51
+ destination '/srv/files'
52
+ end
53
+ ```
41
54
  DOC
42
55
 
43
56
  property :path, String,
@@ -52,7 +65,7 @@ class Chef
52
65
  description: "The group of the extracted files."
53
66
 
54
67
  property :mode, [String, Integer],
55
- description: "The mode of the extracted files.",
68
+ description: "The mode of the extracted files. Integer values are deprecated as octal values (ex. 0755) would not be interpreted correctly.",
56
69
  default: "755"
57
70
 
58
71
  property :destination, String,
@@ -71,11 +84,11 @@ class Chef
71
84
  alias_method :extract_options, :options
72
85
  alias_method :extract_to, :destination
73
86
 
74
- require "fileutils" unless defined?(FileUtils)
75
-
76
87
  action :extract do
77
88
  description "Extract and archive file."
78
89
 
90
+ require_libarchive
91
+
79
92
  unless ::File.exist?(new_resource.path)
80
93
  raise Errno::ENOENT, "No archive found at #{new_resource.path}! Cannot continue."
81
94
  end
@@ -84,7 +97,8 @@ class Chef
84
97
  Chef::Log.trace("File or directory does not exist at destination path: #{new_resource.destination}")
85
98
 
86
99
  converge_by("create directory #{new_resource.destination}") do
87
- FileUtils.mkdir_p(new_resource.destination, mode: new_resource.mode.to_i)
100
+ # @todo when we remove the ability for mode to be an int we can remove the .to_s below
101
+ FileUtils.mkdir_p(new_resource.destination, mode: new_resource.mode.to_s.to_i(8))
88
102
  end
89
103
 
90
104
  extract(new_resource.path, new_resource.destination, Array(new_resource.options))
@@ -112,6 +126,16 @@ class Chef
112
126
  end
113
127
 
114
128
  action_class do
129
+ def require_libarchive
130
+ require "ffi-libarchive"
131
+ end
132
+
133
+ def define_resource_requirements
134
+ if new_resource.mode.is_a?(Integer)
135
+ Chef.deprecated(:archive_file_integer_file_mode, "The mode property should be passed to archive_file resources as a String and not an Integer to ensure the value is properly interpreted.")
136
+ end
137
+ end
138
+
115
139
  # This can't be a constant since we might not have required 'ffi-libarchive' yet.
116
140
  def extract_option_map
117
141
  {
@@ -135,8 +159,6 @@ class Chef
135
159
  #
136
160
  # @return [Boolean]
137
161
  def archive_differs_from_disk?(src, dest)
138
- require "ffi-libarchive"
139
-
140
162
  modified = false
141
163
  Dir.chdir(dest) do
142
164
  archive = Archive::Reader.open_filename(src)
@@ -163,8 +185,6 @@ class Chef
163
185
  #
164
186
  # @return [void]
165
187
  def extract(src, dest, options = [])
166
- require "ffi-libarchive"
167
-
168
188
  converge_by("extract #{src} to #{dest}") do
169
189
  flags = [options].flatten.map { |option| extract_option_map[option] }.compact.reduce(:|)
170
190
 
@@ -27,7 +27,7 @@ class Chef
27
27
  provides(:cron_manage) # legacy name @todo in Chef 15 we should { true } this so it wins over the cookbook
28
28
 
29
29
  introduced "14.4"
30
- description "Use the cron_access resource to manage the /etc/cron.allow and /etc/cron.deny files."
30
+ description "Use the **cron_access** resource to manage cron's cron.allow and cron.deny files. Note: This resource previously shipped in the `cron` cookbook as `cron_manage`, which it can still be used as for backwards compatibility with existing Chef Infra Client releases."
31
31
  examples <<~DOC
32
32
  Add the mike user to cron.allow
33
33
  ```ruby
@@ -54,12 +54,19 @@ class Chef
54
54
  description: "An optional property to set the user name if it differs from the resource block's name.",
55
55
  name_property: true
56
56
 
57
+ CRON_PATHS = {
58
+ "aix" => "/var/adm/cron",
59
+ "solaris" => "/etc/cron.d",
60
+ "default" => "/etc",
61
+ }.freeze
62
+
57
63
  action :allow do
58
64
  description "Add the user to the cron.allow file."
65
+ allow_path = ::File.join(value_for_platform_family(CRON_PATHS), "cron.allow")
59
66
 
60
67
  with_run_context :root do
61
- edit_resource(:template, "/etc/cron.allow") do |new_resource|
62
- source ::File.expand_path("../support/cron_access.erb", __FILE__)
68
+ edit_resource(:template, allow_path) do |new_resource|
69
+ source ::File.expand_path("support/cron_access.erb", __dir__)
63
70
  local true
64
71
  mode "0600"
65
72
  variables["users"] ||= []
@@ -72,10 +79,11 @@ class Chef
72
79
 
73
80
  action :deny do
74
81
  description "Add the user to the cron.deny file."
82
+ deny_path = ::File.join(value_for_platform_family(CRON_PATHS), "cron.deny")
75
83
 
76
84
  with_run_context :root do
77
- edit_resource(:template, "/etc/cron.deny") do |new_resource|
78
- source ::File.expand_path("../support/cron_access.erb", __FILE__)
85
+ edit_resource(:template, deny_path) do |new_resource|
86
+ source ::File.expand_path("support/cron_access.erb", __dir__)
79
87
  local true
80
88
  mode "0600"
81
89
  variables["users"] ||= []
@@ -289,9 +289,10 @@ class Chef
289
289
 
290
290
  # @todo this is Chef 12 era cleanup. Someday we should remove it all
291
291
  template "/etc/cron.d/#{sanitized_name}" do
292
- source ::File.expand_path("../support/cron.d.erb", __FILE__)
292
+ source ::File.expand_path("support/cron.d.erb", __dir__)
293
293
  local true
294
294
  mode new_resource.mode
295
+ sensitive new_resource.sensitive
295
296
  variables(
296
297
  name: sanitized_name,
297
298
  predefined_value: new_resource.predefined_value,
@@ -59,7 +59,7 @@ class Chef
59
59
 
60
60
  unless casked?
61
61
  converge_by("install cask #{new_resource.cask_name} #{new_resource.options}") do
62
- shell_out!("#{new_resource.homebrew_path} cask install #{new_resource.cask_name} #{new_resource.options}",
62
+ shell_out!("#{new_resource.homebrew_path} install --cask #{new_resource.cask_name} #{new_resource.options}",
63
63
  user: new_resource.owner,
64
64
  env: { "HOME" => ::Dir.home(new_resource.owner), "USER" => new_resource.owner },
65
65
  cwd: ::Dir.home(new_resource.owner))
@@ -74,7 +74,7 @@ class Chef
74
74
 
75
75
  if casked?
76
76
  converge_by("uninstall cask #{new_resource.cask_name}") do
77
- shell_out!("#{new_resource.homebrew_path} cask uninstall #{new_resource.cask_name}",
77
+ shell_out!("#{new_resource.homebrew_path} uninstall --cask #{new_resource.cask_name}",
78
78
  user: new_resource.owner,
79
79
  env: { "HOME" => ::Dir.home(new_resource.owner), "USER" => new_resource.owner },
80
80
  cwd: ::Dir.home(new_resource.owner))
@@ -92,7 +92,7 @@ class Chef
92
92
  # @return [Boolean]
93
93
  def casked?
94
94
  unscoped_name = new_resource.cask_name.split("/").last
95
- shell_out!("#{new_resource.homebrew_path} cask list 2>/dev/null",
95
+ shell_out!("#{new_resource.homebrew_path} list --cask 2>/dev/null",
96
96
  user: new_resource.owner,
97
97
  env: { "HOME" => ::Dir.home(new_resource.owner), "USER" => new_resource.owner },
98
98
  cwd: ::Dir.home(new_resource.owner)).stdout.split.include?(unscoped_name)
@@ -13,6 +13,7 @@
13
13
  #
14
14
 
15
15
  require_relative "../resource"
16
+ require_relative "../dist"
16
17
 
17
18
  class Chef
18
19
  class Resource
@@ -66,8 +67,7 @@ class Chef
66
67
  def updated_ec2_config_xml
67
68
  begin
68
69
  require "rexml/document" unless defined?(REXML::Document)
69
- config_file = 'C:\Program Files\Amazon\Ec2ConfigService\Settings\config.xml'
70
- config = REXML::Document.new(::File.read(config_file))
70
+ config = REXML::Document.new(::File.read(WINDOWS_EC2_CONFIG))
71
71
  # find an element named State with a sibling element whose value is Ec2SetComputerName
72
72
  REXML::XPath.each(config, "//Plugin/State[../Name/text() = 'Ec2SetComputerName']") do |element|
73
73
  element.text = "Disabled"
@@ -219,35 +219,36 @@ class Chef
219
219
  end
220
220
 
221
221
  else # windows
222
+ WINDOWS_EC2_CONFIG = 'C:\Program Files\Amazon\Ec2ConfigService\Settings\config.xml'.freeze
223
+
222
224
  raise "Windows hostnames cannot contain a period." if new_resource.hostname.match?(/\./)
223
225
 
224
226
  # suppress EC2 config service from setting our hostname
225
- if ::File.exist?('C:\Program Files\Amazon\Ec2ConfigService\Settings\config.xml')
227
+ if ::File.exist?(WINDOWS_EC2_CONFIG)
226
228
  xml_contents = updated_ec2_config_xml
227
229
  if xml_contents.empty?
228
230
  Chef::Log.warn('Unable to properly parse and update C:\Program Files\Amazon\Ec2ConfigService\Settings\config.xml contents. Skipping file update.')
229
231
  else
230
- declare_resource(:file, 'C:\Program Files\Amazon\Ec2ConfigService\Settings\config.xml') do
232
+ file WINDOWS_EC2_CONFIG do
231
233
  content xml_contents
232
234
  end
233
235
  end
234
236
  end
235
237
 
236
- # update via netdom
237
- declare_resource(:powershell_script, "set hostname") do
238
- code <<-EOH
239
- $sysInfo = Get-WmiObject -Class Win32_ComputerSystem
240
- $sysInfo.Rename("#{new_resource.hostname}")
241
- EOH
242
- notifies :request_reboot, "reboot[setting hostname]"
243
- not_if { Socket.gethostbyname(Socket.gethostname).first == new_resource.hostname }
244
- end
238
+ unless Socket.gethostbyname(Socket.gethostname).first == new_resource.hostname
239
+ converge_by "set hostname to #{new_resource.hostname}" do
240
+ powershell_out! <<~EOH
241
+ $sysInfo = Get-WmiObject -Class Win32_ComputerSystem
242
+ $sysInfo.Rename("#{new_resource.hostname}")
243
+ EOH
244
+ end
245
245
 
246
- # reboot because $windows
247
- declare_resource(:reboot, "setting hostname") do
248
- reason "chef setting hostname"
249
- action :nothing
250
- only_if { new_resource.windows_reboot }
246
+ # reboot because $windows
247
+ reboot "setting hostname" do
248
+ reason "#{Chef::Dist::PRODUCT} updated system hostname"
249
+ only_if { new_resource.windows_reboot }
250
+ action :request_reboot
251
+ end
251
252
  end
252
253
  end
253
254
  end
@@ -97,7 +97,7 @@ class Chef
97
97
  # @raise [Mixlib::ShellOut::ShellCommandFailed] not a supported language or locale
98
98
  #
99
99
  def generate_locales
100
- shell_out!("locale-gen #{unavailable_locales.join(" ")}")
100
+ shell_out!("locale-gen #{unavailable_locales.join(" ")}", timeout: 1800)
101
101
  end
102
102
 
103
103
  # Updates system locale by appropriately writing them in /etc/locale.conf