TrueCar-chef 0.10.0.beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (372) hide show
  1. data/LICENSE +201 -0
  2. data/README.rdoc +171 -0
  3. data/bin/chef-client +26 -0
  4. data/bin/chef-solo +25 -0
  5. data/bin/knife +26 -0
  6. data/bin/shef +34 -0
  7. data/distro/README +2 -0
  8. data/distro/arch/etc/conf.d/chef-client.conf +5 -0
  9. data/distro/arch/etc/conf.d/chef-server-webui.conf +10 -0
  10. data/distro/arch/etc/conf.d/chef-server.conf +10 -0
  11. data/distro/arch/etc/conf.d/chef-solr-indexer.conf +8 -0
  12. data/distro/arch/etc/conf.d/chef-solr.conf +8 -0
  13. data/distro/arch/etc/rc.d/chef-client +76 -0
  14. data/distro/arch/etc/rc.d/chef-server +78 -0
  15. data/distro/arch/etc/rc.d/chef-server-webui +78 -0
  16. data/distro/arch/etc/rc.d/chef-solr +78 -0
  17. data/distro/arch/etc/rc.d/chef-solr-indexer +78 -0
  18. data/distro/common/man/man1/chef-indexer.1 +42 -0
  19. data/distro/common/man/man1/chef-server-webui.1 +106 -0
  20. data/distro/common/man/man1/chef-server.1 +107 -0
  21. data/distro/common/man/man1/chef-solr-indexer.1 +55 -0
  22. data/distro/common/man/man1/chef-solr.1 +55 -0
  23. data/distro/common/man/man8/chef-client.8 +63 -0
  24. data/distro/common/man/man8/chef-solo.8 +57 -0
  25. data/distro/common/man/man8/chef-solr-rebuild.8 +37 -0
  26. data/distro/common/man/man8/knife.8 +1349 -0
  27. data/distro/common/man/man8/shef.8 +45 -0
  28. data/distro/common/markdown/README +3 -0
  29. data/distro/common/markdown/knife.mkd +865 -0
  30. data/distro/debian/etc/default/chef-client +4 -0
  31. data/distro/debian/etc/default/chef-server +9 -0
  32. data/distro/debian/etc/default/chef-server-webui +9 -0
  33. data/distro/debian/etc/default/chef-solr +8 -0
  34. data/distro/debian/etc/default/chef-solr-indexer +7 -0
  35. data/distro/debian/etc/init.d/chef-client +175 -0
  36. data/distro/debian/etc/init.d/chef-server +122 -0
  37. data/distro/debian/etc/init.d/chef-server-webui +123 -0
  38. data/distro/debian/etc/init.d/chef-solr +176 -0
  39. data/distro/debian/etc/init.d/chef-solr-indexer +176 -0
  40. data/distro/debian/etc/init/chef-client.conf +17 -0
  41. data/distro/debian/etc/init/chef-server-webui.conf +17 -0
  42. data/distro/debian/etc/init/chef-server.conf +17 -0
  43. data/distro/debian/etc/init/chef-solr-indexer.conf +17 -0
  44. data/distro/debian/etc/init/chef-solr.conf +17 -0
  45. data/distro/redhat/etc/init.d/chef-client +106 -0
  46. data/distro/redhat/etc/init.d/chef-server +112 -0
  47. data/distro/redhat/etc/init.d/chef-server-webui +112 -0
  48. data/distro/redhat/etc/init.d/chef-solr +104 -0
  49. data/distro/redhat/etc/init.d/chef-solr-indexer +104 -0
  50. data/distro/redhat/etc/logrotate.d/chef-client +8 -0
  51. data/distro/redhat/etc/logrotate.d/chef-server +8 -0
  52. data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
  53. data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
  54. data/distro/redhat/etc/logrotate.d/chef-solr-indexer +8 -0
  55. data/distro/redhat/etc/sysconfig/chef-client +15 -0
  56. data/distro/redhat/etc/sysconfig/chef-server +14 -0
  57. data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
  58. data/distro/redhat/etc/sysconfig/chef-solr +8 -0
  59. data/distro/redhat/etc/sysconfig/chef-solr-indexer +7 -0
  60. data/lib/chef.rb +40 -0
  61. data/lib/chef/api_client.rb +264 -0
  62. data/lib/chef/application.rb +137 -0
  63. data/lib/chef/application/agent.rb +18 -0
  64. data/lib/chef/application/client.rb +242 -0
  65. data/lib/chef/application/knife.rb +169 -0
  66. data/lib/chef/application/solo.rb +217 -0
  67. data/lib/chef/applications.rb +4 -0
  68. data/lib/chef/certificate.rb +194 -0
  69. data/lib/chef/checksum.rb +182 -0
  70. data/lib/chef/checksum_cache.rb +189 -0
  71. data/lib/chef/client.rb +362 -0
  72. data/lib/chef/config.rb +244 -0
  73. data/lib/chef/cookbook/chefignore.rb +66 -0
  74. data/lib/chef/cookbook/cookbook_collection.rb +45 -0
  75. data/lib/chef/cookbook/cookbook_version_loader.rb +151 -0
  76. data/lib/chef/cookbook/file_system_file_vendor.rb +56 -0
  77. data/lib/chef/cookbook/file_vendor.rb +48 -0
  78. data/lib/chef/cookbook/metadata.rb +592 -0
  79. data/lib/chef/cookbook/remote_file_vendor.rb +87 -0
  80. data/lib/chef/cookbook/syntax_check.rb +136 -0
  81. data/lib/chef/cookbook_loader.rb +103 -0
  82. data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
  83. data/lib/chef/cookbook_uploader.rb +125 -0
  84. data/lib/chef/cookbook_version.rb +979 -0
  85. data/lib/chef/cookbook_version_selector.rb +163 -0
  86. data/lib/chef/couchdb.rb +247 -0
  87. data/lib/chef/daemon.rb +172 -0
  88. data/lib/chef/data_bag.rb +223 -0
  89. data/lib/chef/data_bag_item.rb +267 -0
  90. data/lib/chef/encrypted_data_bag_item.rb +126 -0
  91. data/lib/chef/environment.rb +386 -0
  92. data/lib/chef/exceptions.rb +153 -0
  93. data/lib/chef/file_access_control.rb +140 -0
  94. data/lib/chef/file_cache.rb +218 -0
  95. data/lib/chef/handler.rb +206 -0
  96. data/lib/chef/handler/json_file.rb +58 -0
  97. data/lib/chef/index_queue.rb +29 -0
  98. data/lib/chef/index_queue/amqp_client.rb +116 -0
  99. data/lib/chef/index_queue/consumer.rb +76 -0
  100. data/lib/chef/index_queue/indexable.rb +109 -0
  101. data/lib/chef/json_compat.rb +52 -0
  102. data/lib/chef/knife.rb +424 -0
  103. data/lib/chef/knife/bootstrap.rb +185 -0
  104. data/lib/chef/knife/bootstrap/archlinux-gems.erb +47 -0
  105. data/lib/chef/knife/bootstrap/centos5-gems.erb +41 -0
  106. data/lib/chef/knife/bootstrap/client-install.vbs +80 -0
  107. data/lib/chef/knife/bootstrap/fedora13-gems.erb +38 -0
  108. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +32 -0
  109. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +46 -0
  110. data/lib/chef/knife/bootstrap/windows-gems.erb +34 -0
  111. data/lib/chef/knife/client_bulk_delete.rb +43 -0
  112. data/lib/chef/knife/client_create.rb +73 -0
  113. data/lib/chef/knife/client_delete.rb +48 -0
  114. data/lib/chef/knife/client_edit.rb +48 -0
  115. data/lib/chef/knife/client_list.rb +43 -0
  116. data/lib/chef/knife/client_reregister.rb +59 -0
  117. data/lib/chef/knife/client_show.rb +53 -0
  118. data/lib/chef/knife/configure.rb +136 -0
  119. data/lib/chef/knife/configure_client.rb +52 -0
  120. data/lib/chef/knife/cookbook_bulk_delete.rb +61 -0
  121. data/lib/chef/knife/cookbook_create.rb +274 -0
  122. data/lib/chef/knife/cookbook_delete.rb +149 -0
  123. data/lib/chef/knife/cookbook_download.rb +134 -0
  124. data/lib/chef/knife/cookbook_list.rb +50 -0
  125. data/lib/chef/knife/cookbook_metadata.rb +102 -0
  126. data/lib/chef/knife/cookbook_metadata_from_file.rb +44 -0
  127. data/lib/chef/knife/cookbook_show.rb +101 -0
  128. data/lib/chef/knife/cookbook_site_download.rb +58 -0
  129. data/lib/chef/knife/cookbook_site_list.rb +56 -0
  130. data/lib/chef/knife/cookbook_site_search.rb +51 -0
  131. data/lib/chef/knife/cookbook_site_share.rb +114 -0
  132. data/lib/chef/knife/cookbook_site_show.rb +57 -0
  133. data/lib/chef/knife/cookbook_site_unshare.rb +56 -0
  134. data/lib/chef/knife/cookbook_site_vendor.rb +145 -0
  135. data/lib/chef/knife/cookbook_test.rb +82 -0
  136. data/lib/chef/knife/cookbook_upload.rb +146 -0
  137. data/lib/chef/knife/data_bag_create.rb +94 -0
  138. data/lib/chef/knife/data_bag_delete.rb +51 -0
  139. data/lib/chef/knife/data_bag_edit.rb +94 -0
  140. data/lib/chef/knife/data_bag_from_file.rb +85 -0
  141. data/lib/chef/knife/data_bag_list.rb +46 -0
  142. data/lib/chef/knife/data_bag_show.rb +81 -0
  143. data/lib/chef/knife/environment_create.rb +53 -0
  144. data/lib/chef/knife/environment_delete.rb +45 -0
  145. data/lib/chef/knife/environment_edit.rb +45 -0
  146. data/lib/chef/knife/environment_from_file.rb +39 -0
  147. data/lib/chef/knife/environment_list.rb +42 -0
  148. data/lib/chef/knife/environment_show.rb +46 -0
  149. data/lib/chef/knife/exec.rb +51 -0
  150. data/lib/chef/knife/index_rebuild.rb +50 -0
  151. data/lib/chef/knife/node_bulk_delete.rb +46 -0
  152. data/lib/chef/knife/node_create.rb +50 -0
  153. data/lib/chef/knife/node_delete.rb +47 -0
  154. data/lib/chef/knife/node_edit.rb +163 -0
  155. data/lib/chef/knife/node_from_file.rb +45 -0
  156. data/lib/chef/knife/node_list.rb +46 -0
  157. data/lib/chef/knife/node_run_list_add.rb +67 -0
  158. data/lib/chef/knife/node_run_list_remove.rb +48 -0
  159. data/lib/chef/knife/node_show.rb +62 -0
  160. data/lib/chef/knife/recipe_list.rb +33 -0
  161. data/lib/chef/knife/role_bulk_delete.rb +47 -0
  162. data/lib/chef/knife/role_create.rb +55 -0
  163. data/lib/chef/knife/role_delete.rb +47 -0
  164. data/lib/chef/knife/role_edit.rb +48 -0
  165. data/lib/chef/knife/role_from_file.rb +49 -0
  166. data/lib/chef/knife/role_list.rb +43 -0
  167. data/lib/chef/knife/role_show.rb +54 -0
  168. data/lib/chef/knife/search.rb +123 -0
  169. data/lib/chef/knife/ssh.rb +318 -0
  170. data/lib/chef/knife/status.rb +90 -0
  171. data/lib/chef/knife/subcommand_loader.rb +101 -0
  172. data/lib/chef/knife/tag_create.rb +31 -0
  173. data/lib/chef/knife/tag_delete.rb +31 -0
  174. data/lib/chef/knife/tag_list.rb +29 -0
  175. data/lib/chef/knife/ui.rb +227 -0
  176. data/lib/chef/knife/windows_bootstrap.rb +157 -0
  177. data/lib/chef/log.rb +39 -0
  178. data/lib/chef/mash.rb +211 -0
  179. data/lib/chef/mixin/check_helper.rb +31 -0
  180. data/lib/chef/mixin/checksum.rb +32 -0
  181. data/lib/chef/mixin/command.rb +221 -0
  182. data/lib/chef/mixin/command/unix.rb +215 -0
  183. data/lib/chef/mixin/command/windows.rb +76 -0
  184. data/lib/chef/mixin/convert_to_class_name.rb +63 -0
  185. data/lib/chef/mixin/create_path.rb +56 -0
  186. data/lib/chef/mixin/deep_merge.rb +225 -0
  187. data/lib/chef/mixin/deprecation.rb +65 -0
  188. data/lib/chef/mixin/from_file.rb +50 -0
  189. data/lib/chef/mixin/language.rb +165 -0
  190. data/lib/chef/mixin/language_include_attribute.rb +61 -0
  191. data/lib/chef/mixin/language_include_recipe.rb +52 -0
  192. data/lib/chef/mixin/params_validate.rb +225 -0
  193. data/lib/chef/mixin/recipe_definition_dsl_core.rb +81 -0
  194. data/lib/chef/mixin/shell_out.rb +40 -0
  195. data/lib/chef/mixin/template.rb +95 -0
  196. data/lib/chef/mixin/xml_escape.rb +140 -0
  197. data/lib/chef/mixins.rb +15 -0
  198. data/lib/chef/monkey_patches/dir.rb +36 -0
  199. data/lib/chef/monkey_patches/numeric.rb +7 -0
  200. data/lib/chef/monkey_patches/regexp.rb +34 -0
  201. data/lib/chef/monkey_patches/string.rb +28 -0
  202. data/lib/chef/monkey_patches/tempfile.rb +64 -0
  203. data/lib/chef/nil_argument.rb +3 -0
  204. data/lib/chef/node.rb +661 -0
  205. data/lib/chef/node/attribute.rb +487 -0
  206. data/lib/chef/openid_registration.rb +187 -0
  207. data/lib/chef/platform.rb +409 -0
  208. data/lib/chef/provider.rb +124 -0
  209. data/lib/chef/provider/breakpoint.rb +36 -0
  210. data/lib/chef/provider/cookbook_file.rb +101 -0
  211. data/lib/chef/provider/cron.rb +186 -0
  212. data/lib/chef/provider/cron/solaris.rb +195 -0
  213. data/lib/chef/provider/deploy.rb +320 -0
  214. data/lib/chef/provider/deploy/revision.rb +80 -0
  215. data/lib/chef/provider/deploy/timestamped.rb +33 -0
  216. data/lib/chef/provider/directory.rb +72 -0
  217. data/lib/chef/provider/env.rb +152 -0
  218. data/lib/chef/provider/env/windows.rb +75 -0
  219. data/lib/chef/provider/erl_call.rb +100 -0
  220. data/lib/chef/provider/execute.rb +60 -0
  221. data/lib/chef/provider/file.rb +222 -0
  222. data/lib/chef/provider/git.rb +221 -0
  223. data/lib/chef/provider/group.rb +133 -0
  224. data/lib/chef/provider/group/aix.rb +70 -0
  225. data/lib/chef/provider/group/dscl.rb +121 -0
  226. data/lib/chef/provider/group/gpasswd.rb +53 -0
  227. data/lib/chef/provider/group/groupadd.rb +81 -0
  228. data/lib/chef/provider/group/pw.rb +84 -0
  229. data/lib/chef/provider/group/usermod.rb +57 -0
  230. data/lib/chef/provider/group/windows.rb +79 -0
  231. data/lib/chef/provider/http_request.rb +122 -0
  232. data/lib/chef/provider/ifconfig.rb +132 -0
  233. data/lib/chef/provider/link.rb +161 -0
  234. data/lib/chef/provider/log.rb +54 -0
  235. data/lib/chef/provider/mdadm.rb +91 -0
  236. data/lib/chef/provider/mount.rb +117 -0
  237. data/lib/chef/provider/mount/mount.rb +232 -0
  238. data/lib/chef/provider/mount/windows.rb +80 -0
  239. data/lib/chef/provider/ohai.rb +41 -0
  240. data/lib/chef/provider/package.rb +160 -0
  241. data/lib/chef/provider/package/apt.rb +110 -0
  242. data/lib/chef/provider/package/dpkg.rb +112 -0
  243. data/lib/chef/provider/package/easy_install.rb +136 -0
  244. data/lib/chef/provider/package/freebsd.rb +123 -0
  245. data/lib/chef/provider/package/macports.rb +105 -0
  246. data/lib/chef/provider/package/pacman.rb +101 -0
  247. data/lib/chef/provider/package/portage.rb +135 -0
  248. data/lib/chef/provider/package/rpm.rb +101 -0
  249. data/lib/chef/provider/package/rubygems.rb +462 -0
  250. data/lib/chef/provider/package/solaris.rb +127 -0
  251. data/lib/chef/provider/package/yum-dump.py +128 -0
  252. data/lib/chef/provider/package/yum.rb +261 -0
  253. data/lib/chef/provider/package/zypper.rb +133 -0
  254. data/lib/chef/provider/remote_directory.rb +138 -0
  255. data/lib/chef/provider/remote_file.rb +119 -0
  256. data/lib/chef/provider/route.rb +195 -0
  257. data/lib/chef/provider/ruby_block.rb +33 -0
  258. data/lib/chef/provider/script.rb +55 -0
  259. data/lib/chef/provider/service.rb +128 -0
  260. data/lib/chef/provider/service/arch.rb +109 -0
  261. data/lib/chef/provider/service/debian.rb +130 -0
  262. data/lib/chef/provider/service/freebsd.rb +156 -0
  263. data/lib/chef/provider/service/gentoo.rb +54 -0
  264. data/lib/chef/provider/service/init.rb +71 -0
  265. data/lib/chef/provider/service/insserv.rb +52 -0
  266. data/lib/chef/provider/service/redhat.rb +60 -0
  267. data/lib/chef/provider/service/simple.rb +118 -0
  268. data/lib/chef/provider/service/solaris.rb +85 -0
  269. data/lib/chef/provider/service/upstart.rb +192 -0
  270. data/lib/chef/provider/service/windows.rb +146 -0
  271. data/lib/chef/provider/subversion.rb +194 -0
  272. data/lib/chef/provider/template.rb +105 -0
  273. data/lib/chef/provider/user.rb +187 -0
  274. data/lib/chef/provider/user/dscl.rb +280 -0
  275. data/lib/chef/provider/user/pw.rb +113 -0
  276. data/lib/chef/provider/user/useradd.rb +137 -0
  277. data/lib/chef/provider/user/windows.rb +124 -0
  278. data/lib/chef/providers.rb +93 -0
  279. data/lib/chef/recipe.rb +128 -0
  280. data/lib/chef/resource.rb +530 -0
  281. data/lib/chef/resource/apt_package.rb +34 -0
  282. data/lib/chef/resource/bash.rb +33 -0
  283. data/lib/chef/resource/breakpoint.rb +35 -0
  284. data/lib/chef/resource/cookbook_file.rb +45 -0
  285. data/lib/chef/resource/cron.rb +188 -0
  286. data/lib/chef/resource/csh.rb +33 -0
  287. data/lib/chef/resource/deploy.rb +371 -0
  288. data/lib/chef/resource/deploy_revision.rb +35 -0
  289. data/lib/chef/resource/directory.rb +76 -0
  290. data/lib/chef/resource/dpkg_package.rb +34 -0
  291. data/lib/chef/resource/easy_install_package.rb +57 -0
  292. data/lib/chef/resource/env.rb +58 -0
  293. data/lib/chef/resource/erl_call.rb +83 -0
  294. data/lib/chef/resource/execute.rb +127 -0
  295. data/lib/chef/resource/file.rb +99 -0
  296. data/lib/chef/resource/freebsd_package.rb +35 -0
  297. data/lib/chef/resource/gem_package.rb +53 -0
  298. data/lib/chef/resource/git.rb +37 -0
  299. data/lib/chef/resource/group.rb +70 -0
  300. data/lib/chef/resource/http_request.rb +61 -0
  301. data/lib/chef/resource/ifconfig.rb +134 -0
  302. data/lib/chef/resource/link.rb +78 -0
  303. data/lib/chef/resource/log.rb +62 -0
  304. data/lib/chef/resource/macports_package.rb +29 -0
  305. data/lib/chef/resource/mdadm.rb +82 -0
  306. data/lib/chef/resource/mount.rb +135 -0
  307. data/lib/chef/resource/ohai.rb +40 -0
  308. data/lib/chef/resource/package.rb +80 -0
  309. data/lib/chef/resource/pacman_package.rb +33 -0
  310. data/lib/chef/resource/perl.rb +33 -0
  311. data/lib/chef/resource/portage_package.rb +33 -0
  312. data/lib/chef/resource/python.rb +33 -0
  313. data/lib/chef/resource/remote_directory.rb +109 -0
  314. data/lib/chef/resource/remote_file.rb +83 -0
  315. data/lib/chef/resource/route.rb +135 -0
  316. data/lib/chef/resource/rpm_package.rb +34 -0
  317. data/lib/chef/resource/ruby.rb +33 -0
  318. data/lib/chef/resource/ruby_block.rb +40 -0
  319. data/lib/chef/resource/scm.rb +147 -0
  320. data/lib/chef/resource/script.rb +60 -0
  321. data/lib/chef/resource/service.rb +160 -0
  322. data/lib/chef/resource/solaris_package.rb +36 -0
  323. data/lib/chef/resource/subversion.rb +36 -0
  324. data/lib/chef/resource/template.rb +69 -0
  325. data/lib/chef/resource/timestamped_deploy.rb +31 -0
  326. data/lib/chef/resource/user.rb +130 -0
  327. data/lib/chef/resource/yum_package.rb +43 -0
  328. data/lib/chef/resource_collection.rb +217 -0
  329. data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
  330. data/lib/chef/resource_definition.rb +67 -0
  331. data/lib/chef/resource_definition_list.rb +38 -0
  332. data/lib/chef/resources.rb +64 -0
  333. data/lib/chef/rest.rb +386 -0
  334. data/lib/chef/rest/auth_credentials.rb +71 -0
  335. data/lib/chef/rest/cookie_jar.rb +31 -0
  336. data/lib/chef/rest/rest_request.rb +188 -0
  337. data/lib/chef/role.rb +341 -0
  338. data/lib/chef/run_context.rb +126 -0
  339. data/lib/chef/run_list.rb +165 -0
  340. data/lib/chef/run_list/run_list_expansion.rb +193 -0
  341. data/lib/chef/run_list/run_list_item.rb +92 -0
  342. data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
  343. data/lib/chef/run_status.rb +121 -0
  344. data/lib/chef/runner.rb +99 -0
  345. data/lib/chef/sandbox.rb +153 -0
  346. data/lib/chef/search/query.rb +65 -0
  347. data/lib/chef/shef.rb +326 -0
  348. data/lib/chef/shef/ext.rb +569 -0
  349. data/lib/chef/shef/model_wrapper.rb +120 -0
  350. data/lib/chef/shef/shef_rest.rb +28 -0
  351. data/lib/chef/shef/shef_session.rb +284 -0
  352. data/lib/chef/shell_out.rb +238 -0
  353. data/lib/chef/shell_out/unix.rb +223 -0
  354. data/lib/chef/shell_out/windows.rb +98 -0
  355. data/lib/chef/solr_query.rb +187 -0
  356. data/lib/chef/solr_query/lucene.treetop +150 -0
  357. data/lib/chef/solr_query/lucene_nodes.rb +285 -0
  358. data/lib/chef/solr_query/query_transform.rb +65 -0
  359. data/lib/chef/solr_query/solr_http_request.rb +118 -0
  360. data/lib/chef/streaming_cookbook_uploader.rb +201 -0
  361. data/lib/chef/tasks/chef_repo.rake +256 -0
  362. data/lib/chef/util/file_edit.rb +122 -0
  363. data/lib/chef/util/windows.rb +56 -0
  364. data/lib/chef/util/windows/net_group.rb +101 -0
  365. data/lib/chef/util/windows/net_use.rb +121 -0
  366. data/lib/chef/util/windows/net_user.rb +198 -0
  367. data/lib/chef/util/windows/volume.rb +59 -0
  368. data/lib/chef/version.rb +23 -0
  369. data/lib/chef/version_class.rb +70 -0
  370. data/lib/chef/version_constraint.rb +116 -0
  371. data/lib/chef/webui_user.rb +231 -0
  372. metadata +600 -0
