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,163 @@
1
+ #
2
+ # Author:: Tim Hinderliter (<tim@opscode.com>)
3
+ # Copyright:: Copyright (c) 2011 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
+ require 'dep_selector'
19
+
20
+ class Chef
21
+ module CookbookVersionSelector
22
+ # This method replaces verbiage from DepSelector messages with
23
+ # Chef-domain-specific verbiage, such as replacing package with
24
+ # cookbook.
25
+ #
26
+ # TODO [cw, 2011/2/25]: this is a near-term hack. In the long run,
27
+ # we'll do this better.
28
+ def self.filter_dep_selector_message(message)
29
+ m = message
30
+ m.gsub!("Package", "Cookbook")
31
+ m.gsub!("package", "cookbook")
32
+ m.gsub!("Solution constraint", "Run list item")
33
+ m.gsub!("solution constraint", "run list item")
34
+ m
35
+ end
36
+
37
+ # all_cookbooks - a hash mapping cookbook names to an array of
38
+ # available CookbookVersions.
39
+ #
40
+ # Creates a DependencyGraph from CookbookVersion objects
41
+ def self.create_dependency_graph_from_cookbooks(all_cookbooks)
42
+ dep_graph = DepSelector::DependencyGraph.new
43
+
44
+ all_cookbooks.each do |cb_name, cb_versions|
45
+ cb_versions.each do |cb_version|
46
+ cb_version_deps = cb_version.metadata.dependencies
47
+ # TODO [cw. 2011/2/10]: CookbookVersion#version returns a
48
+ # String even though we're storing as a DepSelector::Version
49
+ # object underneath. This should be changed so that we
50
+ # return the object and handle proper serialization and
51
+ # de-serialization. For now, I'm just going to create a
52
+ # Version object from the String representation.
53
+ pv = dep_graph.package(cb_name).add_version(Chef::Version.new(cb_version.version))
54
+ cb_version_deps.each_pair do |dep_name, constraint_str|
55
+ # if the dependency is specified as cookbook::recipe,
56
+ # extract the cookbook component
57
+ dep_cb_name = dep_name.split("::").first
58
+ constraint = Chef::VersionConstraint.new(constraint_str)
59
+ pv.dependencies << DepSelector::Dependency.new(dep_graph.package(dep_cb_name), constraint)
60
+ end
61
+ end
62
+ end
63
+
64
+ dep_graph
65
+ end
66
+
67
+ # Return a hash mapping cookbook names to a CookbookVersion
68
+ # object. If there is no solution that satisfies the constraints,
69
+ # the first run list item that caused unsatisfiability is
70
+ # returned.
71
+ #
72
+ # This is the final version-resolved list of cookbooks for the
73
+ # RunList.
74
+ #
75
+ # all_cookbooks - a hash mapping cookbook names to an array of
76
+ # available CookbookVersions.
77
+ #
78
+ # recipe_constraints - an array of hashes describing the expanded
79
+ # run list. Each element is a hash containing keys :name and
80
+ # :version_constraint. The :name component is either the
81
+ # fully-qualified recipe name (e.g. "cookbook1::non_default_recipe")
82
+ # or just a cookbook name, indicating the default recipe is to be
83
+ # run (e.g. "cookbook1").
84
+ def self.constrain(all_cookbooks, recipe_constraints)
85
+ dep_graph = create_dependency_graph_from_cookbooks(all_cookbooks)
86
+
87
+ # extract cookbook names from (possibly) fully-qualified recipe names
88
+ cookbook_constraints = recipe_constraints.map do |recipe_spec|
89
+ cookbook_name = (recipe_spec[:name][/^(.+)::/, 1] || recipe_spec[:name])
90
+ DepSelector::SolutionConstraint.new(dep_graph.package(cookbook_name),
91
+ recipe_spec[:version_constraint])
92
+ end
93
+
94
+ # Pass in the list of all available cookbooks (packages) so that
95
+ # DepSelector can distinguish between "no version available for
96
+ # cookbook X" and "no such cookbook X" when an environment
97
+ # filters out all versions for a given cookbook.
98
+ all_packages = all_cookbooks.inject([]) do |acc, (cookbook_name, cookbook_versions)|
99
+ acc << dep_graph.package(cookbook_name)
100
+ acc
101
+ end
102
+
103
+ # find a valid assignment of CoookbookVersions. If no valid
104
+ # assignment exists, indicate which run_list_item causes the
105
+ # unsatisfiability and try to hint at what might be wrong.
106
+ soln =
107
+ begin
108
+ DepSelector::Selector.new(dep_graph).find_solution(cookbook_constraints, all_packages)
109
+ rescue DepSelector::Exceptions::InvalidSolutionConstraints => e
110
+ non_existent_cookbooks = e.non_existent_packages.map {|constraint| constraint.package.name}
111
+ cookbooks_with_no_matching_versions = e.constrained_to_no_versions.map {|constraint| constraint.package.name}
112
+
113
+ # Spend a whole lot of effort for pluralizing and
114
+ # prettifying the message.
115
+ message = ""
116
+ if non_existent_cookbooks.length > 0
117
+ message += "no such " + (non_existent_cookbooks.length > 1 ? "cookbooks" : "cookbook")
118
+ message += " #{non_existent_cookbooks.join(", ")}"
119
+ end
120
+
121
+ if cookbooks_with_no_matching_versions.length > 0
122
+ if message.length > 0
123
+ message += "; "
124
+ end
125
+
126
+ message += "no versions match the constraints on " + (cookbooks_with_no_matching_versions.length > 1 ? "cookbooks" : "cookbook")
127
+ message += " #{cookbooks_with_no_matching_versions.join(", ")}"
128
+ end
129
+
130
+ message = "Run list contains invalid items: #{message}."
131
+
132
+ raise Chef::Exceptions::CookbookVersionSelection::InvalidRunListItems.new(message, non_existent_cookbooks, cookbooks_with_no_matching_versions)
133
+ rescue DepSelector::Exceptions::NoSolutionExists => e
134
+ raise Chef::Exceptions::CookbookVersionSelection::UnsatisfiableRunListItem.new(filter_dep_selector_message(e.message), e.unsatisfiable_solution_constraint, e.disabled_non_existent_packages, e.disabled_most_constrained_packages)
135
+ end
136
+
137
+
138
+ # map assignment back to CookbookVersion objects
139
+ selected_cookbooks = {}
140
+ soln.each_pair do |cb_name, cb_version|
141
+ # TODO [cw, 2011/2/10]: related to the TODO in
142
+ # create_dependency_graph_from_cookbooks, cbv.version
143
+ # currently returns a String, so we must compare to
144
+ # cb_version.to_s, since it's a for-real Version object.
145
+ selected_cookbooks[cb_name] = all_cookbooks[cb_name].find{|cbv| cbv.version == cb_version.to_s}
146
+ end
147
+ selected_cookbooks
148
+ end
149
+
150
+ # Expands the run_list, constrained to the environment's CookbookVersion
151
+ # constraints.
152
+ #
153
+ # Returns:
154
+ # Hash of: name to CookbookVersion
155
+ def self.expand_to_cookbook_versions(run_list, environment, couchdb=nil)
156
+ # expand any roles in this run_list.
157
+ expanded_run_list = run_list.expand(environment, 'couchdb', :couchdb => couchdb).recipes.with_version_constraints
158
+
159
+ cookbooks_for_environment = Chef::Environment.cdb_load_filtered_cookbook_versions(environment, couchdb)
160
+ constrain(cookbooks_for_environment, expanded_run_list)
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,247 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Christopher Brown (<cb@opscode.com>)
4
+ # Copyright:: Copyright (c) 2008 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
+ require 'chef/mixin/params_validate'
20
+ require 'chef/config'
21
+ require 'chef/rest'
22
+ require 'chef/log'
23
+ require 'digest/sha2'
24
+ require 'chef/json_compat'
25
+
26
+ # We want to fail on create if uuidtools isn't installed
27
+ begin
28
+ require 'uuidtools'
29
+ rescue LoadError
30
+ end
31
+
32
+ class Chef
33
+ class CouchDB
34
+ include Chef::Mixin::ParamsValidate
35
+
36
+ def initialize(url=nil, db=Chef::Config[:couchdb_database])
37
+ url ||= Chef::Config[:couchdb_url]
38
+ @db = db
39
+ @rest = Chef::REST.new(url, nil, nil)
40
+ end
41
+
42
+ def couchdb_database(args=nil)
43
+ @db = args || @db
44
+ end
45
+
46
+ def create_id_map
47
+ create_design_document(
48
+ "id_map",
49
+ {
50
+ "version" => 1,
51
+ "language" => "javascript",
52
+ "views" => {
53
+ "name_to_id" => {
54
+ "map" => <<-EOJS
55
+ function(doc) {
56
+ emit([ doc.chef_type, doc.name], doc._id);
57
+ }
58
+ EOJS
59
+ },
60
+ "id_to_name" => {
61
+ "map" => <<-EOJS
62
+ function(doc) {
63
+ emit(doc._id, [ doc.chef_type, doc.name ]);
64
+ }
65
+ EOJS
66
+ }
67
+ }
68
+ }
69
+ )
70
+ end
71
+
72
+ def create_db
73
+ @database_list = @rest.get_rest("_all_dbs")
74
+ unless @database_list.detect { |db| db == couchdb_database }
75
+ response = @rest.put_rest(couchdb_database, Hash.new)
76
+ end
77
+ couchdb_database
78
+ end
79
+
80
+ def create_design_document(name, data)
81
+ create_db
82
+ to_update = true
83
+ begin
84
+ old_doc = @rest.get_rest("#{couchdb_database}/_design/#{name}")
85
+ if data["version"] != old_doc["version"]
86
+ data["_rev"] = old_doc["_rev"]
87
+ Chef::Log.debug("Updating #{name} views")
88
+ else
89
+ to_update = false
90
+ end
91
+ rescue
92
+ Chef::Log.debug("Creating #{name} views for the first time because: #{$!}")
93
+ end
94
+ if to_update
95
+ @rest.put_rest("#{couchdb_database}/_design%2F#{name}", data)
96
+ end
97
+ true
98
+ end
99
+
100
+ # Save the object to Couch. Add to index if the object supports it.
101
+ def store(obj_type, name, object)
102
+ validate(
103
+ {
104
+ :obj_type => obj_type,
105
+ :name => name,
106
+ :object => object,
107
+ },
108
+ {
109
+ :object => { :respond_to => :to_json },
110
+ }
111
+ )
112
+ rows = get_view("id_map", "name_to_id", :key => [ obj_type, name ])["rows"]
113
+ uuid = rows.empty? ? UUIDTools::UUID.random_create.to_s : rows.first.fetch("id")
114
+
115
+ db_put_response = @rest.put_rest("#{couchdb_database}/#{uuid}", object)
116
+
117
+ if object.respond_to?(:add_to_index)
118
+ Chef::Log.info("Sending #{obj_type}(#{uuid}) to the index queue for addition.")
119
+ object.add_to_index(:database => couchdb_database, :id => uuid, :type => obj_type)
120
+ end
121
+
122
+ db_put_response
123
+ end
124
+
125
+ def load(obj_type, name)
126
+ validate(
127
+ {
128
+ :obj_type => obj_type,
129
+ :name => name,
130
+ },
131
+ {
132
+ :obj_type => { :kind_of => String },
133
+ :name => { :kind_of => String },
134
+ }
135
+ )
136
+ doc = find_by_name(obj_type, name)
137
+ doc.couchdb = self if doc.respond_to?(:couchdb)
138
+ doc
139
+ end
140
+
141
+ def delete(obj_type, name, rev=nil)
142
+ validate(
143
+ {
144
+ :obj_type => obj_type,
145
+ :name => name,
146
+ },
147
+ {
148
+ :obj_type => { :kind_of => String },
149
+ :name => { :kind_of => String },
150
+ }
151
+ )
152
+ del_id = nil
153
+ object, uuid = find_by_name(obj_type, name, true)
154
+ unless rev
155
+ if object.respond_to?(:couchdb_rev)
156
+ rev = object.couchdb_rev
157
+ else
158
+ rev = object['_rev']
159
+ end
160
+ end
161
+ response = @rest.delete_rest("#{couchdb_database}/#{uuid}?rev=#{rev}")
162
+ response.couchdb = self if response.respond_to?(:couchdb=)
163
+
164
+ if object.respond_to?(:delete_from_index)
165
+ Chef::Log.info("Sending #{obj_type}(#{uuid}) to the index queue for deletion..")
166
+ object.delete_from_index(:database => couchdb_database, :id => uuid, :type => obj_type)
167
+ end
168
+
169
+ response
170
+ end
171
+
172
+ def list(view, inflate=false)
173
+ validate(
174
+ {
175
+ :view => view,
176
+ },
177
+ {
178
+ :view => { :kind_of => String }
179
+ }
180
+ )
181
+ if inflate
182
+ r = @rest.get_rest(view_uri(view, "all"))
183
+ r["rows"].each { |i| i["value"].couchdb = self if i["value"].respond_to?(:couchdb=) }
184
+ r
185
+ else
186
+ r = @rest.get_rest(view_uri(view, "all_id"))
187
+ end
188
+ r
189
+ end
190
+
191
+ def has_key?(obj_type, name)
192
+ validate(
193
+ {
194
+ :obj_type => obj_type,
195
+ :name => name,
196
+ },
197
+ {
198
+ :obj_type => { :kind_of => String },
199
+ :name => { :kind_of => String },
200
+ }
201
+ )
202
+ begin
203
+ find_by_name(obj_type, name)
204
+ true
205
+ rescue
206
+ false
207
+ end
208
+ end
209
+
210
+ def find_by_name(obj_type, name, with_id=false)
211
+ r = get_view("id_map", "name_to_id", :key => [ obj_type, name ], :include_docs => true)
212
+ if r["rows"].length == 0
213
+ raise Chef::Exceptions::CouchDBNotFound, "Cannot find #{obj_type} #{name} in CouchDB!"
214
+ end
215
+ if with_id
216
+ [ r["rows"][0]["doc"], r["rows"][0]["id"] ]
217
+ else
218
+ r["rows"][0]["doc"]
219
+ end
220
+ end
221
+
222
+ def get_view(design, view, options={})
223
+ view_string = view_uri(design, view)
224
+ view_string << "?" if options.length != 0
225
+ view_string << options.map { |k,v| "#{k}=#{URI.escape(v.to_json)}"}.join('&')
226
+ @rest.get_rest(view_string)
227
+ end
228
+
229
+ def bulk_get(*to_fetch)
230
+ response = @rest.post_rest("#{couchdb_database}/_all_docs?include_docs=true", { "keys" => to_fetch.flatten })
231
+ response["rows"].collect { |r| r["doc"] }
232
+ end
233
+
234
+ def view_uri(design, view)
235
+ "#{couchdb_database}/_design/#{design}/_view/#{view}"
236
+ end
237
+
238
+ def server_stats
239
+ @rest.get_rest('/')
240
+ end
241
+
242
+ def db_stats
243
+ @rest.get_rest("/#{@db}")
244
+ end
245
+
246
+ end
247
+ end
@@ -0,0 +1,172 @@
1
+ #
2
+ # Author:: AJ Christensen (<aj@junglist.gen.nz>)
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
+ # I love you Merb (lib/merb-core/server.rb)
19
+
20
+ require 'chef/config'
21
+ require 'etc'
22
+
23
+ class Chef
24
+ class Daemon
25
+ class << self
26
+ attr_accessor :name
27
+
28
+ # Daemonize the current process, managing pidfiles and process uid/gid
29
+ #
30
+ # === Parameters
31
+ # name<String>:: The name to be used for the pid file
32
+ #
33
+ def daemonize(name)
34
+ @name = name
35
+ pid = pid_from_file
36
+ unless running?
37
+ remove_pid_file()
38
+ Chef::Log.info("Daemonizing..")
39
+ begin
40
+ exit if fork
41
+ Process.setsid
42
+ exit if fork
43
+ Chef::Log.info("Forked, in #{Process.pid}. Priveleges: #{Process.euid} #{Process.egid}")
44
+ File.umask Chef::Config[:umask]
45
+ $stdin.reopen("/dev/null")
46
+ $stdout.reopen("/dev/null", "a")
47
+ $stderr.reopen($stdout)
48
+ save_pid_file
49
+ at_exit { remove_pid_file }
50
+ rescue NotImplementedError => e
51
+ Chef::Application.fatal!("There is no fork: #{e.message}")
52
+ end
53
+ else
54
+ Chef::Application.fatal!("Chef is already running pid #{pid}")
55
+ end
56
+ end
57
+
58
+ # Check if Chef is running based on the pid_file
59
+ # ==== Returns
60
+ # Boolean::
61
+ # True if Chef is running
62
+ # False if Chef is not running
63
+ #
64
+ def running?
65
+ if pid_from_file.nil?
66
+ false
67
+ else
68
+ Process.kill(0, pid_from_file)
69
+ true
70
+ end
71
+ rescue Errno::ESRCH, Errno::ENOENT
72
+ false
73
+ rescue Errno::EACCES => e
74
+ Chef::Application.fatal!("You don't have access to the PID file at #{pid_file}: #{e.message}")
75
+ end
76
+
77
+ # Gets the pid file for @name
78
+ # ==== Returns
79
+ # String::
80
+ # Location of the pid file for @name
81
+ def pid_file
82
+ Chef::Config[:pid_file] or "/tmp/#{@name}.pid"
83
+ end
84
+
85
+ # Suck the pid out of pid_file
86
+ # ==== Returns
87
+ # Integer::
88
+ # The PID from pid_file
89
+ # nil::
90
+ # Returned if the pid_file does not exist.
91
+ #
92
+ def pid_from_file
93
+ File.read(pid_file).chomp.to_i
94
+ rescue Errno::ENOENT, Errno::EACCES
95
+ nil
96
+ end
97
+
98
+ # Store the PID on the filesystem
99
+ # This uses the Chef::Config[:pid_file] option, or "/tmp/name.pid" otherwise
100
+ #
101
+ def save_pid_file
102
+ file = pid_file
103
+ begin
104
+ FileUtils.mkdir_p(File.dirname(file))
105
+ rescue Errno::EACCES => e
106
+ Chef::Application.fatal!("Failed store pid in #{File.dirname(file)}, permission denied: #{e.message}")
107
+ end
108
+
109
+ begin
110
+ File.open(file, "w") { |f| f.write(Process.pid.to_s) }
111
+ rescue Errno::EACCES => e
112
+ Chef::Application.fatal!("Couldn't write to pidfile #{file}, permission denied: #{e.message}")
113
+ end
114
+ end
115
+
116
+ # Delete the PID from the filesystem
117
+ def remove_pid_file
118
+ FileUtils.rm(pid_file) if File.exists?(pid_file)
119
+ end
120
+
121
+ # Change process user/group to those specified in Chef::Config
122
+ #
123
+ def change_privilege
124
+ Dir.chdir("/")
125
+
126
+ if Chef::Config[:user] and Chef::Config[:group]
127
+ Chef::Log.info("About to change privilege to #{Chef::Config[:user]}:#{Chef::Config[:group]}")
128
+ _change_privilege(Chef::Config[:user], Chef::Config[:group])
129
+ elsif Chef::Config[:user]
130
+ Chef::Log.info("About to change privilege to #{Chef::Config[:user]}")
131
+ _change_privilege(Chef::Config[:user])
132
+ end
133
+ end
134
+
135
+ # Change privileges of the process to be the specified user and group
136
+ #
137
+ # ==== Parameters
138
+ # user<String>:: The user to change the process to.
139
+ # group<String>:: The group to change the process to.
140
+ #
141
+ # ==== Alternatives
142
+ # If group is left out, the user will be used (changing to user:user)
143
+ #
144
+ def _change_privilege(user, group=user)
145
+ uid, gid = Process.euid, Process.egid
146
+
147
+ begin
148
+ target_uid = Etc.getpwnam(user).uid
149
+ rescue ArgumentError => e
150
+ Chef::Application.fatal!("Failed to get UID for user #{user}, does it exist? #{e.message}")
151
+ return false
152
+ end
153
+
154
+ begin
155
+ target_gid = Etc.getgrnam(group).gid
156
+ rescue ArgumentError => e
157
+ Chef::Application.fatal!("Failed to get GID for group #{group}, does it exist? #{e.message}")
158
+ return false
159
+ end
160
+
161
+ if (uid != target_uid) or (gid != target_gid)
162
+ Process.initgroups(user, target_gid)
163
+ Process::GID.change_privilege(target_gid)
164
+ Process::UID.change_privilege(target_uid)
165
+ end
166
+ true
167
+ rescue Errno::EPERM => e
168
+ Chef::Application.fatal!("Permission denied when trying to change #{uid}:#{gid} to #{target_uid}:#{target_gid}. #{e.message}")
169
+ end
170
+ end
171
+ end
172
+ end