chef 16.1.16-universal-mingw32 → 16.3.45-universal-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (364) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +6 -7
  3. data/README.md +3 -3
  4. data/Rakefile +3 -16
  5. data/chef-universal-mingw32.gemspec +2 -2
  6. data/chef.gemspec +7 -6
  7. data/lib/chef/application.rb +12 -0
  8. data/lib/chef/application/apply.rb +2 -1
  9. data/lib/chef/application/base.rb +1 -1
  10. data/lib/chef/application/client.rb +1 -1
  11. data/lib/chef/application/windows_service_manager.rb +1 -1
  12. data/lib/chef/{whitelist.rb → attribute_allowlist.rb} +11 -11
  13. data/lib/chef/{blacklist.rb → attribute_blocklist.rb} +9 -9
  14. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +1 -1
  15. data/lib/chef/chef_fs/data_handler/organization_data_handler.rb +1 -2
  16. data/lib/chef/chef_fs/file_system/chef_server/cookbook_file.rb +2 -2
  17. data/lib/chef/chef_fs/file_system/chef_server/cookbooks_dir.rb +1 -5
  18. data/lib/chef/chef_fs/file_system/repository/base_file.rb +1 -0
  19. data/lib/chef/chef_fs/parallelizer/parallel_enumerable.rb +1 -1
  20. data/lib/chef/chef_fs/path_utils.rb +1 -1
  21. data/lib/chef/client.rb +3 -3
  22. data/lib/chef/cookbook/chefignore.rb +1 -1
  23. data/lib/chef/cookbook/metadata.rb +1 -1
  24. data/lib/chef/cookbook/remote_file_vendor.rb +1 -3
  25. data/lib/chef/cookbook/syntax_check.rb +1 -2
  26. data/lib/chef/cookbook_loader.rb +15 -29
  27. data/lib/chef/cookbook_version.rb +2 -2
  28. data/lib/chef/data_bag.rb +5 -6
  29. data/lib/chef/deprecated.rb +12 -0
  30. data/lib/chef/digester.rb +3 -2
  31. data/lib/chef/dsl/platform_introspection.rb +2 -0
  32. data/lib/chef/environment.rb +1 -2
  33. data/lib/chef/exceptions.rb +3 -0
  34. data/lib/chef/file_access_control.rb +1 -1
  35. data/lib/chef/file_access_control/windows.rb +2 -2
  36. data/lib/chef/file_content_management/deploy/mv_unix.rb +1 -1
  37. data/lib/chef/formatters/error_inspectors/compile_error_inspector.rb +1 -1
  38. data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +3 -3
  39. data/lib/chef/handler.rb +2 -0
  40. data/lib/chef/http.rb +27 -13
  41. data/lib/chef/http/authenticator.rb +3 -1
  42. data/lib/chef/http/http_request.rb +1 -1
  43. data/lib/chef/http/json_output.rb +1 -1
  44. data/lib/chef/http/ssl_policies.rb +18 -0
  45. data/lib/chef/knife.rb +5 -5
  46. data/lib/chef/knife/bootstrap.rb +19 -19
  47. data/lib/chef/knife/bootstrap/templates/chef-full.erb +9 -9
  48. data/lib/chef/knife/bootstrap/train_connector.rb +1 -0
  49. data/lib/chef/knife/client_bulk_delete.rb +1 -1
  50. data/lib/chef/knife/config_get.rb +2 -1
  51. data/lib/chef/knife/config_list_profiles.rb +4 -1
  52. data/lib/chef/knife/config_use_profile.rb +15 -5
  53. data/lib/chef/knife/configure.rb +1 -1
  54. data/lib/chef/knife/cookbook_delete.rb +1 -1
  55. data/lib/chef/knife/cookbook_upload.rb +6 -14
  56. data/lib/chef/knife/core/bootstrap_context.rb +1 -1
  57. data/lib/chef/knife/core/cookbook_scm_repo.rb +1 -1
  58. data/lib/chef/knife/core/gem_glob_loader.rb +1 -1
  59. data/lib/chef/knife/core/hashed_command_loader.rb +1 -0
  60. data/lib/chef/knife/core/subcommand_loader.rb +20 -1
  61. data/lib/chef/knife/core/ui.rb +8 -2
  62. data/lib/chef/knife/core/windows_bootstrap_context.rb +2 -3
  63. data/lib/chef/knife/data_bag_create.rb +1 -1
  64. data/lib/chef/knife/node_bulk_delete.rb +1 -1
  65. data/lib/chef/knife/node_run_list_remove.rb +1 -1
  66. data/lib/chef/knife/rehash.rb +3 -21
  67. data/lib/chef/knife/role_bulk_delete.rb +1 -1
  68. data/lib/chef/knife/ssh.rb +6 -2
  69. data/lib/chef/knife/supermarket_share.rb +1 -1
  70. data/lib/chef/knife/supermarket_unshare.rb +1 -1
  71. data/lib/chef/log.rb +8 -3
  72. data/{spec/functional/resource/base.rb → lib/chef/mixin/chef_utils_wiring.rb} +24 -12
  73. data/{spec/unit/log_spec.rb → lib/chef/mixin/default_paths.rb} +13 -5
  74. data/lib/chef/mixin/openssl_helper.rb +27 -5
  75. data/lib/chef/mixin/path_sanity.rb +5 -4
  76. data/lib/chef/mixin/securable.rb +2 -2
  77. data/lib/chef/mixin/shell_out.rb +4 -188
  78. data/lib/chef/mixin/template.rb +1 -0
  79. data/lib/chef/mixin/which.rb +6 -3
  80. data/lib/chef/mixins.rb +1 -0
  81. data/lib/chef/node.rb +36 -12
  82. data/lib/chef/node_map.rb +21 -18
  83. data/lib/chef/platform/service_helpers.rb +31 -28
  84. data/lib/chef/powershell.rb +1 -1
  85. data/lib/chef/provider/batch.rb +3 -10
  86. data/lib/chef/provider/cron.rb +2 -14
  87. data/lib/chef/provider/execute.rb +2 -1
  88. data/lib/chef/provider/git.rb +12 -4
  89. data/lib/chef/provider/group/dscl.rb +2 -2
  90. data/lib/chef/provider/group/windows.rb +1 -1
  91. data/lib/chef/provider/ifconfig.rb +7 -7
  92. data/lib/chef/provider/mount/aix.rb +1 -1
  93. data/lib/chef/provider/mount/solaris.rb +0 -1
  94. data/lib/chef/provider/mount/windows.rb +2 -2
  95. data/lib/chef/provider/noop.rb +1 -1
  96. data/lib/chef/provider/package/openbsd.rb +1 -1
  97. data/lib/chef/provider/package/portage.rb +2 -2
  98. data/lib/chef/provider/package/powershell.rb +6 -2
  99. data/lib/chef/provider/package/rubygems.rb +2 -2
  100. data/lib/chef/provider/package/snap.rb +97 -29
  101. data/lib/chef/provider/package/windows.rb +9 -4
  102. data/lib/chef/provider/package/windows/msi.rb +3 -3
  103. data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +1 -1
  104. data/lib/chef/provider/package/zypper.rb +0 -1
  105. data/lib/chef/provider/powershell_script.rb +10 -14
  106. data/lib/chef/provider/remote_file/http.rb +4 -1
  107. data/lib/chef/provider/script.rb +4 -75
  108. data/lib/chef/provider/service.rb +2 -2
  109. data/lib/chef/provider/service/arch.rb +1 -1
  110. data/lib/chef/provider/service/debian.rb +2 -2
  111. data/lib/chef/provider/service/openbsd.rb +4 -4
  112. data/lib/chef/provider/service/redhat.rb +1 -1
  113. data/lib/chef/provider/service/windows.rb +1 -1
  114. data/lib/chef/provider/subversion.rb +2 -2
  115. data/lib/chef/provider/user/dscl.rb +4 -4
  116. data/lib/chef/provider/user/linux.rb +3 -3
  117. data/lib/chef/provider/user/mac.rb +5 -5
  118. data/lib/chef/provider/windows_script.rb +87 -25
  119. data/lib/chef/provider/yum_repository.rb +1 -1
  120. data/lib/chef/provider/zypper_repository.rb +31 -11
  121. data/lib/chef/resource.rb +24 -11
  122. data/lib/chef/resource/alternatives.rb +1 -1
  123. data/lib/chef/resource/apt_package.rb +1 -1
  124. data/lib/chef/resource/archive_file.rb +28 -8
  125. data/lib/chef/resource/bash.rb +0 -1
  126. data/lib/chef/resource/batch.rb +4 -2
  127. data/lib/chef/resource/build_essential.rb +2 -2
  128. data/lib/chef/resource/chef_client_scheduled_task.rb +14 -2
  129. data/lib/chef/resource/chef_gem.rb +57 -21
  130. data/lib/chef/resource/chocolatey_feature.rb +1 -2
  131. data/lib/chef/resource/cron/_cron_shared.rb +98 -0
  132. data/lib/chef/resource/cron/cron.rb +46 -0
  133. data/lib/chef/resource/{cron_d.rb → cron/cron_d.rb} +7 -87
  134. data/lib/chef/resource/cron_access.rb +13 -5
  135. data/lib/chef/resource/csh.rb +0 -1
  136. data/lib/chef/resource/dmg_package.rb +2 -2
  137. data/lib/chef/resource/execute.rb +479 -9
  138. data/lib/chef/resource/file.rb +1 -1
  139. data/lib/chef/resource/freebsd_package.rb +1 -1
  140. data/lib/chef/resource/gem_package.rb +35 -2
  141. data/lib/chef/resource/helpers/cron_validations.rb +6 -3
  142. data/lib/chef/resource/homebrew_package.rb +30 -1
  143. data/lib/chef/resource/homebrew_update.rb +107 -0
  144. data/lib/chef/resource/hostname.rb +23 -36
  145. data/lib/chef/resource/kernel_module.rb +14 -1
  146. data/lib/chef/resource/launchd.rb +1 -1
  147. data/lib/chef/resource/lwrp_base.rb +1 -0
  148. data/lib/chef/resource/macos_userdefaults.rb +176 -61
  149. data/lib/chef/resource/mount.rb +1 -1
  150. data/lib/chef/resource/openssl_x509_certificate.rb +11 -14
  151. data/lib/chef/resource/openssl_x509_crl.rb +1 -2
  152. data/lib/chef/resource/perl.rb +0 -1
  153. data/lib/chef/resource/plist.rb +23 -4
  154. data/lib/chef/resource/powershell_script.rb +4 -2
  155. data/lib/chef/resource/python.rb +0 -1
  156. data/lib/chef/resource/remote_file.rb +26 -10
  157. data/lib/chef/resource/ruby.rb +0 -1
  158. data/lib/chef/resource/service.rb +2 -2
  159. data/lib/chef/resource/ssh_known_hosts_entry.rb +16 -1
  160. data/lib/chef/resource/sudo.rb +30 -3
  161. data/lib/chef/resource/swap_file.rb +17 -0
  162. data/lib/chef/resource/template.rb +1 -1
  163. data/lib/chef/resource/timezone.rb +15 -0
  164. data/lib/chef/resource/user_ulimit.rb +1 -1
  165. data/lib/chef/resource/windows_ad_join.rb +30 -1
  166. data/lib/chef/resource/windows_audit_policy.rb +227 -0
  167. data/lib/chef/resource/windows_auto_run.rb +11 -0
  168. data/lib/chef/resource/windows_certificate.rb +26 -0
  169. data/lib/chef/resource/windows_dns_record.rb +17 -0
  170. data/lib/chef/resource/windows_firewall_profile.rb +197 -0
  171. data/lib/chef/resource/windows_font.rb +3 -3
  172. data/lib/chef/resource/windows_package.rb +1 -1
  173. data/lib/chef/resource/windows_pagefile.rb +1 -1
  174. data/lib/chef/resource/windows_script.rb +2 -16
  175. data/lib/chef/resource/windows_security_policy.rb +67 -36
  176. data/lib/chef/resource/windows_shortcut.rb +1 -2
  177. data/lib/chef/resource/windows_task.rb +4 -4
  178. data/lib/chef/resource/windows_user_privilege.rb +30 -7
  179. data/lib/chef/resource/yum_repository.rb +9 -9
  180. data/lib/chef/resource_inspector.rb +7 -1
  181. data/lib/chef/resources.rb +5 -2
  182. data/lib/chef/role.rb +1 -2
  183. data/lib/chef/search/query.rb +1 -1
  184. data/lib/chef/server_api_versions.rb +4 -0
  185. data/lib/chef/shell/shell_session.rb +2 -0
  186. data/lib/chef/util/diff.rb +2 -3
  187. data/lib/chef/util/windows/net_user.rb +1 -1
  188. data/lib/chef/util/windows/volume.rb +1 -1
  189. data/lib/chef/version.rb +2 -2
  190. data/lib/chef/win32/file.rb +1 -1
  191. data/lib/chef/win32/registry.rb +3 -4
  192. data/lib/chef/win32/security.rb +1 -1
  193. data/spec/data/lwrp/providers/buck_passer.rb +1 -1
  194. data/spec/data/lwrp/providers/buck_passer_2.rb +1 -1
  195. data/spec/data/lwrp/providers/embedded_resource_accesses_providers_scope.rb +1 -1
  196. data/spec/functional/knife/configure_spec.rb +1 -1
  197. data/spec/functional/knife/ssh_spec.rb +5 -16
  198. data/spec/functional/resource/aix_service_spec.rb +9 -2
  199. data/spec/functional/resource/aixinit_service_spec.rb +1 -2
  200. data/spec/functional/resource/apt_package_spec.rb +0 -1
  201. data/spec/functional/resource/bash_spec.rb +3 -2
  202. data/spec/functional/resource/bff_spec.rb +1 -1
  203. data/spec/functional/resource/chocolatey_package_spec.rb +4 -0
  204. data/spec/functional/resource/cron_spec.rb +20 -2
  205. data/spec/functional/resource/dnf_package_spec.rb +4 -1
  206. data/spec/functional/resource/execute_spec.rb +1 -1
  207. data/spec/functional/resource/git_spec.rb +23 -1
  208. data/spec/functional/resource/group_spec.rb +15 -3
  209. data/spec/functional/resource/ifconfig_spec.rb +9 -1
  210. data/spec/functional/resource/insserv_spec.rb +3 -3
  211. data/spec/functional/resource/link_spec.rb +2 -5
  212. data/spec/functional/resource/mount_spec.rb +9 -1
  213. data/spec/functional/resource/msu_package_spec.rb +9 -3
  214. data/spec/functional/resource/powershell_script_spec.rb +4 -4
  215. data/spec/functional/resource/remote_file_spec.rb +9 -15
  216. data/spec/functional/resource/rpm_spec.rb +1 -1
  217. data/spec/functional/resource/timezone_spec.rb +2 -0
  218. data/spec/functional/resource/windows_package_spec.rb +0 -1
  219. data/spec/functional/resource/windows_path_spec.rb +4 -0
  220. data/spec/functional/resource/windows_security_policy_spec.rb +0 -1
  221. data/spec/functional/resource/windows_service_spec.rb +4 -0
  222. data/spec/functional/resource/windows_task_spec.rb +12 -11
  223. data/spec/functional/resource/windows_user_privilege_spec.rb +1 -2
  224. data/spec/functional/resource/yum_package_spec.rb +4 -1
  225. data/spec/functional/resource/zypper_package_spec.rb +4 -1
  226. data/spec/functional/run_lock_spec.rb +2 -1
  227. data/spec/functional/shell_spec.rb +5 -6
  228. data/spec/functional/util/powershell/cmdlet_spec.rb +1 -1
  229. data/spec/functional/version_spec.rb +1 -1
  230. data/spec/functional/win32/crypto_spec.rb +1 -1
  231. data/spec/integration/knife/config_list_profiles_spec.rb +30 -2
  232. data/spec/integration/knife/config_use_profile_spec.rb +55 -2
  233. data/spec/integration/knife/cookbook_upload_spec.rb +28 -1
  234. data/spec/integration/knife/data_bag_from_file_spec.rb +1 -1
  235. data/spec/integration/knife/environment_from_file_spec.rb +1 -1
  236. data/spec/integration/knife/node_from_file_spec.rb +1 -1
  237. data/spec/integration/knife/role_from_file_spec.rb +1 -1
  238. data/spec/integration/recipes/accumulator_spec.rb +1 -1
  239. data/spec/integration/recipes/lwrp_inline_resources_spec.rb +1 -1
  240. data/spec/integration/recipes/lwrp_spec.rb +1 -1
  241. data/spec/integration/recipes/notifies_spec.rb +1 -1
  242. data/spec/integration/recipes/notifying_block_spec.rb +1 -1
  243. data/spec/integration/recipes/recipe_dsl_spec.rb +5 -1
  244. data/spec/integration/recipes/resource_converge_if_changed_spec.rb +2 -0
  245. data/spec/integration/recipes/resource_load_spec.rb +4 -2
  246. data/spec/integration/recipes/unified_mode_spec.rb +1 -1
  247. data/spec/integration/recipes/use_partial_spec.rb +1 -1
  248. data/spec/scripts/ssl-serve.rb +1 -1
  249. data/spec/spec_helper.rb +10 -4
  250. data/spec/support/chef_helpers.rb +1 -20
  251. data/spec/support/platform_helpers.rb +1 -3
  252. data/spec/support/platforms/win32/spec_service.rb +1 -1
  253. data/spec/support/shared/functional/execute_resource.rb +1 -1
  254. data/spec/support/shared/functional/file_resource.rb +0 -1
  255. data/spec/support/shared/functional/securable_resource.rb +1 -2
  256. data/spec/support/shared/functional/securable_resource_with_reporting.rb +0 -1
  257. data/spec/support/shared/functional/windows_script.rb +2 -2
  258. data/spec/support/shared/integration/knife_support.rb +2 -9
  259. data/spec/support/shared/unit/application_dot_d.rb +0 -1
  260. data/spec/support/shared/unit/execute_resource.rb +1 -1
  261. data/spec/support/shared/unit/provider/file.rb +12 -8
  262. data/spec/unit/application/solo_spec.rb +4 -2
  263. data/spec/unit/application_spec.rb +11 -2
  264. data/spec/unit/chef_fs/config_spec.rb +2 -2
  265. data/spec/unit/chef_fs/diff_spec.rb +8 -8
  266. data/spec/unit/chef_fs/file_system/operation_failed_error_spec.rb +2 -4
  267. data/spec/unit/chef_fs/{parallelizer.rb → parallelizer_spec.rb} +1 -1
  268. data/spec/unit/client_spec.rb +4 -1
  269. data/spec/unit/cookbook/gem_installer_spec.rb +2 -1
  270. data/spec/unit/cookbook/synchronizer_spec.rb +26 -24
  271. data/spec/unit/data_bag_spec.rb +6 -3
  272. data/spec/unit/data_collector_spec.rb +1 -1
  273. data/spec/unit/decorator_spec.rb +23 -23
  274. data/spec/unit/dsl/platform_introspection_spec.rb +1 -0
  275. data/spec/unit/environment_spec.rb +5 -1
  276. data/spec/unit/event_dispatch/dispatcher_spec.rb +3 -0
  277. data/spec/unit/guard_interpreter_spec.rb +1 -1
  278. data/spec/unit/http/api_versions_spec.rb +20 -2
  279. data/spec/unit/http/ssl_policies_spec.rb +20 -0
  280. data/spec/unit/json_compat_spec.rb +1 -1
  281. data/spec/unit/knife/bootstrap_spec.rb +5 -8
  282. data/spec/unit/knife/cookbook_download_spec.rb +2 -2
  283. data/spec/unit/knife/cookbook_show_spec.rb +6 -7
  284. data/spec/unit/knife/cookbook_upload_spec.rb +7 -10
  285. data/spec/unit/knife/data_bag_edit_spec.rb +1 -1
  286. data/spec/unit/log/syslog_spec.rb +6 -10
  287. data/spec/unit/log/winevt_spec.rb +21 -13
  288. data/spec/unit/lwrp_spec.rb +9 -6
  289. data/spec/unit/mixin/{path_sanity_spec.rb → default_paths_spec.rb} +14 -14
  290. data/spec/unit/mixin/powershell_exec_spec.rb +1 -1
  291. data/spec/unit/mixin/powershell_out_spec.rb +2 -4
  292. data/spec/unit/mixin/powershell_type_coercions_spec.rb +1 -1
  293. data/spec/unit/mixin/securable_spec.rb +0 -1
  294. data/spec/unit/mixin/shell_out_spec.rb +25 -26
  295. data/spec/unit/mixin/subclass_directive_spec.rb +2 -2
  296. data/spec/unit/mixin/unformatter_spec.rb +2 -2
  297. data/spec/unit/mixin/uris_spec.rb +1 -1
  298. data/spec/unit/mixin/user_context_spec.rb +1 -9
  299. data/spec/unit/mixin/which.rb +8 -0
  300. data/spec/unit/node_spec.rb +98 -11
  301. data/spec/unit/property_spec.rb +6 -6
  302. data/spec/unit/provider/batch_spec.rb +130 -0
  303. data/spec/unit/provider/cron/unix_spec.rb +1 -1
  304. data/spec/unit/provider/cron_spec.rb +9 -49
  305. data/spec/unit/provider/dsc_resource_spec.rb +22 -38
  306. data/spec/unit/provider/dsc_script_spec.rb +10 -10
  307. data/spec/unit/provider/execute_spec.rb +1 -8
  308. data/spec/unit/provider/git_spec.rb +3 -3
  309. data/spec/unit/provider/ifconfig_spec.rb +0 -1
  310. data/spec/unit/provider/mdadm_spec.rb +1 -3
  311. data/spec/unit/provider/package/dnf/python_helper_spec.rb +1 -1
  312. data/spec/unit/provider/package/openbsd_spec.rb +1 -1
  313. data/spec/unit/provider/package/pacman_spec.rb +17 -20
  314. data/spec/unit/provider/package/powershell_spec.rb +95 -86
  315. data/spec/unit/provider/package/rubygems_spec.rb +5 -10
  316. data/spec/unit/provider/package/smartos_spec.rb +1 -1
  317. data/spec/unit/provider/package/snap_spec.rb +1 -1
  318. data/spec/unit/provider/package/windows/registry_uninstall_entry_spec.rb +3 -3
  319. data/spec/unit/provider/package/windows_spec.rb +30 -53
  320. data/spec/unit/provider/powershell_script_spec.rb +3 -45
  321. data/spec/unit/provider/script_spec.rb +20 -110
  322. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  323. data/spec/unit/provider/service/windows_spec.rb +2 -6
  324. data/spec/unit/provider/systemd_unit_spec.rb +28 -24
  325. data/spec/unit/provider/user/dscl_spec.rb +2 -2
  326. data/spec/unit/provider/windows_env_spec.rb +5 -4
  327. data/spec/unit/provider/zypper_repository_spec.rb +60 -10
  328. data/spec/unit/provider_spec.rb +1 -0
  329. data/spec/unit/resource/archive_file_spec.rb +11 -2
  330. data/spec/unit/resource/chef_client_cron_spec.rb +23 -7
  331. data/spec/unit/resource/chef_client_scheduled_task_spec.rb +17 -7
  332. data/spec/unit/resource/chef_client_systemd_timer_spec.rb +7 -4
  333. data/spec/unit/resource/cron_spec.rb +2 -2
  334. data/spec/unit/resource/execute_spec.rb +10 -0
  335. data/spec/unit/resource/file/verification_spec.rb +2 -1
  336. data/spec/unit/resource/helpers/cron_validations_spec.rb +5 -1
  337. data/spec/unit/resource/homebrew_update_spec.rb +30 -0
  338. data/spec/unit/resource/macos_user_defaults_spec.rb +103 -2
  339. data/spec/unit/resource/powershell_script_spec.rb +10 -15
  340. data/spec/unit/resource/timezone_spec.rb +1 -1
  341. data/spec/unit/resource/windows_audit_policy_spec.rb +64 -0
  342. data/spec/unit/resource/windows_dns_record_spec.rb +3 -3
  343. data/spec/unit/resource/windows_dns_zone_spec.rb +2 -2
  344. data/spec/unit/resource/windows_firewall_profile_spec.rb +77 -0
  345. data/spec/unit/resource/windows_package_spec.rb +1 -0
  346. data/spec/unit/resource/windows_task_spec.rb +1 -1
  347. data/spec/unit/resource/windows_uac_spec.rb +2 -2
  348. data/spec/unit/resource/yum_repository_spec.rb +21 -21
  349. data/spec/unit/resource_reporter_spec.rb +1 -1
  350. data/spec/unit/resource_spec.rb +84 -1
  351. data/spec/unit/role_spec.rb +23 -21
  352. data/spec/unit/run_context/cookbook_compiler_spec.rb +1 -1
  353. data/spec/unit/run_lock_spec.rb +1 -1
  354. data/spec/unit/scan_access_control_spec.rb +1 -1
  355. data/spec/unit/server_api_spec.rb +43 -16
  356. data/spec/unit/util/backup_spec.rb +1 -1
  357. data/spec/unit/util/diff_spec.rb +1 -15
  358. data/spec/unit/util/dsc/configuration_generator_spec.rb +1 -1
  359. data/spec/unit/util/powershell/ps_credential_spec.rb +2 -2
  360. data/spec/unit/util/selinux_spec.rb +2 -1
  361. data/spec/unit/util/threaded_job_queue_spec.rb +9 -0
  362. data/spec/unit/win32/security_spec.rb +4 -3
  363. metadata +68 -40
  364. data/lib/chef/resource/cron.rb +0 -157
