chef 16.2.44-universal-mingw32 → 16.4.35-universal-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (383) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -4
  3. data/Rakefile +3 -16
  4. data/chef-universal-mingw32.gemspec +2 -3
  5. data/chef.gemspec +4 -3
  6. data/lib/chef/action_collection.rb +4 -0
  7. data/lib/chef/api_client/registration.rb +2 -2
  8. data/lib/chef/application.rb +13 -1
  9. data/lib/chef/application/apply.rb +6 -5
  10. data/lib/chef/application/windows_service.rb +27 -27
  11. data/lib/chef/{whitelist.rb → attribute_allowlist.rb} +11 -11
  12. data/lib/chef/{blacklist.rb → attribute_blocklist.rb} +9 -9
  13. data/lib/chef/chef_class.rb +0 -1
  14. data/lib/chef/chef_fs/chef_fs_data_store.rb +54 -54
  15. data/lib/chef/chef_fs/data_handler/organization_data_handler.rb +1 -2
  16. data/lib/chef/chef_fs/file_system/chef_server/acl_entry.rb +10 -10
  17. data/lib/chef/chef_fs/file_system/chef_server/cookbook_file.rb +2 -2
  18. data/lib/chef/chef_fs/file_system/chef_server/cookbooks_dir.rb +1 -5
  19. data/lib/chef/chef_fs/file_system/chef_server/organization_invites_entry.rb +8 -8
  20. data/lib/chef/chef_fs/file_system/chef_server/organization_members_entry.rb +8 -8
  21. data/lib/chef/chef_fs/file_system/repository/base_file.rb +1 -0
  22. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir.rb +2 -2
  23. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_entry.rb +1 -1
  24. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_root_dir.rb +18 -18
  25. data/lib/chef/chef_fs/file_system/repository/directory.rb +1 -1
  26. data/lib/chef/chef_fs/file_system/repository/file_system_entry.rb +1 -1
  27. data/lib/chef/chef_fs/parallelizer/parallel_enumerable.rb +1 -1
  28. data/lib/chef/client.rb +14 -14
  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 +15 -29
  32. data/lib/chef/data_bag.rb +1 -2
  33. data/lib/chef/data_collector/run_end_message.rb +11 -1
  34. data/lib/chef/deprecated.rb +8 -0
  35. data/lib/chef/digester.rb +3 -2
  36. data/lib/chef/dsl/platform_introspection.rb +9 -7
  37. data/lib/chef/encrypted_data_bag_item/decryptor.rb +1 -1
  38. data/lib/chef/environment.rb +3 -4
  39. data/lib/chef/exceptions.rb +4 -1
  40. data/lib/chef/file_access_control/windows.rb +2 -2
  41. data/lib/chef/file_content_management/deploy/mv_unix.rb +1 -1
  42. data/lib/chef/file_content_management/tempfile.rb +9 -9
  43. data/lib/chef/handler.rb +2 -0
  44. data/lib/chef/http.rb +12 -12
  45. data/lib/chef/http/authenticator.rb +3 -1
  46. data/lib/chef/json_compat.rb +1 -1
  47. data/lib/chef/knife.rb +4 -4
  48. data/lib/chef/knife/bootstrap.rb +18 -15
  49. data/lib/chef/knife/bootstrap/train_connector.rb +1 -0
  50. data/lib/chef/knife/config_get.rb +1 -0
  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_download.rb +1 -1
  55. data/lib/chef/knife/cookbook_metadata.rb +1 -1
  56. data/lib/chef/knife/cookbook_upload.rb +29 -37
  57. data/lib/chef/knife/core/bootstrap_context.rb +1 -1
  58. data/lib/chef/knife/core/gem_glob_loader.rb +1 -1
  59. data/lib/chef/knife/core/generic_presenter.rb +1 -1
  60. data/lib/chef/knife/core/hashed_command_loader.rb +3 -2
  61. data/lib/chef/knife/core/subcommand_loader.rb +20 -1
  62. data/lib/chef/knife/core/ui.rb +8 -2
  63. data/lib/chef/knife/core/windows_bootstrap_context.rb +33 -26
  64. data/lib/chef/knife/delete.rb +15 -15
  65. data/lib/chef/knife/exec.rb +2 -2
  66. data/lib/chef/knife/rehash.rb +3 -21
  67. data/lib/chef/knife/ssh.rb +11 -7
  68. data/lib/chef/knife/xargs.rb +19 -19
  69. data/lib/chef/knife/yaml_convert.rb +1 -1
  70. data/lib/chef/log.rb +7 -2
  71. data/lib/chef/mixin/checksum.rb +0 -1
  72. data/{spec/functional/resource/base.rb → lib/chef/mixin/chef_utils_wiring.rb} +24 -12
  73. data/lib/chef/mixin/deep_merge.rb +35 -6
  74. data/{spec/unit/log_spec.rb → lib/chef/mixin/default_paths.rb} +13 -5
  75. data/lib/chef/mixin/openssl_helper.rb +30 -6
  76. data/lib/chef/mixin/path_sanity.rb +5 -4
  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/monkey_patches/webrick-utils.rb +10 -10
  82. data/lib/chef/node.rb +36 -12
  83. data/lib/chef/node/attribute.rb +2 -4
  84. data/lib/chef/node_map.rb +21 -18
  85. data/lib/chef/platform/service_helpers.rb +31 -28
  86. data/lib/chef/property.rb +1 -1
  87. data/lib/chef/provider/cron/unix.rb +0 -2
  88. data/lib/chef/provider/git.rb +17 -9
  89. data/lib/chef/provider/group.rb +0 -2
  90. data/lib/chef/provider/group/suse.rb +5 -5
  91. data/lib/chef/provider/ifconfig.rb +1 -4
  92. data/lib/chef/provider/mount.rb +0 -2
  93. data/lib/chef/provider/mount/solaris.rb +0 -1
  94. data/lib/chef/provider/package.rb +0 -2
  95. data/lib/chef/provider/package/rubygems.rb +1 -1
  96. data/lib/chef/provider/package/snap.rb +3 -4
  97. data/lib/chef/provider/package/windows.rb +9 -4
  98. data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +9 -9
  99. data/lib/chef/provider/package/zypper.rb +0 -1
  100. data/lib/chef/provider/powershell_script.rb +21 -5
  101. data/lib/chef/provider/route.rb +1 -1
  102. data/lib/chef/provider/service.rb +2 -2
  103. data/lib/chef/provider/service/arch.rb +1 -1
  104. data/lib/chef/provider/service/debian.rb +1 -1
  105. data/lib/chef/provider/service/gentoo.rb +2 -2
  106. data/lib/chef/provider/service/macosx.rb +2 -2
  107. data/lib/chef/provider/service/openbsd.rb +1 -4
  108. data/lib/chef/provider/service/redhat.rb +2 -2
  109. data/lib/chef/provider/service/upstart.rb +1 -1
  110. data/lib/chef/provider/service/windows.rb +10 -10
  111. data/lib/chef/provider/systemd_unit.rb +0 -2
  112. data/lib/chef/provider/template/content.rb +1 -0
  113. data/lib/chef/provider/user/dscl.rb +2 -2
  114. data/lib/chef/provider/user/mac.rb +9 -9
  115. data/lib/chef/provider/windows_task.rb +0 -3
  116. data/lib/chef/provider/yum_repository.rb +1 -1
  117. data/lib/chef/provider/zypper_repository.rb +1 -2
  118. data/lib/chef/providers.rb +0 -1
  119. data/lib/chef/recipe.rb +1 -1
  120. data/lib/chef/resource.rb +9 -11
  121. data/lib/chef/resource/alternatives.rb +1 -1
  122. data/lib/chef/resource/apt_repository.rb +1 -10
  123. data/lib/chef/resource/build_essential.rb +2 -2
  124. data/lib/chef/resource/chef_client_scheduled_task.rb +1 -1
  125. data/lib/chef/resource/chef_client_systemd_timer.rb +2 -2
  126. data/lib/chef/resource/chef_gem.rb +57 -21
  127. data/lib/chef/resource/chef_vault_secret.rb +13 -13
  128. data/lib/chef/resource/chocolatey_feature.rb +1 -2
  129. data/lib/chef/resource/cron/cron_d.rb +1 -1
  130. data/lib/chef/resource/cron_access.rb +2 -2
  131. data/lib/chef/resource/dmg_package.rb +2 -2
  132. data/lib/chef/resource/execute.rb +4 -5
  133. data/lib/chef/resource/gem_package.rb +35 -2
  134. data/lib/chef/resource/homebrew_update.rb +2 -2
  135. data/lib/chef/resource/hostname.rb +18 -18
  136. data/lib/chef/resource/launchd.rb +1 -1
  137. data/lib/chef/resource/lwrp_base.rb +1 -0
  138. data/lib/chef/resource/macos_userdefaults.rb +176 -61
  139. data/lib/chef/resource/openssl_dhparam.rb +2 -0
  140. data/lib/chef/resource/openssl_ec_private_key.rb +2 -0
  141. data/lib/chef/resource/openssl_ec_public_key.rb +2 -0
  142. data/lib/chef/resource/openssl_rsa_private_key.rb +2 -0
  143. data/lib/chef/resource/openssl_rsa_public_key.rb +2 -0
  144. data/lib/chef/resource/openssl_x509_certificate.rb +35 -35
  145. data/lib/chef/resource/openssl_x509_crl.rb +3 -2
  146. data/lib/chef/resource/openssl_x509_request.rb +23 -20
  147. data/lib/chef/resource/osx_profile.rb +227 -5
  148. data/lib/chef/resource/powershell_package_source.rb +1 -1
  149. data/lib/chef/resource/powershell_script.rb +24 -30
  150. data/lib/chef/resource/service.rb +2 -2
  151. data/lib/chef/resource/ssh_known_hosts_entry.rb +16 -1
  152. data/lib/chef/resource/sudo.rb +31 -4
  153. data/lib/chef/resource/swap_file.rb +17 -0
  154. data/lib/chef/resource/sysctl.rb +5 -5
  155. data/lib/chef/resource/timezone.rb +15 -0
  156. data/lib/chef/resource/user_ulimit.rb +1 -1
  157. data/lib/chef/resource/windows_ad_join.rb +2 -0
  158. data/lib/chef/resource/windows_audit_policy.rb +3 -0
  159. data/lib/chef/resource/windows_auto_run.rb +2 -0
  160. data/lib/chef/resource/windows_certificate.rb +2 -0
  161. data/lib/chef/resource/windows_dfs_folder.rb +2 -0
  162. data/lib/chef/resource/windows_dfs_namespace.rb +2 -0
  163. data/lib/chef/resource/windows_dfs_server.rb +2 -0
  164. data/lib/chef/resource/windows_dns_record.rb +25 -5
  165. data/lib/chef/resource/windows_dns_zone.rb +12 -7
  166. data/lib/chef/resource/windows_feature.rb +2 -0
  167. data/lib/chef/resource/windows_feature_dism.rb +10 -0
  168. data/lib/chef/resource/windows_feature_powershell.rb +14 -2
  169. data/lib/chef/resource/windows_firewall_profile.rb +199 -0
  170. data/lib/chef/resource/windows_firewall_rule.rb +5 -3
  171. data/lib/chef/resource/windows_font.rb +3 -1
  172. data/lib/chef/resource/windows_pagefile.rb +4 -0
  173. data/lib/chef/resource/windows_printer.rb +17 -18
  174. data/lib/chef/resource/windows_printer_port.rb +14 -13
  175. data/lib/chef/resource/windows_security_policy.rb +52 -21
  176. data/lib/chef/resource/windows_share.rb +5 -3
  177. data/lib/chef/resource/windows_shortcut.rb +2 -0
  178. data/lib/chef/resource/windows_uac.rb +2 -0
  179. data/lib/chef/resource/windows_user_privilege.rb +27 -2
  180. data/lib/chef/resource/windows_workgroup.rb +2 -3
  181. data/lib/chef/resource_collection/stepable_iterator.rb +1 -2
  182. data/lib/chef/resource_inspector.rb +7 -1
  183. data/lib/chef/resources.rb +1 -0
  184. data/lib/chef/role.rb +3 -4
  185. data/lib/chef/run_context/cookbook_compiler.rb +20 -20
  186. data/lib/chef/run_status.rb +2 -6
  187. data/lib/chef/server_api_versions.rb +4 -0
  188. data/lib/chef/shell.rb +1 -1
  189. data/lib/chef/shell/shell_session.rb +2 -0
  190. data/lib/chef/util/backup.rb +1 -1
  191. data/lib/chef/util/diff.rb +11 -12
  192. data/lib/chef/util/powershell/cmdlet.rb +1 -1
  193. data/lib/chef/version.rb +2 -2
  194. data/lib/chef/win32/file.rb +2 -2
  195. data/lib/chef/win32/file/version_info.rb +5 -5
  196. data/lib/chef/win32/registry.rb +1 -2
  197. data/spec/data/ssl/chef-rspec.cert +15 -15
  198. data/spec/functional/knife/configure_spec.rb +1 -1
  199. data/spec/functional/knife/ssh_spec.rb +5 -16
  200. data/spec/functional/resource/aix_service_spec.rb +9 -2
  201. data/spec/functional/resource/aixinit_service_spec.rb +8 -9
  202. data/spec/functional/resource/apt_package_spec.rb +0 -1
  203. data/spec/functional/resource/bash_spec.rb +3 -2
  204. data/spec/functional/resource/bff_spec.rb +3 -3
  205. data/spec/functional/resource/chocolatey_package_spec.rb +4 -0
  206. data/spec/functional/resource/cookbook_file_spec.rb +1 -1
  207. data/spec/functional/resource/cron_spec.rb +10 -2
  208. data/spec/functional/resource/dnf_package_spec.rb +4 -1
  209. data/spec/functional/resource/dsc_resource_spec.rb +1 -1
  210. data/spec/functional/resource/dsc_script_spec.rb +0 -1
  211. data/spec/functional/resource/execute_spec.rb +1 -1
  212. data/spec/functional/resource/git_spec.rb +23 -1
  213. data/spec/functional/resource/group_spec.rb +21 -9
  214. data/spec/functional/resource/ifconfig_spec.rb +9 -1
  215. data/spec/functional/resource/insserv_spec.rb +7 -7
  216. data/spec/functional/resource/link_spec.rb +22 -25
  217. data/spec/functional/resource/mount_spec.rb +9 -1
  218. data/spec/functional/resource/msu_package_spec.rb +9 -3
  219. data/spec/functional/resource/powershell_script_spec.rb +8 -8
  220. data/spec/functional/resource/remote_file_spec.rb +7 -13
  221. data/spec/functional/resource/rpm_spec.rb +3 -3
  222. data/spec/functional/resource/timezone_spec.rb +2 -0
  223. data/spec/functional/resource/windows_certificate_spec.rb +3 -3
  224. data/spec/functional/resource/windows_font_spec.rb +49 -0
  225. data/spec/functional/resource/windows_package_spec.rb +0 -1
  226. data/spec/functional/resource/windows_path_spec.rb +4 -0
  227. data/spec/functional/resource/windows_security_policy_spec.rb +0 -4
  228. data/spec/functional/resource/windows_service_spec.rb +4 -0
  229. data/spec/functional/resource/windows_task_spec.rb +4 -3
  230. data/spec/functional/resource/windows_user_privilege_spec.rb +1 -2
  231. data/spec/functional/resource/yum_package_spec.rb +4 -1
  232. data/spec/functional/resource/zypper_package_spec.rb +4 -1
  233. data/spec/functional/run_lock_spec.rb +26 -25
  234. data/spec/functional/shell_spec.rb +5 -6
  235. data/spec/functional/util/powershell/cmdlet_spec.rb +1 -1
  236. data/spec/functional/version_spec.rb +1 -1
  237. data/spec/functional/win32/crypto_spec.rb +1 -1
  238. data/spec/functional/win32/registry_spec.rb +8 -8
  239. data/spec/functional/win32/service_manager_spec.rb +1 -1
  240. data/spec/integration/knife/common_options_spec.rb +12 -12
  241. data/spec/integration/knife/config_get_profile_spec.rb +69 -68
  242. data/spec/integration/knife/config_get_spec.rb +126 -125
  243. data/spec/integration/knife/config_list_profiles_spec.rb +181 -152
  244. data/spec/integration/knife/config_use_profile_spec.rb +115 -61
  245. data/spec/integration/knife/cookbook_upload_spec.rb +28 -1
  246. data/spec/integration/knife/data_bag_from_file_spec.rb +1 -1
  247. data/spec/integration/knife/diff_spec.rb +3 -1
  248. data/spec/integration/knife/download_spec.rb +3 -1
  249. data/spec/integration/knife/environment_from_file_spec.rb +1 -1
  250. data/spec/integration/knife/node_from_file_spec.rb +1 -1
  251. data/spec/integration/knife/role_from_file_spec.rb +1 -1
  252. data/spec/integration/knife/serve_spec.rb +5 -5
  253. data/spec/integration/knife/upload_spec.rb +3 -1
  254. data/spec/integration/recipes/accumulator_spec.rb +1 -1
  255. data/spec/integration/recipes/lwrp_inline_resources_spec.rb +2 -2
  256. data/spec/integration/recipes/lwrp_spec.rb +1 -1
  257. data/spec/integration/recipes/notifies_spec.rb +1 -1
  258. data/spec/integration/recipes/notifying_block_spec.rb +1 -1
  259. data/spec/integration/recipes/recipe_dsl_spec.rb +5 -1
  260. data/spec/integration/recipes/resource_converge_if_changed_spec.rb +2 -0
  261. data/spec/integration/recipes/resource_load_spec.rb +4 -2
  262. data/spec/integration/recipes/unified_mode_spec.rb +1 -1
  263. data/spec/integration/recipes/use_partial_spec.rb +1 -1
  264. data/spec/scripts/ssl-serve.rb +1 -1
  265. data/spec/spec_helper.rb +16 -10
  266. data/spec/support/chef_helpers.rb +1 -20
  267. data/spec/support/platform_helpers.rb +9 -11
  268. data/spec/support/platforms/win32/spec_service.rb +1 -1
  269. data/spec/support/shared/functional/directory_resource.rb +1 -1
  270. data/spec/support/shared/functional/execute_resource.rb +1 -1
  271. data/spec/support/shared/functional/file_resource.rb +20 -21
  272. data/spec/support/shared/functional/securable_resource.rb +1 -2
  273. data/spec/support/shared/functional/securable_resource_with_reporting.rb +0 -1
  274. data/spec/support/shared/functional/win32_service.rb +1 -1
  275. data/spec/support/shared/functional/windows_script.rb +5 -5
  276. data/spec/support/shared/integration/integration_helper.rb +22 -52
  277. data/spec/support/shared/integration/knife_support.rb +2 -9
  278. data/spec/support/shared/unit/application_dot_d.rb +0 -1
  279. data/spec/support/shared/unit/provider/file.rb +12 -8
  280. data/spec/support/shared/unit/script_resource.rb +6 -20
  281. data/spec/support/shared/unit/windows_script_resource.rb +15 -28
  282. data/spec/unit/application/solo_spec.rb +4 -2
  283. data/spec/unit/application_spec.rb +4 -2
  284. data/spec/unit/chef_fs/config_spec.rb +2 -2
  285. data/spec/unit/chef_fs/diff_spec.rb +8 -8
  286. data/spec/unit/chef_fs/file_system/operation_failed_error_spec.rb +2 -4
  287. data/spec/unit/chef_fs/{parallelizer.rb → parallelizer_spec.rb} +1 -1
  288. data/spec/unit/client_spec.rb +4 -1
  289. data/spec/unit/cookbook/gem_installer_spec.rb +2 -1
  290. data/spec/unit/cookbook/synchronizer_spec.rb +26 -24
  291. data/spec/unit/data_bag_spec.rb +6 -3
  292. data/spec/unit/data_collector_spec.rb +23 -1
  293. data/spec/unit/decorator_spec.rb +23 -23
  294. data/spec/unit/dsl/platform_introspection_spec.rb +1 -0
  295. data/spec/unit/environment_spec.rb +12 -8
  296. data/spec/unit/event_dispatch/dispatcher_spec.rb +3 -0
  297. data/spec/unit/guard_interpreter_spec.rb +1 -1
  298. data/spec/unit/http/api_versions_spec.rb +20 -2
  299. data/spec/unit/json_compat_spec.rb +1 -1
  300. data/spec/unit/knife/bootstrap_spec.rb +17 -20
  301. data/spec/unit/knife/cookbook_download_spec.rb +6 -6
  302. data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +1 -1
  303. data/spec/unit/knife/cookbook_show_spec.rb +6 -7
  304. data/spec/unit/knife/cookbook_upload_spec.rb +7 -10
  305. data/spec/unit/knife/core/hashed_command_loader_spec.rb +3 -3
  306. data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +21 -12
  307. data/spec/unit/knife/data_bag_edit_spec.rb +1 -1
  308. data/spec/unit/knife/supermarket_share_spec.rb +1 -1
  309. data/spec/unit/log/syslog_spec.rb +6 -10
  310. data/spec/unit/log/winevt_spec.rb +21 -13
  311. data/spec/unit/lwrp_spec.rb +9 -6
  312. data/spec/unit/mixin/{path_sanity_spec.rb → default_paths_spec.rb} +14 -14
  313. data/spec/unit/mixin/powershell_exec_spec.rb +1 -1
  314. data/spec/unit/mixin/powershell_out_spec.rb +2 -4
  315. data/spec/unit/mixin/powershell_type_coercions_spec.rb +1 -1
  316. data/spec/unit/mixin/securable_spec.rb +0 -1
  317. data/spec/unit/mixin/shell_out_spec.rb +25 -26
  318. data/spec/unit/mixin/subclass_directive_spec.rb +2 -2
  319. data/spec/unit/mixin/template_spec.rb +30 -30
  320. data/spec/unit/mixin/unformatter_spec.rb +2 -2
  321. data/spec/unit/mixin/uris_spec.rb +1 -1
  322. data/spec/unit/mixin/which.rb +8 -0
  323. data/spec/unit/mixin/windows_architecture_helper_spec.rb +4 -4
  324. data/spec/unit/node/immutable_collections_spec.rb +6 -2
  325. data/spec/unit/node_spec.rb +103 -16
  326. data/spec/unit/property_spec.rb +5 -5
  327. data/spec/unit/provider/batch_spec.rb +1 -1
  328. data/spec/unit/provider/cron/unix_spec.rb +1 -1
  329. data/spec/unit/provider/dsc_resource_spec.rb +22 -38
  330. data/spec/unit/provider/dsc_script_spec.rb +10 -10
  331. data/spec/unit/provider/execute_spec.rb +1 -8
  332. data/spec/unit/provider/git_spec.rb +3 -3
  333. data/spec/unit/provider/ifconfig_spec.rb +0 -1
  334. data/spec/unit/provider/mdadm_spec.rb +1 -3
  335. data/spec/unit/provider/package/dnf/python_helper_spec.rb +1 -1
  336. data/spec/unit/provider/package/openbsd_spec.rb +1 -1
  337. data/spec/unit/provider/package/pacman_spec.rb +17 -20
  338. data/spec/unit/provider/package/rubygems_spec.rb +5 -10
  339. data/spec/unit/provider/package/smartos_spec.rb +1 -1
  340. data/spec/unit/provider/package/windows/registry_uninstall_entry_spec.rb +3 -3
  341. data/spec/unit/provider/package/windows_spec.rb +30 -53
  342. data/spec/unit/provider/powershell_script_spec.rb +11 -4
  343. data/spec/unit/provider/remote_directory_spec.rb +9 -9
  344. data/spec/unit/provider/service/arch_service_spec.rb +3 -2
  345. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  346. data/spec/unit/provider/service/gentoo_service_spec.rb +7 -7
  347. data/spec/unit/provider/service/macosx_spec.rb +3 -3
  348. data/spec/unit/provider/service/redhat_spec.rb +3 -3
  349. data/spec/unit/provider/service/upstart_service_spec.rb +3 -3
  350. data/spec/unit/provider/service/windows_spec.rb +2 -6
  351. data/spec/unit/provider/systemd_unit_spec.rb +28 -24
  352. data/spec/unit/provider/user/dscl_spec.rb +2 -2
  353. data/spec/unit/provider/windows_env_spec.rb +5 -4
  354. data/spec/unit/provider_resolver_spec.rb +6 -6
  355. data/spec/unit/provider_spec.rb +1 -0
  356. data/spec/unit/resource/batch_spec.rb +6 -6
  357. data/spec/unit/resource/chef_client_cron_spec.rb +23 -7
  358. data/spec/unit/resource/chef_client_systemd_timer_spec.rb +7 -4
  359. data/spec/unit/resource/execute_spec.rb +123 -118
  360. data/spec/unit/resource/file/verification_spec.rb +2 -1
  361. data/spec/unit/resource/macos_user_defaults_spec.rb +103 -2
  362. data/spec/unit/resource/osx_profile_spec.rb +233 -0
  363. data/spec/unit/resource/powershell_script_spec.rb +11 -29
  364. data/spec/unit/resource/script_spec.rb +6 -1
  365. data/spec/unit/resource/windows_feature_powershell_spec.rb +30 -4
  366. data/spec/unit/resource/windows_firewall_profile_spec.rb +77 -0
  367. data/spec/unit/resource/windows_package_spec.rb +1 -0
  368. data/spec/unit/resource_reporter_spec.rb +1 -1
  369. data/spec/unit/resource_spec.rb +25 -8
  370. data/spec/unit/role_spec.rb +30 -28
  371. data/spec/unit/run_context/cookbook_compiler_spec.rb +1 -1
  372. data/spec/unit/run_lock_spec.rb +1 -1
  373. data/spec/unit/scan_access_control_spec.rb +1 -1
  374. data/spec/unit/server_api_spec.rb +43 -16
  375. data/spec/unit/util/backup_spec.rb +1 -1
  376. data/spec/unit/util/diff_spec.rb +1 -15
  377. data/spec/unit/util/powershell/ps_credential_spec.rb +2 -2
  378. data/spec/unit/util/selinux_spec.rb +2 -1
  379. data/spec/unit/win32/security_spec.rb +4 -3
  380. data/tasks/rspec.rb +1 -1
  381. metadata +53 -40
  382. data/lib/chef/provider/osx_profile.rb +0 -255
  383. data/spec/unit/provider/osx_profile_spec.rb +0 -255
