chef 12.10.24-universal-mingw32 → 12.11.18-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 (525) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +3 -38
  3. data/Gemfile +6 -11
  4. data/LICENSE +201 -201
  5. data/README.md +11 -1
  6. data/VERSION +1 -1
  7. data/acceptance/.bundle/config +2 -0
  8. data/acceptance/Gemfile.lock +27 -26
  9. data/acceptance/basics/.kitchen/logs/chef-current-install-ubuntu-1404.log +2 -0
  10. data/acceptance/basics/.kitchen/logs/kitchen.log +3 -0
  11. data/acceptance/data-collector/.acceptance/acceptance-cookbook/.gitignore +2 -0
  12. data/acceptance/data-collector/.acceptance/acceptance-cookbook/metadata.rb +3 -0
  13. data/acceptance/data-collector/.acceptance/acceptance-cookbook/recipes/destroy.rb +2 -0
  14. data/acceptance/data-collector/.acceptance/acceptance-cookbook/recipes/provision.rb +2 -0
  15. data/acceptance/data-collector/.acceptance/acceptance-cookbook/recipes/verify.rb +2 -0
  16. data/acceptance/data-collector/.acceptance/data-collector-test/.gitignore +16 -0
  17. data/acceptance/data-collector/.acceptance/data-collector-test/Berksfile +3 -0
  18. data/acceptance/data-collector/.acceptance/data-collector-test/files/default/api.rb +85 -0
  19. data/acceptance/data-collector/.acceptance/data-collector-test/files/default/apigemfile +3 -0
  20. data/acceptance/data-collector/.acceptance/data-collector-test/files/default/client-rb-both-mode.rb +4 -0
  21. data/acceptance/data-collector/.acceptance/data-collector-test/files/default/client-rb-client-mode.rb +4 -0
  22. data/acceptance/data-collector/.acceptance/data-collector-test/files/default/client-rb-no-endpoint.rb +2 -0
  23. data/acceptance/data-collector/.acceptance/data-collector-test/files/default/client-rb-solo-mode.rb +4 -0
  24. data/acceptance/data-collector/.acceptance/data-collector-test/files/default/config.ru +2 -0
  25. data/acceptance/data-collector/.acceptance/data-collector-test/metadata.rb +7 -0
  26. data/acceptance/data-collector/.acceptance/data-collector-test/recipes/default.rb +38 -0
  27. data/acceptance/data-collector/.kitchen.yml +9 -0
  28. data/acceptance/data-collector/Berksfile +3 -0
  29. data/acceptance/data-collector/Berksfile.lock +6 -0
  30. data/acceptance/data-collector/test/integration/default/serverspec/default_spec.rb +251 -0
  31. data/acceptance/fips/.kitchen/logs/fips-integration-centos-6.log +3 -0
  32. data/acceptance/fips/.kitchen/logs/fips-integration-windows-2012r2.log +3 -0
  33. data/acceptance/fips/.kitchen/logs/fips-unit-functional-centos-6.log +3 -0
  34. data/acceptance/fips/.kitchen/logs/fips-unit-functional-windows-2012r2.log +3 -0
  35. data/acceptance/fips/.kitchen/logs/kitchen.log +6 -0
  36. data/acceptance/fips/test/integration/fips-integration/serverspec/fips-integration_spec.rb +2 -1
  37. data/acceptance/top-cookbooks/.kitchen.docker.yml +1 -4
  38. data/acceptance/trivial/.kitchen/logs/chef-current-install-windows-2012r2.log +2 -0
  39. data/acceptance/trivial/.kitchen/logs/kitchen.log +3 -0
  40. data/acceptance/windows-service/.kitchen/logs/chef-windows-service-windows-2012r2.log +2 -0
  41. data/acceptance/windows-service/.kitchen/logs/kitchen.log +3 -0
  42. data/bin/chef-apply +0 -0
  43. data/bin/chef-client +0 -0
  44. data/bin/chef-service-manager +0 -0
  45. data/bin/chef-shell +0 -0
  46. data/bin/chef-solo +0 -0
  47. data/bin/chef-windows-service +0 -0
  48. data/bin/knife +0 -0
  49. data/chef.gemspec +1 -0
  50. data/distro/common/html/_sources/ctl_chef_client.txt +35 -35
  51. data/distro/common/html/_sources/ctl_chef_server.txt +341 -341
  52. data/distro/common/html/_sources/ctl_chef_shell.txt +15 -15
  53. data/distro/common/html/_sources/ctl_chef_solo.txt +25 -25
  54. data/distro/common/html/_sources/index.txt +135 -135
  55. data/distro/common/html/_sources/knife.txt +74 -74
  56. data/distro/common/html/_sources/knife_bootstrap.txt +56 -56
  57. data/distro/common/html/_sources/knife_client.txt +150 -150
  58. data/distro/common/html/_sources/knife_common_options.txt +6 -6
  59. data/distro/common/html/_sources/knife_configure.txt +29 -29
  60. data/distro/common/html/_sources/knife_cookbook.txt +236 -236
  61. data/distro/common/html/_sources/knife_cookbook_site.txt +157 -157
  62. data/distro/common/html/_sources/knife_data_bag.txt +159 -159
  63. data/distro/common/html/_sources/knife_delete.txt +26 -26
  64. data/distro/common/html/_sources/knife_deps.txt +61 -61
  65. data/distro/common/html/_sources/knife_diff.txt +34 -34
  66. data/distro/common/html/_sources/knife_download.txt +44 -44
  67. data/distro/common/html/_sources/knife_edit.txt +26 -26
  68. data/distro/common/html/_sources/knife_environment.txt +158 -158
  69. data/distro/common/html/_sources/knife_exec.txt +47 -47
  70. data/distro/common/html/_sources/knife_index_rebuild.txt +20 -20
  71. data/distro/common/html/_sources/knife_list.txt +33 -33
  72. data/distro/common/html/_sources/knife_node.txt +250 -250
  73. data/distro/common/html/_sources/knife_raw.txt +35 -35
  74. data/distro/common/html/_sources/knife_recipe_list.txt +23 -23
  75. data/distro/common/html/_sources/knife_role.txt +157 -157
  76. data/distro/common/html/_sources/knife_search.txt +53 -53
  77. data/distro/common/html/_sources/knife_serve.txt +18 -18
  78. data/distro/common/html/_sources/knife_show.txt +26 -26
  79. data/distro/common/html/_sources/knife_ssh.txt +43 -43
  80. data/distro/common/html/_sources/knife_ssl_check.txt +41 -41
  81. data/distro/common/html/_sources/knife_ssl_fetch.txt +41 -41
  82. data/distro/common/html/_sources/knife_status.txt +37 -37
  83. data/distro/common/html/_sources/knife_tag.txt +69 -69
  84. data/distro/common/html/_sources/knife_upload.txt +49 -49
  85. data/distro/common/html/_sources/knife_user.txt +127 -127
  86. data/distro/common/html/_sources/knife_using.txt +43 -43
  87. data/distro/common/html/_sources/knife_xargs.txt +30 -30
  88. data/distro/common/html/_static/guide.css +504 -504
  89. data/distro/common/html/_static/pygments.css +61 -61
  90. data/distro/common/html/_static/underscore.js +31 -31
  91. data/distro/common/html/ctl_chef_client.html +269 -269
  92. data/distro/common/html/ctl_chef_server.html +727 -727
  93. data/distro/common/html/ctl_chef_shell.html +162 -162
  94. data/distro/common/html/ctl_chef_solo.html +193 -193
  95. data/distro/common/html/index.html +201 -201
  96. data/distro/common/html/knife.html +169 -169
  97. data/distro/common/html/knife_bootstrap.html +284 -284
  98. data/distro/common/html/knife_client.html +284 -284
  99. data/distro/common/html/knife_common_options.html +95 -95
  100. data/distro/common/html/knife_configure.html +104 -104
  101. data/distro/common/html/knife_cookbook.html +486 -486
  102. data/distro/common/html/knife_data_bag.html +373 -373
  103. data/distro/common/html/knife_delete.html +92 -92
  104. data/distro/common/html/knife_deps.html +142 -142
  105. data/distro/common/html/knife_diff.html +122 -122
  106. data/distro/common/html/knife_download.html +144 -144
  107. data/distro/common/html/knife_edit.html +88 -88
  108. data/distro/common/html/knife_environment.html +325 -325
  109. data/distro/common/html/knife_exec.html +219 -219
  110. data/distro/common/html/knife_index_rebuild.html +82 -82
  111. data/distro/common/html/knife_list.html +113 -113
  112. data/distro/common/html/knife_node.html +457 -457
  113. data/distro/common/html/knife_raw.html +109 -109
  114. data/distro/common/html/knife_recipe_list.html +90 -90
  115. data/distro/common/html/knife_role.html +294 -294
  116. data/distro/common/html/knife_search.html +202 -202
  117. data/distro/common/html/knife_serve.html +78 -78
  118. data/distro/common/html/knife_show.html +103 -103
  119. data/distro/common/html/knife_ssh.html +176 -176
  120. data/distro/common/html/knife_ssl_check.html +150 -150
  121. data/distro/common/html/knife_ssl_fetch.html +150 -150
  122. data/distro/common/html/knife_status.html +143 -143
  123. data/distro/common/html/knife_tag.html +137 -137
  124. data/distro/common/html/knife_upload.html +152 -152
  125. data/distro/common/html/knife_user.html +241 -241
  126. data/distro/common/html/knife_using.html +209 -209
  127. data/distro/common/html/knife_xargs.html +121 -121
  128. data/distro/common/html/search.html +81 -81
  129. data/distro/common/man/man1/README.md +58 -58
  130. data/distro/common/man/man1/chef-shell.1 +194 -194
  131. data/distro/common/man/man1/knife-bootstrap.1 +215 -215
  132. data/distro/common/man/man1/knife-client.1 +443 -443
  133. data/distro/common/man/man1/knife-configure.1 +161 -161
  134. data/distro/common/man/man1/knife-cookbook.1 +770 -770
  135. data/distro/common/man/man1/knife-data-bag.1 +617 -617
  136. data/distro/common/man/man1/knife-delete.1 +127 -127
  137. data/distro/common/man/man1/knife-deps.1 +246 -246
  138. data/distro/common/man/man1/knife-diff.1 +226 -226
  139. data/distro/common/man/man1/knife-download.1 +258 -258
  140. data/distro/common/man/man1/knife-edit.1 +121 -121
  141. data/distro/common/man/man1/knife-environment.1 +508 -508
  142. data/distro/common/man/man1/knife-exec.1 +362 -362
  143. data/distro/common/man/man1/knife-index-rebuild.1 +63 -63
  144. data/distro/common/man/man1/knife-list.1 +174 -174
  145. data/distro/common/man/man1/knife-node.1 +716 -716
  146. data/distro/common/man/man1/knife-raw.1 +172 -172
  147. data/distro/common/man/man1/knife-recipe-list.1 +85 -85
  148. data/distro/common/man/man1/knife-role.1 +426 -426
  149. data/distro/common/man/man1/knife-search.1 +359 -359
  150. data/distro/common/man/man1/knife-serve.1 +109 -109
  151. data/distro/common/man/man1/knife-show.1 +160 -160
  152. data/distro/common/man/man1/knife-ssh.1 +284 -284
  153. data/distro/common/man/man1/knife-ssl-check.1 +207 -207
  154. data/distro/common/man/man1/knife-ssl-fetch.1 +207 -207
  155. data/distro/common/man/man1/knife-status.1 +234 -234
  156. data/distro/common/man/man1/knife-tag.1 +189 -189
  157. data/distro/common/man/man1/knife-upload.1 +280 -280
  158. data/distro/common/man/man1/knife-user.1 +356 -356
  159. data/distro/common/man/man1/knife-xargs.1 +189 -189
  160. data/distro/common/man/man1/knife.1 +332 -332
  161. data/distro/common/man/man8/chef-apply.8 +86 -86
  162. data/distro/common/man/man8/chef-client.8 +398 -398
  163. data/distro/common/man/man8/chef-solo.8 +260 -260
  164. data/distro/common/markdown/README +3 -3
  165. data/lib/chef/application.rb +14 -9
  166. data/lib/chef/application/apply.rb +5 -5
  167. data/lib/chef/application/client.rb +3 -3
  168. data/lib/chef/application/exit_code.rb +226 -0
  169. data/lib/chef/application/solo.rb +37 -7
  170. data/lib/chef/application/windows_service.rb +3 -3
  171. data/lib/chef/chef_fs/command_line.rb +7 -0
  172. data/lib/chef/chef_fs/config.rb +1 -1
  173. data/lib/chef/chef_fs/data_handler/data_handler_base.rb +11 -10
  174. data/lib/chef/chef_fs/data_handler/environment_data_handler.rb +1 -1
  175. data/lib/chef/chef_fs/data_handler/role_data_handler.rb +1 -1
  176. data/lib/chef/chef_fs/file_system.rb +15 -13
  177. data/lib/chef/chef_fs/file_system/base_fs_object.rb +4 -0
  178. data/lib/chef/chef_fs/file_system/chef_server/acl_dir.rb +1 -1
  179. data/lib/chef/chef_fs/file_system/chef_server/acl_entry.rb +9 -0
  180. data/lib/chef/chef_fs/file_system/chef_server/data_bag_dir.rb +6 -0
  181. data/lib/chef/chef_fs/file_system/chef_server/data_bag_entry.rb +19 -0
  182. data/lib/chef/chef_fs/file_system/chef_server/environments_dir.rb +1 -1
  183. data/lib/chef/chef_fs/file_system/chef_server/nodes_dir.rb +1 -1
  184. data/lib/chef/chef_fs/file_system/chef_server/org_entry.rb +4 -0
  185. data/lib/chef/chef_fs/file_system/chef_server/organization_invites_entry.rb +4 -0
  186. data/lib/chef/chef_fs/file_system/chef_server/organization_members_entry.rb +4 -0
  187. data/lib/chef/chef_fs/file_system/chef_server/policy_revision_entry.rb +4 -0
  188. data/lib/chef/chef_fs/file_system/chef_server/rest_list_dir.rb +3 -3
  189. data/lib/chef/chef_fs/file_system/chef_server/rest_list_entry.rb +15 -4
  190. data/lib/chef/chef_fs/file_system/exceptions.rb +7 -0
  191. data/lib/chef/chef_fs/file_system/multiplexed_dir.rb +2 -2
  192. data/lib/chef/chef_fs/file_system/nonexistent_fs_object.rb +0 -4
  193. data/lib/chef/chef_fs/file_system/repository/acl.rb +7 -0
  194. data/lib/chef/chef_fs/file_system/repository/acls_sub_dir.rb +0 -4
  195. data/lib/chef/chef_fs/file_system/repository/base_file.rb +36 -4
  196. data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_entry.rb +4 -0
  197. data/lib/chef/chef_fs/file_system/repository/client_keys_sub_dir.rb +0 -4
  198. data/lib/chef/chef_fs/file_system/repository/clients_dir.rb +0 -3
  199. data/lib/chef/chef_fs/file_system/repository/containers_dir.rb +0 -4
  200. data/lib/chef/chef_fs/file_system/repository/directory.rb +4 -0
  201. data/lib/chef/chef_fs/file_system/repository/environments_dir.rb +0 -4
  202. data/lib/chef/chef_fs/file_system/repository/groups_dir.rb +0 -4
  203. data/lib/chef/chef_fs/file_system/repository/nodes_dir.rb +0 -4
  204. data/lib/chef/chef_fs/file_system/repository/policy_groups_dir.rb +0 -4
  205. data/lib/chef/chef_fs/file_system/repository/roles_dir.rb +0 -4
  206. data/lib/chef/chef_fs/file_system/repository/users_dir.rb +0 -4
  207. data/lib/chef/client.rb +11 -3
  208. data/lib/chef/config_fetcher.rb +4 -4
  209. data/lib/chef/cookbook/gem_installer.rb +1 -0
  210. data/lib/chef/cookbook/synchronizer.rb +1 -1
  211. data/lib/chef/data_bag.rb +2 -2
  212. data/lib/chef/data_bag_item.rb +1 -1
  213. data/lib/chef/data_collector.rb +345 -0
  214. data/lib/chef/data_collector/messages.rb +125 -0
  215. data/lib/chef/data_collector/messages/helpers.rb +161 -0
  216. data/lib/chef/data_collector/resource_report.rb +84 -0
  217. data/lib/chef/decorator.rb +81 -0
  218. data/lib/chef/decorator/lazy.rb +60 -0
  219. data/lib/chef/decorator/lazy_array.rb +59 -0
  220. data/lib/chef/deprecation/provider/remote_file.rb +1 -1
  221. data/lib/chef/dsl/core.rb +19 -11
  222. data/lib/chef/dsl/platform_introspection.rb +16 -0
  223. data/lib/chef/dsl/recipe.rb +15 -9
  224. data/lib/chef/dsl/universal.rb +50 -0
  225. data/lib/chef/environment.rb +2 -2
  226. data/lib/chef/exceptions.rb +19 -4
  227. data/lib/chef/handler.rb +33 -0
  228. data/lib/chef/knife/cookbook_show.rb +6 -10
  229. data/lib/chef/knife/cookbook_site_install.rb +7 -2
  230. data/lib/chef/knife/help_topics.rb +4 -4
  231. data/lib/chef/knife/list.rb +1 -2
  232. data/lib/chef/knife/ssl_check.rb +2 -1
  233. data/lib/chef/monkey_patches/win32/registry.rb +11 -0
  234. data/lib/chef/nil_argument.rb +3 -3
  235. data/lib/chef/node.rb +2 -2
  236. data/lib/chef/platform/rebooter.rb +13 -2
  237. data/lib/chef/policy_builder/dynamic.rb +1 -1
  238. data/lib/chef/policy_builder/expand_node_object.rb +3 -3
  239. data/lib/chef/policy_builder/policyfile.rb +1 -1
  240. data/lib/chef/provider/git.rb +43 -41
  241. data/lib/chef/provider/lwrp_base.rb +0 -1
  242. data/lib/chef/provider/osx_profile.rb +2 -3
  243. data/lib/chef/provider/package.rb +51 -13
  244. data/lib/chef/provider/package/apt.rb +97 -103
  245. data/lib/chef/provider/package/chocolatey.rb +9 -10
  246. data/lib/chef/provider/package/dpkg.rb +2 -2
  247. data/lib/chef/provider/package/portage.rb +1 -1
  248. data/lib/chef/provider/package/rubygems.rb +8 -12
  249. data/lib/chef/provider/package/yum.rb +4 -959
  250. data/lib/chef/provider/package/yum/rpm_utils.rb +642 -0
  251. data/lib/chef/provider/package/{yum-dump.py → yum/yum-dump.py} +0 -0
  252. data/lib/chef/provider/package/yum/yum_cache.rb +376 -0
  253. data/lib/chef/provider/resource_update.rb +52 -52
  254. data/lib/chef/provider/systemd_unit.rb +238 -0
  255. data/lib/chef/providers.rb +1 -0
  256. data/lib/chef/reserved_names.rb +9 -9
  257. data/lib/chef/resource.rb +2 -7
  258. data/lib/chef/resource/file.rb +6 -1
  259. data/lib/chef/resource/systemd_unit.rb +63 -0
  260. data/lib/chef/resources.rb +1 -0
  261. data/lib/chef/sandbox.rb +20 -20
  262. data/lib/chef/shell/shell_session.rb +3 -3
  263. data/lib/chef/version.rb +1 -1
  264. data/lib/chef/win32/system.rb +0 -0
  265. data/spec/data/apt/chef-integration-test-1.0/debian/changelog +5 -5
  266. data/spec/data/apt/chef-integration-test-1.0/debian/compat +1 -1
  267. data/spec/data/apt/chef-integration-test-1.0/debian/control +13 -13
  268. data/spec/data/apt/chef-integration-test-1.0/debian/files +1 -1
  269. data/spec/data/apt/chef-integration-test-1.0/debian/rules +13 -13
  270. data/spec/data/apt/chef-integration-test-1.0/debian/source/format +1 -1
  271. data/spec/data/apt/chef-integration-test-1.1/debian/changelog +11 -11
  272. data/spec/data/apt/chef-integration-test-1.1/debian/compat +1 -1
  273. data/spec/data/apt/chef-integration-test-1.1/debian/control +13 -13
  274. data/spec/data/apt/chef-integration-test-1.1/debian/files +1 -1
  275. data/spec/data/apt/chef-integration-test-1.1/debian/rules +13 -13
  276. data/spec/data/apt/chef-integration-test-1.1/debian/source/format +1 -1
  277. data/spec/data/apt/chef-integration-test2-1.0/debian/rules +0 -0
  278. data/spec/data/apt/chef-integration-test_1.0-1_amd64.changes +22 -22
  279. data/spec/data/apt/chef-integration-test_1.1-1_amd64.changes +22 -22
  280. data/spec/data/apt/var/www/apt/conf/distributions +7 -7
  281. data/spec/data/apt/var/www/apt/conf/incoming +4 -4
  282. data/spec/data/apt/var/www/apt/conf/pulls +3 -3
  283. data/spec/data/apt/var/www/apt/db/version +4 -4
  284. data/spec/data/apt/var/www/apt/dists/sid/Release +19 -19
  285. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Packages +16 -16
  286. data/spec/data/apt/var/www/apt/dists/sid/main/binary-amd64/Release +5 -5
  287. data/spec/data/bootstrap/encrypted_data_bag_secret +1 -1
  288. data/spec/data/bootstrap/no_proxy.erb +2 -2
  289. data/spec/data/bootstrap/secret.erb +9 -9
  290. data/spec/data/bootstrap/test-hints.erb +12 -12
  291. data/spec/data/bootstrap/test.erb +1 -1
  292. data/spec/data/cb_version_cookbooks/tatft/README.rdoc +2 -2
  293. data/spec/data/cb_version_cookbooks/tatft/attributes/default.rb +1 -1
  294. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-600hhz-0 +1 -1
  295. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ahd2gq-0 +1 -1
  296. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-api8ux-0 +1 -1
  297. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-b0r1m1-0 +1 -1
  298. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-bfygsi-0 +1 -1
  299. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-el14l6-0 +1 -1
  300. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ivrl3y-0 +1 -1
  301. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-kkbs85-0 +1 -1
  302. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ory1ux-0 +1 -1
  303. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-pgsq76-0 +1 -1
  304. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ra8uim-0 +1 -1
  305. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t7k1g-0 +1 -1
  306. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t8g0sv-0 +1 -1
  307. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ufy6g3-0 +1 -1
  308. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-x2d6j9-0 +1 -1
  309. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-xi0l6h-0 +1 -1
  310. data/spec/data/config.rb +6 -6
  311. data/spec/data/cookbooks/angrybash/metadata.rb +2 -2
  312. data/spec/data/cookbooks/angrybash/recipes/default.rb +8 -8
  313. data/spec/data/cookbooks/apache2/files/default/apache2_module_conf_generate.pl +2 -2
  314. data/spec/data/cookbooks/apache2/metadata.rb +2 -2
  315. data/spec/data/cookbooks/apache2/recipes/default.rb +2 -2
  316. data/spec/data/cookbooks/borken/metadata.rb +2 -2
  317. data/spec/data/cookbooks/borken/recipes/default.rb +1 -1
  318. data/spec/data/cookbooks/borken/templates/default/borken.erb +1 -1
  319. data/spec/data/cookbooks/chefignore +8 -8
  320. data/spec/data/cookbooks/ignorken/files/default/not_me.rb +2 -2
  321. data/spec/data/cookbooks/ignorken/metadata.rb +2 -2
  322. data/spec/data/cookbooks/ignorken/recipes/ignoreme.rb +1 -1
  323. data/spec/data/cookbooks/ignorken/templates/ubuntu-12.10/not_me.rb +2 -2
  324. data/spec/data/cookbooks/java/files/default/java.response +1 -1
  325. data/spec/data/cookbooks/java/metadata.rb +2 -2
  326. data/spec/data/cookbooks/name-mismatch-versionnumber/README.md +4 -4
  327. data/spec/data/cookbooks/name-mismatch-versionnumber/metadata.rb +8 -8
  328. data/spec/data/cookbooks/openldap/attributes/default.rb +16 -16
  329. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  330. data/spec/data/cookbooks/openldap/definitions/client.rb +5 -5
  331. data/spec/data/cookbooks/openldap/definitions/server.rb +5 -5
  332. data/spec/data/cookbooks/openldap/files/default/.dotfile +1 -1
  333. data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +1 -1
  334. data/spec/data/cookbooks/openldap/files/default/remotedir/not_a_template.erb +2 -2
  335. data/spec/data/cookbooks/openldap/files/default/remotedir/remote_dir_file1.txt +2 -2
  336. data/spec/data/cookbooks/openldap/files/default/remotedir/remote_dir_file2.txt +2 -2
  337. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +1 -1
  338. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/remote_subdir_file1.txt +2 -2
  339. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/remote_subdir_file2.txt +2 -2
  340. data/spec/data/cookbooks/openldap/files/default/remotedir/subdir_with_no_file_just_a_subsubdir/the_subsubdir/some_file.txt +3 -3
  341. data/spec/data/cookbooks/openldap/libraries/openldap.rb +4 -4
  342. data/spec/data/cookbooks/openldap/libraries/openldap/version.rb +3 -3
  343. data/spec/data/cookbooks/openldap/metadata.rb +8 -8
  344. data/spec/data/cookbooks/openldap/recipes/default.rb +4 -4
  345. data/spec/data/cookbooks/openldap/recipes/gigantor.rb +3 -3
  346. data/spec/data/cookbooks/openldap/recipes/one.rb +15 -15
  347. data/spec/data/cookbooks/openldap/recipes/return.rb +2 -2
  348. data/spec/data/cookbooks/openldap/templates/default/helper_test.erb +1 -1
  349. data/spec/data/cookbooks/openldap/templates/default/helpers_via_partial_test.erb +1 -1
  350. data/spec/data/cookbooks/openldap/templates/default/no_windows_line_endings.erb +4 -4
  351. data/spec/data/cookbooks/openldap/templates/default/openldap_variable_stuff.conf.erb +1 -1
  352. data/spec/data/cookbooks/openldap/templates/default/test.erb +1 -1
  353. data/spec/data/cookbooks/preseed/files/default/preseed-file.seed +1 -1
  354. data/spec/data/cookbooks/preseed/files/default/preseed-template.seed +4 -4
  355. data/spec/data/cookbooks/preseed/metadata.rb +2 -2
  356. data/spec/data/cookbooks/preseed/templates/default/preseed-template-variables.seed +1 -1
  357. data/spec/data/cookbooks/preseed/templates/default/preseed-template.seed +1 -1
  358. data/spec/data/definitions/test.rb +4 -4
  359. data/spec/data/environment-config.rb +4 -4
  360. data/spec/data/file-providers-method-snapshot-chef-11-4.json +127 -127
  361. data/spec/data/fileedit/hosts +4 -4
  362. data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/README.md +4 -4
  363. data/spec/data/incomplete-metadata-chef-repo/incomplete-metadata/metadata.rb +13 -13
  364. data/spec/data/invalid-metadata-chef-repo/invalid-metadata/README.md +4 -4
  365. data/spec/data/kitchen/chefignore +6 -6
  366. data/spec/data/kitchen/openldap/attributes/default.rb +3 -3
  367. data/spec/data/kitchen/openldap/attributes/robinson.rb +2 -2
  368. data/spec/data/kitchen/openldap/definitions/client.rb +3 -3
  369. data/spec/data/kitchen/openldap/definitions/drewbarrymore.rb +2 -2
  370. data/spec/data/kitchen/openldap/recipes/gigantor.rb +2 -2
  371. data/spec/data/kitchen/openldap/recipes/ignoreme.rb +2 -2
  372. data/spec/data/kitchen/openldap/recipes/woot.rb +3 -3
  373. data/spec/data/knife_subcommand/test_explicit_category.rb +6 -6
  374. data/spec/data/knife_subcommand/test_name_mapping.rb +4 -4
  375. data/spec/data/knife_subcommand/test_yourself.rb +21 -21
  376. data/spec/data/lwrp/providers/inline_compiler.rb +26 -26
  377. data/spec/data/lwrp/providers/monkey_name_printer.rb +5 -5
  378. data/spec/data/lwrp/providers/paint_drying_watcher.rb +7 -7
  379. data/spec/data/lwrp/providers/thumb_twiddler.rb +7 -7
  380. data/spec/data/lwrp/resources/foo.rb +4 -4
  381. data/spec/data/lwrp/resources_with_default_attributes/nodeattr.rb +1 -1
  382. data/spec/data/lwrp_override/providers/buck_passer.rb +5 -5
  383. data/spec/data/mac_users/10.7-8.plist.xml +559 -559
  384. data/spec/data/mac_users/10.7-8.shadow.xml +11 -11
  385. data/spec/data/mac_users/10.7.plist.xml +559 -559
  386. data/spec/data/mac_users/10.7.shadow.xml +11 -11
  387. data/spec/data/mac_users/10.8.plist.xml +559 -559
  388. data/spec/data/mac_users/10.8.shadow.xml +21 -21
  389. data/spec/data/mac_users/10.9.plist.xml +560 -560
  390. data/spec/data/mac_users/10.9.shadow.xml +21 -21
  391. data/spec/data/metadata/quick_start/metadata.rb +19 -19
  392. data/spec/data/nodes/default.rb +15 -15
  393. data/spec/data/nodes/test.example.com.rb +17 -17
  394. data/spec/data/nodes/test.rb +15 -15
  395. data/spec/data/null_config.rb +1 -1
  396. data/spec/data/object_loader/environments/test.json +7 -7
  397. data/spec/data/object_loader/environments/test.rb +2 -2
  398. data/spec/data/object_loader/environments/test_json_class.json +8 -8
  399. data/spec/data/object_loader/nodes/test.json +7 -7
  400. data/spec/data/object_loader/nodes/test.rb +2 -2
  401. data/spec/data/object_loader/nodes/test_json_class.json +8 -8
  402. data/spec/data/object_loader/roles/test.json +7 -7
  403. data/spec/data/object_loader/roles/test.rb +2 -2
  404. data/spec/data/object_loader/roles/test_json_class.json +8 -8
  405. data/spec/data/partial_one.erb +1 -1
  406. data/spec/data/recipes/test.rb +7 -7
  407. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -4
  408. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -1
  409. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -2
  410. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -2
  411. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -1
  412. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -1
  413. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -3
  414. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -1
  415. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -2
  416. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -2
  417. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -1
  418. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -1
  419. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -2
  420. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -2
  421. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -3
  422. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -1
  423. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -2
  424. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -1
  425. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -1
  426. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -3
  427. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -1
  428. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -2
  429. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -1
  430. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -1
  431. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -3
  432. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -1
  433. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -1
  434. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -1
  435. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -3
  436. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -1
  437. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -2
  438. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -2
  439. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -1
  440. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -1
  441. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -3
  442. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -1
  443. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -1
  444. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -3
  445. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -1
  446. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -1
  447. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  448. data/spec/data/run_context/cookbooks/test/definitions/new_animals.rb +9 -9
  449. data/spec/data/run_context/cookbooks/test/definitions/new_cat.rb +5 -5
  450. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -1
  451. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -1
  452. data/spec/data/run_context/cookbooks/test/recipes/default.rb +5 -5
  453. data/spec/data/run_context/cookbooks/test/recipes/one.rb +7 -7
  454. data/spec/data/run_context/cookbooks/test/recipes/two.rb +7 -7
  455. data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -1
  456. data/spec/data/run_context/nodes/run_context.rb +5 -5
  457. data/spec/data/search_queries_to_transform.txt +98 -98
  458. data/spec/data/shef-config.rb +10 -10
  459. data/spec/data/ssl/5e707473.0 +18 -18
  460. data/spec/data/ssl/chef-rspec.cert +27 -27
  461. data/spec/data/ssl/chef-rspec.key +27 -27
  462. data/spec/data/ssl/key.pem +15 -15
  463. data/spec/data/ssl/private_key.pem +27 -27
  464. data/spec/data/ssl/private_key_with_whitespace.pem +32 -32
  465. data/spec/data/standalone_cookbook/chefignore +9 -9
  466. data/spec/data/standalone_cookbook/recipes/default.rb +2 -2
  467. data/spec/data/trusted_certs/example.crt +22 -22
  468. data/spec/data/trusted_certs/intermediate.pem +27 -27
  469. data/spec/data/trusted_certs/root.pem +22 -22
  470. data/spec/functional/assets/chefinittest +34 -34
  471. data/spec/functional/assets/testchefsubsys +10 -10
  472. data/spec/functional/provider/remote_file/cache_control_data_spec.rb +0 -0
  473. data/spec/functional/resource/aix_service_spec.rb +0 -0
  474. data/spec/functional/resource/aixinit_service_spec.rb +0 -0
  475. data/spec/functional/resource/chocolatey_package_spec.rb +0 -5
  476. data/spec/functional/resource/env_spec.rb +0 -0
  477. data/spec/functional/win32/registry_spec.rb +1 -0
  478. data/spec/integration/client/exit_code_spec.rb +245 -0
  479. data/spec/integration/knife/deps_spec.rb +7 -7
  480. data/spec/integration/knife/download_spec.rb +19 -0
  481. data/spec/integration/knife/list_spec.rb +0 -8
  482. data/spec/integration/knife/upload_spec.rb +21 -2
  483. data/spec/integration/solo/solo_spec.rb +1 -1
  484. data/spec/rcov.opts +2 -2
  485. data/spec/unit/application/apply_spec.rb +6 -4
  486. data/spec/unit/application/exit_code_spec.rb +231 -0
  487. data/spec/unit/application/solo_spec.rb +143 -88
  488. data/spec/unit/chef_fs/config_spec.rb +129 -0
  489. data/spec/unit/chef_fs/file_system/repository/base_file_spec.rb +8 -10
  490. data/spec/unit/client_spec.rb +1 -1
  491. data/spec/unit/config_fetcher_spec.rb +2 -2
  492. data/spec/unit/cookbook/synchronizer_spec.rb +1 -1
  493. data/spec/unit/data_bag_item_spec.rb +2 -2
  494. data/spec/unit/data_bag_spec.rb +2 -2
  495. data/spec/unit/data_collector/messages/helpers_spec.rb +190 -0
  496. data/spec/unit/data_collector/messages_spec.rb +207 -0
  497. data/spec/unit/data_collector_spec.rb +525 -0
  498. data/spec/unit/decorator/lazy_array_spec.rb +58 -0
  499. data/spec/unit/decorator/lazy_spec.rb +39 -0
  500. data/spec/unit/decorator_spec.rb +142 -0
  501. data/spec/unit/environment_spec.rb +4 -4
  502. data/spec/unit/handler_spec.rb +87 -0
  503. data/spec/unit/knife/cookbook_show_spec.rb +89 -90
  504. data/spec/unit/knife/ssl_check_spec.rb +16 -0
  505. data/spec/unit/policy_builder/dynamic_spec.rb +1 -1
  506. data/spec/unit/policy_builder/policyfile_spec.rb +1 -1
  507. data/spec/unit/provider/git_spec.rb +77 -18
  508. data/spec/unit/provider/package/apt_spec.rb +97 -34
  509. data/spec/unit/provider/package/chocolatey_spec.rb +3 -15
  510. data/spec/unit/provider/package/portage_spec.rb +6 -0
  511. data/spec/unit/provider/package/rubygems_spec.rb +38 -4
  512. data/spec/unit/provider/package/yum/yum_cache_spec.rb +27 -0
  513. data/spec/unit/provider/package_spec.rb +20 -7
  514. data/spec/unit/provider/systemd_unit_spec.rb +885 -0
  515. data/spec/unit/resource/systemd_unit_spec.rb +133 -0
  516. data/spec/unit/resource_builder_spec.rb +1 -1
  517. data/tasks/bin/bundle-platform +6 -2
  518. data/tasks/bin/bundle-platform.bat +0 -0
  519. data/tasks/bin/create-override-gemfile +0 -0
  520. data/tasks/bin/run_external_test +0 -0
  521. data/tasks/bundle_util.rb +18 -2
  522. data/tasks/changelog.rb +1 -0
  523. data/tasks/dependencies.rb +47 -57
  524. metadata +847 -7
  525. data/tasks/bin/run_chef_tests +0 -17
