TrueCar-chef 0.10.0.beta.3

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 (372) hide show
  1. data/LICENSE +201 -0
  2. data/README.rdoc +171 -0
  3. data/bin/chef-client +26 -0
  4. data/bin/chef-solo +25 -0
  5. data/bin/knife +26 -0
  6. data/bin/shef +34 -0
  7. data/distro/README +2 -0
  8. data/distro/arch/etc/conf.d/chef-client.conf +5 -0
  9. data/distro/arch/etc/conf.d/chef-server-webui.conf +10 -0
  10. data/distro/arch/etc/conf.d/chef-server.conf +10 -0
  11. data/distro/arch/etc/conf.d/chef-solr-indexer.conf +8 -0
  12. data/distro/arch/etc/conf.d/chef-solr.conf +8 -0
  13. data/distro/arch/etc/rc.d/chef-client +76 -0
  14. data/distro/arch/etc/rc.d/chef-server +78 -0
  15. data/distro/arch/etc/rc.d/chef-server-webui +78 -0
  16. data/distro/arch/etc/rc.d/chef-solr +78 -0
  17. data/distro/arch/etc/rc.d/chef-solr-indexer +78 -0
  18. data/distro/common/man/man1/chef-indexer.1 +42 -0
  19. data/distro/common/man/man1/chef-server-webui.1 +106 -0
  20. data/distro/common/man/man1/chef-server.1 +107 -0
  21. data/distro/common/man/man1/chef-solr-indexer.1 +55 -0
  22. data/distro/common/man/man1/chef-solr.1 +55 -0
  23. data/distro/common/man/man8/chef-client.8 +63 -0
  24. data/distro/common/man/man8/chef-solo.8 +57 -0
  25. data/distro/common/man/man8/chef-solr-rebuild.8 +37 -0
  26. data/distro/common/man/man8/knife.8 +1349 -0
  27. data/distro/common/man/man8/shef.8 +45 -0
  28. data/distro/common/markdown/README +3 -0
  29. data/distro/common/markdown/knife.mkd +865 -0
  30. data/distro/debian/etc/default/chef-client +4 -0
  31. data/distro/debian/etc/default/chef-server +9 -0
  32. data/distro/debian/etc/default/chef-server-webui +9 -0
  33. data/distro/debian/etc/default/chef-solr +8 -0
  34. data/distro/debian/etc/default/chef-solr-indexer +7 -0
  35. data/distro/debian/etc/init.d/chef-client +175 -0
  36. data/distro/debian/etc/init.d/chef-server +122 -0
  37. data/distro/debian/etc/init.d/chef-server-webui +123 -0
  38. data/distro/debian/etc/init.d/chef-solr +176 -0
  39. data/distro/debian/etc/init.d/chef-solr-indexer +176 -0
  40. data/distro/debian/etc/init/chef-client.conf +17 -0
  41. data/distro/debian/etc/init/chef-server-webui.conf +17 -0
  42. data/distro/debian/etc/init/chef-server.conf +17 -0
  43. data/distro/debian/etc/init/chef-solr-indexer.conf +17 -0
  44. data/distro/debian/etc/init/chef-solr.conf +17 -0
  45. data/distro/redhat/etc/init.d/chef-client +106 -0
  46. data/distro/redhat/etc/init.d/chef-server +112 -0
  47. data/distro/redhat/etc/init.d/chef-server-webui +112 -0
  48. data/distro/redhat/etc/init.d/chef-solr +104 -0
  49. data/distro/redhat/etc/init.d/chef-solr-indexer +104 -0
  50. data/distro/redhat/etc/logrotate.d/chef-client +8 -0
  51. data/distro/redhat/etc/logrotate.d/chef-server +8 -0
  52. data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
  53. data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
  54. data/distro/redhat/etc/logrotate.d/chef-solr-indexer +8 -0
  55. data/distro/redhat/etc/sysconfig/chef-client +15 -0
  56. data/distro/redhat/etc/sysconfig/chef-server +14 -0
  57. data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
  58. data/distro/redhat/etc/sysconfig/chef-solr +8 -0
  59. data/distro/redhat/etc/sysconfig/chef-solr-indexer +7 -0
  60. data/lib/chef.rb +40 -0
  61. data/lib/chef/api_client.rb +264 -0
  62. data/lib/chef/application.rb +137 -0
  63. data/lib/chef/application/agent.rb +18 -0
  64. data/lib/chef/application/client.rb +242 -0
  65. data/lib/chef/application/knife.rb +169 -0
  66. data/lib/chef/application/solo.rb +217 -0
  67. data/lib/chef/applications.rb +4 -0
  68. data/lib/chef/certificate.rb +194 -0
  69. data/lib/chef/checksum.rb +182 -0
  70. data/lib/chef/checksum_cache.rb +189 -0
  71. data/lib/chef/client.rb +362 -0
  72. data/lib/chef/config.rb +244 -0
  73. data/lib/chef/cookbook/chefignore.rb +66 -0
  74. data/lib/chef/cookbook/cookbook_collection.rb +45 -0
  75. data/lib/chef/cookbook/cookbook_version_loader.rb +151 -0
  76. data/lib/chef/cookbook/file_system_file_vendor.rb +56 -0
  77. data/lib/chef/cookbook/file_vendor.rb +48 -0
  78. data/lib/chef/cookbook/metadata.rb +592 -0
  79. data/lib/chef/cookbook/remote_file_vendor.rb +87 -0
  80. data/lib/chef/cookbook/syntax_check.rb +136 -0
  81. data/lib/chef/cookbook_loader.rb +103 -0
  82. data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
  83. data/lib/chef/cookbook_uploader.rb +125 -0
  84. data/lib/chef/cookbook_version.rb +979 -0
  85. data/lib/chef/cookbook_version_selector.rb +163 -0
  86. data/lib/chef/couchdb.rb +247 -0
  87. data/lib/chef/daemon.rb +172 -0
  88. data/lib/chef/data_bag.rb +223 -0
  89. data/lib/chef/data_bag_item.rb +267 -0
  90. data/lib/chef/encrypted_data_bag_item.rb +126 -0
  91. data/lib/chef/environment.rb +386 -0
  92. data/lib/chef/exceptions.rb +153 -0
  93. data/lib/chef/file_access_control.rb +140 -0
  94. data/lib/chef/file_cache.rb +218 -0
  95. data/lib/chef/handler.rb +206 -0
  96. data/lib/chef/handler/json_file.rb +58 -0
  97. data/lib/chef/index_queue.rb +29 -0
  98. data/lib/chef/index_queue/amqp_client.rb +116 -0
  99. data/lib/chef/index_queue/consumer.rb +76 -0
  100. data/lib/chef/index_queue/indexable.rb +109 -0
  101. data/lib/chef/json_compat.rb +52 -0
  102. data/lib/chef/knife.rb +424 -0
  103. data/lib/chef/knife/bootstrap.rb +185 -0
  104. data/lib/chef/knife/bootstrap/archlinux-gems.erb +47 -0
  105. data/lib/chef/knife/bootstrap/centos5-gems.erb +41 -0
  106. data/lib/chef/knife/bootstrap/client-install.vbs +80 -0
  107. data/lib/chef/knife/bootstrap/fedora13-gems.erb +38 -0
  108. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +32 -0
  109. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +46 -0
  110. data/lib/chef/knife/bootstrap/windows-gems.erb +34 -0
  111. data/lib/chef/knife/client_bulk_delete.rb +43 -0
  112. data/lib/chef/knife/client_create.rb +73 -0
  113. data/lib/chef/knife/client_delete.rb +48 -0
  114. data/lib/chef/knife/client_edit.rb +48 -0
  115. data/lib/chef/knife/client_list.rb +43 -0
  116. data/lib/chef/knife/client_reregister.rb +59 -0
  117. data/lib/chef/knife/client_show.rb +53 -0
  118. data/lib/chef/knife/configure.rb +136 -0
  119. data/lib/chef/knife/configure_client.rb +52 -0
  120. data/lib/chef/knife/cookbook_bulk_delete.rb +61 -0
  121. data/lib/chef/knife/cookbook_create.rb +274 -0
  122. data/lib/chef/knife/cookbook_delete.rb +149 -0
  123. data/lib/chef/knife/cookbook_download.rb +134 -0
  124. data/lib/chef/knife/cookbook_list.rb +50 -0
  125. data/lib/chef/knife/cookbook_metadata.rb +102 -0
  126. data/lib/chef/knife/cookbook_metadata_from_file.rb +44 -0
  127. data/lib/chef/knife/cookbook_show.rb +101 -0
  128. data/lib/chef/knife/cookbook_site_download.rb +58 -0
  129. data/lib/chef/knife/cookbook_site_list.rb +56 -0
  130. data/lib/chef/knife/cookbook_site_search.rb +51 -0
  131. data/lib/chef/knife/cookbook_site_share.rb +114 -0
  132. data/lib/chef/knife/cookbook_site_show.rb +57 -0
  133. data/lib/chef/knife/cookbook_site_unshare.rb +56 -0
  134. data/lib/chef/knife/cookbook_site_vendor.rb +145 -0
  135. data/lib/chef/knife/cookbook_test.rb +82 -0
  136. data/lib/chef/knife/cookbook_upload.rb +146 -0
  137. data/lib/chef/knife/data_bag_create.rb +94 -0
  138. data/lib/chef/knife/data_bag_delete.rb +51 -0
  139. data/lib/chef/knife/data_bag_edit.rb +94 -0
  140. data/lib/chef/knife/data_bag_from_file.rb +85 -0
  141. data/lib/chef/knife/data_bag_list.rb +46 -0
  142. data/lib/chef/knife/data_bag_show.rb +81 -0
  143. data/lib/chef/knife/environment_create.rb +53 -0
  144. data/lib/chef/knife/environment_delete.rb +45 -0
  145. data/lib/chef/knife/environment_edit.rb +45 -0
  146. data/lib/chef/knife/environment_from_file.rb +39 -0
  147. data/lib/chef/knife/environment_list.rb +42 -0
  148. data/lib/chef/knife/environment_show.rb +46 -0
  149. data/lib/chef/knife/exec.rb +51 -0
  150. data/lib/chef/knife/index_rebuild.rb +50 -0
  151. data/lib/chef/knife/node_bulk_delete.rb +46 -0
  152. data/lib/chef/knife/node_create.rb +50 -0
  153. data/lib/chef/knife/node_delete.rb +47 -0
  154. data/lib/chef/knife/node_edit.rb +163 -0
  155. data/lib/chef/knife/node_from_file.rb +45 -0
  156. data/lib/chef/knife/node_list.rb +46 -0
  157. data/lib/chef/knife/node_run_list_add.rb +67 -0
  158. data/lib/chef/knife/node_run_list_remove.rb +48 -0
  159. data/lib/chef/knife/node_show.rb +62 -0
  160. data/lib/chef/knife/recipe_list.rb +33 -0
  161. data/lib/chef/knife/role_bulk_delete.rb +47 -0
  162. data/lib/chef/knife/role_create.rb +55 -0
  163. data/lib/chef/knife/role_delete.rb +47 -0
  164. data/lib/chef/knife/role_edit.rb +48 -0
  165. data/lib/chef/knife/role_from_file.rb +49 -0
  166. data/lib/chef/knife/role_list.rb +43 -0
  167. data/lib/chef/knife/role_show.rb +54 -0
  168. data/lib/chef/knife/search.rb +123 -0
  169. data/lib/chef/knife/ssh.rb +318 -0
  170. data/lib/chef/knife/status.rb +90 -0
  171. data/lib/chef/knife/subcommand_loader.rb +101 -0
  172. data/lib/chef/knife/tag_create.rb +31 -0
  173. data/lib/chef/knife/tag_delete.rb +31 -0
  174. data/lib/chef/knife/tag_list.rb +29 -0
  175. data/lib/chef/knife/ui.rb +227 -0
  176. data/lib/chef/knife/windows_bootstrap.rb +157 -0
  177. data/lib/chef/log.rb +39 -0
  178. data/lib/chef/mash.rb +211 -0
  179. data/lib/chef/mixin/check_helper.rb +31 -0
  180. data/lib/chef/mixin/checksum.rb +32 -0
  181. data/lib/chef/mixin/command.rb +221 -0
  182. data/lib/chef/mixin/command/unix.rb +215 -0
  183. data/lib/chef/mixin/command/windows.rb +76 -0
  184. data/lib/chef/mixin/convert_to_class_name.rb +63 -0
  185. data/lib/chef/mixin/create_path.rb +56 -0
  186. data/lib/chef/mixin/deep_merge.rb +225 -0
  187. data/lib/chef/mixin/deprecation.rb +65 -0
  188. data/lib/chef/mixin/from_file.rb +50 -0
  189. data/lib/chef/mixin/language.rb +165 -0
  190. data/lib/chef/mixin/language_include_attribute.rb +61 -0
  191. data/lib/chef/mixin/language_include_recipe.rb +52 -0
  192. data/lib/chef/mixin/params_validate.rb +225 -0
  193. data/lib/chef/mixin/recipe_definition_dsl_core.rb +81 -0
  194. data/lib/chef/mixin/shell_out.rb +40 -0
  195. data/lib/chef/mixin/template.rb +95 -0
  196. data/lib/chef/mixin/xml_escape.rb +140 -0
  197. data/lib/chef/mixins.rb +15 -0
  198. data/lib/chef/monkey_patches/dir.rb +36 -0
  199. data/lib/chef/monkey_patches/numeric.rb +7 -0
  200. data/lib/chef/monkey_patches/regexp.rb +34 -0
  201. data/lib/chef/monkey_patches/string.rb +28 -0
  202. data/lib/chef/monkey_patches/tempfile.rb +64 -0
  203. data/lib/chef/nil_argument.rb +3 -0
  204. data/lib/chef/node.rb +661 -0
  205. data/lib/chef/node/attribute.rb +487 -0
  206. data/lib/chef/openid_registration.rb +187 -0
  207. data/lib/chef/platform.rb +409 -0
  208. data/lib/chef/provider.rb +124 -0
  209. data/lib/chef/provider/breakpoint.rb +36 -0
  210. data/lib/chef/provider/cookbook_file.rb +101 -0
  211. data/lib/chef/provider/cron.rb +186 -0
  212. data/lib/chef/provider/cron/solaris.rb +195 -0
  213. data/lib/chef/provider/deploy.rb +320 -0
  214. data/lib/chef/provider/deploy/revision.rb +80 -0
  215. data/lib/chef/provider/deploy/timestamped.rb +33 -0
  216. data/lib/chef/provider/directory.rb +72 -0
  217. data/lib/chef/provider/env.rb +152 -0
  218. data/lib/chef/provider/env/windows.rb +75 -0
  219. data/lib/chef/provider/erl_call.rb +100 -0
  220. data/lib/chef/provider/execute.rb +60 -0
  221. data/lib/chef/provider/file.rb +222 -0
  222. data/lib/chef/provider/git.rb +221 -0
  223. data/lib/chef/provider/group.rb +133 -0
  224. data/lib/chef/provider/group/aix.rb +70 -0
  225. data/lib/chef/provider/group/dscl.rb +121 -0
  226. data/lib/chef/provider/group/gpasswd.rb +53 -0
  227. data/lib/chef/provider/group/groupadd.rb +81 -0
  228. data/lib/chef/provider/group/pw.rb +84 -0
  229. data/lib/chef/provider/group/usermod.rb +57 -0
  230. data/lib/chef/provider/group/windows.rb +79 -0
  231. data/lib/chef/provider/http_request.rb +122 -0
  232. data/lib/chef/provider/ifconfig.rb +132 -0
  233. data/lib/chef/provider/link.rb +161 -0
  234. data/lib/chef/provider/log.rb +54 -0
  235. data/lib/chef/provider/mdadm.rb +91 -0
  236. data/lib/chef/provider/mount.rb +117 -0
  237. data/lib/chef/provider/mount/mount.rb +232 -0
  238. data/lib/chef/provider/mount/windows.rb +80 -0
  239. data/lib/chef/provider/ohai.rb +41 -0
  240. data/lib/chef/provider/package.rb +160 -0
  241. data/lib/chef/provider/package/apt.rb +110 -0
  242. data/lib/chef/provider/package/dpkg.rb +112 -0
  243. data/lib/chef/provider/package/easy_install.rb +136 -0
  244. data/lib/chef/provider/package/freebsd.rb +123 -0
  245. data/lib/chef/provider/package/macports.rb +105 -0
  246. data/lib/chef/provider/package/pacman.rb +101 -0
  247. data/lib/chef/provider/package/portage.rb +135 -0
  248. data/lib/chef/provider/package/rpm.rb +101 -0
  249. data/lib/chef/provider/package/rubygems.rb +462 -0
  250. data/lib/chef/provider/package/solaris.rb +127 -0
  251. data/lib/chef/provider/package/yum-dump.py +128 -0
  252. data/lib/chef/provider/package/yum.rb +261 -0
  253. data/lib/chef/provider/package/zypper.rb +133 -0
  254. data/lib/chef/provider/remote_directory.rb +138 -0
  255. data/lib/chef/provider/remote_file.rb +119 -0
  256. data/lib/chef/provider/route.rb +195 -0
  257. data/lib/chef/provider/ruby_block.rb +33 -0
  258. data/lib/chef/provider/script.rb +55 -0
  259. data/lib/chef/provider/service.rb +128 -0
  260. data/lib/chef/provider/service/arch.rb +109 -0
  261. data/lib/chef/provider/service/debian.rb +130 -0
  262. data/lib/chef/provider/service/freebsd.rb +156 -0
  263. data/lib/chef/provider/service/gentoo.rb +54 -0
  264. data/lib/chef/provider/service/init.rb +71 -0
  265. data/lib/chef/provider/service/insserv.rb +52 -0
  266. data/lib/chef/provider/service/redhat.rb +60 -0
  267. data/lib/chef/provider/service/simple.rb +118 -0
  268. data/lib/chef/provider/service/solaris.rb +85 -0
  269. data/lib/chef/provider/service/upstart.rb +192 -0
  270. data/lib/chef/provider/service/windows.rb +146 -0
  271. data/lib/chef/provider/subversion.rb +194 -0
  272. data/lib/chef/provider/template.rb +105 -0
  273. data/lib/chef/provider/user.rb +187 -0
  274. data/lib/chef/provider/user/dscl.rb +280 -0
  275. data/lib/chef/provider/user/pw.rb +113 -0
  276. data/lib/chef/provider/user/useradd.rb +137 -0
  277. data/lib/chef/provider/user/windows.rb +124 -0
  278. data/lib/chef/providers.rb +93 -0
  279. data/lib/chef/recipe.rb +128 -0
  280. data/lib/chef/resource.rb +530 -0
  281. data/lib/chef/resource/apt_package.rb +34 -0
  282. data/lib/chef/resource/bash.rb +33 -0
  283. data/lib/chef/resource/breakpoint.rb +35 -0
  284. data/lib/chef/resource/cookbook_file.rb +45 -0
  285. data/lib/chef/resource/cron.rb +188 -0
  286. data/lib/chef/resource/csh.rb +33 -0
  287. data/lib/chef/resource/deploy.rb +371 -0
  288. data/lib/chef/resource/deploy_revision.rb +35 -0
  289. data/lib/chef/resource/directory.rb +76 -0
  290. data/lib/chef/resource/dpkg_package.rb +34 -0
  291. data/lib/chef/resource/easy_install_package.rb +57 -0
  292. data/lib/chef/resource/env.rb +58 -0
  293. data/lib/chef/resource/erl_call.rb +83 -0
  294. data/lib/chef/resource/execute.rb +127 -0
  295. data/lib/chef/resource/file.rb +99 -0
  296. data/lib/chef/resource/freebsd_package.rb +35 -0
  297. data/lib/chef/resource/gem_package.rb +53 -0
  298. data/lib/chef/resource/git.rb +37 -0
  299. data/lib/chef/resource/group.rb +70 -0
  300. data/lib/chef/resource/http_request.rb +61 -0
  301. data/lib/chef/resource/ifconfig.rb +134 -0
  302. data/lib/chef/resource/link.rb +78 -0
  303. data/lib/chef/resource/log.rb +62 -0
  304. data/lib/chef/resource/macports_package.rb +29 -0
  305. data/lib/chef/resource/mdadm.rb +82 -0
  306. data/lib/chef/resource/mount.rb +135 -0
  307. data/lib/chef/resource/ohai.rb +40 -0
  308. data/lib/chef/resource/package.rb +80 -0
  309. data/lib/chef/resource/pacman_package.rb +33 -0
  310. data/lib/chef/resource/perl.rb +33 -0
  311. data/lib/chef/resource/portage_package.rb +33 -0
  312. data/lib/chef/resource/python.rb +33 -0
  313. data/lib/chef/resource/remote_directory.rb +109 -0
  314. data/lib/chef/resource/remote_file.rb +83 -0
  315. data/lib/chef/resource/route.rb +135 -0
  316. data/lib/chef/resource/rpm_package.rb +34 -0
  317. data/lib/chef/resource/ruby.rb +33 -0
  318. data/lib/chef/resource/ruby_block.rb +40 -0
  319. data/lib/chef/resource/scm.rb +147 -0
  320. data/lib/chef/resource/script.rb +60 -0
  321. data/lib/chef/resource/service.rb +160 -0
  322. data/lib/chef/resource/solaris_package.rb +36 -0
  323. data/lib/chef/resource/subversion.rb +36 -0
  324. data/lib/chef/resource/template.rb +69 -0
  325. data/lib/chef/resource/timestamped_deploy.rb +31 -0
  326. data/lib/chef/resource/user.rb +130 -0
  327. data/lib/chef/resource/yum_package.rb +43 -0
  328. data/lib/chef/resource_collection.rb +217 -0
  329. data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
  330. data/lib/chef/resource_definition.rb +67 -0
  331. data/lib/chef/resource_definition_list.rb +38 -0
  332. data/lib/chef/resources.rb +64 -0
  333. data/lib/chef/rest.rb +386 -0
  334. data/lib/chef/rest/auth_credentials.rb +71 -0
  335. data/lib/chef/rest/cookie_jar.rb +31 -0
  336. data/lib/chef/rest/rest_request.rb +188 -0
  337. data/lib/chef/role.rb +341 -0
  338. data/lib/chef/run_context.rb +126 -0
  339. data/lib/chef/run_list.rb +165 -0
  340. data/lib/chef/run_list/run_list_expansion.rb +193 -0
  341. data/lib/chef/run_list/run_list_item.rb +92 -0
  342. data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
  343. data/lib/chef/run_status.rb +121 -0
  344. data/lib/chef/runner.rb +99 -0
  345. data/lib/chef/sandbox.rb +153 -0
  346. data/lib/chef/search/query.rb +65 -0
  347. data/lib/chef/shef.rb +326 -0
  348. data/lib/chef/shef/ext.rb +569 -0
  349. data/lib/chef/shef/model_wrapper.rb +120 -0
  350. data/lib/chef/shef/shef_rest.rb +28 -0
  351. data/lib/chef/shef/shef_session.rb +284 -0
  352. data/lib/chef/shell_out.rb +238 -0
  353. data/lib/chef/shell_out/unix.rb +223 -0
  354. data/lib/chef/shell_out/windows.rb +98 -0
  355. data/lib/chef/solr_query.rb +187 -0
  356. data/lib/chef/solr_query/lucene.treetop +150 -0
  357. data/lib/chef/solr_query/lucene_nodes.rb +285 -0
  358. data/lib/chef/solr_query/query_transform.rb +65 -0
  359. data/lib/chef/solr_query/solr_http_request.rb +118 -0
  360. data/lib/chef/streaming_cookbook_uploader.rb +201 -0
  361. data/lib/chef/tasks/chef_repo.rake +256 -0
  362. data/lib/chef/util/file_edit.rb +122 -0
  363. data/lib/chef/util/windows.rb +56 -0
  364. data/lib/chef/util/windows/net_group.rb +101 -0
  365. data/lib/chef/util/windows/net_use.rb +121 -0
  366. data/lib/chef/util/windows/net_user.rb +198 -0
  367. data/lib/chef/util/windows/volume.rb +59 -0
  368. data/lib/chef/version.rb +23 -0
  369. data/lib/chef/version_class.rb +70 -0
  370. data/lib/chef/version_constraint.rb +116 -0
  371. data/lib/chef/webui_user.rb +231 -0
  372. metadata +600 -0