@@ -73,19 +73,19 @@ class Chef
73
73
  description: "The Chef environment of the data if storing per environment values."
74
74
 
75
75
  load_current_value do
76
- begin
77
- item = ChefVault::Item.load(data_bag, id)
78
- raw_data item.raw_data
79
- clients item.get_clients
80
- admins item.get_admins
81
- search item.search
82
- rescue ChefVault::Exceptions::SecretDecryption
83
- current_value_does_not_exist!
84
- rescue ChefVault::Exceptions::KeysNotFound
85
- current_value_does_not_exist!
86
- rescue Net::HTTPClientException => e
87
- current_value_does_not_exist! if e.response_code == "404"
88
- end
76
+
77
+ item = ChefVault::Item.load(data_bag, id)
78
+ raw_data item.raw_data
79
+ clients item.get_clients
80
+ admins item.get_admins
81
+ search item.search
82
+ rescue ChefVault::Exceptions::SecretDecryption
83
+ current_value_does_not_exist!
84
+ rescue ChefVault::Exceptions::KeysNotFound
85
+ current_value_does_not_exist!
86
+ rescue Net::HTTPClientException => e
87
+ current_value_does_not_exist! if e.response_code == "404"
88
+
89
89
  end
90
90
 
91
91
  action :create do
@@ -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
@@ -158,7 +158,7 @@ class Chef
158
158
 
