chef 16.0.275-universal-mingw32 → 16.2.50-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 (293) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -1
  3. data/README.md +3 -3
  4. data/Rakefile +15 -1
  5. data/chef.gemspec +3 -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/application/apply.rb +2 -2
  9. data/lib/chef/application/base.rb +1 -1
  10. data/lib/chef/application/client.rb +1 -1
  11. data/lib/chef/application/exit_code.rb +2 -2
  12. data/lib/chef/application/windows_service_manager.rb +1 -1
  13. data/lib/chef/chef_fs/chef_fs_data_store.rb +3 -3
  14. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +1 -1
  15. data/lib/chef/chef_fs/file_system/chef_server/acls_dir.rb +1 -1
  16. data/lib/chef/chef_fs/file_system/chef_server/cookbook_file.rb +1 -1
  17. data/lib/chef/chef_fs/file_system/chef_server/policies_dir.rb +1 -1
  18. data/lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb +1 -1
  19. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +1 -1
  20. data/lib/chef/chef_fs/file_system/repository/directory.rb +1 -1
  21. data/lib/chef/chef_fs/parallelizer/parallel_enumerable.rb +1 -1
  22. data/lib/chef/chef_fs/path_utils.rb +4 -4
  23. data/lib/chef/cookbook/chefignore.rb +1 -1
  24. data/lib/chef/cookbook/file_system_file_vendor.rb +1 -1
  25. data/lib/chef/cookbook/metadata.rb +2 -2
  26. data/lib/chef/cookbook_loader.rb +1 -1
  27. data/lib/chef/cookbook_manifest.rb +1 -1
  28. data/lib/chef/cookbook_site_streaming_uploader.rb +1 -1
  29. data/lib/chef/cookbook_version.rb +7 -7
  30. data/lib/chef/data_bag.rb +4 -4
  31. data/lib/chef/data_collector.rb +1 -1
  32. data/lib/chef/data_collector/error_handlers.rb +1 -1
  33. data/lib/chef/decorator/lazy_array.rb +2 -2
  34. data/lib/chef/deprecated.rb +5 -1
  35. data/lib/chef/digester.rb +4 -4
  36. data/lib/chef/dsl/declare_resource.rb +1 -1
  37. data/lib/chef/dsl/platform_introspection.rb +1 -1
  38. data/lib/chef/encrypted_data_bag_item/decryptor.rb +1 -1
  39. data/lib/chef/encrypted_data_bag_item/encryptor.rb +1 -1
  40. data/lib/chef/file_access_control.rb +1 -1
  41. data/lib/chef/formatters/base.rb +1 -1
  42. data/lib/chef/formatters/error_inspectors/compile_error_inspector.rb +1 -1
  43. data/lib/chef/formatters/error_inspectors/node_load_error_inspector.rb +2 -2
  44. data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +7 -7
  45. data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +3 -3
  46. data/lib/chef/http.rb +18 -3
  47. data/lib/chef/http/decompressor.rb +1 -1
  48. data/lib/chef/http/http_request.rb +1 -1
  49. data/lib/chef/http/json_output.rb +1 -1
  50. data/lib/chef/http/ssl_policies.rb +18 -0
  51. data/lib/chef/json_compat.rb +1 -1
  52. data/lib/chef/key.rb +1 -1
  53. data/lib/chef/knife.rb +2 -2
  54. data/lib/chef/knife/bootstrap.rb +13 -16
  55. data/lib/chef/knife/bootstrap/chef_vault_handler.rb +1 -1
  56. data/lib/chef/knife/bootstrap/client_builder.rb +1 -1
  57. data/lib/chef/knife/bootstrap/templates/chef-full.erb +9 -9
  58. data/lib/chef/knife/bootstrap/templates/windows-chef-client-msi.erb +3 -1
  59. data/lib/chef/knife/client_bulk_delete.rb +1 -1
  60. data/lib/chef/knife/config_get.rb +1 -1
  61. data/lib/chef/knife/config_use_profile.rb +15 -5
  62. data/lib/chef/knife/cookbook_delete.rb +1 -1
  63. data/lib/chef/knife/core/cookbook_scm_repo.rb +1 -1
  64. data/lib/chef/knife/core/hashed_command_loader.rb +1 -1
  65. data/lib/chef/knife/core/node_presenter.rb +1 -1
  66. data/lib/chef/knife/core/status_presenter.rb +1 -1
  67. data/lib/chef/knife/core/subcommand_loader.rb +1 -1
  68. data/lib/chef/knife/core/windows_bootstrap_context.rb +18 -3
  69. data/lib/chef/knife/data_bag_create.rb +1 -1
  70. data/lib/chef/knife/key_create_base.rb +1 -1
  71. data/lib/chef/knife/key_edit_base.rb +1 -1
  72. data/lib/chef/knife/node_bulk_delete.rb +1 -1
  73. data/lib/chef/knife/node_run_list_remove.rb +1 -1
  74. data/lib/chef/knife/role_bulk_delete.rb +1 -1
  75. data/lib/chef/knife/ssh.rb +2 -2
  76. data/lib/chef/knife/supermarket_share.rb +1 -1
  77. data/lib/chef/knife/supermarket_unshare.rb +1 -1
  78. data/lib/chef/knife/{user_invite_recind.rb → user_invite_rescind.rb} +6 -6
  79. data/lib/chef/log.rb +1 -1
  80. data/lib/chef/mixin/api_version_request_handling.rb +1 -1
  81. data/lib/chef/mixin/checksum.rb +0 -1
  82. data/lib/chef/mixin/create_path.rb +8 -8
  83. data/lib/chef/mixin/openssl_helper.rb +4 -4
  84. data/lib/chef/mixin/properties.rb +4 -2
  85. data/lib/chef/mixin/securable.rb +2 -2
  86. data/lib/chef/mixin/shell_out.rb +1 -1
  87. data/lib/chef/node/attribute.rb +2 -2
  88. data/lib/chef/node/immutable_collections.rb +1 -1
  89. data/lib/chef/node/mixin/deep_merge_cache.rb +7 -7
  90. data/lib/chef/policy_builder/policyfile.rb +1 -1
  91. data/lib/chef/powershell.rb +1 -1
  92. data/lib/chef/property.rb +2 -2
  93. data/lib/chef/provider.rb +3 -3
  94. data/lib/chef/provider/batch.rb +3 -10
  95. data/lib/chef/provider/cron.rb +2 -14
  96. data/lib/chef/provider/directory.rb +1 -1
  97. data/lib/chef/provider/execute.rb +2 -1
  98. data/lib/chef/provider/file.rb +1 -1
  99. data/lib/chef/provider/group/dscl.rb +2 -2
  100. data/lib/chef/provider/group/windows.rb +1 -1
  101. data/lib/chef/provider/ifconfig.rb +7 -7
  102. data/lib/chef/provider/launchd.rb +28 -32
  103. data/lib/chef/provider/mount/aix.rb +1 -1
  104. data/lib/chef/provider/mount/windows.rb +2 -2
  105. data/lib/chef/provider/noop.rb +1 -1
  106. data/lib/chef/provider/package/cab.rb +1 -1
  107. data/lib/chef/provider/package/chocolatey.rb +1 -1
  108. data/lib/chef/provider/package/dpkg.rb +1 -1
  109. data/lib/chef/provider/package/openbsd.rb +1 -1
  110. data/lib/chef/provider/package/portage.rb +3 -2
  111. data/lib/chef/provider/package/powershell.rb +6 -2
  112. data/lib/chef/provider/package/rubygems.rb +3 -3
  113. data/lib/chef/provider/package/snap.rb +96 -27
  114. data/lib/chef/provider/package/windows.rb +2 -2
  115. data/lib/chef/provider/package/windows/msi.rb +3 -3
  116. data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +1 -1
  117. data/lib/chef/provider/package/yum.rb +1 -1
  118. data/lib/chef/provider/package/yum/yum_cache.rb +1 -1
  119. data/lib/chef/provider/powershell_script.rb +11 -15
  120. data/lib/chef/provider/remote_directory.rb +2 -2
  121. data/lib/chef/provider/remote_file/http.rb +4 -1
  122. data/lib/chef/provider/script.rb +4 -75
  123. data/lib/chef/provider/service/arch.rb +2 -2
  124. data/lib/chef/provider/service/debian.rb +2 -2
  125. data/lib/chef/provider/service/macosx.rb +13 -2
  126. data/lib/chef/provider/service/openbsd.rb +4 -4
  127. data/lib/chef/provider/service/redhat.rb +1 -1
  128. data/lib/chef/provider/service/simple.rb +3 -3
  129. data/lib/chef/provider/service/upstart.rb +1 -1
  130. data/lib/chef/provider/service/windows.rb +1 -1
  131. data/lib/chef/provider/subversion.rb +2 -2
  132. data/lib/chef/provider/user/aix.rb +1 -1
  133. data/lib/chef/provider/user/dscl.rb +6 -6
  134. data/lib/chef/provider/user/linux.rb +3 -3
  135. data/lib/chef/provider/user/mac.rb +15 -11
  136. data/lib/chef/provider/windows_script.rb +87 -25
  137. data/lib/chef/provider/windows_task.rb +5 -3
  138. data/lib/chef/provider/zypper_repository.rb +30 -10
  139. data/lib/chef/resource.rb +25 -14
  140. data/lib/chef/resource/alternatives.rb +1 -1
  141. data/lib/chef/resource/apt_package.rb +1 -1
  142. data/lib/chef/resource/archive_file.rb +28 -8
  143. data/lib/chef/resource/bash.rb +0 -1
  144. data/lib/chef/resource/batch.rb +4 -2
  145. data/lib/chef/resource/chef_client_scheduled_task.rb +13 -1
  146. data/lib/chef/resource/chef_gem.rb +57 -21
  147. data/lib/chef/resource/chef_handler.rb +2 -2
  148. data/lib/chef/resource/chef_vault_secret.rb +1 -1
  149. data/lib/chef/resource/cron/_cron_shared.rb +98 -0
  150. data/lib/chef/resource/cron/cron.rb +46 -0
  151. data/lib/chef/resource/{cron_d.rb → cron/cron_d.rb} +7 -87
  152. data/lib/chef/resource/cron_access.rb +11 -3
  153. data/lib/chef/resource/csh.rb +0 -1
  154. data/lib/chef/resource/dmg_package.rb +1 -1
  155. data/lib/chef/resource/execute.rb +478 -8
  156. data/lib/chef/resource/file.rb +10 -8
  157. data/lib/chef/resource/freebsd_package.rb +1 -1
  158. data/lib/chef/resource/gem_package.rb +35 -2
  159. data/lib/chef/resource/helpers/cron_validations.rb +6 -3
  160. data/lib/chef/resource/homebrew_package.rb +30 -1
  161. data/lib/chef/resource/homebrew_update.rb +107 -0
  162. data/lib/chef/resource/hostname.rb +7 -20
  163. data/lib/chef/resource/kernel_module.rb +14 -1
  164. data/lib/chef/resource/launchd.rb +4 -4
  165. data/lib/chef/resource/locale.rb +3 -3
  166. data/lib/chef/resource/macos_userdefaults.rb +14 -9
  167. data/lib/chef/resource/mount.rb +1 -1
  168. data/lib/chef/resource/msu_package.rb +1 -1
  169. data/lib/chef/resource/perl.rb +0 -1
  170. data/lib/chef/resource/plist.rb +23 -4
  171. data/lib/chef/resource/powershell_script.rb +4 -2
  172. data/lib/chef/resource/python.rb +0 -1
  173. data/lib/chef/resource/remote_file.rb +26 -10
  174. data/lib/chef/resource/ruby.rb +0 -1
  175. data/lib/chef/resource/scm/git.rb +1 -1
  176. data/lib/chef/resource/ssh_known_hosts_entry.rb +15 -0
  177. data/lib/chef/resource/sudo.rb +29 -2
  178. data/lib/chef/resource/swap_file.rb +17 -0
  179. data/lib/chef/resource/template.rb +1 -1
  180. data/lib/chef/resource/timezone.rb +15 -0
  181. data/lib/chef/resource/windows_ad_join.rb +30 -1
  182. data/lib/chef/resource/windows_audit_policy.rb +227 -0
  183. data/lib/chef/resource/windows_auto_run.rb +11 -0
  184. data/lib/chef/resource/windows_certificate.rb +27 -1
  185. data/lib/chef/resource/windows_dfs_server.rb +1 -1
  186. data/lib/chef/resource/windows_firewall_rule.rb +2 -2
  187. data/lib/chef/resource/windows_font.rb +3 -3
  188. data/lib/chef/resource/windows_package.rb +3 -3
  189. data/lib/chef/resource/windows_pagefile.rb +2 -2
  190. data/lib/chef/resource/windows_printer.rb +1 -1
  191. data/lib/chef/resource/windows_script.rb +2 -16
  192. data/lib/chef/resource/windows_security_policy.rb +47 -16
  193. data/lib/chef/resource/windows_share.rb +2 -2
  194. data/lib/chef/resource/windows_shortcut.rb +1 -2
  195. data/lib/chef/resource/windows_task.rb +21 -21
  196. data/lib/chef/resource/windows_user_privilege.rb +45 -3
  197. data/lib/chef/resource/yum_repository.rb +9 -9
  198. data/lib/chef/resource_inspector.rb +4 -3
  199. data/lib/chef/resources.rb +4 -2
  200. data/lib/chef/run_context/cookbook_compiler.rb +1 -1
  201. data/lib/chef/search/query.rb +1 -1
  202. data/lib/chef/shell/ext.rb +1 -1
  203. data/lib/chef/util/diff.rb +2 -2
  204. data/lib/chef/util/dsc/lcm_output_parser.rb +3 -3
  205. data/lib/chef/util/windows/net_user.rb +1 -1
  206. data/lib/chef/util/windows/volume.rb +1 -1
  207. data/lib/chef/version.rb +1 -1
  208. data/lib/chef/win32/api.rb +2 -2
  209. data/lib/chef/win32/api/error.rb +3 -1
  210. data/lib/chef/win32/api/file.rb +18 -18
  211. data/lib/chef/win32/api/net.rb +1 -0
  212. data/lib/chef/win32/file.rb +1 -1
  213. data/lib/chef/win32/mutex.rb +1 -1
  214. data/lib/chef/win32/net.rb +1 -0
  215. data/lib/chef/win32/process.rb +2 -2
  216. data/lib/chef/win32/registry.rb +2 -2
  217. data/lib/chef/win32/security.rb +1 -1
  218. data/lib/chef/win32/security/sid.rb +4 -4
  219. data/spec/data/lwrp/providers/buck_passer.rb +1 -1
  220. data/spec/data/lwrp/providers/buck_passer_2.rb +1 -1
  221. data/spec/data/lwrp/providers/embedded_resource_accesses_providers_scope.rb +1 -1
  222. data/spec/functional/resource/cron_spec.rb +10 -0
  223. data/spec/functional/resource/dnf_package_spec.rb +2 -2
  224. data/spec/functional/resource/git_spec.rb +6 -6
  225. data/spec/functional/resource/launchd_spec.rb +232 -0
  226. data/spec/functional/resource/remote_file_spec.rb +2 -2
  227. data/spec/functional/resource/user/dscl_spec.rb +1 -1
  228. data/spec/functional/resource/user/mac_user_spec.rb +1 -1
  229. data/spec/functional/resource/windows_task_spec.rb +12 -12
  230. data/spec/integration/knife/config_use_profile_spec.rb +55 -2
  231. data/spec/support/chef_helpers.rb +1 -1
  232. data/spec/support/platform_helpers.rb +1 -1
  233. data/spec/support/platforms/win32/spec_service.rb +1 -1
  234. data/spec/support/shared/functional/execute_resource.rb +1 -1
  235. data/spec/support/shared/functional/file_resource.rb +1 -1
  236. data/spec/support/shared/functional/windows_script.rb +1 -1
  237. data/spec/support/shared/unit/execute_resource.rb +1 -1
  238. data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +4 -4
  239. data/spec/unit/application_spec.rb +7 -0
  240. data/spec/unit/data_bag_spec.rb +1 -1
  241. data/spec/unit/http/ssl_policies_spec.rb +20 -0
  242. data/spec/unit/knife/bootstrap_spec.rb +2 -2
  243. data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +7 -1
  244. data/spec/unit/knife/role_env_run_list_add_spec.rb +6 -6
  245. data/spec/unit/knife/role_env_run_list_clear_spec.rb +4 -4
  246. data/spec/unit/knife/role_env_run_list_remove_spec.rb +4 -4
  247. data/spec/unit/knife/role_env_run_list_replace_spec.rb +4 -4
  248. data/spec/unit/knife/role_env_run_list_set_spec.rb +4 -4
  249. data/spec/unit/knife/role_run_list_add_spec.rb +6 -6
  250. data/spec/unit/knife/role_run_list_clear_spec.rb +4 -4
  251. data/spec/unit/knife/role_run_list_remove_spec.rb +4 -4
  252. data/spec/unit/knife/role_run_list_replace_spec.rb +4 -4
  253. data/spec/unit/knife/role_run_list_set_spec.rb +4 -4
  254. data/spec/unit/mixin/openssl_helper_spec.rb +4 -4
  255. data/spec/unit/mixin/user_context_spec.rb +1 -9
  256. data/spec/unit/node/attribute_spec.rb +1 -1
  257. data/spec/unit/property_spec.rb +1 -1
  258. data/spec/unit/provider/batch_spec.rb +130 -0
  259. data/spec/unit/provider/cron_spec.rb +9 -49
  260. data/spec/unit/provider/git_spec.rb +3 -3
  261. data/spec/unit/provider/group/groupadd_spec.rb +1 -1
  262. data/spec/unit/provider/launchd_spec.rb +8 -50
  263. data/spec/unit/provider/osx_profile_spec.rb +2 -2
  264. data/spec/unit/provider/package/msu_spec.rb +3 -3
  265. data/spec/unit/provider/package/portage_spec.rb +2 -2
  266. data/spec/unit/provider/package/powershell_spec.rb +96 -87
  267. data/spec/unit/provider/package/snap_spec.rb +1 -1
  268. data/spec/unit/provider/powershell_script_spec.rb +3 -45
  269. data/spec/unit/provider/script_spec.rb +20 -110
  270. data/spec/unit/provider/service/gentoo_service_spec.rb +1 -1
  271. data/spec/unit/provider/zypper_repository_spec.rb +60 -10
  272. data/spec/unit/provider_resolver_spec.rb +9 -9
  273. data/spec/unit/resource/archive_file_spec.rb +11 -2
  274. data/spec/unit/resource/chef_client_scheduled_task_spec.rb +17 -7
  275. data/spec/unit/resource/cron_spec.rb +2 -2
  276. data/spec/unit/resource/helpers/cron_validations_spec.rb +5 -1
  277. data/spec/unit/resource/homebrew_update_spec.rb +30 -0
  278. data/spec/unit/resource/powershell_script_spec.rb +10 -15
  279. data/spec/unit/resource/timezone_spec.rb +1 -1
  280. data/spec/unit/resource/windows_audit_policy_spec.rb +64 -0
  281. data/spec/unit/resource/windows_dns_record_spec.rb +3 -3
  282. data/spec/unit/resource/windows_dns_zone_spec.rb +2 -2
  283. data/spec/unit/resource/windows_package_spec.rb +10 -0
  284. data/spec/unit/resource/windows_task_spec.rb +1 -1
  285. data/spec/unit/resource/windows_uac_spec.rb +2 -2
  286. data/spec/unit/resource/yum_repository_spec.rb +21 -21
  287. data/spec/unit/resource_spec.rb +67 -1
  288. data/spec/unit/run_context_spec.rb +1 -1
  289. data/spec/unit/util/dsc/configuration_generator_spec.rb +1 -1
  290. data/spec/unit/util/threaded_job_queue_spec.rb +9 -0
  291. data/spec/unit/win32/registry_spec.rb +1 -1
  292. metadata +24 -23
  293. data/lib/chef/resource/cron.rb +0 -157
