chef 15.17.4-universal-mingw32 → 16.0.257-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 (571) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +14 -20
  3. data/README.md +6 -6
  4. data/Rakefile +18 -23
  5. data/chef-universal-mingw32.gemspec +4 -4
  6. data/chef.gemspec +10 -26
  7. data/distro/powershell/chef/chef.psm1 +3 -3
  8. data/distro/templates/powershell/chef/chef.psm1.erb +3 -3
  9. data/lib/chef/action_collection.rb +16 -5
  10. data/lib/chef/api_client/registration.rb +2 -2
  11. data/lib/chef/application.rb +33 -54
  12. data/lib/chef/application/apply.rb +20 -3
  13. data/lib/chef/application/base.rb +8 -3
  14. data/lib/chef/application/exit_code.rb +2 -2
  15. data/lib/chef/application/knife.rb +1 -1
  16. data/lib/chef/chef_class.rb +4 -4
  17. data/lib/chef/chef_fs/chef_fs_data_store.rb +3 -3
  18. data/lib/chef/chef_fs/file_system/chef_server/policies_dir.rb +1 -1
  19. data/lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb +1 -1
  20. data/lib/chef/chef_fs/file_system/chef_server/rest_list_entry.rb +6 -2
  21. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +1 -1
  22. data/lib/chef/chef_fs/file_system/repository/base_file.rb +0 -1
  23. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir.rb +2 -2
  24. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_entry.rb +1 -1
  25. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_root_dir.rb +5 -5
  26. data/lib/chef/chef_fs/file_system/repository/directory.rb +1 -1
  27. data/lib/chef/chef_fs/file_system/repository/file_system_entry.rb +1 -1
  28. data/lib/chef/chef_fs/path_utils.rb +3 -3
  29. data/lib/chef/client.rb +16 -14
  30. data/lib/chef/config.rb +1 -1
  31. data/lib/chef/cookbook/file_system_file_vendor.rb +1 -1
  32. data/lib/chef/cookbook/gem_installer.rb +1 -1
  33. data/lib/chef/cookbook/metadata.rb +45 -22
  34. data/lib/chef/cookbook_version.rb +40 -5
  35. data/lib/chef/data_bag.rb +2 -2
  36. data/lib/chef/data_collector/error_handlers.rb +1 -1
  37. data/lib/chef/data_collector/run_end_message.rb +7 -1
  38. data/lib/chef/deprecated.rb +1 -9
  39. data/lib/chef/dist.rb +8 -0
  40. data/lib/chef/dsl/chef_vault.rb +84 -0
  41. data/lib/chef/dsl/declare_resource.rb +7 -5
  42. data/lib/chef/dsl/platform_introspection.rb +2 -3
  43. data/lib/chef/dsl/recipe.rb +7 -12
  44. data/lib/chef/dsl/universal.rb +3 -7
  45. data/lib/chef/environment.rb +2 -2
  46. data/lib/chef/event_dispatch/base.rb +3 -0
  47. data/lib/chef/exceptions.rb +0 -3
  48. data/lib/chef/formatters/doc.rb +1 -1
  49. data/lib/chef/formatters/error_inspectors/node_load_error_inspector.rb +2 -2
  50. data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +7 -7
  51. data/lib/chef/formatters/indentable_output_stream.rb +7 -16
  52. data/lib/chef/http.rb +1 -2
  53. data/lib/chef/http/http_request.rb +3 -2
  54. data/lib/chef/knife.rb +1 -3
  55. data/lib/chef/knife/acl_add.rb +57 -0
  56. data/lib/chef/knife/acl_base.rb +183 -0
  57. data/lib/chef/knife/acl_bulk_add.rb +78 -0
  58. data/lib/chef/knife/acl_bulk_remove.rb +83 -0
  59. data/lib/chef/knife/acl_remove.rb +62 -0
  60. data/lib/chef/knife/acl_show.rb +56 -0
  61. data/lib/chef/knife/bootstrap.rb +93 -97
  62. data/lib/chef/knife/bootstrap/chef_vault_handler.rb +1 -1
  63. data/lib/chef/knife/bootstrap/client_builder.rb +1 -1
  64. data/lib/chef/knife/bootstrap/templates/chef-full.erb +20 -20
  65. data/lib/chef/knife/bootstrap/templates/windows-chef-client-msi.erb +13 -15
  66. data/lib/chef/knife/bootstrap/train_connector.rb +0 -1
  67. data/lib/chef/knife/cookbook_download.rb +1 -1
  68. data/lib/chef/knife/cookbook_metadata.rb +1 -1
  69. data/lib/chef/knife/core/bootstrap_context.rb +63 -60
  70. data/lib/chef/knife/core/gem_glob_loader.rb +1 -1
  71. data/lib/chef/knife/core/generic_presenter.rb +4 -3
  72. data/lib/chef/knife/core/hashed_command_loader.rb +2 -3
  73. data/lib/chef/knife/core/node_presenter.rb +2 -2
  74. data/lib/chef/knife/core/status_presenter.rb +5 -5
  75. data/lib/chef/knife/core/subcommand_loader.rb +1 -1
  76. data/lib/chef/knife/core/ui.rb +17 -1
  77. data/lib/chef/knife/core/windows_bootstrap_context.rb +45 -58
  78. data/lib/chef/knife/data_bag_secret_options.rb +18 -45
  79. data/lib/chef/knife/environment_compare.rb +1 -1
  80. data/lib/chef/knife/exec.rb +2 -2
  81. data/lib/chef/knife/group_add.rb +55 -0
  82. data/lib/chef/knife/{cookbook_site_download.rb → group_create.rb} +21 -12
  83. data/lib/chef/knife/group_destroy.rb +53 -0
  84. data/lib/chef/knife/{cookbook_site_list.rb → group_list.rb} +14 -11
  85. data/lib/chef/knife/group_remove.rb +56 -0
  86. data/lib/chef/knife/{cookbook_site_install.rb → group_show.rb} +21 -12
  87. data/lib/chef/knife/list.rb +1 -1
  88. data/lib/chef/knife/ssh.rb +12 -50
  89. data/lib/chef/knife/status.rb +3 -3
  90. data/lib/chef/knife/supermarket_download.rb +1 -2
  91. data/lib/chef/knife/supermarket_install.rb +1 -2
  92. data/lib/chef/knife/supermarket_list.rb +1 -2
  93. data/lib/chef/knife/supermarket_search.rb +1 -2
  94. data/lib/chef/knife/supermarket_share.rb +1 -2
  95. data/lib/chef/knife/supermarket_show.rb +1 -2
  96. data/lib/chef/knife/supermarket_unshare.rb +1 -2
  97. data/lib/chef/knife/{cookbook_site_show.rb → user_dissociate.rb} +15 -13
  98. data/lib/chef/knife/{cookbook_site_search.rb → user_invite_add.rb} +16 -13
  99. data/lib/chef/knife/user_invite_list.rb +34 -0
  100. data/lib/chef/knife/user_invite_recind.rb +63 -0
  101. data/lib/chef/knife/yaml_convert.rb +91 -0
  102. data/lib/chef/log.rb +1 -1
  103. data/lib/chef/mixin/create_path.rb +8 -8
  104. data/lib/chef/mixin/openssl_helper.rb +3 -26
  105. data/lib/chef/mixin/powershell_exec.rb +10 -1
  106. data/lib/chef/mixin/powershell_out.rb +1 -1
  107. data/lib/chef/mixin/properties.rb +13 -1
  108. data/lib/chef/mixin/shell_out.rb +0 -4
  109. data/lib/chef/mixin/template.rb +0 -1
  110. data/lib/chef/monkey_patches/net_http.rb +0 -4
  111. data/lib/chef/node.rb +18 -6
  112. data/lib/chef/node/mixin/deep_merge_cache.rb +7 -7
  113. data/lib/chef/node/mixin/immutablize_array.rb +4 -0
  114. data/lib/chef/node/mixin/immutablize_hash.rb +3 -0
  115. data/lib/chef/node_map.rb +7 -36
  116. data/lib/chef/platform/priority_map.rb +4 -4
  117. data/lib/chef/platform/query_helpers.rb +6 -34
  118. data/lib/chef/powershell.rb +14 -0
  119. data/lib/chef/property.rb +22 -4
  120. data/lib/chef/provider.rb +40 -6
  121. data/lib/chef/provider/cron.rb +2 -2
  122. data/lib/chef/provider/directory.rb +2 -2
  123. data/lib/chef/provider/dsc_resource.rb +1 -1
  124. data/lib/chef/provider/dsc_script.rb +1 -1
  125. data/lib/chef/provider/execute.rb +2 -8
  126. data/lib/chef/provider/file.rb +5 -5
  127. data/lib/chef/provider/git.rb +84 -27
  128. data/lib/chef/provider/group.rb +4 -4
  129. data/lib/chef/provider/http_request.rb +6 -6
  130. data/lib/chef/provider/ifconfig.rb +4 -4
  131. data/lib/chef/provider/launchd.rb +36 -51
  132. data/lib/chef/provider/link.rb +2 -2
  133. data/lib/chef/provider/mount.rb +5 -5
  134. data/lib/chef/provider/mount/solaris.rb +1 -0
  135. data/lib/chef/provider/osx_profile.rb +7 -3
  136. data/lib/chef/provider/package.rb +2 -2
  137. data/lib/chef/provider/package/cab.rb +3 -4
  138. data/lib/chef/provider/package/chocolatey.rb +1 -3
  139. data/lib/chef/provider/package/dnf.rb +66 -10
  140. data/lib/chef/provider/package/dnf/dnf_helper.py +84 -30
  141. data/lib/chef/provider/package/dnf/python_helper.rb +79 -36
  142. data/lib/chef/provider/package/dnf/version.rb +5 -1
  143. data/lib/chef/provider/package/freebsd/pkgng.rb +1 -3
  144. data/lib/chef/provider/package/homebrew.rb +106 -42
  145. data/lib/chef/provider/package/msu.rb +3 -1
  146. data/lib/chef/provider/package/pacman.rb +25 -34
  147. data/lib/chef/provider/package/powershell.rb +2 -6
  148. data/lib/chef/provider/package/rubygems.rb +29 -2
  149. data/lib/chef/provider/package/snap.rb +27 -96
  150. data/lib/chef/provider/package/windows.rb +3 -2
  151. data/lib/chef/provider/package/windows/msi.rb +2 -2
  152. data/lib/chef/provider/package/yum.rb +0 -8
  153. data/lib/chef/provider/package/yum/yum_helper.py +0 -4
  154. data/lib/chef/provider/package/zypper.rb +1 -1
  155. data/lib/chef/provider/powershell_script.rb +4 -10
  156. data/lib/chef/provider/registry_key.rb +4 -4
  157. data/lib/chef/provider/remote_directory.rb +3 -3
  158. data/lib/chef/provider/remote_file/ftp.rb +3 -2
  159. data/lib/chef/provider/remote_file/local_file.rb +2 -1
  160. data/lib/chef/provider/remote_file/sftp.rb +3 -2
  161. data/lib/chef/provider/route.rb +5 -3
  162. data/lib/chef/provider/ruby_block.rb +1 -1
  163. data/lib/chef/provider/script.rb +2 -2
  164. data/lib/chef/provider/service.rb +8 -8
  165. data/lib/chef/provider/service/aixinit.rb +1 -1
  166. data/lib/chef/provider/service/arch.rb +2 -2
  167. data/lib/chef/provider/service/debian.rb +31 -29
  168. data/lib/chef/provider/service/gentoo.rb +2 -2
  169. data/lib/chef/provider/service/macosx.rb +7 -12
  170. data/lib/chef/provider/service/openbsd.rb +1 -1
  171. data/lib/chef/provider/service/redhat.rb +2 -2
  172. data/lib/chef/provider/service/simple.rb +3 -3
  173. data/lib/chef/provider/service/systemd.rb +12 -12
  174. data/lib/chef/provider/service/upstart.rb +1 -1
  175. data/lib/chef/provider/service/windows.rb +5 -11
  176. data/lib/chef/provider/subversion.rb +25 -5
  177. data/lib/chef/provider/systemd_unit.rb +26 -25
  178. data/lib/chef/provider/user.rb +6 -6
  179. data/lib/chef/provider/user/dscl.rb +3 -3
  180. data/lib/chef/provider/user/mac.rb +10 -9
  181. data/lib/chef/provider/whyrun_safe_ruby_block.rb +1 -1
  182. data/lib/chef/provider/windows_env.rb +3 -3
  183. data/lib/chef/provider/windows_script.rb +2 -2
  184. data/lib/chef/provider/windows_task.rb +7 -9
  185. data/lib/chef/provider/yum_repository.rb +1 -1
  186. data/lib/chef/provider/zypper_repository.rb +11 -31
  187. data/lib/chef/providers.rb +0 -6
  188. data/lib/chef/recipe.rb +36 -0
  189. data/lib/chef/resource.rb +41 -56
  190. data/lib/chef/resource/action_class.rb +24 -22
  191. data/lib/chef/resource/alternatives.rb +149 -0
  192. data/lib/chef/resource/apt_package.rb +2 -1
  193. data/lib/chef/resource/apt_preference.rb +69 -2
  194. data/lib/chef/resource/apt_repository.rb +337 -5
  195. data/lib/chef/resource/apt_update.rb +52 -1
  196. data/lib/chef/resource/archive_file.rb +9 -29
  197. data/lib/chef/resource/bash.rb +2 -0
  198. data/lib/chef/resource/bff_package.rb +9 -1
  199. data/lib/chef/resource/breakpoint.rb +0 -1
  200. data/lib/chef/resource/build_essential.rb +42 -48
  201. data/lib/chef/resource/cab_package.rb +8 -1
  202. data/lib/chef/resource/chef_client_cron.rb +225 -0
  203. data/lib/chef/resource/chef_client_scheduled_task.rb +198 -0
  204. data/lib/chef/resource/chef_client_systemd_timer.rb +177 -0
  205. data/lib/chef/resource/chef_gem.rb +9 -16
  206. data/lib/chef/resource/chef_handler.rb +2 -1
  207. data/lib/chef/resource/chef_sleep.rb +0 -1
  208. data/lib/chef/resource/chef_vault_secret.rb +135 -0
  209. data/lib/chef/resource/chocolatey_config.rb +3 -1
  210. data/lib/chef/resource/chocolatey_feature.rb +2 -1
  211. data/lib/chef/resource/chocolatey_package.rb +2 -1
  212. data/lib/chef/resource/chocolatey_source.rb +2 -1
  213. data/lib/chef/resource/cookbook_file.rb +1 -1
  214. data/lib/chef/resource/cron.rb +22 -68
  215. data/lib/chef/resource/cron_access.rb +8 -15
  216. data/lib/chef/resource/cron_d.rb +9 -75
  217. data/lib/chef/resource/csh.rb +2 -0
  218. data/lib/chef/resource/directory.rb +2 -2
  219. data/lib/chef/resource/dmg_package.rb +4 -4
  220. data/lib/chef/resource/dnf_package.rb +2 -3
  221. data/lib/chef/resource/dpkg_package.rb +2 -1
  222. data/lib/chef/resource/dsc_resource.rb +6 -4
  223. data/lib/chef/resource/dsc_script.rb +3 -2
  224. data/lib/chef/resource/execute.rb +13 -12
  225. data/lib/chef/resource/file.rb +3 -1
  226. data/lib/chef/resource/freebsd_package.rb +2 -1
  227. data/lib/chef/resource/gem_package.rb +14 -6
  228. data/lib/chef/resource/group.rb +4 -1
  229. data/lib/chef/resource/helpers/cron_validations.rb +98 -0
  230. data/lib/chef/resource/homebrew_cask.rb +5 -4
  231. data/lib/chef/resource/homebrew_package.rb +4 -2
  232. data/lib/chef/resource/homebrew_tap.rb +2 -1
  233. data/lib/chef/resource/hostname.rb +41 -36
  234. data/lib/chef/resource/http_request.rb +0 -1
  235. data/lib/chef/resource/ifconfig.rb +1 -1
  236. data/lib/chef/resource/ips_package.rb +10 -2
  237. data/lib/chef/resource/kernel_module.rb +29 -29
  238. data/lib/chef/resource/ksh.rb +2 -0
  239. data/lib/chef/resource/launchd.rb +6 -6
  240. data/lib/chef/resource/link.rb +1 -23
  241. data/lib/chef/resource/locale.rb +58 -24
  242. data/lib/chef/resource/log.rb +12 -1
  243. data/lib/chef/resource/lwrp_base.rb +1 -8
  244. data/lib/chef/resource/macos_userdefaults.rb +9 -6
  245. data/lib/chef/resource/macosx_service.rb +2 -1
  246. data/lib/chef/resource/macports_package.rb +10 -2
  247. data/lib/chef/resource/mdadm.rb +62 -2
  248. data/lib/chef/resource/mount.rb +3 -0
  249. data/lib/chef/resource/msu_package.rb +13 -1
  250. data/lib/chef/resource/notify_group.rb +8 -3
  251. data/lib/chef/resource/ohai.rb +19 -3
  252. data/lib/chef/resource/ohai_hint.rb +3 -12
  253. data/lib/chef/resource/openbsd_package.rb +9 -1
  254. data/lib/chef/resource/openssl_dhparam.rb +10 -1
  255. data/lib/chef/resource/openssl_ec_private_key.rb +23 -1
  256. data/lib/chef/resource/openssl_ec_public_key.rb +21 -1
  257. data/lib/chef/resource/openssl_rsa_private_key.rb +20 -1
  258. data/lib/chef/resource/openssl_rsa_public_key.rb +22 -1
  259. data/lib/chef/resource/openssl_x509_certificate.rb +37 -1
  260. data/lib/chef/resource/openssl_x509_crl.rb +12 -1
  261. data/lib/chef/resource/openssl_x509_request.rb +37 -1
  262. data/lib/chef/resource/osx_profile.rb +3 -2
  263. data/lib/chef/resource/package.rb +2 -1
  264. data/lib/chef/resource/pacman_package.rb +2 -1
  265. data/lib/chef/resource/paludis_package.rb +12 -3
  266. data/lib/chef/resource/perl.rb +2 -0
  267. data/lib/chef/resource/plist.rb +207 -0
  268. data/lib/chef/resource/portage_package.rb +13 -3
  269. data/lib/chef/resource/powershell_package.rb +1 -3
  270. data/lib/chef/resource/powershell_package_source.rb +3 -1
  271. data/lib/chef/resource/powershell_script.rb +7 -17
  272. data/lib/chef/resource/python.rb +2 -0
  273. data/lib/chef/resource/reboot.rb +0 -1
  274. data/lib/chef/resource/registry_key.rb +1 -2
  275. data/lib/chef/resource/remote_directory.rb +2 -0
  276. data/lib/chef/resource/remote_file.rb +2 -0
  277. data/lib/chef/resource/rhsm_errata.rb +0 -1
  278. data/lib/chef/resource/rhsm_errata_level.rb +0 -1
  279. data/lib/chef/resource/rhsm_register.rb +2 -1
  280. data/lib/chef/resource/rhsm_repo.rb +3 -1
  281. data/lib/chef/resource/rhsm_subscription.rb +4 -1
  282. data/lib/chef/resource/route.rb +5 -1
  283. data/lib/chef/resource/rpm_package.rb +9 -2
  284. data/lib/chef/resource/ruby.rb +2 -0
  285. data/lib/chef/resource/ruby_block.rb +1 -1
  286. data/lib/chef/resource/scm/_scm.rb +48 -0
  287. data/lib/chef/resource/{scm.rb → scm/git.rb} +16 -30
  288. data/lib/chef/resource/{subversion.rb → scm/subversion.rb} +8 -5
  289. data/lib/chef/resource/script.rb +6 -3
  290. data/lib/chef/resource/service.rb +6 -7
  291. data/lib/chef/resource/smartos_package.rb +9 -1
  292. data/lib/chef/resource/snap_package.rb +3 -1
  293. data/lib/chef/resource/solaris_package.rb +9 -1
  294. data/lib/chef/resource/ssh_known_hosts_entry.rb +6 -3
  295. data/lib/chef/resource/sudo.rb +9 -9
  296. data/lib/chef/resource/support/cron.d.erb +1 -1
  297. data/lib/chef/resource/support/cron_access.erb +1 -1
  298. data/lib/chef/resource/support/sudoer.erb +1 -2
  299. data/lib/chef/resource/support/ulimit.erb +41 -0
  300. data/lib/chef/resource/swap_file.rb +5 -3
  301. data/lib/chef/resource/sysctl.rb +2 -2
  302. data/lib/chef/resource/systemd_unit.rb +4 -2
  303. data/lib/chef/resource/template.rb +0 -1
  304. data/lib/chef/resource/timezone.rb +7 -18
  305. data/lib/chef/resource/user.rb +1 -3
  306. data/lib/chef/resource/user/aix_user.rb +0 -2
  307. data/lib/chef/resource/user/dscl_user.rb +1 -1
  308. data/lib/chef/resource/user/linux_user.rb +0 -2
  309. data/lib/chef/resource/user/mac_user.rb +1 -1
  310. data/lib/chef/resource/user/pw_user.rb +0 -2
  311. data/lib/chef/resource/user/solaris_user.rb +0 -2
  312. data/lib/chef/resource/user/windows_user.rb +0 -2
  313. data/lib/chef/resource/user_ulimit.rb +114 -0
  314. data/lib/chef/resource/whyrun_safe_ruby_block.rb +1 -0
  315. data/lib/chef/resource/windows_ad_join.rb +19 -6
  316. data/lib/chef/resource/windows_auto_run.rb +0 -1
  317. data/lib/chef/resource/windows_certificate.rb +1 -1
  318. data/lib/chef/resource/windows_dfs_folder.rb +0 -1
  319. data/lib/chef/resource/windows_dfs_namespace.rb +0 -1
  320. data/lib/chef/resource/windows_dfs_server.rb +0 -1
  321. data/lib/chef/resource/windows_dns_record.rb +0 -1
  322. data/lib/chef/resource/windows_dns_zone.rb +0 -1
  323. data/lib/chef/resource/windows_env.rb +2 -3
  324. data/lib/chef/resource/windows_feature.rb +2 -2
  325. data/lib/chef/resource/windows_feature_dism.rb +9 -22
  326. data/lib/chef/resource/windows_feature_powershell.rb +17 -82
  327. data/lib/chef/resource/windows_firewall_rule.rb +119 -10
  328. data/lib/chef/resource/windows_font.rb +1 -3
  329. data/lib/chef/resource/windows_package.rb +13 -4
  330. data/lib/chef/resource/windows_pagefile.rb +0 -1
  331. data/lib/chef/resource/windows_path.rb +0 -1
  332. data/lib/chef/resource/windows_printer.rb +0 -1
  333. data/lib/chef/resource/windows_printer_port.rb +0 -1
  334. data/lib/chef/resource/windows_script.rb +3 -4
  335. data/lib/chef/resource/windows_security_policy.rb +90 -0
  336. data/lib/chef/resource/windows_service.rb +45 -31
  337. data/lib/chef/resource/windows_share.rb +3 -7
  338. data/lib/chef/resource/windows_shortcut.rb +0 -1
  339. data/lib/chef/resource/windows_task.rb +14 -15
  340. data/lib/chef/resource/windows_uac.rb +0 -1
  341. data/lib/chef/resource/windows_user_privilege.rb +157 -0
  342. data/lib/chef/resource/windows_workgroup.rb +0 -1
  343. data/lib/chef/resource/yum_package.rb +3 -1
  344. data/lib/chef/resource/yum_repository.rb +2 -1
  345. data/lib/chef/resource/zypper_package.rb +3 -2
  346. data/lib/chef/resource/zypper_repository.rb +2 -1
  347. data/lib/chef/resource_builder.rb +8 -0
  348. data/lib/chef/resource_inspector.rb +6 -6
  349. data/lib/chef/resource_resolver.rb +7 -14
  350. data/lib/chef/resources.rb +11 -3
  351. data/lib/chef/role.rb +2 -2
  352. data/lib/chef/run_context/cookbook_compiler.rb +29 -5
  353. data/lib/chef/shell.rb +23 -32
  354. data/lib/chef/shell/shell_session.rb +0 -2
  355. data/lib/chef/util/diff.rb +1 -1
  356. data/lib/chef/util/dsc/configuration_generator.rb +1 -1
  357. data/lib/chef/util/dsc/lcm_output_parser.rb +3 -3
  358. data/lib/chef/util/powershell/cmdlet.rb +1 -1
  359. data/lib/chef/version.rb +2 -2
  360. data/lib/chef/version_string.rb +1 -1
  361. data/lib/chef/win32/api/file.rb +18 -18
  362. data/lib/chef/win32/api/security.rb +6 -0
  363. data/lib/chef/win32/file.rb +3 -11
  364. data/lib/chef/win32/process.rb +2 -2
  365. data/lib/chef/win32/security.rb +40 -2
  366. data/spec/functional/assets/inittest +8 -7
  367. data/spec/functional/knife/ssh_spec.rb +27 -23
  368. data/spec/functional/resource/aix_service_spec.rb +1 -0
  369. data/spec/functional/resource/aixinit_service_spec.rb +8 -7
  370. data/spec/functional/resource/apt_package_spec.rb +1 -0
  371. data/spec/functional/resource/bff_spec.rb +2 -2
  372. data/spec/functional/resource/cookbook_file_spec.rb +1 -1
  373. data/spec/functional/resource/cron_spec.rb +11 -29
  374. data/spec/functional/resource/dnf_package_spec.rb +441 -156
  375. data/spec/functional/resource/dsc_resource_spec.rb +1 -1
  376. data/spec/functional/resource/git_spec.rb +184 -134
  377. data/spec/functional/resource/insserv_spec.rb +6 -5
  378. data/spec/functional/resource/link_spec.rb +17 -17
  379. data/spec/functional/resource/locale_spec.rb +13 -2
  380. data/spec/functional/resource/powershell_script_spec.rb +7 -68
  381. data/spec/functional/resource/rpm_spec.rb +2 -2
  382. data/spec/functional/resource/user/dscl_spec.rb +2 -2
  383. data/spec/functional/resource/user/mac_user_spec.rb +2 -2
  384. data/spec/functional/resource/windows_certificate_spec.rb +3 -3
  385. data/spec/functional/resource/windows_security_policy_spec.rb +90 -0
  386. data/spec/functional/resource/windows_task_spec.rb +8 -8
  387. data/spec/functional/resource/windows_user_privilege_spec.rb +193 -0
  388. data/spec/functional/run_lock_spec.rb +1 -2
  389. data/spec/functional/shell_spec.rb +6 -6
  390. data/spec/functional/util/powershell/cmdlet_spec.rb +1 -1
  391. data/spec/functional/version_spec.rb +1 -1
  392. data/spec/functional/win32/registry_spec.rb +0 -6
  393. data/spec/functional/win32/security_spec.rb +22 -0
  394. data/spec/functional/win32/service_manager_spec.rb +1 -1
  395. data/spec/integration/client/client_spec.rb +123 -2
  396. data/spec/integration/knife/cookbook_show_spec.rb +28 -26
  397. data/spec/integration/knife/data_bag_show_spec.rb +1 -1
  398. data/spec/integration/knife/raw_spec.rb +30 -2
  399. data/spec/integration/knife/show_spec.rb +32 -3
  400. data/spec/integration/recipes/accumulator_spec.rb +1 -1
  401. data/spec/integration/recipes/lwrp_inline_resources_spec.rb +5 -5
  402. data/spec/integration/recipes/lwrp_spec.rb +1 -1
  403. data/spec/integration/recipes/noop_resource_spec.rb +1 -1
  404. data/spec/integration/recipes/notifies_spec.rb +50 -21
  405. data/spec/integration/recipes/notifying_block_spec.rb +9 -6
  406. data/spec/integration/recipes/provider_choice.rb +2 -0
  407. data/spec/integration/recipes/recipe_dsl_spec.rb +46 -144
  408. data/spec/integration/recipes/resource_action_spec.rb +16 -11
  409. data/spec/integration/recipes/resource_converge_if_changed_spec.rb +1 -3
  410. data/spec/integration/recipes/resource_load_spec.rb +133 -13
  411. data/spec/integration/recipes/unified_mode_spec.rb +1 -1
  412. data/spec/integration/recipes/use_partial_spec.rb +112 -0
  413. data/spec/integration/solo/solo_spec.rb +3 -3
  414. data/spec/scripts/ssl-serve.rb +1 -1
  415. data/spec/spec_helper.rb +11 -14
  416. data/spec/support/chef_helpers.rb +2 -2
  417. data/spec/support/lib/chef/resource/zen_follower.rb +2 -0
  418. data/spec/support/platform_helpers.rb +44 -19
  419. data/spec/support/platforms/win32/spec_service.rb +1 -1
  420. data/spec/support/recipe_dsl_helper.rb +83 -0
  421. data/spec/support/shared/functional/directory_resource.rb +1 -1
  422. data/spec/support/shared/functional/execute_resource.rb +1 -1
  423. data/spec/support/shared/functional/file_resource.rb +3 -3
  424. data/spec/support/shared/functional/win32_service.rb +1 -1
  425. data/spec/support/shared/functional/windows_script.rb +5 -18
  426. data/spec/support/shared/integration/knife_support.rb +14 -8
  427. data/spec/unit/application/apply_spec.rb +3 -0
  428. data/spec/unit/application/client_spec.rb +5 -1
  429. data/spec/unit/application_spec.rb +1 -9
  430. data/spec/unit/chef_fs/file_system/operation_failed_error_spec.rb +4 -2
  431. data/spec/unit/client_spec.rb +7 -5
  432. data/spec/unit/cookbook/gem_installer_spec.rb +3 -4
  433. data/spec/unit/cookbook/metadata_spec.rb +38 -19
  434. data/spec/unit/data_bag_spec.rb +1 -1
  435. data/spec/unit/data_collector_spec.rb +38 -17
  436. data/spec/unit/dsl/platform_introspection_spec.rb +0 -1
  437. data/spec/unit/environment_spec.rb +7 -7
  438. data/spec/unit/event_dispatch/dispatcher_spec.rb +0 -3
  439. data/spec/unit/file_access_control_spec.rb +1 -1
  440. data/spec/unit/knife/bootstrap/chef_vault_handler_spec.rb +15 -15
  441. data/spec/unit/knife/bootstrap/client_builder_spec.rb +9 -9
  442. data/spec/unit/knife/bootstrap_spec.rb +36 -54
  443. data/spec/unit/knife/cookbook_download_spec.rb +4 -4
  444. data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +1 -1
  445. data/spec/unit/knife/cookbook_show_spec.rb +1 -0
  446. data/spec/unit/knife/cookbook_upload_spec.rb +6 -5
  447. data/spec/unit/knife/core/bootstrap_context_spec.rb +23 -43
  448. data/spec/unit/knife/core/hashed_command_loader_spec.rb +3 -3
  449. data/spec/unit/knife/core/ui_spec.rb +16 -0
  450. data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +8 -68
  451. data/spec/unit/knife/data_bag_secret_options_spec.rb +22 -14
  452. data/spec/unit/knife/role_env_run_list_add_spec.rb +6 -6
  453. data/spec/unit/knife/role_env_run_list_clear_spec.rb +4 -4
  454. data/spec/unit/knife/role_env_run_list_remove_spec.rb +4 -4
  455. data/spec/unit/knife/role_env_run_list_replace_spec.rb +4 -4
  456. data/spec/unit/knife/role_env_run_list_set_spec.rb +4 -4
  457. data/spec/unit/knife/role_run_list_add_spec.rb +6 -6
  458. data/spec/unit/knife/role_run_list_clear_spec.rb +4 -4
  459. data/spec/unit/knife/role_run_list_remove_spec.rb +4 -4
  460. data/spec/unit/knife/role_run_list_replace_spec.rb +4 -4
  461. data/spec/unit/knife/role_run_list_set_spec.rb +4 -4
  462. data/spec/unit/knife/ssh_spec.rb +10 -113
  463. data/spec/unit/knife/status_spec.rb +1 -1
  464. data/spec/unit/knife/supermarket_share_spec.rb +3 -5
  465. data/spec/unit/knife_spec.rb +18 -0
  466. data/spec/unit/lwrp_spec.rb +4 -4
  467. data/spec/unit/mixin/powershell_exec_spec.rb +10 -0
  468. data/spec/unit/mixin/securable_spec.rb +1 -0
  469. data/spec/unit/mixin/user_context_spec.rb +9 -1
  470. data/spec/unit/node/attribute_spec.rb +2 -2
  471. data/spec/unit/node_spec.rb +24 -0
  472. data/spec/unit/platform/query_helpers_spec.rb +0 -143
  473. data/spec/unit/property/state_spec.rb +12 -7
  474. data/spec/unit/property/validation_spec.rb +25 -1
  475. data/spec/unit/property_spec.rb +18 -15
  476. data/spec/unit/provider/apt_preference_spec.rb +14 -10
  477. data/spec/unit/provider/apt_repository_spec.rb +9 -11
  478. data/spec/unit/provider/apt_update_spec.rb +12 -11
  479. data/spec/unit/provider/cookbook_file_spec.rb +4 -4
  480. data/spec/unit/provider/cron_spec.rb +2 -2
  481. data/spec/unit/provider/directory_spec.rb +4 -15
  482. data/spec/unit/provider/file_spec.rb +4 -4
  483. data/spec/unit/provider/git_spec.rb +44 -4
  484. data/spec/unit/provider/link_spec.rb +0 -1
  485. data/spec/unit/provider/log_spec.rb +3 -3
  486. data/spec/unit/provider/mdadm_spec.rb +3 -3
  487. data/spec/unit/provider/osx_profile_spec.rb +2 -2
  488. data/spec/unit/provider/package/dnf/python_helper_spec.rb +2 -2
  489. data/spec/unit/provider/package/freebsd/pkgng_spec.rb +1 -1
  490. data/spec/unit/provider/package/homebrew_spec.rb +280 -174
  491. data/spec/unit/provider/package/msu_spec.rb +3 -3
  492. data/spec/unit/provider/package/pacman_spec.rb +65 -147
  493. data/spec/unit/provider/package/powershell_spec.rb +88 -96
  494. data/spec/unit/provider/package/rubygems_spec.rb +221 -31
  495. data/spec/unit/provider/package/snap_spec.rb +1 -1
  496. data/spec/unit/provider/package/windows/exe_spec.rb +1 -1
  497. data/spec/unit/provider/package/windows_spec.rb +53 -30
  498. data/spec/unit/provider/powershell_script_spec.rb +21 -61
  499. data/spec/unit/provider/remote_file_spec.rb +3 -4
  500. data/spec/unit/provider/service/arch_service_spec.rb +2 -3
  501. data/spec/unit/provider/service/debian_service_spec.rb +35 -14
  502. data/spec/unit/provider/service/gentoo_service_spec.rb +8 -8
  503. data/spec/unit/provider/service/macosx_spec.rb +210 -214
  504. data/spec/unit/provider/service/redhat_spec.rb +2 -2
  505. data/spec/unit/provider/service/systemd_service_spec.rb +23 -23
  506. data/spec/unit/provider/service/upstart_service_spec.rb +3 -3
  507. data/spec/unit/provider/service/windows_spec.rb +6 -2
  508. data/spec/unit/provider/subversion_spec.rb +4 -2
  509. data/spec/unit/provider/systemd_unit_spec.rb +24 -28
  510. data/spec/unit/provider/template_spec.rb +3 -4
  511. data/spec/unit/provider/zypper_repository_spec.rb +25 -75
  512. data/spec/unit/provider_resolver_spec.rb +11 -11
  513. data/spec/unit/provider_spec.rb +0 -1
  514. data/spec/unit/recipe_spec.rb +68 -0
  515. data/spec/unit/resource/alternatives_spec.rb +120 -0
  516. data/spec/unit/resource/apt_preference_spec.rb +0 -18
  517. data/spec/unit/resource/apt_repository_spec.rb +0 -18
  518. data/spec/unit/resource/apt_update_spec.rb +0 -18
  519. data/spec/unit/resource/archive_file_spec.rb +2 -11
  520. data/spec/unit/resource/chef_client_cron_spec.rb +119 -0
  521. data/spec/unit/resource/chef_client_scheduled_task_spec.rb +102 -0
  522. data/spec/unit/resource/chef_client_systemd_timer_spec.rb +70 -0
  523. data/spec/unit/resource/chef_vault_secret_spec.rb +40 -0
  524. data/spec/unit/resource/chocolatey_source_spec.rb +2 -1
  525. data/spec/unit/resource/cron_d_spec.rb +6 -48
  526. data/spec/unit/resource/cron_spec.rb +4 -10
  527. data/spec/unit/resource/gem_package_spec.rb +3 -3
  528. data/spec/unit/resource/helpers/cron_validations_spec.rb +77 -0
  529. data/spec/unit/resource/link_spec.rb +0 -4
  530. data/spec/unit/resource/locale_spec.rb +0 -34
  531. data/spec/unit/resource/ohai_spec.rb +56 -2
  532. data/spec/unit/resource/plist_spec.rb +130 -0
  533. data/spec/unit/resource/powershell_script_spec.rb +0 -5
  534. data/spec/unit/resource/{git_spec.rb → scm/git_spec.rb} +50 -2
  535. data/spec/unit/resource/{scm_spec.rb → scm/scm.rb} +1 -52
  536. data/spec/unit/resource/{subversion_spec.rb → scm/subversion_spec.rb} +2 -3
  537. data/spec/unit/resource/service_spec.rb +4 -0
  538. data/spec/unit/resource/user_spec.rb +2 -2
  539. data/spec/unit/resource/user_ulimit_spec.rb +53 -0
  540. data/spec/unit/resource/windows_dns_record_spec.rb +3 -3
  541. data/spec/unit/resource/windows_dns_zone_spec.rb +2 -2
  542. data/spec/unit/resource/windows_feature_dism_spec.rb +2 -17
  543. data/spec/unit/resource/windows_feature_powershell_spec.rb +6 -47
  544. data/spec/unit/resource/windows_firewall_rule_spec.rb +88 -41
  545. data/spec/unit/resource/windows_package_spec.rb +4 -1
  546. data/spec/unit/resource/windows_service_spec.rb +9 -0
  547. data/spec/unit/resource/windows_task_spec.rb +1 -1
  548. data/spec/unit/resource/windows_uac_spec.rb +2 -2
  549. data/spec/unit/resource/yum_repository_spec.rb +21 -21
  550. data/spec/unit/resource_reporter_spec.rb +1 -5
  551. data/spec/unit/resource_spec.rb +11 -4
  552. data/spec/unit/role_spec.rb +11 -11
  553. data/spec/unit/run_context/cookbook_compiler_spec.rb +1 -1
  554. data/spec/unit/run_context_spec.rb +1 -1
  555. data/spec/unit/search/query_spec.rb +1 -1
  556. data/spec/unit/util/threaded_job_queue_spec.rb +0 -9
  557. data/spec/unit/win32/security_spec.rb +3 -4
  558. data/tasks/rspec.rb +1 -1
  559. metadata +116 -87
  560. data/lib/chef/dsl/core.rb +0 -52
  561. data/lib/chef/knife/cookbook_site_share.rb +0 -41
  562. data/lib/chef/knife/cookbook_site_unshare.rb +0 -41
  563. data/lib/chef/provider/apt_preference.rb +0 -93
  564. data/lib/chef/provider/apt_repository.rb +0 -358
  565. data/lib/chef/provider/apt_update.rb +0 -79
  566. data/lib/chef/provider/log.rb +0 -43
  567. data/lib/chef/provider/mdadm.rb +0 -85
  568. data/lib/chef/provider/ohai.rb +0 -45
  569. data/lib/chef/resource/git.rb +0 -37
  570. data/spec/functional/resource/windows_font_spec.rb +0 -49
  571. data/spec/unit/provider/ohai_spec.rb +0 -84
