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,65 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/mixin/shell_out'
20
+ require 'chef/log'
21
+ require 'chef/provider'
22
+
23
+ class Chef
24
+ class Provider
25
+ class Execute < Chef::Provider
26
+
27
+ include Chef::Mixin::ShellOut
28
+
29
+ def load_current_resource
30
+ true
31
+ end
32
+
33
+ def action_run
34
+ opts = {}
35
+
36
+ if sentinel_file = @new_resource.creates
37
+ if ::File.exists?(sentinel_file)
38
+ Chef::Log.debug("#{@new_resource} sentinel file #{sentinel_file} exists - nothing to do")
39
+ return false
40
+ end
41
+ end
42
+
43
+ # original implementation did not specify a timeout, but ShellOut
44
+ # *always* times out. So, set a very long default timeout
45
+ opts[:timeout] = @new_resource.timeout || 3600
46
+ opts[:returns] = @new_resource.returns if @new_resource.returns
47
+ opts[:environment] = @new_resource.environment if @new_resource.environment
48
+ opts[:user] = @new_resource.user if @new_resource.user
49
+ opts[:group] = @new_resource.group if @new_resource.group
50
+ opts[:cwd] = @new_resource.cwd if @new_resource.cwd
51
+ opts[:umask] = @new_resource.umask if @new_resource.umask
52
+ opts[:command_log_level] = :info
53
+ opts[:command_log_prepend] = @new_resource.to_s
54
+ if STDOUT.tty? && !Chef::Config[:daemon] && Chef::Log.info?
55
+ opts[:live_stream] = STDOUT
56
+ end
57
+
58
+ result = shell_out!(@new_resource.command, opts)
59
+ @new_resource.updated_by_last_action(true)
60
+ Chef::Log.info("#{@new_resource} ran successfully")
61
+ end
62
+
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,226 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/config'
20
+ require 'chef/log'
21
+ require 'chef/resource/file'
22
+ require 'chef/mixin/checksum'
23
+ require 'chef/provider'
24
+ require 'etc'
25
+ require 'fileutils'
26
+
27
+ class Chef
28
+ class Provider
29
+ class File < Chef::Provider
30
+ include Chef::Mixin::Checksum
31
+
32
+ def negative_complement(big)
33
+ if big > 1073741823 # Fixnum max
34
+ big -= (2**32) # diminished radix wrap to negative
35
+ end
36
+ big
37
+ end
38
+
39
+ def octal_mode(mode)
40
+ ((mode.respond_to?(:oct) ? mode.oct : mode.to_i) & 007777)
41
+ end
42
+
43
+ private :negative_complement, :octal_mode
44
+
45
+ def load_current_resource
46
+ @current_resource = Chef::Resource::File.new(@new_resource.name)
47
+ @new_resource.path.gsub!(/\\/, "/") # for Windows
48
+ @current_resource.path(@new_resource.path)
49
+ if ::File.exist?(@current_resource.path) && ::File.readable?(@current_resource.path)
50
+ cstats = ::File.stat(@current_resource.path)
51
+ @current_resource.owner(cstats.uid)
52
+ @current_resource.group(cstats.gid)
53
+ @current_resource.mode(octal_mode(cstats.mode))
54
+ end
55
+ @current_resource
56
+ end
57
+
58
+ # Compare the content of a file. Returns true if they are the same, false if they are not.
59
+ def compare_content
60
+ checksum(@current_resource.path) == new_resource_content_checksum
61
+ end
62
+
63
+ # Set the content of the file, assuming it is not set correctly already.
64
+ def set_content
65
+ unless compare_content
66
+ backup @new_resource.path if ::File.exists?(@new_resource.path)
67
+ ::File.open(@new_resource.path, "w") {|f| f.write @new_resource.content }
68
+ Chef::Log.info("#{@new_resource} contents updated")
69
+ @new_resource.updated_by_last_action(true)
70
+ end
71
+ end
72
+
73
+ # Compare the ownership of a file. Returns true if they are the same, false if they are not.
74
+ def compare_owner
75
+ return false if @new_resource.owner.nil?
76
+
77
+ @set_user_id = case @new_resource.owner
78
+ when /^\d+$/, Integer
79
+ @new_resource.owner.to_i
80
+ else
81
+ # This raises an ArgumentError if you can't find the user
82
+ Etc.getpwnam(@new_resource.owner).uid
83
+ end
84
+
85
+ @set_user_id == @current_resource.owner
86
+ end
87
+
88
+ # Set the ownership on the file, assuming it is not set correctly already.
89
+ def set_owner
90
+ unless compare_owner
91
+ @set_user_id = negative_complement(@set_user_id)
92
+ ::File.chown(@set_user_id, nil, @new_resource.path)
93
+ Chef::Log.info("#{@new_resource} owner changed to #{@set_user_id}")
94
+ @new_resource.updated_by_last_action(true)
95
+ end
96
+ end
97
+
98
+ # Compares the group of a file. Returns true if they are the same, false if they are not.
99
+ def compare_group
100
+ return false if @new_resource.group.nil?
101
+
102
+ @set_group_id = case @new_resource.group
103
+ when /^\d+$/, Integer
104
+ @new_resource.group.to_i
105
+ else
106
+ Etc.getgrnam(@new_resource.group).gid
107
+ end
108
+
109
+ @set_group_id == @current_resource.group
110
+ end
111
+
112
+ def set_group
113
+ unless compare_group
114
+ @set_group_id = negative_complement(@set_group_id)
115
+ ::File.chown(nil, @set_group_id, @new_resource.path)
116
+ Chef::Log.info("#{@new_resource} group changed to #{@set_group_id}")
117
+ @new_resource.updated_by_last_action(true)
118
+ end
119
+ end
120
+
121
+ def compare_mode
122
+ case @new_resource.mode
123
+ when /^\d+$/, Integer
124
+ octal_mode(@new_resource.mode) == octal_mode(@current_resource.mode)
125
+ else
126
+ false
127
+ end
128
+ end
129
+
130
+ def set_mode
131
+ unless compare_mode && @new_resource.mode != nil
132
+ # CHEF-174, bad mojo around treating integers as octal. If a string is passed, we try to do the "right" thing
133
+ ::File.chmod(octal_mode(@new_resource.mode), @new_resource.path)
134
+ Chef::Log.info("#{@new_resource} mode changed to #{sprintf("%o" % octal_mode(@new_resource.mode))}")
135
+ @new_resource.updated_by_last_action(true)
136
+ end
137
+ end
138
+
139
+ def action_create
140
+ assert_enclosing_directory_exists!
141
+ unless ::File.exists?(@new_resource.path)
142
+ ::File.open(@new_resource.path, "w+") {|f| f.write @new_resource.content }
143
+ @new_resource.updated_by_last_action(true)
144
+ Chef::Log.info("#{@new_resource} created file #{@new_resource.path}")
145
+ else
146
+ set_content unless @new_resource.content.nil?
147
+ end
148
+ set_owner unless @new_resource.owner.nil?
149
+ set_group unless @new_resource.group.nil?
150
+ set_mode unless @new_resource.mode.nil?
151
+ end
152
+
153
+ def action_create_if_missing
154
+ if ::File.exists?(@new_resource.path)
155
+ Chef::Log.debug("File #{@new_resource.path} exists, taking no action.")
156
+ else
157
+ action_create
158
+ end
159
+ end
160
+
161
+ def action_delete
162
+ if ::File.exists?(@new_resource.path)
163
+ if ::File.writable?(@new_resource.path)
164
+ backup unless ::File.symlink?(@new_resource.path)
165
+ ::File.delete(@new_resource.path)
166
+ Chef::Log.info("#{@new_resource} deleted file at #{@new_resource.path}")
167
+ @new_resource.updated_by_last_action(true)
168
+ else
169
+ raise "Cannot delete #{@new_resource} at #{@new_resource_path}!"
170
+ end
171
+ end
172
+ end
173
+
174
+ def action_touch
175
+ action_create
176
+ time = Time.now
177
+ ::File.utime(time, time, @new_resource.path)
178
+ Chef::Log.info("#{@new_resource} updated atime and mtime to #{time}")
179
+ @new_resource.updated_by_last_action(true)
180
+ end
181
+
182
+ def backup(file=nil)
183
+ file ||= @new_resource.path
184
+ if @new_resource.backup != false && @new_resource.backup > 0 && ::File.exist?(file)
185
+ time = Time.now
186
+ savetime = time.strftime("%Y%m%d%H%M%S")
187
+ backup_filename = "#{@new_resource.path}.chef-#{savetime}"
188
+ backup_filename = backup_filename.sub(/^([A-Za-z]:)/, "") #strip drive letter on Windows
189
+ # if :file_backup_path is nil, we fallback to the old behavior of
190
+ # keeping the backup in the same directory. We also need to to_s it
191
+ # so we don't get a type error around implicit to_str conversions.
192
+ prefix = Chef::Config[:file_backup_path].to_s
193
+ backup_path = ::File.join(prefix, backup_filename)
194
+ FileUtils.mkdir_p(::File.dirname(backup_path)) if Chef::Config[:file_backup_path]
195
+ FileUtils.cp(file, backup_path, :preserve => true)
196
+ Chef::Log.info("#{@new_resource} backed up to #{backup_path}")
197
+
198
+ # Clean up after the number of backups
199
+ slice_number = @new_resource.backup
200
+ backup_files = Dir[::File.join(prefix, ".#{@new_resource.path}.chef-*")].sort { |a,b| b <=> a }
201
+ if backup_files.length >= @new_resource.backup
202
+ remainder = backup_files.slice(slice_number..-1)
203
+ remainder.each do |backup_to_delete|
204
+ FileUtils.rm(backup_to_delete)
205
+ Chef::Log.info("#{@new_resource} removed backup at #{backup_to_delete}")
206
+ end
207
+ end
208
+ end
209
+ end
210
+
211
+ private
212
+
213
+ def assert_enclosing_directory_exists!
214
+ enclosing_dir = ::File.dirname(@new_resource.path)
215
+ unless ::File.directory?(enclosing_dir)
216
+ msg = "Cannot create a file at #{@new_resource.path} because the enclosing directory (#{enclosing_dir}) does not exist"
217
+ raise Chef::Exceptions::EnclosingDirectoryDoesNotExist, msg
218
+ end
219
+ end
220
+
221
+ def new_resource_content_checksum
222
+ @new_resource.content && Digest::SHA2.hexdigest(@new_resource.content)
223
+ end
224
+ end
225
+ end
226
+ end
@@ -0,0 +1,243 @@
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
+
20
+ require 'chef/log'
21
+ require 'chef/provider'
22
+ require 'chef/mixin/shell_out'
23
+ require 'fileutils'
24
+
25
+ class Chef
26
+ class Provider
27
+ class Git < Chef::Provider
28
+
29
+ include Chef::Mixin::ShellOut
30
+
31
+ def load_current_resource
32
+ @current_resource = Chef::Resource::Git.new(@new_resource.name)
33
+ if current_revision = find_current_revision
34
+ @current_resource.revision current_revision
35
+ end
36
+ end
37
+
38
+ def action_checkout
39
+ assert_target_directory_valid!
40
+
41
+ if target_dir_non_existent_or_empty?
42
+ clone
43
+ checkout
44
+ enable_submodules
45
+ add_remotes
46
+ @new_resource.updated_by_last_action(true)
47
+ else
48
+ Chef::Log.debug "#{@new_resource} checkout destination #{@new_resource.destination} already exists or is a non-empty directory"
49
+ end
50
+ end
51
+
52
+ def action_export
53
+ action_checkout
54
+ FileUtils.rm_rf(::File.join(@new_resource.destination,".git"))
55
+ @new_resource.updated_by_last_action(true)
56
+ end
57
+
58
+ def action_sync
59
+ assert_target_directory_valid!
60
+
61
+ if existing_git_clone?
62
+ current_rev = find_current_revision
63
+ Chef::Log.debug "#{@new_resource} current revision: #{current_rev} target revision: #{target_revision}"
64
+ unless current_revision_matches_target_revision?
65
+ fetch_updates
66
+ enable_submodules
67
+ Chef::Log.info "#{@new_resource} updated to revision #{target_revision}"
68
+ @new_resource.updated_by_last_action(true)
69
+ end
70
+ add_remotes
71
+ else
72
+ action_checkout
73
+ @new_resource.updated_by_last_action(true)
74
+ end
75
+ end
76
+
77
+ def assert_target_directory_valid!
78
+ target_parent_directory = ::File.dirname(@new_resource.destination)
79
+ unless ::File.directory?(target_parent_directory)
80
+ msg = "Cannot clone #{@new_resource} to #{@new_resource.destination}, the enclosing directory #{target_parent_directory} does not exist"
81
+ raise Chef::Exceptions::MissingParentDirectory, msg
82
+ end
83
+ end
84
+
85
+ def existing_git_clone?
86
+ ::File.exist?(::File.join(@new_resource.destination, ".git"))
87
+ end
88
+
89
+ def target_dir_non_existent_or_empty?
90
+ !::File.exist?(@new_resource.destination) || Dir.entries(@new_resource.destination).sort == ['.','..']
91
+ end
92
+
93
+ def find_current_revision
94
+ Chef::Log.debug("#{@new_resource} finding current git revision")
95
+ if ::File.exist?(::File.join(cwd, ".git"))
96
+ # 128 is returned when we're not in a git repo. this is fine
97
+ result = shell_out!('git rev-parse HEAD', :cwd => cwd, :returns => [0,128]).stdout.strip
98
+ end
99
+ sha_hash?(result) ? result : nil
100
+ end
101
+
102
+ def add_remotes
103
+ if (@new_resource.additional_remotes.length > 0)
104
+ @new_resource.additional_remotes.each_pair do |remote_name, remote_url|
105
+ Chef::Log.info "#{@new_resource} adding git remote #{remote_name} = #{remote_url}"
106
+ command = "git remote add #{remote_name} #{remote_url}"
107
+ if shell_out(command, run_options(:cwd => @new_resource.destination, :command_log_level => :info)).exitstatus != 0
108
+ @new_resource.updated_by_last_action(true)
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ def clone
115
+ remote = @new_resource.remote
116
+
117
+ args = []
118
+ args << "-o #{remote}" unless remote == 'origin'
119
+ args << "--depth #{@new_resource.depth}" if @new_resource.depth
120
+
121
+ Chef::Log.info "#{@new_resource} cloning repo #{@new_resource.repository} to #{@new_resource.destination}"
122
+
123
+ clone_cmd = "git clone #{args.join(' ')} #{@new_resource.repository} #{@new_resource.destination}"
124
+ shell_out!(clone_cmd, run_options(:command_log_level => :info))
125
+ end
126
+
127
+ def checkout
128
+ sha_ref = target_revision
129
+ # checkout into a local branch rather than a detached HEAD
130
+ shell_out!("git checkout -b deploy #{sha_ref}", run_options(:cwd => @new_resource.destination))
131
+ Chef::Log.info "#{@new_resource} checked out branch: #{@new_resource.revision} reference: #{sha_ref}"
132
+ end
133
+
134
+ def enable_submodules
135
+ if @new_resource.enable_submodules
136
+ Chef::Log.info "#{@new_resource} enabling git submodules"
137
+ command = "git submodule init && git submodule update"
138
+ shell_out!(command, run_options(:cwd => @new_resource.destination, :command_log_level => :info))
139
+ end
140
+ end
141
+
142
+ def fetch_updates
143
+ setup_remote_tracking_branches if @new_resource.remote != 'origin'
144
+
145
+ # since we're in a local branch already, just reset to specified revision rather than merge
146
+ fetch_command = "git fetch #{@new_resource.remote} && git fetch #{@new_resource.remote} --tags && git reset --hard #{target_revision}"
147
+ Chef::Log.debug "Fetching updates from #{new_resource.remote} and resetting to revison #{target_revision}"
148
+ shell_out!(fetch_command, run_options(:cwd => @new_resource.destination))
149
+ end
150
+
151
+ # Use git-config to setup a remote tracking branches. Could use
152
+ # git-remote but it complains when a remote of the same name already
153
+ # exists, git-config will just silenty overwrite the setting every
154
+ # time. This could cause wierd-ness in the remote cache if the url
155
+ # changes between calls, but as long as the repositories are all
156
+ # based from each other it should still work fine.
157
+ def setup_remote_tracking_branches
158
+ command = []
159
+
160
+ Chef::Log.debug "#{@new_resource} configuring remote tracking branches for repository #{@new_resource.repository} "+
161
+ "at remote #{@new_resource.remote}"
162
+ command << "git config remote.#{@new_resource.remote}.url #{@new_resource.repository}"
163
+ command << "git config remote.#{@new_resource.remote}.fetch +refs/heads/*:refs/remotes/#{@new_resource.remote}/*"
164
+ shell_out!(command.join(" && "), run_options(:cwd => @new_resource.destination))
165
+ end
166
+
167
+ def current_revision_matches_target_revision?
168
+ (!@current_resource.revision.nil?) && (target_revision.strip.to_i(16) == @current_resource.revision.strip.to_i(16))
169
+ end
170
+
171
+ def target_revision
172
+ @target_revision ||= begin
173
+ assert_revision_not_remote
174
+
175
+ if sha_hash?(@new_resource.revision)
176
+ @target_revision = @new_resource.revision
177
+ else
178
+ resolved_reference = remote_resolve_reference
179
+ @target_revision = extract_revision(resolved_reference)
180
+ end
181
+ end
182
+ end
183
+
184
+ alias :revision_slug :target_revision
185
+
186
+ def remote_resolve_reference
187
+ Chef::Log.debug("#{@new_resource} resolving remote reference")
188
+ command = git('ls-remote', @new_resource.repository, @new_resource.revision)
189
+ shell_out!(command, run_options).stdout
190
+ end
191
+
192
+ private
193
+
194
+ def run_options(run_opts={})
195
+ run_opts[:user] = @new_resource.user if @new_resource.user
196
+ run_opts[:group] = @new_resource.group if @new_resource.group
197
+ run_opts[:environment] = {"GIT_SSH" => @new_resource.ssh_wrapper} if @new_resource.ssh_wrapper
198
+ run_opts[:command_log_prepend] = @new_resource.to_s
199
+ run_opts[:command_log_level] ||= :debug
200
+ if run_opts[:command_log_level] == :info
201
+ if STDOUT.tty? && !Chef::Config[:daemon] && Chef::Log.info?
202
+ run_opts[:live_stream] = STDOUT
203
+ end
204
+ end
205
+ run_opts
206
+ end
207
+
208
+ def cwd
209
+ @new_resource.destination
210
+ end
211
+
212
+ def git(*args)
213
+ ["git", *args].compact.join(" ")
214
+ end
215
+
216
+ def sha_hash?(string)
217
+ string =~ /^[0-9a-f]{40}$/
218
+ end
219
+
220
+ def assert_revision_not_remote
221
+ if @new_resource.revision =~ /^origin\//
222
+ reference = @new_resource.revision
223
+ error_text = "Deploying remote branches is not supported. " +
224
+ "Specify the remote branch as a local branch for " +
225
+ "the git repository you're deploying from " +
226
+ "(ie: '#{reference.gsub('origin/', '')}' rather than '#{reference}')."
227
+ raise RuntimeError, error_text
228
+ end
229
+ end
230
+
231
+ def extract_revision(resolved_reference)
232
+ unless resolved_reference =~ /^([0-9a-f]{40})\s+(\S+)/
233
+ msg = "Unable to parse SHA reference for '#{@new_resource.revision}' in repository '#{@new_resource.repository}'. "
234
+ msg << "Verify your (case-sensitive) repository URL and revision.\n"
235
+ msg << "`git ls-remote` output: #{resolved_reference}"
236
+ raise Chef::Exceptions::UnresolvableGitReference, msg
237
+ end
238
+ $1
239
+ end
240
+
241
+ end
242
+ end
243
+ end