@@ -18,57 +18,119 @@
18
18
 
19
19
  require_relative "script"
20
20
  require_relative "../mixin/windows_architecture_helper"
21
+ require_relative "../win32/security" if ChefUtils.windows?
22
+ require "tempfile" unless defined?(Tempfile)
21
23
 
22
24
  class Chef
23
25
  class Provider
24
26
  class WindowsScript < Chef::Provider::Script
25
27
 
26
- attr_reader :is_forced_32bit
27
-
28
28
  protected
29
29
 
30
- include Chef::Mixin::WindowsArchitectureHelper
31
-
32
- def initialize( new_resource, run_context, script_extension = "")
33
- super( new_resource, run_context )
34
- @script_extension = script_extension
30
+ attr_accessor :script_file_path
35
31
 
36
- target_architecture = if new_resource.architecture.nil?
37
- node_windows_architecture(run_context.node)
38
- else
39
- new_resource.architecture
40
- end
41
-
42
- @is_wow64 = wow64_architecture_override_required?(run_context.node, target_architecture)
32
+ include Chef::Mixin::WindowsArchitectureHelper
43
33
 
44
- @is_forced_32bit = forced_32bit_override_required?(run_context.node, target_architecture)
34
+ def target_architecture
35
+ @target_architecture ||= if new_resource.architecture.nil?
36
+ node_windows_architecture(run_context.node)
37
+ else
38
+ new_resource.architecture
39
+ end
45
40
  end