@@ -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
@@ -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. Unsupported on Windows because Windows lacks a direct equivalent to UNIX's 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,12 +625,20 @@ 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
  #
618
638
  # Do NOT use this. It may be removed. It is for internal purposes only.
619
639
  # @api private
620
640
  attr_reader :resource_initializing
641
+
621
642
  def resource_initializing=(value)
622
643
  if value
623
644
  @resource_initializing = true
@@ -868,6 +889,7 @@ class Chef
868
889
  # have.
869
890
  #
870
891
  attr_writer :allowed_actions
892
+
871
893
  def allowed_actions(value = NOT_PASSED)
872
894
  if value != NOT_PASSED
873
895
  self.allowed_actions = value
@@ -950,16 +972,7 @@ class Chef
950
972
  def self.resource_name(name = NOT_PASSED)
951
973
  # Setter
952
974
  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
975
+ @resource_name = name.to_sym rescue nil
963
976
  end
964
977
 
965
978
  @resource_name = nil unless defined?(@resource_name)
@@ -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
@@ -27,8 +27,10 @@ class Chef
27
27
 
28
28
  description "Use the **batch** resource to execute a batch script using the cmd.exe interpreter on Windows. The batch resource creates and executes a temporary file (similar to how the script resource behaves), rather than running the command inline. Commands that are executed with this resource are (by their nature) not idempotent, as they are typically unique to the environment in which they are run. Use not_if and only_if to guard this resource for idempotence."
