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,126 @@
1
+ #
2
+ # Author:: Seth Falcon (<seth@opscode.com>)
3
+ # Copyright:: Copyright 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 'base64'
20
+ require 'openssl'
21
+ require 'chef/data_bag_item'
22
+ require 'yaml'
23
+
24
+ # An EncryptedDataBagItem represents a read-only data bag item where
25
+ # all values, except for the value associated with the id key, have
26
+ # been encrypted.
27
+ #
28
+ # EncrypedDataBagItem can be used in recipes to decrypt data bag item
29
+ # members.
30
+ #
31
+ # Data bag item values are assumed to have been encrypted using the
32
+ # default symmetric encryption provided by Encryptor.encrypt where
33
+ # values are converted to YAML prior to encryption.
34
+ #
35
+ # If the shared secret is not specified at initialization or load,
36
+ # then the contents of the file referred to in
37
+ # Chef::Config[:encrypted_data_bag_secret] will be used as the
38
+ # secret. The default path is /etc/chef/encrypted_data_bag_secret
39
+ #
40
+ # EncryptedDataBagItem is intended to provide a means to avoid storing
41
+ # data bag items in the clear on the Chef server. This provides some
42
+ # protection against a breach of the Chef server or of Chef server
43
+ # backup data. Because the secret must be stored in the clear on any
44
+ # node needing access to an EncryptedDataBagItem, this approach
45
+ # provides no protection of data bag items from actors with access to
46
+ # such nodes in the infrastructure.
47
+ #
48
+ class Chef::EncryptedDataBagItem
49
+ DEFAULT_SECRET_FILE = "/etc/chef/encrypted_data_bag_secret"
50
+ ALGORITHM = 'aes-256-cbc'
51
+
52
+ def initialize(enc_hash, secret)
53
+ @enc_hash = enc_hash
54
+ @secret = secret
55
+ end
56
+
57
+ def [](key)
58
+ value = @enc_hash[key]
59
+ if key == "id"
60
+ value
61
+ else
62
+ self.class.decrypt_value(value, @secret)
63
+ end
64
+ end
65
+
66
+ def []=(key, value)
67
+ raise ArgumentError, "assignment not supported for #{self.class}"
68
+ end
69
+
70
+ def to_hash
71
+ @enc_hash.keys.inject({}) { |hash, key| hash[key] = self[key]; hash }
72
+ end
73
+
74
+ def self.from_plain_hash(plain_hash, secret)
75
+ self.new(self.encrypt_data_bag_item(plain_hash, secret), secret)
76
+ end
77
+
78
+ def self.encrypt_data_bag_item(plain_hash, secret)
79
+ plain_hash.inject({}) do |h, (key, val)|
80
+ h[key] = if key != "id"
81
+ self.encrypt_value(val, secret)
82
+ else
83
+ val
84
+ end
85
+ h
86
+ end
87
+ end
88
+
89
+ def self.load(data_bag, name, secret = nil)
90
+ path = "data/#{data_bag}/#{name}"
91
+ raw_hash = Chef::DataBagItem.load(data_bag, name)
92
+ secret = secret || self.load_secret
93
+ self.new(raw_hash, secret)
94
+ end
95
+
96
+ def self.encrypt_value(value, key)
97
+ Base64.encode64(self.cipher(:encrypt, value.to_yaml, key))
98
+ end
99
+
100
+ def self.decrypt_value(value, key)
101
+ YAML.load(self.cipher(:decrypt, Base64.decode64(value), key))
102
+ end
103
+
104
+ def self.load_secret(path=nil)
105
+ path = path || Chef::Config[:encrypted_data_bag_secret] || DEFAULT_SECRET_FILE
106
+ if !File.exists?(path)
107
+ raise Errno::ENOENT, "file not found '#{path}'"
108
+ end
109
+ secret = IO.read(path).strip
110
+ if secret.size < 1
111
+ raise ArgumentError, "invalid zero length secret in '#{path}'"
112
+ end
113
+ secret
114
+ end
115
+
116
+ protected
117
+
118
+ def self.cipher(direction, data, key)
119
+ cipher = OpenSSL::Cipher::Cipher.new(ALGORITHM)
120
+ cipher.send(direction)
121
+ cipher.pkcs5_keyivgen(key)
122
+ ans = cipher.update(data)
123
+ ans << cipher.final
124
+ ans
125
+ end
126
+ end
@@ -0,0 +1,386 @@
1
+ #
2
+ # Author:: Stephen Delano (<stephen@opscode.com>)
3
+ # Author:: Seth Falcon (<seth@opscode.com>)
4
+ # Copyright:: Copyright 2010-2011 Opscode, Inc.
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ require 'chef/config'
21
+ require 'chef/mixin/params_validate'
22
+ require 'chef/couchdb'
23
+ require 'chef/index_queue'
24
+ require 'chef/version_constraint'
25
+
26
+ class Chef
27
+ class Environment
28
+
29
+ DEFAULT = "default"
30
+
31
+ include Chef::Mixin::ParamsValidate
32
+ include Chef::Mixin::FromFile
33
+ include Chef::IndexQueue::Indexable
34
+
35
+ COMBINED_COOKBOOK_CONSTRAINT = /(.+)(?:[\s]+)((?:#{Chef::VersionConstraint::OPS.join('|')})(?:[\s]+).+)$/.freeze
36
+
37
+ attr_accessor :couchdb, :couchdb_rev
38
+ attr_reader :couchdb_id
39
+
40
+ DESIGN_DOCUMENT = {
41
+ "version" => 1,
42
+ "language" => "javascript",
43
+ "views" => {
44
+ "all" => {
45
+ "map" => <<-EOJS
46
+ function(doc) {
47
+ if (doc.chef_type == "environment") {
48
+ emit(doc.name, doc);
49
+ }
50
+ }
51
+ EOJS
52
+ },
53
+ "all_id" => {
54
+ "map" => <<-EOJS
55
+ function(doc) {
56
+ if (doc.chef_type == "environment") {
57
+ emit(doc.name, doc.name);
58
+ }
59
+ }
60
+ EOJS
61
+ }
62
+ }
63
+ }
64
+
65
+ def initialize(couchdb=nil)
66
+ @name = ''
67
+ @description = ''
68
+ @attributes = Mash.new
69
+ @cookbook_versions = Hash.new
70
+ @couchdb_rev = nil
71
+ @couchdb_id = nil
72
+ @couchdb = couchdb || Chef::CouchDB.new
73
+ end
74
+
75
+ def couchdb_id=(value)
76
+ @couchdb_id = value
77
+ self.index_id = value
78
+ end
79
+
80
+ def chef_server_rest
81
+ Chef::REST.new(Chef::Config[:chef_server_url])
82
+ end
83
+
84
+ def self.chef_server_rest
85
+ Chef::REST.new(Chef::Config[:chef_server_url])
86
+ end
87
+
88
+ def name(arg=nil)
89
+ set_or_return(
90
+ :name,
91
+ arg,
92
+ { :regex => /^[\-[:alnum:]_]+$/, :kind_of => String }
93
+ )
94
+ end
95
+
96
+ def description(arg=nil)
97
+ set_or_return(
98
+ :description,
99
+ arg,
100
+ :kind_of => String
101
+ )
102
+ end
103
+
104
+ def attributes(arg=nil)
105
+ set_or_return(
106
+ :attributes,
107
+ arg,
108
+ :kind_of => Hash
109
+ )
110
+ end
111
+
112
+ def cookbook_versions(arg=nil)
113
+ set_or_return(
114
+ :cookbook_versions,
115
+ arg,
116
+ {
117
+ :kind_of => Hash,
118
+ :callbacks => {
119
+ "should be a valid set of cookbook version requirements" => lambda { |cv| Chef::Environment.validate_cookbook_versions(cv) }
120
+ }
121
+ }
122
+ )
123
+ end
124
+
125
+ def cookbook(cookbook, version)
126
+ validate({
127
+ :version => version
128
+ },{
129
+ :version => {
130
+ :callbacks => { "should be a valid version requirement" => lambda { |v| Chef::Environment.validate_cookbook_version(v) } }
131
+ }
132
+ })
133
+ @cookbook_versions[cookbook] = version
134
+ end
135
+
136
+ def to_hash
137
+ result = {
138
+ "name" => @name,
139
+ "description" => @description,
140
+ "cookbook_versions" => @cookbook_versions,
141
+ "json_class" => self.class.name,
142
+ "chef_type" => "environment",
143
+ "attributes" => @attributes
144
+ }
145
+ result["_rev"] = couchdb_rev if couchdb_rev
146
+ result
147
+ end
148
+
149
+ def to_json(*a)
150
+ to_hash.to_json(*a)
151
+ end
152
+
153
+ def update_from!(o)
154
+ description(o.description)
155
+ cookbook_versions(o.cookbook_versions)
156
+ attributes(o.attributes)
157
+ self
158
+ end
159
+
160
+ def update_from_params(params)
161
+ # reset because everything we need will be in the params, this is necessary because certain constraints
162
+ # may have been removed in the params and need to be removed from cookbook_versions as well.
163
+ bkup_cb_versions = cookbook_versions
164
+ cookbook_versions(Hash.new)
165
+ valid = true
166
+
167
+ begin
168
+ name(params[:name])
169
+ rescue Chef::Exceptions::ValidationFailed => e
170
+ invalid_fields[:name] = e.message
171
+ valid = false
172
+ end
173
+ description(params[:description])
174
+
175
+ unless params[:cookbook_version].nil?
176
+ params[:cookbook_version].each do |index, cookbook_constraint_spec|
177
+ unless (cookbook_constraint_spec.nil? || cookbook_constraint_spec.size == 0)
178
+ valid = valid && update_cookbook_constraint_from_param(index, cookbook_constraint_spec)
179
+ end
180
+ end
181
+ end
182
+
183
+ unless params[:attributes].nil? || params[:attributes].size == 0
184
+ attributes(Chef::JSONCompat.from_json(params[:attributes]))
185
+ end
186
+
187
+ valid = validate_required_attrs_present && valid
188
+ cookbook_versions(bkup_cb_versions) unless valid # restore the old cookbook_versions if valid is false
189
+ valid
190
+ end
191
+
192
+ def update_cookbook_constraint_from_param(index, cookbook_constraint_spec)
193
+ valid = true
194
+ md = cookbook_constraint_spec.match(COMBINED_COOKBOOK_CONSTRAINT)
195
+ if md.nil? || md[2].nil?
196
+ valid = false
197
+ add_cookbook_constraint_error(index, cookbook_constraint_spec)
198
+ elsif self.class.validate_cookbook_version(md[2])
199
+ cookbook_versions[md[1]] = md[2]
200
+ else
201
+ valid = false
202
+ add_cookbook_constraint_error(index, cookbook_constraint_spec)
203
+ end
204
+ valid
205
+ end
206
+
207
+ def add_cookbook_constraint_error(index, cookbook_constraint_spec)
208
+ invalid_fields[:cookbook_version] ||= {}
209
+ invalid_fields[:cookbook_version][index] = "#{cookbook_constraint_spec} is not a valid cookbook constraint"
210
+ end
211
+
212
+ def invalid_fields
213
+ @invalid_fields ||= {}
214
+ end
215
+
216
+ def validate_required_attrs_present
217
+ if name.nil? || name.size == 0
218
+ invalid_fields[:name] ||= "name cannot be empty"
219
+ false
220
+ else
221
+ true
222
+ end
223
+ end
224
+
225
+
226
+ def self.json_create(o)
227
+ environment = new
228
+ environment.name(o["name"])
229
+ environment.description(o["description"])
230
+ environment.cookbook_versions(o["cookbook_versions"])
231
+ environment.attributes(o["attributes"])
232
+ environment.couchdb_rev = o["_rev"] if o.has_key?("_rev")
233
+ environment.couchdb_id = o["_id"] if o.has_key?("_id")
234
+ environment
235
+ end
236
+
237
+ def self.cdb_list(inflate=false, couchdb=nil)
238
+ es = (couchdb || Chef::CouchDB.new).list("environments", inflate)
239
+ lookup = (inflate ? "value" : "key")
240
+ es["rows"].collect { |e| e[lookup] }
241
+ end
242
+
243
+ def self.list(inflate=false)
244
+ if inflate
245
+ # TODO: index the environments and use search to inflate - don't inflate for now :(
246
+ chef_server_rest.get_rest("environments")
247
+ else
248
+ chef_server_rest.get_rest("environments")
249
+ end
250
+ end
251
+
252
+ def self.cdb_load(name, couchdb=nil)
253
+ (couchdb || Chef::CouchDB.new).load("environment", name)
254
+ end
255
+
256
+ def self.load(name)
257
+ chef_server_rest.get_rest("environments/#{name}")
258
+ end
259
+
260
+ def self.exists?(name, couchdb)
261
+ begin
262
+ self.cdb_load(name, couchdb)
263
+ rescue Chef::Exceptions::CouchDBNotFound
264
+ nil
265
+ end
266
+ end
267
+
268
+ def cdb_destroy
269
+ couchdb.delete("environment", @name, couchdb_rev)
270
+ end
271
+
272
+ def destroy
273
+ chef_server_rest.delete_rest("environments/#{@name}")
274
+ end
275
+
276
+ def cdb_save
277
+ self.couchdb_rev = couchdb.store("environment", @name, self)["rev"]
278
+ end
279
+
280
+ def save
281
+ begin
282
+ chef_server_rest.put_rest("environments/#{@name}", self)
283
+ rescue Net::HTTPServerException => e
284
+ raise e unless e.response.code == "404"
285
+ chef_server_rest.post_rest("environments", self)
286
+ end
287
+ self
288
+ end
289
+
290
+ def create
291
+ chef_server_rest.post_rest("environments", 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("environments", DESIGN_DOCUMENT)
298
+ end
299
+
300
+ # Loads the set of Chef::CookbookVersion objects available to a given environment
301
+ # === Returns
302
+ # Hash
303
+ # i.e.
304
+ # {
305
+ # "cookbook_name" => [ Chef::CookbookVersion ... ] ## the array of CookbookVersions is sorted highest to lowest
306
+ # }
307
+ #
308
+ # There will be a key for every cookbook. If no CookbookVersions
309
+ # are available for the specified environment the value will be an
310
+ # empty list.
311
+ #
312
+ def self.cdb_load_filtered_cookbook_versions(name, couchdb=nil)
313
+ version_constraints = cdb_load(name, couchdb).cookbook_versions.inject({}) {|res, (k,v)| res[k] = Chef::VersionConstraint.new(v); res}
314
+
315
+ # inject all cookbooks into the hash while filtering out restricted versions, then sort the individual arrays
316
+ cookbook_list = Chef::CookbookVersion.cdb_list(true, couchdb)
317
+
318
+ filtered_list = cookbook_list.inject({}) do |res, cookbook|
319
+ # FIXME: should cookbook.version return a Chef::Version?
320
+ version = Chef::Version.new(cookbook.version)
321
+ requirement_satisfied = version_constraints.has_key?(cookbook.name) ? version_constraints[cookbook.name].include?(version) : true
322
+ # we want a key for every cookbook, even if no versions are available
323
+ res[cookbook.name] ||= []
324
+ res[cookbook.name] << cookbook if requirement_satisfied
325
+ res
326
+ end
327
+
328
+ sorted_list = filtered_list.inject({}) do |res, (cookbook_name, versions)|
329
+ res[cookbook_name] = versions.sort.reverse
330
+ res
331
+ end
332
+
333
+ sorted_list
334
+ end
335
+
336
+ def self.cdb_load_filtered_recipe_list(name, couchdb=nil)
337
+ cdb_load_filtered_cookbook_versions(name, couchdb).map do |cb_name, cb|
338
+ cb.first.recipe_filenames_by_name.keys.map do |recipe|
339
+ case recipe
340
+ when DEFAULT
341
+ cb_name
342
+ else
343
+ "#{cb_name}::#{recipe}"
344
+ end
345
+ end
346
+ end.flatten
347
+ end
348
+
349
+ def self.load_filtered_recipe_list(environment)
350
+ chef_server_rest.get_rest("environments/#{environment}/recipes")
351
+ end
352
+
353
+ def to_s
354
+ @name
355
+ end
356
+
357
+ def self.validate_cookbook_versions(cv)
358
+ return false unless cv.kind_of?(Hash)
359
+ cv.each do |cookbook, version|
360
+ return false unless Chef::Environment.validate_cookbook_version(version)
361
+ end
362
+ true
363
+ end
364
+
365
+ def self.validate_cookbook_version(version)
366
+ begin
367
+ Chef::VersionConstraint.new version
368
+ true
369
+ rescue ArgumentError
370
+ false
371
+ end
372
+ end
373
+
374
+ def self.create_default_environment(couchdb=nil)
375
+ couchdb = couchdb || Chef::CouchDB.new
376
+ begin
377
+ Chef::Environment.cdb_load('_default', couchdb)
378
+ rescue Chef::Exceptions::CouchDBNotFound
379
+ env = Chef::Environment.new(couchdb)
380
+ env.name '_default'
381
+ env.description 'The default Chef environment'
382
+ env.cdb_save
383
+ end
384
+ end
385
+ end
386
+ end