tylerrick-chef 0.10.8

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 (450) 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-expander.conf +8 -0
  10. data/distro/arch/etc/conf.d/chef-server-webui.conf +10 -0
  11. data/distro/arch/etc/conf.d/chef-server.conf +10 -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-expander +78 -0
  15. data/distro/arch/etc/rc.d/chef-server +78 -0
  16. data/distro/arch/etc/rc.d/chef-server-webui +78 -0
  17. data/distro/arch/etc/rc.d/chef-solr +78 -0
  18. data/distro/common/html/chef-client.8.html +146 -0
  19. data/distro/common/html/chef-expander.8.html +164 -0
  20. data/distro/common/html/chef-expanderctl.8.html +146 -0
  21. data/distro/common/html/chef-server-webui.8.html +185 -0
  22. data/distro/common/html/chef-server.8.html +182 -0
  23. data/distro/common/html/chef-solo.8.html +191 -0
  24. data/distro/common/html/chef-solr.8.html +165 -0
  25. data/distro/common/html/knife-bootstrap.1.html +243 -0
  26. data/distro/common/html/knife-client.1.html +219 -0
  27. data/distro/common/html/knife-configure.1.html +170 -0
  28. data/distro/common/html/knife-cookbook-site.1.html +241 -0
  29. data/distro/common/html/knife-cookbook.1.html +384 -0
  30. data/distro/common/html/knife-data-bag.1.html +234 -0
  31. data/distro/common/html/knife-environment.1.html +267 -0
  32. data/distro/common/html/knife-exec.1.html +134 -0
  33. data/distro/common/html/knife-index.1.html +125 -0
  34. data/distro/common/html/knife-node.1.html +250 -0
  35. data/distro/common/html/knife-recipe.1.html +92 -0
  36. data/distro/common/html/knife-role.1.html +200 -0
  37. data/distro/common/html/knife-search.1.html +288 -0
  38. data/distro/common/html/knife-ssh.1.html +157 -0
  39. data/distro/common/html/knife-status.1.html +128 -0
  40. data/distro/common/html/knife-tag.1.html +137 -0
  41. data/distro/common/html/knife.1.html +321 -0
  42. data/distro/common/html/shef.1.html +283 -0
  43. data/distro/common/man/man1/knife-bootstrap.1 +197 -0
  44. data/distro/common/man/man1/knife-client.1 +99 -0
  45. data/distro/common/man/man1/knife-configure.1 +88 -0
  46. data/distro/common/man/man1/knife-cookbook-site.1 +145 -0
  47. data/distro/common/man/man1/knife-cookbook.1 +345 -0
  48. data/distro/common/man/man1/knife-data-bag.1 +130 -0
  49. data/distro/common/man/man1/knife-environment.1 +178 -0
  50. data/distro/common/man/man1/knife-exec.1 +46 -0
  51. data/distro/common/man/man1/knife-index.1 +29 -0
  52. data/distro/common/man/man1/knife-node.1 +134 -0
  53. data/distro/common/man/man1/knife-role.1 +88 -0
  54. data/distro/common/man/man1/knife-search.1 +280 -0
  55. data/distro/common/man/man1/knife-ssh.1 +83 -0
  56. data/distro/common/man/man1/knife-status.1 +29 -0
  57. data/distro/common/man/man1/knife-tag.1 +43 -0
  58. data/distro/common/man/man1/knife.1 +292 -0
  59. data/distro/common/man/man1/shef.1 +256 -0
  60. data/distro/common/man/man8/chef-client.8 +104 -0
  61. data/distro/common/man/man8/chef-expander.8 +97 -0
  62. data/distro/common/man/man8/chef-expanderctl.8 +62 -0
  63. data/distro/common/man/man8/chef-server-webui.8 +155 -0
  64. data/distro/common/man/man8/chef-server.8 +147 -0
  65. data/distro/common/man/man8/chef-solo.8 +158 -0
  66. data/distro/common/man/man8/chef-solr.8 +122 -0
  67. data/distro/common/markdown/README +3 -0
  68. data/distro/common/markdown/man1/knife-bootstrap.mkd +142 -0
  69. data/distro/common/markdown/man1/knife-client.mkd +103 -0
  70. data/distro/common/markdown/man1/knife-configure.mkd +70 -0
  71. data/distro/common/markdown/man1/knife-cookbook-site.mkd +123 -0
  72. data/distro/common/markdown/man1/knife-cookbook.mkd +263 -0
  73. data/distro/common/markdown/man1/knife-data-bag.mkd +117 -0
  74. data/distro/common/markdown/man1/knife-environment.mkd +151 -0
  75. data/distro/common/markdown/man1/knife-exec.mkd +37 -0
  76. data/distro/common/markdown/man1/knife-index.mkd +30 -0
  77. data/distro/common/markdown/man1/knife-node.mkd +130 -0
  78. data/distro/common/markdown/man1/knife-role.mkd +85 -0
  79. data/distro/common/markdown/man1/knife-search.mkd +180 -0
  80. data/distro/common/markdown/man1/knife-ssh.mkd +72 -0
  81. data/distro/common/markdown/man1/knife-status.mkd +36 -0
  82. data/distro/common/markdown/man1/knife-tag.mkd +39 -0
  83. data/distro/common/markdown/man1/knife.mkd +220 -0
  84. data/distro/common/markdown/man1/shef.mkd +189 -0
  85. data/distro/common/markdown/man8/chef-client.mkd +75 -0
  86. data/distro/common/markdown/man8/chef-expander.mkd +82 -0
  87. data/distro/common/markdown/man8/chef-expanderctl.mkd +58 -0
  88. data/distro/common/markdown/man8/chef-server-webui.mkd +121 -0
  89. data/distro/common/markdown/man8/chef-server.mkd +121 -0
  90. data/distro/common/markdown/man8/chef-solo.mkd +107 -0
  91. data/distro/common/markdown/man8/chef-solr.mkd +89 -0
  92. data/distro/debian/etc/default/chef-client +4 -0
  93. data/distro/debian/etc/default/chef-expander +8 -0
  94. data/distro/debian/etc/default/chef-server +9 -0
  95. data/distro/debian/etc/default/chef-server-webui +9 -0
  96. data/distro/debian/etc/default/chef-solr +8 -0
  97. data/distro/debian/etc/init.d/chef-client +185 -0
  98. data/distro/debian/etc/init.d/chef-expander +176 -0
  99. data/distro/debian/etc/init.d/chef-server +122 -0
  100. data/distro/debian/etc/init.d/chef-server-webui +123 -0
  101. data/distro/debian/etc/init.d/chef-solr +176 -0
  102. data/distro/debian/etc/init/chef-client.conf +17 -0
  103. data/distro/debian/etc/init/chef-expander.conf +17 -0
  104. data/distro/debian/etc/init/chef-server-webui.conf +17 -0
  105. data/distro/debian/etc/init/chef-server.conf +17 -0
  106. data/distro/debian/etc/init/chef-solr.conf +17 -0
  107. data/distro/redhat/etc/init.d/chef-client +110 -0
  108. data/distro/redhat/etc/init.d/chef-expander +104 -0
  109. data/distro/redhat/etc/init.d/chef-server +112 -0
  110. data/distro/redhat/etc/init.d/chef-server-webui +112 -0
  111. data/distro/redhat/etc/init.d/chef-solr +104 -0
  112. data/distro/redhat/etc/logrotate.d/chef-client +8 -0
  113. data/distro/redhat/etc/logrotate.d/chef-expander +8 -0
  114. data/distro/redhat/etc/logrotate.d/chef-server +8 -0
  115. data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
  116. data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
  117. data/distro/redhat/etc/sysconfig/chef-client +15 -0
  118. data/distro/redhat/etc/sysconfig/chef-expander +7 -0
  119. data/distro/redhat/etc/sysconfig/chef-server +14 -0
  120. data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
  121. data/distro/redhat/etc/sysconfig/chef-solr +8 -0
  122. data/lib/chef.rb +41 -0
  123. data/lib/chef/api_client.rb +271 -0
  124. data/lib/chef/application.rb +152 -0
  125. data/lib/chef/application/agent.rb +18 -0
  126. data/lib/chef/application/client.rb +285 -0
  127. data/lib/chef/application/knife.rb +188 -0
  128. data/lib/chef/application/solo.rb +218 -0
  129. data/lib/chef/applications.rb +4 -0
  130. data/lib/chef/certificate.rb +194 -0
  131. data/lib/chef/checksum.rb +167 -0
  132. data/lib/chef/checksum/storage.rb +18 -0
  133. data/lib/chef/checksum/storage/filesystem.rb +56 -0
  134. data/lib/chef/checksum_cache.rb +189 -0
  135. data/lib/chef/client.rb +366 -0
  136. data/lib/chef/config.rb +248 -0
  137. data/lib/chef/cookbook/chefignore.rb +66 -0
  138. data/lib/chef/cookbook/cookbook_collection.rb +45 -0
  139. data/lib/chef/cookbook/cookbook_version_loader.rb +173 -0
  140. data/lib/chef/cookbook/file_system_file_vendor.rb +56 -0
  141. data/lib/chef/cookbook/file_vendor.rb +48 -0
  142. data/lib/chef/cookbook/metadata.rb +629 -0
  143. data/lib/chef/cookbook/remote_file_vendor.rb +88 -0
  144. data/lib/chef/cookbook/syntax_check.rb +136 -0
  145. data/lib/chef/cookbook_loader.rb +121 -0
  146. data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
  147. data/lib/chef/cookbook_uploader.rb +154 -0
  148. data/lib/chef/cookbook_version.rb +1096 -0
  149. data/lib/chef/cookbook_version_selector.rb +168 -0
  150. data/lib/chef/couchdb.rb +246 -0
  151. data/lib/chef/daemon.rb +172 -0
  152. data/lib/chef/data_bag.rb +235 -0
  153. data/lib/chef/data_bag_item.rb +273 -0
  154. data/lib/chef/encrypted_data_bag_item.rb +139 -0
  155. data/lib/chef/environment.rb +455 -0
  156. data/lib/chef/exceptions.rb +154 -0
  157. data/lib/chef/file_access_control.rb +144 -0
  158. data/lib/chef/file_cache.rb +218 -0
  159. data/lib/chef/handler.rb +227 -0
  160. data/lib/chef/handler/error_report.rb +33 -0
  161. data/lib/chef/handler/json_file.rb +58 -0
  162. data/lib/chef/index_queue.rb +29 -0
  163. data/lib/chef/index_queue/amqp_client.rb +116 -0
  164. data/lib/chef/index_queue/consumer.rb +76 -0
  165. data/lib/chef/index_queue/indexable.rb +109 -0
  166. data/lib/chef/json_compat.rb +52 -0
  167. data/lib/chef/knife.rb +520 -0
  168. data/lib/chef/knife/bootstrap.rb +207 -0
  169. data/lib/chef/knife/bootstrap/archlinux-gems.erb +60 -0
  170. data/lib/chef/knife/bootstrap/centos5-gems.erb +56 -0
  171. data/lib/chef/knife/bootstrap/fedora13-gems.erb +43 -0
  172. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +49 -0
  173. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +50 -0
  174. data/lib/chef/knife/client_bulk_delete.rb +65 -0
  175. data/lib/chef/knife/client_create.rb +79 -0
  176. data/lib/chef/knife/client_delete.rb +46 -0
  177. data/lib/chef/knife/client_edit.rb +45 -0
  178. data/lib/chef/knife/client_list.rb +42 -0
  179. data/lib/chef/knife/client_reregister.rb +58 -0
  180. data/lib/chef/knife/client_show.rb +52 -0
  181. data/lib/chef/knife/configure.rb +149 -0
  182. data/lib/chef/knife/configure_client.rb +50 -0
  183. data/lib/chef/knife/cookbook_bulk_delete.rb +72 -0
  184. data/lib/chef/knife/cookbook_create.rb +274 -0
  185. data/lib/chef/knife/cookbook_delete.rb +151 -0
  186. data/lib/chef/knife/cookbook_download.rb +137 -0
  187. data/lib/chef/knife/cookbook_list.rb +47 -0
  188. data/lib/chef/knife/cookbook_metadata.rb +107 -0
  189. data/lib/chef/knife/cookbook_metadata_from_file.rb +44 -0
  190. data/lib/chef/knife/cookbook_show.rb +102 -0
  191. data/lib/chef/knife/cookbook_site_download.rb +70 -0
  192. data/lib/chef/knife/cookbook_site_install.rb +148 -0
  193. data/lib/chef/knife/cookbook_site_list.rb +62 -0
  194. data/lib/chef/knife/cookbook_site_search.rb +51 -0
  195. data/lib/chef/knife/cookbook_site_share.rb +114 -0
  196. data/lib/chef/knife/cookbook_site_show.rb +57 -0
  197. data/lib/chef/knife/cookbook_site_unshare.rb +56 -0
  198. data/lib/chef/knife/cookbook_site_vendor.rb +46 -0
  199. data/lib/chef/knife/cookbook_test.rb +93 -0
  200. data/lib/chef/knife/cookbook_upload.rb +240 -0
  201. data/lib/chef/knife/core/bootstrap_context.rb +100 -0
  202. data/lib/chef/knife/core/cookbook_scm_repo.rb +148 -0
  203. data/lib/chef/knife/core/generic_presenter.rb +191 -0
  204. data/lib/chef/knife/core/node_editor.rb +127 -0
  205. data/lib/chef/knife/core/node_presenter.rb +136 -0
  206. data/lib/chef/knife/core/object_loader.rb +75 -0
  207. data/lib/chef/knife/core/subcommand_loader.rb +112 -0
  208. data/lib/chef/knife/core/text_formatter.rb +100 -0
  209. data/lib/chef/knife/core/ui.rb +216 -0
  210. data/lib/chef/knife/data_bag_create.rb +93 -0
  211. data/lib/chef/knife/data_bag_delete.rb +51 -0
  212. data/lib/chef/knife/data_bag_edit.rb +94 -0
  213. data/lib/chef/knife/data_bag_from_file.rb +87 -0
  214. data/lib/chef/knife/data_bag_list.rb +46 -0
  215. data/lib/chef/knife/data_bag_show.rb +81 -0
  216. data/lib/chef/knife/environment_create.rb +53 -0
  217. data/lib/chef/knife/environment_delete.rb +45 -0
  218. data/lib/chef/knife/environment_edit.rb +45 -0
  219. data/lib/chef/knife/environment_from_file.rb +50 -0
  220. data/lib/chef/knife/environment_list.rb +42 -0
  221. data/lib/chef/knife/environment_show.rb +46 -0
  222. data/lib/chef/knife/exec.rb +51 -0
  223. data/lib/chef/knife/help.rb +103 -0
  224. data/lib/chef/knife/help_topics.rb +4 -0
  225. data/lib/chef/knife/index_rebuild.rb +50 -0
  226. data/lib/chef/knife/node_bulk_delete.rb +80 -0
  227. data/lib/chef/knife/node_create.rb +50 -0
  228. data/lib/chef/knife/node_delete.rb +47 -0
  229. data/lib/chef/knife/node_edit.rb +72 -0
  230. data/lib/chef/knife/node_from_file.rb +50 -0
  231. data/lib/chef/knife/node_list.rb +46 -0
  232. data/lib/chef/knife/node_run_list_add.rb +67 -0
  233. data/lib/chef/knife/node_run_list_remove.rb +48 -0
  234. data/lib/chef/knife/node_show.rb +73 -0
  235. data/lib/chef/knife/recipe_list.rb +32 -0
  236. data/lib/chef/knife/role_bulk_delete.rb +70 -0
  237. data/lib/chef/knife/role_create.rb +55 -0
  238. data/lib/chef/knife/role_delete.rb +47 -0
  239. data/lib/chef/knife/role_edit.rb +48 -0
  240. data/lib/chef/knife/role_from_file.rb +56 -0
  241. data/lib/chef/knife/role_list.rb +43 -0
  242. data/lib/chef/knife/role_show.rb +54 -0
  243. data/lib/chef/knife/search.rb +141 -0
  244. data/lib/chef/knife/ssh.rb +367 -0
  245. data/lib/chef/knife/status.rb +104 -0
  246. data/lib/chef/knife/tag_create.rb +52 -0
  247. data/lib/chef/knife/tag_delete.rb +60 -0
  248. data/lib/chef/knife/tag_list.rb +47 -0
  249. data/lib/chef/log.rb +39 -0
  250. data/lib/chef/mash.rb +211 -0
  251. data/lib/chef/mixin/check_helper.rb +31 -0
  252. data/lib/chef/mixin/checksum.rb +32 -0
  253. data/lib/chef/mixin/command.rb +163 -0
  254. data/lib/chef/mixin/command/unix.rb +215 -0
  255. data/lib/chef/mixin/command/windows.rb +76 -0
  256. data/lib/chef/mixin/convert_to_class_name.rb +63 -0
  257. data/lib/chef/mixin/create_path.rb +57 -0
  258. data/lib/chef/mixin/deep_merge.rb +225 -0
  259. data/lib/chef/mixin/deprecation.rb +65 -0
  260. data/lib/chef/mixin/from_file.rb +50 -0
  261. data/lib/chef/mixin/get_source_from_package.rb +42 -0
  262. data/lib/chef/mixin/language.rb +163 -0
  263. data/lib/chef/mixin/language_include_attribute.rb +61 -0
  264. data/lib/chef/mixin/language_include_recipe.rb +52 -0
  265. data/lib/chef/mixin/params_validate.rb +225 -0
  266. data/lib/chef/mixin/recipe_definition_dsl_core.rb +78 -0
  267. data/lib/chef/mixin/shell_out.rb +41 -0
  268. data/lib/chef/mixin/template.rb +95 -0
  269. data/lib/chef/mixin/xml_escape.rb +140 -0
  270. data/lib/chef/mixins.rb +15 -0
  271. data/lib/chef/monkey_patches/dir.rb +36 -0
  272. data/lib/chef/monkey_patches/numeric.rb +15 -0
  273. data/lib/chef/monkey_patches/object.rb +9 -0
  274. data/lib/chef/monkey_patches/regexp.rb +34 -0
  275. data/lib/chef/monkey_patches/string.rb +49 -0
  276. data/lib/chef/monkey_patches/tempfile.rb +64 -0
  277. data/lib/chef/nil_argument.rb +3 -0
  278. data/lib/chef/node.rb +677 -0
  279. data/lib/chef/node/attribute.rb +487 -0
  280. data/lib/chef/openid_registration.rb +187 -0
  281. data/lib/chef/platform.rb +434 -0
  282. data/lib/chef/provider.rb +124 -0
  283. data/lib/chef/provider/breakpoint.rb +36 -0
  284. data/lib/chef/provider/cookbook_file.rb +100 -0
  285. data/lib/chef/provider/cron.rb +186 -0
  286. data/lib/chef/provider/cron/solaris.rb +195 -0
  287. data/lib/chef/provider/deploy.rb +418 -0
  288. data/lib/chef/provider/deploy/revision.rb +80 -0
  289. data/lib/chef/provider/deploy/timestamped.rb +33 -0
  290. data/lib/chef/provider/directory.rb +72 -0
  291. data/lib/chef/provider/env.rb +152 -0
  292. data/lib/chef/provider/env/windows.rb +75 -0
  293. data/lib/chef/provider/erl_call.rb +101 -0
  294. data/lib/chef/provider/execute.rb +65 -0
  295. data/lib/chef/provider/file.rb +226 -0
  296. data/lib/chef/provider/git.rb +243 -0
  297. data/lib/chef/provider/group.rb +133 -0
  298. data/lib/chef/provider/group/aix.rb +70 -0
  299. data/lib/chef/provider/group/dscl.rb +121 -0
  300. data/lib/chef/provider/group/gpasswd.rb +53 -0
  301. data/lib/chef/provider/group/groupadd.rb +91 -0
  302. data/lib/chef/provider/group/pw.rb +84 -0
  303. data/lib/chef/provider/group/suse.rb +53 -0
  304. data/lib/chef/provider/group/usermod.rb +57 -0
  305. data/lib/chef/provider/group/windows.rb +79 -0
  306. data/lib/chef/provider/http_request.rb +122 -0
  307. data/lib/chef/provider/ifconfig.rb +195 -0
  308. data/lib/chef/provider/link.rb +164 -0
  309. data/lib/chef/provider/log.rb +54 -0
  310. data/lib/chef/provider/mdadm.rb +91 -0
  311. data/lib/chef/provider/mount.rb +114 -0
  312. data/lib/chef/provider/mount/mount.rb +240 -0
  313. data/lib/chef/provider/mount/windows.rb +81 -0
  314. data/lib/chef/provider/ohai.rb +42 -0
  315. data/lib/chef/provider/package.rb +200 -0
  316. data/lib/chef/provider/package/apt.rb +145 -0
  317. data/lib/chef/provider/package/dpkg.rb +115 -0
  318. data/lib/chef/provider/package/easy_install.rb +136 -0
  319. data/lib/chef/provider/package/freebsd.rb +125 -0
  320. data/lib/chef/provider/package/macports.rb +105 -0
  321. data/lib/chef/provider/package/pacman.rb +101 -0
  322. data/lib/chef/provider/package/portage.rb +135 -0
  323. data/lib/chef/provider/package/rpm.rb +104 -0
  324. data/lib/chef/provider/package/rubygems.rb +465 -0
  325. data/lib/chef/provider/package/solaris.rb +130 -0
  326. data/lib/chef/provider/package/yum-dump.py +286 -0
  327. data/lib/chef/provider/package/yum.rb +1173 -0
  328. data/lib/chef/provider/package/zypper.rb +144 -0
  329. data/lib/chef/provider/remote_directory.rb +137 -0
  330. data/lib/chef/provider/remote_file.rb +118 -0
  331. data/lib/chef/provider/route.rb +193 -0
  332. data/lib/chef/provider/ruby_block.rb +34 -0
  333. data/lib/chef/provider/script.rb +55 -0
  334. data/lib/chef/provider/service.rb +122 -0
  335. data/lib/chef/provider/service/arch.rb +116 -0
  336. data/lib/chef/provider/service/debian.rb +130 -0
  337. data/lib/chef/provider/service/freebsd.rb +154 -0
  338. data/lib/chef/provider/service/gentoo.rb +53 -0
  339. data/lib/chef/provider/service/init.rb +71 -0
  340. data/lib/chef/provider/service/insserv.rb +52 -0
  341. data/lib/chef/provider/service/invokercd.rb +35 -0
  342. data/lib/chef/provider/service/redhat.rb +60 -0
  343. data/lib/chef/provider/service/simple.rb +120 -0
  344. data/lib/chef/provider/service/solaris.rb +85 -0
  345. data/lib/chef/provider/service/systemd.rb +102 -0
  346. data/lib/chef/provider/service/upstart.rb +198 -0
  347. data/lib/chef/provider/service/windows.rb +155 -0
  348. data/lib/chef/provider/subversion.rb +197 -0
  349. data/lib/chef/provider/template.rb +104 -0
  350. data/lib/chef/provider/user.rb +186 -0
  351. data/lib/chef/provider/user/dscl.rb +280 -0
  352. data/lib/chef/provider/user/pw.rb +113 -0
  353. data/lib/chef/provider/user/useradd.rb +137 -0
  354. data/lib/chef/provider/user/windows.rb +124 -0
  355. data/lib/chef/providers.rb +95 -0
  356. data/lib/chef/recipe.rb +129 -0
  357. data/lib/chef/resource.rb +609 -0
  358. data/lib/chef/resource/apt_package.rb +34 -0
  359. data/lib/chef/resource/bash.rb +33 -0
  360. data/lib/chef/resource/breakpoint.rb +35 -0
  361. data/lib/chef/resource/conditional.rb +90 -0
  362. data/lib/chef/resource/cookbook_file.rb +45 -0
  363. data/lib/chef/resource/cron.rb +188 -0
  364. data/lib/chef/resource/csh.rb +33 -0
  365. data/lib/chef/resource/deploy.rb +389 -0
  366. data/lib/chef/resource/deploy_revision.rb +40 -0
  367. data/lib/chef/resource/directory.rb +76 -0
  368. data/lib/chef/resource/dpkg_package.rb +34 -0
  369. data/lib/chef/resource/easy_install_package.rb +57 -0
  370. data/lib/chef/resource/env.rb +58 -0
  371. data/lib/chef/resource/erl_call.rb +83 -0
  372. data/lib/chef/resource/execute.rb +127 -0
  373. data/lib/chef/resource/file.rb +99 -0
  374. data/lib/chef/resource/freebsd_package.rb +35 -0
  375. data/lib/chef/resource/gem_package.rb +53 -0
  376. data/lib/chef/resource/git.rb +46 -0
  377. data/lib/chef/resource/group.rb +78 -0
  378. data/lib/chef/resource/http_request.rb +61 -0
  379. data/lib/chef/resource/ifconfig.rb +144 -0
  380. data/lib/chef/resource/link.rb +78 -0
  381. data/lib/chef/resource/log.rb +62 -0
  382. data/lib/chef/resource/macports_package.rb +29 -0
  383. data/lib/chef/resource/mdadm.rb +82 -0
  384. data/lib/chef/resource/mount.rb +134 -0
  385. data/lib/chef/resource/ohai.rb +40 -0
  386. data/lib/chef/resource/package.rb +80 -0
  387. data/lib/chef/resource/pacman_package.rb +33 -0
  388. data/lib/chef/resource/perl.rb +33 -0
  389. data/lib/chef/resource/portage_package.rb +33 -0
  390. data/lib/chef/resource/python.rb +33 -0
  391. data/lib/chef/resource/remote_directory.rb +109 -0
  392. data/lib/chef/resource/remote_file.rb +83 -0
  393. data/lib/chef/resource/route.rb +135 -0
  394. data/lib/chef/resource/rpm_package.rb +34 -0
  395. data/lib/chef/resource/ruby.rb +33 -0
  396. data/lib/chef/resource/ruby_block.rb +40 -0
  397. data/lib/chef/resource/scm.rb +147 -0
  398. data/lib/chef/resource/script.rb +60 -0
  399. data/lib/chef/resource/service.rb +151 -0
  400. data/lib/chef/resource/solaris_package.rb +36 -0
  401. data/lib/chef/resource/subversion.rb +36 -0
  402. data/lib/chef/resource/template.rb +69 -0
  403. data/lib/chef/resource/timestamped_deploy.rb +31 -0
  404. data/lib/chef/resource/user.rb +130 -0
  405. data/lib/chef/resource/yum_package.rb +63 -0
  406. data/lib/chef/resource_collection.rb +217 -0
  407. data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
  408. data/lib/chef/resource_definition.rb +67 -0
  409. data/lib/chef/resource_definition_list.rb +38 -0
  410. data/lib/chef/resources.rb +64 -0
  411. data/lib/chef/rest.rb +400 -0
  412. data/lib/chef/rest/auth_credentials.rb +71 -0
  413. data/lib/chef/rest/cookie_jar.rb +31 -0
  414. data/lib/chef/rest/rest_request.rb +213 -0
  415. data/lib/chef/role.rb +343 -0
  416. data/lib/chef/run_context.rb +126 -0
  417. data/lib/chef/run_list.rb +165 -0
  418. data/lib/chef/run_list/run_list_expansion.rb +193 -0
  419. data/lib/chef/run_list/run_list_item.rb +92 -0
  420. data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
  421. data/lib/chef/run_status.rb +121 -0
  422. data/lib/chef/runner.rb +105 -0
  423. data/lib/chef/sandbox.rb +153 -0
  424. data/lib/chef/search/query.rb +65 -0
  425. data/lib/chef/shef.rb +327 -0
  426. data/lib/chef/shef/ext.rb +569 -0
  427. data/lib/chef/shef/model_wrapper.rb +120 -0
  428. data/lib/chef/shef/shef_rest.rb +28 -0
  429. data/lib/chef/shef/shef_session.rb +285 -0
  430. data/lib/chef/shell_out.rb +249 -0
  431. data/lib/chef/shell_out/unix.rb +223 -0
  432. data/lib/chef/shell_out/windows.rb +588 -0
  433. data/lib/chef/solr_query.rb +187 -0
  434. data/lib/chef/solr_query/lucene.treetop +150 -0
  435. data/lib/chef/solr_query/lucene_nodes.rb +285 -0
  436. data/lib/chef/solr_query/query_transform.rb +65 -0
  437. data/lib/chef/solr_query/solr_http_request.rb +132 -0
  438. data/lib/chef/streaming_cookbook_uploader.rb +201 -0
  439. data/lib/chef/tasks/chef_repo.rake +334 -0
  440. data/lib/chef/util/file_edit.rb +122 -0
  441. data/lib/chef/util/windows.rb +56 -0
  442. data/lib/chef/util/windows/net_group.rb +101 -0
  443. data/lib/chef/util/windows/net_use.rb +121 -0
  444. data/lib/chef/util/windows/net_user.rb +198 -0
  445. data/lib/chef/util/windows/volume.rb +59 -0
  446. data/lib/chef/version.rb +23 -0
  447. data/lib/chef/version_class.rb +70 -0
  448. data/lib/chef/version_constraint.rb +116 -0
  449. data/lib/chef/webui_user.rb +231 -0
  450. metadata +764 -0