@@ -42,9 +42,7 @@ class Chef
42
42
  end
43
43
 
44
44
  def current_installed_version
45
- # pkgng up to version 1.15.99.7 returns 70 for pkg not found,
46
- # later versions return 1
47
- pkg_info = shell_out!("pkg", "info", new_resource.package_name, env: nil, returns: [0, 1, 70])
45
+ pkg_info = shell_out!("pkg", "info", new_resource.package_name, env: nil, returns: [0, 70])
48
46
  pkg_info.stdout[/^Version +: (.+)$/, 1]
49
47
  end
50
48
 
@@ -24,6 +24,8 @@ class Chef
24
24
  class Provider
25
25
  class Package
26
26
  class Homebrew < Chef::Provider::Package
27
+ allow_nils
28
+ use_multipackage_api
27
29
 
28
30
  provides :package, os: "darwin", override: true
29
31
  provides :homebrew_package
@@ -31,49 +33,51 @@ class Chef
31
33
  include Chef::Mixin::HomebrewUser
32
34
 
33
35
  def load_current_resource
34
- self.current_resource = Chef::Resource::HomebrewPackage.new(new_resource.name)
36
+ @current_resource = Chef::Resource::HomebrewPackage.new(new_resource.name)
35
37
  current_resource.package_name(new_resource.package_name)
