mbailey-chef 0.9.12.1

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 (345) hide show
  1. data/LICENSE +201 -0
  2. data/README.rdoc +172 -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/common/man/man1/chef-indexer.1 +42 -0
  9. data/distro/common/man/man1/chef-server-webui.1 +106 -0
  10. data/distro/common/man/man1/chef-server.1 +107 -0
  11. data/distro/common/man/man1/chef-solr-indexer.1 +55 -0
  12. data/distro/common/man/man1/chef-solr.1 +55 -0
  13. data/distro/common/man/man8/chef-client.8 +63 -0
  14. data/distro/common/man/man8/chef-solo.8 +57 -0
  15. data/distro/common/man/man8/chef-solr-rebuild.8 +37 -0
  16. data/distro/common/man/man8/knife.8 +1349 -0
  17. data/distro/common/man/man8/shef.8 +45 -0
  18. data/distro/common/markdown/README +3 -0
  19. data/distro/common/markdown/knife.mkd +832 -0
  20. data/distro/debian/etc/default/chef-client +4 -0
  21. data/distro/debian/etc/default/chef-server +9 -0
  22. data/distro/debian/etc/default/chef-server-webui +9 -0
  23. data/distro/debian/etc/default/chef-solr +7 -0
  24. data/distro/debian/etc/default/chef-solr-indexer +7 -0
  25. data/distro/debian/etc/init/chef-client.conf +17 -0
  26. data/distro/debian/etc/init/chef-server-webui.conf +17 -0
  27. data/distro/debian/etc/init/chef-server.conf +17 -0
  28. data/distro/debian/etc/init/chef-solr-indexer.conf +17 -0
  29. data/distro/debian/etc/init/chef-solr.conf +17 -0
  30. data/distro/debian/etc/init.d/chef-client +175 -0
  31. data/distro/debian/etc/init.d/chef-server +122 -0
  32. data/distro/debian/etc/init.d/chef-server-webui +123 -0
  33. data/distro/debian/etc/init.d/chef-solr +177 -0
  34. data/distro/debian/etc/init.d/chef-solr-indexer +176 -0
  35. data/distro/redhat/etc/init.d/chef-client +106 -0
  36. data/distro/redhat/etc/init.d/chef-server +112 -0
  37. data/distro/redhat/etc/init.d/chef-server-webui +112 -0
  38. data/distro/redhat/etc/init.d/chef-solr +104 -0
  39. data/distro/redhat/etc/init.d/chef-solr-indexer +104 -0
  40. data/distro/redhat/etc/logrotate.d/chef-client +8 -0
  41. data/distro/redhat/etc/logrotate.d/chef-server +8 -0
  42. data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
  43. data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
  44. data/distro/redhat/etc/logrotate.d/chef-solr-indexer +8 -0
  45. data/distro/redhat/etc/sysconfig/chef-client +15 -0
  46. data/distro/redhat/etc/sysconfig/chef-server +14 -0
  47. data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
  48. data/distro/redhat/etc/sysconfig/chef-solr +8 -0
  49. data/distro/redhat/etc/sysconfig/chef-solr-indexer +7 -0
  50. data/lib/chef/api_client.rb +264 -0
  51. data/lib/chef/application/agent.rb +18 -0
  52. data/lib/chef/application/client.rb +246 -0
  53. data/lib/chef/application/knife.rb +171 -0
  54. data/lib/chef/application/solo.rb +215 -0
  55. data/lib/chef/application.rb +127 -0
  56. data/lib/chef/applications.rb +4 -0
  57. data/lib/chef/certificate.rb +194 -0
  58. data/lib/chef/checksum.rb +182 -0
  59. data/lib/chef/checksum_cache.rb +173 -0
  60. data/lib/chef/client.rb +304 -0
  61. data/lib/chef/config.rb +240 -0
  62. data/lib/chef/cookbook/cookbook_collection.rb +44 -0
  63. data/lib/chef/cookbook/file_system_file_vendor.rb +54 -0
  64. data/lib/chef/cookbook/file_vendor.rb +48 -0
  65. data/lib/chef/cookbook/metadata/version.rb +87 -0
  66. data/lib/chef/cookbook/metadata.rb +500 -0
  67. data/lib/chef/cookbook/remote_file_vendor.rb +87 -0
  68. data/lib/chef/cookbook/syntax_check.rb +136 -0
  69. data/lib/chef/cookbook_loader.rb +227 -0
  70. data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
  71. data/lib/chef/cookbook_uploader.rb +103 -0
  72. data/lib/chef/cookbook_version.rb +930 -0
  73. data/lib/chef/couchdb.rb +239 -0
  74. data/lib/chef/daemon.rb +172 -0
  75. data/lib/chef/data_bag.rb +215 -0
  76. data/lib/chef/data_bag_item.rb +228 -0
  77. data/lib/chef/exceptions.rb +66 -0
  78. data/lib/chef/file_access_control.rb +140 -0
  79. data/lib/chef/file_cache.rb +218 -0
  80. data/lib/chef/handler/json_file.rb +58 -0
  81. data/lib/chef/handler.rb +206 -0
  82. data/lib/chef/index_queue/amqp_client.rb +113 -0
  83. data/lib/chef/index_queue/consumer.rb +76 -0
  84. data/lib/chef/index_queue/indexable.rb +76 -0
  85. data/lib/chef/index_queue.rb +29 -0
  86. data/lib/chef/knife/bootstrap/archlinux-gems.erb +44 -0
  87. data/lib/chef/knife/bootstrap/centos5-gems.erb +41 -0
  88. data/lib/chef/knife/bootstrap/client-install.vbs +80 -0
  89. data/lib/chef/knife/bootstrap/fedora13-gems.erb +38 -0
  90. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +32 -0
  91. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +43 -0
  92. data/lib/chef/knife/bootstrap/windows-gems.erb +34 -0
  93. data/lib/chef/knife/bootstrap.rb +181 -0
  94. data/lib/chef/knife/client_bulk_delete.rb +40 -0
  95. data/lib/chef/knife/client_create.rb +70 -0
  96. data/lib/chef/knife/client_delete.rb +45 -0
  97. data/lib/chef/knife/client_edit.rb +45 -0
  98. data/lib/chef/knife/client_list.rb +40 -0
  99. data/lib/chef/knife/client_reregister.rb +56 -0
  100. data/lib/chef/knife/client_show.rb +50 -0
  101. data/lib/chef/knife/configure.rb +140 -0
  102. data/lib/chef/knife/configure_client.rb +52 -0
  103. data/lib/chef/knife/cookbook_bulk_delete.rb +58 -0
  104. data/lib/chef/knife/cookbook_create.rb +209 -0
  105. data/lib/chef/knife/cookbook_delete.rb +143 -0
  106. data/lib/chef/knife/cookbook_download.rb +130 -0
  107. data/lib/chef/knife/cookbook_list.rb +41 -0
  108. data/lib/chef/knife/cookbook_metadata.rb +82 -0
  109. data/lib/chef/knife/cookbook_metadata_from_file.rb +40 -0
  110. data/lib/chef/knife/cookbook_show.rb +98 -0
  111. data/lib/chef/knife/cookbook_site_download.rb +58 -0
  112. data/lib/chef/knife/cookbook_site_list.rb +56 -0
  113. data/lib/chef/knife/cookbook_site_search.rb +51 -0
  114. data/lib/chef/knife/cookbook_site_share.rb +109 -0
  115. data/lib/chef/knife/cookbook_site_show.rb +57 -0
  116. data/lib/chef/knife/cookbook_site_unshare.rb +52 -0
  117. data/lib/chef/knife/cookbook_site_vendor.rb +133 -0
  118. data/lib/chef/knife/cookbook_test.rb +82 -0
  119. data/lib/chef/knife/cookbook_upload.rb +95 -0
  120. data/lib/chef/knife/data_bag_create.rb +59 -0
  121. data/lib/chef/knife/data_bag_delete.rb +48 -0
  122. data/lib/chef/knife/data_bag_edit.rb +50 -0
  123. data/lib/chef/knife/data_bag_from_file.rb +44 -0
  124. data/lib/chef/knife/data_bag_list.rb +43 -0
  125. data/lib/chef/knife/data_bag_show.rb +41 -0
  126. data/lib/chef/knife/ec2_instance_data.rb +46 -0
  127. data/lib/chef/knife/ec2_server_create.rb +216 -0
  128. data/lib/chef/knife/ec2_server_delete.rb +90 -0
  129. data/lib/chef/knife/ec2_server_list.rb +88 -0
  130. data/lib/chef/knife/exec.rb +52 -0
  131. data/lib/chef/knife/index_rebuild.rb +51 -0
  132. data/lib/chef/knife/node_bulk_delete.rb +43 -0
  133. data/lib/chef/knife/node_create.rb +47 -0
  134. data/lib/chef/knife/node_delete.rb +44 -0
  135. data/lib/chef/knife/node_edit.rb +44 -0
  136. data/lib/chef/knife/node_from_file.rb +42 -0
  137. data/lib/chef/knife/node_list.rb +41 -0
  138. data/lib/chef/knife/node_run_list_add.rb +64 -0
  139. data/lib/chef/knife/node_run_list_remove.rb +45 -0
  140. data/lib/chef/knife/node_show.rb +54 -0
  141. data/lib/chef/knife/rackspace_server_create.rb +156 -0
  142. data/lib/chef/knife/rackspace_server_delete.rb +57 -0
  143. data/lib/chef/knife/rackspace_server_list.rb +59 -0
  144. data/lib/chef/knife/recipe_list.rb +32 -0
  145. data/lib/chef/knife/role_bulk_delete.rb +44 -0
  146. data/lib/chef/knife/role_create.rb +52 -0
  147. data/lib/chef/knife/role_delete.rb +44 -0
  148. data/lib/chef/knife/role_edit.rb +45 -0
  149. data/lib/chef/knife/role_from_file.rb +46 -0
  150. data/lib/chef/knife/role_list.rb +40 -0
  151. data/lib/chef/knife/role_show.rb +51 -0
  152. data/lib/chef/knife/search.rb +94 -0
  153. data/lib/chef/knife/slicehost_images_list.rb +53 -0
  154. data/lib/chef/knife/slicehost_server_create.rb +103 -0
  155. data/lib/chef/knife/slicehost_server_delete.rb +61 -0
  156. data/lib/chef/knife/slicehost_server_list.rb +64 -0
  157. data/lib/chef/knife/ssh.rb +328 -0
  158. data/lib/chef/knife/status.rb +87 -0
  159. data/lib/chef/knife/terremark_server_create.rb +152 -0
  160. data/lib/chef/knife/terremark_server_delete.rb +87 -0
  161. data/lib/chef/knife/terremark_server_list.rb +77 -0
  162. data/lib/chef/knife/windows_bootstrap.rb +154 -0
  163. data/lib/chef/knife.rb +522 -0
  164. data/lib/chef/log.rb +61 -0
  165. data/lib/chef/mixin/check_helper.rb +31 -0
  166. data/lib/chef/mixin/checksum.rb +32 -0
  167. data/lib/chef/mixin/command/unix.rb +215 -0
  168. data/lib/chef/mixin/command/windows.rb +72 -0
  169. data/lib/chef/mixin/command.rb +220 -0
  170. data/lib/chef/mixin/convert_to_class_name.rb +63 -0
  171. data/lib/chef/mixin/create_path.rb +56 -0
  172. data/lib/chef/mixin/deep_merge.rb +225 -0
  173. data/lib/chef/mixin/deprecation.rb +65 -0
  174. data/lib/chef/mixin/find_preferred_file.rb +92 -0
  175. data/lib/chef/mixin/from_file.rb +50 -0
  176. data/lib/chef/mixin/language.rb +156 -0
  177. data/lib/chef/mixin/language_include_attribute.rb +61 -0
  178. data/lib/chef/mixin/language_include_recipe.rb +52 -0
  179. data/lib/chef/mixin/params_validate.rb +225 -0
  180. data/lib/chef/mixin/recipe_definition_dsl_core.rb +81 -0
  181. data/lib/chef/mixin/shell_out.rb +38 -0
  182. data/lib/chef/mixin/template.rb +95 -0
  183. data/lib/chef/mixin/xml_escape.rb +140 -0
  184. data/lib/chef/mixins.rb +16 -0
  185. data/lib/chef/monkey_patches/dir.rb +36 -0
  186. data/lib/chef/monkey_patches/string.rb +28 -0
  187. data/lib/chef/monkey_patches/tempfile.rb +64 -0
  188. data/lib/chef/node/attribute.rb +465 -0
  189. data/lib/chef/node.rb +601 -0
  190. data/lib/chef/openid_registration.rb +187 -0
  191. data/lib/chef/platform.rb +371 -0
  192. data/lib/chef/provider/breakpoint.rb +36 -0
  193. data/lib/chef/provider/cookbook_file.rb +100 -0
  194. data/lib/chef/provider/cron/solaris.rb +195 -0
  195. data/lib/chef/provider/cron.rb +186 -0
  196. data/lib/chef/provider/deploy/revision.rb +73 -0
  197. data/lib/chef/provider/deploy/timestamped.rb +33 -0
  198. data/lib/chef/provider/deploy.rb +319 -0
  199. data/lib/chef/provider/directory.rb +72 -0
  200. data/lib/chef/provider/env/windows.rb +75 -0
  201. data/lib/chef/provider/env.rb +152 -0
  202. data/lib/chef/provider/erl_call.rb +72 -0
  203. data/lib/chef/provider/execute.rb +58 -0
  204. data/lib/chef/provider/file.rb +213 -0
  205. data/lib/chef/provider/git.rb +211 -0
  206. data/lib/chef/provider/group/dscl.rb +121 -0
  207. data/lib/chef/provider/group/gpasswd.rb +53 -0
  208. data/lib/chef/provider/group/groupadd.rb +78 -0
  209. data/lib/chef/provider/group/pw.rb +84 -0
  210. data/lib/chef/provider/group/usermod.rb +57 -0
  211. data/lib/chef/provider/group/windows.rb +79 -0
  212. data/lib/chef/provider/group.rb +133 -0
  213. data/lib/chef/provider/http_request.rb +122 -0
  214. data/lib/chef/provider/ifconfig.rb +132 -0
  215. data/lib/chef/provider/link.rb +161 -0
  216. data/lib/chef/provider/log.rb +54 -0
  217. data/lib/chef/provider/mdadm.rb +91 -0
  218. data/lib/chef/provider/mount/mount.rb +232 -0
  219. data/lib/chef/provider/mount/windows.rb +80 -0
  220. data/lib/chef/provider/mount.rb +117 -0
  221. data/lib/chef/provider/ohai.rb +41 -0
  222. data/lib/chef/provider/package/apt.rb +110 -0
  223. data/lib/chef/provider/package/dpkg.rb +112 -0
  224. data/lib/chef/provider/package/easy_install.rb +114 -0
  225. data/lib/chef/provider/package/freebsd.rb +123 -0
  226. data/lib/chef/provider/package/macports.rb +105 -0
  227. data/lib/chef/provider/package/pacman.rb +101 -0
  228. data/lib/chef/provider/package/portage.rb +124 -0
  229. data/lib/chef/provider/package/rpm.rb +101 -0
  230. data/lib/chef/provider/package/rubygems.rb +462 -0
  231. data/lib/chef/provider/package/solaris.rb +127 -0
  232. data/lib/chef/provider/package/yum-dump.py +128 -0
  233. data/lib/chef/provider/package/yum.rb +222 -0
  234. data/lib/chef/provider/package/zypper.rb +133 -0
  235. data/lib/chef/provider/package.rb +160 -0
  236. data/lib/chef/provider/remote_directory.rb +140 -0
  237. data/lib/chef/provider/remote_file.rb +120 -0
  238. data/lib/chef/provider/route.rb +195 -0
  239. data/lib/chef/provider/ruby_block.rb +33 -0
  240. data/lib/chef/provider/script.rb +55 -0
  241. data/lib/chef/provider/service/arch.rb +109 -0
  242. data/lib/chef/provider/service/debian.rb +105 -0
  243. data/lib/chef/provider/service/freebsd.rb +156 -0
  244. data/lib/chef/provider/service/gentoo.rb +54 -0
  245. data/lib/chef/provider/service/init.rb +71 -0
  246. data/lib/chef/provider/service/redhat.rb +60 -0
  247. data/lib/chef/provider/service/simple.rb +118 -0
  248. data/lib/chef/provider/service/solaris.rb +85 -0
  249. data/lib/chef/provider/service/upstart.rb +192 -0
  250. data/lib/chef/provider/service/windows.rb +129 -0
  251. data/lib/chef/provider/service.rb +128 -0
  252. data/lib/chef/provider/subversion.rb +159 -0
  253. data/lib/chef/provider/template.rb +105 -0
  254. data/lib/chef/provider/user/dscl.rb +280 -0
  255. data/lib/chef/provider/user/pw.rb +113 -0
  256. data/lib/chef/provider/user/useradd.rb +137 -0
  257. data/lib/chef/provider/user/windows.rb +124 -0
  258. data/lib/chef/provider/user.rb +187 -0
  259. data/lib/chef/provider.rb +124 -0
  260. data/lib/chef/providers.rb +91 -0
  261. data/lib/chef/recipe.rb +130 -0
  262. data/lib/chef/resource/apt_package.rb +34 -0
  263. data/lib/chef/resource/bash.rb +33 -0
  264. data/lib/chef/resource/breakpoint.rb +35 -0
  265. data/lib/chef/resource/cookbook_file.rb +45 -0
  266. data/lib/chef/resource/cron.rb +188 -0
  267. data/lib/chef/resource/csh.rb +33 -0
  268. data/lib/chef/resource/deploy.rb +371 -0
  269. data/lib/chef/resource/deploy_revision.rb +35 -0
  270. data/lib/chef/resource/directory.rb +76 -0
  271. data/lib/chef/resource/dpkg_package.rb +34 -0
  272. data/lib/chef/resource/easy_install_package.rb +41 -0
  273. data/lib/chef/resource/env.rb +58 -0
  274. data/lib/chef/resource/erl_call.rb +83 -0
  275. data/lib/chef/resource/execute.rb +127 -0
  276. data/lib/chef/resource/file.rb +92 -0
  277. data/lib/chef/resource/freebsd_package.rb +35 -0
  278. data/lib/chef/resource/gem_package.rb +49 -0
  279. data/lib/chef/resource/git.rb +36 -0
  280. data/lib/chef/resource/group.rb +70 -0
  281. data/lib/chef/resource/http_request.rb +61 -0
  282. data/lib/chef/resource/ifconfig.rb +134 -0
  283. data/lib/chef/resource/link.rb +78 -0
  284. data/lib/chef/resource/log.rb +62 -0
  285. data/lib/chef/resource/macports_package.rb +29 -0
  286. data/lib/chef/resource/mdadm.rb +82 -0
  287. data/lib/chef/resource/mount.rb +135 -0
  288. data/lib/chef/resource/ohai.rb +40 -0
  289. data/lib/chef/resource/package.rb +80 -0
  290. data/lib/chef/resource/pacman_package.rb +33 -0
  291. data/lib/chef/resource/perl.rb +33 -0
  292. data/lib/chef/resource/portage_package.rb +33 -0
  293. data/lib/chef/resource/python.rb +33 -0
  294. data/lib/chef/resource/remote_directory.rb +109 -0
  295. data/lib/chef/resource/remote_file.rb +83 -0
  296. data/lib/chef/resource/route.rb +135 -0
  297. data/lib/chef/resource/rpm_package.rb +34 -0
  298. data/lib/chef/resource/ruby.rb +33 -0
  299. data/lib/chef/resource/ruby_block.rb +40 -0
  300. data/lib/chef/resource/scm.rb +146 -0
  301. data/lib/chef/resource/script.rb +60 -0
  302. data/lib/chef/resource/service.rb +160 -0
  303. data/lib/chef/resource/solaris_package.rb +36 -0
  304. data/lib/chef/resource/subversion.rb +36 -0
  305. data/lib/chef/resource/template.rb +69 -0
  306. data/lib/chef/resource/timestamped_deploy.rb +31 -0
  307. data/lib/chef/resource/user.rb +130 -0
  308. data/lib/chef/resource/yum_package.rb +43 -0
  309. data/lib/chef/resource.rb +523 -0
  310. data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
  311. data/lib/chef/resource_collection.rb +217 -0
  312. data/lib/chef/resource_definition.rb +67 -0
  313. data/lib/chef/resource_definition_list.rb +38 -0
  314. data/lib/chef/resources.rb +64 -0
  315. data/lib/chef/rest/auth_credentials.rb +78 -0
  316. data/lib/chef/rest/cookie_jar.rb +31 -0
  317. data/lib/chef/rest/rest_request.rb +188 -0
  318. data/lib/chef/rest.rb +394 -0
  319. data/lib/chef/role.rb +287 -0
  320. data/lib/chef/run_context.rb +110 -0
  321. data/lib/chef/run_list/run_list_expansion.rb +172 -0
  322. data/lib/chef/run_list/run_list_item.rb +78 -0
  323. data/lib/chef/run_list.rb +150 -0
  324. data/lib/chef/run_status.rb +121 -0
  325. data/lib/chef/runner.rb +107 -0
  326. data/lib/chef/sandbox.rb +153 -0
  327. data/lib/chef/search/query.rb +60 -0
  328. data/lib/chef/shef/ext.rb +568 -0
  329. data/lib/chef/shef/model_wrapper.rb +120 -0
  330. data/lib/chef/shef/shef_rest.rb +28 -0
  331. data/lib/chef/shef/shef_session.rb +271 -0
  332. data/lib/chef/shef.rb +325 -0
  333. data/lib/chef/shell_out.rb +413 -0
  334. data/lib/chef/streaming_cookbook_uploader.rb +201 -0
  335. data/lib/chef/tasks/chef_repo.rake +256 -0
  336. data/lib/chef/util/file_edit.rb +122 -0
  337. data/lib/chef/util/windows/net_group.rb +101 -0
  338. data/lib/chef/util/windows/net_use.rb +121 -0
  339. data/lib/chef/util/windows/net_user.rb +198 -0
  340. data/lib/chef/util/windows/volume.rb +59 -0
  341. data/lib/chef/util/windows.rb +56 -0
  342. data/lib/chef/version.rb +21 -0
  343. data/lib/chef/webui_user.rb +231 -0
  344. data/lib/chef.rb +39 -0
  345. metadata +533 -0