46
41
 
47
- public
42
+ def basepath
43
+ if forced_32bit_override_required?(run_context.node, target_architecture)
44
+ wow64_directory
45
+ else
46
+ run_context.node["kernel"]["os_info"]["system_directory"]
47
+ end
48
+ end
48
49
 
49
- action :run do
50
+ def with_wow64_redirection_disabled
50
51
  wow64_redirection_state = nil
51
52
 
52
- if @is_wow64
53
- wow64_redirection_state = disable_wow64_file_redirection(@run_context.node)
53
+ if wow64_architecture_override_required?(run_context.node, target_architecture)
54
+ wow64_redirection_state = disable_wow64_file_redirection(run_context.node)
54
55
  end
55
56
 
56
57
  begin
57
- super()
58
+ yield
58
59
  rescue
59
60
  raise
60
61
  ensure
61
62
  unless wow64_redirection_state.nil?
62
- restore_wow64_file_redirection(@run_context.node, wow64_redirection_state)
63
+ restore_wow64_file_redirection(run_context.node, wow64_redirection_state)
63
64
  end
64
65
  end
65
66
  end
66
67
 
67
- def script_file
68
- base_script_name = "chef-script"
69
- temp_file_arguments = [ base_script_name, @script_extension ]
68
+ def command
69
+ "\"#{interpreter}\" #{flags} \"#{script_file_path}\""
70
+ end
71
+
72
+ def grant_alternate_user_read_access(file_path)
73
+ # Do nothing if an alternate user isn't specified -- the file
74
+ # will already have the correct permissions for the user as part
75
+ # of the default ACL behavior on Windows.
76
+ return if new_resource.user.nil?
77
+
78
+ # Duplicate the script file's existing DACL
79
+ # so we can add an ACE later
80
+ securable_object = Chef::ReservedNames::Win32::Security::SecurableObject.new(file_path)
81
+ aces = securable_object.security_descriptor.dacl.reduce([]) { |result, current| result.push(current) }
82
+
83
+ username = new_resource.user
84
+
85
+ if new_resource.domain
86
+ username = new_resource.domain + '\\' + new_resource.user
87
+ end
88
+
89
+ # Create an ACE that allows the alternate user read access to the script
90
+ # file so it can be read and executed.
91
+ user_sid = Chef::ReservedNames::Win32::Security::SID.from_account(username)
92
+ read_ace = Chef::ReservedNames::Win32::Security::ACE.access_allowed(user_sid, Chef::ReservedNames::Win32::API::Security::GENERIC_READ | Chef::ReservedNames::Win32::API::Security::GENERIC_EXECUTE, 0)
93
+ aces.push(read_ace)
94
+ acl = Chef::ReservedNames::Win32::Security::ACL.create(aces)
95
+
96
+ # This actually applies the modified DACL to the file
97
+ # Use parentheses to bypass RuboCop / ChefStyle warning
98
+ # about useless setter
99
+ (securable_object.dacl = acl)
100
+ end
101
+
102
+ def with_temp_script_file
103
+ Tempfile.open(["chef-script", script_extension]) do |script_file|
104
+ script_file.puts(code)
105
+ script_file.close
106
+
107
+ grant_alternate_user_read_access(script_file.path)
108
+
109
+ # This needs to be set here so that the call to #command in Execute works.
110
+ self.script_file_path = script_file.path
111
+
112
+ yield
113
+
114
+ self.script_file_path = nil
115
+ end
116
+ end
117
+
118
+ def input
119
+ nil
120
+ end
121
+
122
+ public
123
+
124
+ action :run do
125
+ with_wow64_redirection_disabled do
126
+ with_temp_script_file do
127
+ super()
128
+ end
129
+ end
130
+ end
70
131
 