29
29
 
30
- def initialize(name, run_context = nil)
31
- super(name, run_context, nil, "cmd.exe")
30
+ def initialize(*args)
31
+ super
32
+ @interpreter = "cmd.exe"
33
+ @default_guard_interpreter = resource_name
32
34
  end
33
35
 
34
36
  end
@@ -146,8 +146,8 @@ class Chef
146
146
  def install_xcode_cli_tools(label)
147
147
  # This script was graciously borrowed and modified from Tim Sutton's
148
148
  # osx-vm-templates at https://github.com/timsutton/osx-vm-templates/blob/b001475df54a9808d3d56d06e71b8fa3001fff42/scripts/xcode-cli-tools.sh
149
- execute "install Xcode Command Line tools" do
150
- command <<-EOH
149
+ bash "install Xcode Command Line Tools" do
150
+ code <<-EOH
151
151
  # create the placeholder file that's checked by CLI updates' .dist code
152
152
  # in Apple's SUS catalog
153
153
  touch /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress
@@ -48,6 +48,16 @@ class Chef
48
48
  daemon_options ["--override-runlist mycorp_base::default"]
49
49
  end
50
50
  ```
51
+
52
+ **Run #{Chef::Dist::PRODUCT} daily at 01:00 am, specifying a named run-list**:
53
+
54
+ ```ruby
55
+ chef_client_scheduled_task "Run chef-client named run-list daily" do
56
+ frequency 'daily'
57
+ start_time '01:00'
58
+ daemon_options ['-n audit_only']
59
+ end
60
+ ```
51
61
  DOC
52
62
 
53
63
  resource_name :chef_client_scheduled_task
@@ -72,7 +82,8 @@ class Chef
72
82
  coerce: proc { |x| Integer(x) },
73
83
  callbacks: { "should be a positive number" => proc { |v| v > 0 } },
74
84
  description: "Numeric value to go with the scheduled task frequency",
75
- default: 30
85
+ default: lazy { frequency == "minute" ? 30 : 1 },
86
+ default_description: "30 if frequency is 'minute', 1 otherwise"
76
87
 
77
88
  property :accept_chef_license, [true, false],
78
89
  description: "Accept the Chef Online Master License and Services Agreement. See <https://www.chef.io/online-master-agreement/>",
@@ -129,6 +140,7 @@ class Chef
129
140
 
130
141
  # According to https://docs.microsoft.com/en-us/windows/desktop/taskschd/schtasks,
131
142
  # the :once, :onstart, :onlogon, and :onidle schedules don't accept schedule modifiers
143
+
132
144
  windows_task new_resource.task_name do
133
145
  run_level :highest
134
146
  command full_command
@@ -160,7 +172,7 @@ class Chef
160
172
  # Fetch path of cmd.exe through environment variable comspec
161
173
  cmd_path = ENV["COMSPEC"]
162
174
 
163
- "#{cmd_path} /c \'#{client_cmd}\'"
175
+ "#{cmd_path} /c \"#{client_cmd}\""
164
176
  end
165
177
 
166
178
  # Build command line to pass to cmd.exe
@@ -22,26 +22,59 @@ require_relative "../dist"
22
22
 
23
23
  class Chef
24
24
  class Resource
25
- # Use the chef_gem resource to install a gem only for the instance of Ruby that is dedicated to the chef-client.
26
- # When a gem is installed from a local file, it must be added to the node using the remote_file or cookbook_file
27
- # resources.
28
- #
29
- # The chef_gem resource works with all of the same properties and options as the gem_package resource, but does not
30
- # accept the gem_binary property because it always uses the CurrentGemEnvironment under which the chef-client is
31
- # running. In addition to performing actions similar to the gem_package resource, the chef_gem resource does the
32
- # following:
33
- # - Runs its actions immediately, before convergence, allowing a gem to be used in a recipe immediately after it is
34
- # installed
35
- # - Runs Gem.clear_paths after the action, ensuring that gem is aware of changes so that it can be required
36
- # immediately after it is installed
37
-
38
- require_relative "gem_package"
39
- require_relative "../dist"
40
-
41
25
  class ChefGem < Chef::Resource::Package::GemPackage
42
26
  unified_mode true
43
27
  provides :chef_gem
44
28
 
29
+ description <<~DESC
30
+ Use the **chef_gem** resource to install a gem only for the instance of Ruby that is dedicated to the #{Chef::Dist::CLIENT}.
31
+ When a gem is installed from a local file, it must be added to the node using the **remote_file** or **cookbook_file** resources.
32
+
33
+ The **chef_gem** resource works with all of the same properties and options as the **gem_package** resource, but does not
34
+ accept the `gem_binary` property because it always uses the `CurrentGemEnvironment` under which the `#{Chef::Dist::CLIENT}` is
35
+ running. In addition to performing actions similar to the **gem_package** resource, the **chef_gem** resource does the
36
+ following:
37
+ - Runs its actions immediately, before convergence, allowing a gem to be used in a recipe immediately after it is installed.
38
+ - Runs `Gem.clear_paths` after the action, ensuring that gem is aware of changes so that it can be required immediately after it is installed.
39
+
40
+ Warning: The **chef_gem** and **gem_package** resources are both used to install Ruby gems. For any machine on which #{Chef::Dist::PRODUCT} is
41
+ installed, there are two instances of Ruby. One is the standard, system-wide instance of Ruby and the other is a dedicated instance that is
42
+ available only to #{Chef::Dist::PRODUCT}.
43
+ Use the **chef_gem** resource to install gems into the instance of Ruby that is dedicated to #{Chef::Dist::PRODUCT}.
44
+ Use the **gem_package** resource to install all other gems (i.e. install gems system-wide).
45
+ DESC
46
+
47
+ examples <<~EXAMPLES
48
+ **Compile time vs. converge time installation of gems**
49
+
50
+ To install a gem while #{Chef::Dist::PRODUCT} is configuring the node (the converge phase), set the `compile_time` property to `false`:
51
+ ```ruby
52
+ chef_gem 'right_aws' do
53
+ compile_time false
54
+ action :install
55
+ end
56
+ ```
57
+
58
+ To install a gem while the resource collection is being built (the compile phase), set the `compile_time` property to `true`:
59
+ ```ruby
60
+ chef_gem 'right_aws' do
61
+ compile_time true
62
+ action :install
63
+ end
64
+ ```
65
+
66
+ Install MySQL for Chef
67
+ ```ruby
68
+ apt_update
69
+
70
+ build_essential 'install compilation tools' do
71
+ compile_time true
72
+ end
73
+
74
+ chef_gem 'mysql'
75
+ ```
76
+ EXAMPLES
77
+
45
78
  property :package_name, String,
