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,167 @@
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 'chef/checksum/storage'
20
+ require 'uuidtools'
21
+
22
+ class Chef
23
+ # == Chef::Checksum
24
+ # Checksum for an individual file; e.g., used for sandbox/cookbook uploading
25
+ # to track which files the system already manages.
26
+ class Checksum
27
+ attr_accessor :checksum, :create_time
28
+ attr_accessor :couchdb_id, :couchdb_rev
29
+
30
+ attr_reader :storage
31
+
32
+ # When a Checksum commits a sandboxed file to its final home in the checksum
33
+ # repo, this attribute will have the original on-disk path where the file
34
+ # was stored; it will be used if the commit is reverted to restore the sandbox
35
+ # to the pre-commit state.
36
+ attr_reader :original_committed_file_location
37
+
38
+ DESIGN_DOCUMENT = {
39
+ "version" => 1,
40
+ "language" => "javascript",
41
+ "views" => {
42
+ "all" => {
43
+ "map" => <<-EOJS
44
+ function(doc) {
45
+ if (doc.chef_type == "checksum") {
46
+ emit(doc.checksum, doc);
47
+ }
48
+ }
49
+ EOJS
50
+ },
51
+ }
52
+ }
53
+
54
+ # Creates a new Chef::Checksum object.
55
+ # === Arguments
56
+ # checksum::: the MD5 content hash of the file
57
+ # couchdb::: An instance of Chef::CouchDB
58
+ #
59
+ # === Returns
60
+ # object<Chef::Checksum>:: Duh. :)
61
+ def initialize(checksum=nil, couchdb=nil)
62
+ @create_time = Time.now.iso8601
63
+ @checksum = checksum
64
+ @original_committed_file_location = nil
65
+ @storage = Storage::Filesystem.new(Chef::Config.checksum_path, checksum)
66
+ end
67
+
68
+ def to_json(*a)
69
+ result = {
70
+ :checksum => checksum,
71
+ :create_time => create_time,
72
+ :json_class => self.class.name,
73
+ :chef_type => 'checksum',
74
+
75
+ # For Chef::CouchDB (id_to_name, name_to_id)
76
+ :name => checksum
77
+ }
78
+ result.to_json(*a)
79
+ end
80
+
81
+ def self.json_create(o)
82
+ checksum = new(o['checksum'])
83
+ checksum.create_time = o['create_time']
84
+
85
+ if o.has_key?('_rev')
86
+ checksum.couchdb_rev = o["_rev"]
87
+ o.delete("_rev")
88
+ end
89
+ if o.has_key?("_id")
90
+ checksum.couchdb_id = o["_id"]
91
+ o.delete("_id")
92
+ end
93
+ checksum
94
+ end
95
+
96
+ # Moves the given +sandbox_file+ into the checksum repo using the path
97
+ # given by +file_location+ and saves the Checksum to the database
98
+ def commit_sandbox_file(sandbox_file)
99
+ @original_committed_file_location = sandbox_file
100
+ Chef::Log.info("Commiting sandbox file: move #{sandbox_file} to #{@storage}")
101
+ @storage.commit(sandbox_file)
102
+ cdb_save
103
+ end
104
+
105
+ # Moves the checksum file back to its pre-commit location and deletes
106
+ # the checksum object from the database, effectively undoing +commit_sandbox_file+.
107
+ # Raises Chef::Exceptions::IllegalChecksumRevert if the original file location
108
+ # is unknown, which is will be the case if commit_sandbox_file was not
109
+ # previously called
110
+ def revert_sandbox_file_commit
111
+ unless original_committed_file_location
112
+ raise Chef::Exceptions::IllegalChecksumRevert, "Checksum #{self.inspect} cannot be reverted because the original sandbox file location is not known"
113
+ end
114
+
115
+ Chef::Log.warn("Reverting sandbox file commit: moving #{@storage} back to #{original_committed_file_location}")
116
+ @storage.revert(original_committed_file_location)
117
+ cdb_destroy
118
+ end
119
+
120
+ # Removes the on-disk file backing this checksum object, then removes it
121
+ # from the database
122
+ def purge
123
+ purge_file
124
+ cdb_destroy
125
+ end
126
+
127
+ ##
128
+ # Couchdb
129
+ ##
130
+
131
+ def self.create_design_document(couchdb=nil)
132
+ (couchdb || Chef::CouchDB.new).create_design_document("checksums", DESIGN_DOCUMENT)
133
+ end
134
+
135
+ def self.cdb_list(inflate=false, couchdb=nil)
136
+ rs = (couchdb || Chef::CouchDB.new).list("checksums", inflate)
137
+ lookup = (inflate ? "value" : "key")
138
+ rs["rows"].collect { |r| r[lookup] }
139
+ end
140
+
141
+ def self.cdb_all_checksums(couchdb = nil)
142
+ rs = (couchdb || Chef::CouchDB.new).list("checksums", true)
143
+ rs["rows"].inject({}) { |hash_result, r| hash_result[r['key']] = 1; hash_result }
144
+ end
145
+
146
+ def self.cdb_load(checksum, couchdb=nil)
147
+ # Probably want to look for a view here at some point
148
+ (couchdb || Chef::CouchDB.new).load("checksum", checksum)
149
+ end
150
+
151
+ def cdb_destroy(couchdb=nil)
152
+ (couchdb || Chef::CouchDB.new).delete("checksum", checksum, @couchdb_rev)
153
+ end
154
+
155
+ def cdb_save(couchdb=nil)
156
+ @couchdb_rev = (couchdb || Chef::CouchDB.new).store("checksum", checksum, self)["rev"]
157
+ end
158
+
159
+
160
+ private
161
+
162
+ def purge_file
163
+ @storage.purge
164
+ end
165
+
166
+ end
167
+ end
@@ -0,0 +1,18 @@
1
+ #
2
+ # Author:: Andrea Campi (<andrea.campi@zephirworks.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 'chef/checksum/storage/filesystem'
@@ -0,0 +1,56 @@
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
+ class Chef
19
+ class Checksum
20
+ class Storage
21
+ class Filesystem
22
+ def initialize(base_dir, checksum)
23
+ @base_dir = base_dir
24
+ @checksum = checksum
25
+ end
26
+
27
+ def file_location
28
+ File.join(checksum_repo_directory, @checksum)
29
+ end
30
+ alias :to_s :file_location
31
+
32
+ def checksum_repo_directory
33
+ File.join(Chef::Config.checksum_path, @checksum[0..1])
34
+ end
35
+
36
+ def commit(sandbox_file)
37
+ FileUtils.mkdir_p(checksum_repo_directory)
38
+ File.rename(sandbox_file, file_location)
39
+ end
40
+
41
+ def revert(original_committed_file_location)
42
+ File.rename(file_location, original_committed_file_location)
43
+ end
44
+
45
+ # Deletes the file backing this checksum from the on-disk repo.
46
+ # Purging the checksums is how users can get back to a valid state if
47
+ # they've deleted files, so we silently swallow Errno::ENOENT here.
48
+ def purge
49
+ FileUtils.rm(file_location)
50
+ rescue Errno::ENOENT
51
+ true
52
+ end
53
+ end
54
+ end
55
+ end
56
+ 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.debug("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
@@ -0,0 +1,366 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Christopher Walters (<cw@opscode.com>)
4
+ # Author:: Christopher Brown (<cb@opscode.com>)
5
+ # Author:: Tim Hinderliter (<tim@opscode.com>)
6
+ # Copyright:: Copyright (c) 2008-2011 Opscode, Inc.
7
+ # License:: Apache License, Version 2.0
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+
21
+ require 'chef/config'
22
+ require 'chef/mixin/params_validate'
23
+ require 'chef/log'
24
+ require 'chef/rest'
25
+ require 'chef/api_client'
26
+ require 'chef/platform'
27
+ require 'chef/node'
28
+ require 'chef/role'
29
+ require 'chef/file_cache'
30
+ require 'chef/run_context'
31
+ require 'chef/runner'
32
+ require 'chef/run_status'
33
+ require 'chef/cookbook/cookbook_collection'
34
+ require 'chef/cookbook/file_vendor'
35
+ require 'chef/cookbook/file_system_file_vendor'
36
+ require 'chef/cookbook/remote_file_vendor'
37
+ require 'chef/version'
38
+ require 'ohai'
39
+
40
+ class Chef
41
+ # == Chef::Client
42
+ # The main object in a Chef run. Preps a Chef::Node and Chef::RunContext,
43
+ # syncs cookbooks if necessary, and triggers convergence.
44
+ class Client
45
+
46
+ SANE_PATHS = %w[/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin]
47
+
48
+ # Clears all notifications for client run status events.
49
+ # Primarily for testing purposes.
50
+ def self.clear_notifications
51
+ @run_start_notifications = nil
52
+ @run_completed_successfully_notifications = nil
53
+ @run_failed_notifications = nil
54
+ end
55
+
56
+ # The list of notifications to be run when the client run starts.
57
+ def self.run_start_notifications
58
+ @run_start_notifications ||= []
59
+ end
60
+
61
+ # The list of notifications to be run when the client run completes
62
+ # successfully.
63
+ def self.run_completed_successfully_notifications
64
+ @run_completed_successfully_notifications ||= []
65
+ end
66
+
67
+ # The list of notifications to be run when the client run fails.
68
+ def self.run_failed_notifications
69
+ @run_failed_notifications ||= []
70
+ end
71
+
72
+ # Add a notification for the 'client run started' event. The notification
73
+ # is provided as a block. The current Chef::RunStatus object will be passed
74
+ # to the notification_block when the event is triggered.
75
+ def self.when_run_starts(&notification_block)
76
+ run_start_notifications << notification_block
77
+ end
78
+
79
+ # Add a notification for the 'client run success' event. The notification
80
+ # is provided as a block. The current Chef::RunStatus object will be passed
81
+ # to the notification_block when the event is triggered.
82
+ def self.when_run_completes_successfully(&notification_block)
83
+ run_completed_successfully_notifications << notification_block
84
+ end
85
+
86
+ # Add a notification for the 'client run failed' event. The notification
87
+ # is provided as a block. The current Chef::RunStatus is passed to the
88
+ # notification_block when the event is triggered.
89
+ def self.when_run_fails(&notification_block)
90
+ run_failed_notifications << notification_block
91
+ end
92
+
93
+ # Callback to fire notifications that the Chef run is starting
94
+ def run_started
95
+ self.class.run_start_notifications.each do |notification|
96
+ notification.call(run_status)
97
+ end
98
+ end
99
+
100
+ # Callback to fire notifications that the run completed successfully
101
+ def run_completed_successfully
102
+ self.class.run_completed_successfully_notifications.each do |notification|
103
+ notification.call(run_status)
104
+ end
105
+ end
106
+
107
+ # Callback to fire notifications that the Chef run failed
108
+ def run_failed
109
+ self.class.run_failed_notifications.each do |notification|
110
+ notification.call(run_status)
111
+ end
112
+ end
113
+
114
+ attr_accessor :node
115
+ attr_accessor :ohai
116
+ attr_accessor :rest
117
+ attr_accessor :runner
118
+
119
+ #--
120
+ # TODO: timh/cw: 5-19-2010: json_attribs should be moved to RunContext?
121
+ attr_reader :json_attribs
122
+
123
+ attr_reader :run_status
124
+
125
+ # Creates a new Chef::Client.
126
+ def initialize(json_attribs=nil)
127
+ @json_attribs = json_attribs
128
+ @node = nil
129
+ @run_status = nil
130
+ @runner = nil
131
+ @ohai = Ohai::System.new
132
+ end
133
+
134
+ # Do a full run for this Chef::Client. Calls:
135
+ #
136
+ # * run_ohai - Collect information about the system
137
+ # * build_node - Get the last known state, merge with local changes
138
+ # * register - If not in solo mode, make sure the server knows about this client
139
+ # * sync_cookbooks - If not in solo mode, populate the local cache with the node's cookbooks
140
+ # * converge - Bring this system up to date
141
+ #
142
+ # === Returns
143
+ # true:: Always returns true.
144
+ def run
145
+ run_context = nil
146
+
147
+ Chef::Log.info("*** Chef #{Chef::VERSION} ***")
148
+ enforce_path_sanity
149
+ run_ohai
150
+ register unless Chef::Config[:solo]
151
+ build_node
152
+
153
+ begin
154
+
155
+ run_status.start_clock
156
+ Chef::Log.info("Starting Chef Run for #{node.name}")
157
+ run_started
158
+
159
+ run_context = setup_run_context
160
+ converge(run_context)
161
+ save_updated_node
162
+
163
+ run_status.stop_clock
164
+ Chef::Log.info("Chef Run complete in #{run_status.elapsed_time} seconds")
165
+ run_completed_successfully
166
+ true
167
+ rescue Exception => e
168
+ run_status.stop_clock
169
+ run_status.exception = e
170
+ run_failed
171
+ Chef::Log.debug("Re-raising exception: #{e.class} - #{e.message}\n#{e.backtrace.join("\n ")}")
172
+ raise
173
+ ensure
174
+ run_status = nil
175
+ end
176
+ true
177
+ end
178
+
179
+
180
+ # Configures the Chef::Cookbook::FileVendor class to fetch file from the
181
+ # server or disk as appropriate, creates the run context for this run, and
182
+ # sanity checks the cookbook collection.
183
+ #===Returns
184
+ # Chef::RunContext:: the run context for this run.
185
+ def setup_run_context
186
+ if Chef::Config[:solo]
187
+ Chef::Cookbook::FileVendor.on_create { |manifest| Chef::Cookbook::FileSystemFileVendor.new(manifest, Chef::Config[:cookbook_path]) }
188
+ run_context = Chef::RunContext.new(node, Chef::CookbookCollection.new(Chef::CookbookLoader.new(Chef::Config[:cookbook_path])))
189
+ else
190
+ Chef::Cookbook::FileVendor.on_create { |manifest| Chef::Cookbook::RemoteFileVendor.new(manifest, rest) }
191
+ cookbook_hash = sync_cookbooks
192
+ run_context = Chef::RunContext.new(node, Chef::CookbookCollection.new(cookbook_hash))
193
+ end
194
+ run_status.run_context = run_context
195
+ run_context.load(@run_list_expansion)
196
+ assert_cookbook_path_not_empty(run_context)
197
+ run_context
198
+ end
199
+
200
+ def save_updated_node
201
+ unless Chef::Config[:solo]
202
+ Chef::Log.debug("Saving the current state of node #{node_name}")
203
+ @node.save
204
+ end
205
+ end
206
+
207
+ def run_ohai
208
+ ohai.all_plugins
209
+ end
210
+
211
+ def node_name
212
+ name = Chef::Config[:node_name] || ohai[:fqdn] || ohai[:hostname]
213
+ Chef::Config[:node_name] = name
214
+
215
+ unless name
216
+ msg = "Unable to determine node name: configure node_name or configure the system's hostname and fqdn"
217
+ raise Chef::Exceptions::CannotDetermineNodeName, msg
218
+ end
219
+
220
+ name
221
+ end
222
+
223
+ # Builds a new node object for this client. Starts with querying for the FQDN of the current
224
+ # host (unless it is supplied), then merges in the facts from Ohai.
225
+ #
226
+ # === Returns
227
+ # node<Chef::Node>:: Returns the created node object, also stored in @node
228
+ def build_node
229
+ Chef::Log.debug("Building node object for #{node_name}")
230
+
231
+ if Chef::Config[:solo]
232
+ @node = Chef::Node.build(node_name)
233
+ else
234
+ @node = Chef::Node.find_or_create(node_name)
235
+ end
236
+
237
+ # Allow user to override the environment of a node by specifying
238
+ # a config parameter.
239
+ if Chef::Config[:environment] && !Chef::Config[:environment].chop.empty?
240
+ @node.chef_environment(Chef::Config[:environment])
241
+ end
242
+
243
+ # consume_external_attrs may add items to the run_list. Save the
244
+ # expanded run_list, which we will pass to the server later to
245
+ # determine which versions of cookbooks to use.
246
+ @node.reset_defaults_and_overrides
247
+ @node.consume_external_attrs(ohai.data, @json_attribs)
248
+ if Chef::Config[:solo]
249
+ @run_list_expansion = @node.expand!('disk')
250
+ else
251
+ @run_list_expansion = @node.expand!('server')
252
+ end
253
+
254
+ # @run_list_expansion is a RunListExpansion.
255
+ #
256
+ # Convert @expanded_run_list, which is an
257
+ # Array of Hashes of the form
258
+ # {:name => NAME, :version_constraint => Chef::VersionConstraint },
259
+ # into @expanded_run_list_with_versions, an
260
+ # Array of Strings of the form
261
+ # "#{NAME}@#{VERSION}"
262
+ @expanded_run_list_with_versions = @run_list_expansion.recipes.with_version_constraints_strings
263
+
264
+ Chef::Log.info("Run List is [#{@node.run_list}]")
265
+ Chef::Log.info("Run List expands to [#{@expanded_run_list_with_versions.join(', ')}]")
266
+
267
+ @run_status = Chef::RunStatus.new(@node)
268
+
269
+ @node
270
+ end
271
+
272
+ #
273
+ # === Returns
274
+ # rest<Chef::REST>:: returns Chef::REST connection object
275
+ def register(client_name=node_name, config=Chef::Config)
276
+ if File.exists?(config[:client_key])
277
+ Chef::Log.debug("Client key #{config[:client_key]} is present - skipping registration")
278
+ else
279
+ Chef::Log.info("Client key #{config[:client_key]} is not present - registering")
280
+ Chef::REST.new(config[:client_url], config[:validation_client_name], config[:validation_key]).register(client_name, config[:client_key])
281
+ end
282
+ # We now have the client key, and should use it from now on.
283
+ self.rest = Chef::REST.new(config[:chef_server_url], client_name, config[:client_key])
284
+ end
285
+
286
+ # Sync_cookbooks eagerly loads all files except files and
287
+ # templates. It returns the cookbook_hash -- the return result
288
+ # from /environments/#{node.chef_environment}/cookbook_versions,
289
+ # which we will use for our run_context.
290
+ #
291
+ # === Returns
292
+ # Hash:: The hash of cookbooks with download URLs as given by the server
293
+ def sync_cookbooks
294
+ Chef::Log.debug("Synchronizing cookbooks")
295
+ cookbook_hash = rest.post_rest("environments/#{@node.chef_environment}/cookbook_versions",
296
+ {:run_list => @expanded_run_list_with_versions})
297
+ Chef::CookbookVersion.sync_cookbooks(cookbook_hash)
298
+
299
+ # register the file cache path in the cookbook path so that CookbookLoader actually picks up the synced cookbooks
300
+ Chef::Config[:cookbook_path] = File.join(Chef::Config[:file_cache_path], "cookbooks")
301
+
302
+ cookbook_hash
303
+ end
304
+
305
+ # Converges the node.
306
+ #
307
+ # === Returns
308
+ # true:: Always returns true
309
+ def converge(run_context)
310
+ Chef::Log.debug("Converging node #{node_name}")
311
+ @runner = Chef::Runner.new(run_context)
312
+ runner.converge
313
+ true
314
+ end
315
+
316
+ def enforce_path_sanity(env=ENV)
317
+ if Chef::Config[:enforce_path_sanity] && RUBY_PLATFORM !~ /mswin|mingw32|windows/
318
+ existing_paths = env["PATH"].split(':')
319
+ SANE_PATHS.each do |sane_path|
320
+ unless existing_paths.include?(sane_path)
321
+ env_path = env["PATH"].dup
322
+ env_path << ':' unless env["PATH"].empty?
323
+ env_path << sane_path
324
+ env["PATH"] = env_path
325
+ end
326
+ end
327
+ end
328
+ end
329
+
330
+ private
331
+
332
+ def directory_not_empty?(path)
333
+ File.exists?(path) && (Dir.entries(path).size > 2)
334
+ end
335
+
336
+ def is_last_element?(index, object)
337
+ object.kind_of?(Array) ? index == object.size - 1 : true
338
+ end
339
+
340
+ def assert_cookbook_path_not_empty(run_context)
341
+ if Chef::Config[:solo]
342
+ # Check for cookbooks in the path given
343
+ # Chef::Config[:cookbook_path] can be a string or an array
344
+ # if it's an array, go through it and check each one, raise error at the last one if no files are found
345
+ Chef::Log.debug "Loading from cookbook_path: #{Array(Chef::Config[:cookbook_path]).map { |path| File.expand_path(path) }.join(', ')}"
346
+ Array(Chef::Config[:cookbook_path]).each_with_index do |cookbook_path, index|
347
+ if directory_not_empty?(cookbook_path)
348
+ break
349
+ else
350
+ msg = "No cookbook found in #{Chef::Config[:cookbook_path].inspect}, make sure cookbook_path is set correctly."
351
+ Chef::Log.fatal(msg)
352
+ raise Chef::Exceptions::CookbookNotFound, msg if is_last_element?(index, Chef::Config[:cookbook_path])
353
+ end
354
+ end
355
+ else
356
+ Chef::Log.warn("Node #{node_name} has an empty run list.") if run_context.node.run_list.empty?
357
+ end
358
+
359
+ end
360
+ end
361
+ end
362
+
363
+ # HACK cannot load this first, but it must be loaded.
364
+ require 'chef/cookbook_loader'
365
+ require 'chef/cookbook_version'
366
+