71
- @script_file ||= Tempfile.open(temp_file_arguments)
132
+ def script_extension
133
+ raise Chef::Exceptions::Override, "You must override #{__method__} in #{self}"
72
134
  end
73
135
  end
74
136
  end
@@ -72,6 +72,7 @@ class Chef
72
72
  6 => TaskScheduler::TASK_SIXTH,
73
73
  7 => TaskScheduler::TASK_SEVENTH,
74
74
  8 => TaskScheduler::TASK_EIGHTH,
75
+ # cspell:disable-next-line
75
76
  9 => TaskScheduler::TASK_NINETH,
76
77
  10 => TaskScheduler::TASK_TENTH,
77
78
  11 => TaskScheduler::TASK_ELEVENTH,
@@ -93,6 +94,7 @@ class Chef
93
94
  27 => TaskScheduler::TASK_TWENTY_SEVENTH,
94
95
  28 => TaskScheduler::TASK_TWENTY_EIGHTH,
95
96
  29 => TaskScheduler::TASK_TWENTY_NINTH,
97
+ # cspell:disable-next-line
96
98
  30 => TaskScheduler::TASK_THIRTYETH,
97
99
  31 => TaskScheduler::TASK_THIRTY_FIRST,
98
100
  }.freeze
@@ -229,7 +231,7 @@ class Chef
229
231
 
