chef 12.18.31-universal-mingw32 → 12.19.33-universal-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (305) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +5 -4
  3. data/README.md +12 -13
  4. data/VERSION +1 -1
  5. data/acceptance/Gemfile +4 -4
  6. data/acceptance/Gemfile.lock +70 -69
  7. data/chef-universal-mingw32.gemspec +2 -3
  8. data/chef.gemspec +6 -6
  9. data/lib/chef/api_client.rb +8 -10
  10. data/lib/chef/api_client_v1.rb +9 -11
  11. data/lib/chef/application/apply.rb +8 -10
  12. data/lib/chef/application/client.rb +1 -1
  13. data/lib/chef/application/exit_code.rb +3 -5
  14. data/lib/chef/application/knife.rb +2 -2
  15. data/lib/chef/application/windows_service.rb +29 -30
  16. data/lib/chef/application/windows_service_manager.rb +1 -1
  17. data/lib/chef/audit/audit_event_proxy.rb +2 -2
  18. data/lib/chef/audit/control_group_data.rb +1 -1
  19. data/lib/chef/chef_class.rb +1 -0
  20. data/lib/chef/chef_fs/chef_fs_data_store.rb +5 -7
  21. data/lib/chef/chef_fs/command_line.rb +15 -16
  22. data/lib/chef/chef_fs/data_handler/client_data_handler.rb +1 -1
  23. data/lib/chef/chef_fs/data_handler/container_data_handler.rb +1 -1
  24. data/lib/chef/chef_fs/data_handler/cookbook_data_handler.rb +1 -1
  25. data/lib/chef/chef_fs/data_handler/data_bag_item_data_handler.rb +1 -1
  26. data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +1 -1
  27. data/lib/chef/chef_fs/data_handler/group_data_handler.rb +1 -1
  28. data/lib/chef/chef_fs/data_handler/node_data_handler.rb +1 -1
  29. data/lib/chef/chef_fs/data_handler/organization_data_handler.rb +1 -1
  30. data/lib/chef/chef_fs/data_handler/role_data_handler.rb +1 -1
  31. data/lib/chef/chef_fs/data_handler/user_data_handler.rb +1 -1
  32. data/lib/chef/chef_fs/file_pattern.rb +2 -2
  33. data/lib/chef/chef_fs/file_system.rb +1 -1
  34. data/lib/chef/chef_fs/file_system/chef_server/cookbook_dir.rb +5 -6
  35. data/lib/chef/chef_fs/file_system/chef_server/cookbook_file.rb +8 -10
  36. data/lib/chef/chef_fs/file_system/chef_server/data_bags_dir.rb +8 -10
  37. data/lib/chef/chef_fs/file_system/chef_server/nodes_dir.rb +10 -12
  38. data/lib/chef/chef_fs/file_system/chef_server/policies_dir.rb +28 -30
  39. data/lib/chef/chef_fs/file_system/chef_server/policy_group_entry.rb +1 -1
  40. data/lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb +27 -29
  41. data/lib/chef/chef_fs/file_system/chef_server/rest_list_entry.rb +18 -24
  42. data/lib/chef/chef_fs/file_system/memory/memory_file.rb +1 -1
  43. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +10 -12
  44. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir.rb +10 -12
  45. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_entry.rb +9 -13
  46. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_root_dir.rb +2 -0
  47. data/lib/chef/chef_fs/file_system/repository/cookbooks_dir.rb +1 -1
  48. data/lib/chef/chef_fs/file_system/repository/nodes_dir.rb +3 -0
  49. data/lib/chef/chef_fs/parallelizer.rb +9 -11
  50. data/lib/chef/cookbook/cookbook_version_loader.rb +25 -31
  51. data/lib/chef/cookbook/metadata.rb +26 -26
  52. data/lib/chef/cookbook/syntax_check.rb +1 -1
  53. data/lib/chef/cookbook_version.rb +3 -3
  54. data/lib/chef/data_bag.rb +1 -1
  55. data/lib/chef/data_bag_item.rb +3 -3
  56. data/lib/chef/data_collector.rb +3 -4
  57. data/lib/chef/decorator.rb +1 -1
  58. data/lib/chef/deprecated.rb +30 -0
  59. data/lib/chef/dsl/audit.rb +2 -2
  60. data/lib/chef/dsl/declare_resource.rb +1 -1
  61. data/lib/chef/dsl/platform_introspection.rb +29 -31
  62. data/lib/chef/dsl/reboot_pending.rb +1 -1
  63. data/lib/chef/dsl/resources.rb +6 -8
  64. data/lib/chef/encrypted_data_bag_item.rb +2 -2
  65. data/lib/chef/environment.rb +9 -11
  66. data/lib/chef/event_loggers/windows_eventlog.rb +1 -1
  67. data/lib/chef/exceptions.rb +4 -1
  68. data/lib/chef/file_access_control/unix.rb +14 -14
  69. data/lib/chef/file_access_control/windows.rb +1 -1
  70. data/lib/chef/formatters/error_inspectors/api_error_formatting.rb +4 -5
  71. data/lib/chef/formatters/error_mapper.rb +6 -6
  72. data/lib/chef/http/api_versions.rb +50 -0
  73. data/lib/chef/http/validate_content_length.rb +2 -2
  74. data/lib/chef/json_compat.rb +6 -10
  75. data/lib/chef/key.rb +5 -5
  76. data/lib/chef/knife.rb +4 -4
  77. data/lib/chef/knife/cookbook_site_install.rb +2 -2
  78. data/lib/chef/knife/core/cookbook_scm_repo.rb +2 -2
  79. data/lib/chef/knife/core/gem_glob_loader.rb +1 -1
  80. data/lib/chef/knife/core/status_presenter.rb +1 -1
  81. data/lib/chef/knife/core/ui.rb +19 -25
  82. data/lib/chef/knife/data_bag_secret_options.rb +1 -1
  83. data/lib/chef/knife/deps.rb +32 -34
  84. data/lib/chef/knife/help.rb +1 -1
  85. data/lib/chef/knife/list.rb +1 -1
  86. data/lib/chef/knife/search.rb +2 -2
  87. data/lib/chef/knife/ssh.rb +37 -27
  88. data/lib/chef/knife/ssl_check.rb +1 -1
  89. data/lib/chef/knife/user_delete.rb +1 -1
  90. data/lib/chef/mash.rb +1 -1
  91. data/lib/chef/mixin/command.rb +2 -2
  92. data/lib/chef/mixin/create_path.rb +3 -5
  93. data/lib/chef/mixin/from_file.rb +2 -2
  94. data/lib/chef/mixin/get_source_from_package.rb +2 -2
  95. data/lib/chef/mixin/notifying_block.rb +7 -9
  96. data/lib/chef/mixin/params_validate.rb +3 -3
  97. data/lib/chef/mixin/securable.rb +1 -1
  98. data/lib/chef/mixin/shell_out.rb +23 -3
  99. data/lib/chef/mixin/unformatter.rb +2 -2
  100. data/lib/chef/mixin/uris.rb +4 -6
  101. data/lib/chef/mixin/versioned_api.rb +69 -0
  102. data/lib/chef/mixin/which.rb +25 -8
  103. data/lib/chef/mixin/windows_architecture_helper.rb +2 -2
  104. data/lib/chef/mixin/xml_escape.rb +3 -5
  105. data/lib/chef/monkey_patches/webrick-utils.rb +1 -1
  106. data/lib/chef/node.rb +8 -8
  107. data/lib/chef/node/attribute.rb +4 -4
  108. data/lib/chef/node/common_api.rb +5 -7
  109. data/lib/chef/org.rb +10 -12
  110. data/lib/chef/platform/provider_mapping.rb +7 -7
  111. data/lib/chef/platform/query_helpers.rb +1 -1
  112. data/lib/chef/policy_builder/policyfile.rb +1 -0
  113. data/lib/chef/property.rb +31 -0
  114. data/lib/chef/provider/batch.rb +1 -1
  115. data/lib/chef/provider/breakpoint.rb +1 -1
  116. data/lib/chef/provider/cookbook_file.rb +3 -3
  117. data/lib/chef/provider/cron.rb +38 -38
  118. data/lib/chef/provider/deploy.rb +81 -81
  119. data/lib/chef/provider/deploy/revision.rb +3 -5
  120. data/lib/chef/provider/directory.rb +32 -32
  121. data/lib/chef/provider/dsc_resource.rb +22 -6
  122. data/lib/chef/provider/env.rb +28 -28
  123. data/lib/chef/provider/env/windows.rb +1 -1
  124. data/lib/chef/provider/erl_call.rb +13 -13
  125. data/lib/chef/provider/execute.rb +5 -2
  126. data/lib/chef/provider/file.rb +49 -51
  127. data/lib/chef/provider/git.rb +55 -55
  128. data/lib/chef/provider/http_request.rb +36 -36
  129. data/lib/chef/provider/launchd.rb +2 -2
  130. data/lib/chef/provider/link.rb +50 -50
  131. data/lib/chef/provider/log.rb +2 -2
  132. data/lib/chef/provider/mdadm.rb +25 -25
  133. data/lib/chef/provider/mount/aix.rb +2 -2
  134. data/lib/chef/provider/mount/mount.rb +2 -2
  135. data/lib/chef/provider/ohai.rb +1 -1
  136. data/lib/chef/provider/osx_profile.rb +23 -23
  137. data/lib/chef/provider/package.rb +74 -56
  138. data/lib/chef/provider/package/aix.rb +55 -52
  139. data/lib/chef/provider/package/apt.rb +15 -13
  140. data/lib/chef/provider/package/cab.rb +49 -20
  141. data/lib/chef/provider/package/chocolatey.rb +9 -10
  142. data/lib/chef/provider/package/dnf.rb +20 -18
  143. data/lib/chef/provider/package/dnf/dnf_helper.py +1 -1
  144. data/lib/chef/provider/package/dnf/python_helper.rb +63 -26
  145. data/lib/chef/provider/package/dnf/version.rb +1 -1
  146. data/lib/chef/provider/package/dpkg.rb +8 -9
  147. data/lib/chef/provider/package/easy_install.rb +22 -22
  148. data/lib/chef/provider/package/freebsd/base.rb +10 -10
  149. data/lib/chef/provider/package/freebsd/pkg.rb +15 -15
  150. data/lib/chef/provider/package/freebsd/pkgng.rb +13 -15
  151. data/lib/chef/provider/package/freebsd/port.rb +7 -7
  152. data/lib/chef/provider/package/homebrew.rb +11 -10
  153. data/lib/chef/provider/package/ips.rb +18 -23
  154. data/lib/chef/provider/package/macports.rb +23 -23
  155. data/lib/chef/provider/package/msu.rb +11 -11
  156. data/lib/chef/provider/package/openbsd.rb +25 -22
  157. data/lib/chef/provider/package/pacman.rb +16 -16
  158. data/lib/chef/provider/package/paludis.rb +26 -27
  159. data/lib/chef/provider/package/portage.rb +22 -22
  160. data/lib/chef/provider/package/powershell.rb +17 -17
  161. data/lib/chef/provider/package/rpm.rb +25 -25
  162. data/lib/chef/provider/package/rubygems.rb +60 -60
  163. data/lib/chef/provider/package/smartos.rb +16 -16
  164. data/lib/chef/provider/package/solaris.rb +44 -44
  165. data/lib/chef/provider/package/windows.rb +3 -3
  166. data/lib/chef/provider/package/windows/exe.rb +6 -6
  167. data/lib/chef/provider/package/windows/msi.rb +6 -6
  168. data/lib/chef/provider/package/yum.rb +318 -268
  169. data/lib/chef/provider/package/yum/rpm_utils.rb +34 -34
  170. data/lib/chef/provider/package/yum/yum_cache.rb +12 -12
  171. data/lib/chef/provider/package/zypper.rb +11 -11
  172. data/lib/chef/provider/powershell_script.rb +15 -7
  173. data/lib/chef/provider/reboot.rb +10 -10
  174. data/lib/chef/provider/registry_key.rb +39 -39
  175. data/lib/chef/provider/remote_directory.rb +3 -3
  176. data/lib/chef/provider/remote_file.rb +3 -3
  177. data/lib/chef/provider/route.rb +1 -1
  178. data/lib/chef/provider/ruby_block.rb +3 -3
  179. data/lib/chef/provider/script.rb +42 -6
  180. data/lib/chef/provider/service.rb +49 -49
  181. data/lib/chef/provider/service/solaris.rb +1 -1
  182. data/lib/chef/provider/service/systemd.rb +1 -1
  183. data/lib/chef/provider/subversion.rb +39 -39
  184. data/lib/chef/provider/systemd_unit.rb +2 -0
  185. data/lib/chef/provider/template.rb +3 -3
  186. data/lib/chef/provider/user.rb +42 -42
  187. data/lib/chef/provider/whyrun_safe_ruby_block.rb +4 -4
  188. data/lib/chef/resource.rb +27 -16
  189. data/lib/chef/resource/apt_repository.rb +0 -1
  190. data/lib/chef/resource/chef_gem.rb +1 -1
  191. data/lib/chef/resource/dnf_package.rb +6 -3
  192. data/lib/chef/resource/dsc_resource.rb +9 -1
  193. data/lib/chef/resource/execute.rb +70 -6
  194. data/lib/chef/resource/file/verification/systemd_unit.rb +67 -0
  195. data/lib/chef/resource/freebsd_package.rb +1 -1
  196. data/lib/chef/resource/gem_package.rb +1 -1
  197. data/lib/chef/resource/launchd.rb +13 -1
  198. data/lib/chef/resource/package.rb +2 -2
  199. data/lib/chef/resource/registry_key.rb +1 -1
  200. data/lib/chef/resource/yum_package.rb +12 -3
  201. data/lib/chef/resource/yum_repository.rb +0 -1
  202. data/lib/chef/resource_collection/resource_collection_serialization.rb +3 -3
  203. data/lib/chef/resource_collection/resource_set.rb +2 -2
  204. data/lib/chef/resource_reporter.rb +1 -1
  205. data/lib/chef/run_context.rb +3 -3
  206. data/lib/chef/run_list/run_list_item.rb +1 -1
  207. data/lib/chef/run_list/versioned_recipe_list.rb +6 -6
  208. data/lib/chef/server_api.rb +2 -0
  209. data/lib/chef/server_api_versions.rb +40 -0
  210. data/lib/chef/shell.rb +1 -1
  211. data/lib/chef/shell/ext.rb +3 -3
  212. data/lib/chef/shell/shell_session.rb +1 -1
  213. data/lib/chef/user.rb +9 -11
  214. data/lib/chef/user_v1.rb +9 -11
  215. data/lib/chef/util/diff.rb +1 -1
  216. data/lib/chef/util/dsc/lcm_output_parser.rb +1 -1
  217. data/lib/chef/util/selinux.rb +1 -1
  218. data/lib/chef/util/windows/net_group.rb +18 -30
  219. data/lib/chef/util/windows/net_use.rb +7 -11
  220. data/lib/chef/util/windows/net_user.rb +11 -17
  221. data/lib/chef/util/windows/volume.rb +9 -15
  222. data/lib/chef/version.rb +1 -1
  223. data/lib/chef/version_class.rb +1 -1
  224. data/lib/chef/win32/api.rb +4 -6
  225. data/lib/chef/win32/api/file.rb +25 -31
  226. data/lib/chef/win32/api/installer.rb +2 -2
  227. data/lib/chef/win32/file.rb +4 -6
  228. data/lib/chef/win32/registry.rb +9 -9
  229. data/lib/chef/win32/security.rb +2 -2
  230. data/lib/chef/win32/security/acl.rb +2 -2
  231. data/lib/chef/win32/unicode.rb +2 -2
  232. data/lib/chef/win32/version.rb +1 -1
  233. data/spec/data/prefer_metadata_json/metadata.json +51 -0
  234. data/spec/data/prefer_metadata_json/metadata.rb +6 -0
  235. data/spec/data/prefer_metadata_json/recipes/default.rb +0 -0
  236. data/spec/functional/knife/ssh_spec.rb +5 -5
  237. data/spec/functional/resource/batch_spec.rb +5 -1
  238. data/spec/functional/resource/dsc_script_spec.rb +2 -4
  239. data/spec/functional/resource/execute_spec.rb +17 -0
  240. data/spec/functional/resource/user/dscl_spec.rb +2 -4
  241. data/spec/integration/client/client_spec.rb +33 -0
  242. data/spec/integration/recipes/recipe_dsl_spec.rb +58 -58
  243. data/spec/spec_helper.rb +4 -0
  244. data/spec/support/chef_helpers.rb +5 -7
  245. data/spec/support/platform_helpers.rb +6 -0
  246. data/spec/support/platforms/prof/gc.rb +4 -6
  247. data/spec/support/shared/context/client.rb +1 -1
  248. data/spec/support/shared/functional/execute_resource.rb +150 -0
  249. data/spec/support/shared/functional/windows_script.rb +74 -4
  250. data/spec/support/shared/unit/execute_resource.rb +37 -0
  251. data/spec/support/shared/unit/provider/file.rb +10 -0
  252. data/spec/unit/cookbook/cookbook_version_loader_spec.rb +9 -0
  253. data/spec/unit/cookbook/syntax_check_spec.rb +8 -2
  254. data/spec/unit/http/api_versions_spec.rb +69 -0
  255. data/spec/unit/knife/ssh_spec.rb +34 -36
  256. data/spec/unit/mixin/versioned_api_spec.rb +107 -0
  257. data/spec/unit/mixin/which.rb +160 -0
  258. data/spec/unit/platform_spec.rb +28 -1
  259. data/spec/unit/provider/deploy_spec.rb +1 -1
  260. data/spec/unit/provider/directory_spec.rb +10 -0
  261. data/spec/unit/provider/dsc_resource_spec.rb +175 -0
  262. data/spec/unit/provider/execute_spec.rb +0 -1
  263. data/spec/unit/provider/launchd_spec.rb +2 -2
  264. data/spec/unit/provider/package/aix_spec.rb +22 -22
  265. data/spec/unit/provider/package/apt_spec.rb +27 -27
  266. data/spec/unit/provider/package/cab_spec.rb +59 -5
  267. data/spec/unit/provider/package/dnf/python_helper_spec.rb +29 -0
  268. data/spec/unit/provider/package/dpkg_spec.rb +16 -16
  269. data/spec/unit/provider/package/easy_install_spec.rb +18 -18
  270. data/spec/unit/provider/package/freebsd/pkg_spec.rb +15 -15
  271. data/spec/unit/provider/package/freebsd/pkgng_spec.rb +9 -9
  272. data/spec/unit/provider/package/freebsd/port_spec.rb +9 -9
  273. data/spec/unit/provider/package/homebrew_spec.rb +9 -9
  274. data/spec/unit/provider/package/ips_spec.rb +37 -31
  275. data/spec/unit/provider/package/macports_spec.rb +10 -10
  276. data/spec/unit/provider/package/openbsd_spec.rb +10 -10
  277. data/spec/unit/provider/package/pacman_spec.rb +6 -6
  278. data/spec/unit/provider/package/paludis_spec.rb +7 -7
  279. data/spec/unit/provider/package/portage_spec.rb +6 -7
  280. data/spec/unit/provider/package/rpm_spec.rb +23 -23
  281. data/spec/unit/provider/package/rubygems_spec.rb +38 -38
  282. data/spec/unit/provider/package/solaris_spec.rb +15 -15
  283. data/spec/unit/provider/package/windows_spec.rb +2 -1
  284. data/spec/unit/provider/package/yum_spec.rb +51 -43
  285. data/spec/unit/provider/package/zypper_spec.rb +34 -34
  286. data/spec/unit/provider/package_spec.rb +8 -0
  287. data/spec/unit/provider/remote_file/sftp_spec.rb +3 -3
  288. data/spec/unit/provider/route_spec.rb +7 -1
  289. data/spec/unit/provider/script_spec.rb +49 -6
  290. data/spec/unit/resource/dsc_resource_spec.rb +6 -0
  291. data/spec/unit/resource/execute_spec.rb +214 -0
  292. data/spec/unit/resource/file/verification/systemd_unit_spec.rb +103 -0
  293. data/spec/unit/resource/freebsd_package_spec.rb +2 -2
  294. data/spec/unit/resource/package_spec.rb +5 -0
  295. data/spec/unit/resource/yum_package_spec.rb +42 -1
  296. data/spec/unit/resource_reporter_spec.rb +1 -1
  297. data/spec/unit/resource_spec.rb +18 -0
  298. data/spec/unit/server_api_versions_spec.rb +44 -0
  299. data/spec/unit/util/selinux_spec.rb +3 -14
  300. data/spec/unit/win32/error_spec.rb +67 -0
  301. data/spec/unit/win32/security_spec.rb +66 -0
  302. data/tasks/changelog.rb +1 -1
  303. data/tasks/dependencies.rb +20 -4
  304. metadata +39 -18
  305. data/lib/chef/monkey_patches/net-ssh-multi.rb +0 -141