@@ -0,0 +1,124 @@
1
+ # Author:: Daniel DeLeo (<dan@kallistec.com>)
2
+ # Copyright:: Copyright (c) 2009 Daniel DeLeo
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ class Chef
19
+ class ResourceCollection
20
+ class StepableIterator
21
+
22
+ def self.for_collection(new_collection)
23
+ instance = new(new_collection)
24
+ instance
25
+ end
26
+
27
+ attr_accessor :collection
28
+ attr_reader :position
29
+
30
+ def initialize(collection=[])
31
+ @position = 0
32
+ @paused = false
33
+ @collection = collection
34
+ end
35
+
36
+ def size
37
+ collection.size
38
+ end
39
+
40
+ def each(&block)
41
+ reset_iteration(block)
42
+ @iterator_type = :element
43
+ iterate
44
+ end
45
+
46
+ def each_index(&block)
47
+ reset_iteration(block)
48
+ @iterator_type = :index
49
+ iterate
50
+ end
51
+
52
+ def each_with_index(&block)
53
+ reset_iteration(block)
54
+ @iterator_type = :element_with_index
55
+ iterate
56
+ end
57
+
58
+ def paused?
59
+ @paused
60
+ end
61
+
62
+ def pause
63
+ @paused = true
64
+ end
65
+
66
+ def resume
67
+ @paused = false
68
+ iterate
69
+ end
70
+
71
+ def rewind
72
+ @position = 0
73
+ end
74
+
75
+ def skip_back(skips=1)
76
+ @position -= skips
77
+ end
78
+
79
+ def skip_forward(skips=1)
80
+ @position += skips
81
+ end
82
+
83
+ def step
84
+ return nil if @position == size
85
+ call_iterator_block
86
+ @position += 1
87
+ end
88
+
89
+ def iterate_on(iteration_type, &block)
90
+ @iterator_type = iteration_type
91
+ @iterator_block = block
92
+ end
93
+
94
+ private
95
+
96
+ def reset_iteration(iterator_block)
97
+ @iterator_block = iterator_block
98
+ @position = 0
99
+ @paused = false
100
+ end
101
+
102
+ def iterate
103
+ while @position < size && !paused?
104
+ step
105
+ end
106
+ collection
107
+ end
108
+
109
+ def call_iterator_block
110
+ case @iterator_type
111
+ when :element
112
+ @iterator_block.call(collection[@position])
113
+ when :index
114
+ @iterator_block.call(@position)
115
+ when :element_with_index
116
+ @iterator_block.call(collection[@position], @position)
117
+ else
118
+ raise "42error: someone forgot to set @iterator_type, wtf?"
119
+ end
120
+ end
121
+
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,67 @@
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/from_file'
20
+ require 'chef/mixin/params_validate'
21
+
22
+ class Chef
23
+ class ResourceDefinition
24
+
25
+ include Chef::Mixin::FromFile
26
+ include Chef::Mixin::ParamsValidate
27
+
28
+ attr_accessor :name, :params, :recipe, :node
29
+
30
+ def initialize(node=nil)
31
+ @name = nil
32
+ @params = Hash.new
33
+ @recipe = nil
34
+ @node = node
35
+ end
36
+
37
+ def define(resource_name, prototype_params=nil, &block)
38
+ unless resource_name.kind_of?(Symbol)
39
+ raise ArgumentError, "You must use a symbol when defining a new resource!"
40
+ end
41
+ @name = resource_name
42
+ if prototype_params
43
+ unless prototype_params.kind_of?(Hash)
44
+ raise ArgumentError, "You must pass a hash as the prototype parameters for a definition."
45
+ end
46
+ @params = prototype_params
47
+ end
48
+ if Kernel.block_given?
49
+ @recipe = block
50
+ else
51
+ raise ArgumentError, "You must pass a block to a definition."
52
+ end
53
+ true
54
+ end
55
+
56
+ # When we do the resource definition, we're really just setting new values for
57
+ # the paramaters we prototyped at the top. This method missing is as simple as
58
+ # it gets.
59
+ def method_missing(symbol, *args)
60
+ @params[symbol] = args.length == 1 ? args[0] : args
61
+ end
62
+
63
+ def to_s
64
+ "#{name.to_s}"
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,38 @@
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/from_file'
20
+ require 'chef/resource_definition'
21
+
22
+ class Chef
23
+ class ResourceDefinitionList
24
+ include Chef::Mixin::FromFile
25
+
26
+ attr_accessor :defines
27
+
28
+ def initialize
29
+ @defines = Hash.new
30
+ end
31
+
32
+ def define(resource_name, prototype_params=nil, &block)
33
+ @defines[resource_name] = ResourceDefinition.new
34
+ @defines[resource_name].define(resource_name, prototype_params, &block)
35
+ true
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,64 @@
1
+ #
2
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
3
+ # Copyright:: Copyright (c) 2010 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/resource/apt_package'
20
+ require 'chef/resource/bash'
21
+ require 'chef/resource/breakpoint'
22
+ require 'chef/resource/cookbook_file'
23
+ require 'chef/resource/cron'
24
+ require 'chef/resource/csh'
25
+ require 'chef/resource/deploy'
26
+ require 'chef/resource/deploy_revision'
27
+ require 'chef/resource/directory'
28
+ require 'chef/resource/dpkg_package'
29
+ require 'chef/resource/easy_install_package'
30
+ require 'chef/resource/env'
31
+ require 'chef/resource/erl_call'
32
+ require 'chef/resource/execute'
33
+ require 'chef/resource/file'
34
+ require 'chef/resource/freebsd_package'
35
+ require 'chef/resource/gem_package'
36
+ require 'chef/resource/git'
37
+ require 'chef/resource/group'
38
+ require 'chef/resource/http_request'
39
+ require 'chef/resource/ifconfig'
40
+ require 'chef/resource/link'
41
+ require 'chef/resource/log'
42
+ require 'chef/resource/macports_package'
43
+ require 'chef/resource/mdadm'
44
+ require 'chef/resource/mount'
45
+ require 'chef/resource/ohai'
46
+ require 'chef/resource/package'
47
+ require 'chef/resource/pacman_package'
48
+ require 'chef/resource/perl'
49
+ require 'chef/resource/portage_package'
50
+ require 'chef/resource/python'
51
+ require 'chef/resource/remote_directory'
52
+ require 'chef/resource/remote_file'
53
+ require 'chef/resource/rpm_package'
54
+ require 'chef/resource/route'
55
+ require 'chef/resource/ruby'
56
+ require 'chef/resource/ruby_block'
57
+ require 'chef/resource/scm'
58
+ require 'chef/resource/script'
59
+ require 'chef/resource/service'
60
+ require 'chef/resource/subversion'
61
+ require 'chef/resource/template'
62
+ require 'chef/resource/timestamped_deploy'
63
+ require 'chef/resource/user'
64
+ require 'chef/resource/yum_package'
@@ -0,0 +1,386 @@
1
+ #--
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Thom May (<thom@clearairturbulence.org>)
4
+ # Author:: Nuo Yan (<nuo@opscode.com>)
5
+ # Author:: Christopher Brown (<cb@opscode.com>)
6
+ # Author:: Christopher Walters (<cw@opscode.com>)
7
+ # Copyright:: Copyright (c) 2009, 2010 Opscode, Inc.
8
+ # License:: Apache License, Version 2.0
9
+ #
10
+ # Licensed under the Apache License, Version 2.0 (the "License");
11
+ # you may not use this file except in compliance with the License.
12
+ # You may obtain a copy of the License at
13
+ #
14
+ # http://www.apache.org/licenses/LICENSE-2.0
15
+ #
16
+ # Unless required by applicable law or agreed to in writing, software
17
+ # distributed under the License is distributed on an "AS IS" BASIS,
18
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19
+ # See the License for the specific language governing permissions and
20
+ # limitations under the License.
21
+ #
22
+
23
+ require 'net/https'
24
+ require 'uri'
25
+ require 'chef/json_compat'
26
+ require 'tempfile'
27
+ require 'chef/api_client'
28
+ require 'chef/rest/auth_credentials'
29
+ require 'chef/rest/rest_request'
30
+ require 'chef/monkey_patches/string'
31
+
32
+ class Chef
33
+ # == Chef::REST
34
+ # Chef's custom REST client with built-in JSON support and RSA signed header
35
+ # authentication.
36
+ class REST
37
+ attr_reader :auth_credentials
38
+ attr_accessor :url, :cookies, :sign_on_redirect, :redirect_limit
39
+
40
+ # Create a REST client object. The supplied +url+ is used as the base for
41
+ # all subsequent requests. For example, when initialized with a base url
42
+ # http://localhost:4000, a call to +get_rest+ with 'nodes' will make an
43
+ # HTTP GET request to http://localhost:4000/nodes
44
+ def initialize(url, client_name=Chef::Config[:node_name], signing_key_filename=Chef::Config[:client_key], options={})
45
+ @url = url
46
+ @cookies = CookieJar.instance
47
+ @default_headers = options[:headers] || {}
48
+ @auth_credentials = AuthCredentials.new(client_name, signing_key_filename)
49
+ @sign_on_redirect, @sign_request = true, true
50
+ @redirects_followed = 0
51
+ @redirect_limit = 10
52
+ end
53
+
54
+ def signing_key_filename
55
+ @auth_credentials.key_file
56
+ end
57
+
58
+ def client_name
59
+ @auth_credentials.client_name
60
+ end
61
+
62
+ def signing_key
63
+ @auth_credentials.raw_key
64
+ end
65
+
66
+ # Register the client
67
+ def register(name=Chef::Config[:node_name], destination=Chef::Config[:client_key])
68
+ if (File.exists?(destination) && !File.writable?(destination))
69
+ raise Chef::Exceptions::CannotWritePrivateKey, "I cannot write your private key to #{destination} - check permissions?"
70
+ end
71
+ nc = Chef::ApiClient.new
72
+ nc.name(name)
73
+
74
+ catch(:done) do
75
+ retries = config[:client_registration_retries] || 5
76
+ 0.upto(retries) do |n|
77
+ begin
78
+ response = nc.save(true, true)
79
+ Chef::Log.debug("Registration response: #{response.inspect}")
80
+ raise Chef::Exceptions::CannotWritePrivateKey, "The response from the server did not include a private key!" unless response.has_key?("private_key")
81
+ # Write out the private key
82
+ ::File.open(destination, "w") {|f|
83
+ f.chmod(0600)
84
+ f.print(response["private_key"])
85
+ }
86
+ throw :done
87
+ rescue IOError
88
+ raise Chef::Exceptions::CannotWritePrivateKey, "I cannot write your private key to #{destination}"
89
+ rescue Net::HTTPFatalError => e
90
+ Chef::Log.warn("Failed attempt #{n} of #{retries+1} on client creation")
91
+ raise unless e.response.code == "500"
92
+ end
93
+ end
94
+ end
95
+
96
+ true
97
+ end
98
+
99
+ # Send an HTTP GET request to the path
100
+ #
101
+ # Using this method to +fetch+ a file is considered deprecated.
102
+ #
103
+ # === Parameters
104
+ # path:: The path to GET
105
+ # raw:: Whether you want the raw body returned, or JSON inflated. Defaults
106
+ # to JSON inflated.
107
+ def get_rest(path, raw=false, headers={})
108
+ if raw
109
+ streaming_request(create_url(path), headers)
110
+ else
111
+ api_request(:GET, create_url(path), headers)
112
+ end
113
+ end
114
+
115
+ # Send an HTTP DELETE request to the path
116
+ def delete_rest(path, headers={})
117
+ api_request(:DELETE, create_url(path), headers)
118
+ end
119
+
120
+ # Send an HTTP POST request to the path
121
+ def post_rest(path, json, headers={})
122
+ api_request(:POST, create_url(path), headers, json)
123
+ end
124
+
125
+ # Send an HTTP PUT request to the path
126
+ def put_rest(path, json, headers={})
127
+ api_request(:PUT, create_url(path), headers, json)
128
+ end
129
+
130
+ # Streams a download to a tempfile, then yields the tempfile to a block.
131
+ # After the download, the tempfile will be closed and unlinked.
132
+ # If you rename the tempfile, it will not be deleted.
133
+ # Beware that if the server streams infinite content, this method will
134
+ # stream it until you run out of disk space.
135
+ def fetch(path, headers={})
136
+ streaming_request(create_url(path), headers) {|tmp_file| yield tmp_file }
137
+ end
138
+
139
+ def create_url(path)
140
+ if path =~ /^(http|https):\/\//
141
+ URI.parse(path)
142
+ else
143
+ URI.parse("#{@url}/#{path}")
144
+ end
145
+ end
146
+
147
+ def sign_requests?
148
+ auth_credentials.sign_requests? && @sign_request
149
+ end
150
+
151
+ # ==== DEPRECATED
152
+ # Use +api_request+ instead
153
+ #--
154
+ # Actually run an HTTP request. First argument is the HTTP method,
155
+ # which should be one of :GET, :PUT, :POST or :DELETE. Next is the
156
+ # URL, then an object to include in the body (which will be converted with
157
+ # .to_json). The limit argument is unused, it is present for backwards
158
+ # compatibility. Configure the redirect limit with #redirect_limit=
159
+ # instead.
160
+ #
161
+ # Typically, you won't use this method -- instead, you'll use one of
162
+ # the helper methods (get_rest, post_rest, etc.)
163
+ #
164
+ # Will return the body of the response on success.
165
+ def run_request(method, url, headers={}, data=false, limit=nil, raw=false)
166
+ json_body = data ? Chef::JSONCompat.to_json(data) : nil
167
+ headers = build_headers(method, url, headers, json_body, raw)
168
+
169
+ tf = nil
170
+
171
+ retriable_rest_request(method, url, json_body, headers) do |rest_request|
172
+
173
+ res = rest_request.call do |response|
174
+ if raw
175
+ tf = stream_to_tempfile(url, response)
176
+ else
177
+ response.read_body
178
+ end
179
+ end
180
+
181
+ if res.kind_of?(Net::HTTPSuccess)
182
+ if res['content-type'] =~ /json/
183
+ response_body = res.body.chomp
184
+ Chef::JSONCompat.from_json(response_body)
185
+ else
186
+ if method == :HEAD
187
+ true
188
+ elsif raw
189
+ tf
190
+ else
191
+ res.body
192
+ end
193
+ end
194
+ elsif res.kind_of?(Net::HTTPFound) or res.kind_of?(Net::HTTPMovedPermanently)
195
+ follow_redirect {run_request(:GET, create_url(res['location']), {}, false, nil, raw)}
196
+ elsif res.kind_of?(Net::HTTPNotModified)
197
+ false
198
+ else
199
+ if res['content-type'] =~ /json/
200
+ exception = Chef::JSONCompat.from_json(res.body)
201
+ msg = "HTTP Request Returned #{res.code} #{res.message}: "
202
+ msg << (exception["error"].respond_to?(:join) ? exception["error"].join(", ") : exception["error"].to_s)
203
+ Chef::Log.warn(msg)
204
+ end
205
+ res.error!
206
+ end
207
+ end
208
+ end
209
+
210
+ # Runs an HTTP request to a JSON API. File Download not supported.
211
+ def api_request(method, url, headers={}, data=false)
212
+ json_body = data ? Chef::JSONCompat.to_json(data) : nil
213
+ headers = build_headers(method, url, headers, json_body)
214
+
215
+ retriable_rest_request(method, url, json_body, headers) do |rest_request|
216
+ response = rest_request.call {|r| r.read_body}
217
+
218
+ if response.kind_of?(Net::HTTPSuccess)
219
+ if response['content-type'] =~ /json/
220
+ Chef::JSONCompat.from_json(response.body.chomp)
221
+ else
222
+ Chef::Log.warn("Expected JSON response, but got content-type '#{response['content-type']}'")
223
+ response.body
224
+ end
225
+ elsif redirect_location = redirected_to(response)
226
+ follow_redirect {api_request(:GET, create_url(redirect_location))}
227
+ else
228
+ if response['content-type'] =~ /json/
229
+ exception = Chef::JSONCompat.from_json(response.body)
230
+ msg = "HTTP Request Returned #{response.code} #{response.message}: "
231
+ msg << (exception["error"].respond_to?(:join) ? exception["error"].join(", ") : exception["error"].to_s)
232
+ Chef::Log.warn(msg)
233
+ end
234
+ response.error!
235
+ end
236
+ end
237
+ end
238
+
239
+ # Makes a streaming download request. <b>Doesn't speak JSON.</b>
240
+ # Streams the response body to a tempfile. If a block is given, it's
241
+ # passed to Tempfile.open(), which means that the tempfile will automatically
242
+ # be unlinked after the block is executed.
243
+ #
244
+ # If no block is given, the tempfile is returned, which means it's up to
245
+ # you to unlink the tempfile when you're done with it.
246
+ def streaming_request(url, headers, &block)
247
+ headers = build_headers(:GET, url, headers, nil, true)
248
+ retriable_rest_request(:GET, url, nil, headers) do |rest_request|
249
+ tempfile = nil
250
+ response = rest_request.call do |r|
251
+ if block_given? && r.kind_of?(Net::HTTPSuccess)
252
+ begin
253
+ tempfile = stream_to_tempfile(url, r, &block)
254
+ yield tempfile
255
+ ensure
256
+ tempfile.close!
257
+ end
258
+ else
259
+ tempfile = stream_to_tempfile(url, r)
260
+ end
261
+ end
262
+ if response.kind_of?(Net::HTTPSuccess)
263
+ tempfile
264
+ elsif redirect_location = redirected_to(response)
265
+ # TODO: test tempfile unlinked when following redirects.
266
+ tempfile && tempfile.close!
267
+ follow_redirect {streaming_request(create_url(redirect_location), {}, &block)}
268
+ else
269
+ tempfile && tempfile.close!
270
+ response.error!
271
+ end
272
+ end
273
+ end
274
+
275
+ def retriable_rest_request(method, url, req_body, headers)
276
+ rest_request = Chef::REST::RESTRequest.new(method, url, req_body, headers)
277
+
278
+ Chef::Log.debug("Sending HTTP Request via #{method} to #{url.host}:#{url.port}#{rest_request.path}")
279
+
280
+ http_attempts = 0
281
+
282
+ begin
283
+ http_attempts += 1
284
+
285
+ res = yield rest_request
286
+
287
+ rescue Errno::ECONNREFUSED
288
+ if http_retry_count - http_attempts + 1 > 0
289
+ Chef::Log.error("Connection refused connecting to #{url.host}:#{url.port} for #{rest_request.path}, retry #{http_attempts}/#{http_retry_count}")
290
+ sleep(http_retry_delay)
291
+ retry
292
+ end
293
+ raise Errno::ECONNREFUSED, "Connection refused connecting to #{url.host}:#{url.port} for #{rest_request.path}, giving up"
294
+ rescue Timeout::Error
295
+ if http_retry_count - http_attempts + 1 > 0
296
+ Chef::Log.error("Timeout connecting to #{url.host}:#{url.port} for #{rest_request.path}, retry #{http_attempts}/#{http_retry_count}")
297
+ sleep(http_retry_delay)
298
+ retry
299
+ end
300
+ raise Timeout::Error, "Timeout connecting to #{url.host}:#{url.port} for #{rest_request.path}, giving up"
301
+ rescue Net::HTTPServerException
302
+ if res.kind_of?(Net::HTTPForbidden)
303
+ if http_retry_count - http_attempts + 1 > 0
304
+ Chef::Log.error("Received 403 Forbidden against #{url.host}:#{url.port} for #{rest_request.path}, retry #{http_attempts}/#{http_retry_count}")
305
+ sleep(http_retry_delay)
306
+ retry
307
+ end
308
+ end
309
+ raise
310
+ end
311
+ end
312
+
313
+ def authentication_headers(method, url, json_body=nil)
314
+ request_params = {:http_method => method, :path => url.path, :body => json_body, :host => "#{url.host}:#{url.port}"}
315
+ request_params[:body] ||= ""
316
+ auth_credentials.signature_headers(request_params)
317
+ end
318
+
319
+ def http_retry_delay
320
+ config[:http_retry_delay]
321
+ end
322
+
323
+ def http_retry_count
324
+ config[:http_retry_count]
325
+ end
326
+
327
+ def config
328
+ Chef::Config
329
+ end
330
+
331
+ def follow_redirect
332
+ raise Chef::Exceptions::RedirectLimitExceeded if @redirects_followed >= redirect_limit
333
+ @redirects_followed += 1
334
+ Chef::Log.debug("Following redirect #{@redirects_followed}/#{redirect_limit}")
335
+ if @sign_on_redirect
336
+ yield
337
+ else
338
+ @sign_request = false
339
+ yield
340
+ end
341
+ ensure
342
+ @redirects_followed = 0
343
+ @sign_request = true
344
+ end
345
+
346
+ private
347
+
348
+ def redirected_to(response)
349
+ if response.kind_of?(Net::HTTPFound) || response.kind_of?(Net::HTTPMovedPermanently)
350
+ response['location']
351
+ else
352
+ nil
353
+ end
354
+ end
355
+
356
+ def build_headers(method, url, headers={}, json_body=false, raw=false)
357
+ headers = @default_headers.merge(headers)
358
+ headers['Accept'] = "application/json" unless raw
359
+ headers["Content-Type"] = 'application/json' if json_body
360
+ headers['Content-Length'] = json_body.bytesize.to_s if json_body
361
+ headers.merge!(authentication_headers(method, url, json_body)) if sign_requests?
362
+ headers
363
+ end
364
+
365
+ def stream_to_tempfile(url, response)
366
+ tf = Tempfile.open("chef-rest")
367
+ if RUBY_PLATFORM =~ /mswin|mingw32|windows/
368
+ tf.binmode #required for binary files on Windows platforms
369
+ end
370
+ Chef::Log.debug("Streaming download from #{url.to_s} to tempfile #{tf.path}")
371
+ # Stolen from http://www.ruby-forum.com/topic/166423
372
+ # Kudos to _why!
373
+ size, total = 0, response.header['Content-Length'].to_i
374
+ response.read_body do |chunk|
375
+ tf.write(chunk)
376
+ size += chunk.size
377
+ end
378
+ tf.close
379
+ tf
380
+ rescue Exception
381
+ tf.close!
382
+ raise
383
+ end
384
+
385
+ end
386
+ end