chef 16.1.0-universal-mingw32 → 16.3.38-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 (424) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +6 -7
  3. data/README.md +3 -3
  4. data/Rakefile +4 -3
  5. data/chef-universal-mingw32.gemspec +2 -2
  6. data/chef.gemspec +7 -6
  7. data/distro/powershell/chef/chef.psm1 +3 -3
  8. data/distro/templates/powershell/chef/chef.psm1.erb +3 -3
  9. data/lib/chef/application.rb +12 -0
  10. data/lib/chef/application/apply.rb +2 -1
  11. data/lib/chef/application/base.rb +1 -1
  12. data/lib/chef/application/client.rb +1 -1
  13. data/lib/chef/application/windows_service_manager.rb +1 -1
  14. data/lib/chef/{whitelist.rb → attribute_allowlist.rb} +11 -11
  15. data/lib/chef/{blacklist.rb → attribute_blocklist.rb} +9 -9
  16. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +1 -1
  17. data/lib/chef/chef_fs/data_handler/organization_data_handler.rb +1 -2
  18. data/lib/chef/chef_fs/file_system/chef_server/acls_dir.rb +1 -1
  19. data/lib/chef/chef_fs/file_system/chef_server/cookbook_file.rb +2 -2
  20. data/lib/chef/chef_fs/file_system/chef_server/cookbooks_dir.rb +1 -5
  21. data/lib/chef/chef_fs/file_system/repository/base_file.rb +1 -0
  22. data/lib/chef/chef_fs/file_system/repository/directory.rb +1 -1
  23. data/lib/chef/chef_fs/parallelizer/parallel_enumerable.rb +2 -2
  24. data/lib/chef/chef_fs/path_utils.rb +4 -4
  25. data/lib/chef/client.rb +3 -3
  26. data/lib/chef/cookbook/chefignore.rb +1 -1
  27. data/lib/chef/cookbook/file_system_file_vendor.rb +1 -1
  28. data/lib/chef/cookbook/metadata.rb +2 -2
  29. data/lib/chef/cookbook/remote_file_vendor.rb +1 -3
  30. data/lib/chef/cookbook/syntax_check.rb +1 -2
  31. data/lib/chef/cookbook_loader.rb +16 -30
  32. data/lib/chef/cookbook_manifest.rb +1 -1
  33. data/lib/chef/cookbook_site_streaming_uploader.rb +1 -1
  34. data/lib/chef/cookbook_version.rb +4 -4
  35. data/lib/chef/data_bag.rb +5 -6
  36. data/lib/chef/data_collector.rb +1 -1
  37. data/lib/chef/data_collector/error_handlers.rb +1 -1
  38. data/lib/chef/decorator/lazy_array.rb +2 -2
  39. data/lib/chef/deprecated.rb +12 -0
  40. data/lib/chef/digester.rb +5 -4
  41. data/lib/chef/dsl/declare_resource.rb +1 -1
  42. data/lib/chef/dsl/platform_introspection.rb +2 -0
  43. data/lib/chef/encrypted_data_bag_item/decryptor.rb +1 -1
  44. data/lib/chef/encrypted_data_bag_item/encryptor.rb +1 -1
  45. data/lib/chef/environment.rb +1 -2
  46. data/lib/chef/exceptions.rb +3 -0
  47. data/lib/chef/file_access_control.rb +1 -1
  48. data/lib/chef/file_access_control/windows.rb +2 -2
  49. data/lib/chef/file_content_management/deploy/mv_unix.rb +1 -1
  50. data/lib/chef/formatters/base.rb +1 -1
  51. data/lib/chef/formatters/error_inspectors/compile_error_inspector.rb +1 -1
  52. data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +3 -3
  53. data/lib/chef/http.rb +19 -4
  54. data/lib/chef/http/authenticator.rb +1 -1
  55. data/lib/chef/http/decompressor.rb +1 -1
  56. data/lib/chef/http/http_request.rb +1 -1
  57. data/lib/chef/http/json_output.rb +1 -1
  58. data/lib/chef/http/ssl_policies.rb +18 -0
  59. data/lib/chef/json_compat.rb +1 -1
  60. data/lib/chef/key.rb +1 -1
  61. data/lib/chef/knife.rb +6 -6
  62. data/lib/chef/knife/bootstrap.rb +24 -24
  63. data/lib/chef/knife/bootstrap/chef_vault_handler.rb +1 -1
  64. data/lib/chef/knife/bootstrap/client_builder.rb +1 -1
  65. data/lib/chef/knife/bootstrap/templates/chef-full.erb +9 -9
  66. data/lib/chef/knife/bootstrap/templates/windows-chef-client-msi.erb +3 -1
  67. data/lib/chef/knife/bootstrap/train_connector.rb +1 -0
  68. data/lib/chef/knife/client_bulk_delete.rb +1 -1
  69. data/lib/chef/knife/config_get.rb +2 -1
  70. data/lib/chef/knife/config_list_profiles.rb +4 -1
  71. data/lib/chef/knife/config_use_profile.rb +15 -5
  72. data/lib/chef/knife/configure.rb +1 -1
  73. data/lib/chef/knife/cookbook_delete.rb +1 -1
  74. data/lib/chef/knife/cookbook_upload.rb +6 -14
  75. data/lib/chef/knife/core/bootstrap_context.rb +1 -1
  76. data/lib/chef/knife/core/cookbook_scm_repo.rb +1 -1
  77. data/lib/chef/knife/core/gem_glob_loader.rb +1 -1
  78. data/lib/chef/knife/core/hashed_command_loader.rb +2 -1
  79. data/lib/chef/knife/core/node_presenter.rb +1 -1
  80. data/lib/chef/knife/core/status_presenter.rb +1 -1
  81. data/lib/chef/knife/core/subcommand_loader.rb +21 -2
  82. data/lib/chef/knife/core/ui.rb +8 -2
  83. data/lib/chef/knife/core/windows_bootstrap_context.rb +18 -4
  84. data/lib/chef/knife/data_bag_create.rb +1 -1
  85. data/lib/chef/knife/key_create_base.rb +1 -1
  86. data/lib/chef/knife/key_edit_base.rb +1 -1
  87. data/lib/chef/knife/node_bulk_delete.rb +1 -1
  88. data/lib/chef/knife/node_run_list_remove.rb +1 -1
  89. data/lib/chef/knife/rehash.rb +3 -21
  90. data/lib/chef/knife/role_bulk_delete.rb +1 -1
  91. data/lib/chef/knife/ssh.rb +7 -3
  92. data/lib/chef/knife/supermarket_share.rb +1 -1
  93. data/lib/chef/knife/supermarket_unshare.rb +1 -1
  94. data/lib/chef/log.rb +8 -3
  95. data/lib/chef/mixin/api_version_request_handling.rb +1 -1
  96. data/lib/chef/mixin/checksum.rb +0 -1
  97. data/{spec/functional/resource/base.rb → lib/chef/mixin/chef_utils_wiring.rb} +24 -12
  98. data/{spec/unit/log_spec.rb → lib/chef/mixin/default_paths.rb} +13 -5
  99. data/lib/chef/mixin/openssl_helper.rb +31 -9
  100. data/lib/chef/mixin/path_sanity.rb +5 -4
  101. data/lib/chef/mixin/properties.rb +2 -2
  102. data/lib/chef/mixin/securable.rb +2 -2
  103. data/lib/chef/mixin/shell_out.rb +4 -188
  104. data/lib/chef/mixin/template.rb +1 -0
  105. data/lib/chef/mixin/which.rb +6 -3
  106. data/lib/chef/mixins.rb +1 -0
  107. data/lib/chef/node.rb +36 -12
  108. data/lib/chef/node/attribute.rb +2 -2
  109. data/lib/chef/node/immutable_collections.rb +1 -1
  110. data/lib/chef/node_map.rb +21 -18
  111. data/lib/chef/platform/service_helpers.rb +31 -28
  112. data/lib/chef/policy_builder/policyfile.rb +1 -1
  113. data/lib/chef/powershell.rb +1 -1
  114. data/lib/chef/property.rb +2 -2
  115. data/lib/chef/provider.rb +3 -3
  116. data/lib/chef/provider/batch.rb +3 -10
  117. data/lib/chef/provider/cron.rb +2 -14
  118. data/lib/chef/provider/directory.rb +1 -1
  119. data/lib/chef/provider/execute.rb +2 -1
  120. data/lib/chef/provider/file.rb +1 -1
  121. data/lib/chef/provider/git.rb +12 -4
  122. data/lib/chef/provider/group/dscl.rb +2 -2
  123. data/lib/chef/provider/group/windows.rb +1 -1
  124. data/lib/chef/provider/ifconfig.rb +7 -7
  125. data/lib/chef/provider/mount/aix.rb +1 -1
  126. data/lib/chef/provider/mount/solaris.rb +0 -1
  127. data/lib/chef/provider/mount/windows.rb +2 -2
  128. data/lib/chef/provider/noop.rb +1 -1
  129. data/lib/chef/provider/package/chocolatey.rb +1 -1
  130. data/lib/chef/provider/package/dpkg.rb +1 -1
  131. data/lib/chef/provider/package/openbsd.rb +1 -1
  132. data/lib/chef/provider/package/portage.rb +3 -2
  133. data/lib/chef/provider/package/powershell.rb +6 -2
  134. data/lib/chef/provider/package/rubygems.rb +3 -3
  135. data/lib/chef/provider/package/snap.rb +97 -29
  136. data/lib/chef/provider/package/windows.rb +11 -6
  137. data/lib/chef/provider/package/windows/msi.rb +3 -3
  138. data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +1 -1
  139. data/lib/chef/provider/package/yum.rb +1 -1
  140. data/lib/chef/provider/package/yum/yum_cache.rb +1 -1
  141. data/lib/chef/provider/package/zypper.rb +0 -1
  142. data/lib/chef/provider/powershell_script.rb +10 -14
  143. data/lib/chef/provider/remote_directory.rb +2 -2
  144. data/lib/chef/provider/remote_file/http.rb +4 -1
  145. data/lib/chef/provider/script.rb +4 -75
  146. data/lib/chef/provider/service.rb +2 -2
  147. data/lib/chef/provider/service/arch.rb +2 -2
  148. data/lib/chef/provider/service/debian.rb +2 -2
  149. data/lib/chef/provider/service/openbsd.rb +4 -4
  150. data/lib/chef/provider/service/redhat.rb +1 -1
  151. data/lib/chef/provider/service/upstart.rb +1 -1
  152. data/lib/chef/provider/service/windows.rb +1 -1
  153. data/lib/chef/provider/subversion.rb +2 -2
  154. data/lib/chef/provider/user/aix.rb +1 -1
  155. data/lib/chef/provider/user/dscl.rb +6 -6
  156. data/lib/chef/provider/user/linux.rb +3 -3
  157. data/lib/chef/provider/user/mac.rb +15 -11
  158. data/lib/chef/provider/windows_script.rb +87 -25
  159. data/lib/chef/provider/windows_task.rb +4 -2
  160. data/lib/chef/provider/yum_repository.rb +1 -1
  161. data/lib/chef/provider/zypper_repository.rb +31 -11
  162. data/lib/chef/resource.rb +27 -14
  163. data/lib/chef/resource/alternatives.rb +1 -1
  164. data/lib/chef/resource/apt_package.rb +1 -1
  165. data/lib/chef/resource/archive_file.rb +28 -8
  166. data/lib/chef/resource/bash.rb +0 -1
  167. data/lib/chef/resource/batch.rb +4 -2
  168. data/lib/chef/resource/build_essential.rb +2 -2
  169. data/lib/chef/resource/chef_client_scheduled_task.rb +14 -2
  170. data/lib/chef/resource/chef_gem.rb +57 -21
  171. data/lib/chef/resource/chef_handler.rb +2 -2
  172. data/lib/chef/resource/chef_vault_secret.rb +1 -1
  173. data/lib/chef/resource/chocolatey_feature.rb +1 -2
  174. data/lib/chef/resource/cron/_cron_shared.rb +98 -0
  175. data/lib/chef/resource/cron/cron.rb +46 -0
  176. data/lib/chef/resource/{cron_d.rb → cron/cron_d.rb} +7 -87
  177. data/lib/chef/resource/cron_access.rb +13 -5
  178. data/lib/chef/resource/csh.rb +0 -1
  179. data/lib/chef/resource/dmg_package.rb +2 -2
  180. data/lib/chef/resource/execute.rb +480 -10
  181. data/lib/chef/resource/file.rb +10 -8
  182. data/lib/chef/resource/freebsd_package.rb +1 -1
  183. data/lib/chef/resource/gem_package.rb +35 -2
  184. data/lib/chef/resource/helpers/cron_validations.rb +6 -3
  185. data/lib/chef/resource/homebrew_package.rb +30 -1
  186. data/lib/chef/resource/homebrew_update.rb +107 -0
  187. data/lib/chef/resource/hostname.rb +7 -20
  188. data/lib/chef/resource/kernel_module.rb +14 -1
  189. data/lib/chef/resource/launchd.rb +1 -1
  190. data/lib/chef/resource/locale.rb +3 -3
  191. data/lib/chef/resource/lwrp_base.rb +1 -0
  192. data/lib/chef/resource/macos_userdefaults.rb +176 -56
  193. data/lib/chef/resource/mount.rb +1 -1
  194. data/lib/chef/resource/openssl_x509_certificate.rb +11 -14
  195. data/lib/chef/resource/openssl_x509_crl.rb +1 -2
  196. data/lib/chef/resource/perl.rb +0 -1
  197. data/lib/chef/resource/plist.rb +23 -4
  198. data/lib/chef/resource/powershell_script.rb +4 -2
  199. data/lib/chef/resource/python.rb +0 -1
  200. data/lib/chef/resource/remote_file.rb +26 -10
  201. data/lib/chef/resource/ruby.rb +0 -1
  202. data/lib/chef/resource/scm/git.rb +1 -1
  203. data/lib/chef/resource/service.rb +2 -2
  204. data/lib/chef/resource/ssh_known_hosts_entry.rb +16 -1
  205. data/lib/chef/resource/sudo.rb +30 -3
  206. data/lib/chef/resource/swap_file.rb +17 -0
  207. data/lib/chef/resource/template.rb +1 -1
  208. data/lib/chef/resource/timezone.rb +15 -0
  209. data/lib/chef/resource/user_ulimit.rb +1 -1
  210. data/lib/chef/resource/windows_ad_join.rb +30 -1
  211. data/lib/chef/resource/windows_audit_policy.rb +227 -0
  212. data/lib/chef/resource/windows_auto_run.rb +11 -0
  213. data/lib/chef/resource/windows_certificate.rb +27 -1
  214. data/lib/chef/resource/windows_dfs_server.rb +1 -1
  215. data/lib/chef/resource/windows_dns_record.rb +17 -0
  216. data/lib/chef/resource/windows_firewall_profile.rb +197 -0
  217. data/lib/chef/resource/windows_font.rb +3 -3
  218. data/lib/chef/resource/windows_package.rb +1 -1
  219. data/lib/chef/resource/windows_pagefile.rb +2 -2
  220. data/lib/chef/resource/windows_script.rb +2 -16
  221. data/lib/chef/resource/windows_security_policy.rb +67 -36
  222. data/lib/chef/resource/windows_shortcut.rb +1 -2
  223. data/lib/chef/resource/windows_task.rb +10 -10
  224. data/lib/chef/resource/windows_user_privilege.rb +33 -10
  225. data/lib/chef/resource/yum_repository.rb +9 -9
  226. data/lib/chef/resource_inspector.rb +11 -4
  227. data/lib/chef/resources.rb +5 -2
  228. data/lib/chef/role.rb +1 -2
  229. data/lib/chef/run_context/cookbook_compiler.rb +1 -1
  230. data/lib/chef/search/query.rb +1 -1
  231. data/lib/chef/shell/ext.rb +1 -1
  232. data/lib/chef/shell/shell_session.rb +2 -0
  233. data/lib/chef/util/diff.rb +2 -3
  234. data/lib/chef/util/windows/net_user.rb +1 -1
  235. data/lib/chef/util/windows/volume.rb +1 -1
  236. data/lib/chef/version.rb +2 -2
  237. data/lib/chef/win32/api.rb +2 -2
  238. data/lib/chef/win32/api/error.rb +3 -1
  239. data/lib/chef/win32/api/file.rb +1 -1
  240. data/lib/chef/win32/api/net.rb +1 -0
  241. data/lib/chef/win32/file.rb +1 -1
  242. data/lib/chef/win32/mutex.rb +1 -1
  243. data/lib/chef/win32/net.rb +1 -0
  244. data/lib/chef/win32/registry.rb +3 -4
  245. data/lib/chef/win32/security.rb +1 -1
  246. data/lib/chef/win32/security/sid.rb +4 -4
  247. data/spec/data/lwrp/providers/buck_passer.rb +1 -1
  248. data/spec/data/lwrp/providers/buck_passer_2.rb +1 -1
  249. data/spec/data/lwrp/providers/embedded_resource_accesses_providers_scope.rb +1 -1
  250. data/spec/functional/knife/configure_spec.rb +1 -1
  251. data/spec/functional/knife/ssh_spec.rb +5 -16
  252. data/spec/functional/resource/aix_service_spec.rb +9 -2
  253. data/spec/functional/resource/aixinit_service_spec.rb +1 -2
  254. data/spec/functional/resource/apt_package_spec.rb +0 -1
  255. data/spec/functional/resource/bash_spec.rb +3 -2
  256. data/spec/functional/resource/bff_spec.rb +1 -1
  257. data/spec/functional/resource/chocolatey_package_spec.rb +4 -0
  258. data/spec/functional/resource/cron_spec.rb +20 -2
  259. data/spec/functional/resource/dnf_package_spec.rb +6 -3
  260. data/spec/functional/resource/execute_spec.rb +1 -1
  261. data/spec/functional/resource/git_spec.rb +29 -7
  262. data/spec/functional/resource/group_spec.rb +15 -3
  263. data/spec/functional/resource/ifconfig_spec.rb +9 -1
  264. data/spec/functional/resource/insserv_spec.rb +3 -3
  265. data/spec/functional/resource/link_spec.rb +2 -5
  266. data/spec/functional/resource/mount_spec.rb +9 -1
  267. data/spec/functional/resource/msu_package_spec.rb +9 -3
  268. data/spec/functional/resource/powershell_script_spec.rb +4 -4
  269. data/spec/functional/resource/remote_file_spec.rb +9 -15
  270. data/spec/functional/resource/rpm_spec.rb +1 -1
  271. data/spec/functional/resource/timezone_spec.rb +2 -0
  272. data/spec/functional/resource/windows_package_spec.rb +0 -1
  273. data/spec/functional/resource/windows_path_spec.rb +4 -0
  274. data/spec/functional/resource/windows_security_policy_spec.rb +0 -1
  275. data/spec/functional/resource/windows_service_spec.rb +4 -0
  276. data/spec/functional/resource/windows_task_spec.rb +16 -15
  277. data/spec/functional/resource/windows_user_privilege_spec.rb +1 -2
  278. data/spec/functional/resource/yum_package_spec.rb +4 -1
  279. data/spec/functional/resource/zypper_package_spec.rb +4 -1
  280. data/spec/functional/run_lock_spec.rb +2 -1
  281. data/spec/functional/shell_spec.rb +5 -6
  282. data/spec/functional/util/powershell/cmdlet_spec.rb +1 -1
  283. data/spec/functional/version_spec.rb +1 -1
  284. data/spec/functional/win32/crypto_spec.rb +1 -1
  285. data/spec/integration/knife/config_list_profiles_spec.rb +30 -2
  286. data/spec/integration/knife/config_use_profile_spec.rb +55 -2
  287. data/spec/integration/knife/cookbook_upload_spec.rb +28 -1
  288. data/spec/integration/knife/data_bag_from_file_spec.rb +1 -1
  289. data/spec/integration/knife/environment_from_file_spec.rb +1 -1
  290. data/spec/integration/knife/node_from_file_spec.rb +1 -1
  291. data/spec/integration/knife/role_from_file_spec.rb +1 -1
  292. data/spec/integration/recipes/accumulator_spec.rb +1 -1
  293. data/spec/integration/recipes/lwrp_inline_resources_spec.rb +1 -1
  294. data/spec/integration/recipes/lwrp_spec.rb +1 -1
  295. data/spec/integration/recipes/notifies_spec.rb +1 -1
  296. data/spec/integration/recipes/notifying_block_spec.rb +1 -1
  297. data/spec/integration/recipes/recipe_dsl_spec.rb +5 -1
  298. data/spec/integration/recipes/resource_converge_if_changed_spec.rb +2 -0
  299. data/spec/integration/recipes/resource_load_spec.rb +4 -2
  300. data/spec/integration/recipes/unified_mode_spec.rb +1 -1
  301. data/spec/integration/recipes/use_partial_spec.rb +1 -1
  302. data/spec/scripts/ssl-serve.rb +1 -1
  303. data/spec/spec_helper.rb +10 -4
  304. data/spec/support/chef_helpers.rb +2 -21
  305. data/spec/support/platform_helpers.rb +1 -3
  306. data/spec/support/platforms/win32/spec_service.rb +1 -1
  307. data/spec/support/shared/functional/execute_resource.rb +1 -1
  308. data/spec/support/shared/functional/file_resource.rb +0 -1
  309. data/spec/support/shared/functional/securable_resource.rb +1 -2
  310. data/spec/support/shared/functional/securable_resource_with_reporting.rb +0 -1
  311. data/spec/support/shared/functional/windows_script.rb +3 -3
  312. data/spec/support/shared/integration/knife_support.rb +2 -9
  313. data/spec/support/shared/unit/application_dot_d.rb +0 -1
  314. data/spec/support/shared/unit/execute_resource.rb +1 -1
  315. data/spec/support/shared/unit/provider/file.rb +12 -8
  316. data/spec/support/shared/unit/provider/useradd_based_user_provider.rb +4 -4
  317. data/spec/unit/application/solo_spec.rb +4 -2
  318. data/spec/unit/application_spec.rb +11 -2
  319. data/spec/unit/chef_fs/config_spec.rb +2 -2
  320. data/spec/unit/chef_fs/diff_spec.rb +8 -8
  321. data/spec/unit/chef_fs/file_system/operation_failed_error_spec.rb +2 -4
  322. data/spec/unit/chef_fs/{parallelizer.rb → parallelizer_spec.rb} +1 -1
  323. data/spec/unit/client_spec.rb +4 -1
  324. data/spec/unit/cookbook/gem_installer_spec.rb +2 -1
  325. data/spec/unit/cookbook/synchronizer_spec.rb +26 -24
  326. data/spec/unit/data_bag_spec.rb +6 -3
  327. data/spec/unit/data_collector_spec.rb +1 -1
  328. data/spec/unit/decorator_spec.rb +23 -23
  329. data/spec/unit/dsl/platform_introspection_spec.rb +1 -0
  330. data/spec/unit/environment_spec.rb +5 -1
  331. data/spec/unit/event_dispatch/dispatcher_spec.rb +3 -0
  332. data/spec/unit/guard_interpreter_spec.rb +1 -1
  333. data/spec/unit/http/api_versions_spec.rb +1 -1
  334. data/spec/unit/http/ssl_policies_spec.rb +20 -0
  335. data/spec/unit/json_compat_spec.rb +1 -1
  336. data/spec/unit/knife/bootstrap_spec.rb +5 -8
  337. data/spec/unit/knife/cookbook_download_spec.rb +2 -2
  338. data/spec/unit/knife/cookbook_show_spec.rb +6 -7
  339. data/spec/unit/knife/cookbook_upload_spec.rb +7 -10
  340. data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +7 -1
  341. data/spec/unit/knife/data_bag_edit_spec.rb +1 -1
  342. data/spec/unit/log/syslog_spec.rb +6 -10
  343. data/spec/unit/log/winevt_spec.rb +21 -13
  344. data/spec/unit/lwrp_spec.rb +9 -6
  345. data/spec/unit/mixin/{path_sanity_spec.rb → default_paths_spec.rb} +14 -14
  346. data/spec/unit/mixin/openssl_helper_spec.rb +4 -4
  347. data/spec/unit/mixin/powershell_exec_spec.rb +1 -1
  348. data/spec/unit/mixin/powershell_out_spec.rb +2 -4
  349. data/spec/unit/mixin/powershell_type_coercions_spec.rb +1 -1
  350. data/spec/unit/mixin/securable_spec.rb +0 -1
  351. data/spec/unit/mixin/shell_out_spec.rb +25 -26
  352. data/spec/unit/mixin/subclass_directive_spec.rb +2 -2
  353. data/spec/unit/mixin/unformatter_spec.rb +2 -2
  354. data/spec/unit/mixin/uris_spec.rb +1 -1
  355. data/spec/unit/mixin/user_context_spec.rb +1 -9
  356. data/spec/unit/mixin/which.rb +8 -0
  357. data/spec/unit/node/attribute_spec.rb +1 -1
  358. data/spec/unit/node_spec.rb +98 -11
  359. data/spec/unit/property_spec.rb +6 -6
  360. data/spec/unit/provider/batch_spec.rb +130 -0
  361. data/spec/unit/provider/cron/unix_spec.rb +1 -1
  362. data/spec/unit/provider/cron_spec.rb +9 -49
  363. data/spec/unit/provider/dsc_resource_spec.rb +22 -38
  364. data/spec/unit/provider/dsc_script_spec.rb +10 -10
  365. data/spec/unit/provider/execute_spec.rb +1 -8
  366. data/spec/unit/provider/git_spec.rb +3 -3
  367. data/spec/unit/provider/group/groupadd_spec.rb +1 -1
  368. data/spec/unit/provider/ifconfig_spec.rb +0 -1
  369. data/spec/unit/provider/mdadm_spec.rb +1 -3
  370. data/spec/unit/provider/package/dnf/python_helper_spec.rb +1 -1
  371. data/spec/unit/provider/package/openbsd_spec.rb +1 -1
  372. data/spec/unit/provider/package/pacman_spec.rb +17 -20
  373. data/spec/unit/provider/package/portage_spec.rb +2 -2
  374. data/spec/unit/provider/package/powershell_spec.rb +96 -87
  375. data/spec/unit/provider/package/rubygems_spec.rb +5 -10
  376. data/spec/unit/provider/package/smartos_spec.rb +1 -1
  377. data/spec/unit/provider/package/snap_spec.rb +1 -1
  378. data/spec/unit/provider/package/windows/registry_uninstall_entry_spec.rb +3 -3
  379. data/spec/unit/provider/package/windows_spec.rb +30 -53
  380. data/spec/unit/provider/powershell_script_spec.rb +3 -45
  381. data/spec/unit/provider/script_spec.rb +20 -110
  382. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  383. data/spec/unit/provider/service/windows_spec.rb +2 -6
  384. data/spec/unit/provider/systemd_unit_spec.rb +28 -24
  385. data/spec/unit/provider/user/dscl_spec.rb +2 -2
  386. data/spec/unit/provider/windows_env_spec.rb +5 -4
  387. data/spec/unit/provider/zypper_repository_spec.rb +60 -10
  388. data/spec/unit/provider_spec.rb +1 -0
  389. data/spec/unit/resource/archive_file_spec.rb +11 -2
  390. data/spec/unit/resource/chef_client_cron_spec.rb +23 -7
  391. data/spec/unit/resource/chef_client_scheduled_task_spec.rb +17 -7
  392. data/spec/unit/resource/chef_client_systemd_timer_spec.rb +7 -4
  393. data/spec/unit/resource/cron_spec.rb +2 -2
  394. data/spec/unit/resource/execute_spec.rb +10 -0
  395. data/spec/unit/resource/file/verification_spec.rb +2 -1
  396. data/spec/unit/resource/helpers/cron_validations_spec.rb +5 -1
  397. data/spec/unit/resource/homebrew_update_spec.rb +30 -0
  398. data/spec/unit/resource/macos_user_defaults_spec.rb +103 -2
  399. data/spec/unit/resource/powershell_script_spec.rb +10 -15
  400. data/spec/unit/resource/timezone_spec.rb +1 -1
  401. data/spec/unit/resource/windows_audit_policy_spec.rb +64 -0
  402. data/spec/unit/resource/windows_dns_record_spec.rb +3 -3
  403. data/spec/unit/resource/windows_dns_zone_spec.rb +2 -2
  404. data/spec/unit/resource/windows_firewall_profile_spec.rb +77 -0
  405. data/spec/unit/resource/windows_package_spec.rb +1 -0
  406. data/spec/unit/resource/windows_task_spec.rb +1 -1
  407. data/spec/unit/resource/windows_uac_spec.rb +2 -2
  408. data/spec/unit/resource/yum_repository_spec.rb +21 -21
  409. data/spec/unit/resource_reporter_spec.rb +1 -1
  410. data/spec/unit/resource_spec.rb +84 -1
  411. data/spec/unit/role_spec.rb +23 -21
  412. data/spec/unit/run_context/cookbook_compiler_spec.rb +1 -1
  413. data/spec/unit/run_lock_spec.rb +1 -1
  414. data/spec/unit/scan_access_control_spec.rb +1 -1
  415. data/spec/unit/util/backup_spec.rb +1 -1
  416. data/spec/unit/util/diff_spec.rb +1 -15
  417. data/spec/unit/util/dsc/configuration_generator_spec.rb +1 -1
  418. data/spec/unit/util/powershell/ps_credential_spec.rb +2 -2
  419. data/spec/unit/util/selinux_spec.rb +2 -1
  420. data/spec/unit/util/threaded_job_queue_spec.rb +9 -0
  421. data/spec/unit/win32/registry_spec.rb +1 -1
  422. data/spec/unit/win32/security_spec.rb +4 -3
  423. metadata +68 -40
  424. data/lib/chef/resource/cron.rb +0 -157