@@ -17,132 +17,64 @@
17
17
  #
18
18
 
19
19
  require "chef/provider/package"
20
- require "chef/mixin/command"
21
- require "chef/resource/package"
20
+ require "chef/resource/apt_package"
22
21
 
23
22
  class Chef
24
23
  class Provider
25
24
  class Package
26
25
  class Apt < Chef::Provider::Package
26
+ use_multipackage_api
27
27
 
28
28
  provides :package, platform_family: "debian"
29
29
  provides :apt_package, os: "linux"
30
30
 
31
- # return [Hash] mapping of package name to Boolean value
32
- attr_accessor :is_virtual_package
33
-
34
31
  def initialize(new_resource, run_context)
35
32
  super
36
- @is_virtual_package = {}
37
33
  end
38
34
 
39
35
  def load_current_resource
40
- @current_resource = Chef::Resource::Package.new(@new_resource.name)
41
- @current_resource.package_name(@new_resource.package_name)
42
- check_all_packages_state(@new_resource.package_name)
43
- @current_resource
36
+ @current_resource = Chef::Resource::AptPackage.new(new_resource.name)
37
+ current_resource.package_name(new_resource.package_name)
38
+ current_resource.version(get_current_versions)
39
+ current_resource
44
40
  end
45
41
 
46
42
  def define_resource_requirements