36
- current_resource.version(current_installed_version)
37
- logger.trace("#{new_resource} current version is #{current_resource.version}") if current_resource.version
38
-
39
- @candidate_version = candidate_version
40
-
41
- logger.trace("#{new_resource} candidate version is #{@candidate_version}") if @candidate_version
38
+ current_resource.version(get_current_versions)
39
+ logger.trace("#{new_resource} current package version(s): #{current_resource.version}") if current_resource.version
42
40
 
43
41
  current_resource
44
42
  end
45
43
 
46
- def install_package(name, version)
47
- unless current_resource.version == version
48
- brew("install", options, name)
44
+ def candidate_version
45
+ package_name_array.map do |package_name|
46
+ available_version(package_name)
49
47
  end
50
48
  end
51
49
 
52
- def upgrade_package(name, version)
53
- current_version = current_resource.version
54
-
55
- if current_version.nil? || current_version.empty?
56
- install_package(name, version)
57
- elsif current_version != version
58
- brew("upgrade", options, name)
50
+ def get_current_versions
51
+ package_name_array.map do |package_name|
52
+ installed_version(package_name)
59
53
  end
60
54
  end
61
55
 
62
- def remove_package(name, version)
63
- if current_resource.version
64
- brew("uninstall", options, name)
65
- end
56
+ def install_package(names, versions)
57
+ brew_cmd_output("install", options, names.compact)
66
58
  end