@@ -19,50 +19,80 @@
19
19
  require "chef/provider/package"
20
20
  require "chef/resource/cab_package"
21
21
  require "chef/mixin/shell_out"
22
+ require "chef/mixin/uris"
23
+ require "chef/mixin/checksum"
22
24
 
23
25
  class Chef
24
26
  class Provider
25
27
  class Package
26
28
  class Cab < Chef::Provider::Package
29
+ use_inline_resources
27
30
  include Chef::Mixin::ShellOut
31
+ include Chef::Mixin::Uris
32
+ include Chef::Mixin::Checksum
28
33
 
29
34
  provides :cab_package, os: "windows"
30
35
 
31
36
  def load_current_resource
32
37
  @current_resource = Chef::Resource::CabPackage.new(new_resource.name)
33
- current_resource.source(new_resource.source)
38
+ current_resource.source(cab_file_source)
34
39
  new_resource.version(package_version)
35
40
  current_resource.version(installed_version)
36
41
  current_resource
37
42
  end
38
43
 
44
+ def cab_file_source
45
+ @cab_file_source ||= uri_scheme?(new_resource.source) ? download_source_file : new_resource.source
46
+ end
47
+
48
+ def download_source_file
49
+ source_resource.run_action(:create)
50
+ Chef::Log.debug("#{new_resource} fetched source file to #{source_resource.path}")
51
+ source_resource.path
52
+ end
53
+
54
+ def source_resource
55
+ @source_resource ||= declare_resource(:remote_file, new_resource.name) do
56
+ path default_download_cache_path
57
+ source new_resource.source
58
+ backup false
59
+ end
60
+ end
61
+
62
+ def default_download_cache_path
63
+ uri = ::URI.parse(new_resource.source)
64
+ filename = ::File.basename(::URI.unescape(uri.path))
65
+ file_cache_dir = Chef::FileCache.create_cache_path("package/")
66
+ Chef::Util::PathHelper.cleanpath("#{file_cache_dir}/#{filename}")
67
+ end
68
+
39
69
  def install_package(name, version)
