chef 10.28.2-x86-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 (960) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +201 -0
  3. data/README.rdoc +177 -0
  4. data/Rakefile +128 -0
  5. data/bin/chef-client +26 -0
  6. data/bin/chef-solo +25 -0
  7. data/bin/knife +26 -0
  8. data/bin/shef +34 -0
  9. data/distro/README +2 -0
  10. data/distro/arch/etc/conf.d/chef-client.conf +5 -0
  11. data/distro/arch/etc/conf.d/chef-expander.conf +8 -0
  12. data/distro/arch/etc/conf.d/chef-server-webui.conf +10 -0
  13. data/distro/arch/etc/conf.d/chef-server.conf +10 -0
  14. data/distro/arch/etc/conf.d/chef-solr.conf +8 -0
  15. data/distro/arch/etc/rc.d/chef-client +90 -0
  16. data/distro/arch/etc/rc.d/chef-expander +78 -0
  17. data/distro/arch/etc/rc.d/chef-server +78 -0
  18. data/distro/arch/etc/rc.d/chef-server-webui +78 -0
  19. data/distro/arch/etc/rc.d/chef-solr +78 -0
  20. data/distro/common/html/chef-client.8.html +145 -0
  21. data/distro/common/html/chef-expander.8.html +164 -0
  22. data/distro/common/html/chef-expanderctl.8.html +146 -0
  23. data/distro/common/html/chef-server-webui.8.html +185 -0
  24. data/distro/common/html/chef-server.8.html +182 -0
  25. data/distro/common/html/chef-solo.8.html +185 -0
  26. data/distro/common/html/chef-solr.8.html +165 -0
  27. data/distro/common/html/knife-bootstrap.1.html +241 -0
  28. data/distro/common/html/knife-client.1.html +219 -0
  29. data/distro/common/html/knife-configure.1.html +170 -0
  30. data/distro/common/html/knife-cookbook-site.1.html +241 -0
  31. data/distro/common/html/knife-cookbook.1.html +381 -0
  32. data/distro/common/html/knife-data-bag.1.html +235 -0
  33. data/distro/common/html/knife-environment.1.html +265 -0
  34. data/distro/common/html/knife-exec.1.html +134 -0
  35. data/distro/common/html/knife-index.1.html +125 -0
  36. data/distro/common/html/knife-node.1.html +250 -0
  37. data/distro/common/html/knife-recipe.1.html +92 -0
  38. data/distro/common/html/knife-role.1.html +200 -0
  39. data/distro/common/html/knife-search.1.html +288 -0
  40. data/distro/common/html/knife-ssh.1.html +156 -0
  41. data/distro/common/html/knife-status.1.html +128 -0
  42. data/distro/common/html/knife-tag.1.html +137 -0
  43. data/distro/common/html/knife.1.html +320 -0
  44. data/distro/common/html/shef.1.html +283 -0
  45. data/distro/common/man/man1/knife-bootstrap.1 +201 -0
  46. data/distro/common/man/man1/knife-client.1 +99 -0
  47. data/distro/common/man/man1/knife-configure.1 +88 -0
  48. data/distro/common/man/man1/knife-cookbook-site.1 +145 -0
  49. data/distro/common/man/man1/knife-cookbook.1 +332 -0
  50. data/distro/common/man/man1/knife-data-bag.1 +123 -0
  51. data/distro/common/man/man1/knife-environment.1 +168 -0
  52. data/distro/common/man/man1/knife-exec.1 +46 -0
  53. data/distro/common/man/man1/knife-index.1 +29 -0
  54. data/distro/common/man/man1/knife-node.1 +134 -0
  55. data/distro/common/man/man1/knife-role.1 +88 -0
  56. data/distro/common/man/man1/knife-search.1 +280 -0
  57. data/distro/common/man/man1/knife-ssh.1 +79 -0
  58. data/distro/common/man/man1/knife-status.1 +29 -0
  59. data/distro/common/man/man1/knife-tag.1 +43 -0
  60. data/distro/common/man/man1/knife.1 +288 -0
  61. data/distro/common/man/man1/shef.1 +256 -0
  62. data/distro/common/man/man8/chef-client.8 +104 -0
  63. data/distro/common/man/man8/chef-expander.8 +97 -0
  64. data/distro/common/man/man8/chef-expanderctl.8 +62 -0
  65. data/distro/common/man/man8/chef-server-webui.8 +155 -0
  66. data/distro/common/man/man8/chef-server.8 +147 -0
  67. data/distro/common/man/man8/chef-solo.8 +126 -0
  68. data/distro/common/man/man8/chef-solr.8 +122 -0
  69. data/distro/common/markdown/README +3 -0
  70. data/distro/common/markdown/man1/knife-bootstrap.mkd +141 -0
  71. data/distro/common/markdown/man1/knife-client.mkd +103 -0
  72. data/distro/common/markdown/man1/knife-configure.mkd +70 -0
  73. data/distro/common/markdown/man1/knife-cookbook-site.mkd +123 -0
  74. data/distro/common/markdown/man1/knife-cookbook.mkd +263 -0
  75. data/distro/common/markdown/man1/knife-data-bag.mkd +121 -0
  76. data/distro/common/markdown/man1/knife-environment.mkd +151 -0
  77. data/distro/common/markdown/man1/knife-exec.mkd +37 -0
  78. data/distro/common/markdown/man1/knife-index.mkd +30 -0
  79. data/distro/common/markdown/man1/knife-node.mkd +130 -0
  80. data/distro/common/markdown/man1/knife-role.mkd +85 -0
  81. data/distro/common/markdown/man1/knife-search.mkd +180 -0
  82. data/distro/common/markdown/man1/knife-ssh.mkd +69 -0
  83. data/distro/common/markdown/man1/knife-status.mkd +36 -0
  84. data/distro/common/markdown/man1/knife-tag.mkd +39 -0
  85. data/distro/common/markdown/man1/knife.mkd +218 -0
  86. data/distro/common/markdown/man1/shef.mkd +189 -0
  87. data/distro/common/markdown/man8/chef-client.mkd +74 -0
  88. data/distro/common/markdown/man8/chef-expander.mkd +82 -0
  89. data/distro/common/markdown/man8/chef-expanderctl.mkd +58 -0
  90. data/distro/common/markdown/man8/chef-server-webui.mkd +121 -0
  91. data/distro/common/markdown/man8/chef-server.mkd +121 -0
  92. data/distro/common/markdown/man8/chef-solo.mkd +107 -0
  93. data/distro/common/markdown/man8/chef-solr.mkd +89 -0
  94. data/distro/debian/etc/default/chef-client +5 -0
  95. data/distro/debian/etc/default/chef-expander +8 -0
  96. data/distro/debian/etc/default/chef-server +9 -0
  97. data/distro/debian/etc/default/chef-server-webui +9 -0
  98. data/distro/debian/etc/default/chef-solr +8 -0
  99. data/distro/debian/etc/init.d/chef-client +210 -0
  100. data/distro/debian/etc/init.d/chef-expander +176 -0
  101. data/distro/debian/etc/init.d/chef-server +122 -0
  102. data/distro/debian/etc/init.d/chef-server-webui +123 -0
  103. data/distro/debian/etc/init.d/chef-solr +176 -0
  104. data/distro/debian/etc/init/chef-client.conf +17 -0
  105. data/distro/debian/etc/init/chef-expander.conf +17 -0
  106. data/distro/debian/etc/init/chef-server-webui.conf +17 -0
  107. data/distro/debian/etc/init/chef-server.conf +17 -0
  108. data/distro/debian/etc/init/chef-solr.conf +17 -0
  109. data/distro/redhat/etc/init.d/chef-client +121 -0
  110. data/distro/redhat/etc/init.d/chef-expander +104 -0
  111. data/distro/redhat/etc/init.d/chef-server +112 -0
  112. data/distro/redhat/etc/init.d/chef-server-webui +112 -0
  113. data/distro/redhat/etc/init.d/chef-solr +104 -0
  114. data/distro/redhat/etc/logrotate.d/chef-client +8 -0
  115. data/distro/redhat/etc/logrotate.d/chef-expander +8 -0
  116. data/distro/redhat/etc/logrotate.d/chef-server +8 -0
  117. data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
  118. data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
  119. data/distro/redhat/etc/sysconfig/chef-client +15 -0
  120. data/distro/redhat/etc/sysconfig/chef-expander +7 -0
  121. data/distro/redhat/etc/sysconfig/chef-server +14 -0
  122. data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
  123. data/distro/redhat/etc/sysconfig/chef-solr +8 -0
  124. data/distro/windows/service_manager.rb +164 -0
  125. data/lib/chef.rb +41 -0
  126. data/lib/chef/api_client.rb +293 -0
  127. data/lib/chef/application.rb +168 -0
  128. data/lib/chef/application/agent.rb +18 -0
  129. data/lib/chef/application/client.rb +322 -0
  130. data/lib/chef/application/knife.rb +183 -0
  131. data/lib/chef/application/solo.rb +248 -0
  132. data/lib/chef/application/windows_service.rb +227 -0
  133. data/lib/chef/applications.rb +4 -0
  134. data/lib/chef/certificate.rb +161 -0
  135. data/lib/chef/checksum.rb +167 -0
  136. data/lib/chef/checksum/storage.rb +18 -0
  137. data/lib/chef/checksum/storage/filesystem.rb +56 -0
  138. data/lib/chef/checksum_cache.rb +190 -0
  139. data/lib/chef/client.rb +499 -0
  140. data/lib/chef/config.rb +330 -0
  141. data/lib/chef/cookbook/chefignore.rb +66 -0
  142. data/lib/chef/cookbook/cookbook_collection.rb +45 -0
  143. data/lib/chef/cookbook/cookbook_version_loader.rb +171 -0
  144. data/lib/chef/cookbook/file_system_file_vendor.rb +56 -0
  145. data/lib/chef/cookbook/file_vendor.rb +48 -0
  146. data/lib/chef/cookbook/metadata.rb +629 -0
  147. data/lib/chef/cookbook/remote_file_vendor.rb +84 -0
  148. data/lib/chef/cookbook/synchronizer.rb +218 -0
  149. data/lib/chef/cookbook/syntax_check.rb +136 -0
  150. data/lib/chef/cookbook_loader.rb +121 -0
  151. data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
  152. data/lib/chef/cookbook_uploader.rb +173 -0
  153. data/lib/chef/cookbook_version.rb +1081 -0
  154. data/lib/chef/cookbook_version_selector.rb +168 -0
  155. data/lib/chef/couchdb.rb +246 -0
  156. data/lib/chef/daemon.rb +187 -0
  157. data/lib/chef/data_bag.rb +239 -0
  158. data/lib/chef/data_bag_item.rb +277 -0
  159. data/lib/chef/encrypted_data_bag_item.rb +268 -0
  160. data/lib/chef/environment.rb +458 -0
  161. data/lib/chef/event_dispatch/base.rb +311 -0
  162. data/lib/chef/event_dispatch/dispatcher.rb +42 -0
  163. data/lib/chef/exceptions.rb +192 -0
  164. data/lib/chef/file_access_control.rb +75 -0
  165. data/lib/chef/file_access_control/unix.rb +216 -0
  166. data/lib/chef/file_access_control/windows.rb +310 -0
  167. data/lib/chef/file_cache.rb +220 -0
  168. data/lib/chef/formatters/base.rb +247 -0
  169. data/lib/chef/formatters/doc.rb +236 -0
  170. data/lib/chef/formatters/error_descriptor.rb +66 -0
  171. data/lib/chef/formatters/error_inspectors.rb +19 -0
  172. data/lib/chef/formatters/error_inspectors/api_error_formatting.rb +111 -0
  173. data/lib/chef/formatters/error_inspectors/compile_error_inspector.rb +106 -0
  174. data/lib/chef/formatters/error_inspectors/cookbook_resolve_error_inspector.rb +146 -0
  175. data/lib/chef/formatters/error_inspectors/cookbook_sync_error_inspector.rb +80 -0
  176. data/lib/chef/formatters/error_inspectors/node_load_error_inspector.rb +125 -0
  177. data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +137 -0
  178. data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +109 -0
  179. data/lib/chef/formatters/error_inspectors/run_list_expansion_error_inspector.rb +118 -0
  180. data/lib/chef/formatters/error_mapper.rb +85 -0
  181. data/lib/chef/formatters/minimal.rb +235 -0
  182. data/lib/chef/handler.rb +235 -0
  183. data/lib/chef/handler/error_report.rb +33 -0
  184. data/lib/chef/handler/json_file.rb +64 -0
  185. data/lib/chef/index_queue.rb +29 -0
  186. data/lib/chef/index_queue/amqp_client.rb +116 -0
  187. data/lib/chef/index_queue/consumer.rb +76 -0
  188. data/lib/chef/index_queue/indexable.rb +109 -0
  189. data/lib/chef/json_compat.rb +149 -0
  190. data/lib/chef/knife.rb +537 -0
  191. data/lib/chef/knife/bootstrap.rb +233 -0
  192. data/lib/chef/knife/bootstrap/archlinux-gems.erb +62 -0
  193. data/lib/chef/knife/bootstrap/centos5-gems.erb +62 -0
  194. data/lib/chef/knife/bootstrap/chef-full.erb +60 -0
  195. data/lib/chef/knife/bootstrap/fedora13-gems.erb +44 -0
  196. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +53 -0
  197. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +48 -0
  198. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +46 -0
  199. data/lib/chef/knife/bootstrap/ubuntu12.10-gems.erb +60 -0
  200. data/lib/chef/knife/client_bulk_delete.rb +65 -0
  201. data/lib/chef/knife/client_create.rb +80 -0
  202. data/lib/chef/knife/client_delete.rb +46 -0
  203. data/lib/chef/knife/client_edit.rb +45 -0
  204. data/lib/chef/knife/client_list.rb +42 -0
  205. data/lib/chef/knife/client_reregister.rb +59 -0
  206. data/lib/chef/knife/client_show.rb +52 -0
  207. data/lib/chef/knife/configure.rb +168 -0
  208. data/lib/chef/knife/configure_client.rb +50 -0
  209. data/lib/chef/knife/cookbook_bulk_delete.rb +72 -0
  210. data/lib/chef/knife/cookbook_create.rb +447 -0
  211. data/lib/chef/knife/cookbook_delete.rb +151 -0
  212. data/lib/chef/knife/cookbook_download.rb +137 -0
  213. data/lib/chef/knife/cookbook_list.rb +47 -0
  214. data/lib/chef/knife/cookbook_metadata.rb +107 -0
  215. data/lib/chef/knife/cookbook_metadata_from_file.rb +44 -0
  216. data/lib/chef/knife/cookbook_show.rb +102 -0
  217. data/lib/chef/knife/cookbook_site_download.rb +109 -0
  218. data/lib/chef/knife/cookbook_site_install.rb +164 -0
  219. data/lib/chef/knife/cookbook_site_list.rb +62 -0
  220. data/lib/chef/knife/cookbook_site_search.rb +51 -0
  221. data/lib/chef/knife/cookbook_site_share.rb +114 -0
  222. data/lib/chef/knife/cookbook_site_show.rb +60 -0
  223. data/lib/chef/knife/cookbook_site_unshare.rb +56 -0
  224. data/lib/chef/knife/cookbook_site_vendor.rb +46 -0
  225. data/lib/chef/knife/cookbook_test.rb +93 -0
  226. data/lib/chef/knife/cookbook_upload.rb +290 -0
  227. data/lib/chef/knife/core/bootstrap_context.rb +106 -0
  228. data/lib/chef/knife/core/cookbook_scm_repo.rb +160 -0
  229. data/lib/chef/knife/core/generic_presenter.rb +191 -0
  230. data/lib/chef/knife/core/node_editor.rb +130 -0
  231. data/lib/chef/knife/core/node_presenter.rb +137 -0
  232. data/lib/chef/knife/core/object_loader.rb +112 -0
  233. data/lib/chef/knife/core/subcommand_loader.rb +112 -0
  234. data/lib/chef/knife/core/text_formatter.rb +100 -0
  235. data/lib/chef/knife/core/ui.rb +217 -0
  236. data/lib/chef/knife/data_bag_create.rb +93 -0
  237. data/lib/chef/knife/data_bag_delete.rb +51 -0
  238. data/lib/chef/knife/data_bag_edit.rb +94 -0
  239. data/lib/chef/knife/data_bag_from_file.rb +136 -0
  240. data/lib/chef/knife/data_bag_list.rb +46 -0
  241. data/lib/chef/knife/data_bag_show.rb +81 -0
  242. data/lib/chef/knife/environment_create.rb +53 -0
  243. data/lib/chef/knife/environment_delete.rb +45 -0
  244. data/lib/chef/knife/environment_edit.rb +45 -0
  245. data/lib/chef/knife/environment_from_file.rb +83 -0
  246. data/lib/chef/knife/environment_list.rb +42 -0
  247. data/lib/chef/knife/environment_show.rb +46 -0
  248. data/lib/chef/knife/exec.rb +86 -0
  249. data/lib/chef/knife/help.rb +103 -0
  250. data/lib/chef/knife/help_topics.rb +4 -0
  251. data/lib/chef/knife/index_rebuild.rb +50 -0
  252. data/lib/chef/knife/node_bulk_delete.rb +80 -0
  253. data/lib/chef/knife/node_create.rb +50 -0
  254. data/lib/chef/knife/node_delete.rb +47 -0
  255. data/lib/chef/knife/node_edit.rb +72 -0
  256. data/lib/chef/knife/node_from_file.rb +50 -0
  257. data/lib/chef/knife/node_list.rb +46 -0
  258. data/lib/chef/knife/node_run_list_add.rb +75 -0
  259. data/lib/chef/knife/node_run_list_remove.rb +48 -0
  260. data/lib/chef/knife/node_show.rb +73 -0
  261. data/lib/chef/knife/recipe_list.rb +32 -0
  262. data/lib/chef/knife/role_bulk_delete.rb +70 -0
  263. data/lib/chef/knife/role_create.rb +55 -0
  264. data/lib/chef/knife/role_delete.rb +47 -0
  265. data/lib/chef/knife/role_edit.rb +48 -0
  266. data/lib/chef/knife/role_from_file.rb +56 -0
  267. data/lib/chef/knife/role_list.rb +43 -0
  268. data/lib/chef/knife/role_show.rb +54 -0
  269. data/lib/chef/knife/search.rb +141 -0
  270. data/lib/chef/knife/ssh.rb +459 -0
  271. data/lib/chef/knife/status.rb +119 -0
  272. data/lib/chef/knife/tag_create.rb +52 -0
  273. data/lib/chef/knife/tag_delete.rb +60 -0
  274. data/lib/chef/knife/tag_list.rb +47 -0
  275. data/lib/chef/log.rb +39 -0
  276. data/lib/chef/mash.rb +225 -0
  277. data/lib/chef/mixin/check_helper.rb +31 -0
  278. data/lib/chef/mixin/checksum.rb +32 -0
  279. data/lib/chef/mixin/command.rb +164 -0
  280. data/lib/chef/mixin/command/unix.rb +220 -0
  281. data/lib/chef/mixin/command/windows.rb +76 -0
  282. data/lib/chef/mixin/convert_to_class_name.rb +65 -0
  283. data/lib/chef/mixin/create_path.rb +57 -0
  284. data/lib/chef/mixin/deep_merge.rb +247 -0
  285. data/lib/chef/mixin/deprecation.rb +65 -0
  286. data/lib/chef/mixin/enforce_ownership_and_permissions.rb +39 -0
  287. data/lib/chef/mixin/file_class.rb +46 -0
  288. data/lib/chef/mixin/from_file.rb +50 -0
  289. data/lib/chef/mixin/get_source_from_package.rb +42 -0
  290. data/lib/chef/mixin/language.rb +249 -0
  291. data/lib/chef/mixin/language_include_attribute.rb +61 -0
  292. data/lib/chef/mixin/language_include_recipe.rb +58 -0
  293. data/lib/chef/mixin/params_validate.rb +238 -0
  294. data/lib/chef/mixin/path_sanity.rb +67 -0
  295. data/lib/chef/mixin/recipe_definition_dsl_core.rb +86 -0
  296. data/lib/chef/mixin/securable.rb +180 -0
  297. data/lib/chef/mixin/shell_out.rb +69 -0
  298. data/lib/chef/mixin/template.rb +100 -0
  299. data/lib/chef/mixin/why_run.rb +332 -0
  300. data/lib/chef/mixin/xml_escape.rb +140 -0
  301. data/lib/chef/mixins.rb +18 -0
  302. data/lib/chef/monkey_patches/dir.rb +36 -0
  303. data/lib/chef/monkey_patches/fileutils.rb +65 -0
  304. data/lib/chef/monkey_patches/moneta.rb +50 -0
  305. data/lib/chef/monkey_patches/net_http.rb +22 -0
  306. data/lib/chef/monkey_patches/numeric.rb +15 -0
  307. data/lib/chef/monkey_patches/object.rb +9 -0
  308. data/lib/chef/monkey_patches/regexp.rb +34 -0
  309. data/lib/chef/monkey_patches/string.rb +49 -0
  310. data/lib/chef/monkey_patches/tempfile.rb +64 -0
  311. data/lib/chef/nil_argument.rb +3 -0
  312. data/lib/chef/node.rb +682 -0
  313. data/lib/chef/node/attribute.rb +504 -0
  314. data/lib/chef/openid_registration.rb +187 -0
  315. data/lib/chef/platform.rb +520 -0
  316. data/lib/chef/provider.rb +223 -0
  317. data/lib/chef/provider/breakpoint.rb +36 -0
  318. data/lib/chef/provider/cookbook_file.rb +105 -0
  319. data/lib/chef/provider/cron.rb +214 -0
  320. data/lib/chef/provider/cron/solaris.rb +56 -0
  321. data/lib/chef/provider/deploy.rb +474 -0
  322. data/lib/chef/provider/deploy/revision.rb +80 -0
  323. data/lib/chef/provider/deploy/timestamped.rb +32 -0
  324. data/lib/chef/provider/directory.rb +128 -0
  325. data/lib/chef/provider/env.rb +152 -0
  326. data/lib/chef/provider/env/windows.rb +75 -0
  327. data/lib/chef/provider/erl_call.rb +106 -0
  328. data/lib/chef/provider/execute.rb +68 -0
  329. data/lib/chef/provider/file.rb +355 -0
  330. data/lib/chef/provider/git.rb +260 -0
  331. data/lib/chef/provider/group.rb +159 -0
  332. data/lib/chef/provider/group/aix.rb +70 -0
  333. data/lib/chef/provider/group/dscl.rb +129 -0
  334. data/lib/chef/provider/group/gpasswd.rb +65 -0
  335. data/lib/chef/provider/group/groupadd.rb +96 -0
  336. data/lib/chef/provider/group/groupmod.rb +120 -0
  337. data/lib/chef/provider/group/pw.rb +93 -0
  338. data/lib/chef/provider/group/suse.rb +60 -0
  339. data/lib/chef/provider/group/usermod.rb +68 -0
  340. data/lib/chef/provider/group/windows.rb +79 -0
  341. data/lib/chef/provider/http_request.rb +136 -0
  342. data/lib/chef/provider/ifconfig.rb +214 -0
  343. data/lib/chef/provider/link.rb +130 -0
  344. data/lib/chef/provider/log.rb +54 -0
  345. data/lib/chef/provider/mdadm.rb +92 -0
  346. data/lib/chef/provider/mount.rb +128 -0
  347. data/lib/chef/provider/mount/mount.rb +252 -0
  348. data/lib/chef/provider/mount/windows.rb +81 -0
  349. data/lib/chef/provider/ohai.rb +47 -0
  350. data/lib/chef/provider/package.rb +229 -0
  351. data/lib/chef/provider/package/apt.rb +147 -0
  352. data/lib/chef/provider/package/dpkg.rb +128 -0
  353. data/lib/chef/provider/package/easy_install.rb +136 -0
  354. data/lib/chef/provider/package/freebsd.rb +149 -0
  355. data/lib/chef/provider/package/ips.rb +101 -0
  356. data/lib/chef/provider/package/macports.rb +105 -0
  357. data/lib/chef/provider/package/pacman.rb +111 -0
  358. data/lib/chef/provider/package/portage.rb +143 -0
  359. data/lib/chef/provider/package/rpm.rb +121 -0
  360. data/lib/chef/provider/package/rubygems.rb +580 -0
  361. data/lib/chef/provider/package/smartos.rb +84 -0
  362. data/lib/chef/provider/package/solaris.rb +139 -0
  363. data/lib/chef/provider/package/yum-dump.py +307 -0
  364. data/lib/chef/provider/package/yum.rb +1261 -0
  365. data/lib/chef/provider/package/zypper.rb +144 -0
  366. data/lib/chef/provider/remote_directory.rb +178 -0
  367. data/lib/chef/provider/remote_file.rb +126 -0
  368. data/lib/chef/provider/resource_update.rb +55 -0
  369. data/lib/chef/provider/route.rb +223 -0
  370. data/lib/chef/provider/ruby_block.rb +39 -0
  371. data/lib/chef/provider/script.rb +57 -0
  372. data/lib/chef/provider/service.rb +158 -0
  373. data/lib/chef/provider/service/arch.rb +113 -0
  374. data/lib/chef/provider/service/debian.rb +152 -0
  375. data/lib/chef/provider/service/freebsd.rb +175 -0
  376. data/lib/chef/provider/service/gentoo.rb +67 -0
  377. data/lib/chef/provider/service/init.rb +87 -0
  378. data/lib/chef/provider/service/insserv.rb +52 -0
  379. data/lib/chef/provider/service/invokercd.rb +35 -0
  380. data/lib/chef/provider/service/macosx.rb +144 -0
  381. data/lib/chef/provider/service/redhat.rb +77 -0
  382. data/lib/chef/provider/service/simple.rb +172 -0
  383. data/lib/chef/provider/service/solaris.rb +86 -0
  384. data/lib/chef/provider/service/systemd.rb +115 -0
  385. data/lib/chef/provider/service/upstart.rb +232 -0
  386. data/lib/chef/provider/service/windows.rb +163 -0
  387. data/lib/chef/provider/subversion.rb +214 -0
  388. data/lib/chef/provider/template.rb +117 -0
  389. data/lib/chef/provider/user.rb +207 -0
  390. data/lib/chef/provider/user/dscl.rb +280 -0
  391. data/lib/chef/provider/user/pw.rb +113 -0
  392. data/lib/chef/provider/user/solaris.rb +90 -0
  393. data/lib/chef/provider/user/useradd.rb +153 -0
  394. data/lib/chef/provider/user/windows.rb +124 -0
  395. data/lib/chef/providers.rb +101 -0
  396. data/lib/chef/recipe.rb +129 -0
  397. data/lib/chef/reserved_names.rb +9 -0
  398. data/lib/chef/resource.rb +912 -0
  399. data/lib/chef/resource/apt_package.rb +43 -0
  400. data/lib/chef/resource/bash.rb +33 -0
  401. data/lib/chef/resource/breakpoint.rb +35 -0
  402. data/lib/chef/resource/chef_gem.rb +53 -0
  403. data/lib/chef/resource/conditional.rb +101 -0
  404. data/lib/chef/resource/cookbook_file.rb +52 -0
  405. data/lib/chef/resource/cron.rb +202 -0
  406. data/lib/chef/resource/csh.rb +33 -0
  407. data/lib/chef/resource/deploy.rb +403 -0
  408. data/lib/chef/resource/deploy_revision.rb +40 -0
  409. data/lib/chef/resource/directory.rb +65 -0
  410. data/lib/chef/resource/dpkg_package.rb +34 -0
  411. data/lib/chef/resource/easy_install_package.rb +57 -0
  412. data/lib/chef/resource/env.rb +63 -0
  413. data/lib/chef/resource/erl_call.rb +86 -0
  414. data/lib/chef/resource/execute.rb +132 -0
  415. data/lib/chef/resource/file.rb +96 -0
  416. data/lib/chef/resource/freebsd_package.rb +35 -0
  417. data/lib/chef/resource/gem_package.rb +53 -0
  418. data/lib/chef/resource/git.rb +46 -0
  419. data/lib/chef/resource/group.rb +83 -0
  420. data/lib/chef/resource/http_request.rb +64 -0
  421. data/lib/chef/resource/ifconfig.rb +149 -0
  422. data/lib/chef/resource/ips_package.rb +42 -0
  423. data/lib/chef/resource/link.rb +92 -0
  424. data/lib/chef/resource/log.rb +74 -0
  425. data/lib/chef/resource/macports_package.rb +29 -0
  426. data/lib/chef/resource/mdadm.rb +105 -0
  427. data/lib/chef/resource/mount.rb +139 -0
  428. data/lib/chef/resource/ohai.rb +54 -0
  429. data/lib/chef/resource/package.rb +84 -0
  430. data/lib/chef/resource/pacman_package.rb +33 -0
  431. data/lib/chef/resource/perl.rb +33 -0
  432. data/lib/chef/resource/portage_package.rb +33 -0
  433. data/lib/chef/resource/python.rb +33 -0
  434. data/lib/chef/resource/remote_directory.rb +125 -0
  435. data/lib/chef/resource/remote_file.rb +90 -0
  436. data/lib/chef/resource/route.rb +140 -0
  437. data/lib/chef/resource/rpm_package.rb +34 -0
  438. data/lib/chef/resource/ruby.rb +33 -0
  439. data/lib/chef/resource/ruby_block.rb +51 -0
  440. data/lib/chef/resource/scm.rb +151 -0
  441. data/lib/chef/resource/script.rb +63 -0
  442. data/lib/chef/resource/service.rb +164 -0
  443. data/lib/chef/resource/smartos_package.rb +36 -0
  444. data/lib/chef/resource/solaris_package.rb +36 -0
  445. data/lib/chef/resource/subversion.rb +37 -0
  446. data/lib/chef/resource/template.rb +76 -0
  447. data/lib/chef/resource/timestamped_deploy.rb +31 -0
  448. data/lib/chef/resource/user.rb +134 -0
  449. data/lib/chef/resource/yum_package.rb +63 -0
  450. data/lib/chef/resource_collection.rb +217 -0
  451. data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
  452. data/lib/chef/resource_definition.rb +67 -0
  453. data/lib/chef/resource_definition_list.rb +38 -0
  454. data/lib/chef/resource_platform_map.rb +151 -0
  455. data/lib/chef/resource_reporter.rb +281 -0
  456. data/lib/chef/resources.rb +67 -0
  457. data/lib/chef/rest.rb +510 -0
  458. data/lib/chef/rest/auth_credentials.rb +73 -0
  459. data/lib/chef/rest/cookie_jar.rb +31 -0
  460. data/lib/chef/rest/rest_request.rb +229 -0
  461. data/lib/chef/role.rb +349 -0
  462. data/lib/chef/run_context.rb +236 -0
  463. data/lib/chef/run_list.rb +165 -0
  464. data/lib/chef/run_list/run_list_expansion.rb +206 -0
  465. data/lib/chef/run_list/run_list_item.rb +99 -0
  466. data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
  467. data/lib/chef/run_status.rb +124 -0
  468. data/lib/chef/runner.rb +95 -0
  469. data/lib/chef/sandbox.rb +153 -0
  470. data/lib/chef/scan_access_control.rb +135 -0
  471. data/lib/chef/search/query.rb +65 -0
  472. data/lib/chef/shef.rb +327 -0
  473. data/lib/chef/shef/ext.rb +591 -0
  474. data/lib/chef/shef/model_wrapper.rb +120 -0
  475. data/lib/chef/shef/shef_rest.rb +28 -0
  476. data/lib/chef/shef/shef_session.rb +296 -0
  477. data/lib/chef/shell_out.rb +6 -0
  478. data/lib/chef/solr_query.rb +187 -0
  479. data/lib/chef/solr_query/lucene.treetop +150 -0
  480. data/lib/chef/solr_query/lucene_nodes.rb +285 -0
  481. data/lib/chef/solr_query/query_transform.rb +65 -0
  482. data/lib/chef/solr_query/solr_http_request.rb +132 -0
  483. data/lib/chef/streaming_cookbook_uploader.rb +201 -0
  484. data/lib/chef/tasks/chef_repo.rake +334 -0
  485. data/lib/chef/util/file_edit.rb +132 -0
  486. data/lib/chef/util/windows.rb +56 -0
  487. data/lib/chef/util/windows/net_group.rb +101 -0
  488. data/lib/chef/util/windows/net_use.rb +121 -0
  489. data/lib/chef/util/windows/net_user.rb +198 -0
  490. data/lib/chef/util/windows/volume.rb +59 -0
  491. data/lib/chef/version.rb +23 -0
  492. data/lib/chef/version_class.rb +70 -0
  493. data/lib/chef/version_constraint.rb +116 -0
  494. data/lib/chef/webui_user.rb +231 -0
  495. data/lib/chef/win32/api.rb +364 -0
  496. data/lib/chef/win32/api/error.rb +921 -0
  497. data/lib/chef/win32/api/file.rb +535 -0
  498. data/lib/chef/win32/api/memory.rb +105 -0
  499. data/lib/chef/win32/api/process.rb +41 -0
  500. data/lib/chef/win32/api/psapi.rb +51 -0
  501. data/lib/chef/win32/api/security.rb +341 -0
  502. data/lib/chef/win32/api/system.rb +192 -0
  503. data/lib/chef/win32/api/unicode.rb +178 -0
  504. data/lib/chef/win32/error.rb +73 -0
  505. data/lib/chef/win32/file.rb +167 -0
  506. data/lib/chef/win32/file/info.rb +100 -0
  507. data/lib/chef/win32/handle.rb +55 -0
  508. data/lib/chef/win32/memory.rb +101 -0
  509. data/lib/chef/win32/process.rb +84 -0
  510. data/lib/chef/win32/security.rb +489 -0
  511. data/lib/chef/win32/security/ace.rb +125 -0
  512. data/lib/chef/win32/security/acl.rb +101 -0
  513. data/lib/chef/win32/security/securable_object.rb +109 -0
  514. data/lib/chef/win32/security/security_descriptor.rb +93 -0
  515. data/lib/chef/win32/security/sid.rb +199 -0
  516. data/lib/chef/win32/security/token.rb +64 -0
  517. data/lib/chef/win32/unicode.rb +43 -0
  518. data/lib/chef/win32/version.rb +119 -0
  519. data/spec/data/bad-config.rb +1 -0
  520. data/spec/data/big_json.json +2 -0
  521. data/spec/data/big_json_plus_one.json +2 -0
  522. data/spec/data/bootstrap/test-hints.erb +12 -0
  523. data/spec/data/bootstrap/test.erb +1 -0
  524. data/spec/data/cb_version_cookbooks/tatft/README.rdoc +3 -0
  525. data/spec/data/cb_version_cookbooks/tatft/attributes/default.rb +1 -0
  526. data/spec/data/cb_version_cookbooks/tatft/definitions/runit_service.rb +1 -0
  527. data/spec/data/cb_version_cookbooks/tatft/files/default/giant_blob.tgz +1 -0
  528. data/spec/data/cb_version_cookbooks/tatft/libraries/ownage.rb +1 -0
  529. data/spec/data/cb_version_cookbooks/tatft/providers/lwp.rb +1 -0
  530. data/spec/data/cb_version_cookbooks/tatft/recipes/default.rb +1 -0
  531. data/spec/data/cb_version_cookbooks/tatft/resources/lwr.rb +1 -0
  532. data/spec/data/cb_version_cookbooks/tatft/templates/default/configuration.erb +0 -0
  533. data/spec/data/checksum/random.txt +1 -0
  534. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-600hhz-0 +1 -0
  535. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-6m8zdk-0 +0 -0
  536. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ahd2gq-0 +1 -0
  537. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-api8ux-0 +1 -0
  538. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-b0r1m1-0 +1 -0
  539. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-bfygsi-0 +1 -0
  540. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-el14l6-0 +1 -0
  541. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ivrl3y-0 +1 -0
  542. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-kkbs85-0 +1 -0
  543. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ory1ux-0 +1 -0
  544. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-pgsq76-0 +1 -0
  545. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ra8uim-0 +1 -0
  546. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t7k1g-0 +1 -0
  547. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t8g0sv-0 +1 -0
  548. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ufy6g3-0 +1 -0
  549. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-x2d6j9-0 +1 -0
  550. data/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-xi0l6h-0 +1 -0
  551. data/spec/data/config.rb +6 -0
  552. data/spec/data/cookbooks/angrybash/recipes/default.rb +8 -0
  553. data/spec/data/cookbooks/apache2/files/default/apache2_module_conf_generate.pl +2 -0
  554. data/spec/data/cookbooks/apache2/recipes/default.rb +3 -0
  555. data/spec/data/cookbooks/borken/recipes/default.rb +2 -0
  556. data/spec/data/cookbooks/borken/templates/default/borken.erb +2 -0
  557. data/spec/data/cookbooks/chefignore +8 -0
  558. data/spec/data/cookbooks/java/files/default/java.response +2 -0
  559. data/spec/data/cookbooks/openldap/attributes/default.rb +15 -0
  560. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -0
  561. data/spec/data/cookbooks/openldap/definitions/client.rb +5 -0
  562. data/spec/data/cookbooks/openldap/definitions/server.rb +5 -0
  563. data/spec/data/cookbooks/openldap/files/default/.dotfile +1 -0
  564. data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +1 -0
  565. data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +1 -0
  566. data/spec/data/cookbooks/openldap/files/default/remotedir/remote_dir_file1.txt +3 -0
  567. data/spec/data/cookbooks/openldap/files/default/remotedir/remote_dir_file2.txt +3 -0
  568. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +1 -0
  569. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/remote_subdir_file1.txt +3 -0
  570. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/remote_subdir_file2.txt +3 -0
  571. data/spec/data/cookbooks/openldap/files/default/remotedir/subdir_with_no_file_just_a_subsubdir/the_subsubdir/some_file.txt +3 -0
  572. data/spec/data/cookbooks/openldap/recipes/default.rb +3 -0
  573. data/spec/data/cookbooks/openldap/recipes/gigantor.rb +3 -0
  574. data/spec/data/cookbooks/openldap/recipes/one.rb +15 -0
  575. data/spec/data/cookbooks/openldap/templates/default/openldap_stuff.conf.erb +1 -0
  576. data/spec/data/cookbooks/openldap/templates/default/openldap_variable_stuff.conf.erb +1 -0
  577. data/spec/data/cookbooks/openldap/templates/default/test.erb +1 -0
  578. data/spec/data/definitions/test.rb +5 -0
  579. data/spec/data/environment-config.rb +5 -0
  580. data/spec/data/fileedit/blank +0 -0
  581. data/spec/data/fileedit/hosts +4 -0
  582. data/spec/data/gems/chef-integration-test-0.1.0.gem +0 -0
  583. data/spec/data/git_bundles/sinatra-test-app-with-callback-files.gitbundle +0 -0
  584. data/spec/data/git_bundles/sinatra-test-app-with-symlinks.gitbundle +0 -0
  585. data/spec/data/git_bundles/sinatra-test-app.gitbundle +0 -0
  586. data/spec/data/kitchen/chefignore +6 -0
  587. data/spec/data/kitchen/openldap/attributes/default.rb +3 -0
  588. data/spec/data/kitchen/openldap/attributes/robinson.rb +3 -0
  589. data/spec/data/kitchen/openldap/definitions/client.rb +3 -0
  590. data/spec/data/kitchen/openldap/definitions/drewbarrymore.rb +3 -0
  591. data/spec/data/kitchen/openldap/recipes/gigantor.rb +3 -0
  592. data/spec/data/kitchen/openldap/recipes/ignoreme.rb +3 -0
  593. data/spec/data/kitchen/openldap/recipes/woot.rb +3 -0
  594. data/spec/data/knife-home/.chef/plugins/knife/example_home_subcommand.rb +0 -0
  595. data/spec/data/knife-site-subcommands/plugins/knife/example_subcommand.rb +0 -0
  596. data/spec/data/knife_subcommand/test_explicit_category.rb +7 -0
  597. data/spec/data/knife_subcommand/test_name_mapping.rb +4 -0
  598. data/spec/data/knife_subcommand/test_yourself.rb +13 -0
  599. data/spec/data/lwrp/providers/buck_passer.rb +3 -0
  600. data/spec/data/lwrp/providers/buck_passer_2.rb +10 -0
  601. data/spec/data/lwrp/providers/embedded_resource_accesses_providers_scope.rb +16 -0
  602. data/spec/data/lwrp/providers/monkey_name_printer.rb +5 -0
  603. data/spec/data/lwrp/providers/paint_drying_watcher.rb +7 -0
  604. data/spec/data/lwrp/providers/thumb_twiddler.rb +7 -0
  605. data/spec/data/lwrp/resources/bar.rb +1 -0
  606. data/spec/data/lwrp/resources/foo.rb +3 -0
  607. data/spec/data/lwrp/resources_with_default_attributes/nodeattr.rb +1 -0
  608. data/spec/data/lwrp_const_scoping/resources/conflict.rb +0 -0
  609. data/spec/data/lwrp_override/providers/buck_passer.rb +10 -0
  610. data/spec/data/lwrp_override/resources/foo.rb +4 -0
  611. data/spec/data/metadata/quick_start/metadata.rb +19 -0
  612. data/spec/data/nodes/default.rb +15 -0
  613. data/spec/data/nodes/test.example.com.rb +17 -0
  614. data/spec/data/nodes/test.rb +15 -0
  615. data/spec/data/object_loader/environments/test.json +5 -0
  616. data/spec/data/object_loader/environments/test.rb +2 -0
  617. data/spec/data/object_loader/environments/test_json_class.json +6 -0
  618. data/spec/data/object_loader/nodes/test.json +5 -0
  619. data/spec/data/object_loader/nodes/test.rb +2 -0
  620. data/spec/data/object_loader/nodes/test_json_class.json +6 -0
  621. data/spec/data/object_loader/roles/test.json +5 -0
  622. data/spec/data/object_loader/roles/test.rb +2 -0
  623. data/spec/data/object_loader/roles/test_json_class.json +6 -0
  624. data/spec/data/old_home_dir/my-dot-emacs +0 -0
  625. data/spec/data/old_home_dir/my-dot-vim +0 -0
  626. data/spec/data/recipes/test.rb +7 -0
  627. data/spec/data/remote_directory_data/remote_dir_file.txt +1 -0
  628. data/spec/data/remote_directory_data/remote_subdirectory/remote_subdir_file.txt +1 -0
  629. data/spec/data/remote_file/nyan_cat.png +0 -0
  630. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -0
  631. data/spec/data/run_context/cookbooks/test/definitions/new_animals.rb +9 -0
  632. data/spec/data/run_context/cookbooks/test/definitions/new_cat.rb +5 -0
  633. data/spec/data/run_context/cookbooks/test/recipes/default.rb +5 -0
  634. data/spec/data/run_context/cookbooks/test/recipes/one.rb +7 -0
  635. data/spec/data/run_context/cookbooks/test/recipes/two.rb +7 -0
  636. data/spec/data/run_context/nodes/run_context.rb +5 -0
  637. data/spec/data/search_queries_to_transform.txt +98 -0
  638. data/spec/data/ssl/5e707473.0 +18 -0
  639. data/spec/data/ssl/chef-rspec.cert +27 -0
  640. data/spec/data/ssl/chef-rspec.key +27 -0
  641. data/spec/data/ssl/key.pem +15 -0
  642. data/spec/data/ssl/private_key.pem +27 -0
  643. data/spec/data/ssl/private_key_with_whitespace.pem +32 -0
  644. data/spec/data/templates/seattle.txt +1 -0
  645. data/spec/functional/knife/cookbook_delete_spec.rb +160 -0
  646. data/spec/functional/knife/exec_spec.rb +60 -0
  647. data/spec/functional/knife/ssh_spec.rb +268 -0
  648. data/spec/functional/resource/cookbook_file_spec.rb +75 -0
  649. data/spec/functional/resource/deploy_revision_spec.rb +515 -0
  650. data/spec/functional/resource/directory_spec.rb +39 -0
  651. data/spec/functional/resource/file_spec.rb +69 -0
  652. data/spec/functional/resource/link_spec.rb +572 -0
  653. data/spec/functional/resource/remote_directory_spec.rb +114 -0
  654. data/spec/functional/resource/remote_file_spec.rb +65 -0
  655. data/spec/functional/resource/template_spec.rb +68 -0
  656. data/spec/functional/tiny_server_spec.rb +78 -0
  657. data/spec/rcov.opts +2 -0
  658. data/spec/spec_helper.rb +82 -0
  659. data/spec/stress/win32/file_spec.rb +37 -0
  660. data/spec/stress/win32/memory_spec.rb +22 -0
  661. data/spec/stress/win32/security_spec.rb +69 -0
  662. data/spec/support/chef_helpers.rb +65 -0
  663. data/spec/support/lib/chef/provider/easy.rb +35 -0
  664. data/spec/support/lib/chef/provider/snakeoil.rb +40 -0
  665. data/spec/support/lib/chef/resource/cat.rb +41 -0
  666. data/spec/support/lib/chef/resource/one_two_three_four.rb +43 -0
  667. data/spec/support/lib/chef/resource/zen_master.rb +46 -0
  668. data/spec/support/matchers/leak.rb +96 -0
  669. data/spec/support/mock/constant.rb +52 -0
  670. data/spec/support/mock/platform.rb +18 -0
  671. data/spec/support/platform_helpers.rb +39 -0
  672. data/spec/support/platforms/prof/gc.rb +54 -0
  673. data/spec/support/platforms/prof/win32.rb +46 -0
  674. data/spec/support/shared/functional/directory_resource.rb +85 -0
  675. data/spec/support/shared/functional/file_resource.rb +202 -0
  676. data/spec/support/shared/functional/knife.rb +37 -0
  677. data/spec/support/shared/functional/securable_resource.rb +402 -0
  678. data/spec/support/shared/unit/api_error_inspector.rb +192 -0
  679. data/spec/tiny_server.rb +202 -0
  680. data/spec/unit/api_client_spec.rb +257 -0
  681. data/spec/unit/application/agent_spec.rb +0 -0
  682. data/spec/unit/application/client_spec.rb +171 -0
  683. data/spec/unit/application/knife_spec.rb +152 -0
  684. data/spec/unit/application/server_spec.rb +0 -0
  685. data/spec/unit/application/solo_spec.rb +167 -0
  686. data/spec/unit/application_spec.rb +239 -0
  687. data/spec/unit/certificate_spec.rb +76 -0
  688. data/spec/unit/checksum/storage/filesystem_spec.rb +69 -0
  689. data/spec/unit/checksum_cache_spec.rb +209 -0
  690. data/spec/unit/checksum_spec.rb +94 -0
  691. data/spec/unit/chef_spec.rb +25 -0
  692. data/spec/unit/client_spec.rb +290 -0
  693. data/spec/unit/config_spec.rb +223 -0
  694. data/spec/unit/cookbook/chefignore_spec.rb +39 -0
  695. data/spec/unit/cookbook/metadata_spec.rb +627 -0
  696. data/spec/unit/cookbook/synchronizer_spec.rb +306 -0
  697. data/spec/unit/cookbook/syntax_check_spec.rb +211 -0
  698. data/spec/unit/cookbook_loader_spec.rb +145 -0
  699. data/spec/unit/cookbook_manifest_spec.rb +554 -0
  700. data/spec/unit/cookbook_spec.rb +101 -0
  701. data/spec/unit/cookbook_version_spec.rb +406 -0
  702. data/spec/unit/couchdb_spec.rb +274 -0
  703. data/spec/unit/daemon_spec.rb +302 -0
  704. data/spec/unit/data_bag_item_spec.rb +280 -0
  705. data/spec/unit/data_bag_spec.rb +169 -0
  706. data/spec/unit/encrypted_data_bag_item_spec.rb +293 -0
  707. data/spec/unit/environment_spec.rb +492 -0
  708. data/spec/unit/exceptions_spec.rb +74 -0
  709. data/spec/unit/file_access_control_spec.rb +282 -0
  710. data/spec/unit/file_cache_spec.rb +114 -0
  711. data/spec/unit/formatters/error_inspectors/compile_error_inspector_spec.rb +202 -0
  712. data/spec/unit/formatters/error_inspectors/cookbook_resolve_error_inspector_spec.rb +93 -0
  713. data/spec/unit/formatters/error_inspectors/cookbook_sync_error_inspector_spec.rb +43 -0
  714. data/spec/unit/formatters/error_inspectors/node_load_error_inspector_spec.rb +27 -0
  715. data/spec/unit/formatters/error_inspectors/registration_error_inspector_spec.rb +27 -0
  716. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +182 -0
  717. data/spec/unit/formatters/error_inspectors/run_list_expansion_error_inspector_spec.rb +93 -0
  718. data/spec/unit/handler/json_file_spec.rb +64 -0
  719. data/spec/unit/handler_spec.rb +216 -0
  720. data/spec/unit/index_queue_spec.rb +391 -0
  721. data/spec/unit/json_compat_spec.rb +61 -0
  722. data/spec/unit/knife/bootstrap_spec.rb +265 -0
  723. data/spec/unit/knife/client_bulk_delete_spec.rb +78 -0
  724. data/spec/unit/knife/client_create_spec.rb +74 -0
  725. data/spec/unit/knife/client_delete_spec.rb +40 -0
  726. data/spec/unit/knife/client_edit_spec.rb +40 -0
  727. data/spec/unit/knife/client_list_spec.rb +34 -0
  728. data/spec/unit/knife/client_reregister_spec.rb +62 -0
  729. data/spec/unit/knife/client_show_spec.rb +42 -0
  730. data/spec/unit/knife/config_file_selection_spec.rb +118 -0
  731. data/spec/unit/knife/configure_client_spec.rb +83 -0
  732. data/spec/unit/knife/configure_spec.rb +229 -0
  733. data/spec/unit/knife/cookbook_bulk_delete_spec.rb +87 -0
  734. data/spec/unit/knife/cookbook_create_spec.rb +271 -0
  735. data/spec/unit/knife/cookbook_delete_spec.rb +239 -0
  736. data/spec/unit/knife/cookbook_download_spec.rb +217 -0
  737. data/spec/unit/knife/cookbook_list_spec.rb +88 -0
  738. data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +65 -0
  739. data/spec/unit/knife/cookbook_metadata_spec.rb +172 -0
  740. data/spec/unit/knife/cookbook_show_spec.rb +223 -0
  741. data/spec/unit/knife/cookbook_site_download_spec.rb +151 -0
  742. data/spec/unit/knife/cookbook_site_install_spec.rb +148 -0
  743. data/spec/unit/knife/cookbook_site_share_spec.rb +146 -0
  744. data/spec/unit/knife/cookbook_site_unshare_spec.rb +77 -0
  745. data/spec/unit/knife/cookbook_test_spec.rb +83 -0
  746. data/spec/unit/knife/cookbook_upload_spec.rb +148 -0
  747. data/spec/unit/knife/core/bootstrap_context_spec.rb +135 -0
  748. data/spec/unit/knife/core/cookbook_scm_repo_spec.rb +187 -0
  749. data/spec/unit/knife/core/object_loader_spec.rb +81 -0
  750. data/spec/unit/knife/core/subcommand_loader_spec.rb +54 -0
  751. data/spec/unit/knife/core/ui_spec.rb +160 -0
  752. data/spec/unit/knife/data_bag_create_spec.rb +101 -0
  753. data/spec/unit/knife/data_bag_edit_spec.rb +96 -0
  754. data/spec/unit/knife/data_bag_from_file_spec.rb +198 -0
  755. data/spec/unit/knife/data_bag_show_spec.rb +105 -0
  756. data/spec/unit/knife/environment_create_spec.rb +91 -0
  757. data/spec/unit/knife/environment_delete_spec.rb +71 -0
  758. data/spec/unit/knife/environment_edit_spec.rb +79 -0
  759. data/spec/unit/knife/environment_from_file_spec.rb +89 -0
  760. data/spec/unit/knife/environment_list_spec.rb +54 -0
  761. data/spec/unit/knife/environment_show_spec.rb +52 -0
  762. data/spec/unit/knife/index_rebuild_spec.rb +65 -0
  763. data/spec/unit/knife/knife_help.rb +92 -0
  764. data/spec/unit/knife/node_bulk_delete_spec.rb +97 -0
  765. data/spec/unit/knife/node_delete_spec.rb +68 -0
  766. data/spec/unit/knife/node_edit_spec.rb +88 -0
  767. data/spec/unit/knife/node_from_file_spec.rb +59 -0
  768. data/spec/unit/knife/node_list_spec.rb +63 -0
  769. data/spec/unit/knife/node_run_list_add_spec.rb +125 -0
  770. data/spec/unit/knife/node_run_list_remove_spec.rb +73 -0
  771. data/spec/unit/knife/node_show_spec.rb +48 -0
  772. data/spec/unit/knife/role_bulk_delete_spec.rb +80 -0
  773. data/spec/unit/knife/role_create_spec.rb +80 -0
  774. data/spec/unit/knife/role_delete_spec.rb +67 -0
  775. data/spec/unit/knife/role_edit_spec.rb +79 -0
  776. data/spec/unit/knife/role_from_file_spec.rb +69 -0
  777. data/spec/unit/knife/role_list_spec.rb +56 -0
  778. data/spec/unit/knife/ssh_spec.rb +293 -0
  779. data/spec/unit/knife/status_spec.rb +43 -0
  780. data/spec/unit/knife/tag_create_spec.rb +23 -0
  781. data/spec/unit/knife/tag_delete_spec.rb +25 -0
  782. data/spec/unit/knife/tag_list_spec.rb +23 -0
  783. data/spec/unit/knife_spec.rb +295 -0
  784. data/spec/unit/log_spec.rb +24 -0
  785. data/spec/unit/lwrp_spec.rb +256 -0
  786. data/spec/unit/mash_spec.rb +51 -0
  787. data/spec/unit/mixin/checksum_spec.rb +41 -0
  788. data/spec/unit/mixin/command_spec.rb +105 -0
  789. data/spec/unit/mixin/convert_to_class_name_spec.rb +50 -0
  790. data/spec/unit/mixin/deep_merge_spec.rb +786 -0
  791. data/spec/unit/mixin/deprecation_spec.rb +34 -0
  792. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +90 -0
  793. data/spec/unit/mixin/language_spec.rb +305 -0
  794. data/spec/unit/mixin/params_validate_spec.rb +405 -0
  795. data/spec/unit/mixin/path_sanity_spec.rb +80 -0
  796. data/spec/unit/mixin/securable_spec.rb +254 -0
  797. data/spec/unit/mixin/shell_out_spec.rb +109 -0
  798. data/spec/unit/mixin/template_spec.rb +104 -0
  799. data/spec/unit/mixin/xml_escape_spec.rb +54 -0
  800. data/spec/unit/monkey_patches/string_spec.rb +37 -0
  801. data/spec/unit/node/attribute_spec.rb +1033 -0
  802. data/spec/unit/node_spec.rb +744 -0
  803. data/spec/unit/openid_registration_spec.rb +153 -0
  804. data/spec/unit/platform_spec.rb +241 -0
  805. data/spec/unit/provider/breakpoint_spec.rb +54 -0
  806. data/spec/unit/provider/cookbook_file_spec.rb +218 -0
  807. data/spec/unit/provider/cron/solaris_spec.rb +121 -0
  808. data/spec/unit/provider/cron_spec.rb +812 -0
  809. data/spec/unit/provider/deploy/revision_spec.rb +103 -0
  810. data/spec/unit/provider/deploy/timestamped_spec.rb +40 -0
  811. data/spec/unit/provider/deploy_spec.rb +620 -0
  812. data/spec/unit/provider/directory_spec.rb +156 -0
  813. data/spec/unit/provider/env_spec.rb +232 -0
  814. data/spec/unit/provider/erl_call_spec.rb +86 -0
  815. data/spec/unit/provider/execute_spec.rb +63 -0
  816. data/spec/unit/provider/file_spec.rb +505 -0
  817. data/spec/unit/provider/git_spec.rb +342 -0
  818. data/spec/unit/provider/group/dscl_spec.rb +294 -0
  819. data/spec/unit/provider/group/gpasswd_spec.rb +108 -0
  820. data/spec/unit/provider/group/groupadd_spec.rb +161 -0
  821. data/spec/unit/provider/group/groupmod_spec.rb +134 -0
  822. data/spec/unit/provider/group/pw_spec.rb +140 -0
  823. data/spec/unit/provider/group/usermod_spec.rb +95 -0
  824. data/spec/unit/provider/group/windows_spec.rb +94 -0
  825. data/spec/unit/provider/group_spec.rb +259 -0
  826. data/spec/unit/provider/http_request_spec.rb +178 -0
  827. data/spec/unit/provider/ifconfig_spec.rb +213 -0
  828. data/spec/unit/provider/link_spec.rb +252 -0
  829. data/spec/unit/provider/log_spec.rb +81 -0
  830. data/spec/unit/provider/mdadm_spec.rb +128 -0
  831. data/spec/unit/provider/mount/mount_spec.rb +398 -0
  832. data/spec/unit/provider/mount/windows_spec.rb +134 -0
  833. data/spec/unit/provider/mount_spec.rb +160 -0
  834. data/spec/unit/provider/ohai_spec.rb +85 -0
  835. data/spec/unit/provider/package/apt_spec.rb +352 -0
  836. data/spec/unit/provider/package/dpkg_spec.rb +216 -0
  837. data/spec/unit/provider/package/easy_install_spec.rb +112 -0
  838. data/spec/unit/provider/package/freebsd_spec.rb +259 -0
  839. data/spec/unit/provider/package/ips_spec.rb +210 -0
  840. data/spec/unit/provider/package/macports_spec.rb +203 -0
  841. data/spec/unit/provider/package/pacman_spec.rb +206 -0
  842. data/spec/unit/provider/package/portage_spec.rb +320 -0
  843. data/spec/unit/provider/package/rpm_spec.rb +152 -0
  844. data/spec/unit/provider/package/rubygems_spec.rb +639 -0
  845. data/spec/unit/provider/package/smartos_spec.rb +83 -0
  846. data/spec/unit/provider/package/solaris_spec.rb +181 -0
  847. data/spec/unit/provider/package/yum_spec.rb +1856 -0
  848. data/spec/unit/provider/package/zypper_spec.rb +159 -0
  849. data/spec/unit/provider/package_spec.rb +427 -0
  850. data/spec/unit/provider/remote_directory_spec.rb +222 -0
  851. data/spec/unit/provider/remote_file_spec.rb +288 -0
  852. data/spec/unit/provider/route_spec.rb +226 -0
  853. data/spec/unit/provider/ruby_block_spec.rb +38 -0
  854. data/spec/unit/provider/script_spec.rb +96 -0
  855. data/spec/unit/provider/service/arch_service_spec.rb +330 -0
  856. data/spec/unit/provider/service/debian_service_spec.rb +254 -0
  857. data/spec/unit/provider/service/freebsd_service_spec.rb +379 -0
  858. data/spec/unit/provider/service/gentoo_service_spec.rb +144 -0
  859. data/spec/unit/provider/service/init_service_spec.rb +212 -0
  860. data/spec/unit/provider/service/insserv_service_spec.rb +76 -0
  861. data/spec/unit/provider/service/invokercd_service_spec.rb +212 -0
  862. data/spec/unit/provider/service/macosx_spec.rb +229 -0
  863. data/spec/unit/provider/service/redhat_spec.rb +156 -0
  864. data/spec/unit/provider/service/simple_service_spec.rb +171 -0
  865. data/spec/unit/provider/service/solaris_smf_service_spec.rb +140 -0
  866. data/spec/unit/provider/service/systemd_service_spec.rb +239 -0
  867. data/spec/unit/provider/service/upstart_service_spec.rb +314 -0
  868. data/spec/unit/provider/service/windows_spec.rb +235 -0
  869. data/spec/unit/provider/service_spec.rb +169 -0
  870. data/spec/unit/provider/subversion_spec.rb +281 -0
  871. data/spec/unit/provider/template_spec.rb +196 -0
  872. data/spec/unit/provider/user/dscl_spec.rb +454 -0
  873. data/spec/unit/provider/user/pw_spec.rb +235 -0
  874. data/spec/unit/provider/user/solaris_spec.rb +414 -0
  875. data/spec/unit/provider/user/useradd_spec.rb +386 -0
  876. data/spec/unit/provider/user/windows_spec.rb +178 -0
  877. data/spec/unit/provider/user_spec.rb +468 -0
  878. data/spec/unit/provider_spec.rb +169 -0
  879. data/spec/unit/recipe_spec.rb +268 -0
  880. data/spec/unit/resource/apt_package_spec.rb +43 -0
  881. data/spec/unit/resource/bash_spec.rb +40 -0
  882. data/spec/unit/resource/breakpoint_spec.rb +43 -0
  883. data/spec/unit/resource/chef_gem_spec.rb +49 -0
  884. data/spec/unit/resource/conditional_spec.rb +147 -0
  885. data/spec/unit/resource/cookbook_file_spec.rb +89 -0
  886. data/spec/unit/resource/cron_spec.rb +181 -0
  887. data/spec/unit/resource/csh_spec.rb +40 -0
  888. data/spec/unit/resource/deploy_revision_spec.rb +47 -0
  889. data/spec/unit/resource/deploy_spec.rb +259 -0
  890. data/spec/unit/resource/directory_spec.rb +82 -0
  891. data/spec/unit/resource/dpkg_package_spec.rb +38 -0
  892. data/spec/unit/resource/easy_install_package_spec.rb +48 -0
  893. data/spec/unit/resource/env_spec.rb +85 -0
  894. data/spec/unit/resource/erl_call_spec.rb +81 -0
  895. data/spec/unit/resource/execute_spec.rb +124 -0
  896. data/spec/unit/resource/file_spec.rb +121 -0
  897. data/spec/unit/resource/freebsd_package_spec.rb +39 -0
  898. data/spec/unit/resource/gem_package_spec.rb +49 -0
  899. data/spec/unit/resource/git_spec.rb +46 -0
  900. data/spec/unit/resource/group_spec.rb +148 -0
  901. data/spec/unit/resource/http_request_spec.rb +59 -0
  902. data/spec/unit/resource/ifconfig_spec.rb +46 -0
  903. data/spec/unit/resource/ips_package_spec.rb +43 -0
  904. data/spec/unit/resource/link_spec.rb +118 -0
  905. data/spec/unit/resource/log_spec.rb +70 -0
  906. data/spec/unit/resource/macports_package_spec.rb +37 -0
  907. data/spec/unit/resource/mdadm_spec.rb +102 -0
  908. data/spec/unit/resource/mount_spec.rb +158 -0
  909. data/spec/unit/resource/ohai_spec.rb +62 -0
  910. data/spec/unit/resource/package_spec.rb +80 -0
  911. data/spec/unit/resource/pacman_package_spec.rb +38 -0
  912. data/spec/unit/resource/perl_spec.rb +40 -0
  913. data/spec/unit/resource/portage_package_spec.rb +38 -0
  914. data/spec/unit/resource/python_spec.rb +40 -0
  915. data/spec/unit/resource/remote_directory_spec.rb +97 -0
  916. data/spec/unit/resource/remote_file_spec.rb +125 -0
  917. data/spec/unit/resource/route_spec.rb +107 -0
  918. data/spec/unit/resource/rpm_package_spec.rb +38 -0
  919. data/spec/unit/resource/ruby_block_spec.rb +57 -0
  920. data/spec/unit/resource/ruby_spec.rb +40 -0
  921. data/spec/unit/resource/scm_spec.rb +159 -0
  922. data/spec/unit/resource/script_spec.rb +69 -0
  923. data/spec/unit/resource/service_spec.rb +165 -0
  924. data/spec/unit/resource/smartos_package_spec.rb +38 -0
  925. data/spec/unit/resource/subversion_spec.rb +58 -0
  926. data/spec/unit/resource/template_spec.rb +108 -0
  927. data/spec/unit/resource/timestamped_deploy_spec.rb +28 -0
  928. data/spec/unit/resource/user_spec.rb +122 -0
  929. data/spec/unit/resource/yum_package_spec.rb +85 -0
  930. data/spec/unit/resource_collection/stepable_iterator_spec.rb +144 -0
  931. data/spec/unit/resource_collection_spec.rb +257 -0
  932. data/spec/unit/resource_definition_spec.rb +119 -0
  933. data/spec/unit/resource_platform_map_spec.rb +164 -0
  934. data/spec/unit/resource_reporter_spec.rb +591 -0
  935. data/spec/unit/resource_spec.rb +721 -0
  936. data/spec/unit/rest/auth_credentials_spec.rb +431 -0
  937. data/spec/unit/rest_spec.rb +644 -0
  938. data/spec/unit/role_spec.rb +275 -0
  939. data/spec/unit/run_context_spec.rb +64 -0
  940. data/spec/unit/run_list/run_list_expansion_spec.rb +129 -0
  941. data/spec/unit/run_list/run_list_item_spec.rb +117 -0
  942. data/spec/unit/run_list/versioned_recipe_list_spec.rb +123 -0
  943. data/spec/unit/run_list_spec.rb +521 -0
  944. data/spec/unit/run_status_spec.rb +145 -0
  945. data/spec/unit/runner_spec.rb +303 -0
  946. data/spec/unit/scan_access_control_spec.rb +182 -0
  947. data/spec/unit/search/query_spec.rb +99 -0
  948. data/spec/unit/shef/model_wrapper_spec.rb +97 -0
  949. data/spec/unit/shef/shef_ext_spec.rb +153 -0
  950. data/spec/unit/shef/shef_session_spec.rb +154 -0
  951. data/spec/unit/shef_spec.rb +161 -0
  952. data/spec/unit/solr_query/query_transform_spec.rb +454 -0
  953. data/spec/unit/solr_query/solr_http_request_spec.rb +244 -0
  954. data/spec/unit/solr_query_spec.rb +203 -0
  955. data/spec/unit/util/file_edit_spec.rb +135 -0
  956. data/spec/unit/version_class_spec.rb +172 -0
  957. data/spec/unit/version_constraint_spec.rb +134 -0
  958. data/spec/unit/webui_user_spec.rb +238 -0
  959. data/tasks/rspec.rb +75 -0
  960. metadata +1548 -0