67
59
 
68
- # Homebrew doesn't really have a notion of purging, do a "force remove"
69
- def purge_package(name, version)
70
- if current_resource.version
71
- brew("uninstall", "--force", options, name)
72
- end
60
+ # upgrades are a bit harder in homebrew than other package formats. If you try to
61
+ # brew upgrade a package that isn't installed it will fail so if a user specifies
62
+ # the action of upgrade we need to figure out which packages need to be installed
63
+ # and which packages can be upgrades. We do this by checking if brew_info has an entry
64
+ # via the installed_version helper.
65
+ def upgrade_package(names, versions)
66
+ # @todo when we no longer support Ruby 2.6 this can be simplified to be a .filter_map
67
+ upgrade_pkgs = names.select { |x| x if installed_version(x) }.compact
68
+ install_pkgs = names.select { |x| x unless installed_version(x) }.compact
69
+
70
+ brew_cmd_output("upgrade", options, upgrade_pkgs) unless upgrade_pkgs.empty?
71
+ brew_cmd_output("install", options, install_pkgs) unless install_pkgs.empty?
73
72
  end
74
73
 
75
- def brew(*args)
76
- get_response_from_command("brew", *args)
74
+ def remove_package(names, versions)
75
+ brew_cmd_output("uninstall", options, names.compact)
76
+ end
77
+
78
+ # Homebrew doesn't really have a notion of purging, do a "force remove"
79
+ def purge_package(names, versions)
80
+ brew_cmd_output("uninstall", "--force", options, names.compact)
77
81
  end