46
79
  description: "An optional property to set the package name if it differs from the resource block's name.",
47
80
  identity: true
@@ -49,11 +82,14 @@ class Chef
49
82
  property :version, String,
50
83
  description: "The version of a package to be installed or upgraded."
51
84
 
52
- property :gem_binary, default: "#{RbConfig::CONFIG["bindir"]}/gem", default_description: "The `gem` binary included with #{Chef::Dist::PRODUCT}.",
53
- description: "The path of a gem binary to use for the installation. By default, the same version of Ruby that is used by #{Chef::Dist::PRODUCT} will be installed.",
54
- callbacks: {
55
- "The chef_gem resource is restricted to the current gem environment, use gem_package to install to other environments." => proc { |v| v == "#{RbConfig::CONFIG["bindir"]}/gem" },
56
- }
85
+ property :gem_binary, String,
86
+ default: "#{RbConfig::CONFIG["bindir"]}/gem",
87
+ default_description: "The `gem` binary included with #{Chef::Dist::PRODUCT}.",
88
+ description: "The path of a gem binary to use for the installation. By default, the same version of Ruby that is used by #{Chef::Dist::PRODUCT} will be used.",
89
+ callbacks: {
90
+ "The `chef_gem` resource is restricted to the current gem environment, use `gem_package` to install to other environments." =>
91
+ proc { |v| v == "#{RbConfig::CONFIG["bindir"]}/gem" },
92
+ }
57
93
  end