230
232
  private
231
233
 
232
- # seprated command arguments from :command property
234
+ # separated command arguments from :command property
233
235
  def set_command_and_arguments
234
236
  cmd, *args = Chef::Util::PathHelper.split_args(new_resource.command)
235
237
  new_resource.command = cmd
@@ -424,7 +426,7 @@ class Chef
424
426
  when TaskScheduler::AT_LOGON
425
427
  # TODO: handle option for this trigger
426
428
  when TaskScheduler::AT_SYSTEMSTART
427
- # TODO: handle option for this trigger
429
+ # TODO: handle option for this trigger
428
430
  end
429
431
  end
430
432
 
@@ -577,7 +579,7 @@ class Chef
577
579
 
578
580
  def logon_type
579
581
  # Ref: https://msdn.microsoft.com/en-us/library/windows/desktop/aa383566(v=vs.85).aspx
580
- # if nothing is passed as logon_type the TASK_LOGON_SERVICE_ACCOUNT is getting set as default so using that for comparision.
582
+ # if nothing is passed as logon_type the TASK_LOGON_SERVICE_ACCOUNT is getting set as default so using that for comparison.
581
583
  user_id = new_resource.user.to_s
582
584
  password = new_resource.password.to_s
583
585
  if Chef::ReservedNames::Win32::Security::SID.service_account_user?(user_id)