@@ -42,7 +42,7 @@ class Chef
42
42
  option :expiration_date,
43
43
  short: "-e DATE",
44
44
  long: "--expiration-date DATE",
45
- description: "Optionally pass the expiration date for the key in ISO 8601 fomatted string: YYYY-MM-DDTHH:MM:SSZ e.g. 2013-12-24T21:00:00Z. Defaults to infinity if not passed. UTC timezone assumed."
45
+ description: "Optionally pass the expiration date for the key in ISO 8601 formatted string: YYYY-MM-DDTHH:MM:SSZ e.g. 2013-12-24T21:00:00Z. Defaults to infinity if not passed. UTC timezone assumed."
46
46
  end
47
47
  end
48
48
  end
@@ -47,7 +47,7 @@ class Chef
47
47
  option :expiration_date,
48
48
  short: "-e DATE",
49
49
  long: "--expiration-date DATE",
50
- description: "Updates the expiration_date field of your key if passed. Pass in ISO 8601 fomatted string: YYYY-MM-DDTHH:MM:SSZ e.g. 2013-12-24T21:00:00Z or infinity. UTC timezone assumed."
50
+ description: "Updates the expiration_date field of your key if passed. Pass in ISO 8601 formatted string: YYYY-MM-DDTHH:MM:SSZ e.g. 2013-12-24T21:00:00Z or infinity. UTC timezone assumed."
51
51
  end
