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,4 @@
1
+ require 'chef/application/agent'
2
+ require 'chef/application/client'
3
+ require 'chef/application/knife'
4
+ require 'chef/application/solo'
@@ -0,0 +1,194 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Christopher Brown (<cb@opscode.com>)
4
+ # Copyright:: Copyright (c) 2009 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/log'
21
+ require 'chef/config'
22
+ require 'chef/api_client'
23
+ require 'openssl'
24
+ require 'fileutils'
25
+
26
+ class Chef
27
+ class Certificate
28
+ class << self
29
+
30
+ # Generates a new CA Certificate and Key, and writes them out to
31
+ # Chef::Config[:signing_ca_cert] and Chef::Config[:signing_ca_key].
32
+ def generate_signing_ca
33
+ ca_cert_file = Chef::Config[:signing_ca_cert]
34
+ ca_keypair_file = Chef::Config[:signing_ca_key]
35
+
36
+ unless File.exists?(ca_cert_file) && File.exists?(ca_keypair_file)
37
+ Chef::Log.info("Creating new signing certificate")
38
+
39
+ [ ca_cert_file, ca_keypair_file ].each do |f|
40
+ ca_basedir = File.dirname(f)
41
+ FileUtils.mkdir_p ca_basedir
42
+ end
43
+
44
+ keypair = OpenSSL::PKey::RSA.generate(1024)
45
+
46
+ ca_cert = OpenSSL::X509::Certificate.new
47
+ ca_cert.version = 3
48
+ ca_cert.serial = 1
49
+ info = [
50
+ ["C", Chef::Config[:signing_ca_country]],
51
+ ["ST", Chef::Config[:signing_ca_state]],
52
+ ["L", Chef::Config[:signing_ca_location]],
53
+ ["O", Chef::Config[:signing_ca_org]],
54
+ ["OU", "Certificate Service"],
55
+ ["CN", "#{Chef::Config[:signing_ca_domain]}/emailAddress=#{Chef::Config[:signing_ca_email]}"]
56
+ ]
57
+ ca_cert.subject = ca_cert.issuer = OpenSSL::X509::Name.new(info)
58
+ ca_cert.not_before = Time.now
59
+ ca_cert.not_after = Time.now + 10 * 365 * 24 * 60 * 60 # 10 years
60
+ ca_cert.public_key = keypair.public_key
61
+
62
+ ef = OpenSSL::X509::ExtensionFactory.new
63
+ ef.subject_certificate = ca_cert
64
+ ef.issuer_certificate = ca_cert
65
+ ca_cert.extensions = [
66
+ ef.create_extension("basicConstraints", "CA:TRUE", true),
67
+ ef.create_extension("subjectKeyIdentifier", "hash"),
68
+ ef.create_extension("keyUsage", "cRLSign,keyCertSign", true),
69
+ ]
70
+ ca_cert.add_extension ef.create_extension("authorityKeyIdentifier", "keyid:always,issuer:always")
71
+ ca_cert.sign keypair, OpenSSL::Digest::SHA1.new
72
+
73
+ File.open(ca_cert_file, "w") { |f| f.write ca_cert.to_pem }
74
+ File.open(ca_keypair_file, File::WRONLY|File::EXCL|File::CREAT, 0600) { |f| f.write keypair.to_pem }
75
+ if (Chef::Config[:signing_ca_user] && Chef::Config[:signing_ca_group])
76
+ FileUtils.chown(Chef::Config[:signing_ca_user], Chef::Config[:signing_ca_group], ca_keypair_file)
77
+ end
78
+ end
79
+ self
80
+ end
81
+
82
+ # Creates a new key pair, and signs them with the signing certificate
83
+ # and key generated from generate_signing_ca above.
84
+ #
85
+ # @param [String] The common name for the key pair.
86
+ # @param [Optional String] The subject alternative name.
87
+ # @return [Object, Object] The public and private key objects.
88
+ def gen_keypair(common_name, subject_alternative_name = nil)
89
+
90
+ Chef::Log.info("Creating new key pair for #{common_name}")
91
+
92
+ # generate client keypair
93
+ client_keypair = OpenSSL::PKey::RSA.generate(2048)
94
+
95
+ client_cert = OpenSSL::X509::Certificate.new
96
+
97
+ ca_cert = OpenSSL::X509::Certificate.new(File.read(Chef::Config[:signing_ca_cert]))
98
+
99
+ info = [
100
+ ["C", Chef::Config[:signing_ca_country]],
101
+ ["ST", Chef::Config[:signing_ca_state]],
102
+ ["L", Chef::Config[:signing_ca_location]],
103
+ ["O", Chef::Config[:signing_ca_org]],
104
+ ["OU", "Certificate Service"],
105
+ ["CN", common_name ]
106
+ ]
107
+
108
+ client_cert.subject = OpenSSL::X509::Name.new(info)
109
+ client_cert.issuer = ca_cert.subject
110
+ client_cert.not_before = Time.now
111
+ client_cert.not_after = Time.now + 10 * 365 * 24 * 60 * 60 # 10 years
112
+ client_cert.public_key = client_keypair.public_key
113
+ client_cert.serial = 1
114
+ client_cert.version = 3
115
+
116
+ ef = OpenSSL::X509::ExtensionFactory.new
117
+ ef.subject_certificate = client_cert
118
+ ef.issuer_certificate = ca_cert
119
+
120
+ client_cert.extensions = [
121
+ ef.create_extension("basicConstraints", "CA:FALSE", true),
122
+ ef.create_extension("subjectKeyIdentifier", "hash")
123
+ ]
124
+ client_cert.add_extension ef.create_extension("subjectAltName", subject_alternative_name) if subject_alternative_name
125
+
126
+ client_cert.sign(OpenSSL::PKey::RSA.new(File.read(Chef::Config[:signing_ca_key])), OpenSSL::Digest::SHA1.new)
127
+
128
+ return client_cert.public_key, client_keypair
129
+ end
130
+
131
+ def gen_validation_key(name=Chef::Config[:validation_client_name], key_file=Chef::Config[:validation_key], admin=false)
132
+ # Create the validation key
133
+ api_client = Chef::ApiClient.new
134
+ api_client.name(name)
135
+ api_client.admin(admin)
136
+
137
+ begin
138
+ # If both the couch record and file exist, don't do anything. Otherwise,
139
+ # re-generate the validation key.
140
+ Chef::ApiClient.cdb_load(name)
141
+
142
+ # The couch document was loaded successfully if we got to here; if we
143
+ # can't also load the file on the filesystem, we'll regenerate it all.
144
+ File.open(key_file, "r") do |file|
145
+ end
146
+ rescue Chef::Exceptions::CouchDBNotFound
147
+ create_validation_key(api_client, key_file)
148
+ rescue
149
+ if $!.class.name =~ /Errno::/
150
+ Chef::Log.error("Error opening validation key: #{$!} -- destroying and regenerating")
151
+ begin
152
+ api_client.cdb_destroy
153
+ rescue Bunny::ServerDownError => e
154
+ # create_validation_key is gonna fail anyway, so let's just bail out.
155
+ Chef::Log.fatal("Could not de-index (to rabbitmq) previous validation key - rabbitmq is down! Start rabbitmq then restart chef-server to re-generate it")
156
+ raise
157
+ end
158
+
159
+ create_validation_key(api_client, key_file)
160
+ else
161
+ raise
162
+ end
163
+ end
164
+ end
165
+
166
+ private
167
+ def create_validation_key(api_client, key_file)
168
+ Chef::Log.info("Creating validation key...")
169
+
170
+ api_client.create_keys
171
+ begin
172
+ api_client.cdb_save
173
+ rescue Bunny::ServerDownError => e
174
+ # If rabbitmq is down, the client will have been saved in CouchDB,
175
+ # but not in the index.
176
+ Chef::Log.fatal("Could not index (to rabbitmq) validation key - rabbitmq is down! Start rabbitmq then restart chef-server to re-generate it")
177
+
178
+ # re-raise so the error bubbles out and nukes chef-server
179
+ raise e
180
+ end
181
+
182
+ key_dir = File.dirname(key_file)
183
+ FileUtils.mkdir_p(key_dir) unless File.directory?(key_dir)
184
+ File.open(key_file, File::WRONLY|File::CREAT, 0600) do |f|
185
+ f.print(api_client.private_key)
186
+ end
187
+ if (Chef::Config[:signing_ca_user] && Chef::Config[:signing_ca_group])
188
+ FileUtils.chown(Chef::Config[:signing_ca_user], Chef::Config[:signing_ca_group], key_file)
189
+ end
190
+ end
191
+
192
+ end
193
+ end
194
+ end
@@ -0,0 +1,182 @@
1
+ #
2
+ # Author:: Tim Hinderliter (<tim@opscode.com>)
3
+ # Copyright:: Copyright (c) 2010 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ require 'chef/log'
19
+ require 'uuidtools'
20
+
21
+ class Chef
22
+ # == Chef::Checksum
23
+ # Checksum for an individual file; e.g., used for sandbox/cookbook uploading
24
+ # to track which files the system already manages.
25
+ class Checksum
26
+ attr_accessor :checksum, :create_time
27
+ attr_accessor :couchdb_id, :couchdb_rev
28
+
29
+ # When a Checksum commits a sandboxed file to its final home in the checksum
30
+ # repo, this attribute will have the original on-disk path where the file
31
+ # was stored; it will be used if the commit is reverted to restore the sandbox
32
+ # to the pre-commit state.
33
+ attr_reader :original_committed_file_location
34
+
35
+ DESIGN_DOCUMENT = {
36
+ "version" => 1,
37
+ "language" => "javascript",
38
+ "views" => {
39
+ "all" => {
40
+ "map" => <<-EOJS
41
+ function(doc) {
42
+ if (doc.chef_type == "checksum") {
43
+ emit(doc.checksum, doc);
44
+ }
45
+ }
46
+ EOJS
47
+ },
48
+ }
49
+ }
50
+
51
+ # Creates a new Chef::Checksum object.
52
+ # === Arguments
53
+ # checksum::: the MD5 content hash of the file
54
+ # couchdb::: An instance of Chef::CouchDB
55
+ #
56
+ # === Returns
57
+ # object<Chef::Checksum>:: Duh. :)
58
+ def initialize(checksum=nil, couchdb=nil)
59
+ @create_time = Time.now.iso8601
60
+ @checksum = checksum
61
+ @original_committed_file_location = nil
62
+ end
63
+
64
+ def to_json(*a)
65
+ result = {
66
+ :checksum => checksum,
67
+ :create_time => create_time,
68
+ :json_class => self.class.name,
69
+ :chef_type => 'checksum',
70
+
71
+ # For Chef::CouchDB (id_to_name, name_to_id)
72
+ :name => checksum
73
+ }
74
+ result.to_json(*a)
75
+ end
76
+
77
+ def self.json_create(o)
78
+ checksum = new(o['checksum'])
79
+ checksum.create_time = o['create_time']
80
+
81
+ if o.has_key?('_rev')
82
+ checksum.couchdb_rev = o["_rev"]
83
+ o.delete("_rev")
84
+ end
85
+ if o.has_key?("_id")
86
+ checksum.couchdb_id = o["_id"]
87
+ o.delete("_id")
88
+ end
89
+ checksum
90
+ end
91
+
92
+
93
+ ##
94
+ # On-Disk Checksum File Repo (Chef Server API)
95
+ ##
96
+
97
+ def file_location
98
+ File.join(checksum_repo_directory, checksum)
99
+ end
100
+
101
+ def checksum_repo_directory
102
+ File.join(Chef::Config.checksum_path, checksum[0..1])
103
+ end
104
+
105
+ # Moves the given +sandbox_file+ into the checksum repo using the path
106
+ # given by +file_location+ and saves the Checksum to the database
107
+ def commit_sandbox_file(sandbox_file)
108
+ @original_committed_file_location = sandbox_file
109
+ Chef::Log.info("commiting sandbox file: move #{sandbox_file} to #{file_location}")
110
+ FileUtils.mkdir_p(checksum_repo_directory)
111
+ File.rename(sandbox_file, file_location)
112
+ cdb_save
113
+ end
114
+
115
+ # Moves the checksum file back to its pre-commit location and deletes
116
+ # the checksum object from the database, effectively undoing +commit_sandbox_file+.
117
+ # Raises Chef::Exceptions::IllegalChecksumRevert if the original file location
118
+ # is unknown, which is will be the case if commit_sandbox_file was not
119
+ # previously called
120
+ def revert_sandbox_file_commit
121
+ unless original_committed_file_location
122
+ raise Chef::Exceptions::IllegalChecksumRevert, "Checksum #{self.inspect} cannot be reverted because the original sandbox file location is not known"
123
+ end
124
+
125
+ Chef::Log.warn("reverting sandbox file commit: moving #{file_location} back to #{original_committed_file_location}")
126
+ File.rename(file_location, original_committed_file_location)
127
+ cdb_destroy
128
+ end
129
+
130
+ # Removes the on-disk file backing this checksum object, then removes it
131
+ # from the database
132
+ def purge
133
+ purge_file
134
+ cdb_destroy
135
+ end
136
+
137
+ ##
138
+ # Couchdb
139
+ ##
140
+
141
+ def self.create_design_document(couchdb=nil)
142
+ (couchdb || Chef::CouchDB.new).create_design_document("checksums", DESIGN_DOCUMENT)
143
+ end
144
+
145
+ def self.cdb_list(inflate=false, couchdb=nil)
146
+ rs = (couchdb || Chef::CouchDB.new).list("checksums", inflate)
147
+ lookup = (inflate ? "value" : "key")
148
+ rs["rows"].collect { |r| r[lookup] }
149
+ end
150
+
151
+ def self.cdb_all_checksums(couchdb = nil)
152
+ rs = (couchdb || Chef::CouchDB.new).list("checksums", true)
153
+ rs["rows"].inject({}) { |hash_result, r| hash_result[r['key']] = 1; hash_result }
154
+ end
155
+
156
+ def self.cdb_load(checksum, couchdb=nil)
157
+ # Probably want to look for a view here at some point
158
+ (couchdb || Chef::CouchDB.new).load("checksum", checksum)
159
+ end
160
+
161
+ def cdb_destroy(couchdb=nil)
162
+ (couchdb || Chef::CouchDB.new).delete("checksum", checksum, @couchdb_rev)
163
+ end
164
+
165
+ def cdb_save(couchdb=nil)
166
+ @couchdb_rev = (couchdb || Chef::CouchDB.new).store("checksum", checksum, self)["rev"]
167
+ end
168
+
169
+
170
+ private
171
+
172
+ # Deletes the file backing this checksum from the on-disk repo.
173
+ # Purging the checksums is how users can get back to a valid state if
174
+ # they've deleted files, so we silently swallow Errno::ENOENT here.
175
+ def purge_file
176
+ FileUtils.rm(file_location)
177
+ rescue Errno::ENOENT
178
+ true
179
+ end
180
+
181
+ end
182
+ end
@@ -0,0 +1,189 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Daniel DeLeo (<dan@kallistec.com>)
4
+ # Copyright:: Copyright (c) 2009 Opscode, Inc.
5
+ # Copyright:: Copyright (c) 2009 Daniel DeLeo
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 'set'
22
+ require 'fileutils'
23
+ require 'chef/log'
24
+ require 'chef/config'
25
+ require 'chef/client'
26
+ require 'chef/mixin/convert_to_class_name'
27
+ require 'singleton'
28
+ require 'moneta'
29
+
30
+ class Chef
31
+ class ChecksumCache
32
+ include Chef::Mixin::ConvertToClassName
33
+ include ::Singleton
34
+
35
+ attr_reader :moneta
36
+
37
+ def initialize(*args)
38
+ self.reset!(*args)
39
+ end
40
+
41
+ def reset!(backend=nil, options=nil)
42
+ backend ||= Chef::Config[:cache_type]
43
+ options ||= Chef::Config[:cache_options]
44
+
45
+ begin
46
+ require "moneta/#{convert_to_snake_case(backend, 'Moneta')}"
47
+ rescue LoadError => e
48
+ Chef::Log.fatal("Could not load Moneta back end #{backend.inspect}")
49
+ raise e
50
+ end
51
+
52
+ @moneta = Moneta.const_get(backend).new(options)
53
+ end
54
+
55
+ def self.reset_cache_validity
56
+ @valid_cached_checksums = nil
57
+ end
58
+
59
+ Chef::Client.when_run_starts do |run_status|
60
+ reset_cache_validity
61
+ end
62
+
63
+ def self.valid_cached_checksums
64
+ @valid_cached_checksums ||= Set.new
65
+ end
66
+
67
+ def self.validate_checksum(checksum_key)
68
+ valid_cached_checksums << checksum_key
69
+ end
70
+
71
+ def self.all_cached_checksums
72
+ all_checksums_with_filenames = {}
73
+
74
+ Dir[File.join(Chef::Config[:cache_options][:path], '*')].each do |cksum_file|
75
+ all_checksums_with_filenames[File.basename(cksum_file)] = cksum_file
76
+ end
77
+ all_checksums_with_filenames
78
+ end
79
+
80
+ def self.cleanup_checksum_cache
81
+ Chef::Log.info("cleaning the checksum cache")
82
+ if (Chef::Config[:cache_type].to_s == "BasicFile")
83
+ all_cached_checksums.each do |cache_key, cksum_cache_file|
84
+ unless valid_cached_checksums.include?(cache_key)
85
+ remove_unused_checksum(cksum_cache_file)
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ Chef::Client.when_run_completes_successfully do |run_status|
92
+ cleanup_checksum_cache
93
+ end
94
+
95
+ def self.remove_unused_checksum(checksum_file)
96
+ Chef::Log.debug("removing unused checksum cache file #{checksum_file}")
97
+ FileUtils.rm(checksum_file)
98
+ end
99
+
100
+ def self.checksum_for_file(*args)
101
+ instance.checksum_for_file(*args)
102
+ end
103
+
104
+ def validate_checksum(*args)
105
+ self.class.validate_checksum(*args)
106
+ end
107
+
108
+ def checksum_for_file(file, key=nil)
109
+ key ||= generate_key(file)
110
+ fstat = File.stat(file)
111
+ lookup_checksum(key, fstat) || generate_checksum(key, file, fstat)
112
+ end
113
+
114
+ def lookup_checksum(key, fstat)
115
+ cached = fetch(key)
116
+ if cached && file_unchanged?(cached, fstat)
117
+ validate_checksum(key)
118
+ cached["checksum"]
119
+ else
120
+ nil
121
+ end
122
+ end
123
+
124
+ def generate_checksum(key, file, fstat)
125
+ checksum = checksum_file(file, Digest::SHA256.new)
126
+ moneta.store(key, {"mtime" => fstat.mtime.to_f, "checksum" => checksum})
127
+ validate_checksum(key)
128
+ checksum
129
+ end
130
+
131
+ def generate_key(file, group="chef")
132
+ "#{group}-file-#{file.gsub(/(#{File::SEPARATOR}|\.)/, '-')}"
133
+ end
134
+
135
+ def self.generate_md5_checksum_for_file(*args)
136
+ instance.generate_md5_checksum_for_file(*args)
137
+ end
138
+
139
+ def generate_md5_checksum_for_file(file)
140
+ checksum_file(file, Digest::MD5.new)
141
+ end
142
+
143
+ def generate_md5_checksum(io)
144
+ checksum_io(io, Digest::MD5.new)
145
+ end
146
+
147
+ private
148
+
149
+ def fetch(key)
150
+ @moneta.fetch(key)
151
+ rescue ArgumentError => e
152
+ Log.warn "Error loading cached checksum for key #{key.inspect}"
153
+ Log.warn(e)
154
+ repair_checksum_cache
155
+ nil
156
+ end
157
+
158
+ def repair_checksum_cache
159
+ Chef::Log.info("Removing invalid checksum cache files")
160
+ Dir["#{Chef::Config[:cache_options][:path]}/*"].each do |file_path|
161
+ File.unlink(file_path) unless File.size?(file_path)
162
+ end
163
+ end
164
+
165
+ def file_unchanged?(cached, fstat)
166
+ cached["mtime"].to_f == fstat.mtime.to_f
167
+ end
168
+
169
+ def checksum_file(file, digest)
170
+ File.open(file, 'rb') { |f| checksum_io(f, digest) }
171
+ end
172
+
173
+ def checksum_io(io, digest)
174
+ while chunk = io.read(1024 * 8)
175
+ digest.update(chunk)
176
+ end
177
+ digest.hexdigest
178
+ end
179
+
180
+ end
181
+ end
182
+
183
+ module Moneta
184
+ module Defaults
185
+ def default
186
+ nil
187
+ end
188
+ end
189
+ end