@@ -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
@@ -451,6 +451,17 @@ class Chef
451
451
  description: "Determines whether or not the resource is executed during the compile time phase.",
452
452
  default: false, desired_state: false
453
453
 
454
+ # Set a umask to be used for the duration of converging the resource.
455
+ # Defaults to `nil`, which means to use the system umask.
456
+ #
457
+ # @param arg [String] The umask to apply while converging the resource.
458
+ # @return [Boolean] The umask to apply while converging the resource.
459
+ #
460
+ property :umask, String,
461
+ desired_state: false,
462
+ introduced: "16.2",
463
+ description: "Set a umask to be used for the duration of converging the resource. Defaults to `nil`, which means to use the system umask."
464
+
454
465
  # The time it took (in seconds) to run the most recently-run action. Not
455
466
  # cumulative across actions. This is set to 0 as soon as a new action starts
456
467
  # running, and set to the elapsed time at the end of the action.
@@ -588,7 +599,9 @@ class Chef
588
599
  begin
589
600
  return if should_skip?(action)
590
601
 
591
- provider_for_action(action).run_action
602
+ with_umask do
603
+ provider_for_action(action).run_action
604
+ end
592
605
  rescue StandardError => e
593
606
  if ignore_failure
594
607
  logger.error("#{custom_exception_message(e)}; ignore_failure is set, continuing")