52
52
  end
53
53
  end
@@ -39,7 +39,7 @@ class Chef
39
39
  matcher = /#{name_args[0]}/
40
40
 
41
41
  all_nodes.each do |name, node|
42
- next unless name =~ matcher
42
+ next unless name&.match?(matcher)
43
43
 
44
44
  nodes_to_delete[name] = node
45
45
  end
@@ -49,7 +49,7 @@ class Chef
49
49
  node.run_list.remove(e)
50
50
  else
51
51
  ui.warn "#{e} is not in the run list"
52
- unless e =~ /^(recipe|role)\[/
52
+ unless /^(recipe|role)\[/.match?(e)
53
53
  ui.warn "(did you forget recipe[] or role[] around it?)"
54
54
  end
55
55
  end
@@ -34,7 +34,9 @@ class Chef
34
34
  else
35
35
  reload_plugins
36
36
  end
37
- write_hash(generate_hash)
37
+
38
+ ui.msg "Knife subcommands are cached in #{Chef::Knife::SubcommandLoader.plugin_manifest_path}. Delete this file to disable the caching."
39
+ Chef::Knife::SubcommandLoader.write_hash(Chef::Knife::SubcommandLoader.generate_hash)
38
40
  end
39
41
 
40
42
  def reload_plugins
@@ -43,26 +45,6 @@ class Chef
43
45
  # loaded plugins and `load_commands` shouldn't have an effect.
44
46
  Chef::Knife.subcommand_loader.load_commands
45
47
  end
46
-
47
- def generate_hash
48
- output = if Chef::Knife::SubcommandLoader.plugin_manifest?
49
- Chef::Knife::SubcommandLoader.plugin_manifest
50
- else
51
- { Chef::Knife::SubcommandLoader::HashedCommandLoader::KEY => {} }
52
- end
53
- output[Chef::Knife::SubcommandLoader::HashedCommandLoader::KEY]["plugins_paths"] = Chef::Knife.subcommand_files
54
- output[Chef::Knife::SubcommandLoader::HashedCommandLoader::KEY]["plugins_by_category"] = Chef::Knife.subcommands_by_category
55
- output
56
- end
57
-
58
- def write_hash(data)
59
- plugin_manifest_dir = File.expand_path("..", Chef::Knife::SubcommandLoader.plugin_manifest_path)
60
- FileUtils.mkdir_p(plugin_manifest_dir) unless File.directory?(plugin_manifest_dir)
61
- File.open(Chef::Knife::SubcommandLoader.plugin_manifest_path, "w") do |f|
62
- f.write(Chef::JSONCompat.to_json_pretty(data))
63
- ui.msg "Knife subcommands are cached in #{Chef::Knife::SubcommandLoader.plugin_manifest_path}. Delete this file to disable the caching."
64
- end
65
- end
66
48
  end
67
49
  end
68
50
  end
@@ -40,7 +40,7 @@ class Chef
40
40
  matcher = /#{@name_args[0]}/
41
41
  roles_to_delete = {}
42
42
  all_roles.each do |name, role|
43
- next unless name =~ matcher
43
+ next unless name&.match?(matcher)
44
44
 
45
45
  roles_to_delete[role.name] = role
46
46
  end
@@ -59,7 +59,7 @@ class Chef
59
59
 
60
60
  option :prefix_attribute,
61
61
  long: "--prefix-attribute ATTR",
62
- description: "The attribute to use for prefixing the ouput - default depends on the context."
62
+ description: "The attribute to use for prefixing the output - default depends on the context."
63
63
 
64
64
  option :ssh_user,
65
65
  short: "-x USERNAME",
@@ -296,6 +296,10 @@ class Chef
296
296
  opts[:keepalive] = true
297
297
  opts[:keepalive_interval] = ssh_config[:keepalive_interval]
298
298
  end
299
+ # maintain support for legacy key types / ciphers / key exchange algorithms.
300
+ # most importantly this adds back support for DSS host keys
301
+ # See https://github.com/net-ssh/net-ssh/pull/709
302
+ opts[:append_all_supported_algorithms] = true
299
303
  end
300
304
  end
301
305
 
@@ -364,7 +368,7 @@ class Chef
364
368
 
365
369
  ch.on_data do |ichannel, data|
366
370
  print_data(ichannel.connection[:prefix], data)
367
- if data =~ /^knife sudo password: /
371
+ if /^knife sudo password: /.match?(data)
368
372
  print_data(ichannel.connection[:prefix], "\n")
369
373
  ichannel.send_data("#{get_password}\n")
370
374
  end
@@ -384,7 +388,7 @@ class Chef
384
388
  end
385
389
 
386
390
  def prompt_for_password(prompt = "Enter your password: ")
387
- ui.ask(prompt) { |q| q.echo = false }
391
+ ui.ask(prompt, echo: false)
388
392
  end
389
393
 
390
394
  # Present the prompt and read a single line from the console. It also
@@ -132,7 +132,7 @@ class Chef
132
132
  res = Chef::JSONCompat.from_json(http_resp.body)
133
133
  if http_resp.code.to_i != 201
134
134
  if res["error_messages"]
135
- if res["error_messages"][0] =~ /Version already exists/
135
+ if /Version already exists/.match?(res["error_messages"][0])
136
136
  ui.error "The same version of this cookbook already exists on Supermarket."
137
137
  exit(1)
138
138
  else
@@ -48,7 +48,7 @@ class Chef
48
48
  begin
49
49
  rest.delete "#{config[:supermarket_site]}/api/v1/cookbooks/#{@name_args[0]}"
50
50
  rescue Net::HTTPClientException => e
51
- raise e unless e.message =~ /Forbidden/
51
+ raise e unless /Forbidden/.match?(e.message)
52
52
 
53
53
  ui.error "Forbidden: You must be the maintainer of #{@cookbook_name} to unshare it."
54
54
  exit 1
@@ -21,15 +21,20 @@ require "logger"
21
21
  require_relative "monologger"
22
22
  require_relative "exceptions"
23
23
  require "mixlib/log"
24
- require_relative "log/syslog" unless RUBY_PLATFORM =~ /mswin|mingw|windows/
24
+ require_relative "log/syslog" unless RUBY_PLATFORM.match?(/mswin|mingw|windows/)
25
25
  require_relative "log/winevt"
26
26
 
27
27
  class Chef
28
28
  class Log
29
29
  extend Mixlib::Log
30
30
 
31
+ def self.setup!
32
+ init(MonoLogger.new(STDOUT))
33
+ nil
34
+ end
35
+
31
36
  # Force initialization of the primary log device (@logger)
32
- init(MonoLogger.new(STDOUT))
37
+ setup!
33
38
 
34
39
  class Formatter
35
40
  def self.show_time=(*args)
@@ -47,7 +52,7 @@ class Chef
47
52
  def self.caller_location
48
53
  # Pick the first caller that is *not* part of the Chef gem, that's the
49
54
  # thing the user wrote. Or failing that, the most recent caller.
50
- chef_gem_path = File.expand_path("../..", __FILE__)
55
+ chef_gem_path = File.expand_path("..", __dir__)
51
56
  caller(0..20).find { |c| !c.start_with?(chef_gem_path) } || caller(0..1)[0]
52
57
  end
53
58
 
@@ -53,7 +53,7 @@ class Chef
53
53
  <<~EOH
54
54
  The reregister command only supports server API version 0.
55
55
  The server that received the request supports a min version of #{min_version} and a max version of #{max_version}.
56
- User keys are now managed via the key rotation commmands.
56
+ User keys are now managed via the key rotation commands.
57
57
  Please refer to the documentation on how to manage your keys via the key rotation commands:
58
58
  https://docs.chef.io/ctl_chef_server/#key-rotation
59
59
  EOH
@@ -16,7 +16,6 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
- require "digest/sha2" unless defined?(Digest::SHA2)
20
19
  require_relative "../digester"
21
20
 
22
21
  class Chef
@@ -1,5 +1,4 @@
1
- #
2
- # Author:: Kaustubh Deorukhkar (<kaustubh@clogeny.com>)
1
+ #--
3
2
  # Copyright:: Copyright (c) Chef Software Inc.
4
3
  # License:: Apache License, Version 2.0
5
4
  #
@@ -7,22 +6,35 @@
7
6
  # you may not use this file except in compliance with the License.
8
7
  # You may obtain a copy of the License at
9
8
  #
10
- # http://www.apache.org/licenses/LICENSE-2.0
9
+ # http://www.apache.org/licenses/LICENSE-2.0
11
10
  #
12
11
  # Unless required by applicable law or agreed to in writing, software
13
12
  # distributed under the License is distributed on an "AS IS" BASIS,
14
13
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
14
  # See the License for the specific language governing permissions and
16
15
  # limitations under the License.
17
- #
18
16
 
19
- def run_context
20
- @run_context ||= begin
21
- node = Chef::Node.new
22
- node.default[:platform] = ohai[:platform]
23
- node.default[:platform_version] = ohai[:platform_version]
24
- node.default[:os] = ohai[:os]
25
- events = Chef::EventDispatch::Dispatcher.new
26
- Chef::RunContext.new(node, {}, events)
17
+ require_relative "../log"
18
+ require_relative "../config"
19
+ require_relative "../chef_class"
20
+
21
+ class Chef
22
+ module Mixin
23
+ # Common Dependency Injection wiring for ChefUtils-related modules
24
+ module ChefUtilsWiring
25
+ private
26
+
27
+ def __config
28
+ Chef::Config
29
+ end
30
+
31
+ def __log
32
+ Chef::Log
33
+ end
34
+
35
+ def __transport_connection
36
+ Chef.run_context&.transport_connection
37
+ end
38
+ end
27
39
  end
28
40
  end
@@ -1,5 +1,4 @@
1
1
  #
2
- # Author:: Adam Jacob (<adam@chef.io>)
3
2
  # Copyright:: Copyright (c) Chef Software Inc.
4
3
  # License:: Apache License, Version 2.0
5
4
  #
@@ -16,9 +15,18 @@
16
15
  # limitations under the License.
17
16
  #
18
17
 
19
- require "tempfile"
20
- require "logger"
21
- require "spec_helper"
18
+ require "chef-utils/dsl/default_paths" unless defined?(ChefUtils::DSL::DefaultPaths)
22
19
 
23
- describe Chef::Log do
20
+ class Chef
21
+ module Mixin
22
+ module DefaultPaths
23
+ include ChefUtils::DSL::DefaultPaths
24
+
25
+ def enforce_default_paths(env = ENV)
26
+ if Chef::Config[:enforce_default_paths] || Chef::Config[:enforce_path_sanity]
27
+ env["PATH"] = default_paths(env)
28
+ end
29
+ end
30
+ end
31
+ end
24
32
  end
@@ -218,7 +218,7 @@ class Chef
218
218
  # Chef 12 backward compatibility
219
219
  ::OpenSSL::PKey::EC.send(:alias_method, :private?, :private_key?)
220
220
 
221
- request.sign(key, ::OpenSSL::Digest::SHA256.new)
221
+ request.sign(key, ::OpenSSL::Digest.new("SHA256"))
222
222
  request
223
223
  end
224
224
 
@@ -282,14 +282,16 @@ class Chef
282
282
  ef.issuer_certificate = info["issuer"]
283
283
  end
284
284
  ef.subject_certificate = cert
285
- ef.config = ::OpenSSL::Config.load(::OpenSSL::Config::DEFAULT_CONFIG_FILE)
285
+ if openssl_config = __openssl_config
286
+ ef.config = openssl_config
287
+ end
286
288
 
287
289
  cert.extensions = extension
288
290
  cert.add_extension ef.create_extension("subjectKeyIdentifier", "hash")
289
291
  cert.add_extension ef.create_extension("authorityKeyIdentifier",
290
292
  "keyid:always,issuer:always")
291
293
 
292
- cert.sign(key, ::OpenSSL::Digest::SHA256.new)
294
+ cert.sign(key, ::OpenSSL::Digest.new("SHA256"))
293
295
  cert
294
296
  end
295
297
 
@@ -313,13 +315,15 @@ class Chef
313
315
  crl.last_update = Time.now
314
316
  crl.next_update = Time.now + 3600 * 24 * info["validity"]
315
317
 
316
- ef.config = ::OpenSSL::Config.load(::OpenSSL::Config::DEFAULT_CONFIG_FILE)
318
+ if openssl_config = __openssl_config
319
+ ef.config = openssl_config
320
+ end
317
321
  ef.issuer_certificate = info["issuer"]
318
322
 
319
323
  crl.add_extension ::OpenSSL::X509::Extension.new("crlNumber", ::OpenSSL::ASN1::Integer(1))
320
324
  crl.add_extension ef.create_extension("authorityKeyIdentifier",
321
325
  "keyid:always,issuer:always")
322
- crl.sign(ca_private_key, ::OpenSSL::Digest::SHA256.new)
326
+ crl.sign(ca_private_key, ::OpenSSL::Digest.new("SHA256"))
323
327
  crl
324
328
  end
325
329
 
@@ -369,8 +373,7 @@ class Chef
369
373
  revoked.add_extension(ext)
370
374
  crl.add_revoked(revoked)
371
375
 
372
- crl = renew_x509_crl(crl, ca_private_key, info)
373
- crl
376
+ renew_x509_crl(crl, ca_private_key, info)
374
377
  end
375
378
 
376
379
  # renew a X509 crl given
@@ -391,14 +394,16 @@ class Chef
391
394
  crl.next_update = crl.last_update + 3600 * 24 * info["validity"]
392
395
 
393
396
  ef = ::OpenSSL::X509::ExtensionFactory.new
394
- ef.config = ::OpenSSL::Config.load(::OpenSSL::Config::DEFAULT_CONFIG_FILE)
397
+ if openssl_config = __openssl_config
398
+ ef.config = openssl_config
399
+ end
395
400
  ef.issuer_certificate = info["issuer"]
396
401
 
397
402
  crl.extensions = [ ::OpenSSL::X509::Extension.new("crlNumber",
398
403
  ::OpenSSL::ASN1::Integer(get_next_crl_number(crl)))]
399
404
  crl.add_extension ef.create_extension("authorityKeyIdentifier",
400
405
  "keyid:always,issuer:always")
401
- crl.sign(ca_private_key, ::OpenSSL::Digest::SHA256.new)
406
+ crl.sign(ca_private_key, ::OpenSSL::Digest.new("SHA256"))
402
407
  crl
403
408
  end
404
409
 
@@ -422,6 +427,23 @@ class Chef
422
427
 
423
428
  resp
424
429
  end
430
+
431
+ private
432
+
433
+ def __openssl_config
434
+ path = if File.exist?(::OpenSSL::Config::DEFAULT_CONFIG_FILE)
435
+ OpenSSL::Config::DEFAULT_CONFIG_FILE
436
+ else
437
+ Dir[File.join(RbConfig::CONFIG["prefix"], "**", "openssl.cnf")].first
438
+ end
439
+
440
+ if File.exist?(path)
441
+ ::OpenSSL::Config.load(path)
442
+ else
443
+ Chef::Log.warn("Couldn't find OpenSSL config file")
444
+ nil
445
+ end
446
+ end
425
447
  end
426
448
  end
427
449
  end
@@ -16,14 +16,15 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
+ require_relative "default_paths"
20
+
19
21
  class Chef
20
22
  module Mixin
21
- # @ deprecated
22
23
  module PathSanity
24
+ include Chef::Mixin::DefaultPaths
25
+
23
26
  def enforce_path_sanity(env = ENV)
24
- if Chef::Config[:enforce_path_sanity]
25
- env["PATH"] = ChefUtils::DSL::PathSanity.sanitized_path(env)
26
- end
27
+ enforce_default_paths(env)
27
28
  end
28
29
  end
29
30
  end
@@ -264,7 +264,7 @@ class Chef
264
264
  end
265
265
 
266
266
  result = properties.values.select(&:identity?)
267
- # if there are no other identity properites set, then the name_property becomes the identity, or
267
+ # if there are no other identity properties set, then the name_property becomes the identity, or
268
268
  # failing that we use the actual name.
269
269
  if result.empty?
270
270
  result = name_property ? [ properties[name_property] ] : [ properties[:name] ]
@@ -355,7 +355,7 @@ class Chef
355
355
  #
356
356
  # @param other [Object] the other object (Chef::Resource) which implements the properties API
357
357
  # @param includes [Array<Symbol>] splat-args list of symbols of the properties to copy.
358
- # @param exclude [Array<Symbol>] list of symbosl of the properties to exclude.
358
+ # @param exclude [Array<Symbol>] list of symbols of the properties to exclude.
359
359
  # @return the self object the properties were copied to for method chaining
360
360
  #
361
361
  def copy_properties_from(other, *includes, exclude: [ :name ])
@@ -172,14 +172,14 @@ class Chef
172
172
  end
173
173
  end
174
174
 
175
- if RUBY_PLATFORM =~ /mswin|mingw|windows/
175
+ if RUBY_PLATFORM.match?(/mswin|mingw|windows/)
176
176
  include WindowsSecurableAttributes
177
177
  end
178
178
 
179
179
  # Callback that fires when included; will extend the including class
180
180
  # with WindowsMacros and define #rights and #deny_rights on it.
181
181
  def self.included(including_class)
182
- if RUBY_PLATFORM =~ /mswin|mingw|windows/
182
+ if RUBY_PLATFORM.match?(/mswin|mingw|windows/)
183
183
  including_class.extend(WindowsMacros)
184
184
  # create a default 'rights' attribute
185
185
  including_class.rights_attribute(:rights)
@@ -15,198 +15,14 @@
15
15
  # See the License for the specific language governing permissions and
16
16
  # limitations under the License.
17
17
 
18
- require "mixlib/shellout" unless defined?(Mixlib::ShellOut::DEFAULT_READ_TIMEOUT)
19
- require "chef-utils/dsl/path_sanity" unless defined?(ChefUtils::DSL::PathSanity)
18
+ require "mixlib/shellout/helper" unless defined?(Mixlib::ShellOut::Helper)
19
+ require "chef/mixin/chef_utils_wiring" unless defined?(Chef::Mixin::ChefUtilsWiring)
20
20
 
21
21
  class Chef
22
22
  module Mixin
23
23
  module ShellOut
24
-
25
- # PREFERRED APIS:
26
- #
27
- # all consumers should now call shell_out!/shell_out.
28
- #
29
- # the shell_out_compacted/shell_out_compacted! APIs are private but are intended for use
30
- # in rspec tests, and should ideally always be used to make code refactoring that do not
31
- # change behavior easier:
32
- #
33
- # allow(provider).to receive(:shell_out_compacted!).with("foo", "bar", "baz")
34
- # provider.shell_out!("foo", [ "bar", nil, "baz"])
35
- # provider.shell_out!(["foo", nil, "bar" ], ["baz"])
36
- #
37
- # note that shell_out_compacted also includes adding the magical timeout option to force
38
- # people to setup expectations on that value explicitly. it does not include the default_env
39
- # mangling in order to avoid users having to setup an expectation on anything other than
40
- # setting `default_env: false` and allow us to make tweak to the default_env without breaking
41
- # a thousand unit tests.
42
- #
43
-
44
- def shell_out(*args, **options)
45
- options = options.dup
46
- options = Chef::Mixin::ShellOut.maybe_add_timeout(self, options)
47
- if options.empty?
48
- shell_out_compacted(*Chef::Mixin::ShellOut.clean_array(*args))
49
- else
50
- shell_out_compacted(*Chef::Mixin::ShellOut.clean_array(*args), **options)
51
- end
52
- end
53
-
54
- def shell_out!(*args, **options)
55
- options = options.dup
56
- options = Chef::Mixin::ShellOut.maybe_add_timeout(self, options)
57
- if options.empty?
58
- shell_out_compacted!(*Chef::Mixin::ShellOut.clean_array(*args))
59
- else
60
- shell_out_compacted!(*Chef::Mixin::ShellOut.clean_array(*args), **options)
61
- end
62
- end
63
-
64
- # helper sugar for resources that support passing timeouts to shell_out
65
- #
66
- # module method to not pollute namespaces, but that means we need self injected as an arg
67
- # @api private
68
- def self.maybe_add_timeout(obj, options)
69
- options = options.dup
70
- # historically resources have not properly declared defaults on their timeouts, so a default default of 900s was enforced here
71
- default_val = 900
72
- return options if options.key?(:timeout)
73
-
74
- # FIXME: need to nuke descendents tracker out of Chef::Provider so we can just define that class here without requiring the
75
- # world, and then just use symbol lookup
76
- if obj.class.ancestors.map(&:name).include?("Chef::Provider") && obj.respond_to?(:new_resource) && obj.new_resource.respond_to?(:timeout) && !options.key?(:timeout)
77
- options[:timeout] = obj.new_resource.timeout ? obj.new_resource.timeout.to_f : default_val
78
- end
79
- options
80
- end
81
-
82
- # helper function to mangle options when `default_env` is true
83
- #
84
- # @api private
85
- def self.apply_default_env(options)
86
- options = options.dup
87
- default_env = options.delete(:default_env)
88
- default_env = true if default_env.nil?
89
- if default_env
90
- env_key = options.key?(:env) ? :env : :environment
91
- options[env_key] = {
92
- "LC_ALL" => Chef::Config[:internal_locale],
93
- "LANGUAGE" => Chef::Config[:internal_locale],
94
- "LANG" => Chef::Config[:internal_locale],
95
- env_path => ChefUtils::DSL::PathSanity.sanitized_path,
96
- }.update(options[env_key] || {})
97
- end
98
- options
99
- end
100
-
101
- private
102
-
103
- # this SHOULD be used for setting up expectations in rspec, see banner comment at top.
104
- #
105
- # the private constraint is meant to avoid code calling this directly, rspec expectations are fine.
106
- #
107
- def shell_out_compacted(*args, **options)
108
- options = Chef::Mixin::ShellOut.apply_default_env(options)
109
- if options.empty?
110
- Chef::Mixin::ShellOut.shell_out_command(*args)
111
- else
112
- Chef::Mixin::ShellOut.shell_out_command(*args, **options)
113
- end
114
- end
115
-
116
- # this SHOULD be used for setting up expectations in rspec, see banner comment at top.
117
- #
118
- # the private constraint is meant to avoid code calling this directly, rspec expectations are fine.
119
- #
120
- def shell_out_compacted!(*args, **options)
121
- options = Chef::Mixin::ShellOut.apply_default_env(options)
122
- cmd = if options.empty?
123
- Chef::Mixin::ShellOut.shell_out_command(*args)
124
- else
125
- Chef::Mixin::ShellOut.shell_out_command(*args, **options)
126
- end
127
- cmd.error!
128
- cmd
129
- end
130
-
131
- # Helper for subclasses to reject nil out of an array. It allows
132
- # using the array form of shell_out (which avoids the need to surround arguments with
133
- # quote marks to deal with shells).
134
- #
135
- # Usage:
136
- # shell_out!(*clean_array("useradd", universal_options, useradd_options, new_resource.username))
137
- #
138
- # universal_options and useradd_options can be nil, empty array, empty string, strings or arrays
139
- # and the result makes sense.
140
- #
141
- # keeping this separate from shell_out!() makes it a bit easier to write expectations against the
142
- # shell_out args and be able to omit nils and such in the tests (and to test that the nils are
143
- # being rejected correctly).
144
- #
145
- # @param args [String] variable number of string arguments
146
- # @return [Array] array of strings with nil and null string rejection
147
-
148
- def self.clean_array(*args)
149
- args.flatten.compact.map(&:to_s)
150
- end
151
-
152
- def self.transport_connection
153
- Chef.run_context.transport_connection
154
- end
155
-
156
- def self.shell_out_command(*args, **options)
157
- if Chef::Config.target_mode?
158
- FakeShellOut.new(args, options, transport_connection.run_command(args.join(" "))) # FIXME: train should accept run_command(*args)
159
- else
160
- cmd = if options.empty?
161
- Mixlib::ShellOut.new(*args)
162
- else
163
- Mixlib::ShellOut.new(*args, **options)
164
- end
165
- cmd.live_stream ||= io_for_live_stream
166
- cmd.run_command
167
- cmd
168
- end
169
- end
170
-
171
- def self.io_for_live_stream
172
- if STDOUT.tty? && !Chef::Config[:daemon] && Chef::Log.debug?
173
- STDOUT
174
- else
175
- nil
176
- end
177
- end
178
-
179
- def self.env_path
180
- if ChefUtils.windows?
181
- "Path"
182
- else
183
- "PATH"
184
- end
185
- end
186
-
187
- class FakeShellOut
188
- attr_reader :stdout, :stderr, :exitstatus, :status
189
-
190
- def initialize(args, options, result)
191
- @args = args
192
- @options = options
193
- @stdout = result.stdout
194
- @stderr = result.stderr
195
- @exitstatus = result.exit_status
196
- @status = OpenStruct.new(success?: ( exitstatus == 0 ))
197
- end
198
-
199
- def error?
200
- exitstatus != 0
201
- end
202
-
203
- def error!
204
- raise Mixlib::ShellOut::ShellCommandFailed, "Unexpected exit status of #{exitstatus} running #{@args}" if error?
205
- end
206
- end
24
+ include Mixlib::ShellOut::Helper
25
+ include Chef::Mixin::ChefUtilsWiring
207
26
  end
208
27
  end
209
28
  end
210
-
211
- # Break circular dep
212
- require_relative "../config"