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,195 @@
1
+ #
2
+ # Author:: Bryan McLellan (btm@loftninjas.org)
3
+ # Author:: Toomas Pelberg (toomasp@gmx.net)
4
+ # Copyright:: Copyright (c) 2009 Bryan McLellan
5
+ # Copyright:: Copyright (c) 2010 Toomas Pelberg
6
+ # License:: Apache License, Version 2.0
7
+ #
8
+ # Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+ #
20
+
21
+ require 'chef/log'
22
+ require 'chef/mixin/command'
23
+ require 'chef/provider'
24
+
25
+ class Chef
26
+ class Provider
27
+ class Cron
28
+ class Solaris < Chef::Provider::Cron
29
+ include Chef::Mixin::Command
30
+
31
+ CRON_PATTERN = /([-0-9*,\/]+)\s([-0-9*,\/]+)\s([-0-9*,\/]+)\s([-0-9*,\/]+)\s([-0-9*,\/]+)\s(.*)/
32
+
33
+ def initialize(new_resource, run_context)
34
+ super(new_resource, run_context)
35
+ @cron_exists = false
36
+ @cron_empty = false
37
+ end
38
+ attr_accessor :cron_exists, :cron_empty
39
+
40
+ def load_current_resource
41
+ crontab_lines = []
42
+ @current_resource = Chef::Resource::Cron.new(@new_resource.name)
43
+ @current_resource.user(@new_resource.user)
44
+ status = popen4("crontab -l #{@new_resource.user}") do |pid, stdin, stdout, stderr|
45
+ stdout.each_line { |line| crontab_lines << line }
46
+ end
47
+ if status.exitstatus > 1
48
+ raise Chef::Exceptions::Cron, "Error determining state of #{@new_resource.name}, exit: #{status.exitstatus}"
49
+ elsif status.exitstatus == 0
50
+ cron_found = false
51
+ crontab_lines.each do |line|
52
+ case line.chomp
53
+ when "# Chef Name: #{@new_resource.name}"
54
+ Chef::Log.debug("#{@new_resource} found cron '#{@new_resource.name}'")
55
+ cron_found = true
56
+ @cron_exists = true
57
+ next
58
+ when /^MAILTO=(\S*)/
59
+ @current_resource.mailto($1) if cron_found
60
+ next
61
+ when /^PATH=(\S*)/
62
+ @current_resource.path($1) if cron_found
63
+ next
64
+ when /^SHELL=(\S*)/
65
+ @current_resource.shell($1) if cron_found
66
+ next
67
+ when /^HOME=(\S*)/
68
+ @current_resource.home($1) if cron_found
69
+ next
70
+ when CRON_PATTERN
71
+ if cron_found
72
+ @current_resource.minute($1)
73
+ @current_resource.hour($2)
74
+ @current_resource.day($3)
75
+ @current_resource.month($4)
76
+ @current_resource.weekday($5)
77
+ @current_resource.command($6)
78
+ cron_found=false
79
+ end
80
+ next
81
+ else
82
+ next
83
+ end
84
+ end
85
+ Chef::Log.debug("#{@new_resource} cron '#{@new_resource.name}' not found") unless @cron_exists
86
+ elsif status.exitstatus == 1
87
+ Chef::Log.debug("#{@new_resource} cron empty for '#{@new_resource.user}'")
88
+ @cron_empty = true
89
+ end
90
+
91
+ @current_resource
92
+ end
93
+
94
+ def compare_cron
95
+ [ :minute, :hour, :day, :month, :weekday, :command, :mailto, :path, :shell, :home ].any? do |cron_var|
96
+ !@new_resource.send(cron_var).nil? && @new_resource.send(cron_var) != @current_resource.send(cron_var)
97
+ end
98
+ end
99
+
100
+ def write_crontab(crontab)
101
+ tempcron = Tempfile.new("chef-cron")
102
+ tempcron << crontab
103
+ tempcron.flush
104
+ tempcron.chmod(0644)
105
+ status = run_command(:command => "/usr/bin/crontab #{tempcron.path}",:user => @new_resource.user)
106
+ if(status == 0)
107
+ @new_resource.updated_by_last_action(true)
108
+ else
109
+ @new_resource.updated_by_last_action(false)
110
+ end
111
+ tempcron.close!
112
+ return status
113
+ end
114
+
115
+ def action_create
116
+ crontab = String.new
117
+ newcron = String.new
118
+ cron_found = false
119
+
120
+ newcron << "# Chef Name: #{new_resource.name}\n"
121
+ [ :mailto, :path, :shell, :home ].each do |v|
122
+ newcron << "#{v.to_s.upcase}=#{@new_resource.send(v)}\n" if @new_resource.send(v)
123
+ end
124
+ newcron << "#{@new_resource.minute} #{@new_resource.hour} #{@new_resource.day} #{@new_resource.month} #{@new_resource.weekday} #{@new_resource.command}\n"
125
+
126
+ if @cron_exists
127
+ unless compare_cron
128
+ Chef::Log.debug("#{@new_resource} skipping existing cron entry '#{@new_resource.name}'")
129
+ return
130
+ end
131
+ status = popen4("crontab -l #{@new_resource.user}") do |pid, stdin, stdout, stderr|
132
+ stdout.each_line do |line|
133
+ case line.chomp
134
+ when "# Chef Name: #{@new_resource.name}"
135
+ cron_found = true
136
+ next
137
+ when CRON_PATTERN
138
+ if cron_found
139
+ cron_found = false
140
+ crontab << newcron
141
+ next
142
+ end
143
+ else
144
+ next if cron_found
145
+ end
146
+ crontab << line
147
+ end
148
+ end
149
+
150
+ status = write_crontab(crontab)
151
+ Chef::Log.info("#{@new_resource} updated crontab entry")
152
+ else
153
+ unless @cron_empty
154
+ status = popen4("crontab -l #{@new_resource.user}") do |pid, stdin, stdout, stderr|
155
+ stdout.each { |line| crontab << line }
156
+ end
157
+ end
158
+
159
+ crontab << newcron
160
+ status = write_crontab(crontab)
161
+ Chef::Log.info("#{@new_resource} added crontab entry")
162
+ end
163
+ end
164
+
165
+ def action_delete
166
+ if @cron_exists
167
+ crontab = String.new
168
+ cron_found = false
169
+ status = popen4("crontab -l #{@new_resource.user}") do |pid, stdin, stdout, stderr|
170
+ stdout.each_line do |line|
171
+ case line.chomp
172
+ when "# Chef Name: #{@new_resource.name}"
173
+ cron_found = true
174
+ next
175
+ when CRON_PATTERN
176
+ if cron_found
177
+ cron_found = false
178
+ next
179
+ end
180
+ else
181
+ next if cron_found
182
+ end
183
+ crontab << line
184
+ end
185
+ end
186
+
187
+ status = write_crontab(crontab)
188
+ Chef::Log.info("#{@new_resource} deleted crontab entry")
189
+ end
190
+ end
191
+
192
+ end
193
+ end
194
+ end
195
+ end
@@ -0,0 +1,418 @@
1
+ #
2
+ # Author:: Daniel DeLeo (<dan@kallistec.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/mixin/command"
20
+ require "chef/mixin/from_file"
21
+ require "chef/provider/git"
22
+ require "chef/provider/subversion"
23
+
24
+ class Chef
25
+ class Provider
26
+ class Deploy < Chef::Provider
27
+
28
+ include Chef::Mixin::FromFile
29
+ include Chef::Mixin::Command
30
+
31
+ attr_reader :scm_provider, :release_path, :previous_release_path
32
+
33
+ def initialize(new_resource, run_context)
34
+ super(new_resource, run_context)
35
+
36
+ @scm_provider = new_resource.scm_provider.new(new_resource, run_context)
37
+
38
+ # @configuration is not used by Deploy, it is only for backwards compat with
39
+ # chef-deploy or capistrano hooks that might use it to get environment information
40
+ @configuration = @new_resource.to_hash
41
+ @configuration[:environment] = @configuration[:environment] && @configuration[:environment]["RAILS_ENV"]
42
+ end
43
+
44
+ def load_current_resource
45
+ @release_path = @new_resource.deploy_to + "/releases/#{release_slug}"
46
+ end
47
+
48
+ def sudo(command,&block)
49
+ execute(command, &block)
50
+ end
51
+
52
+ def run(command, &block)
53
+ exec = execute(command, &block)
54
+ exec.user(@new_resource.user) if @new_resource.user
55
+ exec.group(@new_resource.group) if @new_resource.group
56
+ exec.cwd(release_path) unless exec.cwd
57
+ exec.environment(@new_resource.environment) unless exec.environment
58
+ exec
59
+ end
60
+
61
+ def action_deploy
62
+ save_release_state
63
+
64
+ if deployed?(release_path)
65
+ if current_release?(release_path)
66
+ Chef::Log.debug("#{@new_resource} is the latest version")
67
+ else
68
+ action_rollback
69
+ end
70
+ else
71
+
72
+ with_rollback_on_error do
73
+ deploy
74
+ @new_resource.updated_by_last_action(true)
75
+ end
76
+ end
77
+ end
78
+
79
+ def action_force_deploy
80
+ if deployed?(release_path)
81
+ Chef::Log.info("Already deployed app at #{release_path}, forcing.")
82
+ FileUtils.rm_rf(release_path)
83
+ Chef::Log.info("#{@new_resource} forcing deploy of already deployed app at #{release_path}")
84
+ end
85
+
86
+ # Alternatives:
87
+ # * Move release_path directory before deploy and move it back when error occurs
88
+ # * Rollback to previous commit
89
+ # * Do nothing - because deploy is force, it will be retried in short time
90
+ # Because last is simpliest, keep it
91
+ deploy
92
+ @new_resource.updated_by_last_action(true)
93
+ end
94
+
95
+ def action_rollback
96
+ if release_path
97
+ rp_index = all_releases.index(release_path)
98
+ raise RuntimeError, "There is no release to rollback to!" unless rp_index
99
+ rp_index += 1
100
+ releases_to_nuke = all_releases[rp_index..-1]
101
+ else
102
+ @release_path = all_releases[-2]
103
+ raise RuntimeError, "There is no release to rollback to!" unless @release_path
104
+ releases_to_nuke = [ all_releases.last ]
105
+ end
106
+
107
+ rollback
108
+
109
+ releases_to_nuke.each do |i|
110
+ Chef::Log.info "#{@new_resource} removing release: #{i}"
111
+ FileUtils.rm_rf i
112
+ release_deleted(i)
113
+ end
114
+ @new_resource.updated_by_last_action(true)
115
+ end
116
+
117
+ def deploy
118
+ enforce_ownership
119
+ verify_directories_exist
120
+ update_cached_repo
121
+ copy_cached_repo
122
+ install_gems
123
+ enforce_ownership
124
+ callback(:before_migrate, @new_resource.before_migrate)
125
+ migrate
126
+ callback(:before_symlink, @new_resource.before_symlink)
127
+ symlink
128
+ callback(:before_restart, @new_resource.before_restart)
129
+ restart
130
+ callback(:after_restart, @new_resource.after_restart)
131
+ cleanup!
132
+ Chef::Log.info "#{@new_resource} deployed to #{@new_resource.deploy_to}"
133
+ end
134
+
135
+ def rollback
136
+ Chef::Log.info "#{@new_resource} rolling back to previous release #{release_path}"
137
+ symlink
138
+ Chef::Log.info "#{@new_resource} restarting with previous release"
139
+ restart
140
+ end
141
+
142
+ def callback(what, callback_code=nil)
143
+ @collection = Chef::ResourceCollection.new
144
+ case callback_code
145
+ when Proc
146
+ Chef::Log.info "#{@new_resource} running callback #{what}"
147
+ recipe_eval(&callback_code)
148
+ when String
149
+ callback_file = "#{release_path}/#{callback_code}"
150
+ unless ::File.exist?(callback_file)
151
+ raise RuntimeError, "Can't find your callback file #{callback_file}"
152
+ end
153
+ run_callback_from_file(callback_file)
154
+ when nil
155
+ run_callback_from_file("#{release_path}/deploy/#{what}.rb")
156
+ else
157
+ raise RuntimeError, "You gave me a callback I don't know what to do with: #{callback_code.inspect}"
158
+ end
159
+ end
160
+
161
+ def migrate
162
+ run_symlinks_before_migrate
163
+
164
+ if @new_resource.migrate
165
+ enforce_ownership
166
+
167
+ environment = @new_resource.environment
168
+ env_info = environment && environment.map do |key_and_val|
169
+ "#{key_and_val.first}='#{key_and_val.last}'"
170
+ end.join(" ")
171
+
172
+ Chef::Log.info "#{@new_resource} migrating #{@new_resource.user} with environment #{env_info}"
173
+ run_command(run_options(:command => @new_resource.migration_command, :cwd=>release_path, :command_log_level => :info))
174
+ end
175
+ end
176
+
177
+ def symlink
178
+ purge_tempfiles_from_current_release
179
+ link_tempfiles_to_current_release
180
+ link_current_release_to_production
181
+ Chef::Log.info "#{@new_resource} updated symlinks"
182
+ end
183
+
184
+ def restart
185
+ if restart_cmd = @new_resource.restart_command
186
+ if restart_cmd.kind_of?(Proc)
187
+ Chef::Log.info("#{@new_resource} restarting app with embedded recipe")
188
+ recipe_eval(&restart_cmd)
189
+ else
190
+ Chef::Log.info("#{@new_resource} restarting app")
191
+ run_command(run_options(:command => @new_resource.restart_command, :cwd => @new_resource.current_path))
192
+ end
193
+ end
194
+ end
195
+
196
+ def cleanup!
197
+ all_releases[0..-6].each do |old_release|
198
+ Chef::Log.info "#{@new_resource} removing old release #{old_release}"
199
+ FileUtils.rm_rf(old_release)
200
+ release_deleted(old_release)
201
+ end
202
+ end
203
+
204
+ def all_releases
205
+ Dir.glob(@new_resource.deploy_to + "/releases/*").sort
206
+ end
207
+
208
+ def update_cached_repo
209
+ @scm_provider.load_current_resource
210
+ if @new_resource.svn_force_export
211
+ svn_force_export
212
+ else
213
+ run_scm_sync
214
+ end
215
+ end
216
+
217
+ def run_scm_sync
218
+ @scm_provider.action_sync
219
+ end
220
+
221
+ def svn_force_export
222
+ Chef::Log.info "#{@new_resource} exporting source repository"
223
+ @scm_provider.action_force_export
224
+ end
225
+
226
+ def copy_cached_repo
227
+ FileUtils.mkdir_p(@new_resource.deploy_to + "/releases")
228
+ run_command(:command => "cp -RPp #{::File.join(@new_resource.destination, ".")} #{release_path}")
229
+ Chef::Log.info "#{@new_resource} copied the cached checkout to #{release_path}"
230
+ release_created(release_path)
231
+ end
232
+
233
+ def enforce_ownership
234
+ FileUtils.chown_R(@new_resource.user, @new_resource.group, @new_resource.deploy_to)
235
+ Chef::Log.info("#{@new_resource} set user to #{@new_resource.user}") if @new_resource.user
236
+ Chef::Log.info("#{@new_resource} set group to #{@new_resource.group}") if @new_resource.group
237
+ end
238
+
239
+ def verify_directories_exist
240
+ create_dir_unless_exists(@new_resource.deploy_to)
241
+ create_dir_unless_exists(@new_resource.shared_path)
242
+ end
243
+
244
+ def link_current_release_to_production
245
+ FileUtils.rm_f(@new_resource.current_path)
246
+ begin
247
+ FileUtils.ln_sf(release_path, @new_resource.current_path)
248
+ rescue => e
249
+ raise Chef::Exceptions::FileNotFound.new("Cannot symlink current release to production: #{e.message}")
250
+ end
251
+ Chef::Log.info "#{@new_resource} linked release #{release_path} into production at #{@new_resource.current_path}"
252
+ enforce_ownership
253
+ end
254
+
255
+ def run_symlinks_before_migrate
256
+ links_info = @new_resource.symlink_before_migrate.map { |src, dst| "#{src} => #{dst}" }.join(", ")
257
+ @new_resource.symlink_before_migrate.each do |src, dest|
258
+ begin
259
+ FileUtils.ln_sf(@new_resource.shared_path + "/#{src}", release_path + "/#{dest}")
260
+ rescue => e
261
+ raise Chef::Exceptions::FileNotFound.new("Cannot symlink #{@new_resource.shared_path}/#{src} to #{release_path}/#{dest} before migrate: #{e.message}")
262
+ end
263
+ end
264
+ Chef::Log.info "#{@new_resource} made pre-migration symlinks"
265
+ end
266
+
267
+ def link_tempfiles_to_current_release
268
+ dirs_info = @new_resource.create_dirs_before_symlink.join(",")
269
+ @new_resource.create_dirs_before_symlink.each do |dir|
270
+ create_dir_unless_exists(release_path + "/#{dir}")
271
+ end
272
+ Chef::Log.info("#{@new_resource} created directories before symlinking #{dirs_info}")
273
+
274
+ links_info = @new_resource.symlinks.map { |src, dst| "#{src} => #{dst}" }.join(", ")
275
+ @new_resource.symlinks.each do |src, dest|
276
+ begin
277
+ FileUtils.ln_sf(::File.join(@new_resource.shared_path, src), ::File.join(release_path, dest))
278
+ rescue => e
279
+ raise Chef::Exceptions::FileNotFound.new("Cannot symlink shared data #{::File.join(@new_resource.shared_path, src)} to #{::File.join(release_path, dest)}: #{e.message}")
280
+ end
281
+ end
282
+ Chef::Log.info("#{@new_resource} linked shared paths into current release: #{links_info}")
283
+ run_symlinks_before_migrate
284
+ enforce_ownership
285
+ end
286
+
287
+ def create_dirs_before_symlink
288
+ end
289
+
290
+ def purge_tempfiles_from_current_release
291
+ log_info = @new_resource.purge_before_symlink.join(", ")
292
+ @new_resource.purge_before_symlink.each { |dir| FileUtils.rm_rf(release_path + "/#{dir}") }
293
+ Chef::Log.info("#{@new_resource} purged directories in checkout #{log_info}")
294
+ end
295
+
296
+ protected
297
+
298
+ # Internal callback, called after copy_cached_repo.
299
+ # Override if you need to keep state externally.
300
+ def release_created(release_path)
301
+ end
302
+
303
+ # Internal callback, called during cleanup! for each old release removed.
304
+ # Override if you need to keep state externally.
305
+ def release_deleted(release_path)
306
+ end
307
+
308
+ def release_slug
309
+ raise Chef::Exceptions::Override, "You must override release_slug in #{self.to_s}"
310
+ end
311
+
312
+ def install_gems
313
+ gem_resource_collection_runner.converge
314
+ end
315
+
316
+ def gem_resource_collection_runner
317
+ gems_collection = Chef::ResourceCollection.new
318
+ gem_packages.each { |rbgem| gems_collection << rbgem }
319
+ gems_run_context = run_context.dup
320
+ gems_run_context.resource_collection = gems_collection
321
+ Chef::Runner.new(gems_run_context)
322
+ end
323
+
324
+ def gem_packages
325
+ return [] unless ::File.exist?("#{release_path}/gems.yml")
326
+ gems = YAML.load(IO.read("#{release_path}/gems.yml"))
327
+
328
+ gems.map do |g|
329
+ r = Chef::Resource::GemPackage.new(g[:name], run_context)
330
+ r.version g[:version]
331
+ r.action :install
332
+ r.source "http://gems.github.com"
333
+ r
334
+ end
335
+ end
336
+
337
+ def run_options(run_opts={})
338
+ run_opts[:user] = @new_resource.user if @new_resource.user
339
+ run_opts[:group] = @new_resource.group if @new_resource.group
340
+ run_opts[:environment] = @new_resource.environment if @new_resource.environment
341
+ run_opts[:command_log_prepend] = @new_resource.to_s
342
+ run_opts[:command_log_level] ||= :debug
343
+ if run_opts[:command_log_level] == :info
344
+ if STDOUT.tty? && !Chef::Config[:daemon] && Chef::Log.info?
345
+ run_opts[:live_stream] = STDOUT
346
+ end
347
+ end
348
+ run_opts
349
+ end
350
+
351
+ def run_callback_from_file(callback_file)
352
+ if ::File.exist?(callback_file)
353
+ Dir.chdir(release_path) do
354
+ Chef::Log.info "#{@new_resource} running deploy hook #{callback_file}"
355
+ recipe_eval { from_file(callback_file) }
356
+ end
357
+ end
358
+ end
359
+
360
+ def create_dir_unless_exists(dir)
361
+ if ::File.directory?(dir)
362
+ Chef::Log.debug "#{@new_resource} not creating #{dir} because it already exists"
363
+ return false
364
+ end
365
+
366
+ begin
367
+ FileUtils.mkdir_p(dir)
368
+ Chef::Log.debug "#{@new_resource} created directory #{dir}"
369
+ if @new_resource.user
370
+ FileUtils.chown(@new_resource.user, nil, dir)
371
+ Chef::Log.debug("#{@new_resource} set user to #{@new_resource.user} for #{dir}")
372
+ end
373
+ if @new_resource.group
374
+ FileUtils.chown(nil, @new_resource.group, dir)
375
+ Chef::Log.debug("#{@new_resource} set group to #{@new_resource.group} for #{dir}")
376
+ end
377
+ rescue => e
378
+ raise Chef::Exceptions::FileNotFound.new("Cannot create directory #{dir}: #{e.message}")
379
+ end
380
+ end
381
+
382
+ def with_rollback_on_error
383
+ yield
384
+ rescue ::Exception => e
385
+ if @new_resource.rollback_on_error
386
+ Chef::Log.warn "Error on deploying #{release_path}: #{e.message}"
387
+ failed_release = release_path
388
+
389
+ if previous_release_path
390
+ @release_path = previous_release_path
391
+ rollback
392
+ end
393
+
394
+ Chef::Log.info "Removing failed deploy #{failed_release}"
395
+ FileUtils.rm_rf failed_release
396
+ release_deleted(failed_release)
397
+ end
398
+
399
+ raise
400
+ end
401
+
402
+ def save_release_state
403
+ if ::File.exists?(@new_resource.current_path)
404
+ release = ::File.readlink(@new_resource.current_path)
405
+ @previous_release_path = release if ::File.exists?(release)
406
+ end
407
+ end
408
+
409
+ def deployed?(release)
410
+ all_releases.include?(release)
411
+ end
412
+
413
+ def current_release?(release)
414
+ @previous_release_path == release
415
+ end
416
+ end
417
+ end
418
+ end