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,36 @@
1
+ #
2
+ # Author:: Toomas Pelberg (<toomasp@gmx.net>)
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/resource/package'
20
+ require 'chef/provider/package/solaris'
21
+
22
+ class Chef
23
+ class Resource
24
+ class SolarisPackage < Chef::Resource::Package
25
+
26
+ def initialize(name, collection=nil, node=nil)
27
+ super(name, collection, node)
28
+ @resource_name = :solaris_package
29
+ @provider = Chef::Provider::Package::Solaris
30
+ end
31
+
32
+ end
33
+ end
34
+ end
35
+
36
+
@@ -0,0 +1,36 @@
1
+ #
2
+ # Author:: Daniel DeLeo (<dan@kallistec.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/resource/scm"
20
+
21
+ class Chef
22
+ class Resource
23
+ class Subversion < Chef::Resource::Scm
24
+
25
+ def initialize(name, run_context=nil)
26
+ super
27
+ @svn_arguments = '--no-auth-cache'
28
+ @svn_info_args = '--no-auth-cache'
29
+ @resource_name = :subversion
30
+ @provider = Chef::Provider::Subversion
31
+ allowed_actions << :force_export
32
+ end
33
+
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,69 @@
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/resource/file'
20
+
21
+ class Chef
22
+ class Resource
23
+ class Template < Chef::Resource::File
24
+
25
+ def initialize(name, run_context=nil)
26
+ super
27
+ @resource_name = :template
28
+ @action = "create"
29
+ @source = "#{::File.basename(name)}.erb"
30
+ @cookbook = nil
31
+ @local = false
32
+ @variables = Hash.new
33
+ end
34
+
35
+ def source(file=nil)
36
+ set_or_return(
37
+ :source,
38
+ file,
39
+ :kind_of => [ String ]
40
+ )
41
+ end
42
+
43
+ def variables(args=nil)
44
+ set_or_return(
45
+ :variables,
46
+ args,
47
+ :kind_of => [ Hash ]
48
+ )
49
+ end
50
+
51
+ def cookbook(args=nil)
52
+ set_or_return(
53
+ :cookbook,
54
+ args,
55
+ :kind_of => [ String ]
56
+ )
57
+ end
58
+
59
+ def local(args=nil)
60
+ set_or_return(
61
+ :local,
62
+ args,
63
+ :kind_of => [ TrueClass, FalseClass ]
64
+ )
65
+ end
66
+
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,31 @@
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
+ class Chef
20
+ class Resource
21
+
22
+ # Convenience class for using the deploy resource with the timestamped
23
+ # deployment strategy (provider)
24
+ class TimestampedDeploy < Chef::Resource::Deploy
25
+ def initialize(*args, &block)
26
+ super(*args, &block)
27
+ @provider = Chef::Provider::Deploy::Timestamped
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,130 @@
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/resource'
20
+
21
+ class Chef
22
+ class Resource
23
+ class User < Chef::Resource
24
+
25
+ def initialize(name, run_context=nil)
26
+ super
27
+ @resource_name = :user
28
+ @username = name
29
+ @comment = nil
30
+ @uid = nil
31
+ @gid = nil
32
+ @home = nil
33
+ @shell = nil
34
+ @password = nil
35
+ @system = false
36
+ @manage_home = false
37
+ @non_unique = false
38
+ @action = :create
39
+ @supports = {
40
+ :manage_home => false,
41
+ :non_unique => false
42
+ }
43
+ @allowed_actions.push(:create, :remove, :modify, :manage, :lock, :unlock)
44
+ end
45
+
46
+ def username(arg=nil)
47
+ set_or_return(
48
+ :username,
49
+ arg,
50
+ :kind_of => [ String ]
51
+ )
52
+ end
53
+
54
+ def comment(arg=nil)
55
+ set_or_return(
56
+ :comment,
57
+ arg,
58
+ :kind_of => [ String ]
59
+ )
60
+ end
61
+
62
+ def uid(arg=nil)
63
+ set_or_return(
64
+ :uid,
65
+ arg,
66
+ :kind_of => [ String, Integer ]
67
+ )
68
+ end
69
+
70
+ def gid(arg=nil)
71
+ set_or_return(
72
+ :gid,
73
+ arg,
74
+ :kind_of => [ String, Integer ]
75
+ )
76
+ end
77
+
78
+ alias_method :group, :gid
79
+
80
+ def home(arg=nil)
81
+ set_or_return(
82
+ :home,
83
+ arg,
84
+ :kind_of => [ String ]
85
+ )
86
+ end
87
+
88
+ def shell(arg=nil)
89
+ set_or_return(
90
+ :shell,
91
+ arg,
92
+ :kind_of => [ String ]
93
+ )
94
+ end
95
+
96
+ def password(arg=nil)
97
+ set_or_return(
98
+ :password,
99
+ arg,
100
+ :kind_of => [ String ]
101
+ )
102
+ end
103
+
104
+ def system(arg=nil)
105
+ set_or_return(
106
+ :system,
107
+ arg,
108
+ :kind_of => [ TrueClass, FalseClass ]
109
+ )
110
+ end
111
+
112
+ def manage_home(arg=nil)
113
+ set_or_return(
114
+ :manage_home,
115
+ arg,
116
+ :kind_of => [ TrueClass, FalseClass ]
117
+ )
118
+ end
119
+
120
+ def non_unique(arg=nil)
121
+ set_or_return(
122
+ :non_unique,
123
+ arg,
124
+ :kind_of => [ TrueClass, FalseClass ]
125
+ )
126
+ end
127
+
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,43 @@
1
+ #
2
+ # Author:: AJ Christensen (<aj@opscode.com>)
3
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/resource/package'
20
+ require 'chef/provider/package/yum'
21
+
22
+ class Chef
23
+ class Resource
24
+ class YumPackage < Chef::Resource::Package
25
+
26
+ def initialize(name, run_context=nil)
27
+ super
28
+ @resource_name = :yum_package
29
+ @provider = Chef::Provider::Package::Yum
30
+ end
31
+
32
+ # Install a specific arch
33
+ def arch(arg=nil)
34
+ set_or_return(
35
+ :arch,
36
+ arg,
37
+ :kind_of => [ String ]
38
+ )
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,523 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Christopher Walters (<cw@opscode.com>)
4
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ require 'chef/mixin/params_validate'
21
+ require 'chef/mixin/check_helper'
22
+ require 'chef/mixin/language'
23
+ require 'chef/mixin/convert_to_class_name'
24
+ require 'chef/mixin/command'
25
+ require 'chef/resource_collection'
26
+ require 'chef/node'
27
+
28
+ require 'chef/mixin/deprecation'
29
+
30
+ class Chef
31
+ class Resource
32
+ class Notification < Struct.new(:resource, :action, :notifying_resource)
33
+
34
+ def duplicates?(other_notification)
35
+ unless other_notification.respond_to?(:resource) && other_notification.respond_to?(:action)
36
+ msg = "only duck-types of Chef::Resource::Notification can be checked for duplication "\
37
+ "you gave #{other_notification.inspect}"
38
+ raise ArgumentError, msg
39
+ end
40
+ other_notification.resource == resource && other_notification.action == action
41
+ end
42
+
43
+ def resolve_resource_reference(resource_collection)
44
+ return resource if resource.kind_of?(Chef::Resource)
45
+
46
+ matching_resource = resource_collection.find(resource)
47
+ if Array(matching_resource).size > 1
48
+ msg = "Notification #{self} from #{notifying_resource} was created with a reference to multiple resources, "\
49
+ "but can only notify one resource. Notifying resource was defined on #{notifying_resource.source_line}"
50
+ raise Chef::Exceptions::InvalidResourceReference, msg
51
+ end
52
+ self.resource = matching_resource
53
+ rescue Chef::Exceptions::ResourceNotFound => e
54
+ err = Chef::Exceptions::ResourceNotFound.new(<<-FAIL)
55
+ Resource #{notifying_resource} is configured to notify resource #{resource} with action #{action}, \
56
+ but #{resource} cannot be found in the resource collection. #{notifying_resource} is defined in \
57
+ #{notifying_resource.source_line}
58
+ FAIL
59
+ err.set_backtrace(e.backtrace)
60
+ raise err
61
+ rescue Chef::Exceptions::InvalidResourceSpecification => e
62
+ err = Chef::Exceptions::InvalidResourceSpecification.new(<<-F)
63
+ Resource #{notifying_resource} is configured to notify resource #{resource} with action #{action}, \
64
+ but #{resource.inspect} is not valid syntax to look up a resource in the resource collection. Notification \
65
+ is defined near #{notifying_resource.source_line}
66
+ F
67
+ err.set_backtrace(e.backtrace)
68
+ raise err
69
+ end
70
+
71
+ end
72
+
73
+ HIDDEN_IVARS = [:@allowed_actions, :@resource_name, :@source_line, :@run_context, :@name, :@node]
74
+
75
+ include Chef::Mixin::CheckHelper
76
+ include Chef::Mixin::ParamsValidate
77
+ include Chef::Mixin::Language
78
+ include Chef::Mixin::ConvertToClassName
79
+ include Chef::Mixin::Deprecation
80
+
81
+ attr_accessor :params
82
+ attr_accessor :provider
83
+ attr_accessor :allowed_actions
84
+ attr_accessor :run_context
85
+ attr_accessor :cookbook_name
86
+ attr_accessor :recipe_name
87
+ attr_accessor :enclosing_provider
88
+ attr_accessor :source_line
89
+
90
+ attr_reader :updated
91
+
92
+ attr_reader :resource_name
93
+ attr_reader :not_if_args
94
+ attr_reader :only_if_args
95
+
96
+ # Each notify entry is a resource/action pair, modeled as an
97
+ # Struct with a #resource and #action member
98
+ attr_reader :immediate_notifications
99
+ attr_reader :delayed_notifications
100
+
101
+ def initialize(name, run_context=nil)
102
+ @name = name
103
+ @run_context = run_context
104
+ @noop = nil
105
+ @before = nil
106
+ @params = Hash.new
107
+ @provider = nil
108
+ @allowed_actions = [ :nothing ]
109
+ @action = :nothing
110
+ @updated = false
111
+ @updated_by_last_action = false
112
+ @supports = {}
113
+ @ignore_failure = false
114
+ @not_if = nil
115
+ @not_if_args = {}
116
+ @only_if = nil
117
+ @only_if_args = {}
118
+ @immediate_notifications = Array.new
119
+ @delayed_notifications = Array.new
120
+ @source_line = nil
121
+
122
+ @node = run_context ? deprecated_ivar(run_context.node, :node, :warn) : nil
123
+ end
124
+
125
+ def updated=(true_or_false)
126
+ Chef::Log.warn("Chef::Resource#updated=(true|false) is deprecated. Please call #updated_by_last_action(true|false) instead.")
127
+ Chef::Log.warn("Called from:")
128
+ caller[0..3].each {|line| Chef::Log.warn(line)}
129
+ updated_by_last_action(true_or_false)
130
+ @updated = true_or_false
131
+ end
132
+
133
+ def node
134
+ run_context && run_context.node
135
+ end
136
+
137
+ # If an unknown method is invoked, determine whether the enclosing Provider's
138
+ # lexical scope can fulfill the request. E.g. This happens when the Resource's
139
+ # block invokes new_resource.
140
+ def method_missing(method_symbol, *args, &block)
141
+ if enclosing_provider && enclosing_provider.respond_to?(method_symbol)
142
+ enclosing_provider.send(method_symbol, *args, &block)
143
+ else
144
+ raise NoMethodError, "undefined method `#{method_symbol.to_s}' for #{self.class.to_s}"
145
+ end
146
+ end
147
+
148
+ def load_prior_resource
149
+ begin
150
+ prior_resource = run_context.resource_collection.lookup(self.to_s)
151
+ Chef::Log.debug("Setting #{self.to_s} to the state of the prior #{self.to_s}")
152
+ prior_resource.instance_variables.each do |iv|
153
+ unless iv.to_sym == :@source_line || iv.to_sym == :@action
154
+ self.instance_variable_set(iv, prior_resource.instance_variable_get(iv))
155
+ end
156
+ end
157
+ true
158
+ rescue Chef::Exceptions::ResourceNotFound => e
159
+ true
160
+ end
161
+ end
162
+
163
+ def supports(args={})
164
+ if args.any?
165
+ @supports = args
166
+ else
167
+ @supports
168
+ end
169
+ end
170
+
171
+ def provider(arg=nil)
172
+ klass = if arg.kind_of?(String) || arg.kind_of?(Symbol)
173
+ lookup_provider_constant(arg)
174
+ else
175
+ arg
176
+ end
177
+ set_or_return(
178
+ :provider,
179
+ klass,
180
+ :kind_of => [ Class ]
181
+ )
182
+ end
183
+
184
+ def action(arg=nil)
185
+ if arg
186
+ action_list = arg.kind_of?(Array) ? arg : [ arg ]
187
+ action_list = action_list.collect { |a| a.to_sym }
188
+ action_list.each do |action|
189
+ validate(
190
+ {
191
+ :action => action,
192
+ },
193
+ {
194
+ :action => { :kind_of => Symbol, :equal_to => @allowed_actions },
195
+ }
196
+ )
197
+ end
198
+ @action = action_list
199
+ else
200
+ @action
201
+ end
202
+ end
203
+
204
+ def name(name=nil)
205
+ set_if_args(@name, name) do
206
+ raise ArgumentError, "name must be a string!" unless name.kind_of?(String)
207
+ @name = name
208
+ end
209
+ end
210
+
211
+ def noop(tf=nil)
212
+ set_if_args(@noop, tf) do
213
+ raise ArgumentError, "noop must be true or false!" unless tf == true || tf == false
214
+ @noop = tf
215
+ end
216
+ end
217
+
218
+ def ignore_failure(arg=nil)
219
+ set_or_return(
220
+ :ignore_failure,
221
+ arg,
222
+ :kind_of => [ TrueClass, FalseClass ]
223
+ )
224
+ end
225
+
226
+ def epic_fail(arg=nil)
227
+ ignore_failure(arg)
228
+ end
229
+
230
+ def notifies(*args)
231
+ unless ( args.size > 0 && args.size < 4)
232
+ raise ArgumentError, "Wrong number of arguments for notifies: should be 1-3 arguments, you gave #{args.inspect}"
233
+ end
234
+
235
+ if args.size > 1 # notifies(:action, resource) OR notifies(:action, resource, :immediately)
236
+ add_notification(*args)
237
+ else
238
+ # This syntax is so weird. surely people will just give us one hash?
239
+ notifications = args.flatten
240
+ notifications.each do |resources_notifications|
241
+ resources_notifications.each do |resource, notification|
242
+ action, timing = notification[0], notification[1]
243
+ Chef::Log.debug "adding notification from resource #{self} to `#{resource.inspect}' => `#{notification.inspect}'"
244
+ add_notification(action, resource, timing)
245
+ end
246
+ end
247
+ end
248
+ rescue NoMethodError
249
+ Chef::Log.fatal("Error processing notifies(#{args.inspect}) on #{self}")
250
+ raise
251
+ end
252
+
253
+ def add_notification(action, resources, timing=:delayed)
254
+ resources = [resources].flatten
255
+ resources.each do |resource|
256
+ case timing.to_s
257
+ when 'delayed'
258
+ notifies_delayed(action, resource)
259
+ when 'immediate', 'immediately'
260
+ notifies_immediately(action, resource)
261
+ else
262
+ raise ArgumentError, "invalid timing: #{timing} for notifies(#{action}, #{resources.inspect}, #{timing}) resource #{self} "\
263
+ "Valid timings are: :delayed, :immediate, :immediately"
264
+ end
265
+ end
266
+
267
+ true
268
+ end
269
+
270
+ # Iterates over all immediate and delayed notifications, calling
271
+ # resolve_resource_reference on each in turn, causing them to
272
+ # resolve lazy/forward references.
273
+ def resolve_notification_references
274
+ @immediate_notifications.each { |n| n.resolve_resource_reference(run_context.resource_collection) }
275
+ @delayed_notifications.each {|n| n.resolve_resource_reference(run_context.resource_collection) }
276
+ end
277
+
278
+ def notifies_immediately(action, resource_spec)
279
+ @immediate_notifications << Notification.new(resource_spec, action, self)
280
+ end
281
+
282
+ def notifies_delayed(action, resource_spec)
283
+ @delayed_notifications << Notification.new(resource_spec, action, self)
284
+ end
285
+
286
+ def resources(*args)
287
+ run_context.resource_collection.find(*args)
288
+ end
289
+
290
+ def subscribes(action, resources, timing=:delayed)
291
+ resources = [resources].flatten
292
+ resources.each do |resource|
293
+ resource.notifies(action, self, timing)
294
+ end
295
+ true
296
+ end
297
+
298
+ def is(*args)
299
+ if args.size == 1
300
+ args.first
301
+ else
302
+ return *args
303
+ end
304
+ end
305
+
306
+ def to_s
307
+ "#{@resource_name}[#{@name}]"
308
+ end
309
+
310
+ def to_text
311
+ ivars = instance_variables.map { |ivar| ivar.to_sym } - HIDDEN_IVARS
312
+ text = "# Declared in #{@source_line}\n"
313
+ text << convert_to_snake_case(self.class.name, 'Chef::Resource') + "(\"#{name}\") do\n"
314
+ ivars.each do |ivar|
315
+ if (value = instance_variable_get(ivar)) && !(value.respond_to?(:empty?) && value.empty?)
316
+ text << " #{ivar.to_s.sub(/^@/,'')}(#{value.inspect})\n"
317
+ end
318
+ end
319
+ text << "end\n"
320
+ end
321
+
322
+ # Serialize this object as a hash
323
+ def to_json(*a)
324
+ instance_vars = Hash.new
325
+ self.instance_variables.each do |iv|
326
+ unless iv == "@run_context"
327
+ instance_vars[iv] = self.instance_variable_get(iv)
328
+ end
329
+ end
330
+ results = {
331
+ 'json_class' => self.class.name,
332
+ 'instance_vars' => instance_vars
333
+ }
334
+ results.to_json(*a)
335
+ end
336
+
337
+ def to_hash
338
+ instance_vars = Hash.new
339
+ self.instance_variables.each do |iv|
340
+ key = iv.to_s.sub(/^@/,'').to_sym
341
+ instance_vars[key] = self.instance_variable_get(iv) unless (key == :run_context) || (key == :node)
342
+ end
343
+ instance_vars
344
+ end
345
+
346
+ def only_if(arg=nil, args = {}, &blk)
347
+ if Kernel.block_given?
348
+ @only_if = blk
349
+ @only_if_args = args
350
+ else
351
+ @only_if = arg if arg
352
+ @only_if_args = args if arg
353
+ end
354
+ @only_if
355
+ end
356
+
357
+ def not_if(arg=nil, args = {}, &blk)
358
+ if Kernel.block_given?
359
+ @not_if = blk
360
+ @not_if_args = args
361
+ else
362
+ @not_if = arg if arg
363
+ @not_if_args = args if arg
364
+ end
365
+ @not_if
366
+ end
367
+
368
+ def run_action(action)
369
+ # ensure that we don't leave @updated_by_last_action set to true
370
+ # on accident
371
+ updated_by_last_action(false)
372
+
373
+ # Check if this resource has an only_if block -- if it does,
374
+ # evaluate the only_if block and skip the resource if
375
+ # appropriate.
376
+ if only_if
377
+ unless Chef::Mixin::Command.only_if(only_if, only_if_args)
378
+ Chef::Log.debug("Skipping #{self} due to only_if")
379
+ return
380
+ end
381
+ end
382
+
383
+ # Check if this resource has a not_if block -- if it does,
384
+ # evaluate the not_if block and skip the resource if
385
+ # appropriate.
386
+ if not_if
387
+ unless Chef::Mixin::Command.not_if(not_if, not_if_args)
388
+ Chef::Log.debug("Skipping #{self} due to not_if")
389
+ return
390
+ end
391
+ end
392
+
393
+ provider = Chef::Platform.provider_for_resource(self)
394
+ provider.load_current_resource
395
+ provider.send("action_#{action}")
396
+ end
397
+
398
+ def updated_by_last_action(true_or_false)
399
+ @updated ||= true_or_false
400
+ @updated_by_last_action = true_or_false
401
+ end
402
+
403
+ def updated_by_last_action?
404
+ @updated_by_last_action
405
+ end
406
+
407
+ def updated?
408
+ updated
409
+ end
410
+
411
+ class << self
412
+
413
+ def json_create(o)
414
+ resource = self.new(o["instance_vars"]["@name"])
415
+ o["instance_vars"].each do |k,v|
416
+ resource.instance_variable_set(k.to_sym, v)
417
+ end
418
+ resource
419
+ end
420
+
421
+ include Chef::Mixin::ConvertToClassName
422
+
423
+ def attribute(attr_name, validation_opts={})
424
+ # This atrocity is the only way to support 1.8 and 1.9 at the same time
425
+ # When you're ready to drop 1.8 support, do this:
426
+ # define_method attr_name.to_sym do |arg=nil|
427
+ # etc.
428
+ shim_method=<<-SHIM
429
+ def #{attr_name}(arg=nil)
430
+ _set_or_return_#{attr_name}(arg)
431
+ end
432
+ SHIM
433
+ class_eval(shim_method)
434
+
435
+ define_method("_set_or_return_#{attr_name.to_s}".to_sym) do |arg|
436
+ set_or_return(attr_name.to_sym, arg, validation_opts)
437
+ end
438
+ end
439
+
440
+ def build_from_file(cookbook_name, filename)
441
+ rname = filename_to_qualified_string(cookbook_name, filename)
442
+
443
+ # Add log entry if we override an existing light-weight resource.
444
+ class_name = convert_to_class_name(rname)
445
+ overriding = Chef::Resource.const_defined?(class_name)
446
+ Chef::Log.info("#{class_name} light-weight resource already initialized -- overriding!") if overriding
447
+
448
+ new_resource_class = Class.new self do |cls|
449
+
450
+ # default initialize method that ensures that when initialize is finally
451
+ # wrapped (see below), super is called in the event that the resource
452
+ # definer does not implement initialize
453
+ def initialize(name, run_context)
454
+ super(name, run_context)
455
+ end
456
+
457
+ @actions_to_create = []
458
+
459
+ class << cls
460
+ include Chef::Mixin::FromFile
461
+
462
+ def actions_to_create
463
+ @actions_to_create
464
+ end
465
+
466
+ define_method(:actions) do |*action_names|
467
+ actions_to_create.push(*action_names)
468
+ end
469
+ end
470
+
471
+ # load resource definition from file
472
+ cls.class_from_file(filename)
473
+
474
+ # create a new constructor that wraps the old one and adds the actions
475
+ # specified in the DSL
476
+ old_init = instance_method(:initialize)
477
+
478
+ define_method(:initialize) do |name, *optional_args|
479
+ args_run_context = optional_args.shift
480
+ @resource_name = rname.to_sym
481
+ old_init.bind(self).call(name, args_run_context)
482
+ allowed_actions.push(self.class.actions_to_create).flatten!
483
+ end
484
+ end
485
+
486
+ # register new class as a Chef::Resource
487
+ class_name = convert_to_class_name(rname)
488
+ Chef::Resource.const_set(class_name, new_resource_class)
489
+ Chef::Log.debug("Loaded contents of #{filename} into a resource named #{rname} defined in Chef::Resource::#{class_name}")
490
+
491
+ new_resource_class
492
+ end
493
+
494
+ # Resources that want providers namespaced somewhere other than
495
+ # Chef::Provider can set the namespace with +provider_base+
496
+ # Ex:
497
+ # class MyResource < Chef::Resource
498
+ # provider_base Chef::Provider::Deploy
499
+ # # ...other stuff
500
+ # end
501
+ def provider_base(arg=nil)
502
+ @provider_base ||= arg
503
+ @provider_base ||= Chef::Provider
504
+ end
505
+
506
+ end
507
+
508
+ private
509
+
510
+ def lookup_provider_constant(name)
511
+ begin
512
+ self.class.provider_base.const_get(convert_to_class_name(name.to_s))
513
+ rescue NameError => e
514
+ if e.to_s =~ /#{Regexp.escape(self.class.provider_base.to_s)}/
515
+ raise ArgumentError, "No provider found to match '#{name}'"
516
+ else
517
+ raise e
518
+ end
519
+ end
520
+ end
521
+
522
+ end
523
+ end