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,120 @@
1
+ #--
2
+ # Author:: Daniel DeLeo (<dan@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
+
19
+ require 'chef/mixin/convert_to_class_name'
20
+ require 'chef/mixin/language'
21
+
22
+ module Shef
23
+ class ModelWrapper
24
+
25
+ include Chef::Mixin::ConvertToClassName
26
+
27
+ attr_reader :model_symbol
28
+
29
+ def initialize(model_class, symbol=nil)
30
+ @model_class = model_class
31
+ @model_symbol = symbol || convert_to_snake_case(model_class.name, "Chef").to_sym
32
+ end
33
+
34
+ def search(query)
35
+ return all if query.to_s == "all"
36
+ results = []
37
+ Chef::Search::Query.new.search(@model_symbol, format_query(query)) do |obj|
38
+ if block_given?
39
+ results << yield(obj)
40
+ else
41
+ results << obj
42
+ end
43
+ end
44
+ results
45
+ end
46
+
47
+ alias :find :search
48
+
49
+ def all(&block)
50
+ all_objects = list_objects
51
+ block_given? ? all_objects.map(&block) : all_objects
52
+ end
53
+
54
+ alias :list :all
55
+
56
+ def show(obj_id)
57
+ @model_class.load(obj_id)
58
+ end
59
+
60
+ alias :load :show
61
+
62
+ def transform(what_to_transform, &block)
63
+ if what_to_transform == :all
64
+ objects_to_transform = list_objects
65
+ else
66
+ objects_to_transform = search(what_to_transform)
67
+ end
68
+ objects_to_transform.each do |obj|
69
+ if result = yield(obj)
70
+ obj.save
71
+ end
72
+ end
73
+ end
74
+
75
+ alias :bulk_edit :transform
76
+
77
+ private
78
+
79
+ # paper over inconsistencies in the model classes APIs, and return the objects
80
+ # the user wanted instead of the URI=>object stuff
81
+ def list_objects
82
+ objects = @model_class.method(:list).arity == 0? @model_class.list : @model_class.list(true)
83
+ objects.map { |obj| Array(obj).find {|o| o.kind_of?(@model_class)} }
84
+ end
85
+
86
+ def format_query(query)
87
+ if query.respond_to?(:keys)
88
+ query.map { |key, value| "#{key}:#{value}" }.join(" AND ")
89
+ else
90
+ query
91
+ end
92
+ end
93
+ end
94
+
95
+ class NamedDataBagWrapper < ModelWrapper
96
+
97
+ def initialize(databag_name)
98
+ @model_symbol = @databag_name = databag_name
99
+ end
100
+
101
+
102
+ alias :list :all
103
+
104
+ def show(item)
105
+ Chef::DataBagItem.load(@databag_name, item)
106
+ end
107
+
108
+ private
109
+
110
+ def list_objects
111
+ all_items = []
112
+ Chef::Search::Query.new.search(@databag_name) do |item|
113
+ all_items << item
114
+ end
115
+ all_items
116
+ end
117
+
118
+ end
119
+
120
+ end
@@ -0,0 +1,28 @@
1
+ #--
2
+ # Author:: Daniel DeLeo (<dan@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
+
19
+ module Shef
20
+ class ShefREST < Chef::REST
21
+
22
+ alias :get :get_rest
23
+ alias :put :put_rest
24
+ alias :post :post_rest
25
+ alias :delete :delete_rest
26
+
27
+ end
28
+ end
@@ -0,0 +1,271 @@
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 'chef/recipe'
20
+ require 'chef/run_context'
21
+ require 'chef/config'
22
+ require 'chef/client'
23
+ require 'chef/cookbook/cookbook_collection'
24
+ require 'chef/cookbook_loader'
25
+
26
+ module Shef
27
+ class ShefSession
28
+ include Singleton
29
+
30
+ def self.session_type(type=nil)
31
+ @session_type = type if type
32
+ @session_type
33
+ end
34
+
35
+ attr_accessor :node, :compile, :recipe, :run_context
36
+ attr_reader :node_attributes, :client
37
+ def initialize
38
+ @node_built = false
39
+ end
40
+
41
+ def node_built?
42
+ !!@node_built
43
+ end
44
+
45
+ def reset!
46
+ loading do
47
+ rebuild_node
48
+ @node = client.node
49
+ shorten_node_inspect
50
+ Shef::Extensions.extend_context_node(@node)
51
+ rebuild_context
52
+ node.consume_attributes(node_attributes) if node_attributes
53
+ @recipe = Chef::Recipe.new(nil, nil, run_context)
54
+ Shef::Extensions.extend_context_recipe(@recipe)
55
+ @node_built = true
56
+ end
57
+ end
58
+
59
+ def node_attributes=(attrs)
60
+ @node_attributes = attrs
61
+ @node.consume_attributes(@node_attributes)
62
+ end
63
+
64
+ def resource_collection
65
+ run_context.resource_collection
66
+ end
67
+
68
+ def run_context
69
+ @run_context || rebuild_context
70
+ end
71
+
72
+ def definitions
73
+ nil
74
+ end
75
+
76
+ def cookbook_loader
77
+ nil
78
+ end
79
+
80
+ def save_node
81
+ raise "Not Supported! #{self.class.name} doesn't support #save_node, maybe you need to run shef in client mode?"
82
+ end
83
+
84
+ def rebuild_context
85
+ raise "Not Implemented! :rebuild_collection should be implemented by subclasses"
86
+ end
87
+
88
+ private
89
+
90
+ def loading
91
+ show_loading_progress
92
+ begin
93
+ yield
94
+ rescue => e
95
+ loading_complete(false)
96
+ raise e
97
+ else
98
+ loading_complete(true)
99
+ end
100
+ end
101
+
102
+ def show_loading_progress
103
+ print "Loading"
104
+ @loading = true
105
+ @dot_printer = Thread.new do
106
+ while @loading
107
+ print "."
108
+ sleep 0.5
109
+ end
110
+ end
111
+ end
112
+
113
+ def loading_complete(success)
114
+ @loading = false
115
+ @dot_printer.join
116
+ msg = success ? "done.\n\n" : "epic fail!\n\n"
117
+ print msg
118
+ end
119
+
120
+ def shorten_node_inspect
121
+ def @node.inspect
122
+ "<Chef::Node:0x#{self.object_id.to_s(16)} @name=\"#{self.name}\">"
123
+ end
124
+ end
125
+
126
+ def rebuild_node
127
+ raise "Not Implemented! :rebuild_node should be implemented by subclasses"
128
+ end
129
+
130
+ end
131
+
132
+ class StandAloneSession < ShefSession
133
+
134
+ session_type :standalone
135
+
136
+ def rebuild_context
137
+ @run_context = Chef::RunContext.new(@node, {}) # no recipes
138
+ end
139
+
140
+ private
141
+
142
+ def rebuild_node
143
+ Chef::Config[:solo] = true
144
+ @client = Chef::Client.new
145
+ @client.run_ohai
146
+ @client.build_node
147
+ end
148
+
149
+ end
150
+
151
+ class SoloSession < ShefSession
152
+
153
+ session_type :solo
154
+
155
+ def definitions
156
+ @run_context.definitions
157
+ end
158
+
159
+ def rebuild_context
160
+ @run_context = Chef::RunContext.new(@node, Chef::CookbookCollection.new(Chef::CookbookLoader.new))
161
+ end
162
+
163
+ private
164
+
165
+ def rebuild_node
166
+ # Tell the client we're chef solo so it won't try to contact the server
167
+ Chef::Config[:solo] = true
168
+ @client = Chef::Client.new
169
+ @client.run_ohai
170
+ @client.build_node
171
+ end
172
+
173
+ end
174
+
175
+ class ClientSession < SoloSession
176
+
177
+ session_type :solo
178
+
179
+ def save_node
180
+ @client.save_node
181
+ end
182
+
183
+ private
184
+
185
+ def rebuild_node
186
+ # Make sure the client knows this is not chef solo
187
+ Chef::Config[:solo] = false
188
+ @client = Chef::Client.new
189
+ @client.run_ohai
190
+ @client.register
191
+ @client.build_node
192
+
193
+ @client.sync_cookbooks
194
+ end
195
+
196
+ end
197
+
198
+ class DoppelGangerClient < Chef::Client
199
+
200
+ attr_reader :node_name
201
+
202
+ def initialize(node_name)
203
+ @node_name = node_name
204
+ @ohai = Ohai::System.new
205
+ end
206
+
207
+ # Run the very smallest amount of ohai we can get away with and still
208
+ # hope to have things work. Otherwise we're not very good doppelgangers
209
+ def run_ohai
210
+ @ohai.require_plugin('os')
211
+ end
212
+
213
+ # DoppelGanger implementation of build_node. preserves as many of the node's
214
+ # attributes, and does not save updates to the server
215
+ def build_node
216
+ Chef::Log.debug("Building node object for #{@node_name}")
217
+
218
+ @node = Chef::Node.find_or_create(node_name)
219
+
220
+ ohai_data = @ohai.data.merge(@node.automatic_attrs)
221
+
222
+ @node.consume_external_attrs(ohai_data,nil)
223
+ @node.reset_defaults_and_overrides
224
+
225
+ @node
226
+ end
227
+
228
+ def register
229
+ @rest = Chef::REST.new(Chef::Config[:chef_server_url], Chef::Config[:node_name], Chef::Config[:client_key])
230
+ end
231
+
232
+ end
233
+
234
+ class DoppelGangerSession < ClientSession
235
+
236
+ session_type "doppelganger client"
237
+
238
+ def save_node
239
+ puts "A doppelganger should think twice before saving the node"
240
+ end
241
+
242
+ def assume_identity(node_name)
243
+ Chef::Config[:doppelganger] = @node_name = node_name
244
+ reset!
245
+ rescue Exception => e
246
+ puts "#{e.class.name}: #{e.message}"
247
+ puts Array(e.backtrace).join("\n")
248
+ puts
249
+ puts "* " * 40
250
+ puts "failed to assume the identity of node '#{node_name}', resetting"
251
+ puts "* " * 40
252
+ puts
253
+ Chef::Config[:doppelganger] = false
254
+ @node_built = false
255
+ Shef.session
256
+ end
257
+
258
+ def rebuild_node
259
+ # Make sure the client knows this is not chef solo
260
+ Chef::Config[:solo] = false
261
+ @client = DoppelGangerClient.new(@node_name)
262
+ @client.run_ohai
263
+ @client.register
264
+ @client.build_node
265
+
266
+ @client.sync_cookbooks
267
+ end
268
+
269
+ end
270
+
271
+ end
data/lib/chef/shef.rb ADDED
@@ -0,0 +1,325 @@
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/version'
24
+ require "chef/client"
25
+ require "chef/config"
26
+
27
+ require "chef/shef/shef_session"
28
+ require "chef/shef/ext"
29
+
30
+ # = Shef
31
+ # Shef is Chef in an IRB session. Shef can interact with a Chef server via the
32
+ # REST API, and run and debug recipes interactively.
33
+ module Shef
34
+ LEADERS = Hash.new("")
35
+ LEADERS[Chef::Recipe] = ":recipe"
36
+ LEADERS[Chef::Node] = ":attributes"
37
+
38
+ class << self
39
+ attr_accessor :client_type
40
+ attr_accessor :options
41
+ attr_accessor :env
42
+ attr_writer :editor
43
+ end
44
+
45
+ # Start the irb REPL with shef's customizations
46
+ def self.start
47
+ setup_logger
48
+ # FUGLY HACK: irb gives us no other choice.
49
+ irb_help = [:help, :irb_help, IRB::ExtendCommandBundle::NO_OVERRIDE]
50
+ IRB::ExtendCommandBundle.instance_variable_get(:@ALIASES).delete(irb_help)
51
+
52
+ parse_opts
53
+
54
+ # HACK: this duplicates the functions of IRB.start, but we have to do it
55
+ # to get access to the main object before irb starts.
56
+ ::IRB.setup(nil)
57
+
58
+ irb = IRB::Irb.new
59
+
60
+ init(irb.context.main)
61
+
62
+
63
+ irb_conf[:IRB_RC].call(irb.context) if irb_conf[:IRB_RC]
64
+ irb_conf[:MAIN_CONTEXT] = irb.context
65
+
66
+ trap("SIGINT") do
67
+ irb.signal_handle
68
+ end
69
+
70
+ catch(:IRB_EXIT) do
71
+ irb.eval_input
72
+ end
73
+ end
74
+
75
+ def self.setup_logger
76
+ Chef::Config[:log_level] ||= :warn
77
+ Chef::Log.init(STDERR)
78
+ Mixlib::Authentication::Log.logger = Ohai::Log.logger = Chef::Log.logger
79
+ Chef::Log.level = Chef::Config[:log_level] || :warn
80
+ end
81
+
82
+ # Shef assumes it's running whenever it is defined
83
+ def self.running?
84
+ true
85
+ end
86
+
87
+ # Set the irb_conf object to something other than IRB.conf
88
+ # usful for testing.
89
+ def self.irb_conf=(conf_hash)
90
+ @irb_conf = conf_hash
91
+ end
92
+
93
+ def self.irb_conf
94
+ @irb_conf || IRB.conf
95
+ end
96
+
97
+ def self.configure_irb
98
+ irb_conf[:HISTORY_FILE] = "~/.shef_history"
99
+ irb_conf[:SAVE_HISTORY] = 1000
100
+
101
+ irb_conf[:IRB_RC] = lambda do |conf|
102
+ m = conf.main
103
+
104
+ conf.prompt_c = "chef#{leader(m)} > "
105
+ conf.return_format = " => %s \n"
106
+ conf.prompt_i = "chef#{leader(m)} > "
107
+ conf.prompt_n = "chef#{leader(m)} ?> "
108
+ conf.prompt_s = "chef#{leader(m)}%l> "
109
+ end
110
+ end
111
+
112
+ def self.leader(main_object)
113
+ env_string = Shef.env ? " (#{Shef.env})" : ""
114
+ LEADERS[main_object.class] + env_string
115
+ end
116
+
117
+ def self.session
118
+ unless client_type.instance.node_built?
119
+ puts "Session type: #{client_type.session_type}"
120
+ client_type.instance.reset!
121
+ end
122
+ client_type.instance
123
+ end
124
+
125
+ def self.init(main)
126
+ parse_json
127
+ configure_irb
128
+
129
+ session # trigger ohai run + session load
130
+
131
+ session.node.consume_attributes(@json_attribs)
132
+
133
+ Extensions.extend_context_object(main)
134
+
135
+ main.version
136
+ puts
137
+
138
+ puts "run `help' for help, `exit' or ^D to quit."
139
+ puts
140
+ puts "Ohai2u#{greeting}!"
141
+ end
142
+
143
+ def self.greeting
144
+ " #{Etc.getlogin}@#{Shef.session.node.fqdn}"
145
+ rescue NameError
146
+ ""
147
+ end
148
+
149
+ def self.parse_json
150
+ # HACK: copied verbatim from chef/application/client, because it's not
151
+ # reusable as written there :(
152
+ if Chef::Config[:json_attribs]
153
+ begin
154
+ json_io = open(Chef::Config[:json_attribs])
155
+ rescue SocketError => error
156
+ fatal!("I cannot connect to #{Chef::Config[:json_attribs]}", 2)
157
+ rescue Errno::ENOENT => error
158
+ fatal!("I cannot find #{Chef::Config[:json_attribs]}", 2)
159
+ rescue Errno::EACCES => error
160
+ fatal!("Permissions are incorrect on #{Chef::Config[:json_attribs]}. Please chmod a+r #{Chef::Config[:json_attribs]}", 2)
161
+ rescue Exception => error
162
+ fatal!("Got an unexpected error reading #{Chef::Config[:json_attribs]}: #{error.message}", 2)
163
+ end
164
+
165
+ begin
166
+ @json_attribs = JSON.parse(json_io.read)
167
+ rescue JSON::ParserError => error
168
+ fatal!("Could not parse the provided JSON file (#{Chef::Config[:json_attribs]})!: " + error.message, 2)
169
+ end
170
+ end
171
+ end
172
+
173
+ def self.fatal!(message, exit_status)
174
+ Chef::Log.fatal(message)
175
+ exit exit_status
176
+ end
177
+
178
+ def self.client_type
179
+ type = Shef::StandAloneSession
180
+ type = Shef::SoloSession if Chef::Config[:shef_solo]
181
+ type = Shef::ClientSession if Chef::Config[:client]
182
+ type = Shef::DoppelGangerSession if Chef::Config[:doppelganger]
183
+ type
184
+ end
185
+
186
+ def self.parse_opts
187
+ @options = Options.new
188
+ @options.parse_opts
189
+ end
190
+
191
+ def self.editor
192
+ @editor || Chef::Config[:editor] || ENV['EDITOR']
193
+ end
194
+
195
+ class Options
196
+ include Mixlib::CLI
197
+
198
+ def self.footer(text=nil)
199
+ @footer = text if text
200
+ @footer
201
+ end
202
+
203
+ banner("shef #{Chef::VERSION}\n\nUsage: shef [NAMED_CONF] (OPTIONS)")
204
+
205
+ footer(<<-FOOTER)
206
+ When no CONFIG is specified, shef attempts to load a default configuration file:
207
+ * If a NAMED_CONF is given, shef will load ~/.chef/NAMED_CONF/shef.rb
208
+ * If no NAMED_CONF is given shef will load ~/.chef/shef.rb if it exists
209
+ * Shef falls back to loading /etc/chef/client.rb or /etc/chef/solo.rb if -z or
210
+ -s options are given and no shef.rb can be found.
211
+ FOOTER
212
+
213
+ option :config_file,
214
+ :short => "-c CONFIG",
215
+ :long => "--config CONFIG",
216
+ :description => "The configuration file to use"
217
+
218
+ option :help,
219
+ :short => "-h",
220
+ :long => "--help",
221
+ :description => "Show this message",
222
+ :on => :tail,
223
+ :boolean => true,
224
+ :proc => proc { print_help }
225
+
226
+ option :log_level,
227
+ :short => "-l LOG_LEVEL",
228
+ :long => '--log-level LOG_LEVEL',
229
+ :description => "Set the logging level",
230
+ :proc => proc { |level| Chef::Log.level = level.to_sym }
231
+
232
+ option :standalone,
233
+ :short => "-a",
234
+ :long => "--standalone",
235
+ :description => "standalone shef session",
236
+ :default => true,
237
+ :boolean => true
238
+
239
+ option :shef_solo,
240
+ :short => "-s",
241
+ :long => "--solo",
242
+ :description => "chef-solo shef session",
243
+ :boolean => true,
244
+ :proc => proc {Chef::Config[:solo] = true}
245
+
246
+ option :client,
247
+ :short => "-z",
248
+ :long => "--client",
249
+ :description => "chef-client shef session",
250
+ :boolean => true
251
+
252
+ option :json_attribs,
253
+ :short => "-j JSON_ATTRIBS",
254
+ :long => "--json-attributes JSON_ATTRIBS",
255
+ :description => "Load attributes from a JSON file or URL",
256
+ :proc => nil
257
+
258
+ option :chef_server_url,
259
+ :short => "-S CHEFSERVERURL",
260
+ :long => "--server CHEFSERVERURL",
261
+ :description => "The chef server URL",
262
+ :proc => nil
263
+
264
+ option :version,
265
+ :short => "-v",
266
+ :long => "--version",
267
+ :description => "Show chef version",
268
+ :boolean => true,
269
+ :proc => lambda {|v| puts "Chef: #{::Chef::VERSION}"},
270
+ :exit => 0
271
+
272
+ def self.print_help
273
+ instance = new
274
+ instance.parse_options([])
275
+ puts instance.opt_parser
276
+ puts
277
+ puts footer
278
+ puts
279
+ exit 1
280
+ end
281
+
282
+ def self.setup!
283
+ self.new.parse_opts
284
+ end
285
+
286
+ def parse_opts
287
+ remainder = parse_options
288
+ environment = remainder.first
289
+ # We have to nuke ARGV to make sure irb's option parser never sees it.
290
+ # otherwise, IRB complains about command line switches it doesn't recognize.
291
+ ARGV.clear
292
+ config[:config_file] = config_file_for_shef_mode(environment)
293
+ config_msg = config[:config_file] || "none (standalone shef session)"
294
+ puts "loading configuration: #{config_msg}"
295
+ Chef::Config.from_file(config[:config_file]) if !config[:config_file].nil? && File.exists?(config[:config_file]) && File.readable?(config[:config_file])
296
+ Chef::Config.merge!(config)
297
+ end
298
+
299
+ private
300
+
301
+ def config_file_for_shef_mode(environment)
302
+ if config[:config_file]
303
+ config[:config_file]
304
+ elsif environment
305
+ Shef.env = environment
306
+ config_file_to_try = ::File.join(ENV['HOME'], '.chef', environment, 'shef.rb')
307
+ unless ::File.exist?(config_file_to_try)
308
+ puts "could not find shef config for environment #{environment} at #{config_file_to_try}"
309
+ exit 1
310
+ end
311
+ config_file_to_try
312
+ elsif ENV['HOME'] && ::File.exist?(File.join(ENV['HOME'], '.chef', 'shef.rb'))
313
+ File.join(ENV['HOME'], '.chef', 'shef.rb')
314
+ elsif config[:solo]
315
+ "/etc/chef/solo.rb"
316
+ elsif config[:client]
317
+ "/etc/chef/client.rb"
318
+ else
319
+ nil
320
+ end
321
+ end
322
+
323
+ end
324
+
325
+ end