@@ -612,6 +625,13 @@ class Chef
612
625
  events.resource_completed(self)
613
626
  end
614
627
 
628
+ def with_umask
629
+ old_value = ::File.umask(umask.oct) if umask
630
+ yield
631
+ ensure
632
+ ::File.umask(old_value) if umask
633
+ end
634
+
615
635
  #
616
636
  # If we are currently initializing the resource, this will be true.
617
637
  #
@@ -930,7 +950,7 @@ class Chef
930
950
  end
931
951
 
932
952
  #
933
- # A hook called after a resource is created. Meant to be overriden by
953
+ # A hook called after a resource is created. Meant to be overridden by
934
954
  # subclasses.
935
955
  #
936
956
  def after_created
@@ -950,16 +970,7 @@ class Chef
950
970
  def self.resource_name(name = NOT_PASSED)
951
971
  # Setter
952
972
  if name != NOT_PASSED
953
- if name
954
- @resource_name = name.to_sym
955
- name = name.to_sym
956
- # FIXME: determine a way to deprecate this magic behavior
957
- unless Chef::ResourceResolver.includes_handler?(name, self)
958
- provides name
959
- end
960
- else
961
- @resource_name = nil
962
- end
973
+ @resource_name = name.to_sym rescue nil
963
974
  end
964
975
 
965
976
  @resource_name = nil unless defined?(@resource_name)
@@ -1114,7 +1125,7 @@ class Chef
1114
1125
  # `action_class` method, the presence of either indicates that this is
1115
1126
  # going to be a Chef-12.5 custom resource. If we never see one of these
1116
1127
  # directives then we are constructing an old-style Resource+Provider or
1117
- # LWRP or whatevs.
1128
+ # LWRP or whatever.
1118
1129
  #
1119
1130
  # If a block is passed, the action_class is always created and the block is
1120
1131
  # run inside it.
@@ -1327,7 +1338,7 @@ class Chef
1327
1338
  # Once we no longer care about supporting chef < 14.4 then we can deprecate
1328
1339
  # this API.
1329
1340
  #