40
- dism_command("/Add-Package /PackagePath:\"#{@new_resource.source}\"")
70
+ dism_command("/Add-Package /PackagePath:\"#{cab_file_source}\"")
41
71
  end
42
72
 
43
73
  def remove_package(name, version)
44
- dism_command("/Remove-Package /PackagePath:\"#{@new_resource.source}\"")
74
+ dism_command("/Remove-Package /PackagePath:\"#{cab_file_source}\"")
45
75
  end
46
76
 
47
77
  def dism_command(command)
48
- shellout = Mixlib::ShellOut.new("dism.exe /Online /English #{command} /NoRestart", { :timeout => @new_resource.timeout })
78
+ shellout = Mixlib::ShellOut.new("dism.exe /Online /English #{command} /NoRestart", timeout: new_resource.timeout)
49
79
  with_os_architecture(nil) do
50
80
  shellout.run_command
51
81
  end
52
82
  end
53
83
 
54
84
  def installed_version
55
- stdout = dism_command("/Get-PackageInfo /PackagePath:\"#{@new_resource.source}\"").stdout
85
+ stdout = dism_command("/Get-PackageInfo /PackagePath:\"#{cab_file_source}\"").stdout
56
86
  package_info = parse_dism_get_package_info(stdout)
57
87
  # e.g. Package_for_KB2975719~31bf3856ad364e35~amd64~~6.3.1.8
