tylerrick-chef 0.10.8

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