@@ -0,0 +1,188 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com)
3
+ # Copyright:: Copyright (c) 2009 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/knife'
19
+ require 'chef/application'
20
+ require 'mixlib/log'
21
+ require 'ohai/config'
22
+
23
+ class Chef::Application::Knife < Chef::Application
24
+
25
+ NO_COMMAND_GIVEN = "You need to pass a sub-command (e.g., knife SUB-COMMAND)\n"
26
+
27
+ banner "Usage: knife sub-command (options)"
28
+
29
+ option :config_file,
30
+ :short => "-c CONFIG",
31
+ :long => "--config CONFIG",
32
+ :description => "The configuration file to use",
33
+ :proc => lambda { |path| File.expand_path(path, Dir.pwd) }
34
+
35
+ verbosity_level = 0
36
+ option :verbosity,
37
+ :short => '-V',
38
+ :long => '--verbose',
39
+ :description => "More verbose output. Use twice for max verbosity",
40
+ :proc => Proc.new { verbosity_level += 1},
41
+ :default => 0
42
+
43
+ option :color,
44
+ :long => '--color',
45
+ :boolean => true,
46
+ :default => true,
47
+ :description => "Use colored output"
48
+
49
+ option :no_color,
50
+ :long => '--no-color',
51
+ :boolean => true,
52
+ :default => false,
53
+ :description => "Don't use colors in the output"
54
+
55
+ option :environment,
56
+ :short => "-E ENVIRONMENT",
57
+ :long => "--environment ENVIRONMENT",
58
+ :description => "Set the Chef environment"
59
+
60
+ option :editor,
61
+ :short => "-e EDITOR",
62
+ :long => "--editor EDITOR",
63
+ :description => "Set the editor to use for interactive commands",
64
+ :default => ENV['EDITOR']
65
+
66
+ option :no_editor,
67
+ :short => "-n",
68
+ :long => "--no-editor",
69
+ :description => "Do not open EDITOR, just accept the data as is",
70
+ :boolean => true
71
+
72
+ option :help,
73
+ :short => "-h",
74
+ :long => "--help",
75
+ :description => "Show this message",
76
+ :on => :tail,
77
+ :boolean => true
78
+
79
+ option :node_name,
80
+ :short => "-u USER",
81
+ :long => "--user USER",
82
+ :description => "API Client Username"
83
+
84
+ option :client_key,
85
+ :short => "-k KEY",
86
+ :long => "--key KEY",
87
+ :description => "API Client Key",
88
+ :proc => lambda { |path| File.expand_path(path, Dir.pwd) }
89
+
90
+ option :chef_server_url,
91
+ :short => "-s URL",
92
+ :long => "--server-url URL",
93
+ :description => "Chef Server URL"
94
+
95
+ option :yes,
96
+ :short => "-y",
97
+ :long => "--yes",
98
+ :description => "Say yes to all prompts for confirmation"
99
+
100
+ option :defaults,
101
+ :long => "--defaults",
102
+ :description => "Accept default values for all questions"
103
+
104
+ option :print_after,
105
+ :long => "--print-after",
106
+ :description => "Show the data after a destructive operation"
107
+
108
+ option :format,
109
+ :short => "-F FORMAT",
110
+ :long => "--format FORMAT",
111
+ :description => "Which format to use for output",
112
+ :default => "summary"
113
+
114
+ option :version,
115
+ :short => "-v",
116
+ :long => "--version",
117
+ :description => "Show chef version",
118
+ :boolean => true,
119
+ :proc => lambda {|v| puts "Chef: #{::Chef::VERSION}"},
120
+ :exit => 0
121
+
122
+
123
+ # Run knife
124
+ def run
125
+ Mixlib::Log::Formatter.show_time = false
126
+ validate_and_parse_options
127
+ quiet_traps
128
+ Chef::Knife.run(ARGV, options)
129
+ exit 0
130
+ end
131
+
132
+ private
133
+
134
+ def quiet_traps
135
+ trap("TERM") do
136
+ exit 1
137
+ end
138
+
139
+ trap("INT") do
140
+ exit 2
141
+ end
142
+ end
143
+
144
+ def validate_and_parse_options
145
+ # Checking ARGV validity *before* parse_options because parse_options
146
+ # mangles ARGV in some situations
147
+ if no_command_given?
148
+ print_help_and_exit(1, NO_COMMAND_GIVEN)
149
+ elsif no_subcommand_given?
150
+ if (want_help? || want_version?)
151
+ print_help_and_exit
152
+ else
153
+ print_help_and_exit(2, NO_COMMAND_GIVEN)
154
+ end
155
+ end
156
+ end
157
+
158
+ def no_subcommand_given?
159
+ ARGV[0] =~ /^-/
160
+ end
161
+
162
+ def no_command_given?
163
+ ARGV.empty?
164
+ end
165
+
166
+ def want_help?
167
+ ARGV[0] =~ /^(--help|-h)$/
168
+ end
169
+
170
+ def want_version?
171
+ ARGV[0] =~ /^(--version|-v)$/
172
+ end
173
+
174
+ def print_help_and_exit(exitcode=1, fatal_message=nil)
175
+ Chef::Log.error(fatal_message) if fatal_message
176
+
177
+ begin
178
+ self.parse_options
179
+ rescue OptionParser::InvalidOption => e
180
+ puts "#{e}\n"
181
+ end
182
+ puts self.opt_parser
183
+ puts
184
+ Chef::Knife.list_commands
185
+ exit exitcode
186
+ end
187
+
188
+ end
@@ -0,0 +1,218 @@
1
+ #
2
+ # Author:: AJ Christensen (<aj@opscode.com>)
3
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ require 'chef'
19
+ require 'chef/application'
20
+ require 'chef/client'
21
+ require 'chef/config'
22
+ require 'chef/daemon'
23
+ require 'chef/log'
24
+ require 'chef/rest'
25
+ require 'open-uri'
26
+ require 'fileutils'
27
+
28
+ class Chef::Application::Solo < Chef::Application
29
+
30
+ option :config_file,
31
+ :short => "-c CONFIG",
32
+ :long => "--config CONFIG",
33
+ :default => "/etc/chef/solo.rb",
34
+ :description => "The configuration file to use"
35
+
36
+ option :log_level,
37
+ :short => "-l LEVEL",
38
+ :long => "--log_level LEVEL",
39
+ :description => "Set the log level (debug, info, warn, error, fatal)",
40
+ :proc => lambda { |l| l.to_sym }
41
+
42
+ option :log_location,
43
+ :short => "-L LOGLOCATION",
44
+ :long => "--logfile LOGLOCATION",
45
+ :description => "Set the log file location, defaults to STDOUT",
46
+ :proc => nil
47
+
48
+ option :help,
49
+ :short => "-h",
50
+ :long => "--help",
51
+ :description => "Show this message",
52
+ :on => :tail,
53
+ :boolean => true,
54
+ :show_options => true,
55
+ :exit => 0
56
+
57
+ option :user,
58
+ :short => "-u USER",
59
+ :long => "--user USER",
60
+ :description => "User to set privilege to",
61
+ :proc => nil
62
+
63
+ option :group,
64
+ :short => "-g GROUP",
65
+ :long => "--group GROUP",
66
+ :description => "Group to set privilege to",
67
+ :proc => nil
68
+
69
+ option :daemonize,
70
+ :short => "-d",
71
+ :long => "--daemonize",
72
+ :description => "Daemonize the process",
73
+ :proc => lambda { |p| true }
74
+
75
+ option :interval,
76
+ :short => "-i SECONDS",
77
+ :long => "--interval SECONDS",
78
+ :description => "Run chef-client periodically, in seconds",
79
+ :proc => lambda { |s| s.to_i }
80
+
81
+ option :json_attribs,
82
+ :short => "-j JSON_ATTRIBS",
83
+ :long => "--json-attributes JSON_ATTRIBS",
84
+ :description => "Load attributes from a JSON file or URL",
85
+ :proc => nil
86
+
87
+ option :node_name,
88
+ :short => "-N NODE_NAME",
89
+ :long => "--node-name NODE_NAME",
90
+ :description => "The node name for this client",
91
+ :proc => nil
92
+
93
+ option :splay,
94
+ :short => "-s SECONDS",
95
+ :long => "--splay SECONDS",
96
+ :description => "The splay time for running at intervals, in seconds",
97
+ :proc => lambda { |s| s.to_i }
98
+
99
+ option :recipe_url,
100
+ :short => "-r RECIPE_URL",
101
+ :long => "--recipe-url RECIPE_URL",
102
+ :description => "Pull down a remote gzipped tarball of recipes and untar it to the cookbook cache.",
103
+ :proc => nil
104
+
105
+ option :version,
106
+ :short => "-v",
107
+ :long => "--version",
108
+ :description => "Show chef version",
109
+ :boolean => true,
110
+ :proc => lambda {|v| puts "Chef: #{::Chef::VERSION}"},
111
+ :exit => 0
112
+
113
+ attr_reader :chef_solo_json
114
+
115
+ def initialize
116
+ super
117
+ @chef_solo = nil
118
+ @chef_solo_json = nil
119
+ end
120
+
121
+ def reconfigure
122
+ super
123
+
124
+ Chef::Config[:solo] = true
125
+
126
+ if Chef::Config[:daemonize]
127
+ Chef::Config[:interval] ||= 1800
128
+ end
129
+
130
+ if Chef::Config[:json_attribs]
131
+ begin
132
+ json_io = case Chef::Config[:json_attribs]
133
+ when /^(http|https):\/\//
134
+ @rest = Chef::REST.new(Chef::Config[:json_attribs], nil, nil)
135
+ @rest.get_rest(Chef::Config[:json_attribs], true).open
136
+ else
137
+ open(Chef::Config[:json_attribs])
138
+ end
139
+ rescue SocketError => error
140
+ Chef::Application.fatal!("I cannot connect to #{Chef::Config[:json_attribs]}", 2)
141
+ rescue Errno::ENOENT => error
142
+ Chef::Application.fatal!("I cannot find #{Chef::Config[:json_attribs]}", 2)
143
+ rescue Errno::EACCES => error
144
+ Chef::Application.fatal!("Permissions are incorrect on #{Chef::Config[:json_attribs]}. Please chmod a+r #{Chef::Config[:json_attribs]}", 2)
145
+ rescue Exception => error
146
+ Chef::Application.fatal!("Got an unexpected error reading #{Chef::Config[:json_attribs]}: #{error.message}", 2)
147
+ end
148
+
149
+ begin
150
+ @chef_solo_json = Chef::JSONCompat.from_json(json_io.read)
151
+ json_io.close unless json_io.closed?
152
+ rescue JSON::ParserError => error
153
+ Chef::Application.fatal!("Could not parse the provided JSON file (#{Chef::Config[:json_attribs]})!: " + error.message, 2)
154
+ end
155
+ end
156
+
157
+ if Chef::Config[:recipe_url]
158
+ cookbooks_path = Array(Chef::Config[:cookbook_path]).detect{|e| e =~ /\/cookbooks\/*$/ }
159
+ recipes_path = File.expand_path(File.join(cookbooks_path, '..'))
160
+ target_file = File.join(recipes_path, 'recipes.tgz')
161
+
162
+ Chef::Log.debug "Creating path #{recipes_path} to extract recipes into"
163
+ FileUtils.mkdir_p recipes_path
164
+ path = File.join(recipes_path, 'recipes.tgz')
165
+ File.open(path, 'wb') do |f|
166
+ open(Chef::Config[:recipe_url]) do |r|
167
+ f.write(r.read)
168
+ end
169
+ end
170
+ Chef::Mixin::Command.run_command(:command => "tar zxvfC #{path} #{recipes_path}")
171
+ end
172
+ end
173
+
174
+ def setup_application
175
+ Chef::Daemon.change_privilege
176
+ end
177
+
178
+ def run_application
179
+ if Chef::Config[:daemonize]
180
+ Chef::Daemon.daemonize("chef-client")
181
+ end
182
+
183
+ loop do
184
+ begin
185
+ if Chef::Config[:splay]
186
+ splay = rand Chef::Config[:splay]
187
+ Chef::Log.debug("Splay sleep #{splay} seconds")
188
+ sleep splay
189
+ end
190
+
191
+ @chef_solo = Chef::Client.new(@chef_solo_json)
192
+ @chef_solo.run
193
+ @chef_solo = nil
194
+ if Chef::Config[:interval]
195
+ Chef::Log.debug("Sleeping for #{Chef::Config[:interval]} seconds")
196
+ sleep Chef::Config[:interval]
197
+ else
198
+ Chef::Application.exit! "Exiting", 0
199
+ end
200
+ rescue SystemExit => e
201
+ raise
202
+ rescue Exception => e
203
+ if Chef::Config[:interval]
204
+ Chef::Log.error("#{e.class}: #{e}")
205
+ Chef::Log.debug("#{e.class}: #{e}\n#{e.backtrace.join("\n")}")
206
+ Chef::Log.fatal("Sleeping for #{Chef::Config[:interval]} seconds before trying again")
207
+ sleep Chef::Config[:interval]
208
+ retry
209
+ else
210
+ Chef::Application.debug_stacktrace(e)
211
+ Chef::Application.fatal!("#{e.class}: #{e.message}", 1)
212
+ end
213
+ ensure
214
+ GC.start
215
+ end
216
+ end
217
+ end
218
+ end
@@ -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