58
88
  package = split_package_identity(package_info["package_information"]["package_identity"])
59
89
  # Search for just the package name to catch a different version being installed
60
- Chef::Log.debug("#{@new_resource} searching for installed package #{package['name']}")
90
+ Chef::Log.debug("#{new_resource} searching for installed package #{package['name']}")
61
91
  found_packages = installed_packages.select { |p| p["package_identity"] =~ /^#{package['name']}~/ }
62
- if found_packages.length == 0
92
+ if found_packages.empty?
63
93
  nil
64
94
  elsif found_packages.length == 1
65
- stdout = dism_command("/Get-PackageInfo /PackageName:\"#{found_packages.first["package_identity"]}\"").stdout
95
+ stdout = dism_command("/Get-PackageInfo /PackageName:\"#{found_packages.first['package_identity']}\"").stdout
66
96
  find_version(stdout)
67
97
  else
68
98
  # Presuming this won't happen, otherwise we need to handle it
@@ -71,8 +101,8 @@ class Chef
71
101
  end
72
102
 
73
103
  def package_version
74
- Chef::Log.debug("#{@new_resource} getting product version for package at #{@new_resource.source}")
75
- stdout = dism_command("/Get-PackageInfo /PackagePath:\"#{@new_resource.source}\"").stdout
104
+ Chef::Log.debug("#{new_resource} getting product version for package at #{cab_file_source}")
105
+ stdout = dism_command("/Get-PackageInfo /PackagePath:\"#{cab_file_source}\"").stdout
76
106
  find_version(stdout)
77
107
  end
78
108
 
@@ -85,22 +115,21 @@ class Chef
85
115
  # returns a hash of package state information given the output of dism /get-packages
86
116
  # expected keys: package_identity
87
117
  def parse_dism_get_packages(text)
88
- packages = Array.new
118
+ packages = []
89
119
  text.each_line do |line|
90
120
  key, value = line.split(":") if line.start_with?("Package Identity")
91
- unless key.nil? || value.nil?
92
- package = Hash.new
93
- package[key.downcase.strip.tr(" ", "_")] = value.strip.chomp
94
- packages << package
95
- end
121
+ next if key.nil? || value.nil?
122
+ package = {}
123
+ package[key.downcase.strip.tr(" ", "_")] = value.strip.chomp
124
+ packages << package
96
125
  end
97
126
  packages
98
127
  end
99
128
 
100
129
  # returns a hash of package information given the output of dism /get-packageinfo
101
130
  def parse_dism_get_package_info(text)
102
- package_data = Hash.new
103
- errors = Array.new
131
+ package_data = {}
132
+ errors = []
104
133
  in_section = false
105
134
  section_headers = [ "Package information", "Custom Properties", "Features" ]
106
135
  text.each_line do |line|
@@ -112,7 +141,7 @@ class Chef
112
141
  v = $2 # has to be first or the gsub below replaces this variable
113
142
  k = $1.downcase.strip.tr(" ", "_")
114
143
  if in_section
115
- package_data[in_section] = Hash.new unless package_data[in_section]
144
+ package_data[in_section] = {} unless package_data[in_section]
116
145
  package_data[in_section][k] = v
117
146
  else
118
147
  package_data[k] = v
@@ -132,7 +161,7 @@ class Chef
132
161
  end
133
162
 
134
163
  def split_package_identity(identity)
135
- data = Hash.new
164
+ data = {}
136
165
  data["name"], data["publisher"], data["arch"], data["resource_id"], data["version"] = identity.split("~")
137
166
  data
138
167
  end
@@ -30,8 +30,8 @@ class Chef
30
30
  # Declare that our arguments should be arrays
31
31
  use_multipackage_api
32
32
 
33
- PATHFINDING_POWERSHELL_COMMAND = "[System.Environment]::GetEnvironmentVariable('ChocolateyInstall', 'MACHINE')"
34
- CHOCO_MISSING_MSG = <<-EOS
33
+ PATHFINDING_POWERSHELL_COMMAND = "[System.Environment]::GetEnvironmentVariable('ChocolateyInstall', 'MACHINE')".freeze
34
+ CHOCO_MISSING_MSG = <<-EOS.freeze
35
35
  Could not locate your Chocolatey install. To install chocolatey, we recommend
36
36
  the 'chocolatey' cookbook (https://github.com/chocolatey/chocolatey-cookbook).
37
37
  If Chocolatey is installed, ensure that the 'ChocolateyInstall' environment
@@ -59,8 +59,8 @@ EOS
59
59
  # so we want to assert candidates exist for the alternate source
60
60
  requirements.assert(:upgrade, :install) do |a|
61
61
  a.assertion { candidates_exist_for_all_uninstalled? }
62
- a.failure_message(Chef::Exceptions::Package, "No candidate version available for #{packages_missing_candidates.join(", ")}")
63
- a.whyrun("Assuming a repository that offers #{packages_missing_candidates.join(", ")} would have been configured")
62
+ a.failure_message(Chef::Exceptions::Package, "No candidate version available for #{packages_missing_candidates.join(', ')}")
63
+ a.whyrun("Assuming a repository that offers #{packages_missing_candidates.join(', ')} would have been configured")
64
64
  end
65
65
  end
66
66
 
@@ -133,12 +133,11 @@ EOS
133
133
  end
134
134
 
135
135
  # Choco does not have dpkg's distinction between purge and remove
136
- alias_method :purge_package, :remove_package
136
+ alias purge_package remove_package
137
137
 
138
138
  # Override the superclass check. The semantics for our new_resource.source is not files to
139
139
  # install from, but like the rubygem provider's sources which are more like repos.
140
- def check_resource_semantics!
141
- end
140
+ def check_resource_semantics!; end
142
141
 
143
142
  private
144
143
 
@@ -160,7 +159,7 @@ EOS
160
159
  def choco_install_path
161
160
  @choco_install_path ||= powershell_out!(
162
161
  PATHFINDING_POWERSHELL_COMMAND
163
- ).stdout.chomp
162
+ ).stdout.chomp
164
163
  end
165
164
 
166
165
  # Helper to dispatch a choco command through shell_out using the timeout
@@ -169,7 +168,7 @@ EOS
169
168
  # @param args [String] variable number of string arguments
170
169
  # @return [Mixlib::ShellOut] object returned from shell_out!
171
170
  def choco_command(*args)
172
- shell_out_with_timeout!(args_to_string(choco_exe, *args), { :returns => new_resource.returns })
171
+ shell_out_with_timeout!(args_to_string(choco_exe, *args), returns: new_resource.returns)
173
172
  end
174
173
 
175
174
  # Use the available_packages Hash helper to create an array suitable for
@@ -268,7 +267,7 @@ EOS
268
267
  # @param names [Array] original mixed case names
269
268
  # @return [Array] same names in lower case
270
269
  def lowercase_names(names)
271
- names.map { |name| name.downcase }
270
+ names.map(&:downcase)
272
271
  end
273
272
  end
274
273
  end
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright:: Copyright 2016, Chef Software, Inc.
2
+ # Copyright:: Copyright 2016-2017, Chef Software Inc.
3
3
  # License:: Apache License, Version 2.0
4
4
  #
5
5
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,6 +18,7 @@
18
18
  require "chef/provider/package"
19
19
  require "chef/resource/dnf_package"
20
20
  require "chef/mixin/which"
21
+ require "chef/mixin/shell_out"
21
22
  require "chef/mixin/get_source_from_package"
22
23
  require "chef/provider/package/dnf/python_helper"
23
24
  require "chef/provider/package/dnf/version"
@@ -27,6 +28,7 @@ class Chef
27
28
  class Package
28
29
  class Dnf < Chef::Provider::Package
29
30
  extend Chef::Mixin::Which
31
+ extend Chef::Mixin::ShellOut
30
32
  include Chef::Mixin::GetSourceFromPackage
31
33
 
32
34
  allow_nils
@@ -34,7 +36,7 @@ class Chef
34
36
  use_package_name_for_source
35
37
 
36
38
  provides :package, platform_family: %w{rhel fedora} do
37
- which("dnf")
39
+ which("dnf") && shell_out("rpm -q dnf").stdout =~ /^dnf-[1-9]/
38
40
  end
39
41
 
40
42
  provides :dnf_package, os: "linux"
@@ -86,24 +88,24 @@ class Chef
86
88
 
87
89
  def install_package(names, versions)
88
90
  if new_resource.source
89
- dnf(new_resource.options, "-y install", new_resource.source)
91
+ dnf(options, "-y install", new_resource.source)
90
92
  else
91
93
  resolved_names = names.each_with_index.map { |name, i| available_version(i).to_s unless name.nil? }
92
- dnf(new_resource.options, "-y install", resolved_names)
94
+ dnf(options, "-y install", resolved_names)
93
95
  end
94
96
  flushcache
95
97
  end
96
98
 
97
99
  # dnf upgrade does not work on uninstalled packaged, while install will upgrade
98
- alias_method :upgrade_package, :install_package
100
+ alias upgrade_package install_package
99
101
 
100
102
  def remove_package(names, versions)
101
103
  resolved_names = names.each_with_index.map { |name, i| installed_version(i).to_s unless name.nil? }
102
- dnf(new_resource.options, "-y remove", resolved_names)
104
+ dnf(options, "-y remove", resolved_names)
103
105
  flushcache
104
106
  end
105
107
 
106
- alias_method :purge_package, :remove_package
108
+ alias purge_package remove_package
107
109
 
108
110
  action :flush_cache do
109
111
  flushcache
@@ -117,7 +119,7 @@ class Chef
117
119
  # does not match what the dnf library accepts.
118
120
  case line
119
121
  when /^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)$/