159
159
  # @todo this is Chef 12 era cleanup. Someday we should remove it all
160
160
  template "/etc/cron.d/#{sanitized_name}" do
161
- source ::File.expand_path("../../support/cron.d.erb", __FILE__)
161
+ source ::File.expand_path("../support/cron.d.erb", __dir__)
162
162
  local true
163
163
  mode new_resource.mode
164
164
  variables(
@@ -70,7 +70,7 @@ class Chef
70
70
 
71
71
  with_run_context :root do
72
72
  edit_resource(:template, allow_path) do |new_resource|
73
- source ::File.expand_path("../support/cron_access.erb", __FILE__)
73
+ source ::File.expand_path("support/cron_access.erb", __dir__)
74
74
  local true
75
75
  mode "0600"
76
76
  variables["users"] ||= []
@@ -87,7 +87,7 @@ class Chef
87
87
 
88
88
  with_run_context :root do
89
89
  edit_resource(:template, deny_path) do |new_resource|
90
- source ::File.expand_path("../support/cron_access.erb", __FILE__)
90
+ source ::File.expand_path("support/cron_access.erb", __dir__)
91
91
  local true
92
92
  mode "0600"
93
93
  variables["users"] ||= []
@@ -38,7 +38,7 @@ class Chef
38
38
  end
39
39
  ```
40
40
 
41
- **Install Virtualbox from the .mpkg**:
41
+ **Install VirtualBox from the .mpkg**:
42
42
 
43
43
  ```ruby
44
44
  dmg_package 'Virtualbox' do
@@ -66,7 +66,7 @@ class Chef
66
66
  description: "The remote URL that is used to download the `.dmg` file, if specified."
67
67
 
68
68
  property :file, String,
69
- description: "The full path to the `.dmg` file on the local system."
69
+ description: "The absolute path to the `.dmg` file on the local system."
70
70
 
71
71
  property :owner, [String, Integer],
72
72
  description: "The user that should own the package installation."
@@ -161,11 +161,11 @@ class Chef
161
161
 
162
162
  ```ruby
163
163
  execute 'test_rule' do
164
- command 'command_to_run
164
+ command "command_to_run
165
165
  --option value
166
166
  --option value
167
167
  --source \#{node[:name_of_node][:ipsec][:local][:subnet]}
168
- -j test_rule'
168
+ -j test_rule"
169
169
 
170
170
  action :nothing
171
171
  end
@@ -509,7 +509,6 @@ class Chef
509
509
  def initialize(name, run_context = nil)
510
510
  super
511
511
  @command = name
512
- @backup = 5
513
512
  @default_guard_interpreter = :execute
514
513
  @is_guard_interpreter = false
515
514
  end
@@ -630,11 +629,11 @@ class Chef
630
629
  end
631
630
 
632
631
  # if domain is provided in both username and domain
633
- if specified_user && ((specified_user.include? '\\') || (specified_user.include? "@")) && specified_domain
632
+ if specified_user.is_a?(String) && ((specified_user.include? '\\') || (specified_user.include? "@")) && specified_domain
634
633
  raise ArgumentError, "The domain is provided twice. Username: `#{specified_user}`, Domain: `#{specified_domain}`. Please specify domain only once."
635
634
  end
636
635
 
637
- if ! specified_user.nil? && specified_domain.nil?
636
+ if specified_user.is_a?(String) && specified_domain.nil?
638
637
  # Splitting username of format: Domain\Username
639
638
  domain_and_user = user.split('\\')
640
639
 
@@ -25,7 +25,40 @@ class Chef
25
25
  unified_mode true
26
26
  provides :gem_package
27
27
 
28
- description "Use the **gem_package** resource to manage gem packages that are only included in recipes. When a package is installed from a local file, it must be added to the node using the remote_file or cookbook_file resources."
28
+ description <<~DESC
29
+ Use the **gem_package** resource to manage gem packages that are only included in recipes.
30
+ When a gem is installed from a local file, it must be added to the node using the **remote_file** or **cookbook_file** resources.
31
+
32
+ Note: The **gem_package** resource must be specified as `gem_package` and cannot be shortened to `package` in a recipe.
33
+
34
+ Warning: The **chef_gem** and **gem_package** resources are both used to install Ruby gems. For any machine on which #{Chef::Dist::PRODUCT} is
35
+ 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
36
+ available only to #{Chef::Dist::PRODUCT}.
37
+ Use the **chef_gem** resource to install gems into the instance of Ruby that is dedicated to #{Chef::Dist::PRODUCT}.
38
+ Use the **gem_package** resource to install all other gems (i.e. install gems system-wide).
39
+ DESC
40
+
41
+ examples <<~EXAMPLES
42
+ The following examples demonstrate various approaches for using the **gem_package** resource in recipes:
43
+
44
+ **Install a gem file from the local file system**
45
+
46
+ ```ruby
47
+ gem_package 'right_aws' do
48
+ source '/tmp/right_aws-1.11.0.gem'
49
+ action :install
50
+ end
51
+ ```
52
+
53
+ **Use the `ignore_failure` common attribute**
54
+
55
+ ```ruby
56
+ gem_package 'syntax' do
57
+ action :install
58
+ ignore_failure true
59
+ end
60
+ ```
61
+ EXAMPLES
29
62
 
30
63
  property :package_name, String,
31
64
  description: "An optional property to set the package name if it differs from the resource block's name.",
@@ -53,7 +86,7 @@ class Chef
53
86
  default: lazy { Chef::Config[:clear_gem_sources] }, desired_state: false
54
87
 
55
88
  property :gem_binary, String, desired_state: false,
56
- 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."
89
+ 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."
57
90
 
58
91
  property :include_default_source, [ TrueClass, FalseClass, nil ],
59
92
  description: "Set to `false` to not include `Chef::Config[:rubygems_url]` in the sources.",
@@ -86,7 +86,7 @@ class Chef
86
86
  end
87
87
 
88
88
  action :periodic do
89
- return unless mac_os_x?
89
+ return unless macos?
90
90
 
91
91
  unless brew_up_to_date?
92
92
  converge_by "update new lists of packages" do
@@ -96,7 +96,7 @@ class Chef
96
96
  end
97
97
 
98
98
  action :update do
99
- return unless mac_os_x?
99
+ return unless macos?
100
100
 
101
101
  converge_by "force update new lists of packages" do
102
102
  do_update
@@ -87,8 +87,7 @@ class Chef
87
87
  def updated_ec2_config_xml
88
88
  begin
89
89
  require "rexml/document" unless defined?(REXML::Document)
90
- config_file = 'C:\Program Files\Amazon\Ec2ConfigService\Settings\config.xml'
91
- config = REXML::Document.new(::File.read(config_file))
90
+ config = REXML::Document.new(::File.read(WINDOWS_EC2_CONFIG))
92
91
  # find an element named State with a sibling element whose value is Ec2SetComputerName
93
92
  REXML::XPath.each(config, "//Plugin/State[../Name/text() = 'Ec2SetComputerName']") do |element|
94
93
  element.text = "Disabled"
@@ -223,35 +222,36 @@ class Chef
223
222
  end
224
223
 
225
224
  else # windows
225
+ WINDOWS_EC2_CONFIG = 'C:\Program Files\Amazon\Ec2ConfigService\Settings\config.xml'.freeze
226
+
226
227
  raise "Windows hostnames cannot contain a period." if new_resource.hostname.match?(/\./)
227
228
 
228
229
  # suppress EC2 config service from setting our hostname
229
- if ::File.exist?('C:\Program Files\Amazon\Ec2ConfigService\Settings\config.xml')
230
+ if ::File.exist?(WINDOWS_EC2_CONFIG)
230
231
  xml_contents = updated_ec2_config_xml
231
232
  if xml_contents.empty?
232
233
  Chef::Log.warn('Unable to properly parse and update C:\Program Files\Amazon\Ec2ConfigService\Settings\config.xml contents. Skipping file update.')
233
234
  else
234
- declare_resource(:file, 'C:\Program Files\Amazon\Ec2ConfigService\Settings\config.xml') do
235
+ file WINDOWS_EC2_CONFIG do
235
236
  content xml_contents
236
237
  end
237
238
  end
238
239
  end
239
240
 
240
- # update via netdom
241
- declare_resource(:powershell_script, "set hostname") do
242
- code <<-EOH
243
- $sysInfo = Get-WmiObject -Class Win32_ComputerSystem
244
- $sysInfo.Rename("#{new_resource.hostname}")
245
- EOH
246
- notifies :request_reboot, "reboot[setting hostname]"
247
- not_if { Socket.gethostbyname(Socket.gethostname).first == new_resource.hostname }
248
- end
241
+ unless Socket.gethostbyname(Socket.gethostname).first == new_resource.hostname
242
+ converge_by "set hostname to #{new_resource.hostname}" do
243
+ powershell_out! <<~EOH
244
+ $sysInfo = Get-WmiObject -Class Win32_ComputerSystem
245
+ $sysInfo.Rename("#{new_resource.hostname}")
246
+ EOH
247
+ end
249
248
 
250
- # reboot because $windows
251
- declare_resource(:reboot, "setting hostname") do
252
- reason "#{Chef::Dist::PRODUCT} updated system hostname"
253
- action :nothing
254
- only_if { new_resource.windows_reboot }
249
+ # reboot because $windows
250
+ reboot "setting hostname" do
251
+ reason "#{Chef::Dist::PRODUCT} updated system hostname"
252
+ only_if { new_resource.windows_reboot }
253
+ action :request_reboot
254
+ end
255
255
  end
256
256
  end
257
257
  end
@@ -68,7 +68,7 @@ class Chef
68
68
  # check. According to `man 5 launchd.plist`:
69
69
  # StartCalendarInterval <dictionary of integers or array of dictionaries of integers>
70
70
  # ... Missing arguments are considered to be wildcard.
71
- # What the man page doesn't state, but what was observed (OSX 10.11.5, launchctrl v3.4.0)
71
+ # What the man page doesn't state, but what was observed (OSX 10.11.5, launchctl v3.4.0)
72
72
  # Is that keys that are specified, but invalid, will also be treated as a wildcard
73
73
  # this means that an entry like:
74
74
  # { "Hour"=>0, "Weekday"=>"6-7"}
@@ -103,6 +103,7 @@ class Chef
103
103
  protected
104
104
 
105
105
  attr_writer :loaded_lwrps
106
+
106
107
  def loaded_lwrps
107
108
  @loaded_lwrps ||= {}
108
109
  end
@@ -16,6 +16,8 @@
16
16
  #
17
17
 
18
18
  require_relative "../resource"
19
+ require_relative "../dist"
20
+ require "plist"
19
21
 
20
22
  class Chef
21
23
  class Resource
@@ -28,99 +30,210 @@ class Chef
28
30
 
29
31
  description "Use the **macos_userdefaults** resource to manage the macOS user defaults system. The properties of this resource are passed to the defaults command, and the parameters follow the convention of that command. See the defaults(1) man page for details on how the tool works."
30
32
  introduced "14.0"
33
+ examples <<~DOC
34
+ **Specify a global domain value**
35
+
36
+ ```ruby
37
+ macos_userdefaults 'Full keyboard access to all controls' do
38
+ key 'AppleKeyboardUIMode'
39
+ value 2
40
+ end
41
+ ```
42
+
43
+ **Setting a value on a specific domain**
44
+
45
+ ```ruby
46
+ macos_userdefaults 'Enable macOS firewall' do
47
+ domain '/Library/Preferences/com.apple.alf'
48
+ key 'globalstate'
49
+ value 1
50
+ end
51
+ ```
52
+
53
+ **Specifying the type of a key to skip automatic type detection**
54
+
55
+ ```ruby
56
+ macos_userdefaults 'Finder expanded save dialogs' do
57
+ key 'NSNavPanelExpandedStateForSaveMode'
58
+ value 'TRUE'
59
+ type 'bool'
60
+ end
61
+ ```
62
+ DOC
31
63
 
32
64
  property :domain, String,
33
65
  description: "The domain that the user defaults belong to.",
34
- required: true
66
+ default: "NSGlobalDomain",
67
+ default_description: "NSGlobalDomain: the global domain.",
68
+ desired_state: false
35
69
 
36
70
  property :global, [TrueClass, FalseClass],
37
71
  description: "Determines whether or not the domain is global.",
38
- default: false
72
+ deprecated: true,
73
+ default: false,
74
+ desired_state: false
39
75
 
40
76
  property :key, String,
41
- description: "The preference key."
77
+ description: "The preference key.",
78
+ required: true
79
+
80
+ property :host, [String, Symbol],
81
+ description: "Set either :current or a hostname to set the user default at the host level.",
82
+ desired_state: false,
83
+ introduced: "16.3"
42
84
 
43
85
  property :value, [Integer, Float, String, TrueClass, FalseClass, Hash, Array],
44
- description: "The value of the key.",
45
- required: true
86
+ description: "The value of the key. Note: With the `type` property set to `bool`, `String` forms of Boolean true/false values that Apple accepts in the defaults command will be coerced: 0/1, 'TRUE'/'FALSE,' 'true'/false', 'YES'/'NO', or 'yes'/'no'.",
87
+ required: [:write],
88
+ coerce: proc { |v| v.is_a?(Hash) ? v.transform_keys(&:to_s) : v } # make sure keys are all strings for comparison
46
89
 
47
90
  property :type, String,
48
91
  description: "The value type of the preference key.",
49
- default: ""
92
+ equal_to: %w{bool string int float array dict},
93
+ desired_state: false
50
94
 
51
95
  property :user, String,
52
- description: "The system user that the default will be applied to."
96
+ description: "The system user that the default will be applied to.",
97
+ desired_state: false
53
98
 
54
99
  property :sudo, [TrueClass, FalseClass],
55
- description: "Set to true if the setting you wish to modify requires privileged access.",
100
+ description: "Set to true if the setting you wish to modify requires privileged access. This requires passwordless sudo for the '/usr/bin/defaults' command to be setup for the user running #{Chef::Dist::PRODUCT}.",
56
101
  default: false,
57
102
  desired_state: false
58
103
 
59
- # @todo this should get refactored away: https://github.com/chef/chef/issues/7622
60
- property :is_set, [TrueClass, FalseClass],
61
- default: false,
62
- desired_state: false,
63
- skip_docs: true
104
+ load_current_value do |desired|
105
+ Chef::Log.debug "#load_current_value: shelling out \"#{defaults_export_cmd(desired).join(" ")}\" to determine state"
106
+ state = shell_out(defaults_export_cmd(desired), user: desired.user)
64
107
 
65
- # coerce various ways of representing a boolean into either 0 (false) or 1 (true)
66
- # which is what the defaults CLI expects. Why? Well defaults itself accepts a few
67
- # different formats, but when you do a read command it all comes back as 1 or 0.
68
- def coerce_booleans(val)
69
- return 1 if [true, "TRUE", "1", "true", "YES", "yes"].include?(val)
70
- return 0 if [false, "FALSE", "0", "false", "NO", "no"].include?(val)
108
+ if state.error? || state.stdout.empty?
109
+ Chef::Log.debug "#load_current_value: #{defaults_export_cmd(desired).join(" ")} returned stdout: #{state.stdout} and stderr: #{state.stderr}"
110
+ current_value_does_not_exist!
111
+ end
112
+
113
+ plist_data = ::Plist.parse_xml(state.stdout)
114
+
115
+ # handle the situation where the key doesn't exist in the domain
116
+ if plist_data.key?(desired.key)
117
+ key desired.key
118
+ else
119
+ current_value_does_not_exist!
120
+ end
71
121
 
72
- val
122
+ value plist_data[desired.key]
73
123
  end
74
124
 
75
- load_current_value do |desired|
76
- value = coerce_booleans(desired.value)
77
- cmd = "defaults read '#{desired.domain}' "
78
- cmd << "'#{desired.key}' " if desired.key
79
- cmd << " | grep -qx '#{value}'"
80
-
81
- vc = if desired.user.nil?
82
- shell_out(cmd)
83
- else
84
- shell_out(cmd, user: desired.user)
85
- end
86
-
87
- is_set !vc.error?
125
+ #
126
+ # The defaults command to export a domain
127
+ #
128
+ # @return [Array] defaults command
129
+ #
130
+ def defaults_export_cmd(resource)
131
+ state_cmd = ["/usr/bin/defaults"]
132
+
133
+ if resource.host == "current"
134
+ state_cmd.concat(["-currentHost"])
135
+ elsif resource.host # they specified a non-nil value, which is a hostname
136
+ state_cmd.concat(["-host", resource.host])
137
+ end
138
+
139
+ state_cmd.concat(["export", resource.domain, "-"])
140
+ state_cmd
88
141
  end
89
142
 
90
143
  action :write do
91
- description "Write the setting to the specified domain"
92
-
93
- unless current_resource.is_set
94
- cmd = ["defaults write"]
95
- cmd.unshift("sudo") if new_resource.sudo
96
-
97
- cmd << if new_resource.global
98
- "NSGlobalDomain"
99
- else
100
- "'#{new_resource.domain}'"
101
- end
102
-
103
- cmd << "'#{new_resource.key}'" if new_resource.key
104
- value = new_resource.value
105
- type = new_resource.type.empty? ? value_type(value) : new_resource.type
106
- # creates a string of Key1 Value1 Key2 Value2...
107
- value = value.map { |k, v| "\"#{k}\" \"#{v}\"" }.join(" ") if type == "dict"
108
- if type == "array"
109
- value = value.join("' '")
110
- value = "'#{value}'"
111
- end
112
- cmd << "-#{type}" if type
113
- cmd << value
144
+ description "Write the value to the specified domain/key."
114
145
 
115
- # FIXME: this should use cmd directly as an array argument, but then the quoting
116
- # of individual args above needs to be removed as well.
117
- execute cmd.join(" ") do
118
- user new_resource.user unless new_resource.user.nil?
119
- end
146
+ converge_if_changed do
147
+ cmd = defaults_modify_cmd
148
+ Chef::Log.debug("Updating defaults value by shelling out: #{cmd.join(" ")}")
149
+
150
+ shell_out!(cmd, user: new_resource.user)
151
+ end
152
+ end
153
+
154
+ action :delete do
155
+ description "Delete a key from a domain."
156
+
157
+ # if it's not there there's nothing to remove
158
+ return unless current_resource
159
+
160
+ converge_by("delete domain:#{new_resource.domain} key:#{new_resource.key}") do
161
+
162
+ cmd = defaults_modify_cmd
163
+ Chef::Log.debug("Removing defaults key by shelling out: #{cmd.join(" ")}")
164
+
165
+ shell_out!(cmd, user: new_resource.user)
120
166
  end
121
167
  end
122
168
 
123
169
  action_class do
170
+ #
171
+ # The command used to write or delete delete values from domains
172
+ #
173
+ # @return [Array] Array representation of defaults command to run
174
+ #
175
+ def defaults_modify_cmd
176
+ cmd = ["/usr/bin/defaults"]
177
+
178
+ if new_resource.host == :current
179
+ cmd.concat(["-currentHost"])
180
+ elsif new_resource.host # they specified a non-nil value, which is a hostname
181
+ cmd.concat(["-host", new_resource.host])
182
+ end
183
+
184
+ cmd.concat([action.to_s, new_resource.domain, new_resource.key])
185
+ cmd.concat(processed_value) if action == :write
186
+ cmd.prepend("sudo") if new_resource.sudo
187
+ cmd
188
+ end
189
+
190
+ #
191
+ # convert the provided value into the format defaults expects
192
+ #
193
+ # @return [array] array of values starting with the type if applicable
194
+ #
195
+ def processed_value
196
+ type = new_resource.type || value_type(new_resource.value)
197
+
198
+ # when dict this creates an array of values ["Key1", "Value1", "Key2", "Value2" ...]
199
+ cmd_values = ["-#{type}"]
200
+
201
+ case type
202
+ when "dict"
203
+ cmd_values.concat(new_resource.value.flatten)
204
+ when "array"
205
+ cmd_values.concat(new_resource.value)
206
+ when "bool"
207
+ cmd_values.concat(bool_to_defaults_bool(new_resource.value))
208
+ else
209
+ cmd_values.concat([new_resource.value])
210
+ end
211
+
212
+ cmd_values
213
+ end
214
+
215
+ #
216
+ # defaults booleans on the CLI must be 'TRUE' or 'FALSE' so convert various inputs to that
217
+ #
218
+ # @param [String, Integer, Boolean] input <description>
219
+ #
220
+ # @return [String] TRUE or FALSE
221
+ #
222
+ def bool_to_defaults_bool(input)
223
+ return ["TRUE"] if [true, "TRUE", "1", "true", "YES", "yes"].include?(input)
224
+ return ["FALSE"] if [false, "FALSE", "0", "false", "NO", "no"].include?(input)
225
+
226
+ # make sure it's very clear bad input was given
227
+ raise ArgumentError, "#{input} cannot be converted to a boolean value for use with Apple's defaults command. Acceptable values are: 'TRUE', 'YES', 'true, 'yes', '0', true, 'FALSE', 'false', 'NO', 'no', '1', or false."
228
+ end
229
+
230
+ #
231
+ # convert ruby type to defaults type
232
+ #
233
+ # @param [Integer, Float, String, TrueClass, FalseClass, Hash, Array] value The value being set
234
+ #
235
+ # @return [string, nil] the type value used by defaults or nil if not applicable
236
+ #
124
237
  def value_type(value)
125
238
  case value
126
239
  when true, false
@@ -133,6 +246,8 @@ class Chef
133
246
  "dict"
134
247
  when Array
135
248
  "array"
249
+ when String
250
+ "string"
136
251
  end
137
252
  end
138
253
  end