@@ -0,0 +1,153 @@
1
+ #
2
+ # Author:: Tim Hinderliter (<tim@opscode.com>)
3
+ # Copyright:: Copyright (c) 2010 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ require 'chef/log'
19
+ require 'uuidtools'
20
+
21
+ class Chef
22
+ class Sandbox
23
+ attr_accessor :is_completed, :create_time
24
+ alias_method :is_completed?, :is_completed
25
+ attr_reader :guid
26
+
27
+ alias :name :guid
28
+
29
+ attr_accessor :couchdb, :couchdb_id, :couchdb_rev
30
+
31
+ # list of checksum ids
32
+ attr_accessor :checksums
33
+
34
+ DESIGN_DOCUMENT = {
35
+ "version" => 1,
36
+ "language" => "javascript",
37
+ "views" => {
38
+ "all" => {
39
+ "map" => <<-EOJS
40
+ function(doc) {
41
+ if (doc.chef_type == "sandbox") {
42
+ emit(doc.guid, doc);
43
+ }
44
+ }
45
+ EOJS
46
+ },
47
+ "all_id" => {
48
+ "map" => <<-EOJS
49
+ function(doc) {
50
+ if (doc.chef_type == "sandbox") {
51
+ emit(doc.guid, doc.guid);
52
+ }
53
+ }
54
+ EOJS
55
+ },
56
+ "all_incomplete" => {
57
+ "map" => <<-EOJS
58
+ function(doc) {
59
+ if (doc.chef_type == "sandbox" && !doc.is_completed) {
60
+ emit(doc.guid, doc.guid);
61
+ }
62
+ }
63
+ EOJS
64
+ },
65
+ "all_completed" => {
66
+ "map" => <<-EOJS
67
+ function(doc) {
68
+ if (doc.chef_type == "sandbox" && doc.is_completed) {
69
+ emit(doc.guid, doc.guid);
70
+ }
71
+ }
72
+ EOJS
73
+ },
74
+ }
75
+ }
76
+
77
+ # Creates a new Chef::Sandbox object.
78
+ #
79
+ # === Returns
80
+ # object<Chef::Sandbox>:: Duh. :)
81
+ def initialize(guid=nil, couchdb=nil)
82
+ @guid = guid || UUIDTools::UUID.random_create.to_s.gsub(/\-/,'').downcase
83
+ @is_completed = false
84
+ @create_time = Time.now.iso8601
85
+ @checksums = Array.new
86
+ end
87
+
88
+ def include?(checksum)
89
+ @checksums.include?(checksum)
90
+ end
91
+
92
+ alias :member? :include?
93
+
94
+ def to_json(*a)
95
+ result = {
96
+ :guid => guid,
97
+ :name => name, # same as guid, used for id_map
98
+ :checksums => checksums,
99
+ :create_time => create_time,
100
+ :is_completed => is_completed,
101
+ :json_class => self.class.name,
102
+ :chef_type => 'sandbox'
103
+ }
104
+ result["_rev"] = @couchdb_rev if @couchdb_rev
105
+ result.to_json(*a)
106
+ end
107
+
108
+ def self.json_create(o)
109
+ sandbox = new(o['guid'])
110
+ sandbox.checksums = o['checksums']
111
+ sandbox.create_time = o['create_time']
112
+ sandbox.is_completed = o['is_completed']
113
+ if o.has_key?('_rev')
114
+ sandbox.couchdb_rev = o["_rev"]
115
+ o.delete("_rev")
116
+ end
117
+ if o.has_key?("_id")
118
+ sandbox.couchdb_id = o["_id"]
119
+ #sandbox.index_id = sandbox.couchdb_id
120
+ o.delete("_id")
121
+ end
122
+ sandbox
123
+ end
124
+
125
+ ##
126
+ # Couchdb
127
+ ##
128
+
129
+ def self.create_design_document(couchdb=nil)
130
+ (couchdb || Chef::CouchDB.new).create_design_document("sandboxes", DESIGN_DOCUMENT)
131
+ end
132
+
133
+ def self.cdb_list(inflate=false, couchdb=nil)
134
+ rs = (couchdb || Chef::CouchDB.new).list("sandboxes", inflate)
135
+ lookup = (inflate ? "value" : "key")
136
+ rs["rows"].collect { |r| r[lookup] }
137
+ end
138
+
139
+ def self.cdb_load(guid, couchdb=nil)
140
+ # Probably want to look for a view here at some point
141
+ (couchdb || Chef::CouchDB.new).load("sandbox", guid)
142
+ end
143
+
144
+ def cdb_destroy
145
+ (couchdb || Chef::CouchDB.new).delete("sandbox", guid, @couchdb_rev)
146
+ end
147
+
148
+ def cdb_save(couchdb=nil)
149
+ @couchdb_rev = (couchdb || Chef::CouchDB.new).store("sandbox", guid, self)["rev"]
150
+ end
151
+
152
+ end
153
+ end
@@ -0,0 +1,60 @@
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
+
22
+ class Chef
23
+ class Search
24
+ class Query
25
+
26
+ attr_accessor :rest
27
+
28
+ def initialize(url=nil)
29
+ @rest = Chef::REST.new(url ||Chef::Config[:search_url])
30
+ end
31
+
32
+ # Search Solr for objects of a given type, for a given query. If you give
33
+ # it a block, it will handle the paging for you dynamically.
34
+ def search(type, query="*:*", sort='X_CHEF_id_CHEF_X asc', start=0, rows=1000, &block)
35
+ raise ArgumentError, "Type must be a string or a symbol!" unless (type.kind_of?(String) || type.kind_of?(Symbol))
36
+
37
+ response = @rest.get_rest("search/#{type}?q=#{escape(query)}&sort=#{escape(sort)}&start=#{escape(start)}&rows=#{escape(rows)}")
38
+ if block
39
+ response["rows"].each { |o| block.call(o) unless o.nil?}
40
+ unless (response["start"] + response["rows"].length) >= response["total"]
41
+ nstart = response["start"] + rows
42
+ search(type, query, sort, nstart, rows, &block)
43
+ end
44
+ true
45
+ else
46
+ [ response["rows"], response["start"], response["total"] ]
47
+ end
48
+ end
49
+
50
+ def list_indexes
51
+ response = @rest.get_rest("search")
52
+ end
53
+
54
+ private
55
+ def escape(s)
56
+ s && URI.escape(s.to_s)
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,568 @@
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
+
27
+ module Shef
28
+ module Extensions
29
+
30
+ Help = Struct.new(:cmd, :desc, :explanation)
31
+
32
+ # Extensions to be included in every 'main' object in shef. These objects
33
+ # are extended with this module.
34
+ module ObjectCoreExtensions
35
+
36
+ def ensure_session_select_defined
37
+ # irb breaks if you prematurely define IRB::JobMangager
38
+ # so these methods need to be defined at the latest possible time.
39
+ unless jobs.respond_to?(:select_session_by_context)
40
+ def jobs.select_session_by_context(&block)
41
+ @jobs.select { |job| block.call(job[1].context.main)}
42
+ end
43
+ end
44
+
45
+ unless jobs.respond_to?(:session_select)
46
+ def jobs.select_shef_session(target_context)
47
+ session = if target_context.kind_of?(Class)
48
+ select_session_by_context { |main| main.kind_of?(target_context) }
49
+ else
50
+ select_session_by_context { |main| main.equal?(target_context) }
51
+ end
52
+ Array(session.first)[1]
53
+ end
54
+ end
55
+ end
56
+
57
+ def find_or_create_session_for(context_obj)
58
+ ensure_session_select_defined
59
+ if subsession = jobs.select_shef_session(context_obj)
60
+ jobs.switch(subsession)
61
+ else
62
+ irb(context_obj)
63
+ end
64
+ end
65
+
66
+ def help_banner
67
+ banner = []
68
+ banner << ""
69
+ banner << "Shef Help"
70
+ banner << "".ljust(80, "=")
71
+ banner << "| " + "Command".ljust(25) + "| " + "Description"
72
+ banner << "".ljust(80, "=")
73
+
74
+ self.all_help_descriptions.each do |help_text|
75
+ banner << "| " + help_text.cmd.ljust(25) + "| " + help_text.desc
76
+ end
77
+ banner << "".ljust(80, "=")
78
+ banner << "\n"
79
+ banner << "Use help(:command) to get detailed help with individual commands"
80
+ banner << "\n"
81
+ banner.join("\n")
82
+ end
83
+
84
+ def explain_command(method_name)
85
+ help = self.all_help_descriptions.find { |h| h.cmd.to_s == method_name.to_s }
86
+ if help
87
+ puts ""
88
+ puts "Command: #{method_name}"
89
+ puts "".ljust(80, "=")
90
+ puts help.explanation || help.desc
91
+ puts "".ljust(80, "=")
92
+ puts ""
93
+ else
94
+ puts ""
95
+ puts "command #{method_name} not found or no help available"
96
+ puts ""
97
+ end
98
+ end
99
+
100
+ # helpfully returns +:on+ so we can have sugary syntax like `tracing on'
101
+ def on
102
+ :on
103
+ end
104
+
105
+ # returns +:off+ so you can just do `tracing off'
106
+ def off
107
+ :off
108
+ end
109
+
110
+ def help_descriptions
111
+ @help_descriptions ||= []
112
+ end
113
+
114
+ def all_help_descriptions
115
+ help_descriptions
116
+ end
117
+
118
+ def desc(help_text)
119
+ @desc = help_text
120
+ end
121
+
122
+ def explain(explain_text)
123
+ @explain = explain_text
124
+ end
125
+
126
+ def subcommands(subcommand_help={})
127
+ @subcommand_help = subcommand_help
128
+ end
129
+
130
+ def singleton_method_added(mname)
131
+ if @desc
132
+ help_descriptions << Help.new(mname.to_s, @desc.to_s, @explain)
133
+ @desc, @explain = nil, nil
134
+ end
135
+ if @subcommand_help
136
+ @subcommand_help.each do |subcommand, text|
137
+ help_descriptions << Help.new("#{mname}.#{subcommand}", text.to_s, nil)
138
+ end
139
+ end
140
+ @subcommand_help = {}
141
+ end
142
+
143
+ end
144
+
145
+ module String
146
+ def on_off_to_bool
147
+ case self
148
+ when "on"
149
+ true
150
+ when "off"
151
+ false
152
+ else
153
+ self
154
+ end
155
+ end
156
+ end
157
+
158
+ module Symbol
159
+ def on_off_to_bool
160
+ self.to_s.on_off_to_bool
161
+ end
162
+ end
163
+
164
+ module TrueClass
165
+ def to_on_off_str
166
+ "on"
167
+ end
168
+
169
+ def on_off_to_bool
170
+ self
171
+ end
172
+ end
173
+
174
+ module FalseClass
175
+ def to_on_off_str
176
+ "off"
177
+ end
178
+
179
+ def on_off_to_bool
180
+ self
181
+ end
182
+ end
183
+
184
+ # Methods that have associated help text need to be dynamically added
185
+ # to the main irb objects, so we define them in a proc and later
186
+ # instance_eval the proc in the object.
187
+ ObjectUIExtensions = Proc.new do
188
+ extend Shef::Extensions::ObjectCoreExtensions
189
+
190
+ desc "prints this help message"
191
+ explain(<<-E)
192
+ ## SUMMARY ##
193
+ When called with no argument, +help+ prints a table of all shef commands. When
194
+ called with an argument COMMAND, +help+ prints a detailed explanation of the
195
+ command if available, or the description if no explanation is available.
196
+ E
197
+ def help(commmand=nil)
198
+ if commmand
199
+ explain_command(commmand)
200
+ else
201
+ puts help_banner
202
+ end
203
+ :ucanhaz_halp
204
+ end
205
+ alias :halp :help
206
+
207
+ desc "prints information about chef"
208
+ def version
209
+ puts "This is shef, the Chef shell.\n" +
210
+ " Chef Version: #{::Chef::VERSION}\n" +
211
+ " http://www.opscode.com/chef\n" +
212
+ " http://wiki.opscode.com/display/chef/Home"
213
+ :ucanhaz_automation
214
+ end
215
+ alias :shef :version
216
+
217
+ desc "switch to recipe mode"
218
+ def recipe
219
+ find_or_create_session_for Shef.session.recipe
220
+ :recipe
221
+ end
222
+
223
+ desc "switch to attributes mode"
224
+ def attributes
225
+ find_or_create_session_for Shef.session.node
226
+ :attributes
227
+ end
228
+
229
+ desc "run chef using the current recipe"
230
+ def run_chef
231
+ Chef::Log.level = :debug
232
+ session = Shef.session
233
+ runrun = Chef::Runner.new(session.run_context).converge
234
+ Chef::Log.level = :info
235
+ runrun
236
+ end
237
+
238
+ desc "returns an object to control a paused chef run"
239
+ subcommands :resume => "resume the chef run",
240
+ :step => "run only the next resource",
241
+ :skip_back => "move back in the run list",
242
+ :skip_forward => "move forward in the run list"
243
+ def chef_run
244
+ Shef.session.resource_collection.iterator
245
+ end
246
+
247
+ desc "resets the current recipe"
248
+ def reset
249
+ Shef.session.reset!
250
+ end
251
+
252
+ desc "assume the identity of another node."
253
+ def become_node(node_name)
254
+ Shef::DoppelGangerSession.instance.assume_identity(node_name)
255
+ :doppelganger
256
+ end
257
+ alias :doppelganger :become_node
258
+
259
+ desc "turns printout of return values on or off"
260
+ def echo(on_or_off)
261
+ conf.echo = on_or_off.on_off_to_bool
262
+ end
263
+
264
+ desc "says if echo is on or off"
265
+ def echo?
266
+ puts "echo is #{conf.echo.to_on_off_str}"
267
+ end
268
+
269
+ desc "turns on or off tracing of execution. *verbose*"
270
+ def tracing(on_or_off)
271
+ conf.use_tracer = on_or_off.on_off_to_bool
272
+ tracing?
273
+ end
274
+ alias :trace :tracing
275
+
276
+ desc "says if tracing is on or off"
277
+ def tracing?
278
+ puts "tracing is #{conf.use_tracer.to_on_off_str}"
279
+ end
280
+ alias :trace? :tracing?
281
+
282
+ desc "simple ls style command"
283
+ def ls(directory)
284
+ Dir.entries(directory)
285
+ end
286
+ end
287
+
288
+ MainContextExtensions = Proc.new do
289
+ desc "returns the current node (i.e., this host)"
290
+ def node
291
+ Shef.session.node
292
+ end
293
+
294
+ desc "pretty print the node's attributes"
295
+ def ohai(key=nil)
296
+ pp(key ? node.attribute[key] : node.attribute)
297
+ end
298
+ end
299
+
300
+ RESTApiExtensions = Proc.new do
301
+ desc "edit an object in your EDITOR"
302
+ explain(<<-E)
303
+ ## SUMMARY ##
304
+ +edit(object)+ allows you to edit any object that can be converted to JSON.
305
+ When finished editing, this method will return the edited object:
306
+
307
+ new_node = edit(existing_node)
308
+
309
+ ## EDITOR SELECTION ##
310
+ Shef looks for an editor using the following logic
311
+ 1. Looks for an EDITOR set by Shef.editor = "EDITOR"
312
+ 2. Looks for an EDITOR configured in your shef config file
313
+ 3. Uses the value of the EDITOR environment variable
314
+ E
315
+ def edit(object)
316
+ unless Shef.editor
317
+ puts "Please set your editor with Shef.editor = \"vim|emacs|mate|ed\""
318
+ return :failburger
319
+ end
320
+
321
+ filename = "shef-edit-#{object.class.name}-"
322
+ if object.respond_to?(:name)
323
+ filename += object.name
324
+ elsif object.respond_to?(:id)
325
+ filename += object.id
326
+ end
327
+
328
+ edited_data = Tempfile.open([filename, ".js"]) do |tempfile|
329
+ tempfile.sync = true
330
+ tempfile.puts object.to_json
331
+ system("#{Shef.editor.to_s} #{tempfile.path}")
332
+ tempfile.rewind
333
+ tempfile.read
334
+ end
335
+
336
+ JSON.parse(edited_data)
337
+ end
338
+
339
+ desc "Find and edit API clients"
340
+ explain(<<-E)
341
+ ## SUMMARY ##
342
+ +clients+ allows you to query you chef server for information about your api
343
+ clients.
344
+
345
+ ## LIST ALL CLIENTS ##
346
+ To see all clients on the system, use
347
+
348
+ clients.all #=> [<Chef::ApiClient...>, ...]
349
+
350
+ If the output from all is too verbose, or you're only interested in a specific
351
+ value from each of the objects, you can give a code block to +all+:
352
+
353
+ clients.all { |client| client.name } #=> [CLIENT1_NAME, CLIENT2_NAME, ...]
354
+
355
+ ## SHOW ONE CLIENT ##
356
+ To see a specific client, use
357
+
358
+ clients.show(CLIENT_NAME)
359
+
360
+ ## SEARCH FOR CLIENTS ##
361
+ You can also search for clients using +find+ or +search+. You can use the
362
+ familiar string search syntax:
363
+
364
+ clients.search("KEY:VALUE")
365
+
366
+ Just as the +all+ subcommand, the +search+ subcommand can use a code block to
367
+ filter or transform the information returned from the search:
368
+
369
+ clients.search("KEY:VALUE") { |c| c.name }
370
+
371
+ You can also use a Hash based syntax, multiple search conditions will be
372
+ joined with AND.
373
+
374
+ clients.find :KEY => :VALUE, :KEY2 => :VALUE2, ...
375
+
376
+ ## BULK-EDIT CLIENTS ##
377
+ **BE CAREFUL, THIS IS DESTRUCTIVE**
378
+ You can bulk edit API Clients using the +transform+ subcommand, which requires
379
+ a code block. Each client will be saved after the code block is run. If the
380
+ code block returns +nil+ or +false+, that client will be skipped:
381
+
382
+ clients.transform("*:*") do |client|
383
+ if client.name =~ /borat/i
384
+ client.admin(false)
385
+ true
386
+ else
387
+ nil
388
+ end
389
+ end
390
+
391
+ This will strip the admin privileges from any client named after borat.
392
+ E
393
+ subcommands :all => "list all api clients",
394
+ :show => "load an api client by name",
395
+ :search => "search for API clients",
396
+ :transform => "edit all api clients via a code block and save them"
397
+ def clients
398
+ @clients ||= Shef::ModelWrapper.new(Chef::ApiClient, :client)
399
+ end
400
+
401
+ desc "Find and edit cookbooks"
402
+ subcommands :all => "list all cookbooks",
403
+ :show => "load a cookbook by name",
404
+ :transform => "edit all cookbooks via a code block and save them"
405
+ def cookbooks
406
+ @cookbooks ||= Shef::ModelWrapper.new(Chef::CookbookVersion)
407
+ end
408
+
409
+ desc "Find and edit nodes via the API"
410
+ explain(<<-E)
411
+ ## SUMMARY ##
412
+ +nodes+ Allows you to query your chef server for information about your nodes.
413
+
414
+ ## LIST ALL NODES ##
415
+ You can list all nodes using +all+ or +list+
416
+
417
+ nodes.all #=> [<Chef::Node...>, <Chef::Node...>, ...]
418
+
419
+ To limit the information returned for each node, pass a code block to the +all+
420
+ subcommand:
421
+
422
+ nodes.all { |node| node.name } #=> [NODE1_NAME, NODE2_NAME, ...]
423
+
424
+ ## SHOW ONE NODE ##
425
+ You can show the data for a single node using the +show+ subcommand:
426
+
427
+ nodes.show("NODE_NAME") => <Chef::Node @name="NODE_NAME" ...>
428
+
429
+ ## SEARCH FOR NODES ##
430
+ You can search for nodes using the +search+ or +find+ subcommands:
431
+
432
+ nodes.find(:name => "app*") #=> [<Chef::Node @name="app1.example.com" ...>, ...]
433
+
434
+ Similarly to +all+, you can pass a code block to limit or transform the
435
+ information returned:
436
+
437
+ nodes.find(:name => "app#") { |node| node.ec2 }
438
+
439
+ ## BULK EDIT NODES ##
440
+ **BE CAREFUL, THIS OPERATION IS DESTRUCTIVE**
441
+
442
+ Bulk edit nodes by passing a code block to the +transform+ or +bulk_edit+
443
+ subcommand. The block will be applied to each matching node, and then the node
444
+ will be saved. If the block returns +nil+ or +false+, that node will be
445
+ skipped.
446
+
447
+ nodes.transform do |node|
448
+ if node.fqdn =~ /.*\\.preprod\\.example\\.com/
449
+ node.set[:environment] = "preprod"
450
+ end
451
+ end
452
+
453
+ This will assign the attribute to every node with a FQDN matching the regex.
454
+ E
455
+ subcommands :all => "list all nodes",
456
+ :show => "load a node by name",
457
+ :search => "search for nodes",
458
+ :transform => "edit all nodes via a code block and save them"
459
+ def nodes
460
+ @nodes ||= Shef::ModelWrapper.new(Chef::Node)
461
+ end
462
+
463
+ desc "Find and edit roles via the API"
464
+ explain(<<-E)
465
+ ## SUMMARY ##
466
+ +roles+ allows you to query and edit roles on your Chef server.
467
+
468
+ ## SUBCOMMANDS ##
469
+ * all (list)
470
+ * show (load)
471
+ * search (find)
472
+ * transform (bulk_edit)
473
+
474
+ ## SEE ALSO ##
475
+ See the help for +nodes+ for more information about the subcommands.
476
+ E
477
+ subcommands :all => "list all roles",
478
+ :show => "load a role by name",
479
+ :search => "search for roles",
480
+ :transform => "edit all roles via a code block and save them"
481
+ def roles
482
+ @roles ||= Shef::ModelWrapper.new(Chef::Role)
483
+ end
484
+
485
+ desc "Find and edit +databag_name+ via the api"
486
+ explain(<<-E)
487
+ ## SUMMARY ##
488
+ +databags(DATABAG_NAME)+ allows you to query and edit data bag items on your
489
+ Chef server. Unlike other commands for working with data on the server,
490
+ +databags+ requires the databag name as an argument, for example:
491
+ databags(:users).all
492
+
493
+ ## SUBCOMMANDS ##
494
+ * all (list)
495
+ * show (load)
496
+ * search (find)
497
+ * transform (bulk_edit)
498
+
499
+ ## SEE ALSO ##
500
+ See the help for +nodes+ for more information about the subcommands.
501
+
502
+ E
503
+ subcommands :all => "list all items in the data bag",
504
+ :show => "load a data bag item by id",
505
+ :search => "search for items in the data bag",
506
+ :transform => "edit all items via a code block and save them"
507
+ def databags(databag_name)
508
+ @named_databags_wrappers ||= {}
509
+ @named_databags_wrappers[databag_name] ||= Shef::NamedDataBagWrapper.new(databag_name)
510
+ end
511
+
512
+ desc "A REST Client configured to authenticate with the API"
513
+ def api
514
+ @rest = Shef::ShefREST.new(Chef::Config[:chef_server_url])
515
+ end
516
+
517
+ end
518
+
519
+ RecipeUIExtensions = Proc.new do
520
+ alias :original_resources :resources
521
+
522
+ desc "list all the resources on the current recipe"
523
+ def resources(*args)
524
+ if args.empty?
525
+ pp run_context.resource_collection.instance_variable_get(:@resources_by_name).keys
526
+ else
527
+ pp resources = original_resources(*args)
528
+ resources
529
+ end
530
+ end
531
+ end
532
+
533
+ def self.extend_context_object(obj)
534
+ obj.instance_eval(&ObjectUIExtensions)
535
+ obj.instance_eval(&MainContextExtensions)
536
+ obj.instance_eval(&RESTApiExtensions)
537
+ obj.extend(FileUtils)
538
+ obj.extend(Chef::Mixin::Language)
539
+ end
540
+
541
+ def self.extend_context_node(node_obj)
542
+ node_obj.instance_eval(&ObjectUIExtensions)
543
+ end
544
+
545
+ def self.extend_context_recipe(recipe_obj)
546
+ recipe_obj.instance_eval(&ObjectUIExtensions)
547
+ recipe_obj.instance_eval(&RecipeUIExtensions)
548
+ end
549
+
550
+ end
551
+ end
552
+
553
+ class String
554
+ include Shef::Extensions::String
555
+ end
556
+
557
+ class Symbol
558
+ include Shef::Extensions::Symbol
559
+ end
560
+
561
+ class TrueClass
562
+ include Shef::Extensions::TrueClass
563
+ end
564
+
565
+ class FalseClass
566
+ include Shef::Extensions::FalseClass
567
+ end
568
+