120
- return Version.new($1, "#{$2 == "(none)" ? "0" : $2}:#{$3}-#{$4}", $5)
122
+ return Version.new($1, "#{$2 == '(none)' ? '0' : $2}:#{$3}-#{$4}", $5)
121
123
  end
122
124
  end
123
125
  end
@@ -126,11 +128,11 @@ class Chef
126
128
  def available_version(index)
127
129
  @available_version ||= []
128
130
 
129
- if new_resource.source
130
- @available_version[index] ||= resolve_source_to_version_obj
131
- else
132
- @available_version[index] ||= python_helper.query(:whatavailable, package_name_array[index], safe_version_array[index], safe_arch_array[index])
133
- end
131
+ @available_version[index] ||= if new_resource.source
132
+ resolve_source_to_version_obj
133
+ else
134
+ python_helper.query(:whatavailable, package_name_array[index], safe_version_array[index], safe_arch_array[index])
135
+ end
134
136
 
135
137
  @available_version[index]
136
138
  end
@@ -138,11 +140,11 @@ class Chef
138
140
  # @returns Array<Version>
139
141
  def installed_version(index)
140
142
  @installed_version ||= []
141
- if new_resource.source
142
- @installed_version[index] ||= python_helper.query(:whatinstalled, available_version(index).name, safe_version_array[index], safe_arch_array[index])
143
- else
144
- @installed_version[index] ||= python_helper.query(:whatinstalled, package_name_array[index], safe_version_array[index], safe_arch_array[index])
145
- end
143
+ @installed_version[index] ||= if new_resource.source
144
+ python_helper.query(:whatinstalled, available_version(index).name, safe_version_array[index], safe_arch_array[index])
145
+ else
146
+ python_helper.query(:whatinstalled, package_name_array[index], safe_version_array[index], safe_arch_array[index])
147
+ end
146
148
  @installed_version[index]