78
82
 
79
83
  # We implement a querying method that returns the JSON-as-Hash
@@ -83,9 +87,50 @@ class Chef
83
87
  # information, but that is not any more robust than using the
84
88
  # command-line interface that returns the same thing.
85
89
  #
86
- # https://github.com/Homebrew/homebrew/wiki/Querying-Brew
90
+ # https://docs.brew.sh/Querying-Brew
91
+ #
92
+ # @returns [Hash] a hash of package information where the key is the package name
87
93
  def brew_info
88
- @brew_info ||= Chef::JSONCompat.from_json(brew("info", "--json=v1", new_resource.package_name)).first
94
+ @brew_info ||= begin
95
+ command_array = ["info", "--json=v1"].concat package_name_array
96
+ # convert the array of hashes into a hash where the key is the package name
97
+
98
+ cmd_output = brew_cmd_output(command_array, allow_failure: true)
99
+
100
+ if cmd_output.empty?
101
+ # we had some kind of failure so we need to iterate through each package to find them
102
+ package_name_array.each_with_object({}) do |package_name, hsh|
103
+ cmd_output = brew_cmd_output("info", "--json=v1", package_name, allow_failure: true)
104
+ if cmd_output.empty?
105
+ hsh[package_name] = {}
106
+ else
107
+ json = Chef::JSONCompat.from_json(cmd_output).first
108
+ hsh[json["name"]] = json
109
+ end
110
+ end
111
+ else
112
+ Hash[Chef::JSONCompat.from_json(cmd_output).collect { |pkg| [pkg["name"], pkg] }]
113
+ end
114
+ end
115
+ end
116
+
117
+ #
118
+ # Return the package information given a package name or package alias
119
+ #
120
+ # @param [String] name_or_alias The name of the package or its alias
121
+ #
122
+ # @return [Hash] Package information
123
+ #
124
+ def package_info(package_name)
125
+ # return the package hash if it's in the brew info hash
126
+ return brew_info[package_name] if brew_info[package_name]
127
+
128
+ # check each item in the hash to see if we were passed an alias
129
+ brew_info.each_value do |p|
130
+ return p if p["aliases"].include?(package_name)
131
+ end
132
+
133
+ {}
89
134
  end
