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,71 @@
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
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
8
+ # Copyright:: Copyright (c) 2009, 2010 Opscode, Inc.
9
+ # License:: Apache License, Version 2.0
10
+ #
11
+ # Licensed under the Apache License, Version 2.0 (the "License");
12
+ # you may not use this file except in compliance with the License.
13
+ # You may obtain a copy of the License at
14
+ #
15
+ # http://www.apache.org/licenses/LICENSE-2.0
16
+ #
17
+ # Unless required by applicable law or agreed to in writing, software
18
+ # distributed under the License is distributed on an "AS IS" BASIS,
19
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
+ # See the License for the specific language governing permissions and
21
+ # limitations under the License.
22
+ #
23
+ require 'chef/exceptions'
24
+ require 'mixlib/authentication/signedheaderauth'
25
+
26
+ class Chef
27
+ class REST
28
+ class AuthCredentials
29
+ attr_reader :key_file, :client_name, :key, :raw_key
30
+
31
+ def initialize(client_name=nil, key_file=nil)
32
+ @client_name, @key_file = client_name, key_file
33
+ load_signing_key if sign_requests?
34
+ end
35
+
36
+ def sign_requests?
37
+ !!key_file
38
+ end
39
+
40
+ def signature_headers(request_params={})
41
+ raise ArgumentError, "Cannot sign the request without a client name, check that :node_name is assigned" if client_name.nil?
42
+ Chef::Log.debug("Signing the request as #{client_name}")
43
+
44
+ # params_in = {:http_method => :GET, :path => "/clients", :body => "", :host => "localhost"}
45
+ request_params = request_params.dup
46
+ request_params[:timestamp] = Time.now.utc.iso8601
47
+ request_params[:user_id] = client_name
48
+ host = request_params.delete(:host) || "localhost"
49
+
50
+ sign_obj = Mixlib::Authentication::SignedHeaderAuth.signing_object(request_params)
51
+ signed = sign_obj.sign(key).merge({:host => host})
52
+ signed.inject({}){|memo, kv| memo["#{kv[0].to_s.upcase}"] = kv[1];memo}
53
+ end
54
+
55
+ private
56
+
57
+ def load_signing_key
58
+ @raw_key = IO.read(key_file).strip
59
+ @key = OpenSSL::PKey::RSA.new(@raw_key)
60
+ rescue SystemCallError, IOError => e
61
+ Chef::Log.fatal "Failed to read the private key #{key_file}: #{e.inspect}, #{e.backtrace}"
62
+ raise Chef::Exceptions::PrivateKeyMissing, "I cannot read #{key_file}, which you told me to use to sign requests!"
63
+ rescue OpenSSL::PKey::RSAError
64
+ msg = "The file #{key_file} does not contain a correctly formatted private key.\n"
65
+ msg << "The key file should begin with '-----BEGIN RSA PRIVATE KEY-----' and end with '-----END RSA PRIVATE KEY-----'"
66
+ raise Chef::Exceptions::InvalidPrivateKey, msg
67
+ end
68
+
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,31 @@
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
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
8
+ # Copyright:: Copyright (c) 2009, 2010 Opscode, Inc.
9
+ # License:: Apache License, Version 2.0
10
+ #
11
+ # Licensed under the Apache License, Version 2.0 (the "License");
12
+ # you may not use this file except in compliance with the License.
13
+ # You may obtain a copy of the License at
14
+ #
15
+ # http://www.apache.org/licenses/LICENSE-2.0
16
+ #
17
+ # Unless required by applicable law or agreed to in writing, software
18
+ # distributed under the License is distributed on an "AS IS" BASIS,
19
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
+ # See the License for the specific language governing permissions and
21
+ # limitations under the License.
22
+ #
23
+ require 'singleton'
24
+
25
+ class Chef
26
+ class REST
27
+ class CookieJar < Hash
28
+ include Singleton
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,188 @@
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
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
8
+ # Copyright:: Copyright (c) 2009, 2010 Opscode, Inc.
9
+ # License:: Apache License, Version 2.0
10
+ #
11
+ # Licensed under the Apache License, Version 2.0 (the "License");
12
+ # you may not use this file except in compliance with the License.
13
+ # You may obtain a copy of the License at
14
+ #
15
+ # http://www.apache.org/licenses/LICENSE-2.0
16
+ #
17
+ # Unless required by applicable law or agreed to in writing, software
18
+ # distributed under the License is distributed on an "AS IS" BASIS,
19
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
+ # See the License for the specific language governing permissions and
21
+ # limitations under the License.
22
+ #
23
+ require 'uri'
24
+ require 'net/http'
25
+ require 'chef/rest/cookie_jar'
26
+ require 'chef/version'
27
+
28
+ class Chef
29
+ class REST
30
+ class RESTRequest
31
+ attr_reader :method, :url, :headers, :http_client, :http_request
32
+
33
+ def initialize(method, url, req_body, base_headers={})
34
+ @method, @url = method, url
35
+ @request_body = nil
36
+ @cookies = CookieJar.instance
37
+ configure_http_client
38
+ build_headers(base_headers)
39
+ configure_http_request(req_body)
40
+ end
41
+
42
+ def host
43
+ @url.host
44
+ end
45
+
46
+ def port
47
+ @url.port
48
+ end
49
+
50
+ def query
51
+ @url.query
52
+ end
53
+
54
+ def path
55
+ @url.path.empty? ? "/" : @url.path
56
+ end
57
+
58
+ def call
59
+ hide_net_http_bug do
60
+ http_client.request(http_request) do |response|
61
+ store_cookie(response)
62
+ yield response if block_given?
63
+ response
64
+ end
65
+ end
66
+ end
67
+
68
+ def config
69
+ Chef::Config
70
+ end
71
+
72
+ private
73
+
74
+ def hide_net_http_bug
75
+ yield
76
+ rescue NoMethodError => e
77
+ # http://redmine.ruby-lang.org/issues/show/2708
78
+ # http://redmine.ruby-lang.org/issues/show/2758
79
+ if e.to_s =~ /#{Regexp.escape(%q|undefined method `closed?' for nil:NilClass|)}/
80
+ Chef::Log.debug("rescued error in http connect, re-raising as Errno::ECONNREFUSED to hide bug in net/http")
81
+ Chef::Log.debug("#{e.class.name}: #{e.to_s}")
82
+ Chef::Log.debug(e.backtrace.join("\n"))
83
+ raise Errno::ECONNREFUSED, "Connection refused attempting to contact #{url.scheme}://#{host}:#{port}"
84
+ else
85
+ raise
86
+ end
87
+ end
88
+
89
+ def store_cookie(response)
90
+ if response['set-cookie']
91
+ @cookies["#{host}:#{port}"] = response['set-cookie']
92
+ end
93
+ end
94
+
95
+ def build_headers(headers)
96
+ @headers = headers.dup
97
+ # TODO: need to set accept somewhere else
98
+ # headers.merge!('Accept' => "application/json") unless raw
99
+ @headers['X-Chef-Version'] = ::Chef::VERSION
100
+
101
+ if @cookies.has_key?("#{host}:#{port}")
102
+ @headers['Cookie'] = @cookies["#{host}:#{port}"]
103
+ end
104
+ end
105
+
106
+ #adapted from buildr/lib/buildr/core/transports.rb
107
+ def proxy_uri
108
+ proxy = Chef::Config["#{url.scheme}_proxy"]
109
+ proxy = URI.parse(proxy) if String === proxy
110
+ excludes = Chef::Config[:no_proxy].to_s.split(/\s*,\s*/).compact
111
+ excludes = excludes.map { |exclude| exclude =~ /:\d+$/ ? exclude : "#{exclude}:*" }
112
+ return proxy unless excludes.any? { |exclude| File.fnmatch(exclude, "#{host}:#{port}") }
113
+ end
114
+
115
+ def configure_http_client
116
+ http_proxy = proxy_uri
117
+ if http_proxy.nil?
118
+ @http_client = Net::HTTP.new(host, port)
119
+ else
120
+ Chef::Log.debug("using #{http_proxy.host}:#{http_proxy.port} for proxy")
121
+ user = Chef::Config["#{url.scheme}_proxy_user"]
122
+ pass = Chef::Config["#{url.scheme}_proxy_pass"]
123
+ @http_client = Net::HTTP.Proxy(http_proxy.host, http_proxy.port, user, pass).new(host, port)
124
+ end
125
+ if url.scheme == "https"
126
+ @http_client.use_ssl = true
127
+ if config[:ssl_verify_mode] == :verify_none
128
+ @http_client.verify_mode = OpenSSL::SSL::VERIFY_NONE
129
+ elsif config[:ssl_verify_mode] == :verify_peer
130
+ @http_client.verify_mode = OpenSSL::SSL::VERIFY_PEER
131
+ end
132
+ if config[:ssl_ca_path]
133
+ unless ::File.exist?(config[:ssl_ca_path])
134
+ raise Chef::Exceptions::ConfigurationError, "The configured ssl_ca_path #{config[:ssl_ca_path]} does not exist"
135
+ end
136
+ @http_client.ca_path = config[:ssl_ca_path]
137
+ elsif config[:ssl_ca_file]
138
+ unless ::File.exist?(config[:ssl_ca_file])
139
+ raise Chef::Exceptions::ConfigurationError, "The configured ssl_ca_file #{config[:ssl_ca_file]} does not exist"
140
+ end
141
+ @http_client.ca_file = config[:ssl_ca_file]
142
+ end
143
+ if (config[:ssl_client_cert] || config[:ssl_client_key])
144
+ unless (config[:ssl_client_cert] && config[:ssl_client_key])
145
+ raise Chef::Exceptions::ConfigurationError, "You must configure ssl_client_cert and ssl_client_key together"
146
+ end
147
+ unless ::File.exists?(config[:ssl_client_cert])
148
+ raise Chef::Exceptions::ConfigurationError, "The configured ssl_client_cert #{config[:ssl_client_cert]} does not exist"
149
+ end
150
+ unless ::File.exists?(config[:ssl_client_key])
151
+ raise Chef::Exceptions::ConfigurationError, "The configured ssl_client_key #{config[:ssl_client_key]} does not exist"
152
+ end
153
+ @http_client.cert = OpenSSL::X509::Certificate.new(::File.read(config[:ssl_client_cert]))
154
+ @http_client.key = OpenSSL::PKey::RSA.new(::File.read(config[:ssl_client_key]))
155
+ end
156
+ end
157
+
158
+ @http_client.read_timeout = config[:rest_timeout]
159
+ end
160
+
161
+
162
+ def configure_http_request(request_body=nil)
163
+ req_path = "#{path}"
164
+ req_path << "?#{query}" if query
165
+
166
+ @http_request = case method.to_s.downcase
167
+ when "get"
168
+ Net::HTTP::Get.new(req_path, headers)
169
+ when "post"
170
+ Net::HTTP::Post.new(req_path, headers)
171
+ when "put"
172
+ Net::HTTP::Put.new(req_path, headers)
173
+ when "delete"
174
+ Net::HTTP::Delete.new(req_path, headers)
175
+ when "head"
176
+ Net::HTTP::Head.new(req_path, headers)
177
+ else
178
+ raise ArgumentError, "You must provide :GET, :PUT, :POST, :DELETE or :HEAD as the method"
179
+ end
180
+
181
+ @http_request.body = request_body if (request_body && @http_request.request_body_permitted?)
182
+ # Optionally handle HTTP Basic Authentication
183
+ @http_request.basic_auth(url.user, url.password) if url.user
184
+ end
185
+
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,341 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Nuo Yan (<nuo@opscode.com>)
4
+ # Author:: Christopher Brown (<cb@opscode.com>)
5
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
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/config'
22
+ require 'chef/mixin/params_validate'
23
+ require 'chef/mixin/from_file'
24
+ require 'chef/couchdb'
25
+ require 'chef/run_list'
26
+ require 'chef/index_queue'
27
+ require 'chef/mash'
28
+ require 'chef/json_compat'
29
+
30
+ class Chef
31
+ class Role
32
+
33
+ include Chef::Mixin::FromFile
34
+ include Chef::Mixin::ParamsValidate
35
+ include Chef::IndexQueue::Indexable
36
+
37
+ DESIGN_DOCUMENT = {
38
+ "version" => 6,
39
+ "language" => "javascript",
40
+ "views" => {
41
+ "all" => {
42
+ "map" => <<-EOJS
43
+ function(doc) {
44
+ if (doc.chef_type == "role") {
45
+ emit(doc.name, doc);
46
+ }
47
+ }
48
+ EOJS
49
+ },
50
+ "all_id" => {
51
+ "map" => <<-EOJS
52
+ function(doc) {
53
+ if (doc.chef_type == "role") {
54
+ emit(doc.name, doc.name);
55
+ }
56
+ }
57
+ EOJS
58
+ }
59
+ }
60
+ }
61
+
62
+ attr_accessor :couchdb_rev, :couchdb
63
+ attr_reader :couchdb_id
64
+
65
+ # Create a new Chef::Role object.
66
+ def initialize(couchdb=nil)
67
+ @name = ''
68
+ @description = ''
69
+ @default_attributes = Mash.new
70
+ @override_attributes = Mash.new
71
+ @env_run_lists = {"_default" => Chef::RunList.new}
72
+ @couchdb_rev = nil
73
+ @couchdb_id = nil
74
+ @couchdb = couchdb || Chef::CouchDB.new
75
+ end
76
+
77
+ def couchdb_id=(value)
78
+ @couchdb_id = value
79
+ self.index_id = value
80
+ end
81
+
82
+ def chef_server_rest
83
+ Chef::REST.new(Chef::Config[:chef_server_url])
84
+ end
85
+
86
+ def self.chef_server_rest
87
+ Chef::REST.new(Chef::Config[:chef_server_url])
88
+ end
89
+
90
+ def name(arg=nil)
91
+ set_or_return(
92
+ :name,
93
+ arg,
94
+ :regex => /^[\-[:alnum:]_]+$/
95
+ )
96
+ end
97
+
98
+ def description(arg=nil)
99
+ set_or_return(
100
+ :description,
101
+ arg,
102
+ :kind_of => String
103
+ )
104
+ end
105
+
106
+ def run_list(*args)
107
+ if (args.length > 0)
108
+ @env_run_lists["_default"].reset!(args)
109
+ end
110
+ @env_run_lists["_default"]
111
+ end
112
+
113
+ alias_method :recipes, :run_list
114
+
115
+ # For run_list expansion
116
+ def run_list_for(environment)
117
+ if env_run_lists[environment].nil?
118
+ env_run_lists["_default"]
119
+ else
120
+ env_run_lists[environment]
121
+ end
122
+ end
123
+
124
+ def active_run_list_for(environment)
125
+ @env_run_lists.has_key?(environment) ? environment : '_default'
126
+ end
127
+
128
+ # Per environment run lists
129
+ def env_run_lists(env_run_lists=nil)
130
+ if (!env_run_lists.nil?)
131
+ unless env_run_lists.key?("_default")
132
+ msg = "_default key is required in env_run_lists.\n"
133
+ msg << "(env_run_lists: #{env_run_lists.inspect})"
134
+ raise Chef::Exceptions::InvalidEnvironmentRunListSpecification, msg
135
+ end
136
+ @env_run_lists.clear
137
+ env_run_lists.each { |k,v| @env_run_lists[k] = Chef::RunList.new(*Array(v))}
138
+ end
139
+ @env_run_lists
140
+ end
141
+
142
+ alias :env_run_list :env_run_lists
143
+
144
+ def default_attributes(arg=nil)
145
+ set_or_return(
146
+ :default_attributes,
147
+ arg,
148
+ :kind_of => Hash
149
+ )
150
+ end
151
+
152
+ def override_attributes(arg=nil)
153
+ set_or_return(
154
+ :override_attributes,
155
+ arg,
156
+ :kind_of => Hash
157
+ )
158
+ end
159
+
160
+ def to_hash
161
+ env_run_lists_without_default = @env_run_lists.dup
162
+ env_run_lists_without_default.delete("_default")
163
+ result = {
164
+ "name" => @name,
165
+ "description" => @description,
166
+ 'json_class' => self.class.name,
167
+ "default_attributes" => @default_attributes,
168
+ "override_attributes" => @override_attributes,
169
+ "chef_type" => "role",
170
+ "run_list" => run_list,
171
+ "env_run_lists" => env_run_lists_without_default
172
+ }
173
+ result["_rev"] = couchdb_rev if couchdb_rev
174
+ result
175
+ end
176
+
177
+ # Serialize this object as a hash
178
+ def to_json(*a)
179
+ to_hash.to_json(*a)
180
+ end
181
+
182
+ def update_from!(o)
183
+ description(o.description)
184
+ recipes(o.recipes) if defined?(o.recipes)
185
+ default_attributes(o.default_attributes)
186
+ override_attributes(o.override_attributes)
187
+ env_run_lists(o.env_run_lists) unless o.env_run_lists.nil?
188
+ self
189
+ end
190
+
191
+ # Create a Chef::Role from JSON
192
+ def self.json_create(o)
193
+ role = new
194
+ role.name(o["name"])
195
+ role.description(o["description"])
196
+ role.default_attributes(o["default_attributes"])
197
+ role.override_attributes(o["override_attributes"])
198
+
199
+ # _default run_list is in 'run_list' for newer clients, and
200
+ # 'recipes' for older clients.
201
+ env_run_list_hash = {"_default" => (o.has_key?("run_list") ? o["run_list"] : o["recipes"])}
202
+
203
+ # Clients before 0.10 do not include env_run_lists, so only
204
+ # merge if it's there.
205
+ if o["env_run_lists"]
206
+ env_run_list_hash.merge!(o["env_run_lists"])
207
+ end
208
+ role.env_run_lists(env_run_list_hash)
209
+
210
+ role.couchdb_rev = o["_rev"] if o.has_key?("_rev")
211
+ role.index_id = role.couchdb_id
212
+ role.couchdb_id = o["_id"] if o.has_key?("_id")
213
+ role
214
+ end
215
+
216
+ # List all the Chef::Role objects in the CouchDB. If inflate is set to true, you will get
217
+ # the full list of all Roles, fully inflated.
218
+ def self.cdb_list(inflate=false, couchdb=nil)
219
+ rs = (couchdb || Chef::CouchDB.new).list("roles", inflate)
220
+ lookup = (inflate ? "value" : "key")
221
+ rs["rows"].collect { |r| r[lookup] }
222
+ end
223
+
224
+ # Get the list of all roles from the API.
225
+ def self.list(inflate=false)
226
+ if inflate
227
+ response = Hash.new
228
+ Chef::Search::Query.new.search(:role) do |n|
229
+ response[n.name] = n unless n.nil?
230
+ end
231
+ response
232
+ else
233
+ chef_server_rest.get_rest("roles")
234
+ end
235
+ end
236
+
237
+ # Load a role by name from CouchDB
238
+ def self.cdb_load(name, couchdb=nil)
239
+ (couchdb || Chef::CouchDB.new).load("role", name)
240
+ end
241
+
242
+ # Load a role by name from the API
243
+ def self.load(name)
244
+ chef_server_rest.get_rest("roles/#{name}")
245
+ end
246
+
247
+ def self.exists?(rolename, couchdb)
248
+ begin
249
+ self.cdb_load(rolename, couchdb)
250
+ rescue Chef::Exceptions::CouchDBNotFound
251
+ nil
252
+ end
253
+ end
254
+
255
+ def environment(env_name)
256
+ chef_server_rest.get_rest("roles/#{@name}/environments/#{env_name}")
257
+ end
258
+
259
+ def environments
260
+ chef_server_rest.get_rest("roles/#{@name}/environments")
261
+ end
262
+
263
+ # Remove this role from the CouchDB
264
+ def cdb_destroy
265
+ couchdb.delete("role", @name, couchdb_rev)
266
+ end
267
+
268
+ # Remove this role via the REST API
269
+ def destroy
270
+ chef_server_rest.delete_rest("roles/#{@name}")
271
+ end
272
+
273
+ # Save this role to the CouchDB
274
+ def cdb_save
275
+ self.couchdb_rev = couchdb.store("role", @name, self)["rev"]
276
+ end
277
+
278
+ # Save this role via the REST API
279
+ def save
280
+ begin
281
+ chef_server_rest.put_rest("roles/#{@name}", self)
282
+ rescue Net::HTTPServerException => e
283
+ raise e unless e.response.code == "404"
284
+ chef_server_rest.post_rest("roles", self)
285
+ end
286
+ self
287
+ end
288
+
289
+ # Create the role via the REST API
290
+ def create
291
+ chef_server_rest.post_rest("roles", self)
292
+ self
293
+ end
294
+
295
+ # Set up our CouchDB design document
296
+ def self.create_design_document(couchdb=nil)
297
+ (couchdb || Chef::CouchDB.new).create_design_document("roles", DESIGN_DOCUMENT)
298
+ end
299
+
300
+ # As a string
301
+ def to_s
302
+ "role[#{@name}]"
303
+ end
304
+
305
+ # Load a role from disk - prefers to load the JSON, but will happily load
306
+ # the raw rb files as well.
307
+ def self.from_disk(name, force=nil)
308
+ js_file = File.join(Chef::Config[:role_path], "#{name}.json")
309
+ rb_file = File.join(Chef::Config[:role_path], "#{name}.rb")
310
+
311
+ if File.exists?(js_file) || force == "json"
312
+ Chef::JSONCompat.from_json(IO.read(js_file))
313
+ elsif File.exists?(rb_file) || force == "ruby"
314
+ role = Chef::Role.new
315
+ role.name(name)
316
+ role.from_file(rb_file)
317
+ role
318
+ else
319
+ raise Chef::Exceptions::RoleNotFound, "Role '#{name}' could not be loaded from disk"
320
+ end
321
+ end
322
+
323
+ # Sync all the json roles with couchdb from disk
324
+ def self.sync_from_disk_to_couchdb
325
+ Dir[File.join(Chef::Config[:role_path], "*.json")].each do |role_file|
326
+ short_name = File.basename(role_file, ".json")
327
+ Chef::Log.warn("Loading #{short_name}")
328
+ r = Chef::Role.from_disk(short_name, "json")
329
+ begin
330
+ couch_role = Chef::Role.cdb_load(short_name)
331
+ r.couchdb_rev = couch_role.couchdb_rev
332
+ Chef::Log.debug("Replacing role #{short_name} with data from #{role_file}")
333
+ rescue Chef::Exceptions::CouchDBNotFound
334
+ Chef::Log.debug("Creating role #{short_name} with data from #{role_file}")
335
+ end
336
+ r.cdb_save
337
+ end
338
+ end
339
+
340
+ end
341
+ end