47
43
  super
48
44
 
49
45
  requirements.assert(:all_actions) do |a|
50
- a.assertion { !@new_resource.source }
46
+ a.assertion { !new_resource.source }
51
47
  a.failure_message(Chef::Exceptions::Package, "apt package provider cannot handle source attribute. Use dpkg provider instead")
52
48
  end
53
49
  end
54
50
 
55
- def default_release_options
56
- # Use apt::Default-Release option only if provider supports it
57
- "-o APT::Default-Release=#{@new_resource.default_release}" if @new_resource.respond_to?(:default_release) && @new_resource.default_release
51
+ def package_data
52
+ @package_data ||= Hash.new do |hash, key|
53
+ hash[key] = package_data_for(key)
54
+ end
58
55
  end
59
56
 
60
- def check_package_state(pkg)
61
- is_virtual_package = false
62
- installed = false
63
- installed_version = nil
64
- candidate_version = nil
65
-
66
- shell_out_with_timeout!("apt-cache#{expand_options(default_release_options)} policy #{pkg}").stdout.each_line do |line|
67
- case line
68
- when /^\s{2}Installed: (.+)$/
69
- installed_version = $1
70
- if installed_version == "(none)"
71
- Chef::Log.debug("#{@new_resource} current version is nil")
72
- installed_version = nil
73
- else
74
- Chef::Log.debug("#{@new_resource} current version is #{installed_version}")
75
- installed = true
76
- end
77
- when /^\s{2}Candidate: (.+)$/
78
- candidate_version = $1
79
- if candidate_version == "(none)"
80
- # This may not be an appropriate assumption, but it shouldn't break anything that already worked -- btm
81
- is_virtual_package = true
82
- showpkg = shell_out_with_timeout!("apt-cache showpkg #{pkg}").stdout
83
- providers = Hash.new
84
- showpkg.rpartition(/Reverse Provides: ?#{$/}/)[2].each_line do |line|
85
- provider, version = line.split
86
- providers[provider] = version
87
- end
88
- # Check if the package providing this virtual package is installed
89
- num_providers = providers.length
90
- raise Chef::Exceptions::Package, "#{@new_resource.package_name} has no candidate in the apt-cache" if num_providers == 0
91
- # apt will only install a virtual package if there is a single providing package
92
- raise Chef::Exceptions::Package, "#{@new_resource.package_name} is a virtual package provided by #{num_providers} packages, you must explicitly select one to install" if num_providers > 1
93
- # Check if the package providing this virtual package is installed
94
- Chef::Log.info("#{@new_resource} is a virtual package, actually acting on package[#{providers.keys.first}]")
95
- ret = check_package_state(providers.keys.first)
96
- installed = ret[:installed]
97
- installed_version = ret[:installed_version]
98
- else
99
- Chef::Log.debug("#{@new_resource} candidate version is #{$1}")
100
- end
101
- end
57
+ def get_current_versions
58
+ package_name_array.map do |package_name|
59
+ package_data[package_name][:current_version]
102
60
  end
103
-
104
- return {
105
- installed_version: installed_version,
106
- installed: installed,
107
- candidate_version: candidate_version,
108
- is_virtual_package: is_virtual_package,
109
- }
110
61
  end
111
62
 
112
- def check_all_packages_state(package)
113
- installed_version = {}
114
- candidate_version = {}
115
- installed = {}
116
-
117
- [package].flatten.each do |pkg|
118
- ret = check_package_state(pkg)
119
- is_virtual_package[pkg] = ret[:is_virtual_package]
120
- installed[pkg] = ret[:installed]
121
- installed_version[pkg] = ret[:installed_version]
122
- candidate_version[pkg] = ret[:candidate_version]
63
+ def get_candidate_versions
64
+ package_name_array.map do |package_name|
65
+ package_data[package_name][:candidate_version]
123
66
  end
67
+ end
124
68
 
125
- if package.is_a?(Array)
126
- @candidate_version = []
127
- final_installed_version = []
128
- [package].flatten.each do |pkg|
129
- @candidate_version << candidate_version[pkg]
130
- final_installed_version << installed_version[pkg]
131
- end
132
- @current_resource.version(final_installed_version)
133
- else
134
- @candidate_version = candidate_version[package]
135
- @current_resource.version(installed_version[package])
136
- end
69
+ def candidate_version
70
+ @candidate_version ||= get_candidate_versions
137
71
  end
138
72
 
139
73
  def install_package(name, version)
140
- name_array = [ name ].flatten
141
- version_array = [ version ].flatten
142
- package_name = name_array.zip(version_array).map do |n, v|
143
- is_virtual_package[n] ? n : "#{n}=#{v}"
144
- end.join(" ")
145
- run_noninteractive("apt-get -q -y#{expand_options(default_release_options)}#{expand_options(@new_resource.options)} install #{package_name}")
74
+ package_name = name.zip(version).map do |n, v|
75
+ package_data[n][:virtual] ? n : "#{n}=#{v}"
76
+ end
77
+ run_noninteractive("apt-get -q -y", default_release_options, new_resource.options, "install", package_name)
146
78
  end
147
79
 
148
80
  def upgrade_package(name, version)
@@ -150,24 +82,27 @@ class Chef
150
82
  end
151
83
 
152
84
  def remove_package(name, version)
153
- package_name = [ name ].flatten.join(" ")
154
- run_noninteractive("apt-get -q -y#{expand_options(@new_resource.options)} remove #{package_name}")
85
+ package_name = name.map do |n|
86
+ package_data[n][:virtual] ? resolve_virtual_package_name(n) : n
87
+ end
88
+ run_noninteractive("apt-get -q -y", new_resource.options, "remove", package_name)
155
89
  end
156
90
 
157
91
  def purge_package(name, version)
158
- package_name = [ name ].flatten.join(" ")
159
- run_noninteractive("apt-get -q -y#{expand_options(@new_resource.options)} purge #{package_name}")
92
+ package_name = name.map do |n|
93
+ package_data[n][:virtual] ? resolve_virtual_package_name(n) : n
94
+ end
95
+ run_noninteractive("apt-get -q -y", new_resource.options, "purge", package_name)
160
96
  end
161
97
 
162
98
  def preseed_package(preseed_file)
163
- Chef::Log.info("#{@new_resource} pre-seeding package installation instructions")
164
- run_noninteractive("debconf-set-selections #{preseed_file}")
99
+ Chef::Log.info("#{new_resource} pre-seeding package installation instructions")
100
+ run_noninteractive("debconf-set-selections", preseed_file)
165
101
  end
166
102
 
167
103
  def reconfig_package(name, version)
168
- package_name = [ name ].flatten.join(" ")
169
- Chef::Log.info("#{@new_resource} reconfiguring")
170
- run_noninteractive("dpkg-reconfigure #{package_name}")
104
+ Chef::Log.info("#{new_resource} reconfiguring")
105
+ run_noninteractive("dpkg-reconfigure", name)
171
106
  end
172
107
 
173
108
  private
@@ -175,8 +110,67 @@ class Chef
175
110
  # Runs command via shell_out with magic environment to disable
176
111
  # interactive prompts. Command is run with default localization rather
177
112
  # than forcing locale to "C", so command output may not be stable.
178
- def run_noninteractive(command)
179
- shell_out_with_timeout!(command, :env => { "DEBIAN_FRONTEND" => "noninteractive", "LC_ALL" => nil })
113
+ def run_noninteractive(*args)
114
+ shell_out_with_timeout!(a_to_s(*args), :env => { "DEBIAN_FRONTEND" => "noninteractive" })
115
+ end
116
+
117
+ def default_release_options
118
+ # Use apt::Default-Release option only if provider supports it
119
+ "-o APT::Default-Release=#{new_resource.default_release}" if new_resource.respond_to?(:default_release) && new_resource.default_release
120
+ end
121
+
122
+ def resolve_package_versions(pkg)
123
+ current_version = nil
124
+ candidate_version = nil
125
+ run_noninteractive("apt-cache", default_release_options, "policy", pkg).stdout.each_line do |line|
126
+ case line
127
+ when /^\s{2}Installed: (.+)$/
128
+ current_version = ( $1 != "(none)" ) ? $1 : nil
129
+ Chef::Log.debug("#{new_resource} installed version for #{pkg} is #{$1}")
130
+ when /^\s{2}Candidate: (.+)$/
131
+ candidate_version = ( $1 != "(none)" ) ? $1 : nil
132
+ Chef::Log.debug("#{new_resource} candidate version for #{pkg} is #{$1}")
133
+ end
134
+ end
135
+ [ current_version, candidate_version ]
136
+ end
137
+
138
+ def resolve_virtual_package_name(pkg)
139
+ showpkg = run_noninteractive("apt-cache showpkg", pkg).stdout
140
+ partitions = showpkg.rpartition(/Reverse Provides: ?#{$/}/)
141
+ return nil if partitions[0] == "" && partitions[1] == "" # not found in output
142
+ set = partitions[2].lines.each_with_object(Set.new) do |line, acc|
143
+ # there may be multiple reverse provides for a single package
144
+ acc.add(line.split[0])
145
+ end
146
+ if set.size > 1
147
+ raise Chef::Exceptions::Package, "#{new_resource.package_name} is a virtual package provided by multiple packages, you must explicitly select one"
148
+ end
149
+ return set.to_a.first
150
+ end
151
+
152
+ def package_data_for(pkg)
153
+ virtual = false
154
+ current_version = nil
155
+ candidate_version = nil
156
+
157
+ current_version, candidate_version = resolve_package_versions(pkg)
158
+
159
+ if candidate_version.nil?
160
+ newpkg = resolve_virtual_package_name(pkg)
161
+
162
+ if newpkg
163
+ virtual = true
164
+ Chef::Log.info("#{new_resource} is a virtual package, actually acting on package[#{newpkg}]")
165
+ current_version, candidate_version = resolve_package_versions(newpkg)
166
+ end
167
+ end
168
+
169
+ return {
170
+ current_version: current_version,
171
+ candidate_version: candidate_version,
172
+ virtual: virtual,
173
+ }
180
174
  end
181
175
 
182
176
  end
@@ -229,13 +229,11 @@ EOS
229
229
  def available_packages
230
230
  @available_packages ||=
231
231
  begin
232
- cmd = [ "list -ar #{package_name_array.join ' '}" ]
232
+ cmd = [ "list -r #{package_name_array.join ' '}" ]
233
233
  cmd.push( "-source #{new_resource.source}" ) if new_resource.source
234
- parse_list_output(*cmd).each_with_object({}) do |name_version, available|
235
- name, version = name_version
236
- if desired_name_versions[name].nil? || desired_name_versions[name] == version
237
- available[name] = version
238
- end
234
+ raw = parse_list_output(*cmd)
235
+ raw.keys.each_with_object({}) do |name, available|
236
+ available[name] = desired_name_versions[name] || raw[name]
239
237
  end
240
238
  end
241
239
  end
@@ -252,14 +250,15 @@ EOS
252
250
  # (names are downcased for case-insenstive matching)
253
251
  #
254
252
  # @param cmd [String] command to run
255
- # @return [Array] list output converted to ruby Hash
253
+ # @return [Hash] list output converted to ruby Hash
256
254
  def parse_list_output(*args)
257
- list = []
255
+ hash = {}
258
256
  choco_command(*args).stdout.each_line do |line|
257
+ next if line.start_with?("Chocolatey v")
259
258
  name, version = line.split("|")
260
- list << [ name.downcase, version.chomp ]
259
+ hash[name.downcase] = version.chomp
261
260
  end
262
- list
261
+ hash
263
262
  end
264
263
 
265
264
  # Helper to downcase all names in an array
@@ -23,9 +23,9 @@ class Chef
23
23
  class Provider
24
24
  class Package
25
25
  class Dpkg < Chef::Provider::Package
26
- DPKG_REMOVED = /^Status: deinstall ok config-files/
26
+ DPKG_REMOVED = /^Status: deinstall ok config-files/
27
27
  DPKG_INSTALLED = /^Status: install ok installed/
28
- DPKG_VERSION = /^Version: (.+)$/
28
+ DPKG_VERSION = /^Version: (.+)$/
29
29
 
30
30
  provides :dpkg_package, os: "linux"
31
31
 
@@ -41,7 +41,7 @@ class Chef
41
41
  globsafe_pkg = Chef::Util::PathHelper.escape_glob_dir(pkg)
42
42
  possibilities = Dir["/var/db/pkg/#{globsafe_category || "*"}/#{globsafe_pkg}-*"].map { |d| d.sub(%r{/var/db/pkg/}, "") }
43
43
  versions = possibilities.map do |entry|
44
- if entry =~ %r{[^/]+/#{Regexp.escape(pkg)}\-(\d[\.\d]*((_(alpha|beta|pre|rc|p)\d*)*)?(-r\d+)?)}
44
+ if entry =~ %r{[^/]+/#{Regexp.escape(pkg)}\-(\d[\.\d]*[a-z]?((_(alpha|beta|pre|rc|p)\d*)*)?(-r\d+)?)}
45
45
  [$&, $1]
46
46
  end
47
47
  end.compact
@@ -482,20 +482,16 @@ class Chef
482
482
 
483
483
  def candidate_version
484
484
  @candidate_version ||= begin
485
- if target_version_already_installed?(@current_resource.version, @new_resource.version)
486
- nil
487
- elsif source_is_remote?
488
- @gem_env.candidate_version_from_remote(gem_dependency, *gem_sources).to_s
489
- else
490
- @gem_env.candidate_version_from_file(gem_dependency, @new_resource.source).to_s
491
- end
492
- end
485
+ if source_is_remote?
486
+ @gem_env.candidate_version_from_remote(gem_dependency, *gem_sources).to_s
487
+ else
488
+ @gem_env.candidate_version_from_file(gem_dependency, @new_resource.source).to_s
489
+ end
490
+ end
493
491
  end
494
492
 
495
- def target_version_already_installed?(current_version, new_version)
496
- return false unless current_version
497
- return false if new_version.nil?
498
-
493
+ def version_requirement_satisfied?(current_version, new_version)
494
+ return false unless current_version && new_version
499
495
  Gem::Requirement.new(new_version).satisfied_by?(Gem::Version.new(current_version))
500
496
  end
501
497
 
@@ -18,10 +18,10 @@
18
18
 
19
19
  require "chef/config"
20
20
  require "chef/provider/package"
21
- require "chef/mixin/which"
22
- require "chef/resource/package"
23
- require "singleton"
21
+ require "chef/resource/yum_package"
24
22
  require "chef/mixin/get_source_from_package"
23
+ require "chef/provider/package/yum/rpm_utils"
24
+ require "chef/provider/package/yum/yum_cache"
25
25
 
26
26
  class Chef
27
27
  class Provider
@@ -31,961 +31,6 @@ class Chef
31
31
  provides :package, platform_family: %w{rhel fedora}
32
32
  provides :yum_package, os: "linux"
33
33
 
34
- class RPMUtils
35
- class << self
36
-
37
- # RPM::Version version_parse equivalent
38
- def version_parse(evr)
39
- return if evr.nil?
40
-
41
- epoch = nil
42
- # assume this is a version
43
- version = evr
44
- release = nil
45
-
46
- lead = 0
47
- tail = evr.size
48
-
49
- if evr =~ %r{^([\d]+):}
50
- epoch = $1.to_i
51
- lead = $1.length + 1
52
- elsif evr[0].ord == ":".ord
53
- epoch = 0
54
- lead = 1
55
- end
56
-
57
- if evr =~ %r{:?.*-(.*)$}
58
- release = $1
59
- tail = evr.length - release.length - lead - 1
60
-
61
- if release.empty?
62
- release = nil
63
- end
64
- end
65
-
66
- version = evr[lead, tail]
67
- if version.empty?
68
- version = nil
69
- end
70
-
71
- [ epoch, version, release ]
72
- end
73
-
74
- # verify
75
- def isalnum(x)
76
- isalpha(x) || isdigit(x)
77
- end
78
-
79
- def isalpha(x)
80
- v = x.ord
81
- (v >= 65 && v <= 90) || (v >= 97 && v <= 122)
82
- end
83
-
84
- def isdigit(x)
85
- v = x.ord
86
- v >= 48 && v <= 57
87
- end
88
-
89
- # based on the reference spec in lib/rpmvercmp.c in rpm 4.9.0
90
- def rpmvercmp(x, y)
91
- # easy! :)
92
- return 0 if x == y
93
-
94
- if x.nil?
95
- x = ""
96
- end
97
-
98
- if y.nil?
99
- y = ""
100
- end
101
-
102
- # not so easy :(
103
- #
104
- # takes 2 strings like
105
- #
106
- # x = "1.20.b18.el5"
107
- # y = "1.20.b17.el5"
108
- #
109
- # breaks into purely alpha and numeric segments and compares them using
110
- # some rules
111
- #
112
- # * 10 > 1
113
- # * 1 > a
114
- # * z > a
115
- # * Z > A
116
- # * z > Z
117
- # * leading zeros are ignored
118
- # * separators (periods, commas) are ignored
119
- # * "1.20.b18.el5.extrastuff" > "1.20.b18.el5"
120
-
121
- x_pos = 0 # overall string element reference position
122
- x_pos_max = x.length - 1 # number of elements in string, starting from 0
123
- x_seg_pos = 0 # segment string element reference position
124
- x_comp = nil # segment to compare
125
-
126
- y_pos = 0
127
- y_seg_pos = 0
128
- y_pos_max = y.length - 1
129
- y_comp = nil
130
-
131
- while x_pos <= x_pos_max && y_pos <= y_pos_max
132
- # first we skip over anything non alphanumeric
133
- while (x_pos <= x_pos_max) && (isalnum(x[x_pos]) == false)
134
- x_pos += 1 # +1 over pos_max if end of string
135
- end
136
- while (y_pos <= y_pos_max) && (isalnum(y[y_pos]) == false)
137
- y_pos += 1
138
- end
139
-
140
- # if we hit the end of either we are done matching segments
141
- if (x_pos == x_pos_max + 1) || (y_pos == y_pos_max + 1)
142
- break
143
- end
144
-
145
- # we are now at the start of a alpha or numeric segment
146
- x_seg_pos = x_pos
147
- y_seg_pos = y_pos
148
-
149
- # grab segment so we can compare them
150
- if isdigit(x[x_seg_pos].ord)
151
- x_seg_is_num = true
152
-
153
- # already know it's a digit
154
- x_seg_pos += 1
155
-
156
- # gather up our digits
157
- while (x_seg_pos <= x_pos_max) && isdigit(x[x_seg_pos])
158
- x_seg_pos += 1
159
- end
160
- # copy the segment but not the unmatched character that x_seg_pos will
161
- # refer to
162
- x_comp = x[x_pos, x_seg_pos - x_pos]
163
-
164
- while (y_seg_pos <= y_pos_max) && isdigit(y[y_seg_pos])
165
- y_seg_pos += 1
166
- end
167
- y_comp = y[y_pos, y_seg_pos - y_pos]
168
- else
169
- # we are comparing strings
170
- x_seg_is_num = false
171
-
172
- while (x_seg_pos <= x_pos_max) && isalpha(x[x_seg_pos])
173
- x_seg_pos += 1
174
- end
175
- x_comp = x[x_pos, x_seg_pos - x_pos]
176
-
177
- while (y_seg_pos <= y_pos_max) && isalpha(y[y_seg_pos])
178
- y_seg_pos += 1
179
- end
180
- y_comp = y[y_pos, y_seg_pos - y_pos]
181
- end
182
-
183
- # if y_seg_pos didn't advance in the above loop it means the segments are
184
- # different types
185
- if y_pos == y_seg_pos
186
- # numbers always win over letters
187
- return x_seg_is_num ? 1 : -1
188
- end
189
-
190
- # move the ball forward before we mess with the segments
191
- x_pos += x_comp.length # +1 over pos_max if end of string
192
- y_pos += y_comp.length
193
-
194
- # we are comparing numbers - simply convert them
195
- if x_seg_is_num
196
- x_comp = x_comp.to_i
197
- y_comp = y_comp.to_i
198
- end
199
-
200
- # compares ints or strings
201
- # don't return if equal - try the next segment
202
- if x_comp > y_comp
203
- return 1
204
- elsif x_comp < y_comp
205
- return -1
206
- end
207
-
208
- # if we've reached here than the segments are the same - try again
209
- end
210
-
211
- # we must have reached the end of one or both of the strings and they
212
- # matched up until this point
213
-
214
- # segments matched completely but the segment separators were different -
215
- # rpm reference code treats these as equal.
216
- if (x_pos == x_pos_max + 1) && (y_pos == y_pos_max + 1)
217
- return 0
218
- end
219
-
220
- # the most unprocessed characters left wins
221
- if (x_pos_max - x_pos) > (y_pos_max - y_pos)
222
- return 1
223
- else
224
- return -1
225
- end
226
- end
227
-
228
- end # self
229
- end # RPMUtils
230
-
231
- class RPMVersion
232
- include Comparable
233
-
234
- def initialize(*args)
235
- if args.size == 1
236
- @e, @v, @r = RPMUtils.version_parse(args[0])
237
- elsif args.size == 3
238
- @e = args[0].to_i
239
- @v = args[1]
240
- @r = args[2]
241
- else
242
- raise ArgumentError, "Expecting either 'epoch-version-release' or 'epoch, " +
243
- "version, release'"
244
- end
245
- end
246
- attr_reader :e, :v, :r
247
- alias :epoch :e
248
- alias :version :v
249
- alias :release :r
250
-
251
- def self.parse(*args)
252
- self.new(*args)
253
- end
254
-
255
- def <=>(y)
256
- compare_versions(y)
257
- end
258
-
259
- def compare(y)
260
- compare_versions(y, false)
261
- end
262
-
263
- def partial_compare(y)
264
- compare_versions(y, true)
265
- end
266
-
267
- # RPM::Version rpm_version_to_s equivalent
268
- def to_s
269
- if @r.nil?
270
- @v
271
- else
272
- "#{@v}-#{@r}"
273
- end
274
- end
275
-
276
- def evr
277
- "#{@e}:#{@v}-#{@r}"
278
- end
279
-
280
- private
281
-
282
- # Rough RPM::Version rpm_version_cmp equivalent - except much slower :)
283
- #
284
- # partial lets epoch and version segment equality be good enough to return equal, eg:
285
- #
286
- # 2:1.2-1 == 2:1.2
287
- # 2:1.2-1 == 2:
288
- #
289
- def compare_versions(y, partial = false)
290
- x = self
291
-
292
- # compare epoch
293
- if (x.e.nil? == false && x.e > 0) && y.e.nil?
294
- return 1
295
- elsif x.e.nil? && (y.e.nil? == false && y.e > 0)
296
- return -1
297
- elsif x.e.nil? == false && y.e.nil? == false
298
- if x.e < y.e
299
- return -1
300
- elsif x.e > y.e
301
- return 1
302
- end
303
- end
304
-
305
- # compare version
306
- if partial && (x.v.nil? || y.v.nil?)
307
- return 0
308
- elsif x.v.nil? == false && y.v.nil?
309
- return 1
310
- elsif x.v.nil? && y.v.nil? == false
311
- return -1
312
- elsif x.v.nil? == false && y.v.nil? == false
313
- cmp = RPMUtils.rpmvercmp(x.v, y.v)
314
- return cmp if cmp != 0
315
- end
316
-
317
- # compare release
318
- if partial && (x.r.nil? || y.r.nil?)
319
- return 0
320
- elsif x.r.nil? == false && y.r.nil?
321
- return 1
322
- elsif x.r.nil? && y.r.nil? == false
323
- return -1
324
- elsif x.r.nil? == false && y.r.nil? == false
325
- cmp = RPMUtils.rpmvercmp(x.r, y.r)
326
- return cmp
327
- end
328
-
329
- return 0
330
- end
331
- end
332
-
333
- class RPMPackage
334
- include Comparable
335
-
336
- def initialize(*args)
337
- if args.size == 4
338
- @n = args[0]
339
- @version = RPMVersion.new(args[1])
340
- @a = args[2]
341
- @provides = args[3]
342
- elsif args.size == 6
343
- @n = args[0]
344
- e = args[1].to_i
345
- v = args[2]
346
- r = args[3]
347
- @version = RPMVersion.new(e, v, r)
348
- @a = args[4]
349
- @provides = args[5]
350
- else
351
- raise ArgumentError, "Expecting either 'name, epoch-version-release, arch, provides' " +
352
- "or 'name, epoch, version, release, arch, provides'"
353
- end
354
-
355
- # We always have one, ourselves!
356
- if @provides.empty?
357
- @provides = [ RPMProvide.new(@n, @version.evr, :==) ]
358
- end
359
- end
360
- attr_reader :n, :a, :version, :provides
361
- alias :name :n
362
- alias :arch :a
363
-
364
- def <=>(y)
365
- compare(y)
366
- end
367
-
368
- def compare(y)
369
- x = self
370
-
371
- # easy! :)
372
- return 0 if x.nevra == y.nevra
373
-
374
- # compare name
375
- if x.n.nil? == false && y.n.nil?
376
- return 1
377
- elsif x.n.nil? && y.n.nil? == false
378
- return -1
379
- elsif x.n.nil? == false && y.n.nil? == false
380
- if x.n < y.n
381
- return -1
382
- elsif x.n > y.n
383
- return 1
384
- end
385
- end
386
-
387
- # compare version
388
- if x.version > y.version
389
- return 1
390
- elsif x.version < y.version
391
- return -1
392
- end
393
-
394
- # compare arch
395
- if x.a.nil? == false && y.a.nil?
396
- return 1
397
- elsif x.a.nil? && y.a.nil? == false
398
- return -1
399
- elsif x.a.nil? == false && y.a.nil? == false
400
- if x.a < y.a
401
- return -1
402
- elsif x.a > y.a
403
- return 1
404
- end
405
- end
406
-
407
- return 0
408
- end
409
-
410
- def to_s
411
- nevra
412
- end
413
-
414
- def nevra
415
- "#{@n}-#{@version.evr}.#{@a}"
416
- end
417
- end
418
-
419
- # Simple implementation from rpm and ruby-rpm reference code
420
- class RPMDependency
421
- def initialize(*args)
422
- if args.size == 3
423
- @name = args[0]
424
- @version = RPMVersion.new(args[1])
425
- # Our requirement to other dependencies
426
- @flag = args[2] || :==
427
- elsif args.size == 5
428
- @name = args[0]
429
- e = args[1].to_i
430
- v = args[2]
431
- r = args[3]
432
- @version = RPMVersion.new(e, v, r)
433
- @flag = args[4] || :==
434
- else
435
- raise ArgumentError, "Expecting either 'name, epoch-version-release, flag' or " +
436
- "'name, epoch, version, release, flag'"
437
- end
438
- end
439
- attr_reader :name, :version, :flag
440
-
441
- # Parses 2 forms:
442
- #
443
- # "mtr >= 2:0.71-3.0"
444
- # "mta"
445
- def self.parse(string)
446
- if string =~ %r{^(\S+)\s+(>|>=|=|==|<=|<)\s+(\S+)$}
447
- name = $1
448
- if $2 == "="
449
- flag = :==
450
- else
451
- flag = :"#{$2}"
452
- end
453
- version = $3
454
-
455
- return self.new(name, version, flag)
456
- else
457
- name = string
458
- return self.new(name, nil, nil)
459
- end
460
- end
461
-
462
- # Test if another RPMDependency satisfies our requirements
463
- def satisfy?(y)
464
- unless y.kind_of?(RPMDependency)
465
- raise ArgumentError, "Expecting an RPMDependency object"
466
- end
467
-
468
- x = self
469
-
470
- # Easy!
471
- if x.name != y.name
472
- return false
473
- end
474
-
475
- # Partial compare
476
- #
477
- # eg: x.version 2.3 == y.version 2.3-1
478
- sense = x.version.partial_compare(y.version)
479
-
480
- # Thanks to rpmdsCompare() rpmds.c
481
- if (sense < 0) && ((x.flag == :> || x.flag == :>=) || (y.flag == :<= || y.flag == :<))
482
- return true
483
- elsif (sense > 0) && ((x.flag == :< || x.flag == :<=) || (y.flag == :>= || y.flag == :>))
484
- return true
485
- elsif sense == 0 && (
486
- ((x.flag == :== || x.flag == :<= || x.flag == :>=) && (y.flag == :== || y.flag == :<= || y.flag == :>=)) ||
487
- (x.flag == :< && y.flag == :<) ||
488
- (x.flag == :> && y.flag == :>)
489
- )
490
- return true
491
- end
492
-
493
- return false
494
- end
495
- end
496
-
497
- class RPMProvide < RPMDependency; end
498
- class RPMRequire < RPMDependency; end
499
-
500
- class RPMDbPackage < RPMPackage
501
- # <rpm parts>, installed, available
502
- def initialize(*args)
503
- @repoid = args.pop
504
- # state
505
- @available = args.pop
506
- @installed = args.pop
507
- super(*args)
508
- end
509
- attr_reader :repoid, :available, :installed
510
- end
511
-
512
- # Simple storage for RPMPackage objects - keeps them unique and sorted
513
- class RPMDb
514
- def initialize
515
- # package name => [ RPMPackage, RPMPackage ] of different versions
516
- @rpms = Hash.new
517
- # package nevra => RPMPackage for lookups
518
- @index = Hash.new
519
- # provide name (aka feature) => [RPMPackage, RPMPackage] each providing this feature
520
- @provides = Hash.new
521
- # RPMPackages listed as available
522
- @available = Set.new
523
- # RPMPackages listed as installed
524
- @installed = Set.new
525
- end
526
-
527
- def [](package_name)
528
- self.lookup(package_name)
529
- end
530
-
531
- # Lookup package_name and return a descending array of package objects
532
- def lookup(package_name)
533
- pkgs = @rpms[package_name]
534
- if pkgs
535
- return pkgs.sort.reverse
536
- else
537
- return nil
538
- end
539
- end
540
-
541
- def lookup_provides(provide_name)
542
- @provides[provide_name]
543
- end
544
-
545
- # Using the package name as a key, and nevra for an index, keep a unique list of packages.
546
- # The available/installed state can be overwritten for existing packages.
547
- def push(*args)
548
- args.flatten.each do |new_rpm|
549
- unless new_rpm.kind_of?(RPMDbPackage)
550
- raise ArgumentError, "Expecting an RPMDbPackage object"
551
- end
552
-
553
- @rpms[new_rpm.n] ||= Array.new
554
-
555
- # we may already have this one, like when the installed list is refreshed
556
- idx = @index[new_rpm.nevra]
557
- if idx
558
- # grab the existing package if it's not
559
- curr_rpm = idx
560
- else
561
- @rpms[new_rpm.n] << new_rpm
562
-
563
- new_rpm.provides.each do |provide|
564
- @provides[provide.name] ||= Array.new
565
- @provides[provide.name] << new_rpm
566
- end
567
-
568
- curr_rpm = new_rpm
569
- end
570
-
571
- # Track the nevra -> RPMPackage association to avoid having to compare versions
572
- # with @rpms[new_rpm.n] on the next round
573
- @index[new_rpm.nevra] = curr_rpm
574
-
575
- # these are overwritten for existing packages
576
- if new_rpm.available
577
- @available << curr_rpm
578
- end
579
- if new_rpm.installed
580
- @installed << curr_rpm
581
- end
582
- end
583
- end
584
-
585
- def <<(*args)
586
- self.push(args)
587
- end
588
-
589
- def clear
590
- @rpms.clear
591
- @index.clear
592
- @provides.clear
593
- clear_available
594
- clear_installed
595
- end
596
-
597
- def clear_available
598
- @available.clear
599
- end
600
-
601
- def clear_installed
602
- @installed.clear
603
- end
604
-
605
- def size
606
- @rpms.size
607
- end
608
- alias :length :size
609
-
610
- def available_size
611
- @available.size
612
- end
613
-
614
- def installed_size
615
- @installed.size
616
- end
617
-
618
- def available?(package)
619
- @available.include?(package)
620
- end
621
-
622
- def installed?(package)
623
- @installed.include?(package)
624
- end
625
-
626
- def whatprovides(rpmdep)
627
- unless rpmdep.kind_of?(RPMDependency)
628
- raise ArgumentError, "Expecting an RPMDependency object"
629
- end
630
-
631
- what = []
632
-
633
- packages = lookup_provides(rpmdep.name)
634
- if packages
635
- packages.each do |pkg|
636
- pkg.provides.each do |provide|
637
- if provide.satisfy?(rpmdep)
638
- what << pkg
639
- end
640
- end
641
- end
642
- end
643
-
644
- return what
645
- end
646
- end
647
-
648
- # Cache for our installed and available packages, pulled in from yum-dump.py
649
- class YumCache
650
- include Chef::Mixin::Which
651
- include Chef::Mixin::ShellOut
652
- include Singleton
653
-
654
- attr_accessor :yum_binary
655
-
656
- def initialize
657
- @rpmdb = RPMDb.new
658
-
659
- # Next time @rpmdb is accessed:
660
- # :all - Trigger a run of "yum-dump.py --options --installed-provides", updates
661
- # yum's cache and parses options from /etc/yum.conf. Pulls in Provides
662
- # dependency data for installed packages only - this data is slow to
663
- # gather.
664
- # :provides - Same as :all but pulls in Provides data for available packages as well.
665
- # Used as a last resort when we can't find a Provides match.
666
- # :installed - Trigger a run of "yum-dump.py --installed", only reads the local rpm
667
- # db. Used between client runs for a quick refresh.
668
- # :none - Do nothing, a call to one of the reload methods is required.
669
- @next_refresh = :all
670
-
671
- @allow_multi_install = []
672
-
673
- @extra_repo_control = nil
674
-
675
- # these are for subsequent runs if we are on an interval
676
- Chef::Client.when_run_starts do
677
- YumCache.instance.reload
678
- end
679
- end
680
-
681
- attr_reader :extra_repo_control
682
-
683
- # Cache management
684
- #
685
-
686
- def refresh
687
- case @next_refresh
688
- when :none
689
- return nil
690
- when :installed
691
- reset_installed
692
- # fast
693
- opts = " --installed"
694
- when :all
695
- reset
696
- # medium
697
- opts = " --options --installed-provides"
698
- when :provides
699
- reset
700
- # slow!
701
- opts = " --options --all-provides"
702
- else
703
- raise ArgumentError, "Unexpected value in next_refresh: #{@next_refresh}"
704
- end
705
-
706
- if @extra_repo_control
707
- opts << " #{@extra_repo_control}"
708
- end
709
-
710
- opts << " --yum-lock-timeout #{Chef::Config[:yum_lock_timeout]}"
711
-
712
- one_line = false
713
- error = nil
714
-
715
- helper = ::File.join(::File.dirname(__FILE__), "yum-dump.py")
716
- status = nil
717
-
718
- begin
719
- status = shell_out!("#{python_bin} #{helper}#{opts}", :timeout => Chef::Config[:yum_timeout])
720
- status.stdout.each_line do |line|
721
- one_line = true
722
-
723
- line.chomp!
724
- if line =~ %r{\[option (.*)\] (.*)}
725
- if $1 == "installonlypkgs"
726
- @allow_multi_install = $2.split
727
- else
728
- raise Chef::Exceptions::Package, "Strange, unknown option line '#{line}' from yum-dump.py"
729
- end
730
- next
731
- end
732
-
733
- if line =~ %r{^(\S+) ([0-9]+) (\S+) (\S+) (\S+) \[(.*)\] ([i,a,r]) (\S+)$}
734
- name = $1
735
- epoch = $2
736
- version = $3
737
- release = $4
738
- arch = $5
739
- provides = parse_provides($6)
740
- type = $7
741
- repoid = $8
742
- else
743
- Chef::Log.warn("Problem parsing line '#{line}' from yum-dump.py! " +
744
- "Please check your yum configuration.")
745
- next
746
- end
747
-
748
- case type
749
- when "i"
750
- # if yum-dump was called with --installed this may not be true, but it's okay
751
- # since we don't touch the @available Set in reload_installed
752
- available = false
753
- installed = true
754
- when "a"
755
- available = true
756
- installed = false
757
- when "r"
758
- available = true
759
- installed = true
760
- end
761
-
762
- pkg = RPMDbPackage.new(name, epoch, version, release, arch, provides, installed, available, repoid)
763
- @rpmdb << pkg
764
- end
765
-
766
- error = status.stderr
767
- rescue Mixlib::ShellOut::CommandTimeout => e
768
- Chef::Log.error("#{helper} exceeded timeout #{Chef::Config[:yum_timeout]}")
769
- raise(e)
770
- end
771
-
772
- if status.exitstatus != 0
773
- raise Chef::Exceptions::Package, "Yum failed - #{status.inspect} - returns: #{error}"
774
- else
775
- unless one_line
776
- Chef::Log.warn("Odd, no output from yum-dump.py. Please check " +
777
- "your yum configuration.")
778
- end
779
- end
780
-
781
- # A reload method must be called before the cache is altered
782
- @next_refresh = :none
783
- end
784
-
785
- def python_bin
786
- yum_executable = which(yum_binary)
787
- if yum_executable && shabang?(yum_executable)
788
- shabang_or_fallback(extract_interpreter(yum_executable))
789
- else
790
- Chef::Log.warn("Yum executable not found or doesn't start with #!. Using default python.")
791
- "/usr/bin/python"
792
- end
793
- rescue StandardError => e
794
- Chef::Log.warn("An error occurred attempting to determine correct python executable. Using default.")
795
- Chef::Log.debug(e)
796
- "/usr/bin/python"
797
- end
798
-
799
- def extract_interpreter(file)
800
- ::File.open(file, "r", &:readline)[2..-1].strip
801
- end
802
-
803
- # dnf based systems have a yum shim that has /bin/bash as the interpreter. Don't use this.
804
- def shabang_or_fallback(interpreter)
805
- if interpreter == "/bin/bash"
806
- Chef::Log.warn("Yum executable interpreter is /bin/bash. Falling back to default python.")
807
- "/usr/bin/python"
808
- else
809
- interpreter
810
- end
811
- end
812
-
813
- def shabang?(file)
814
- ::File.open(file, "r") do |f|
815
- f.read(2) == '#!'
816
- end
817
- rescue Errno::ENOENT
818
- false
819
- end
820
-
821
- def reload
822
- @next_refresh = :all
823
- end
824
-
825
- def reload_installed
826
- @next_refresh = :installed
827
- end
828
-
829
- def reload_provides
830
- @next_refresh = :provides
831
- end
832
-
833
- def reset
834
- @rpmdb.clear
835
- end
836
-
837
- def reset_installed
838
- @rpmdb.clear_installed
839
- end
840
-
841
- # Querying the cache
842
- #
843
-
844
- # Check for package by name or name+arch
845
- def package_available?(package_name)
846
- refresh
847
-
848
- if @rpmdb.lookup(package_name)
849
- return true
850
- else
851
- if package_name =~ %r{^(.*)\.(.*)$}
852
- pkg_name = $1
853
- pkg_arch = $2
854
-
855
- if matches = @rpmdb.lookup(pkg_name)
856
- matches.each do |m|
857
- return true if m.arch == pkg_arch
858
- end
859
- end
860
- end
861
- end
862
-
863
- return false
864
- end
865
-
866
- # Returns a array of packages satisfying an RPMDependency
867
- def packages_from_require(rpmdep)
868
- refresh
869
- @rpmdb.whatprovides(rpmdep)
870
- end
871
-
872
- # Check if a package-version.arch is available to install
873
- def version_available?(package_name, desired_version, arch = nil)
874
- version(package_name, arch, true, false) do |v|
875
- return true if desired_version == v
876
- end
877
-
878
- return false
879
- end
880
-
881
- # Return the source repository for a package-version.arch
882
- def package_repository(package_name, desired_version, arch = nil)
883
- package(package_name, arch, true, false) do |pkg|
884
- return pkg.repoid if desired_version == pkg.version.to_s
885
- end
886
-
887
- return nil
888
- end
889
-
890
- # Return the latest available version for a package.arch
891
- def available_version(package_name, arch = nil)
892
- version(package_name, arch, true, false)
893
- end
894
- alias :candidate_version :available_version
895
-
896
- # Return the currently installed version for a package.arch
897
- def installed_version(package_name, arch = nil)
898
- version(package_name, arch, false, true)
899
- end
900
-
901
- # Return an array of packages allowed to be installed multiple times, such as the kernel
902
- def allow_multi_install
903
- refresh
904
- @allow_multi_install
905
- end
906
-
907
- def enable_extra_repo_control(arg)
908
- # Don't touch cache if it's the same repos as the last load
909
- unless @extra_repo_control == arg
910
- @extra_repo_control = arg
911
- reload
912
- end
913
- end
914
-
915
- def disable_extra_repo_control
916
- # Only force reload when set
917
- if @extra_repo_control
918
- @extra_repo_control = nil
919
- reload
920
- end
921
- end
922
-
923
- private
924
-
925
- def version(package_name, arch = nil, is_available = false, is_installed = false)
926
- package(package_name, arch, is_available, is_installed) do |pkg|
927
- if block_given?
928
- yield pkg.version.to_s
929
- else
930
- # first match is latest version
931
- return pkg.version.to_s
932
- end
933
- end
934
-
935
- if block_given?
936
- return self
937
- else
938
- return nil
939
- end
940
- end
941
-
942
- def package(package_name, arch = nil, is_available = false, is_installed = false)
943
- refresh
944
- packages = @rpmdb[package_name]
945
- if packages
946
- packages.each do |pkg|
947
- if is_available
948
- next unless @rpmdb.available?(pkg)
949
- end
950
- if is_installed
951
- next unless @rpmdb.installed?(pkg)
952
- end
953
- if arch
954
- next unless pkg.arch == arch
955
- end
956
-
957
- if block_given?
958
- yield pkg
959
- else
960
- # first match is latest version
961
- return pkg
962
- end
963
- end
964
- end
965
-
966
- if block_given?
967
- return self
968
- else
969
- return nil
970
- end
971
- end
972
-
973
- # Parse provides from yum-dump.py output
974
- def parse_provides(string)
975
- ret = []
976
- # ['atk = 1.12.2-1.fc6', 'libatk-1.0.so.0']
977
- string.split(", ").each do |seg|
978
- # 'atk = 1.12.2-1.fc6'
979
- if seg =~ %r{^'(.*)'$}
980
- ret << RPMProvide.parse($1)
981
- end
982
- end
983
-
984
- return ret
985
- end
986
-
987
- end # YumCache
988
-
989
34
  include Chef::Mixin::GetSourceFromPackage
990
35
 
991
36
  def initialize(new_resource, run_context)
@@ -1126,7 +171,7 @@ class Chef
1126
171
  end
1127
172
  end
1128
173
 
1129
- @current_resource = Chef::Resource::Package.new(@new_resource.name)
174
+ @current_resource = Chef::Resource::YumPackage.new(@new_resource.name)
1130
175
  @current_resource.package_name(@new_resource.package_name)
1131
176
 
1132
177
  installed_version = []