1330
- # @param arg [String] version constrant to match against (e.g. "> 14")
1341
+ # @param arg [String] version constraint to match against (e.g. "> 14")
1331
1342
  #
1332
1343
  def self.chef_version_for_provides(constraint)
1333
1344
  @chef_version_for_provides = constraint
@@ -89,7 +89,7 @@ class Chef
89
89
  description: "The path to the alternatives link."
90
90
 
91
91
  property :path, String,
92
- description: "The full path to the original application binary such as `/usr/bin/ruby27`."
92
+ description: "The absolute path to the original application binary such as `/usr/bin/ruby27`."
93
93
 
94
94
  property :priority, [String, Integer],
95
95
  coerce: proc { |n| n.to_i },
@@ -46,7 +46,7 @@ class Chef
46
46
  apt_package %(package1 package2 package3)
47
47
  ```
48
48
 
49
- **Install without using recommend packages as a dependency**
49
+ **Install without using recommend packages as a dependency**:
50
50
 
51
51
  ```ruby
52
52
  package 'apache2' do
@@ -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
@@ -39,6 +40,18 @@ class Chef
39
40
  destination '/srv/files'
40
41
  end
41
42
  ```
43
+
44
+ **Set specific permissions on the extracted files**:
45
+
46
+ ```ruby
47
+ archive_file 'Precompiled.zip' do
48
+ owner 'tsmith'
49
+ group 'staff'
50
+ mode '700'
51
+ path '/tmp/Precompiled.zip'
52
+ destination '/srv/files'
53
+ end
54
+ ```
42
55
  DOC
43
56
 
44
57
  property :path, String,
@@ -53,7 +66,7 @@ class Chef
53
66
  description: "The group of the extracted files."
54
67
 
55
68
  property :mode, [String, Integer],
56
- description: "The mode of the extracted files.",
69
+ description: "The mode of the extracted files. Integer values are deprecated as octal values (ex. 0755) would not be interpreted correctly.",
57
70
  default: "755"
58
71
 
59
72
  property :destination, String,
@@ -72,11 +85,11 @@ class Chef
72
85
  alias_method :extract_options, :options
73
86
  alias_method :extract_to, :destination
74
87
 
75
- require "fileutils" unless defined?(FileUtils)
76
-
77
88
  action :extract do
78
89
  description "Extract and archive file."
79
90
 
91
+ require_libarchive
92
+
80
93
  unless ::File.exist?(new_resource.path)
81
94
  raise Errno::ENOENT, "No archive found at #{new_resource.path}! Cannot continue."
82
95
  end
@@ -85,7 +98,8 @@ class Chef
85
98
  Chef::Log.trace("File or directory does not exist at destination path: #{new_resource.destination}")
86
99
 
87
100
  converge_by("create directory #{new_resource.destination}") do
88
- FileUtils.mkdir_p(new_resource.destination, mode: new_resource.mode.to_i)
101
+ # @todo when we remove the ability for mode to be an int we can remove the .to_s below
102
+ FileUtils.mkdir_p(new_resource.destination, mode: new_resource.mode.to_s.to_i(8))
89
103
  end
90
104
 
91
105
  extract(new_resource.path, new_resource.destination, Array(new_resource.options))
@@ -113,6 +127,16 @@ class Chef
113
127
  end
114
128
 
115
129
  action_class do
130
+ def require_libarchive
131
+ require "ffi-libarchive"
132
+ end
133
+
134
+ def define_resource_requirements
135
+ if new_resource.mode.is_a?(Integer)
136
+ 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.")
137
+ end
138
+ end
139
+
116
140
  # This can't be a constant since we might not have required 'ffi-libarchive' yet.
117
141
  def extract_option_map
118
142
  {
@@ -136,8 +160,6 @@ class Chef
136
160
  #
137
161
  # @return [Boolean]
138
162
  def archive_differs_from_disk?(src, dest)
139
- require "ffi-libarchive"
140
-
141
163
  modified = false
142
164
  Dir.chdir(dest) do
143
165
  archive = Archive::Reader.open_filename(src)
@@ -164,8 +186,6 @@ class Chef
164
186
  #
165
187
  # @return [void]
166
188
  def extract(src, dest, options = [])
167
- require "ffi-libarchive"
168
-
169
189
  converge_by("extract #{src} to #{dest}") do
170
190
  flags = [options].flatten.map { |option| extract_option_map[option] }.compact.reduce(:|)
171
191
 
@@ -17,7 +17,6 @@
17
17
  #
18
18
 
19
19
  require_relative "script"
20
- require_relative "../provider/script"
21
20
 
22
21
  class Chef
23
22
  class Resource