147
149
  end
148
150
 
@@ -53,7 +53,7 @@ def query(command):
53
53
  if len(archq.run()) > 0:
54
54
  q = archq
55
55
 
56
- pkgs = dnf.query.latest_limit_pkgs(q, 1)
56
+ pkgs = q.latest(1).run()
57
57
 
58
58
  if not pkgs:
59
59
  sys.stdout.write('{} nil nil\n'.format(command['provides'].split().pop(0)))
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright:: Copyright 2016, Chef Software, Inc.
2
+ # Copyright:: Copyright 2016-2017, Chef Software Inc.
3
3
  # License:: Apache License, Version 2.0
4
4
  #
5
5
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,6 +15,8 @@
15
15
  # limitations under the License.
16
16
  #
17
17
 
18
+ require "chef/mixin/which"
19
+ require "chef/mixin/shell_out"
18
20
  require "chef/provider/package/dnf/version"
19
21
  require "timeout"
20
22
 
@@ -24,7 +26,8 @@ class Chef
24
26
  class Dnf < Chef::Provider::Package
25
27
  class PythonHelper
26
28
  include Singleton
27
- extend Chef::Mixin::Which
29
+ include Chef::Mixin::Which
30
+ include Chef::Mixin::ShellOut
28
31
 
29
32
  attr_accessor :stdin