90
135
 
91
136
  # Some packages (formula) are "keg only" and aren't linked,
@@ -94,15 +139,20 @@ class Chef
94
139
  # "current" (as in latest). Otherwise, we will use the version
95
140
  # that brew thinks is linked as the current version.
96
141
  #
97
- def current_installed_version
98
- if brew_info["keg_only"]
99
- if brew_info["installed"].empty?
142
+ # @param [String] package name
143
+ #
144
+ # @returns [String] package version
145
+ def installed_version(i)
146
+ p_data = package_info(i)
147
+
148
+ if p_data["keg_only"]
149
+ if p_data["installed"].empty?
100
150
  nil
101
151
  else
102
- brew_info["installed"].last["version"]
152
+ p_data["installed"].last["version"]
103
153
  end
104
154
  else
105
- brew_info["linked_keg"]
155
+ p_data["linked_keg"]
106
156
  end
107
157
  end
108
158
 
@@ -115,19 +165,33 @@ class Chef
115
165
  # forward project.
116
166
  #
117
167
  # https://github.com/Homebrew/homebrew/wiki/Acceptable-Formulae#stable-versions
118
- def candidate_version
119
- brew_info["versions"]["stable"]
120
- end
168
+ #
169
+ # @param [String] package name
170
+ #
171
+ # @returns [String] package version
172
+ def available_version(i)
173
+ p_data = package_info(i)
121
174
 
122
- private
175
+ # nothing is available
176
+ return nil if p_data.empty?
123
177
 
124
- def get_response_from_command(*command)
178
+ p_data["versions"]["stable"]
179
+ end
180
+
181
+ def brew_cmd_output(*command, **options)
125
182
  homebrew_uid = find_homebrew_uid(new_resource.respond_to?(:homebrew_user) && new_resource.homebrew_user)
126
183
  homebrew_user = Etc.getpwuid(homebrew_uid)
127
184
 
128
- logger.trace "Executing '#{command.join(" ")}' as user '#{homebrew_user.name}'"
185
+ logger.trace "Executing 'brew #{command.join(" ")}' as user '#{homebrew_user.name}'"
186
+
187
+ # allow the calling method to decide if the cmd should raise or not
188
+ # brew_info uses this when querying out available package info since a bad
189
+ # package name will raise and we want to surface a nil available package so that
190
+ # the package provider can magically handle that
191
+ shell_out_cmd = options[:allow_failure] ? :shell_out : :shell_out!
192
+
129
193
  # FIXME: this 1800 second default timeout should be deprecated
130
- output = shell_out!(*command, timeout: 1800, user: homebrew_uid, environment: { "HOME" => homebrew_user.dir, "RUBYOPT" => nil, "TMPDIR" => nil })
194
+ output = send(shell_out_cmd, "brew", *command, timeout: 1800, user: homebrew_uid, environment: { "HOME" => homebrew_user.dir, "RUBYOPT" => nil, "TMPDIR" => nil })
131
195
  output.stdout.chomp