@@ -0,0 +1,135 @@
1
+ #
2
+ # Author:: Ezra Zygmuntowicz (<ezra@engineyard.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/provider/package'
20
+ require 'chef/mixin/command'
21
+ require 'chef/resource/package'
22
+
23
+ class Chef
24
+ class Provider
25
+ class Package
26
+ class Portage < Chef::Provider::Package
27
+ PACKAGE_NAME_PATTERN = %r{(([^/]+)/)?([^/]+)}
28
+
29
+ def load_current_resource
30
+ @current_resource = Chef::Resource::Package.new(@new_resource.name)
31
+ @current_resource.package_name(@new_resource.package_name)
32
+
33
+ @current_resource.version(nil)
34
+
35
+ _, category_with_slash, category, pkg = %r{^#{PACKAGE_NAME_PATTERN}$}.match(@new_resource.package_name).to_a
36
+
37
+ possibilities = Dir["/var/db/pkg/#{category || "*"}/#{pkg}-*"].map {|d| d.sub(%r{/var/db/pkg/}, "") }
38
+ versions = possibilities.map do |entry|
39
+ if(entry =~ %r{[^/]+/#{Regexp.escape(pkg)}\-(\d[\.\d]*((_(alpha|beta|pre|rc|p)\d*)*)?(-r\d+)?)})
40
+ [$&, $1]
41
+ end
42
+ end.compact
43
+
44
+ if versions.size > 1
45
+ atoms = versions.map {|v| v.first }.sort
46
+ raise Chef::Exceptions::Package, "Multiple packages found for #{@new_resource.package_name}: #{atoms.join(" ")}. Specify a category."
47
+ elsif versions.size == 1
48
+ @current_resource.version(versions.first.last)
49
+ Chef::Log.debug("Got current version #{$1}")
50
+ end
51
+
52
+ @current_resource
53
+ end
54
+
55
+
56
+ def parse_emerge(package, txt)
57
+ availables = {}
58
+ package_without_category = package.split("/").last
59
+ found_package_name = nil
60
+
61
+ txt.each_line do |line|
62
+ if line =~ /\*\s+#{PACKAGE_NAME_PATTERN}/
63
+ found_package_name = $&.strip
64
+ if found_package_name == package || found_package_name.split("/").last == package_without_category
65
+ availables[found_package_name] = nil
66
+ end
67
+ end
68
+
69
+ if line =~ /Latest version available: (.*)/ && availables.has_key?(found_package_name)
70
+ availables[found_package_name] = $1.strip
71
+ end
72
+ end
73
+
74
+ if availables.size > 1
75
+ # shouldn't happen if a category is specified so just use `package`
76
+ raise Chef::Exceptions::Package, "Multiple emerge results found for #{package}: #{availables.keys.join(" ")}. Specify a category."
77
+ end
78
+
79
+ availables.values.first
80
+ end
81
+
82
+ def candidate_version
83
+ return @candidate_version if @candidate_version
84
+
85
+ status = popen4("emerge --color n --nospinner --search #{@new_resource.package_name.split('/').last}") do |pid, stdin, stdout, stderr|
86
+ available, installed = parse_emerge(@new_resource.package_name, stdout.read)
87
+ @candidate_version = available
88
+ end
89
+
90
+ unless status.exitstatus == 0
91
+ raise Chef::Exceptions::Package, "emerge --search failed - #{status.inspect}!"
92
+ end
93
+
94
+ @candidate_version
95
+
96
+ end
97
+
98
+
99
+ def install_package(name, version)
100
+ pkg = "=#{name}-#{version}"
101
+
102
+ if(version =~ /^\~(.+)/)
103
+ # If we start with a tilde
104
+ pkg = "~#{name}-#{$1}"
105
+ end
106
+
107
+ run_command_with_systems_locale(
108
+ :command => "emerge -g --color n --nospinner --quiet#{expand_options(@new_resource.options)} #{pkg}"
109
+ )
110
+ end
111
+
112
+ def upgrade_package(name, version)
113
+ install_package(name, version)
114
+ end
115
+
116
+ def remove_package(name, version)
117
+ if(version)
118
+ pkg = "=#{@new_resource.package_name}-#{version}"
119
+ else
120
+ pkg = "#{@new_resource.package_name}"
121
+ end
122
+
123
+ run_command_with_systems_locale(
124
+ :command => "emerge --unmerge --color n --nospinner --quiet#{expand_options(@new_resource.options)} #{pkg}"
125
+ )
126
+ end
127
+
128
+ def purge_package(name, version)
129
+ remove_package(name, version)
130
+ end
131
+
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,101 @@
1
+ #
2
+ # Author:: Joshua Timberman (<joshua@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
+ require 'chef/provider/package'
19
+ require 'chef/mixin/command'
20
+ require 'chef/resource/package'
21
+
22
+ class Chef
23
+ class Provider
24
+ class Package
25
+ class Rpm < Chef::Provider::Package
26
+
27
+ def load_current_resource
28
+ @current_resource = Chef::Resource::Package.new(@new_resource.name)
29
+ @current_resource.package_name(@new_resource.package_name)
30
+ @new_resource.version(nil)
31
+
32
+ if @new_resource.source
33
+ unless ::File.exists?(@new_resource.source)
34
+ raise Chef::Exceptions::Package, "Package #{@new_resource.name} not found: #{@new_resource.source}"
35
+ end
36
+
37
+ Chef::Log.debug("Checking rpm status for #{@new_resource.package_name}")
38
+ status = popen4("rpm -qp --queryformat '%{NAME} %{VERSION}-%{RELEASE}\n' #{@new_resource.source}") do |pid, stdin, stdout, stderr|
39
+ stdout.each do |line|
40
+ case line
41
+ when /([\w\d_.-]+)\s([\w\d_.-]+)/
42
+ @current_resource.package_name($1)
43
+ @new_resource.version($2)
44
+ end
45
+ end
46
+ end
47
+ else
48
+ if Array(@new_resource.action).include?(:install)
49
+ raise Chef::Exceptions::Package, "Source for package #{@new_resource.name} required for action install"
50
+ end
51
+ end
52
+
53
+ Chef::Log.debug("Checking install state for #{@current_resource.package_name}")
54
+ status = popen4("rpm -q --queryformat '%{NAME} %{VERSION}-%{RELEASE}\n' #{@current_resource.package_name}") do |pid, stdin, stdout, stderr|
55
+ stdout.each do |line|
56
+ case line
57
+ when /([\w\d_.-]+)\s([\w\d_.-]+)/
58
+ Chef::Log.debug("Current version is #{$2}")
59
+ @current_resource.version($2)
60
+ end
61
+ end
62
+ end
63
+
64
+ unless status.exitstatus == 0 || status.exitstatus == 1
65
+ raise Chef::Exceptions::Package, "rpm failed - #{status.inspect}!"
66
+ end
67
+
68
+ @current_resource
69
+ end
70
+
71
+ def install_package(name, version)
72
+ unless @current_resource.version
73
+ run_command_with_systems_locale(
74
+ :command => "rpm #{@new_resource.options} -i #{@new_resource.source}"
75
+ )
76
+ else
77
+ run_command_with_systems_locale(
78
+ :command => "rpm #{@new_resource.options} -U #{@new_resource.source}"
79
+ )
80
+ end
81
+ end
82
+
83
+ alias_method :upgrade_package, :install_package
84
+
85
+ def remove_package(name, version)
86
+ if version
87
+ run_command_with_systems_locale(
88
+ :command => "rpm #{@new_resource.options} -e #{name}-#{version}"
89
+ )
90
+ else
91
+ run_command_with_systems_locale(
92
+ :command => "rpm #{@new_resource.options} -e #{name}"
93
+ )
94
+ end
95
+ end
96
+
97
+ end
98
+ end
99
+ end
100
+ end
101
+
@@ -0,0 +1,462 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
4
+ # Copyright:: Copyright (c) 2008, 2010 Opscode, Inc.
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ require 'chef/provider/package'
21
+ require 'chef/mixin/command'
22
+ require 'chef/resource/package'
23
+
24
+ # Class methods on Gem are defined in rubygems
25
+ require 'rubygems'
26
+ # Ruby 1.9's gem_prelude can interact poorly with loading the full rubygems
27
+ # explicitly like this. Make sure rubygems/specification is always last in this
28
+ # list
29
+ require 'rubygems/version'
30
+ require 'rubygems/dependency'
31
+ require 'rubygems/spec_fetcher'
32
+ require 'rubygems/platform'
33
+ require 'rubygems/format'
34
+ require 'rubygems/dependency_installer'
35
+ require 'rubygems/uninstaller'
36
+ require 'rubygems/specification'
37
+
38
+ class Chef
39
+ class Provider
40
+ class Package
41
+ class Rubygems < Chef::Provider::Package
42
+ class GemEnvironment
43
+ # HACK: trigger gem config load early. Otherwise it can get lazy
44
+ # loaded during operations where we've set Gem.sources to an
45
+ # alternate value and overwrite it with the defaults.
46
+ Gem.configuration
47
+
48
+ DEFAULT_UNINSTALLER_OPTS = {:ignore => true, :executables => true}
49
+
50
+ ##
51
+ # The paths where rubygems should search for installed gems.
52
+ # Implemented by subclasses.
53
+ def gem_paths
54
+ raise NotImplementedError
55
+ end
56
+
57
+ ##
58
+ # A rubygems source index containing the list of gemspecs for all
59
+ # available gems in the gem installation.
60
+ # Implemented by subclasses
61
+ # === Returns
62
+ # Gem::SourceIndex
63
+ def gem_source_index
64
+ raise NotImplementedError
65
+ end
66
+
67
+ ##
68
+ # Lists the installed versions of +gem_name+, constrained by the
69
+ # version spec in +gem_dep+
70
+ # === Arguments
71
+ # Gem::Dependency +gem_dep+ is a Gem::Dependency object, its version
72
+ # specification constrains which gems are returned.
73
+ # === Returns
74
+ # [Gem::Specification] an array of Gem::Specification objects
75
+ def installed_versions(gem_dep)
76
+ gem_source_index.search(gem_dep)
77
+ end
78
+
79
+ ##
80
+ # Yields to the provided block with rubygems' source list set to the
81
+ # list provided. Always resets the list when the block returns or
82
+ # raises an exception.
83
+ def with_gem_sources(*sources)
84
+ sources.compact!
85
+ original_sources = Gem.sources
86
+ Gem.sources = sources unless sources.empty?
87
+ yield
88
+ ensure
89
+ Gem.sources = original_sources
90
+ end
91
+
92
+ ##
93
+ # Determines the candidate version for a gem from a .gem file on disk
94
+ # and checks if it matches the version contraints in +gem_dependency+
95
+ # === Returns
96
+ # Gem::Version a singular gem version object is returned if the gem
97
+ # is available
98
+ # nil returns nil if the gem on disk doesn't match the
99
+ # version constraints for +gem_dependency+
100
+ def candidate_version_from_file(gem_dependency, source)
101
+ spec = Gem::Format.from_file_by_path(source).spec
102
+ if spec.satisfies_requirement?(gem_dependency)
103
+ logger.debug {"found candidate gem version #{spec.version} from local gem package #{source}"}
104
+ spec.version
105
+ else
106
+ # This is probably going to end badly...
107
+ logger.warn { "The gem package #{source} does not satisfy the requirements #{gem_dependency.to_s}" }
108
+ nil
109
+ end
110
+ end
111
+
112
+ ##
113
+ # Finds the newest version that satisfies the constraints of
114
+ # +gem_dependency+. The version is determined from the cache or a
115
+ # round-trip to the server as needed. The architecture and gem
116
+ # sources will be set before making the query.
117
+ # === Returns
118
+ # Gem::Version a singular gem version object is returned if the gem
119
+ # is available
120
+ # nil returns nil if the gem could not be found
121
+ def candidate_version_from_remote(gem_dependency, *sources)
122
+ raise NotImplementedError
123
+ end
124
+
125
+ ##
126
+ # Find the newest gem version available from Gem.sources that satisfies
127
+ # the constraints of +gem_dependency+
128
+ def find_newest_remote_version(gem_dependency, *sources)
129
+ # DependencyInstaller sorts the results such that the last one is
130
+ # always the one it considers best.
131
+ spec_with_source = dependency_installer.find_gems_with_sources(gem_dependency).last
132
+
133
+ spec = spec_with_source && spec_with_source[0]
134
+ version = spec && spec_with_source[0].version
135
+ if version
136
+ logger.debug { "Found gem #{spec.name} version #{version} for platform #{spec.platform} from #{spec_with_source[1]}" }
137
+ version
138
+ else
139
+ source_list = sources.compact.empty? ? "[#{Gem.sources.join(', ')}]" : "[#{sources.join(', ')}]"
140
+ logger.warn { "Failed to find gem #{gem_dependency} from #{source_list}" }
141
+ nil
142
+ end
143
+ end
144
+
145
+ ##
146
+ # Installs a gem via the rubygems ruby API.
147
+ # === Options
148
+ # :sources rubygems servers to use
149
+ # Other options are passed to Gem::DependencyInstaller.new
150
+ def install(gem_dependency, options={})
151
+ with_gem_sources(*options.delete(:sources)) do
152
+ with_correct_verbosity do
153
+ dependency_installer(options).install(gem_dependency)
154
+ end
155
+ end
156
+ end
157
+
158
+ ##
159
+ # Uninstall the gem +gem_name+ via the rubygems ruby API. If
160
+ # +gem_version+ is provided, only that version will be uninstalled.
161
+ # Otherwise, all versions are uninstalled.
162
+ # === Options
163
+ # Options are passed to Gem::Uninstaller.new
164
+ def uninstall(gem_name, gem_version=nil, opts={})
165
+ gem_version ? opts[:version] = gem_version : opts[:all] = true
166
+ with_correct_verbosity do
167
+ uninstaller(gem_name, opts).uninstall
168
+ end
169
+ end
170
+
171
+ ##
172
+ # Set rubygems' user interaction to ConsoleUI or SilentUI depending
173
+ # on our current debug level
174
+ def with_correct_verbosity
175
+ Gem::DefaultUserInteraction.ui = Chef::Log.debug? ? Gem::ConsoleUI.new : Gem::SilentUI.new
176
+ yield
177
+ end
178
+
179
+ def dependency_installer(opts={})
180
+ Gem::DependencyInstaller.new(opts)
181
+ end
182
+
183
+ def uninstaller(gem_name, opts={})
184
+ Gem::Uninstaller.new(gem_name, DEFAULT_UNINSTALLER_OPTS.merge(opts))
185
+ end
186
+
187
+ private
188
+
189
+ def logger
190
+ Chef::Log.logger
191
+ end
192
+
193
+ end
194
+
195
+ class CurrentGemEnvironment < GemEnvironment
196
+
197
+ def gem_paths
198
+ Gem.path
199
+ end
200
+
201
+ def gem_source_index
202
+ Gem.source_index
203
+ end
204
+
205
+ def candidate_version_from_remote(gem_dependency, *sources)
206
+ with_gem_sources(*sources) do
207
+ find_newest_remote_version(gem_dependency, *sources)
208
+ end
209
+ end
210
+
211
+ end
212
+
213
+ class AlternateGemEnvironment < GemEnvironment
214
+ JRUBY_PLATFORM = /(:?universal|x86_64|x86)\-java\-[0-9\.]+/
215
+
216
+ def self.gempath_cache
217
+ @gempath_cache ||= {}
218
+ end
219
+
220
+ def self.platform_cache
221
+ @platform_cache ||= {}
222
+ end
223
+
224
+ include Chef::Mixin::ShellOut
225
+
226
+ attr_reader :gem_binary_location
227
+
228
+ def initialize(gem_binary_location)
229
+ @gem_binary_location = gem_binary_location
230
+ end
231
+
232
+ def gem_paths
233
+ if self.class.gempath_cache.key?(@gem_binary_location)
234
+ self.class.gempath_cache[@gem_binary_location]
235
+ else
236
+ # shellout! is a fork/exec which won't work on windows
237
+ shell_style_paths = shell_out!("#{@gem_binary_location} env gempath").stdout
238
+ # on windows, the path separator is (usually? always?) semicolon
239
+ paths = shell_style_paths.split(::File::PATH_SEPARATOR).map { |path| path.strip }
240
+ self.class.gempath_cache[@gem_binary_location] = paths
241
+ end
242
+ end
243
+
244
+ def gem_source_index
245
+ @source_index ||= Gem::SourceIndex.from_gems_in(*gem_paths.map { |p| p + '/specifications' })
246
+ end
247
+
248
+ ##
249
+ # Attempt to detect the correct platform settings for the target gem
250
+ # environment.
251
+ #
252
+ # In practice, this only makes a difference if different versions are
253
+ # available depending on platform, and only if the target gem
254
+ # environment has a radically different platform (i.e., jruby), so we
255
+ # just try to detect jruby and fall back to the current platforms
256
+ # (Gem.platforms) if we don't detect it.
257
+ #
258
+ # === Returns
259
+ # [String|Gem::Platform] returns an array of Gem::Platform-compatible
260
+ # objects, i.e., Strings that are valid for Gem::Platform or actual
261
+ # Gem::Platform objects.
262
+ def gem_platforms
263
+ if self.class.platform_cache.key?(@gem_binary_location)
264
+ self.class.platform_cache[@gem_binary_location]
265
+ else
266
+ gem_environment = shell_out!("#{@gem_binary_location} env").stdout
267
+ if jruby = gem_environment[JRUBY_PLATFORM]
268
+ self.class.platform_cache[@gem_binary_location] = ['ruby', Gem::Platform.new(jruby)]
269
+ else
270
+ self.class.platform_cache[@gem_binary_location] = Gem.platforms
271
+ end
272
+ end
273
+ end
274
+
275
+ def with_gem_platforms(*alt_gem_platforms)
276
+ alt_gem_platforms.flatten!
277
+ original_gem_platforms = Gem.platforms
278
+ Gem.platforms = alt_gem_platforms
279
+ yield
280
+ ensure
281
+ Gem.platforms = original_gem_platforms
282
+ end
283
+
284
+ def candidate_version_from_remote(gem_dependency, *sources)
285
+ with_gem_sources(*sources) do
286
+ with_gem_platforms(*gem_platforms) do
287
+ find_newest_remote_version(gem_dependency, *sources)
288
+ end
289
+ end
290
+ end
291
+
292
+ end
293
+
294
+ include Chef::Mixin::ShellOut
295
+
296
+ attr_reader :gem_env
297
+
298
+ def logger
299
+ Chef::Log.logger
300
+ end
301
+
302
+ def initialize(new_resource, run_context=nil)
303
+ super
304
+ if new_resource.gem_binary
305
+ if new_resource.options && new_resource.options.kind_of?(Hash)
306
+ msg = "options cannot be given as a hash when using an explicit gem_binary\n"
307
+ msg << "in #{new_resource} from #{new_resource.source_line}"
308
+ raise ArgumentError, msg
309
+ end
310
+ @gem_env = AlternateGemEnvironment.new(new_resource.gem_binary)
311
+ else
312
+ @gem_env = CurrentGemEnvironment.new
313
+ end
314
+ end
315
+
316
+ def gem_dependency
317
+ Gem::Dependency.new(@new_resource.package_name, @new_resource.version)
318
+ end
319
+
320
+ def source_is_remote?
321
+ return true if @new_resource.source.nil?
322
+ URI.parse(@new_resource.source).absolute?
323
+ end
324
+
325
+ def current_version
326
+ #raise 'todo'
327
+ # If one or more matching versions are installed, the newest of them
328
+ # is the current version
329
+ if !matching_installed_versions.empty?
330
+ gemspec = matching_installed_versions.last
331
+ logger.debug { "Found installed gem #{gemspec.name} version #{gemspec.version} matching #{gem_dependency}"}
332
+ gemspec
333
+ # If no version matching the requirements exists, the latest installed
334
+ # version is the current version.
335
+ elsif !all_installed_versions.empty?
336
+ gemspec = all_installed_versions.last
337
+ logger.debug { "Newest installed version of gem #{gemspec.name} is #{gemspec.version}" }
338
+ gemspec
339
+ else
340
+ logger.debug { "No installed version found for #{gem_dependency.to_s}"}
341
+ nil
342
+ end
343
+ end
344
+
345
+ def matching_installed_versions
346
+ @matching_installed_versions ||= @gem_env.installed_versions(gem_dependency)
347
+ end
348
+
349
+ def all_installed_versions
350
+ @all_installed_versions ||= begin
351
+ @gem_env.installed_versions(Gem::Dependency.new(gem_dependency.name, '>= 0'))
352
+ end
353
+ end
354
+
355
+ def gem_sources
356
+ @new_resource.source ? Array(@new_resource.source) : nil
357
+ end
358
+
359
+ def load_current_resource
360
+ @current_resource = Chef::Resource::Package::GemPackage.new(@new_resource.name)
361
+ @current_resource.package_name(@new_resource.package_name)
362
+ if current_spec = current_version
363
+ @current_resource.version(current_spec.version.to_s)
364
+ end
365
+ @current_resource
366
+ end
367
+
368
+ def candidate_version
369
+ @candidate_version ||= begin
370
+ if target_version_already_installed?
371
+ nil
372
+ elsif source_is_remote?
373
+ @gem_env.candidate_version_from_remote(gem_dependency, *gem_sources).to_s
374
+ else
375
+ @gem_env.candidate_version_from_file(gem_dependency, @new_resource.source).to_s
376
+ end
377
+ end
378
+ end
379
+
380
+ def target_version_already_installed?
381
+ return false unless @current_resource && @current_resource.version
382
+ return false if @current_resource.version.nil?
383
+ # in the future we could support squiggly requirements like "~> 1.2.0"
384
+ # for now, the behavior when using anything other than exact
385
+ # requirements is undefined.
386
+ Gem::Requirement.new(@new_resource.version).satisfied_by?(Gem::Version.new(@current_resource.version))
387
+ end
388
+
389
+ ##
390
+ # Installs the gem, using either the gems API or shelling out to `gem`
391
+ # according to the following criteria:
392
+ # 1. Use gems API (Gem::DependencyInstaller) by default
393
+ # 2. shell out to `gem install` when a String of options is given
394
+ # 3. use gems API with options if a hash of options is given
395
+ def install_package(name, version)
396
+ if source_is_remote? && @new_resource.gem_binary.nil?
397
+ if @new_resource.options.nil?
398
+ @gem_env.install(gem_dependency, :sources => gem_sources)
399
+ elsif @new_resource.options.kind_of?(Hash)
400
+ options = @new_resource.options
401
+ options[:sources] = gem_sources
402
+ @gem_env.install(gem_dependency, options)
403
+ else
404
+ install_via_gem_command(name, version)
405
+ end
406
+ elsif @new_resource.gem_binary.nil?
407
+ @gem_env.install(@new_resource.source)
408
+ else
409
+ install_via_gem_command(name,version)
410
+ end
411
+ true
412
+ end
413
+
414
+ def gem_binary_path
415
+ @new_resource.gem_binary || 'gem'
416
+ end
417
+
418
+ def install_via_gem_command(name, version)
419
+ src = @new_resource.source && " --source=#{@new_resource.source} --source=http://rubygems.org"
420
+ shell_out!("#{gem_binary_path} install #{name} -q --no-rdoc --no-ri -v \"#{version}\"#{src}#{opts}", :env=>nil)
421
+ end
422
+
423
+ def upgrade_package(name, version)
424
+ install_package(name, version)
425
+ end
426
+
427
+ def remove_package(name, version)
428
+ if @new_resource.gem_binary.nil?
429
+ if @new_resource.options.nil?
430
+ @gem_env.uninstall(name, version)
431
+ elsif @new_resource.options.kind_of?(Hash)
432
+ @gem_env.uninstall(name, version, @new_resource.options)
433
+ else
434
+ uninstall_via_gem_command(name, version)
435
+ end
436
+ else
437
+ uninstall_via_gem_command(name, version)
438
+ end
439
+ end
440
+
441
+ def uninstall_via_gem_command(name, version)
442
+ if version
443
+ shell_out!("#{gem_binary_path} uninstall #{name} -q -x -I -v \"#{version}\"#{opts}", :env=>nil)
444
+ else
445
+ shell_out!("#{gem_binary_path} uninstall #{name} -q -x -I -a#{opts}", :env=>nil)
446
+ end
447
+ end
448
+
449
+ def purge_package(name, version)
450
+ remove_package(name, version)
451
+ end
452
+
453
+ private
454
+
455
+ def opts
456
+ expand_options(@new_resource.options)
457
+ end
458
+
459
+ end
460
+ end
461
+ end
462
+ end