30
33
  attr_accessor :stdout
@@ -32,11 +35,16 @@ class Chef
32
35
  attr_accessor :wait_thr
33
36
 
34
37
  DNF_HELPER = ::File.expand_path(::File.join(::File.dirname(__FILE__), "dnf_helper.py")).freeze
35
- DNF_COMMAND = "#{which("python3")} #{DNF_HELPER}"
38
+
39
+ def dnf_command
40
+ @dnf_command ||= which("python", "python3", "python2", "python2.7") do |f|
41
+ shell_out("#{f} -c 'import dnf'").exitstatus == 0
42
+ end + " #{DNF_HELPER}"
43
+ end
36
44
 
37
45
  def start
38
46
  ENV["PYTHONUNBUFFERED"] = "1"
39
- @stdin, @stdout, @stderr, @wait_thr = Open3.popen3(DNF_COMMAND)
47
+ @stdin, @stdout, @stderr, @wait_thr = Open3.popen3(dnf_command)
40
48
  end
41
49
 
42
50
  def reap
@@ -53,6 +61,27 @@ class Chef
53
61
  start if stdin.nil?
54
62
  end
55
63
 
64
+ # @returns Array<Version>
65
+ def query(action, provides, version = nil, arch = nil)
66
+ with_helper do
67
+ json = build_query(action, provides, version, arch)
68
+ Chef::Log.debug "sending '#{json}' to python helper"
69
+ stdin.syswrite json + "\n"
70
+ output = stdout.sysread(4096).chomp
71
+ Chef::Log.debug "got '#{output}' from python helper"
72
+ version = parse_response(output)
73
+ Chef::Log.debug "parsed #{version} from python helper"
74
+ version
75
+ end
76
+ end
77
+
78
+ def restart
79
+ reap
80
+ start
81
+ end
82
+
83
+ private
84
+
56
85
  # i couldn't figure out how to decompose an evr on the python side, it seems reasonably