@@ -0,0 +1,1261 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/config'
20
+ require 'chef/provider/package'
21
+ require 'chef/mixin/command'
22
+ require 'chef/mixin/shell_out'
23
+ require 'chef/resource/package'
24
+ require 'singleton'
25
+ require 'chef/mixin/get_source_from_package'
26
+
27
+
28
+ class Chef
29
+ class Provider
30
+ class Package
31
+ class Yum < Chef::Provider::Package
32
+
33
+ class RPMUtils
34
+ class << self
35
+
36
+ # RPM::Version version_parse equivalent
37
+ def version_parse(evr)
38
+ return if evr.nil?
39
+
40
+ epoch = nil
41
+ # assume this is a version
42
+ version = evr
43
+ release = nil
44
+
45
+ lead = 0
46
+ tail = evr.size
47
+
48
+ if evr =~ %r{^([\d]+):}
49
+ epoch = $1.to_i
50
+ lead = $1.length + 1
51
+ elsif evr[0].ord == ":".ord
52
+ epoch = 0
53
+ lead = 1
54
+ end
55
+
56
+ if evr =~ %r{:?.*-(.*)$}
57
+ release = $1
58
+ tail = evr.length - release.length - lead - 1
59
+
60
+ if release.empty?
61
+ release = nil
62
+ end
63
+ end
64
+
65
+ version = evr[lead,tail]
66
+ if version.empty?
67
+ version = nil
68
+ end
69
+
70
+ [ epoch, version, release ]
71
+ end
72
+
73
+ # verify
74
+ def isalnum(x)
75
+ isalpha(x) or isdigit(x)
76
+ end
77
+
78
+ def isalpha(x)
79
+ v = x.ord
80
+ (v >= 65 and v <= 90) or (v >= 97 and v <= 122)
81
+ end
82
+
83
+ def isdigit(x)
84
+ v = x.ord
85
+ v >= 48 and v <= 57
86
+ end
87
+
88
+ # based on the reference spec in lib/rpmvercmp.c in rpm 4.9.0
89
+ def rpmvercmp(x, y)
90
+ # easy! :)
91
+ return 0 if x == y
92
+
93
+ if x.nil?
94
+ x = ""
95
+ end
96
+
97
+ if y.nil?
98
+ y = ""
99
+ end
100
+
101
+ # not so easy :(
102
+ #
103
+ # takes 2 strings like
104
+ #
105
+ # x = "1.20.b18.el5"
106
+ # y = "1.20.b17.el5"
107
+ #
108
+ # breaks into purely alpha and numeric segments and compares them using
109
+ # some rules
110
+ #
111
+ # * 10 > 1
112
+ # * 1 > a
113
+ # * z > a
114
+ # * Z > A
115
+ # * z > Z
116
+ # * leading zeros are ignored
117
+ # * separators (periods, commas) are ignored
118
+ # * "1.20.b18.el5.extrastuff" > "1.20.b18.el5"
119
+
120
+ x_pos = 0 # overall string element reference position
121
+ x_pos_max = x.length - 1 # number of elements in string, starting from 0
122
+ x_seg_pos = 0 # segment string element reference position
123
+ x_comp = nil # segment to compare
124
+
125
+ y_pos = 0
126
+ y_seg_pos = 0
127
+ y_pos_max = y.length - 1
128
+ y_comp = nil
129
+
130
+ while (x_pos <= x_pos_max and y_pos <= y_pos_max)
131
+ # first we skip over anything non alphanumeric
132
+ while (x_pos <= x_pos_max) and (isalnum(x[x_pos]) == false)
133
+ x_pos += 1 # +1 over pos_max if end of string
134
+ end
135
+ while (y_pos <= y_pos_max) and (isalnum(y[y_pos]) == false)
136
+ y_pos += 1
137
+ end
138
+
139
+ # if we hit the end of either we are done matching segments
140
+ if (x_pos == x_pos_max + 1) or (y_pos == y_pos_max + 1)
141
+ break
142
+ end
143
+
144
+ # we are now at the start of a alpha or numeric segment
145
+ x_seg_pos = x_pos
146
+ y_seg_pos = y_pos
147
+
148
+ # grab segment so we can compare them
149
+ if isdigit(x[x_seg_pos].ord)
150
+ x_seg_is_num = true
151
+
152
+ # already know it's a digit
153
+ x_seg_pos += 1
154
+
155
+ # gather up our digits
156
+ while (x_seg_pos <= x_pos_max) and isdigit(x[x_seg_pos])
157
+ x_seg_pos += 1
158
+ end
159
+ # copy the segment but not the unmatched character that x_seg_pos will
160
+ # refer to
161
+ x_comp = x[x_pos,x_seg_pos - x_pos]
162
+
163
+ while (y_seg_pos <= y_pos_max) and isdigit(y[y_seg_pos])
164
+ y_seg_pos += 1
165
+ end
166
+ y_comp = y[y_pos,y_seg_pos - y_pos]
167
+ else
168
+ # we are comparing strings
169
+ x_seg_is_num = false
170
+
171
+ while (x_seg_pos <= x_pos_max) and isalpha(x[x_seg_pos])
172
+ x_seg_pos += 1
173
+ end
174
+ x_comp = x[x_pos,x_seg_pos - x_pos]
175
+
176
+ while (y_seg_pos <= y_pos_max) and isalpha(y[y_seg_pos])
177
+ y_seg_pos += 1
178
+ end
179
+ y_comp = y[y_pos,y_seg_pos - y_pos]
180
+ end
181
+
182
+ # if y_seg_pos didn't advance in the above loop it means the segments are
183
+ # different types
184
+ if y_pos == y_seg_pos
185
+ # numbers always win over letters
186
+ return x_seg_is_num ? 1 : -1
187
+ end
188
+
189
+ # move the ball forward before we mess with the segments
190
+ x_pos += x_comp.length # +1 over pos_max if end of string
191
+ y_pos += y_comp.length
192
+
193
+ # we are comparing numbers - simply convert them
194
+ if x_seg_is_num
195
+ x_comp = x_comp.to_i
196
+ y_comp = y_comp.to_i
197
+ end
198
+
199
+ # compares ints or strings
200
+ # don't return if equal - try the next segment
201
+ if x_comp > y_comp
202
+ return 1
203
+ elsif x_comp < y_comp
204
+ return -1
205
+ end
206
+
207
+ # if we've reached here than the segments are the same - try again
208
+ end
209
+
210
+ # we must have reached the end of one or both of the strings and they
211
+ # matched up until this point
212
+
213
+ # segments matched completely but the segment separators were different -
214
+ # rpm reference code treats these as equal.
215
+ if (x_pos == x_pos_max + 1) and (y_pos == y_pos_max + 1)
216
+ return 0
217
+ end
218
+
219
+ # the most unprocessed characters left wins
220
+ if (x_pos_max - x_pos) > (y_pos_max - y_pos)
221
+ return 1
222
+ else
223
+ return -1
224
+ end
225
+ end
226
+
227
+ end # self
228
+ end # RPMUtils
229
+
230
+ class RPMVersion
231
+ include Comparable
232
+
233
+ def initialize(*args)
234
+ if args.size == 1
235
+ @e, @v, @r = RPMUtils.version_parse(args[0])
236
+ elsif args.size == 3
237
+ @e = args[0].to_i
238
+ @v = args[1]
239
+ @r = args[2]
240
+ else
241
+ raise ArgumentError, "Expecting either 'epoch-version-release' or 'epoch, " +
242
+ "version, release'"
243
+ end
244
+ end
245
+ attr_reader :e, :v, :r
246
+ alias :epoch :e
247
+ alias :version :v
248
+ alias :release :r
249
+
250
+ def self.parse(*args)
251
+ self.new(*args)
252
+ end
253
+
254
+ def <=>(y)
255
+ compare_versions(y)
256
+ end
257
+
258
+ def compare(y)
259
+ compare_versions(y, false)
260
+ end
261
+
262
+ def partial_compare(y)
263
+ compare_versions(y, true)
264
+ end
265
+
266
+ # RPM::Version rpm_version_to_s equivalent
267
+ def to_s
268
+ if @r.nil?
269
+ @v
270
+ else
271
+ "#{@v}-#{@r}"
272
+ end
273
+ end
274
+
275
+ def evr
276
+ "#{@e}:#{@v}-#{@r}"
277
+ end
278
+
279
+ private
280
+
281
+ # Rough RPM::Version rpm_version_cmp equivalent - except much slower :)
282
+ #
283
+ # partial lets epoch and version segment equality be good enough to return equal, eg:
284
+ #
285
+ # 2:1.2-1 == 2:1.2
286
+ # 2:1.2-1 == 2:
287
+ #
288
+ def compare_versions(y, partial=false)
289
+ x = self
290
+
291
+ # compare epoch
292
+ if (x.e.nil? == false and x.e > 0) and y.e.nil?
293
+ return 1
294
+ elsif x.e.nil? and (y.e.nil? == false and y.e > 0)
295
+ return -1
296
+ elsif x.e.nil? == false and y.e.nil? == false
297
+ if x.e < y.e
298
+ return -1
299
+ elsif x.e > y.e
300
+ return 1
301
+ end
302
+ end
303
+
304
+ # compare version
305
+ if partial and (x.v.nil? or y.v.nil?)
306
+ return 0
307
+ elsif x.v.nil? == false and y.v.nil?
308
+ return 1
309
+ elsif x.v.nil? and y.v.nil? == false
310
+ return -1
311
+ elsif x.v.nil? == false and y.v.nil? == false
312
+ cmp = RPMUtils.rpmvercmp(x.v, y.v)
313
+ return cmp if cmp != 0
314
+ end
315
+
316
+ # compare release
317
+ if partial and (x.r.nil? or y.r.nil?)
318
+ return 0
319
+ elsif x.r.nil? == false and y.r.nil?
320
+ return 1
321
+ elsif x.r.nil? and y.r.nil? == false
322
+ return -1
323
+ elsif x.r.nil? == false and y.r.nil? == false
324
+ cmp = RPMUtils.rpmvercmp(x.r, y.r)
325
+ return cmp
326
+ end
327
+
328
+ return 0
329
+ end
330
+ end
331
+
332
+ class RPMPackage
333
+ include Comparable
334
+
335
+ def initialize(*args)
336
+ if args.size == 4
337
+ @n = args[0]
338
+ @version = RPMVersion.new(args[1])
339
+ @a = args[2]
340
+ @provides = args[3]
341
+ elsif args.size == 6
342
+ @n = args[0]
343
+ e = args[1].to_i
344
+ v = args[2]
345
+ r = args[3]
346
+ @version = RPMVersion.new(e,v,r)
347
+ @a = args[4]
348
+ @provides = args[5]
349
+ else
350
+ raise ArgumentError, "Expecting either 'name, epoch-version-release, arch, provides' " +
351
+ "or 'name, epoch, version, release, arch, provides'"
352
+ end
353
+
354
+ # We always have one, ourselves!
355
+ if @provides.empty?
356
+ @provides = [ RPMProvide.new(@n, @version.evr, :==) ]
357
+ end
358
+ end
359
+ attr_reader :n, :a, :version, :provides
360
+ alias :name :n
361
+ alias :arch :a
362
+
363
+ def <=>(y)
364
+ compare(y)
365
+ end
366
+
367
+ def compare(y)
368
+ x = self
369
+
370
+ # easy! :)
371
+ return 0 if x.nevra == y.nevra
372
+
373
+ # compare name
374
+ if x.n.nil? == false and y.n.nil?
375
+ return 1
376
+ elsif x.n.nil? and y.n.nil? == false
377
+ return -1
378
+ elsif x.n.nil? == false and y.n.nil? == false
379
+ if x.n < y.n
380
+ return -1
381
+ elsif x.n > y.n
382
+ return 1
383
+ end
384
+ end
385
+
386
+ # compare version
387
+ if x.version > y.version
388
+ return 1
389
+ elsif x.version < y.version
390
+ return -1
391
+ end
392
+
393
+ # compare arch
394
+ if x.a.nil? == false and y.a.nil?
395
+ return 1
396
+ elsif x.a.nil? and y.a.nil? == false
397
+ return -1
398
+ elsif x.a.nil? == false and y.a.nil? == false
399
+ if x.a < y.a
400
+ return -1
401
+ elsif x.a > y.a
402
+ return 1
403
+ end
404
+ end
405
+
406
+ return 0
407
+ end
408
+
409
+ def to_s
410
+ nevra
411
+ end
412
+
413
+ def nevra
414
+ "#{@n}-#{@version.evr}.#{@a}"
415
+ end
416
+ end
417
+
418
+ # Simple implementation from rpm and ruby-rpm reference code
419
+ class RPMDependency
420
+ def initialize(*args)
421
+ if args.size == 3
422
+ @name = args[0]
423
+ @version = RPMVersion.new(args[1])
424
+ # Our requirement to other dependencies
425
+ @flag = args[2] || :==
426
+ elsif args.size == 5
427
+ @name = args[0]
428
+ e = args[1].to_i
429
+ v = args[2]
430
+ r = args[3]
431
+ @version = RPMVersion.new(e,v,r)
432
+ @flag = args[4] || :==
433
+ else
434
+ raise ArgumentError, "Expecting either 'name, epoch-version-release, flag' or " +
435
+ "'name, epoch, version, release, flag'"
436
+ end
437
+ end
438
+ attr_reader :name, :version, :flag
439
+
440
+ # Parses 2 forms:
441
+ #
442
+ # "mtr >= 2:0.71-3.0"
443
+ # "mta"
444
+ def self.parse(string)
445
+ if string =~ %r{^(\S+)\s+(>|>=|=|==|<=|<)\s+(\S+)$}
446
+ name = $1
447
+ if $2 == "="
448
+ flag = :==
449
+ else
450
+ flag = :"#{$2}"
451
+ end
452
+ version = $3
453
+
454
+ return self.new(name, version, flag)
455
+ else
456
+ name = string
457
+ return self.new(name, nil, nil)
458
+ end
459
+ end
460
+
461
+ # Test if another RPMDependency satisfies our requirements
462
+ def satisfy?(y)
463
+ unless y.kind_of?(RPMDependency)
464
+ raise ArgumentError, "Expecting an RPMDependency object"
465
+ end
466
+
467
+ x = self
468
+
469
+ # Easy!
470
+ if x.name != y.name
471
+ return false
472
+ end
473
+
474
+ # Partial compare
475
+ #
476
+ # eg: x.version 2.3 == y.version 2.3-1
477
+ sense = x.version.partial_compare(y.version)
478
+
479
+ # Thanks to rpmdsCompare() rpmds.c
480
+ if sense < 0 and (x.flag == :> || x.flag == :>=) || (y.flag == :<= || y.flag == :<)
481
+ return true
482
+ elsif sense > 0 and (x.flag == :< || x.flag == :<=) || (y.flag == :>= || y.flag == :>)
483
+ return true
484
+ elsif sense == 0 and (
485
+ ((x.flag == :== or x.flag == :<= or x.flag == :>=) and (y.flag == :== or y.flag == :<= or y.flag == :>=)) or
486
+ (x.flag == :< and y.flag == :<) or
487
+ (x.flag == :> and y.flag == :>)
488
+ )
489
+ return true
490
+ end
491
+
492
+ return false
493
+ end
494
+ end
495
+
496
+ class RPMProvide < RPMDependency; end
497
+ class RPMRequire < RPMDependency; end
498
+
499
+ class RPMDbPackage < RPMPackage
500
+ # <rpm parts>, installed, available
501
+ def initialize(*args)
502
+ @repoid = args.pop
503
+ # state
504
+ @available = args.pop
505
+ @installed = args.pop
506
+ super(*args)
507
+ end
508
+ attr_reader :repoid, :available, :installed
509
+ end
510
+
511
+ # Simple storage for RPMPackage objects - keeps them unique and sorted
512
+ class RPMDb
513
+ def initialize
514
+ # package name => [ RPMPackage, RPMPackage ] of different versions
515
+ @rpms = Hash.new
516
+ # package nevra => RPMPackage for lookups
517
+ @index = Hash.new
518
+ # provide name (aka feature) => [RPMPackage, RPMPackage] each providing this feature
519
+ @provides = Hash.new
520
+ # RPMPackages listed as available
521
+ @available = Set.new
522
+ # RPMPackages listed as installed
523
+ @installed = Set.new
524
+ end
525
+
526
+ def [](package_name)
527
+ self.lookup(package_name)
528
+ end
529
+
530
+ # Lookup package_name and return a descending array of package objects
531
+ def lookup(package_name)
532
+ pkgs = @rpms[package_name]
533
+ if pkgs
534
+ return pkgs.sort.reverse
535
+ else
536
+ return nil
537
+ end
538
+ end
539
+
540
+ def lookup_provides(provide_name)
541
+ @provides[provide_name]
542
+ end
543
+
544
+ # Using the package name as a key, and nevra for an index, keep a unique list of packages.
545
+ # The available/installed state can be overwritten for existing packages.
546
+ def push(*args)
547
+ args.flatten.each do |new_rpm|
548
+ unless new_rpm.kind_of?(RPMDbPackage)
549
+ raise ArgumentError, "Expecting an RPMDbPackage object"
550
+ end
551
+
552
+ @rpms[new_rpm.n] ||= Array.new
553
+
554
+ # we may already have this one, like when the installed list is refreshed
555
+ idx = @index[new_rpm.nevra]
556
+ if idx
557
+ # grab the existing package if it's not
558
+ curr_rpm = idx
559
+ else
560
+ @rpms[new_rpm.n] << new_rpm
561
+
562
+ new_rpm.provides.each do |provide|
563
+ @provides[provide.name] ||= Array.new
564
+ @provides[provide.name] << new_rpm
565
+ end
566
+
567
+ curr_rpm = new_rpm
568
+ end
569
+
570
+ # Track the nevra -> RPMPackage association to avoid having to compare versions
571
+ # with @rpms[new_rpm.n] on the next round
572
+ @index[new_rpm.nevra] = curr_rpm
573
+
574
+ # these are overwritten for existing packages
575
+ if new_rpm.available
576
+ @available << curr_rpm
577
+ end
578
+ if new_rpm.installed
579
+ @installed << curr_rpm
580
+ end
581
+ end
582
+ end
583
+
584
+ def <<(*args)
585
+ self.push(args)
586
+ end
587
+
588
+ def clear
589
+ @rpms.clear
590
+ @index.clear
591
+ @provides.clear
592
+ clear_available
593
+ clear_installed
594
+ end
595
+
596
+ def clear_available
597
+ @available.clear
598
+ end
599
+
600
+ def clear_installed
601
+ @installed.clear
602
+ end
603
+
604
+ def size
605
+ @rpms.size
606
+ end
607
+ alias :length :size
608
+
609
+ def available_size
610
+ @available.size
611
+ end
612
+
613
+ def installed_size
614
+ @installed.size
615
+ end
616
+
617
+ def available?(package)
618
+ @available.include?(package)
619
+ end
620
+
621
+ def installed?(package)
622
+ @installed.include?(package)
623
+ end
624
+
625
+ def whatprovides(rpmdep)
626
+ unless rpmdep.kind_of?(RPMDependency)
627
+ raise ArgumentError, "Expecting an RPMDependency object"
628
+ end
629
+
630
+ what = []
631
+
632
+ packages = lookup_provides(rpmdep.name)
633
+ if packages
634
+ packages.each do |pkg|
635
+ pkg.provides.each do |provide|
636
+ if provide.satisfy?(rpmdep)
637
+ what << pkg
638
+ end
639
+ end
640
+ end
641
+ end
642
+
643
+ return what
644
+ end
645
+ end
646
+
647
+ # Cache for our installed and available packages, pulled in from yum-dump.py
648
+ class YumCache
649
+ include Chef::Mixin::Command
650
+ include Chef::Mixin::ShellOut
651
+ include Singleton
652
+
653
+ def initialize
654
+ @rpmdb = RPMDb.new
655
+
656
+ # Next time @rpmdb is accessed:
657
+ # :all - Trigger a run of "yum-dump.py --options --installed-provides", updates
658
+ # yum's cache and parses options from /etc/yum.conf. Pulls in Provides
659
+ # dependency data for installed packages only - this data is slow to
660
+ # gather.
661
+ # :provides - Same as :all but pulls in Provides data for available packages as well.
662
+ # Used as a last resort when we can't find a Provides match.
663
+ # :installed - Trigger a run of "yum-dump.py --installed", only reads the local rpm
664
+ # db. Used between client runs for a quick refresh.
665
+ # :none - Do nothing, a call to one of the reload methods is required.
666
+ @next_refresh = :all
667
+
668
+ @allow_multi_install = []
669
+
670
+ @extra_repo_control = nil
671
+
672
+ # these are for subsequent runs if we are on an interval
673
+ Chef::Client.when_run_starts do
674
+ YumCache.instance.reload
675
+ end
676
+ end
677
+
678
+ attr_reader :extra_repo_control
679
+
680
+ # Cache management
681
+ #
682
+
683
+ def refresh
684
+ case @next_refresh
685
+ when :none
686
+ return nil
687
+ when :installed
688
+ reset_installed
689
+ # fast
690
+ opts=" --installed"
691
+ when :all
692
+ reset
693
+ # medium
694
+ opts=" --options --installed-provides"
695
+ when :provides
696
+ reset
697
+ # slow!
698
+ opts=" --options --all-provides"
699
+ else
700
+ raise ArgumentError, "Unexpected value in next_refresh: #{@next_refresh}"
701
+ end
702
+
703
+ if @extra_repo_control
704
+ opts << " #{@extra_repo_control}"
705
+ end
706
+
707
+ one_line = false
708
+ error = nil
709
+
710
+ helper = ::File.join(::File.dirname(__FILE__), 'yum-dump.py')
711
+ status = nil
712
+
713
+ begin
714
+ status = shell_out!("/usr/bin/python #{helper}#{opts}", :timeout => Chef::Config[:yum_timeout])
715
+ status.stdout.each_line do |line|
716
+ one_line = true
717
+
718
+ line.chomp!
719
+
720
+ if line =~ %r{\[option (.*)\] (.*)}
721
+ if $1 == "installonlypkgs"
722
+ @allow_multi_install = $2.split
723
+ else
724
+ raise Chef::Exceptions::Package, "Strange, unknown option line '#{line}' from yum-dump.py"
725
+ end
726
+ next
727
+ end
728
+
729
+ if line =~ %r{^(\S+) ([0-9]+) (\S+) (\S+) (\S+) \[(.*)\] ([i,a,r]) (\S+)$}
730
+ name = $1
731
+ epoch = $2
732
+ version = $3
733
+ release = $4
734
+ arch = $5
735
+ provides = parse_provides($6)
736
+ type = $7
737
+ repoid = $8
738
+ else
739
+ Chef::Log.warn("Problem parsing line '#{line}' from yum-dump.py! " +
740
+ "Please check your yum configuration.")
741
+ next
742
+ end
743
+
744
+ case type
745
+ when "i"
746
+ # if yum-dump was called with --installed this may not be true, but it's okay
747
+ # since we don't touch the @available Set in reload_installed
748
+ available = false
749
+ installed = true
750
+ when "a"
751
+ available = true
752
+ installed = false
753
+ when "r"
754
+ available = true
755
+ installed = true
756
+ end
757
+
758
+ pkg = RPMDbPackage.new(name, epoch, version, release, arch, provides, installed, available, repoid)
759
+ @rpmdb << pkg
760
+ end
761
+
762
+ error = status.stderr
763
+ rescue Mixlib::ShellOut::CommandTimeout => e
764
+ Chef::Log.error("#{helper} exceeded timeout #{Chef::Config[:yum_timeout]}")
765
+ raise(e)
766
+ end
767
+
768
+ if status.exitstatus != 0
769
+ raise Chef::Exceptions::Package, "Yum failed - #{status.inspect} - returns: #{error}"
770
+ else
771
+ unless one_line
772
+ Chef::Log.warn("Odd, no output from yum-dump.py. Please check " +
773
+ "your yum configuration.")
774
+ end
775
+ end
776
+
777
+ # A reload method must be called before the cache is altered
778
+ @next_refresh = :none
779
+ end
780
+
781
+ def reload
782
+ @next_refresh = :all
783
+ end
784
+
785
+ def reload_installed
786
+ @next_refresh = :installed
787
+ end
788
+
789
+ def reload_provides
790
+ @next_refresh = :provides
791
+ end
792
+
793
+ def reset
794
+ @rpmdb.clear
795
+ end
796
+
797
+ def reset_installed
798
+ @rpmdb.clear_installed
799
+ end
800
+
801
+ # Querying the cache
802
+ #
803
+
804
+ # Check for package by name or name+arch
805
+ def package_available?(package_name)
806
+ refresh
807
+
808
+ if @rpmdb.lookup(package_name)
809
+ return true
810
+ else
811
+ if package_name =~ %r{^(.*)\.(.*)$}
812
+ pkg_name = $1
813
+ pkg_arch = $2
814
+
815
+ if matches = @rpmdb.lookup(pkg_name)
816
+ matches.each do |m|
817
+ return true if m.arch == pkg_arch
818
+ end
819
+ end
820
+ end
821
+ end
822
+
823
+ return false
824
+ end
825
+
826
+ # Returns a array of packages satisfying an RPMDependency
827
+ def packages_from_require(rpmdep)
828
+ refresh
829
+ @rpmdb.whatprovides(rpmdep)
830
+ end
831
+
832
+ # Check if a package-version.arch is available to install
833
+ def version_available?(package_name, desired_version, arch=nil)
834
+ version(package_name, arch, true, false) do |v|
835
+ return true if desired_version == v
836
+ end
837
+
838
+ return false
839
+ end
840
+
841
+ # Return the source repository for a package-version.arch
842
+ def package_repository(package_name, desired_version, arch=nil)
843
+ package(package_name, arch, true, false) do |pkg|
844
+ return pkg.repoid if desired_version == pkg.version.to_s
845
+ end
846
+
847
+ return nil
848
+ end
849
+
850
+ # Return the latest available version for a package.arch
851
+ def available_version(package_name, arch=nil)
852
+ version(package_name, arch, true, false)
853
+ end
854
+ alias :candidate_version :available_version
855
+
856
+ # Return the currently installed version for a package.arch
857
+ def installed_version(package_name, arch=nil)
858
+ version(package_name, arch, false, true)
859
+ end
860
+
861
+ # Return an array of packages allowed to be installed multiple times, such as the kernel
862
+ def allow_multi_install
863
+ refresh
864
+ @allow_multi_install
865
+ end
866
+
867
+ def enable_extra_repo_control(arg)
868
+ # Don't touch cache if it's the same repos as the last load
869
+ unless @extra_repo_control == arg
870
+ @extra_repo_control = arg
871
+ reload
872
+ end
873
+ end
874
+
875
+ def disable_extra_repo_control
876
+ # Only force reload when set
877
+ if @extra_repo_control
878
+ @extra_repo_control = nil
879
+ reload
880
+ end
881
+ end
882
+
883
+ private
884
+
885
+ def version(package_name, arch=nil, is_available=false, is_installed=false)
886
+ package(package_name, arch, is_available, is_installed) do |pkg|
887
+ if block_given?
888
+ yield pkg.version.to_s
889
+ else
890
+ # first match is latest version
891
+ return pkg.version.to_s
892
+ end
893
+ end
894
+
895
+ if block_given?
896
+ return self
897
+ else
898
+ return nil
899
+ end
900
+ end
901
+
902
+ def package(package_name, arch=nil, is_available=false, is_installed=false)
903
+ refresh
904
+ packages = @rpmdb[package_name]
905
+ if packages
906
+ packages.each do |pkg|
907
+ if is_available
908
+ next unless @rpmdb.available?(pkg)
909
+ end
910
+ if is_installed
911
+ next unless @rpmdb.installed?(pkg)
912
+ end
913
+ if arch
914
+ next unless pkg.arch == arch
915
+ end
916
+
917
+ if block_given?
918
+ yield pkg
919
+ else
920
+ # first match is latest version
921
+ return pkg
922
+ end
923
+ end
924
+ end
925
+
926
+ if block_given?
927
+ return self
928
+ else
929
+ return nil
930
+ end
931
+ end
932
+
933
+ # Parse provides from yum-dump.py output
934
+ def parse_provides(string)
935
+ ret = []
936
+ # ['atk = 1.12.2-1.fc6', 'libatk-1.0.so.0']
937
+ string.split(", ").each do |seg|
938
+ # 'atk = 1.12.2-1.fc6'
939
+ if seg =~ %r{^'(.*)'$}
940
+ ret << RPMProvide.parse($1)
941
+ end
942
+ end
943
+
944
+ return ret
945
+ end
946
+
947
+ end # YumCache
948
+
949
+ include Chef::Mixin::GetSourceFromPackage
950
+
951
+ def initialize(new_resource, run_context)
952
+ super
953
+
954
+ @yum = YumCache.instance
955
+ end
956
+
957
+ # Extra attributes
958
+ #
959
+
960
+ def arch
961
+ if @new_resource.respond_to?("arch")
962
+ @new_resource.arch
963
+ else
964
+ nil
965
+ end
966
+ end
967
+
968
+ def flush_cache
969
+ if @new_resource.respond_to?("flush_cache")
970
+ @new_resource.flush_cache
971
+ else
972
+ { :before => false, :after => false }
973
+ end
974
+ end
975
+
976
+ def allow_downgrade
977
+ if @new_resource.respond_to?("allow_downgrade")
978
+ @new_resource.allow_downgrade
979
+ else
980
+ false
981
+ end
982
+ end
983
+
984
+ # Helpers
985
+ #
986
+
987
+ def yum_arch
988
+ arch ? ".#{arch}" : nil
989
+ end
990
+
991
+ def yum_command(command)
992
+ status, stdout, stderr = output_of_command(command, {:timeout => Chef::Config[:yum_timeout]})
993
+
994
+ # This is fun: rpm can encounter errors in the %post/%postun scripts which aren't
995
+ # considered fatal - meaning the rpm is still successfully installed. These issue
996
+ # cause yum to emit a non fatal warning but still exit(1). As there's currently no
997
+ # way to suppress this behavior and an exit(1) will break a Chef run we make an
998
+ # effort to trap these and re-run the same install command - it will either fail a
999
+ # second time or succeed.
1000
+ #
1001
+ # A cleaner solution would have to be done in python and better hook into
1002
+ # yum/rpm to handle exceptions as we see fit.
1003
+ if status.exitstatus == 1
1004
+ stdout.each_line do |l|
1005
+ # rpm-4.4.2.3 lib/psm.c line 2182
1006
+ if l =~ %r{^error: %(post|postun)\(.*\) scriptlet failed, exit status \d+$}
1007
+ Chef::Log.warn("#{@new_resource} caught non-fatal scriptlet issue: \"#{l}\". Can't trust yum exit status " +
1008
+ "so running install again to verify.")
1009
+ status, stdout, stderr = output_of_command(command, {:timeout => Chef::Config[:yum_timeout]})
1010
+ break
1011
+ end
1012
+ end
1013
+ end
1014
+
1015
+ if status.exitstatus > 0
1016
+ command_output = "STDOUT: #{stdout}"
1017
+ command_output << "STDERR: #{stderr}"
1018
+ handle_command_failures(status, command_output, {})
1019
+ end
1020
+ end
1021
+
1022
+ # Standard Provider methods for Parent
1023
+ #
1024
+
1025
+ def load_current_resource
1026
+ if flush_cache[:before]
1027
+ @yum.reload
1028
+ end
1029
+
1030
+ if @new_resource.options
1031
+ repo_control = []
1032
+ @new_resource.options.split.each do |opt|
1033
+ if opt =~ %r{--(enable|disable)repo=.+}
1034
+ repo_control << opt
1035
+ end
1036
+ end
1037
+
1038
+ if repo_control.size > 0
1039
+ @yum.enable_extra_repo_control(repo_control.join(" "))
1040
+ else
1041
+ @yum.disable_extra_repo_control
1042
+ end
1043
+ else
1044
+ @yum.disable_extra_repo_control
1045
+ end
1046
+
1047
+ # At this point package_name could be:
1048
+ #
1049
+ # 1) a package name, eg: "foo"
1050
+ # 2) a package name.arch, eg: "foo.i386"
1051
+ # 3) or a dependency, eg: "foo >= 1.1"
1052
+
1053
+ # Check if we have name or name+arch which has a priority over a dependency
1054
+ unless @yum.package_available?(@new_resource.package_name)
1055
+ # If they aren't in the installed packages they could be a dependency
1056
+ parse_dependency
1057
+ end
1058
+
1059
+ # Don't overwrite an existing arch
1060
+ unless arch
1061
+ parse_arch
1062
+ end
1063
+
1064
+ @current_resource = Chef::Resource::Package.new(@new_resource.name)
1065
+ @current_resource.package_name(@new_resource.package_name)
1066
+
1067
+ if @new_resource.source
1068
+ unless ::File.exists?(@new_resource.source)
1069
+ raise Chef::Exceptions::Package, "Package #{@new_resource.name} not found: #{@new_resource.source}"
1070
+ end
1071
+
1072
+ Chef::Log.debug("#{@new_resource} checking rpm status")
1073
+ shell_out!("rpm -qp --queryformat '%{NAME} %{VERSION}-%{RELEASE}\n' #{@new_resource.source}", :timeout => Chef::Config[:yum_timeout]).stdout.each_line do |line|
1074
+ case line
1075
+ when /([\w\d_.-]+)\s([\w\d_.-]+)/
1076
+ @current_resource.package_name($1)
1077
+ @new_resource.version($2)
1078
+ end
1079
+ end
1080
+ end
1081
+
1082
+ if @new_resource.version
1083
+ new_resource = "#{@new_resource.package_name}-#{@new_resource.version}#{yum_arch}"
1084
+ else
1085
+ new_resource = "#{@new_resource.package_name}#{yum_arch}"
1086
+ end
1087
+
1088
+ Chef::Log.debug("#{@new_resource} checking yum info for #{new_resource}")
1089
+
1090
+ installed_version = @yum.installed_version(@new_resource.package_name, arch)
1091
+ @current_resource.version(installed_version)
1092
+
1093
+ @candidate_version = @yum.candidate_version(@new_resource.package_name, arch)
1094
+
1095
+ Chef::Log.debug("#{@new_resource} installed version: #{installed_version || "(none)"} candidate version: " +
1096
+ "#{@candidate_version || "(none)"}")
1097
+
1098
+ @current_resource
1099
+ end
1100
+
1101
+ def install_package(name, version)
1102
+ if @new_resource.source
1103
+ yum_command("yum -d0 -e0 -y#{expand_options(@new_resource.options)} localinstall #{@new_resource.source}")
1104
+ else
1105
+ # Work around yum not exiting with an error if a package doesn't exist for CHEF-2062
1106
+ if @yum.version_available?(name, version, arch)
1107
+ method = "install"
1108
+ log_method = "installing"
1109
+
1110
+ # More Yum fun:
1111
+ #
1112
+ # yum install of an old name+version will exit(1)
1113
+ # yum install of an old name+version+arch will exit(0) for some reason
1114
+ #
1115
+ # Some packages can be installed multiple times like the kernel
1116
+ unless @yum.allow_multi_install.include?(name)
1117
+ if RPMVersion.parse(@current_resource.version) > RPMVersion.parse(version)
1118
+ # Unless they want this...
1119
+ if allow_downgrade
1120
+ method = "downgrade"
1121
+ log_method = "downgrading"
1122
+ else
1123
+ # we bail like yum when the package is older
1124
+ raise Chef::Exceptions::Package, "Installed package #{name}-#{@current_resource.version} is newer " +
1125
+ "than candidate package #{name}-#{version}"
1126
+ end
1127
+ end
1128
+ end
1129
+
1130
+ repo = @yum.package_repository(name, version, arch)
1131
+ Chef::Log.info("#{@new_resource} #{log_method} #{name}-#{version}#{yum_arch} from #{repo} repository")
1132
+
1133
+ yum_command("yum -d0 -e0 -y#{expand_options(@new_resource.options)} #{method} #{name}-#{version}#{yum_arch}")
1134
+ else
1135
+ raise Chef::Exceptions::Package, "Version #{version} of #{name} not found. Did you specify both version " +
1136
+ "and release? (version-release, e.g. 1.84-10.fc6)"
1137
+ end
1138
+ end
1139
+
1140
+ if flush_cache[:after]
1141
+ @yum.reload
1142
+ else
1143
+ @yum.reload_installed
1144
+ end
1145
+ end
1146
+
1147
+ # Keep upgrades from trying to install an older candidate version. Can happen when a new
1148
+ # version is installed then removed from a repository, now the older available version
1149
+ # shows up as a viable install candidate.
1150
+ #
1151
+ # Can be done in upgrade_package but an upgraded from->to log message slips out
1152
+ #
1153
+ # Hacky - better overall solution? Custom compare in Package provider?
1154
+ def action_upgrade
1155
+ # Could be uninstalled or have no candidate
1156
+ if @current_resource.version.nil? || candidate_version.nil?
1157
+ super
1158
+ # Ensure the candidate is newer
1159
+ elsif RPMVersion.parse(candidate_version) > RPMVersion.parse(@current_resource.version)
1160
+ super
1161
+ else
1162
+ Chef::Log.debug("#{@new_resource} is at the latest version - nothing to do")
1163
+ end
1164
+ end
1165
+
1166
+ def upgrade_package(name, version)
1167
+ install_package(name, version)
1168
+ end
1169
+
1170
+ def remove_package(name, version)
1171
+ if version
1172
+ yum_command("yum -d0 -e0 -y#{expand_options(@new_resource.options)} remove #{name}-#{version}#{yum_arch}")
1173
+ else
1174
+ yum_command("yum -d0 -e0 -y#{expand_options(@new_resource.options)} remove #{name}#{yum_arch}")
1175
+ end
1176
+
1177
+ if flush_cache[:after]
1178
+ @yum.reload
1179
+ else
1180
+ @yum.reload_installed
1181
+ end
1182
+ end
1183
+
1184
+ def purge_package(name, version)
1185
+ remove_package(name, version)
1186
+ end
1187
+
1188
+ private
1189
+
1190
+ def parse_arch
1191
+ # Allow for foo.x86_64 style package_name like yum uses in it's output
1192
+ #
1193
+ if @new_resource.package_name =~ %r{^(.*)\.(.*)$}
1194
+ new_package_name = $1
1195
+ new_arch = $2
1196
+ # foo.i386 and foo.beta1 are both valid package names or expressions of an arch.
1197
+ # Ensure we don't have an existing package matching package_name, then ensure we at
1198
+ # least have a match for the new_package+new_arch before we overwrite. If neither
1199
+ # then fall through to standard package handling.
1200
+ if (@yum.installed_version(@new_resource.package_name).nil? and @yum.candidate_version(@new_resource.package_name).nil?) and
1201
+ (@yum.installed_version(new_package_name, new_arch) or @yum.candidate_version(new_package_name, new_arch))
1202
+ @new_resource.package_name(new_package_name)
1203
+ @new_resource.arch(new_arch)
1204
+ end
1205
+ end
1206
+ end
1207
+
1208
+ # If we don't have the package we could have been passed a 'whatprovides' feature
1209
+ #
1210
+ # eg: yum install "perl(Config)"
1211
+ # yum install "mtr = 2:0.71-3.1"
1212
+ # yum install "mtr > 2:0.71"
1213
+ #
1214
+ # We support resolving these out of the Provides data imported from yum-dump.py and
1215
+ # matching them up with an actual package so the standard resource handling can apply.
1216
+ #
1217
+ # There is currently no support for filename matching.
1218
+ def parse_dependency
1219
+ # Transform the package_name into a requirement
1220
+ yum_require = RPMRequire.parse(@new_resource.package_name)
1221
+ # and gather all the packages that have a Provides feature satisfying the requirement.
1222
+ # It could be multiple be we can only manage one
1223
+ packages = @yum.packages_from_require(yum_require)
1224
+
1225
+ if packages.empty?
1226
+ # Don't bother if we are just ensuring a package is removed - we don't need Provides data
1227
+ actions = Array(@new_resource.action)
1228
+ unless actions.size == 1 and (actions[0] == :remove || actions[0] == :purge)
1229
+ Chef::Log.debug("#{@new_resource} couldn't match #{@new_resource.package_name} in " +
1230
+ "installed Provides, loading available Provides - this may take a moment")
1231
+ @yum.reload_provides
1232
+ packages = @yum.packages_from_require(yum_require)
1233
+ end
1234
+ end
1235
+
1236
+ unless packages.empty?
1237
+ new_package_name = packages.first.name
1238
+ Chef::Log.debug("#{@new_resource} no package found for #{@new_resource.package_name} " +
1239
+ "but matched Provides for #{new_package_name}")
1240
+
1241
+ # Ensure it's not the same package under a different architecture
1242
+ unique_names = []
1243
+ packages.each do |pkg|
1244
+ unique_names << "#{pkg.name}-#{pkg.version.evr}"
1245
+ end
1246
+ unique_names.uniq!
1247
+
1248
+ if unique_names.size > 1
1249
+ Chef::Log.warn("#{@new_resource} matched multiple Provides for #{@new_resource.package_name} " +
1250
+ "but we can only use the first match: #{new_package_name}. Please use a more " +
1251
+ "specific version.")
1252
+ end
1253
+
1254
+ @new_resource.package_name(new_package_name)
1255
+ end
1256
+ end
1257
+
1258
+ end
1259
+ end
1260
+ end
1261
+ end