132
196
  end
133
197
 
@@ -27,6 +27,7 @@ require_relative "cab"
27
27
  require_relative "../../util/path_helper"
28
28
  require_relative "../../mixin/uris"
29
29
  require_relative "../../mixin/checksum"
30
+ require "cgi" unless defined?(CGI)
30
31
 
31
32
  class Chef
32
33
  class Provider
@@ -99,7 +100,7 @@ class Chef
99
100
 
100
101
  def default_download_cache_path
101
102
  uri = ::URI.parse(new_resource.source)
102
- filename = ::File.basename(::URI.unescape(uri.path))
103
+ filename = ::File.basename(::CGI.unescape(uri.path))
103
104
  file_cache_dir = Chef::FileCache.create_cache_path("package/")
104
105
  Chef::Util::PathHelper.cleanpath("#{file_cache_dir}/#{filename}")
105
106
  end
@@ -120,6 +121,7 @@ class Chef
120
121
  @cab_files.each do |cab_file|
121
122
  declare_resource(:cab_package, new_resource.name) do
122
123
  source cab_file
124
+ timeout new_resource.timeout
123
125
  action :remove
124
126
  end
125
127
  end
@@ -27,29 +27,13 @@ class Chef
27
27
  provides :package, platform: "arch"
28
28
  provides :pacman_package
29
29
 
30
+ use_multipackage_api
31
+ allow_nils
32
+
30
33
  def load_current_resource
31
34
  @current_resource = Chef::Resource::Package.new(new_resource.name)
32
35
  current_resource.package_name(new_resource.package_name)
33
-
34
- logger.trace("#{new_resource} checking pacman for #{new_resource.package_name}")
35
- status = shell_out("pacman", "-Qi", new_resource.package_name)
36
- status.stdout.each_line do |line|
37
- case line
38
- when /^Version(\s?)*: (.+)$/
39
- logger.trace("#{new_resource} current version is #{$2}")
40
- current_resource.version($2)
41
- end
42
- end
43
-
44
- unless status.exitstatus == 0 || status.exitstatus == 1
45
- raise Chef::Exceptions::Package, "pacman failed - #{status.inspect}!"
46
- end
47
-
48
- current_resource
49
- end
50
-
51
- def candidate_version
52
- return @candidate_version if @candidate_version
36
+ current_resource.version = []
53
37
 
54
38
  repos = %w{extra core community}
55
39
 
@@ -58,31 +42,38 @@ class Chef
58
42
  repos = pacman.scan(/\[(.+)\]/).flatten
59
43
  end
60
44
 
61
- package_repos = repos.map { |r| Regexp.escape(r) }.join("|")
62
-
45
+ repos = Regexp.union(repos)
63
46
  status = shell_out("pacman", "-Sl")
