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,65 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@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
+
19
+ require 'chef/config'
20
+ require 'uri'
21
+ require 'chef/rest'
22
+ require 'chef/node'
23
+ require 'chef/role'
24
+ require 'chef/data_bag'
25
+ require 'chef/data_bag_item'
26
+
27
+ class Chef
28
+ class Search
29
+ class Query
30
+
31
+ attr_accessor :rest
32
+
33
+ def initialize(url=nil)
34
+ @rest = Chef::REST.new(url ||Chef::Config[:search_url])
35
+ end
36
+
37
+ # Search Solr for objects of a given type, for a given query. If you give
38
+ # it a block, it will handle the paging for you dynamically.
39
+ def search(type, query="*:*", sort='X_CHEF_id_CHEF_X asc', start=0, rows=1000, &block)
40
+ raise ArgumentError, "Type must be a string or a symbol!" unless (type.kind_of?(String) || type.kind_of?(Symbol))
41
+
42
+ response = @rest.get_rest("search/#{type}?q=#{escape(query)}&sort=#{escape(sort)}&start=#{escape(start)}&rows=#{escape(rows)}")
43
+ if block
44
+ response["rows"].each { |o| block.call(o) unless o.nil?}
45
+ unless (response["start"] + response["rows"].length) >= response["total"]
46
+ nstart = response["start"] + rows
47
+ search(type, query, sort, nstart, rows, &block)
48
+ end
49
+ true
50
+ else
51
+ [ response["rows"], response["start"], response["total"] ]
52
+ end
53
+ end
54
+
55
+ def list_indexes
56
+ response = @rest.get_rest("search")
57
+ end
58
+
59
+ private
60
+ def escape(s)
61
+ s && URI.escape(s.to_s)
62
+ end
63
+ end
64
+ end
65
+ end
data/lib/chef/shef.rb ADDED
@@ -0,0 +1,327 @@
1
+ # Author:: Daniel DeLeo (<dan@kallistec.com>)
2
+ # Copyright:: Copyright (c) 2009 Daniel DeLeo
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require 'singleton'
19
+ require 'pp'
20
+ require 'etc'
21
+ require 'mixlib/cli'
22
+
23
+ require 'chef'
24
+ require 'chef/version'
25
+ require 'chef/client'
26
+ require 'chef/config'
27
+
28
+ require 'chef/shef/shef_session'
29
+ require 'chef/shef/ext'
30
+ require 'chef/json_compat'
31
+
32
+ # = Shef
33
+ # Shef is Chef in an IRB session. Shef can interact with a Chef server via the
34
+ # REST API, and run and debug recipes interactively.
35
+ module Shef
36
+ LEADERS = Hash.new("")
37
+ LEADERS[Chef::Recipe] = ":recipe"
38
+ LEADERS[Chef::Node] = ":attributes"
39
+
40
+ class << self
41
+ attr_accessor :client_type
42
+ attr_accessor :options
43
+ attr_accessor :env
44
+ attr_writer :editor
45
+ end
46
+
47
+ # Start the irb REPL with shef's customizations
48
+ def self.start
49
+ setup_logger
50
+ # FUGLY HACK: irb gives us no other choice.
51
+ irb_help = [:help, :irb_help, IRB::ExtendCommandBundle::NO_OVERRIDE]
52
+ IRB::ExtendCommandBundle.instance_variable_get(:@ALIASES).delete(irb_help)
53
+
54
+ parse_opts
55
+
56
+ # HACK: this duplicates the functions of IRB.start, but we have to do it
57
+ # to get access to the main object before irb starts.
58
+ ::IRB.setup(nil)
59
+
60
+ irb = IRB::Irb.new
61
+
62
+ init(irb.context.main)
63
+
64
+
65
+ irb_conf[:IRB_RC].call(irb.context) if irb_conf[:IRB_RC]
66
+ irb_conf[:MAIN_CONTEXT] = irb.context
67
+
68
+ trap("SIGINT") do
69
+ irb.signal_handle
70
+ end
71
+
72
+ catch(:IRB_EXIT) do
73
+ irb.eval_input
74
+ end
75
+ end
76
+
77
+ def self.setup_logger
78
+ Chef::Config[:log_level] ||= :warn
79
+ Chef::Log.init(STDERR)
80
+ Mixlib::Authentication::Log.logger = Ohai::Log.logger = Chef::Log.logger
81
+ Chef::Log.level = Chef::Config[:log_level] || :warn
82
+ end
83
+
84
+ # Shef assumes it's running whenever it is defined
85
+ def self.running?
86
+ true
87
+ end
88
+
89
+ # Set the irb_conf object to something other than IRB.conf
90
+ # usful for testing.
91
+ def self.irb_conf=(conf_hash)
92
+ @irb_conf = conf_hash
93
+ end
94
+
95
+ def self.irb_conf
96
+ @irb_conf || IRB.conf
97
+ end
98
+
99
+ def self.configure_irb
100
+ irb_conf[:HISTORY_FILE] = "~/.shef_history"
101
+ irb_conf[:SAVE_HISTORY] = 1000
102
+
103
+ irb_conf[:IRB_RC] = lambda do |conf|
104
+ m = conf.main
105
+
106
+ conf.prompt_c = "chef#{leader(m)} > "
107
+ conf.return_format = " => %s \n"
108
+ conf.prompt_i = "chef#{leader(m)} > "
109
+ conf.prompt_n = "chef#{leader(m)} ?> "
110
+ conf.prompt_s = "chef#{leader(m)}%l> "
111
+ end
112
+ end
113
+
114
+ def self.leader(main_object)
115
+ env_string = Shef.env ? " (#{Shef.env})" : ""
116
+ LEADERS[main_object.class] + env_string
117
+ end
118
+
119
+ def self.session
120
+ unless client_type.instance.node_built?
121
+ puts "Session type: #{client_type.session_type}"
122
+ client_type.instance.reset!
123
+ end
124
+ client_type.instance
125
+ end
126
+
127
+ def self.init(main)
128
+ parse_json
129
+ configure_irb
130
+
131
+ session # trigger ohai run + session load
132
+
133
+ session.node.consume_attributes(@json_attribs)
134
+
135
+ Extensions.extend_context_object(main)
136
+
137
+ main.version
138
+ puts
139
+
140
+ puts "run `help' for help, `exit' or ^D to quit."
141
+ puts
142
+ puts "Ohai2u#{greeting}!"
143
+ end
144
+
145
+ def self.greeting
146
+ " #{Etc.getlogin}@#{Shef.session.node.fqdn}"
147
+ rescue NameError
148
+ ""
149
+ end
150
+
151
+ def self.parse_json
152
+ # HACK: copied verbatim from chef/application/client, because it's not
153
+ # reusable as written there :(
154
+ if Chef::Config[:json_attribs]
155
+ begin
156
+ json_io = open(Chef::Config[:json_attribs])
157
+ rescue SocketError => error
158
+ fatal!("I cannot connect to #{Chef::Config[:json_attribs]}", 2)
159
+ rescue Errno::ENOENT => error
160
+ fatal!("I cannot find #{Chef::Config[:json_attribs]}", 2)
161
+ rescue Errno::EACCES => error
162
+ fatal!("Permissions are incorrect on #{Chef::Config[:json_attribs]}. Please chmod a+r #{Chef::Config[:json_attribs]}", 2)
163
+ rescue Exception => error
164
+ fatal!("Got an unexpected error reading #{Chef::Config[:json_attribs]}: #{error.message}", 2)
165
+ end
166
+
167
+ begin
168
+ @json_attribs = Chef::JSONCompat.from_json(json_io.read)
169
+ rescue JSON::ParserError => error
170
+ fatal!("Could not parse the provided JSON file (#{Chef::Config[:json_attribs]})!: " + error.message, 2)
171
+ end
172
+ end
173
+ end
174
+
175
+ def self.fatal!(message, exit_status)
176
+ Chef::Log.fatal(message)
177
+ exit exit_status
178
+ end
179
+
180
+ def self.client_type
181
+ type = Shef::StandAloneSession
182
+ type = Shef::SoloSession if Chef::Config[:shef_solo]
183
+ type = Shef::ClientSession if Chef::Config[:client]
184
+ type = Shef::DoppelGangerSession if Chef::Config[:doppelganger]
185
+ type
186
+ end
187
+
188
+ def self.parse_opts
189
+ @options = Options.new
190
+ @options.parse_opts
191
+ end
192
+
193
+ def self.editor
194
+ @editor || Chef::Config[:editor] || ENV['EDITOR']
195
+ end
196
+
197
+ class Options
198
+ include Mixlib::CLI
199
+
200
+ def self.footer(text=nil)
201
+ @footer = text if text
202
+ @footer
203
+ end
204
+
205
+ banner("shef #{Chef::VERSION}\n\nUsage: shef [NAMED_CONF] (OPTIONS)")
206
+
207
+ footer(<<-FOOTER)
208
+ When no CONFIG is specified, shef attempts to load a default configuration file:
209
+ * If a NAMED_CONF is given, shef will load ~/.chef/NAMED_CONF/shef.rb
210
+ * If no NAMED_CONF is given shef will load ~/.chef/shef.rb if it exists
211
+ * Shef falls back to loading /etc/chef/client.rb or /etc/chef/solo.rb if -z or
212
+ -s options are given and no shef.rb can be found.
213
+ FOOTER
214
+
215
+ option :config_file,
216
+ :short => "-c CONFIG",
217
+ :long => "--config CONFIG",
218
+ :description => "The configuration file to use"
219
+
220
+ option :help,
221
+ :short => "-h",
222
+ :long => "--help",
223
+ :description => "Show this message",
224
+ :on => :tail,
225
+ :boolean => true,
226
+ :proc => proc { print_help }
227
+
228
+ option :log_level,
229
+ :short => "-l LOG_LEVEL",
230
+ :long => '--log-level LOG_LEVEL',
231
+ :description => "Set the logging level",
232
+ :proc => proc { |level| Chef::Log.level = level.to_sym }
233
+
234
+ option :standalone,
235
+ :short => "-a",
236
+ :long => "--standalone",
237
+ :description => "standalone shef session",
238
+ :default => true,
239
+ :boolean => true
240
+
241
+ option :shef_solo,
242
+ :short => "-s",
243
+ :long => "--solo",
244
+ :description => "chef-solo shef session",
245
+ :boolean => true,
246
+ :proc => proc {Chef::Config[:solo] = true}
247
+
248
+ option :client,
249
+ :short => "-z",
250
+ :long => "--client",
251
+ :description => "chef-client shef session",
252
+ :boolean => true
253
+
254
+ option :json_attribs,
255
+ :short => "-j JSON_ATTRIBS",
256
+ :long => "--json-attributes JSON_ATTRIBS",
257
+ :description => "Load attributes from a JSON file or URL",
258
+ :proc => nil
259
+
260
+ option :chef_server_url,
261
+ :short => "-S CHEFSERVERURL",
262
+ :long => "--server CHEFSERVERURL",
263
+ :description => "The chef server URL",
264
+ :proc => nil
265
+
266
+ option :version,
267
+ :short => "-v",
268
+ :long => "--version",
269
+ :description => "Show chef version",
270
+ :boolean => true,
271
+ :proc => lambda {|v| puts "Chef: #{::Chef::VERSION}"},
272
+ :exit => 0
273
+
274
+ def self.print_help
275
+ instance = new
276
+ instance.parse_options([])
277
+ puts instance.opt_parser
278
+ puts
279
+ puts footer
280
+ puts
281
+ exit 1
282
+ end
283
+
284
+ def self.setup!
285
+ self.new.parse_opts
286
+ end
287
+
288
+ def parse_opts
289
+ remainder = parse_options
290
+ environment = remainder.first
291
+ # We have to nuke ARGV to make sure irb's option parser never sees it.
292
+ # otherwise, IRB complains about command line switches it doesn't recognize.
293
+ ARGV.clear
294
+ config[:config_file] = config_file_for_shef_mode(environment)
295
+ config_msg = config[:config_file] || "none (standalone shef session)"
296
+ puts "loading configuration: #{config_msg}"
297
+ Chef::Config.from_file(config[:config_file]) if !config[:config_file].nil? && File.exists?(config[:config_file]) && File.readable?(config[:config_file])
298
+ Chef::Config.merge!(config)
299
+ end
300
+
301
+ private
302
+
303
+ def config_file_for_shef_mode(environment)
304
+ if config[:config_file]
305
+ config[:config_file]
306
+ elsif environment
307
+ Shef.env = environment
308
+ config_file_to_try = ::File.join(ENV['HOME'], '.chef', environment, 'shef.rb')
309
+ unless ::File.exist?(config_file_to_try)
310
+ puts "could not find shef config for environment #{environment} at #{config_file_to_try}"
311
+ exit 1
312
+ end
313
+ config_file_to_try
314
+ elsif ENV['HOME'] && ::File.exist?(File.join(ENV['HOME'], '.chef', 'shef.rb'))
315
+ File.join(ENV['HOME'], '.chef', 'shef.rb')
316
+ elsif config[:solo]
317
+ "/etc/chef/solo.rb"
318
+ elsif config[:client]
319
+ "/etc/chef/client.rb"
320
+ else
321
+ nil
322
+ end
323
+ end
324
+
325
+ end
326
+
327
+ end
@@ -0,0 +1,569 @@
1
+ #--
2
+ # Author:: Daniel DeLeo (<dan@kallistec.com>)
3
+ # Copyright:: Copyright (c) 2009 Daniel DeLeo
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'tempfile'
20
+ require 'chef/recipe'
21
+ require 'fileutils'
22
+ require 'chef/version'
23
+ require 'chef/shef/shef_session'
24
+ require 'chef/shef/model_wrapper'
25
+ require 'chef/shef/shef_rest'
26
+ require 'chef/json_compat'
27
+
28
+ module Shef
29
+ module Extensions
30
+
31
+ Help = Struct.new(:cmd, :desc, :explanation)
32
+
33
+ # Extensions to be included in every 'main' object in shef. These objects
34
+ # are extended with this module.
35
+ module ObjectCoreExtensions
36
+
37
+ def ensure_session_select_defined
38
+ # irb breaks if you prematurely define IRB::JobMangager
39
+ # so these methods need to be defined at the latest possible time.
40
+ unless jobs.respond_to?(:select_session_by_context)
41
+ def jobs.select_session_by_context(&block)
42
+ @jobs.select { |job| block.call(job[1].context.main)}
43
+ end
44
+ end
45
+
46
+ unless jobs.respond_to?(:session_select)
47
+ def jobs.select_shef_session(target_context)
48
+ session = if target_context.kind_of?(Class)
49
+ select_session_by_context { |main| main.kind_of?(target_context) }
50
+ else
51
+ select_session_by_context { |main| main.equal?(target_context) }
52
+ end
53
+ Array(session.first)[1]
54
+ end
55
+ end
56
+ end
57
+
58
+ def find_or_create_session_for(context_obj)
59
+ ensure_session_select_defined
60
+ if subsession = jobs.select_shef_session(context_obj)
61
+ jobs.switch(subsession)
62
+ else
63
+ irb(context_obj)
64
+ end
65
+ end
66
+
67
+ def help_banner
68
+ banner = []
69
+ banner << ""
70
+ banner << "Shef Help"
71
+ banner << "".ljust(80, "=")
72
+ banner << "| " + "Command".ljust(25) + "| " + "Description"
73
+ banner << "".ljust(80, "=")
74
+
75
+ self.all_help_descriptions.each do |help_text|
76
+ banner << "| " + help_text.cmd.ljust(25) + "| " + help_text.desc
77
+ end
78
+ banner << "".ljust(80, "=")
79
+ banner << "\n"
80
+ banner << "Use help(:command) to get detailed help with individual commands"
81
+ banner << "\n"
82
+ banner.join("\n")
83
+ end
84
+
85
+ def explain_command(method_name)
86
+ help = self.all_help_descriptions.find { |h| h.cmd.to_s == method_name.to_s }
87
+ if help
88
+ puts ""
89
+ puts "Command: #{method_name}"
90
+ puts "".ljust(80, "=")
91
+ puts help.explanation || help.desc
92
+ puts "".ljust(80, "=")
93
+ puts ""
94
+ else
95
+ puts ""
96
+ puts "command #{method_name} not found or no help available"
97
+ puts ""
98
+ end
99
+ end
100
+
101
+ # helpfully returns +:on+ so we can have sugary syntax like `tracing on'
102
+ def on
103
+ :on
104
+ end
105
+
106
+ # returns +:off+ so you can just do `tracing off'
107
+ def off
108
+ :off
109
+ end
110
+
111
+ def help_descriptions
112
+ @help_descriptions ||= []
113
+ end
114
+
115
+ def all_help_descriptions
116
+ help_descriptions
117
+ end
118
+
119
+ def desc(help_text)
120
+ @desc = help_text
121
+ end
122
+
123
+ def explain(explain_text)
124
+ @explain = explain_text
125
+ end
126
+
127
+ def subcommands(subcommand_help={})
128
+ @subcommand_help = subcommand_help
129
+ end
130
+
131
+ def singleton_method_added(mname)
132
+ if @desc
133
+ help_descriptions << Help.new(mname.to_s, @desc.to_s, @explain)
134
+ @desc, @explain = nil, nil
135
+ end
136
+ if @subcommand_help
137
+ @subcommand_help.each do |subcommand, text|
138
+ help_descriptions << Help.new("#{mname}.#{subcommand}", text.to_s, nil)
139
+ end
140
+ end
141
+ @subcommand_help = {}
142
+ end
143
+
144
+ end
145
+
146
+ module String
147
+ def on_off_to_bool
148
+ case self
149
+ when "on"
150
+ true
151
+ when "off"
152
+ false
153
+ else
154
+ self
155
+ end
156
+ end
157
+ end
158
+
159
+ module Symbol
160
+ def on_off_to_bool
161
+ self.to_s.on_off_to_bool
162
+ end
163
+ end
164
+
165
+ module TrueClass
166
+ def to_on_off_str
167
+ "on"
168
+ end
169
+
170
+ def on_off_to_bool
171
+ self
172
+ end
173
+ end
174
+
175
+ module FalseClass
176
+ def to_on_off_str
177
+ "off"
178
+ end
179
+
180
+ def on_off_to_bool
181
+ self
182
+ end
183
+ end
184
+
185
+ # Methods that have associated help text need to be dynamically added
186
+ # to the main irb objects, so we define them in a proc and later
187
+ # instance_eval the proc in the object.
188
+ ObjectUIExtensions = Proc.new do
189
+ extend Shef::Extensions::ObjectCoreExtensions
190
+
191
+ desc "prints this help message"
192
+ explain(<<-E)
193
+ ## SUMMARY ##
194
+ When called with no argument, +help+ prints a table of all shef commands. When
195
+ called with an argument COMMAND, +help+ prints a detailed explanation of the
196
+ command if available, or the description if no explanation is available.
197
+ E
198
+ def help(commmand=nil)
199
+ if commmand
200
+ explain_command(commmand)
201
+ else
202
+ puts help_banner
203
+ end
204
+ :ucanhaz_halp
205
+ end
206
+ alias :halp :help
207
+
208
+ desc "prints information about chef"
209
+ def version
210
+ puts "This is shef, the Chef shell.\n" +
211
+ " Chef Version: #{::Chef::VERSION}\n" +
212
+ " http://www.opscode.com/chef\n" +
213
+ " http://wiki.opscode.com/display/chef/Home"
214
+ :ucanhaz_automation
215
+ end
216
+ alias :shef :version
217
+
218
+ desc "switch to recipe mode"
219
+ def recipe
220
+ find_or_create_session_for Shef.session.recipe
221
+ :recipe
222
+ end
223
+
224
+ desc "switch to attributes mode"
225
+ def attributes
226
+ find_or_create_session_for Shef.session.node
227
+ :attributes
228
+ end
229
+
230
+ desc "run chef using the current recipe"
231
+ def run_chef
232
+ Chef::Log.level = :debug
233
+ session = Shef.session
234
+ runrun = Chef::Runner.new(session.run_context).converge
235
+ Chef::Log.level = :info
236
+ runrun
237
+ end
238
+
239
+ desc "returns an object to control a paused chef run"
240
+ subcommands :resume => "resume the chef run",
241
+ :step => "run only the next resource",
242
+ :skip_back => "move back in the run list",
243
+ :skip_forward => "move forward in the run list"
244
+ def chef_run
245
+ Shef.session.resource_collection.iterator
246
+ end
247
+
248
+ desc "resets the current recipe"
249
+ def reset
250
+ Shef.session.reset!
251
+ end
252
+
253
+ desc "assume the identity of another node."
254
+ def become_node(node_name)
255
+ Shef::DoppelGangerSession.instance.assume_identity(node_name)
256
+ :doppelganger
257
+ end
258
+ alias :doppelganger :become_node
259
+
260
+ desc "turns printout of return values on or off"
261
+ def echo(on_or_off)
262
+ conf.echo = on_or_off.on_off_to_bool
263
+ end
264
+
265
+ desc "says if echo is on or off"
266
+ def echo?
267
+ puts "echo is #{conf.echo.to_on_off_str}"
268
+ end
269
+
270
+ desc "turns on or off tracing of execution. *verbose*"
271
+ def tracing(on_or_off)
272
+ conf.use_tracer = on_or_off.on_off_to_bool
273
+ tracing?
274
+ end
275
+ alias :trace :tracing
276
+
277
+ desc "says if tracing is on or off"
278
+ def tracing?
279
+ puts "tracing is #{conf.use_tracer.to_on_off_str}"
280
+ end
281
+ alias :trace? :tracing?
282
+
283
+ desc "simple ls style command"
284
+ def ls(directory)
285
+ Dir.entries(directory)
286
+ end
287
+ end
288
+
289
+ MainContextExtensions = Proc.new do
290
+ desc "returns the current node (i.e., this host)"
291
+ def node
292
+ Shef.session.node
293
+ end
294
+
295
+ desc "pretty print the node's attributes"
296
+ def ohai(key=nil)
297
+ pp(key ? node.attribute[key] : node.attribute)
298
+ end
299
+ end
300
+
301
+ RESTApiExtensions = Proc.new do
302
+ desc "edit an object in your EDITOR"
303
+ explain(<<-E)
304
+ ## SUMMARY ##
305
+ +edit(object)+ allows you to edit any object that can be converted to JSON.
306
+ When finished editing, this method will return the edited object:
307
+
308
+ new_node = edit(existing_node)
309
+
310
+ ## EDITOR SELECTION ##
311
+ Shef looks for an editor using the following logic
312
+ 1. Looks for an EDITOR set by Shef.editor = "EDITOR"
313
+ 2. Looks for an EDITOR configured in your shef config file
314
+ 3. Uses the value of the EDITOR environment variable
315
+ E
316
+ def edit(object)
317
+ unless Shef.editor
318
+ puts "Please set your editor with Shef.editor = \"vim|emacs|mate|ed\""
319
+ return :failburger
320
+ end
321
+
322
+ filename = "shef-edit-#{object.class.name}-"
323
+ if object.respond_to?(:name)
324
+ filename += object.name
325
+ elsif object.respond_to?(:id)
326
+ filename += object.id
327
+ end
328
+
329
+ edited_data = Tempfile.open([filename, ".js"]) do |tempfile|
330
+ tempfile.sync = true
331
+ tempfile.puts Chef::JSONCompat.to_json(object)
332
+ system("#{Shef.editor.to_s} #{tempfile.path}")
333
+ tempfile.rewind
334
+ tempfile.read
335
+ end
336
+
337
+ Chef::JSONCompat.from_json(edited_data)
338
+ end
339
+
340
+ desc "Find and edit API clients"
341
+ explain(<<-E)
342
+ ## SUMMARY ##
343
+ +clients+ allows you to query you chef server for information about your api
344
+ clients.
345
+
346
+ ## LIST ALL CLIENTS ##
347
+ To see all clients on the system, use
348
+
349
+ clients.all #=> [<Chef::ApiClient...>, ...]
350
+
351
+ If the output from all is too verbose, or you're only interested in a specific
352
+ value from each of the objects, you can give a code block to +all+:
353
+
354
+ clients.all { |client| client.name } #=> [CLIENT1_NAME, CLIENT2_NAME, ...]
355
+
356
+ ## SHOW ONE CLIENT ##
357
+ To see a specific client, use
358
+
359
+ clients.show(CLIENT_NAME)
360
+
361
+ ## SEARCH FOR CLIENTS ##
362
+ You can also search for clients using +find+ or +search+. You can use the
363
+ familiar string search syntax:
364
+
365
+ clients.search("KEY:VALUE")
366
+
367
+ Just as the +all+ subcommand, the +search+ subcommand can use a code block to
368
+ filter or transform the information returned from the search:
369
+
370
+ clients.search("KEY:VALUE") { |c| c.name }
371
+
372
+ You can also use a Hash based syntax, multiple search conditions will be
373
+ joined with AND.
374
+
375
+ clients.find :KEY => :VALUE, :KEY2 => :VALUE2, ...
376
+
377
+ ## BULK-EDIT CLIENTS ##
378
+ **BE CAREFUL, THIS IS DESTRUCTIVE**
379
+ You can bulk edit API Clients using the +transform+ subcommand, which requires
380
+ a code block. Each client will be saved after the code block is run. If the
381
+ code block returns +nil+ or +false+, that client will be skipped:
382
+
383
+ clients.transform("*:*") do |client|
384
+ if client.name =~ /borat/i
385
+ client.admin(false)
386
+ true
387
+ else
388
+ nil
389
+ end
390
+ end
391
+
392
+ This will strip the admin privileges from any client named after borat.
393
+ E
394
+ subcommands :all => "list all api clients",
395
+ :show => "load an api client by name",
396
+ :search => "search for API clients",
397
+ :transform => "edit all api clients via a code block and save them"
398
+ def clients
399
+ @clients ||= Shef::ModelWrapper.new(Chef::ApiClient, :client)
400
+ end
401
+
402
+ desc "Find and edit cookbooks"
403
+ subcommands :all => "list all cookbooks",
404
+ :show => "load a cookbook by name",
405
+ :transform => "edit all cookbooks via a code block and save them"
406
+ def cookbooks
407
+ @cookbooks ||= Shef::ModelWrapper.new(Chef::CookbookVersion)
408
+ end
409
+
410
+ desc "Find and edit nodes via the API"
411
+ explain(<<-E)
412
+ ## SUMMARY ##
413
+ +nodes+ Allows you to query your chef server for information about your nodes.
414
+
415
+ ## LIST ALL NODES ##
416
+ You can list all nodes using +all+ or +list+
417
+
418
+ nodes.all #=> [<Chef::Node...>, <Chef::Node...>, ...]
419
+
420
+ To limit the information returned for each node, pass a code block to the +all+
421
+ subcommand:
422
+
423
+ nodes.all { |node| node.name } #=> [NODE1_NAME, NODE2_NAME, ...]
424
+
425
+ ## SHOW ONE NODE ##
426
+ You can show the data for a single node using the +show+ subcommand:
427
+
428
+ nodes.show("NODE_NAME") => <Chef::Node @name="NODE_NAME" ...>
429
+
430
+ ## SEARCH FOR NODES ##
431
+ You can search for nodes using the +search+ or +find+ subcommands:
432
+
433
+ nodes.find(:name => "app*") #=> [<Chef::Node @name="app1.example.com" ...>, ...]
434
+
435
+ Similarly to +all+, you can pass a code block to limit or transform the
436
+ information returned:
437
+
438
+ nodes.find(:name => "app#") { |node| node.ec2 }
439
+
440
+ ## BULK EDIT NODES ##
441
+ **BE CAREFUL, THIS OPERATION IS DESTRUCTIVE**
442
+
443
+ Bulk edit nodes by passing a code block to the +transform+ or +bulk_edit+
444
+ subcommand. The block will be applied to each matching node, and then the node
445
+ will be saved. If the block returns +nil+ or +false+, that node will be
446
+ skipped.
447
+
448
+ nodes.transform do |node|
449
+ if node.fqdn =~ /.*\\.preprod\\.example\\.com/
450
+ node.set[:environment] = "preprod"
451
+ end
452
+ end
453
+
454
+ This will assign the attribute to every node with a FQDN matching the regex.
455
+ E
456
+ subcommands :all => "list all nodes",
457
+ :show => "load a node by name",
458
+ :search => "search for nodes",
459
+ :transform => "edit all nodes via a code block and save them"
460
+ def nodes
461
+ @nodes ||= Shef::ModelWrapper.new(Chef::Node)
462
+ end
463
+
464
+ desc "Find and edit roles via the API"
465
+ explain(<<-E)
466
+ ## SUMMARY ##
467
+ +roles+ allows you to query and edit roles on your Chef server.
468
+
469
+ ## SUBCOMMANDS ##
470
+ * all (list)
471
+ * show (load)
472
+ * search (find)
473
+ * transform (bulk_edit)
474
+
475
+ ## SEE ALSO ##
476
+ See the help for +nodes+ for more information about the subcommands.
477
+ E
478
+ subcommands :all => "list all roles",
479
+ :show => "load a role by name",
480
+ :search => "search for roles",
481
+ :transform => "edit all roles via a code block and save them"
482
+ def roles
483
+ @roles ||= Shef::ModelWrapper.new(Chef::Role)
484
+ end
485
+
486
+ desc "Find and edit +databag_name+ via the api"
487
+ explain(<<-E)
488
+ ## SUMMARY ##
489
+ +databags(DATABAG_NAME)+ allows you to query and edit data bag items on your
490
+ Chef server. Unlike other commands for working with data on the server,
491
+ +databags+ requires the databag name as an argument, for example:
492
+ databags(:users).all
493
+
494
+ ## SUBCOMMANDS ##
495
+ * all (list)
496
+ * show (load)
497
+ * search (find)
498
+ * transform (bulk_edit)
499
+
500
+ ## SEE ALSO ##
501
+ See the help for +nodes+ for more information about the subcommands.
502
+
503
+ E
504
+ subcommands :all => "list all items in the data bag",
505
+ :show => "load a data bag item by id",
506
+ :search => "search for items in the data bag",
507
+ :transform => "edit all items via a code block and save them"
508
+ def databags(databag_name)
509
+ @named_databags_wrappers ||= {}
510
+ @named_databags_wrappers[databag_name] ||= Shef::NamedDataBagWrapper.new(databag_name)
511
+ end
512
+
513
+ desc "A REST Client configured to authenticate with the API"
514
+ def api
515
+ @rest = Shef::ShefREST.new(Chef::Config[:chef_server_url])
516
+ end
517
+
518
+ end
519
+
520
+ RecipeUIExtensions = Proc.new do
521
+ alias :original_resources :resources
522
+
523
+ desc "list all the resources on the current recipe"
524
+ def resources(*args)
525
+ if args.empty?
526
+ pp run_context.resource_collection.instance_variable_get(:@resources_by_name).keys
527
+ else
528
+ pp resources = original_resources(*args)
529
+ resources
530
+ end
531
+ end
532
+ end
533
+
534
+ def self.extend_context_object(obj)
535
+ obj.instance_eval(&ObjectUIExtensions)
536
+ obj.instance_eval(&MainContextExtensions)
537
+ obj.instance_eval(&RESTApiExtensions)
538
+ obj.extend(FileUtils)
539
+ obj.extend(Chef::Mixin::Language)
540
+ end
541
+
542
+ def self.extend_context_node(node_obj)
543
+ node_obj.instance_eval(&ObjectUIExtensions)
544
+ end
545
+
546
+ def self.extend_context_recipe(recipe_obj)
547
+ recipe_obj.instance_eval(&ObjectUIExtensions)
548
+ recipe_obj.instance_eval(&RecipeUIExtensions)
549
+ end
550
+
551
+ end
552
+ end
553
+
554
+ class String
555
+ include Shef::Extensions::String
556
+ end
557
+
558
+ class Symbol
559
+ include Shef::Extensions::Symbol
560
+ end
561
+
562
+ class TrueClass
563
+ include Shef::Extensions::TrueClass
564
+ end
565
+
566
+ class FalseClass
567
+ include Shef::Extensions::FalseClass
568
+ end
569
+