58
94
  end
59
95
  end
@@ -89,8 +89,7 @@ class Chef
89
89
  # @param [String] action the name of the action to perform
90
90
  # @return [String] the choco feature command string
91
91
  def choco_cmd(action)
92
- cmd = "#{ENV["ALLUSERSPROFILE"]}\\chocolatey\\bin\\choco feature #{action} --name #{new_resource.feature_name}"
93
- cmd
92
+ "#{ENV["ALLUSERSPROFILE"]}\\chocolatey\\bin\\choco feature #{action} --name #{new_resource.feature_name}"
94
93
  end
95
94
  end
96
95
  end
@@ -0,0 +1,98 @@
1
+ unified_mode true
2
+
3
+ TIMEOUT_OPTS = %w{duration preserve-status foreground kill-after signal}.freeze
4
+ TIMEOUT_REGEX = /\A\S+/.freeze
5
+ WEEKDAYS = {
6
+ sunday: "0", monday: "1", tuesday: "2", wednesday: "3", thursday: "4", friday: "5", saturday: "6",
7
+ sun: "0", mon: "1", tue: "2", wed: "3", thu: "4", fri: "5", sat: "6"
8
+ }.freeze
9
+
10
+ property :minute, [Integer, String],
11
+ description: "The minute at which the cron entry should run (`0 - 59`).",
12
+ default: "*", callbacks: {
13
+ "should be a valid minute spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 0, 59) },
14
+ }
15
+
16
+ property :hour, [Integer, String],
17
+ description: "The hour at which the cron entry is to run (`0 - 23`).",
18
+ default: "*", callbacks: {
19
+ "should be a valid hour spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 0, 23) },
20
+ }
21
+
22
+ property :day, [Integer, String],
23
+ description: "The day of month at which the cron entry should run (`1 - 31`).",
24
+ default: "*", callbacks: {
25
+ "should be a valid day spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_numeric(spec, 1, 31) },
26
+ }
27
+
28
+ property :month, [Integer, String],
29
+ description: "The month in the year on which a cron entry is to run (`1 - 12`, `jan-dec`, or `*`).",
30
+ default: "*", callbacks: {
31
+ "should be a valid month spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_month(spec) },
32
+ }
33
+
34
+ property :weekday, [Integer, String, Symbol],
35
+ description: "The day of the week on which this entry is to run (`0-7`, `mon-sun`, `monday-sunday`, or `*`), where Sunday is both `0` and `7`.",
36
+ default: "*", coerce: proc { |day| weekday_in_crontab(day) },
37
+ callbacks: {
38
+ "should be a valid weekday spec" => ->(spec) { Chef::ResourceHelpers::CronValidations.validate_dow(spec) },
39
+ }
40
+
41
+ property :shell, String,
42
+ description: "Set the `SHELL` environment variable."
43
+
44
+ property :path, String,
45
+ description: "Set the `PATH` environment variable."
46
+
47
+ property :home, String,
48
+ description: "Set the `HOME` environment variable."
49
+
50
+ property :mailto, String,
51
+ description: "Set the `MAILTO` environment variable."
52
+
53
+ property :command, String,
54
+ description: "The command to be run, or the path to a file that contains the command to be run.",
55
+ identity: true,
56
+ required: [:create]
57
+
58
+ property :user, String,
59
+ description: "The name of the user that runs the command.",
60
+ default: "root"
61
+
62
+ property :environment, Hash,
63
+ description: "A Hash containing additional arbitrary environment variables under which the cron job will be run in the form of `({'ENV_VARIABLE' => 'VALUE'})`. **Note**: These variables must exist for a command to be run successfully.",
64
+ default: lazy { {} }
65
+
66
+ property :time_out, Hash,
67
+ description: "A Hash of timeouts in the form of `({'OPTION' => 'VALUE'})`. Accepted valid options are:
68
+ - `preserve-status` (BOOL, default: 'false'),
69
+ - `foreground` (BOOL, default: 'false'),
70
+ - `kill-after` (in seconds),
71
+ - `signal` (a name like 'HUP' or a number)",
72
+ default: lazy { {} },
73
+ introduced: "15.7",
74
+ coerce: proc { |h|
75
+ if h.is_a?(Hash)
76
+ invalid_keys = h.keys - TIMEOUT_OPTS
77
+ unless invalid_keys.empty?
78
+ error_msg = "Key of option time_out must be equal to one of: \"#{TIMEOUT_OPTS.join('", "')}\"! You passed \"#{invalid_keys.join(", ")}\"."
79
+ raise Chef::Exceptions::ValidationFailed, error_msg
80
+ end
81
+ unless h.values.all? { |x| x =~ TIMEOUT_REGEX }
82
+ error_msg = "Values of option time_out should be non-empty strings without any leading whitespace."
83
+ raise Chef::Exceptions::ValidationFailed, error_msg
84
+ end
85
+ h
86
+ elsif h.is_a?(Integer) || h.is_a?(String)
87
+ { "duration" => h }
88
+ end
89
+ }
90
+
91
+ private
92
+ # Convert weekday input value into crontab format that
93
+ # could be written in the crontab
94
+ # @return [Integer, String] A weekday formed as per the user inputs.
95
+ def weekday_in_crontab(day)
96
+ weekday = day.to_s.downcase.to_sym
97
+ WEEKDAYS[weekday] || day
98
+ end