64
- status.stdout.each_line do |line|
65
- case line
66
- when /^(#{package_repos}) #{Regexp.escape(new_resource.package_name)} (.+)$/
67
- # $2 contains a string like "4.4.0-1" or "3.10-4 [installed]"
68
- # simply split by space and use first token
69
- @candidate_version = $2.split(" ").first
70
- end
71
- end
72
47
 
73
48
  unless status.exitstatus == 0 || status.exitstatus == 1
74
49
  raise Chef::Exceptions::Package, "pacman failed - #{status.inspect}!"
75
50
  end
76
51
 
77
- unless @candidate_version
78
- raise Chef::Exceptions::Package, "pacman does not have a version of package #{new_resource.package_name}"
52
+ pkg_db_data = status.stdout
53
+ @candidate_version = []
54
+ package_name_array.each do |pkg|
55
+ pkg_data = pkg_db_data.match(/(#{repos}) #{pkg} (?<candidate>.*?-[0-9]+)(?<installed> \[.*?( (?<current>.*?-[0-9]+))?\])?\n/m)
56
+ unless pkg_data
57
+ raise Chef::Exceptions::Package, "pacman does not have a version of package #{pkg}"
58
+ end
59
+
60
+ @candidate_version << pkg_data[:candidate]
61
+ if pkg_data[:installed]
62
+ current_resource.version << (pkg_data[:current] || pkg_data[:candidate])
63
+ else
64
+ current_resource.version << nil
65
+ end
79
66
  end
80
67
 
68
+ current_resource
69
+ end
70
+
71
+ def candidate_version
81
72
  @candidate_version
82
73
  end
83
74
 
84
75
  def install_package(name, version)
85
- shell_out!( "pacman", "--sync", "--noconfirm", "--noprogressbar", options, name)
76
+ shell_out!("pacman", "--sync", "--noconfirm", "--noprogressbar", options, *name)
86
77
  end
87
78
 
88
79
  def upgrade_package(name, version)
@@ -90,7 +81,7 @@ class Chef
90
81
  end
91
82
 
92
83
  def remove_package(name, version)
93
- shell_out!( "pacman", "--remove", "--noconfirm", "--noprogressbar", options, name )
84
+ shell_out!("pacman", "--remove", "--noconfirm", "--noprogressbar", options, *name)
94
85
  end
95
86
 
96
87
  def purge_package(name, version)
@@ -36,7 +36,7 @@ class Chef
36
36
 
37
37
  def define_resource_requirements
38
38
  super
39
- if powershell_out("$PSVersionTable.PSVersion.Major").stdout.strip.to_i < 5
39
+ if powershell_version < 5
40
40
  raise "Minimum installed PowerShell Version required is 5"
41
41
  end
42
42
 
@@ -53,9 +53,6 @@ class Chef
53
53
 
54
54
  # Installs the package specified with the version passed else latest version will be installed
55
55
  def install_package(names, versions)
56
- # To enable tls 1.2, which is disabled by default in some OS
57
- powershell_out("[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12")
58
-
59
56
  names.each_with_index do |name, index|
60
57
  cmd = powershell_out(build_powershell_package_command("Install-Package '#{name}'", versions[index]), timeout: new_resource.timeout)
61
58
  next if cmd.nil?
@@ -118,8 +115,7 @@ class Chef
118
115
  command = [command] unless command.is_a?(Array)
119
116
  cmdlet_name = command.first
120
117
  command.unshift("(")
121
- # -WarningAction SilentlyContinue is used to suppress the warnings from stdout
122
- %w{-Force -ForceBootstrap -WarningAction SilentlyContinue}.each do |arg|
118
+ %w{-Force -ForceBootstrap}.each do |arg|
123
119
  command.push(arg)
124
120
  end
125
121
  command.push("-RequiredVersion #{version}") if version
@@ -483,9 +483,23 @@ class Chef
483
483
  end
484
484
  end
485
485
 
486
+ ##
487
+ # If `include_default_source` is nil, return true if the global
488
+ # `rubygems_url` was set or if `clear_sources` and `source` on the
489
+ # resource are not set.
490
+ # If `include_default_source` is not nil, it has been set explicitly on
491
+ # the resource and that value should be used.
492
+ def include_default_source?
493
+ if new_resource.include_default_source.nil?
494
+ !!Chef::Config[:rubygems_url] || !(new_resource.source || new_resource.clear_sources)
495
+ else
496
+ new_resource.include_default_source
497
+ end
498
+ end
499
+
486
500
  def gem_sources
487
501
  srcs = [ new_resource.source ]
488
- srcs << Chef::Config[:rubygems_url] if new_resource.include_default_source
502
+ srcs << (Chef::Config[:rubygems_url] || "https://rubygems.org") if include_default_source?
489
503
  srcs.flatten.compact
490
504
  end
491
505
 
@@ -550,12 +564,25 @@ class Chef
550
564
  new_resource.gem_binary || "gem"
551
565
  end
552
566
 
567
+ ##
568
+ # If `clear_sources` is nil, clearing sources is implied if a `source`
569
+ # was added or if the global rubygems URL is set. If `clear_sources`
570
+ # is not nil, it has been set explicitly on the resource and its value
571
+ # should be used.
572
+ def clear_sources?
573
+ if new_resource.clear_sources.nil?
574
+ !!(new_resource.source || Chef::Config[:rubygems_url])
575
+ else
576
+ new_resource.clear_sources
577
+ end
578
+ end
579
+
553
580
  def install_via_gem_command(name, version)
554
581
  src = []
555
582
  if new_resource.source.is_a?(String) && new_resource.source =~ /\.gem$/i
556
583
  name = new_resource.source
557
584
  else
558
- src << "--clear-sources" if new_resource.clear_sources
585
+ src << "--clear-sources" if clear_sources?
559
586
  src += gem_sources.map { |s| "--source=#{s}" }
560
587
  end
561
588
  src_str = src.empty? ? "" : " #{src.join(" ")}"
@@ -59,14 +59,15 @@ class Chef
59
59
  def get_current_versions
60
60
  package_name_array.each_with_index.map do |pkg, i|
61
61
  installed_version(i)
62
- end.compact
62
+ end
63
63
  end
64
64
 
65
65
  def install_package(names, versions)
66
66
  if new_resource.source
67
67
  install_snap_from_source(names, new_resource.source)
68
68
  else
69
- install_snaps(names)
69
+ resolved_names = names.each_with_index.map { |name, i| available_version(i).to_s unless name.nil? }
70
+ install_snaps(resolved_names)
70
71
  end
71
72
  end
72
73
 
@@ -74,16 +75,14 @@ class Chef
74
75
  if new_resource.source
75
76
  install_snap_from_source(names, new_resource.source)
76
77
  else
77
- if get_current_versions.empty?
78
- install_snaps(names, versions)
79
- else
80
- update_snaps(names)
81
- end
78
+ resolved_names = names.each_with_index.map { |name, i| available_version(i).to_s unless name.nil? }
79
+ update_snaps(resolved_names)
82
80
  end
83
81
  end
84
82
 
85
83
  def remove_package(names, versions)
86
- uninstall_snaps(names)
84
+ resolved_names = names.each_with_index.map { |name, i| installed_version(i).to_s unless name.nil? }
85
+ uninstall_snaps(resolved_names)
87
86
  end
88
87
 
89
88
  alias purge_package remove_package
@@ -130,73 +129,19 @@ class Chef
130
129
  "Accept: application/json\r\n" +
131
130
  "Content-Type: application/json\r\n"
132
131
  if method == "POST"
133
- pdata = post_data.to_json.to_s
134
- request.concat("Content-Length: #{pdata.bytesize}\r\n\r\n#{pdata}")
132
+ request.concat("Content-Length: #{post_data.bytesize}\r\n\r\n#{post_data}")
135
133
  end
136
134
  request.concat("\r\n")
137
-
138
- # while it is expected to allow clients to connect using https over
139
- # a tcp socket, at this point only a unix socket is supported. the
140
- # socket is /run/snapd.socket note - unixsocket is not defined on
141
- # windows systems
135
+ # While it is expected to allow clients to connect using HTTPS over a TCP socket,
136
+ # at this point only a UNIX socket is supported. The socket is /run/snapd.socket
137
+ # Note - UNIXSocket is not defined on windows systems
142
138
  if defined?(::UNIXSocket)
143
139
  UNIXSocket.open("/run/snapd.socket") do |socket|
144
- # send request, read the response, split the response and parse
145
- # the body
146
- socket.write(request)
147
-
148
- # WARNING!!! HERE BE DRAGONs
149
- #
150
- # So snapd doesn't return an EOF at the end of its body, so
151
- # doing a normal read will just hang forever.
152
- #
153
- # Well, sort of. if, after it writes everything, you then send
154
- # yet-another newline, it'll then send its EOF and promptly
155
- # disconnect closing the pipe and preventing reading. so, you
156
- # have to read first, and therein lies the EOF problem.
157
- #
158
- # So you can do non-blocking reads with selects, but it
159
- # makes every read take about 5 seconds. If, instead, we
160
- # read the last line char-by-char, it's about half a second.
161
- #
162
- # Reading a character at a time isn't efficient, and since we
163
- # know that http headers always have a blank line after them,
164
- # we can read lines until we find a blank line and *then* read
165
- # a character at a time. snap returns all the json on a single
166
- # line, so once you pass headers you must read a character a
167
- # time.
168
- #
169
- # - jaymzh
170
-
171
- Chef::Log.trace(
172
- "snap_package[#{new_resource.package_name}]: reading headers"
173
- )
174
- loop do
175
- response = socket.readline
176
- break if response.strip.empty? # finished headers
177
- end
178
- Chef::Log.trace(
179
- "snap_package[#{new_resource.package_name}]: past headers, " +
180
- "onto the body..."
181
- )
182
- result = nil
183
- body = ""
184
- socket.each_char do |c|
185
- body << c
186
- # we know we're not done if we don't have a char that
187
- # can end JSON
188
- next unless ["}", "]"].include?(c)
189
-
190
- begin
191
- result = JSON.parse(body)
192
- # if we get here, we were able to parse the json so we
193
- # are done reading
194
- break
195
- rescue JSON::ParserError
196
- next
197
- end
198
- end
199
- result
140
+ # Send request, read the response, split the response and parse the body
141
+ socket.print(request)
142
+ response = socket.read
143
+ headers, body = response.split("\r\n\r\n", 2)
144
+ JSON.parse(body)
200
145
  end
201
146
  end
202
147
  end
@@ -266,22 +211,20 @@ class Chef
266
211
  response.error!
267
212
  end
268
213
 
269
- def install_snaps(snap_names, versions)
270
- snap_names.each do |snap|
271
- response = post_snap(snap, "install", new_resource.channel, new_resource.options)
272
- id = get_id_from_async_response(response)
273
- wait_for_completion(id)
274
- end
214
+ def install_snaps(snap_names)
215
+ response = post_snaps(snap_names, "install", new_resource.channel, new_resource.options)
216
+ id = get_id_from_async_response(response)
217
+ wait_for_completion(id)
275
218
  end
276
219
 
277
220
  def update_snaps(snap_names)
278
- response = post_snaps(snap_names, "refresh", nil, new_resource.options)
221
+ response = post_snaps(snap_names, "refresh", new_resource.channel, new_resource.options)
279
222
  id = get_id_from_async_response(response)
280
223
  wait_for_completion(id)
281
224
  end
282
225
 
283
226
  def uninstall_snaps(snap_names)
284
- response = post_snaps(snap_names, "remove", nil, new_resource.options)
227
+ response = post_snaps(snap_names, "remove", new_resource.channel, new_resource.options)
285
228
  id = get_id_from_async_response(response)
286
229
  wait_for_completion(id)
287
230
  end
@@ -335,20 +278,18 @@ class Chef
335
278
  "action" => action,
336
279
  "snaps" => snap_names,
337
280
  }
338
- if %w{install refresh switch}.include?(action) && channel
281
+ if %w{install refresh switch}.include?(action)
339
282
  request["channel"] = channel
340
283
  end
341
284
 
342
285
  # No defensive handling of params
343
286
  # Snap will throw the proper exception if called improperly
344
287
  # And we can provide that exception to the end user
345
- if options
346
- request["classic"] = true if options.include?("classic")
347
- request["devmode"] = true if options.include?("devmode")
348
- request["jailmode"] = true if options.include?("jailmode")
349
- request["ignore_validation"] = true if options.include?("ignore-validation")
350
- end
288
+ request["classic"] = true if options["classic"]
289
+ request["devmode"] = true if options["devmode"]
290
+ request["jailmode"] = true if options["jailmode"]
351
291
  request["revision"] = revision unless revision.nil?
292
+ request["ignore_validation"] = true if options["ignore-validation"]
352
293
  request
353
294
  end
354
295
 
@@ -364,22 +305,12 @@ class Chef
364
305
  call_snap_api("POST", "/v2/snaps", json)
365
306
  end
366
307
 
367
- def post_snap(snap_name, action, channel, options, revision = nil)
368
- json = generate_snap_json(snap_name, action, channel, options, revision = nil)
369
- json.delete("snaps")
370
- call_snap_api("POST", "/v2/snaps/#{snap_name}", json)
371
- end
372
-
373
308
  def get_latest_package_version(name, channel)
374
309
  json = call_snap_api("GET", "/v2/find?name=#{name}")
375
310
  if json["status-code"] != 200
376
311
  raise Chef::Exceptions::Package, json["result"], caller
377
312
  end
378
313
 
379
- unless json["result"][0]["channels"]["latest/#{channel}"]
380
- raise Chef::Exceptions::Package, "No version of #{name} in channel #{channel}", caller
381
- end
382
-
383
314
  # Return the version matching the channel
384
315
  json["result"][0]["channels"]["latest/#{channel}"]["version"]
385
316
  end