57
86
  # painless to do it in ruby (generally massaging nevras in the ruby side is HIGHLY
58
87
  # discouraged -- this is an "every rule has an exception" exception -- any additional
@@ -60,10 +89,12 @@ class Chef
60
89
  def add_version(hash, version)
61
90
  epoch = nil
62
91
  if version =~ /(\S+):(\S+)/
63
- epoch, version = $1, $2
92
+ epoch = $1
93
+ version = $2
64
94
  end
65
95
  if version =~ /(\S+)-(\S+)/
66
- version, release = $1, $2
96
+ version = $1
97
+ release = $2
67
98
  end
68
99
  hash["epoch"] = epoch unless epoch.nil?
69
100
  hash["release"] = release unless release.nil?
@@ -83,35 +114,41 @@ class Chef
83
114
  array.each_slice(3).map { |x| Version.new(*x) }.first
84
115
  end
85
116
 
86
- # @returns Array<Version>
87
- def query(action, provides, version = nil, arch = nil)
88
- with_helper do
89
- json = build_query(action, provides, version, arch)
90
- Chef::Log.debug "sending '#{json}' to python helper"
91
- stdin.syswrite json + "\n"
92
- output = stdout.sysread(4096).chomp
93
- Chef::Log.debug "got '#{output}' from python helper"
94
- version = parse_response(output)
95
- Chef::Log.debug "parsed #{version} from python helper"
96
- version
117
+ def drain_stderr
118
+ output = ""
119
+ until IO.select([stderr], nil, nil, 0).nil?
120
+ output += stderr.sysread(4096).chomp
97
121
  end
98
- end
99
-
100
- def restart
101
- reap
102
- start
122
+ output
123
+ rescue
124
+ # we must rescue EOFError, and we don't much care about errors on stderr anyway
125
+ output
103
126
  end
104
127
 
105
128
  def with_helper
106
129
  max_retries ||= 5
130
+ ret = nil
107
131
  Timeout.timeout(600) do
108
132
  check
109
- yield
133
+ ret = yield
110
134
  end
135
+ output = drain_stderr
136
+ unless output.empty?
137
+ Chef::Log.debug "discarding output on stderr from python helper: #{output}"
138
+ end
139
+ ret
111
140
  rescue EOFError, Errno::EPIPE, Timeout::Error, Errno::ESRCH => e
112
- raise e unless ( max_retries -= 1 ) > 0
113
- restart
114
- retry
141
+ output = drain_stderr
142
+ if ( max_retries -= 1 ) > 0
143
+ unless output.empty?
144
+ Chef::Log.debug "discarding output on stderr from python helper: #{output}"
145
+ end
146
+ restart
147
+ retry
148
+ else
149
+ raise e if output.empty?
150
+ raise "dnf-helper.py had stderr output:\n\n#{output}"
151
+ end
115
152
  end
116
153
  end
117
154
  end