tylerrick-chef 0.10.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (450) hide show
  1. data/LICENSE +201 -0
  2. data/README.rdoc +171 -0
  3. data/bin/chef-client +26 -0
  4. data/bin/chef-solo +25 -0
  5. data/bin/knife +26 -0
  6. data/bin/shef +34 -0
  7. data/distro/README +2 -0
  8. data/distro/arch/etc/conf.d/chef-client.conf +5 -0
  9. data/distro/arch/etc/conf.d/chef-expander.conf +8 -0
  10. data/distro/arch/etc/conf.d/chef-server-webui.conf +10 -0
  11. data/distro/arch/etc/conf.d/chef-server.conf +10 -0
  12. data/distro/arch/etc/conf.d/chef-solr.conf +8 -0
  13. data/distro/arch/etc/rc.d/chef-client +76 -0
  14. data/distro/arch/etc/rc.d/chef-expander +78 -0
  15. data/distro/arch/etc/rc.d/chef-server +78 -0
  16. data/distro/arch/etc/rc.d/chef-server-webui +78 -0
  17. data/distro/arch/etc/rc.d/chef-solr +78 -0
  18. data/distro/common/html/chef-client.8.html +146 -0
  19. data/distro/common/html/chef-expander.8.html +164 -0
  20. data/distro/common/html/chef-expanderctl.8.html +146 -0
  21. data/distro/common/html/chef-server-webui.8.html +185 -0
  22. data/distro/common/html/chef-server.8.html +182 -0
  23. data/distro/common/html/chef-solo.8.html +191 -0
  24. data/distro/common/html/chef-solr.8.html +165 -0
  25. data/distro/common/html/knife-bootstrap.1.html +243 -0
  26. data/distro/common/html/knife-client.1.html +219 -0
  27. data/distro/common/html/knife-configure.1.html +170 -0
  28. data/distro/common/html/knife-cookbook-site.1.html +241 -0
  29. data/distro/common/html/knife-cookbook.1.html +384 -0
  30. data/distro/common/html/knife-data-bag.1.html +234 -0
  31. data/distro/common/html/knife-environment.1.html +267 -0
  32. data/distro/common/html/knife-exec.1.html +134 -0
  33. data/distro/common/html/knife-index.1.html +125 -0
  34. data/distro/common/html/knife-node.1.html +250 -0
  35. data/distro/common/html/knife-recipe.1.html +92 -0
  36. data/distro/common/html/knife-role.1.html +200 -0
  37. data/distro/common/html/knife-search.1.html +288 -0
  38. data/distro/common/html/knife-ssh.1.html +157 -0
  39. data/distro/common/html/knife-status.1.html +128 -0
  40. data/distro/common/html/knife-tag.1.html +137 -0
  41. data/distro/common/html/knife.1.html +321 -0
  42. data/distro/common/html/shef.1.html +283 -0
  43. data/distro/common/man/man1/knife-bootstrap.1 +197 -0
  44. data/distro/common/man/man1/knife-client.1 +99 -0
  45. data/distro/common/man/man1/knife-configure.1 +88 -0
  46. data/distro/common/man/man1/knife-cookbook-site.1 +145 -0
  47. data/distro/common/man/man1/knife-cookbook.1 +345 -0
  48. data/distro/common/man/man1/knife-data-bag.1 +130 -0
  49. data/distro/common/man/man1/knife-environment.1 +178 -0
  50. data/distro/common/man/man1/knife-exec.1 +46 -0
  51. data/distro/common/man/man1/knife-index.1 +29 -0
  52. data/distro/common/man/man1/knife-node.1 +134 -0
  53. data/distro/common/man/man1/knife-role.1 +88 -0
  54. data/distro/common/man/man1/knife-search.1 +280 -0
  55. data/distro/common/man/man1/knife-ssh.1 +83 -0
  56. data/distro/common/man/man1/knife-status.1 +29 -0
  57. data/distro/common/man/man1/knife-tag.1 +43 -0
  58. data/distro/common/man/man1/knife.1 +292 -0
  59. data/distro/common/man/man1/shef.1 +256 -0
  60. data/distro/common/man/man8/chef-client.8 +104 -0
  61. data/distro/common/man/man8/chef-expander.8 +97 -0
  62. data/distro/common/man/man8/chef-expanderctl.8 +62 -0
  63. data/distro/common/man/man8/chef-server-webui.8 +155 -0
  64. data/distro/common/man/man8/chef-server.8 +147 -0
  65. data/distro/common/man/man8/chef-solo.8 +158 -0
  66. data/distro/common/man/man8/chef-solr.8 +122 -0
  67. data/distro/common/markdown/README +3 -0
  68. data/distro/common/markdown/man1/knife-bootstrap.mkd +142 -0
  69. data/distro/common/markdown/man1/knife-client.mkd +103 -0
  70. data/distro/common/markdown/man1/knife-configure.mkd +70 -0
  71. data/distro/common/markdown/man1/knife-cookbook-site.mkd +123 -0
  72. data/distro/common/markdown/man1/knife-cookbook.mkd +263 -0
  73. data/distro/common/markdown/man1/knife-data-bag.mkd +117 -0
  74. data/distro/common/markdown/man1/knife-environment.mkd +151 -0
  75. data/distro/common/markdown/man1/knife-exec.mkd +37 -0
  76. data/distro/common/markdown/man1/knife-index.mkd +30 -0
  77. data/distro/common/markdown/man1/knife-node.mkd +130 -0
  78. data/distro/common/markdown/man1/knife-role.mkd +85 -0
  79. data/distro/common/markdown/man1/knife-search.mkd +180 -0
  80. data/distro/common/markdown/man1/knife-ssh.mkd +72 -0
  81. data/distro/common/markdown/man1/knife-status.mkd +36 -0
  82. data/distro/common/markdown/man1/knife-tag.mkd +39 -0
  83. data/distro/common/markdown/man1/knife.mkd +220 -0
  84. data/distro/common/markdown/man1/shef.mkd +189 -0
  85. data/distro/common/markdown/man8/chef-client.mkd +75 -0
  86. data/distro/common/markdown/man8/chef-expander.mkd +82 -0
  87. data/distro/common/markdown/man8/chef-expanderctl.mkd +58 -0
  88. data/distro/common/markdown/man8/chef-server-webui.mkd +121 -0
  89. data/distro/common/markdown/man8/chef-server.mkd +121 -0
  90. data/distro/common/markdown/man8/chef-solo.mkd +107 -0
  91. data/distro/common/markdown/man8/chef-solr.mkd +89 -0
  92. data/distro/debian/etc/default/chef-client +4 -0
  93. data/distro/debian/etc/default/chef-expander +8 -0
  94. data/distro/debian/etc/default/chef-server +9 -0
  95. data/distro/debian/etc/default/chef-server-webui +9 -0
  96. data/distro/debian/etc/default/chef-solr +8 -0
  97. data/distro/debian/etc/init.d/chef-client +185 -0
  98. data/distro/debian/etc/init.d/chef-expander +176 -0
  99. data/distro/debian/etc/init.d/chef-server +122 -0
  100. data/distro/debian/etc/init.d/chef-server-webui +123 -0
  101. data/distro/debian/etc/init.d/chef-solr +176 -0
  102. data/distro/debian/etc/init/chef-client.conf +17 -0
  103. data/distro/debian/etc/init/chef-expander.conf +17 -0
  104. data/distro/debian/etc/init/chef-server-webui.conf +17 -0
  105. data/distro/debian/etc/init/chef-server.conf +17 -0
  106. data/distro/debian/etc/init/chef-solr.conf +17 -0
  107. data/distro/redhat/etc/init.d/chef-client +110 -0
  108. data/distro/redhat/etc/init.d/chef-expander +104 -0
  109. data/distro/redhat/etc/init.d/chef-server +112 -0
  110. data/distro/redhat/etc/init.d/chef-server-webui +112 -0
  111. data/distro/redhat/etc/init.d/chef-solr +104 -0
  112. data/distro/redhat/etc/logrotate.d/chef-client +8 -0
  113. data/distro/redhat/etc/logrotate.d/chef-expander +8 -0
  114. data/distro/redhat/etc/logrotate.d/chef-server +8 -0
  115. data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
  116. data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
  117. data/distro/redhat/etc/sysconfig/chef-client +15 -0
  118. data/distro/redhat/etc/sysconfig/chef-expander +7 -0
  119. data/distro/redhat/etc/sysconfig/chef-server +14 -0
  120. data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
  121. data/distro/redhat/etc/sysconfig/chef-solr +8 -0
  122. data/lib/chef.rb +41 -0
  123. data/lib/chef/api_client.rb +271 -0
  124. data/lib/chef/application.rb +152 -0
  125. data/lib/chef/application/agent.rb +18 -0
  126. data/lib/chef/application/client.rb +285 -0
  127. data/lib/chef/application/knife.rb +188 -0
  128. data/lib/chef/application/solo.rb +218 -0
  129. data/lib/chef/applications.rb +4 -0
  130. data/lib/chef/certificate.rb +194 -0
  131. data/lib/chef/checksum.rb +167 -0
  132. data/lib/chef/checksum/storage.rb +18 -0
  133. data/lib/chef/checksum/storage/filesystem.rb +56 -0
  134. data/lib/chef/checksum_cache.rb +189 -0
  135. data/lib/chef/client.rb +366 -0
  136. data/lib/chef/config.rb +248 -0
  137. data/lib/chef/cookbook/chefignore.rb +66 -0
  138. data/lib/chef/cookbook/cookbook_collection.rb +45 -0
  139. data/lib/chef/cookbook/cookbook_version_loader.rb +173 -0
  140. data/lib/chef/cookbook/file_system_file_vendor.rb +56 -0
  141. data/lib/chef/cookbook/file_vendor.rb +48 -0
  142. data/lib/chef/cookbook/metadata.rb +629 -0
  143. data/lib/chef/cookbook/remote_file_vendor.rb +88 -0
  144. data/lib/chef/cookbook/syntax_check.rb +136 -0
  145. data/lib/chef/cookbook_loader.rb +121 -0
  146. data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
  147. data/lib/chef/cookbook_uploader.rb +154 -0
  148. data/lib/chef/cookbook_version.rb +1096 -0
  149. data/lib/chef/cookbook_version_selector.rb +168 -0
  150. data/lib/chef/couchdb.rb +246 -0
  151. data/lib/chef/daemon.rb +172 -0
  152. data/lib/chef/data_bag.rb +235 -0
  153. data/lib/chef/data_bag_item.rb +273 -0
  154. data/lib/chef/encrypted_data_bag_item.rb +139 -0
  155. data/lib/chef/environment.rb +455 -0
  156. data/lib/chef/exceptions.rb +154 -0
  157. data/lib/chef/file_access_control.rb +144 -0
  158. data/lib/chef/file_cache.rb +218 -0
  159. data/lib/chef/handler.rb +227 -0
  160. data/lib/chef/handler/error_report.rb +33 -0
  161. data/lib/chef/handler/json_file.rb +58 -0
  162. data/lib/chef/index_queue.rb +29 -0
  163. data/lib/chef/index_queue/amqp_client.rb +116 -0
  164. data/lib/chef/index_queue/consumer.rb +76 -0
  165. data/lib/chef/index_queue/indexable.rb +109 -0
  166. data/lib/chef/json_compat.rb +52 -0
  167. data/lib/chef/knife.rb +520 -0
  168. data/lib/chef/knife/bootstrap.rb +207 -0
  169. data/lib/chef/knife/bootstrap/archlinux-gems.erb +60 -0
  170. data/lib/chef/knife/bootstrap/centos5-gems.erb +56 -0
  171. data/lib/chef/knife/bootstrap/fedora13-gems.erb +43 -0
  172. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +49 -0
  173. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +50 -0
  174. data/lib/chef/knife/client_bulk_delete.rb +65 -0
  175. data/lib/chef/knife/client_create.rb +79 -0
  176. data/lib/chef/knife/client_delete.rb +46 -0
  177. data/lib/chef/knife/client_edit.rb +45 -0
  178. data/lib/chef/knife/client_list.rb +42 -0
  179. data/lib/chef/knife/client_reregister.rb +58 -0
  180. data/lib/chef/knife/client_show.rb +52 -0
  181. data/lib/chef/knife/configure.rb +149 -0
  182. data/lib/chef/knife/configure_client.rb +50 -0
  183. data/lib/chef/knife/cookbook_bulk_delete.rb +72 -0
  184. data/lib/chef/knife/cookbook_create.rb +274 -0
  185. data/lib/chef/knife/cookbook_delete.rb +151 -0
  186. data/lib/chef/knife/cookbook_download.rb +137 -0
  187. data/lib/chef/knife/cookbook_list.rb +47 -0
  188. data/lib/chef/knife/cookbook_metadata.rb +107 -0
  189. data/lib/chef/knife/cookbook_metadata_from_file.rb +44 -0
  190. data/lib/chef/knife/cookbook_show.rb +102 -0
  191. data/lib/chef/knife/cookbook_site_download.rb +70 -0
  192. data/lib/chef/knife/cookbook_site_install.rb +148 -0
  193. data/lib/chef/knife/cookbook_site_list.rb +62 -0
  194. data/lib/chef/knife/cookbook_site_search.rb +51 -0
  195. data/lib/chef/knife/cookbook_site_share.rb +114 -0
  196. data/lib/chef/knife/cookbook_site_show.rb +57 -0
  197. data/lib/chef/knife/cookbook_site_unshare.rb +56 -0
  198. data/lib/chef/knife/cookbook_site_vendor.rb +46 -0
  199. data/lib/chef/knife/cookbook_test.rb +93 -0
  200. data/lib/chef/knife/cookbook_upload.rb +240 -0
  201. data/lib/chef/knife/core/bootstrap_context.rb +100 -0
  202. data/lib/chef/knife/core/cookbook_scm_repo.rb +148 -0
  203. data/lib/chef/knife/core/generic_presenter.rb +191 -0
  204. data/lib/chef/knife/core/node_editor.rb +127 -0
  205. data/lib/chef/knife/core/node_presenter.rb +136 -0
  206. data/lib/chef/knife/core/object_loader.rb +75 -0
  207. data/lib/chef/knife/core/subcommand_loader.rb +112 -0
  208. data/lib/chef/knife/core/text_formatter.rb +100 -0
  209. data/lib/chef/knife/core/ui.rb +216 -0
  210. data/lib/chef/knife/data_bag_create.rb +93 -0
  211. data/lib/chef/knife/data_bag_delete.rb +51 -0
  212. data/lib/chef/knife/data_bag_edit.rb +94 -0
  213. data/lib/chef/knife/data_bag_from_file.rb +87 -0
  214. data/lib/chef/knife/data_bag_list.rb +46 -0
  215. data/lib/chef/knife/data_bag_show.rb +81 -0
  216. data/lib/chef/knife/environment_create.rb +53 -0
  217. data/lib/chef/knife/environment_delete.rb +45 -0
  218. data/lib/chef/knife/environment_edit.rb +45 -0
  219. data/lib/chef/knife/environment_from_file.rb +50 -0
  220. data/lib/chef/knife/environment_list.rb +42 -0
  221. data/lib/chef/knife/environment_show.rb +46 -0
  222. data/lib/chef/knife/exec.rb +51 -0
  223. data/lib/chef/knife/help.rb +103 -0
  224. data/lib/chef/knife/help_topics.rb +4 -0
  225. data/lib/chef/knife/index_rebuild.rb +50 -0
  226. data/lib/chef/knife/node_bulk_delete.rb +80 -0
  227. data/lib/chef/knife/node_create.rb +50 -0
  228. data/lib/chef/knife/node_delete.rb +47 -0
  229. data/lib/chef/knife/node_edit.rb +72 -0
  230. data/lib/chef/knife/node_from_file.rb +50 -0
  231. data/lib/chef/knife/node_list.rb +46 -0
  232. data/lib/chef/knife/node_run_list_add.rb +67 -0
  233. data/lib/chef/knife/node_run_list_remove.rb +48 -0
  234. data/lib/chef/knife/node_show.rb +73 -0
  235. data/lib/chef/knife/recipe_list.rb +32 -0
  236. data/lib/chef/knife/role_bulk_delete.rb +70 -0
  237. data/lib/chef/knife/role_create.rb +55 -0
  238. data/lib/chef/knife/role_delete.rb +47 -0
  239. data/lib/chef/knife/role_edit.rb +48 -0
  240. data/lib/chef/knife/role_from_file.rb +56 -0
  241. data/lib/chef/knife/role_list.rb +43 -0
  242. data/lib/chef/knife/role_show.rb +54 -0
  243. data/lib/chef/knife/search.rb +141 -0
  244. data/lib/chef/knife/ssh.rb +367 -0
  245. data/lib/chef/knife/status.rb +104 -0
  246. data/lib/chef/knife/tag_create.rb +52 -0
  247. data/lib/chef/knife/tag_delete.rb +60 -0
  248. data/lib/chef/knife/tag_list.rb +47 -0
  249. data/lib/chef/log.rb +39 -0
  250. data/lib/chef/mash.rb +211 -0
  251. data/lib/chef/mixin/check_helper.rb +31 -0
  252. data/lib/chef/mixin/checksum.rb +32 -0
  253. data/lib/chef/mixin/command.rb +163 -0
  254. data/lib/chef/mixin/command/unix.rb +215 -0
  255. data/lib/chef/mixin/command/windows.rb +76 -0
  256. data/lib/chef/mixin/convert_to_class_name.rb +63 -0
  257. data/lib/chef/mixin/create_path.rb +57 -0
  258. data/lib/chef/mixin/deep_merge.rb +225 -0
  259. data/lib/chef/mixin/deprecation.rb +65 -0
  260. data/lib/chef/mixin/from_file.rb +50 -0
  261. data/lib/chef/mixin/get_source_from_package.rb +42 -0
  262. data/lib/chef/mixin/language.rb +163 -0
  263. data/lib/chef/mixin/language_include_attribute.rb +61 -0
  264. data/lib/chef/mixin/language_include_recipe.rb +52 -0
  265. data/lib/chef/mixin/params_validate.rb +225 -0
  266. data/lib/chef/mixin/recipe_definition_dsl_core.rb +78 -0
  267. data/lib/chef/mixin/shell_out.rb +41 -0
  268. data/lib/chef/mixin/template.rb +95 -0
  269. data/lib/chef/mixin/xml_escape.rb +140 -0
  270. data/lib/chef/mixins.rb +15 -0
  271. data/lib/chef/monkey_patches/dir.rb +36 -0
  272. data/lib/chef/monkey_patches/numeric.rb +15 -0
  273. data/lib/chef/monkey_patches/object.rb +9 -0
  274. data/lib/chef/monkey_patches/regexp.rb +34 -0
  275. data/lib/chef/monkey_patches/string.rb +49 -0
  276. data/lib/chef/monkey_patches/tempfile.rb +64 -0
  277. data/lib/chef/nil_argument.rb +3 -0
  278. data/lib/chef/node.rb +677 -0
  279. data/lib/chef/node/attribute.rb +487 -0
  280. data/lib/chef/openid_registration.rb +187 -0
  281. data/lib/chef/platform.rb +434 -0
  282. data/lib/chef/provider.rb +124 -0
  283. data/lib/chef/provider/breakpoint.rb +36 -0
  284. data/lib/chef/provider/cookbook_file.rb +100 -0
  285. data/lib/chef/provider/cron.rb +186 -0
  286. data/lib/chef/provider/cron/solaris.rb +195 -0
  287. data/lib/chef/provider/deploy.rb +418 -0
  288. data/lib/chef/provider/deploy/revision.rb +80 -0
  289. data/lib/chef/provider/deploy/timestamped.rb +33 -0
  290. data/lib/chef/provider/directory.rb +72 -0
  291. data/lib/chef/provider/env.rb +152 -0
  292. data/lib/chef/provider/env/windows.rb +75 -0
  293. data/lib/chef/provider/erl_call.rb +101 -0
  294. data/lib/chef/provider/execute.rb +65 -0
  295. data/lib/chef/provider/file.rb +226 -0
  296. data/lib/chef/provider/git.rb +243 -0
  297. data/lib/chef/provider/group.rb +133 -0
  298. data/lib/chef/provider/group/aix.rb +70 -0
  299. data/lib/chef/provider/group/dscl.rb +121 -0
  300. data/lib/chef/provider/group/gpasswd.rb +53 -0
  301. data/lib/chef/provider/group/groupadd.rb +91 -0
  302. data/lib/chef/provider/group/pw.rb +84 -0
  303. data/lib/chef/provider/group/suse.rb +53 -0
  304. data/lib/chef/provider/group/usermod.rb +57 -0
  305. data/lib/chef/provider/group/windows.rb +79 -0
  306. data/lib/chef/provider/http_request.rb +122 -0
  307. data/lib/chef/provider/ifconfig.rb +195 -0
  308. data/lib/chef/provider/link.rb +164 -0
  309. data/lib/chef/provider/log.rb +54 -0
  310. data/lib/chef/provider/mdadm.rb +91 -0
  311. data/lib/chef/provider/mount.rb +114 -0
  312. data/lib/chef/provider/mount/mount.rb +240 -0
  313. data/lib/chef/provider/mount/windows.rb +81 -0
  314. data/lib/chef/provider/ohai.rb +42 -0
  315. data/lib/chef/provider/package.rb +200 -0
  316. data/lib/chef/provider/package/apt.rb +145 -0
  317. data/lib/chef/provider/package/dpkg.rb +115 -0
  318. data/lib/chef/provider/package/easy_install.rb +136 -0
  319. data/lib/chef/provider/package/freebsd.rb +125 -0
  320. data/lib/chef/provider/package/macports.rb +105 -0
  321. data/lib/chef/provider/package/pacman.rb +101 -0
  322. data/lib/chef/provider/package/portage.rb +135 -0
  323. data/lib/chef/provider/package/rpm.rb +104 -0
  324. data/lib/chef/provider/package/rubygems.rb +465 -0
  325. data/lib/chef/provider/package/solaris.rb +130 -0
  326. data/lib/chef/provider/package/yum-dump.py +286 -0
  327. data/lib/chef/provider/package/yum.rb +1173 -0
  328. data/lib/chef/provider/package/zypper.rb +144 -0
  329. data/lib/chef/provider/remote_directory.rb +137 -0
  330. data/lib/chef/provider/remote_file.rb +118 -0
  331. data/lib/chef/provider/route.rb +193 -0
  332. data/lib/chef/provider/ruby_block.rb +34 -0
  333. data/lib/chef/provider/script.rb +55 -0
  334. data/lib/chef/provider/service.rb +122 -0
  335. data/lib/chef/provider/service/arch.rb +116 -0
  336. data/lib/chef/provider/service/debian.rb +130 -0
  337. data/lib/chef/provider/service/freebsd.rb +154 -0
  338. data/lib/chef/provider/service/gentoo.rb +53 -0
  339. data/lib/chef/provider/service/init.rb +71 -0
  340. data/lib/chef/provider/service/insserv.rb +52 -0
  341. data/lib/chef/provider/service/invokercd.rb +35 -0
  342. data/lib/chef/provider/service/redhat.rb +60 -0
  343. data/lib/chef/provider/service/simple.rb +120 -0
  344. data/lib/chef/provider/service/solaris.rb +85 -0
  345. data/lib/chef/provider/service/systemd.rb +102 -0
  346. data/lib/chef/provider/service/upstart.rb +198 -0
  347. data/lib/chef/provider/service/windows.rb +155 -0
  348. data/lib/chef/provider/subversion.rb +197 -0
  349. data/lib/chef/provider/template.rb +104 -0
  350. data/lib/chef/provider/user.rb +186 -0
  351. data/lib/chef/provider/user/dscl.rb +280 -0
  352. data/lib/chef/provider/user/pw.rb +113 -0
  353. data/lib/chef/provider/user/useradd.rb +137 -0
  354. data/lib/chef/provider/user/windows.rb +124 -0
  355. data/lib/chef/providers.rb +95 -0
  356. data/lib/chef/recipe.rb +129 -0
  357. data/lib/chef/resource.rb +609 -0
  358. data/lib/chef/resource/apt_package.rb +34 -0
  359. data/lib/chef/resource/bash.rb +33 -0
  360. data/lib/chef/resource/breakpoint.rb +35 -0
  361. data/lib/chef/resource/conditional.rb +90 -0
  362. data/lib/chef/resource/cookbook_file.rb +45 -0
  363. data/lib/chef/resource/cron.rb +188 -0
  364. data/lib/chef/resource/csh.rb +33 -0
  365. data/lib/chef/resource/deploy.rb +389 -0
  366. data/lib/chef/resource/deploy_revision.rb +40 -0
  367. data/lib/chef/resource/directory.rb +76 -0
  368. data/lib/chef/resource/dpkg_package.rb +34 -0
  369. data/lib/chef/resource/easy_install_package.rb +57 -0
  370. data/lib/chef/resource/env.rb +58 -0
  371. data/lib/chef/resource/erl_call.rb +83 -0
  372. data/lib/chef/resource/execute.rb +127 -0
  373. data/lib/chef/resource/file.rb +99 -0
  374. data/lib/chef/resource/freebsd_package.rb +35 -0
  375. data/lib/chef/resource/gem_package.rb +53 -0
  376. data/lib/chef/resource/git.rb +46 -0
  377. data/lib/chef/resource/group.rb +78 -0
  378. data/lib/chef/resource/http_request.rb +61 -0
  379. data/lib/chef/resource/ifconfig.rb +144 -0
  380. data/lib/chef/resource/link.rb +78 -0
  381. data/lib/chef/resource/log.rb +62 -0
  382. data/lib/chef/resource/macports_package.rb +29 -0
  383. data/lib/chef/resource/mdadm.rb +82 -0
  384. data/lib/chef/resource/mount.rb +134 -0
  385. data/lib/chef/resource/ohai.rb +40 -0
  386. data/lib/chef/resource/package.rb +80 -0
  387. data/lib/chef/resource/pacman_package.rb +33 -0
  388. data/lib/chef/resource/perl.rb +33 -0
  389. data/lib/chef/resource/portage_package.rb +33 -0
  390. data/lib/chef/resource/python.rb +33 -0
  391. data/lib/chef/resource/remote_directory.rb +109 -0
  392. data/lib/chef/resource/remote_file.rb +83 -0
  393. data/lib/chef/resource/route.rb +135 -0
  394. data/lib/chef/resource/rpm_package.rb +34 -0
  395. data/lib/chef/resource/ruby.rb +33 -0
  396. data/lib/chef/resource/ruby_block.rb +40 -0
  397. data/lib/chef/resource/scm.rb +147 -0
  398. data/lib/chef/resource/script.rb +60 -0
  399. data/lib/chef/resource/service.rb +151 -0
  400. data/lib/chef/resource/solaris_package.rb +36 -0
  401. data/lib/chef/resource/subversion.rb +36 -0
  402. data/lib/chef/resource/template.rb +69 -0
  403. data/lib/chef/resource/timestamped_deploy.rb +31 -0
  404. data/lib/chef/resource/user.rb +130 -0
  405. data/lib/chef/resource/yum_package.rb +63 -0
  406. data/lib/chef/resource_collection.rb +217 -0
  407. data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
  408. data/lib/chef/resource_definition.rb +67 -0
  409. data/lib/chef/resource_definition_list.rb +38 -0
  410. data/lib/chef/resources.rb +64 -0
  411. data/lib/chef/rest.rb +400 -0
  412. data/lib/chef/rest/auth_credentials.rb +71 -0
  413. data/lib/chef/rest/cookie_jar.rb +31 -0
  414. data/lib/chef/rest/rest_request.rb +213 -0
  415. data/lib/chef/role.rb +343 -0
  416. data/lib/chef/run_context.rb +126 -0
  417. data/lib/chef/run_list.rb +165 -0
  418. data/lib/chef/run_list/run_list_expansion.rb +193 -0
  419. data/lib/chef/run_list/run_list_item.rb +92 -0
  420. data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
  421. data/lib/chef/run_status.rb +121 -0
  422. data/lib/chef/runner.rb +105 -0
  423. data/lib/chef/sandbox.rb +153 -0
  424. data/lib/chef/search/query.rb +65 -0
  425. data/lib/chef/shef.rb +327 -0
  426. data/lib/chef/shef/ext.rb +569 -0
  427. data/lib/chef/shef/model_wrapper.rb +120 -0
  428. data/lib/chef/shef/shef_rest.rb +28 -0
  429. data/lib/chef/shef/shef_session.rb +285 -0
  430. data/lib/chef/shell_out.rb +249 -0
  431. data/lib/chef/shell_out/unix.rb +223 -0
  432. data/lib/chef/shell_out/windows.rb +588 -0
  433. data/lib/chef/solr_query.rb +187 -0
  434. data/lib/chef/solr_query/lucene.treetop +150 -0
  435. data/lib/chef/solr_query/lucene_nodes.rb +285 -0
  436. data/lib/chef/solr_query/query_transform.rb +65 -0
  437. data/lib/chef/solr_query/solr_http_request.rb +132 -0
  438. data/lib/chef/streaming_cookbook_uploader.rb +201 -0
  439. data/lib/chef/tasks/chef_repo.rake +334 -0
  440. data/lib/chef/util/file_edit.rb +122 -0
  441. data/lib/chef/util/windows.rb +56 -0
  442. data/lib/chef/util/windows/net_group.rb +101 -0
  443. data/lib/chef/util/windows/net_use.rb +121 -0
  444. data/lib/chef/util/windows/net_user.rb +198 -0
  445. data/lib/chef/util/windows/volume.rb +59 -0
  446. data/lib/chef/version.rb +23 -0
  447. data/lib/chef/version_class.rb +70 -0
  448. data/lib/chef/version_constraint.rb +116 -0
  449. data/lib/chef/webui_user.rb +231 -0
  450. metadata +764 -0
@@ -0,0 +1,124 @@
1
+ #
2
+ # Author:: Doug MacEachern (<dougm@vmware.com>)
3
+ # Copyright:: Copyright (c) 2010 VMware, 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/provider/user'
20
+ if RUBY_PLATFORM =~ /mswin|mingw32|windows/
21
+ require 'chef/util/windows/net_user'
22
+ end
23
+
24
+ class Chef
25
+ class Provider
26
+ class User
27
+ class Windows < Chef::Provider::User
28
+
29
+ def initialize(new_resource,run_context)
30
+ super
31
+ @net_user = Chef::Util::Windows::NetUser.new(@new_resource.name)
32
+ end
33
+
34
+ def load_current_resource
35
+ @current_resource = Chef::Resource::User.new(@new_resource.name)
36
+ @current_resource.username(@new_resource.username)
37
+ user_info = nil
38
+ begin
39
+ user_info = @net_user.get_info
40
+ rescue
41
+ @user_exists = false
42
+ Chef::Log.debug("#{@new_resource} does not exist")
43
+ end
44
+
45
+ if user_info
46
+ @current_resource.uid(user_info[:user_id])
47
+ @current_resource.gid(user_info[:primary_group_id])
48
+ @current_resource.comment(user_info[:full_name])
49
+ @current_resource.home(user_info[:home_dir])
50
+ @current_resource.shell(user_info[:script_path])
51
+ end
52
+
53
+ @current_resource
54
+ end
55
+
56
+ # Check to see if the user needs any changes
57
+ #
58
+ # === Returns
59
+ # <true>:: If a change is required
60
+ # <false>:: If the users are identical
61
+ def compare_user
62
+ unless @net_user.validate_credentials(@new_resource.password)
63
+ Chef::Log.debug("#{@new_resource} password has changed")
64
+ return true
65
+ end
66
+ [ :uid, :gid, :comment, :home, :shell ].any? do |user_attrib|
67
+ !@new_resource.send(user_attrib).nil? && @new_resource.send(user_attrib) != @current_resource.send(user_attrib)
68
+ end
69
+ end
70
+
71
+ def create_user
72
+ @net_user.add(set_options)
73
+ end
74
+
75
+ def manage_user
76
+ @net_user.update(set_options)
77
+ end
78
+
79
+ def remove_user
80
+ @net_user.delete
81
+ end
82
+
83
+ def check_lock
84
+ @net_user.check_enabled
85
+ end
86
+
87
+ def lock_user
88
+ @net_user.disable_account
89
+ end
90
+
91
+ def unlock_user
92
+ @net_user.enable_account
93
+ end
94
+
95
+ def set_options
96
+ opts = {:name => @new_resource.username}
97
+
98
+ field_list = {
99
+ 'comment' => 'full_name',
100
+ 'home' => 'home_dir',
101
+ 'gid' => 'primary_group_id',
102
+ 'uid' => 'user_id',
103
+ 'shell' => 'script_path',
104
+ 'password' => 'password'
105
+ }
106
+
107
+ field_list.sort{ |a,b| a[0] <=> b[0] }.each do |field, option|
108
+ field_symbol = field.to_sym
109
+ if @current_resource.send(field_symbol) != @new_resource.send(field_symbol)
110
+ if @new_resource.send(field_symbol)
111
+ unless field_symbol == :password
112
+ Chef::Log.debug("#{@new_resource} setting #{field} to #{@new_resource.send(field_symbol)}")
113
+ end
114
+ opts[option.to_sym] = @new_resource.send(field_symbol)
115
+ end
116
+ end
117
+ end
118
+ opts
119
+ end
120
+
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,95 @@
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/provider/breakpoint'
20
+ require 'chef/provider/cookbook_file'
21
+ require 'chef/provider/cron'
22
+ require 'chef/provider/cron/solaris'
23
+ require 'chef/provider/deploy'
24
+ require 'chef/provider/directory'
25
+ require 'chef/provider/env'
26
+ require 'chef/provider/erl_call'
27
+ require 'chef/provider/execute'
28
+ require 'chef/provider/file'
29
+ require 'chef/provider/git'
30
+ require 'chef/provider/group'
31
+ require 'chef/provider/http_request'
32
+ require 'chef/provider/ifconfig'
33
+ require 'chef/provider/link'
34
+ require 'chef/provider/log'
35
+ require 'chef/provider/ohai'
36
+ require 'chef/provider/mdadm'
37
+ require 'chef/provider/mount'
38
+ require 'chef/provider/package'
39
+ require 'chef/provider/remote_directory'
40
+ require 'chef/provider/remote_file'
41
+ require 'chef/provider/route'
42
+ require 'chef/provider/ruby_block'
43
+ require 'chef/provider/script'
44
+ require 'chef/provider/service'
45
+ require 'chef/provider/subversion'
46
+ require 'chef/provider/template'
47
+ require 'chef/provider/user'
48
+
49
+ require 'chef/provider/env/windows'
50
+
51
+ require 'chef/provider/package/apt'
52
+ require 'chef/provider/package/dpkg'
53
+ require 'chef/provider/package/easy_install'
54
+ require 'chef/provider/package/freebsd'
55
+ require 'chef/provider/package/macports'
56
+ require 'chef/provider/package/pacman'
57
+ require 'chef/provider/package/portage'
58
+ require 'chef/provider/package/rpm'
59
+ require 'chef/provider/package/rubygems'
60
+ require 'chef/provider/package/yum'
61
+ require 'chef/provider/package/zypper'
62
+ require 'chef/provider/package/solaris'
63
+
64
+ require 'chef/provider/service/arch'
65
+ require 'chef/provider/service/debian'
66
+ require 'chef/provider/service/freebsd'
67
+ require 'chef/provider/service/gentoo'
68
+ require 'chef/provider/service/init'
69
+ require 'chef/provider/service/insserv'
70
+ require 'chef/provider/service/redhat'
71
+ require 'chef/provider/service/simple'
72
+ require 'chef/provider/service/systemd'
73
+ require 'chef/provider/service/upstart'
74
+ require 'chef/provider/service/windows'
75
+ require 'chef/provider/service/solaris'
76
+
77
+ require 'chef/provider/user/dscl'
78
+ require 'chef/provider/user/pw'
79
+ require 'chef/provider/user/useradd'
80
+ require 'chef/provider/user/windows'
81
+
82
+ require 'chef/provider/group/aix'
83
+ require 'chef/provider/group/dscl'
84
+ require 'chef/provider/group/gpasswd'
85
+ require 'chef/provider/group/groupadd'
86
+ require 'chef/provider/group/pw'
87
+ require 'chef/provider/group/suse'
88
+ require 'chef/provider/group/usermod'
89
+ require 'chef/provider/group/windows'
90
+
91
+ require 'chef/provider/mount/mount'
92
+ require 'chef/provider/mount/windows'
93
+
94
+ require 'chef/provider/deploy/revision'
95
+ require 'chef/provider/deploy/timestamped'
@@ -0,0 +1,129 @@
1
+ #--
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Christopher Walters (<cw@opscode.com>)
4
+ # Copyright:: Copyright (c) 2008, 2009 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
+
21
+ require 'chef/mixin/recipe_definition_dsl_core'
22
+ require 'chef/mixin/from_file'
23
+ require 'chef/mixin/language'
24
+ require 'chef/mixin/language_include_recipe'
25
+
26
+ require 'chef/mixin/deprecation'
27
+
28
+ class Chef
29
+ # == Chef::Recipe
30
+ # A Recipe object is the context in which Chef recipes are evaluated.
31
+ class Recipe
32
+
33
+ include Chef::Mixin::FromFile
34
+ include Chef::Mixin::Language
35
+ include Chef::Mixin::LanguageIncludeRecipe
36
+ include Chef::Mixin::RecipeDefinitionDSLCore
37
+ include Chef::Mixin::Deprecation
38
+
39
+ attr_accessor :cookbook_name, :recipe_name, :recipe, :params, :run_context
40
+
41
+ # Parses a potentially fully-qualified recipe name into its
42
+ # cookbook name and recipe short name.
43
+ #
44
+ # For example:
45
+ # "aws::elastic_ip" returns [:aws, "elastic_ip"]
46
+ # "aws" returns [:aws, "default"]
47
+ #--
48
+ # TODO: Duplicates functionality of RunListItem
49
+ def self.parse_recipe_name(recipe_name)
50
+ rmatch = recipe_name.match(/(.+?)::(.+)/)
51
+ if rmatch
52
+ [ rmatch[1].to_sym, rmatch[2] ]
53
+ else
54
+ [ recipe_name.to_sym, "default" ]
55
+ end
56
+ end
57
+
58
+ def initialize(cookbook_name, recipe_name, run_context)
59
+ @cookbook_name = cookbook_name
60
+ @recipe_name = recipe_name
61
+ @run_context = run_context
62
+ # TODO: 5/19/2010 cw/tim: determine whether this can be removed
63
+ @params = Hash.new
64
+ @node = deprecated_ivar(run_context.node, :node, :warn)
65
+ end
66
+
67
+ # Used in DSL mixins
68
+ def node
69
+ run_context.node
70
+ end
71
+
72
+ # Used by the DSL to look up resources when executing in the context of a
73
+ # recipe.
74
+ def resources(*args)
75
+ run_context.resource_collection.find(*args)
76
+ end
77
+
78
+ # Sets a tag, or list of tags, for this node. Syntactic sugar for
79
+ # run_context.node[:tags].
80
+ #
81
+ # With no arguments, returns the list of tags.
82
+ #
83
+ # === Parameters
84
+ # tags<Array>:: A list of tags to add - can be a single string
85
+ #
86
+ # === Returns
87
+ # tags<Array>:: The contents of run_context.node[:tags]
88
+ def tag(*tags)
89
+ if tags.length > 0
90
+ tags.each do |tag|
91
+ tag = tag.to_s
92
+ run_context.node[:tags] << tag unless run_context.node[:tags].include?(tag)
93
+ end
94
+ run_context.node[:tags]
95
+ else
96
+ run_context.node[:tags]
97
+ end
98
+ end
99
+
100
+ # Returns true if the node is tagged with *all* of the supplied +tags+.
101
+ #
102
+ # === Parameters
103
+ # tags<Array>:: A list of tags
104
+ #
105
+ # === Returns
106
+ # true<TrueClass>:: If all the parameters are present
107
+ # false<FalseClass>:: If any of the parameters are missing
108
+ def tagged?(*tags)
109
+ tags.each do |tag|
110
+ return false unless run_context.node[:tags].include?(tag)
111
+ end
112
+ true
113
+ end
114
+
115
+ # Removes the list of tags from the node.
116
+ #
117
+ # === Parameters
118
+ # tags<Array>:: A list of tags
119
+ #
120
+ # === Returns
121
+ # tags<Array>:: The current list of run_context.node[:tags]
122
+ def untag(*tags)
123
+ tags.each do |tag|
124
+ run_context.node[:tags].delete(tag)
125
+ end
126
+ end
127
+
128
+ end
129
+ end
@@ -0,0 +1,609 @@
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/resource/conditional'
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
+ FORBIDDEN_IVARS = [:@run_context, :@node, :@not_if, :@only_if]
74
+ HIDDEN_IVARS = [:@allowed_actions, :@resource_name, :@source_line, :@run_context, :@name, :@node]
75
+
76
+ include Chef::Mixin::CheckHelper
77
+ include Chef::Mixin::ParamsValidate
78
+ include Chef::Mixin::Language
79
+ include Chef::Mixin::ConvertToClassName
80
+ include Chef::Mixin::Deprecation
81
+
82
+ attr_accessor :params
83
+ attr_accessor :provider
84
+ attr_accessor :allowed_actions
85
+ attr_accessor :run_context
86
+ attr_accessor :cookbook_name
87
+ attr_accessor :recipe_name
88
+ attr_accessor :enclosing_provider
89
+ attr_accessor :source_line
90
+ attr_accessor :retries
91
+ attr_accessor :retry_delay
92
+
93
+ attr_reader :updated
94
+
95
+ attr_reader :resource_name
96
+ attr_reader :not_if_args
97
+ attr_reader :only_if_args
98
+
99
+ # Each notify entry is a resource/action pair, modeled as an
100
+ # Struct with a #resource and #action member
101
+ attr_reader :immediate_notifications
102
+ attr_reader :delayed_notifications
103
+
104
+ def initialize(name, run_context=nil)
105
+ @name = name
106
+ @run_context = run_context
107
+ @noop = nil
108
+ @before = nil
109
+ @params = Hash.new
110
+ @provider = nil
111
+ @allowed_actions = [ :nothing ]
112
+ @action = :nothing
113
+ @updated = false
114
+ @updated_by_last_action = false
115
+ @supports = {}
116
+ @ignore_failure = false
117
+ @retries = 0
118
+ @retry_delay = 2
119
+ @not_if = []
120
+ @only_if = []
121
+ @immediate_notifications = Array.new
122
+ @delayed_notifications = Array.new
123
+ @source_line = nil
124
+
125
+ @node = run_context ? deprecated_ivar(run_context.node, :node, :warn) : nil
126
+ end
127
+
128
+ def updated=(true_or_false)
129
+ Chef::Log.warn("Chef::Resource#updated=(true|false) is deprecated. Please call #updated_by_last_action(true|false) instead.")
130
+ Chef::Log.warn("Called from:")
131
+ caller[0..3].each {|line| Chef::Log.warn(line)}
132
+ updated_by_last_action(true_or_false)
133
+ @updated = true_or_false
134
+ end
135
+
136
+ def node
137
+ run_context && run_context.node
138
+ end
139
+
140
+ # If an unknown method is invoked, determine whether the enclosing Provider's
141
+ # lexical scope can fulfill the request. E.g. This happens when the Resource's
142
+ # block invokes new_resource.
143
+ def method_missing(method_symbol, *args, &block)
144
+ if enclosing_provider && enclosing_provider.respond_to?(method_symbol)
145
+ enclosing_provider.send(method_symbol, *args, &block)
146
+ else
147
+ raise NoMethodError, "undefined method `#{method_symbol.to_s}' for #{self.class.to_s}"
148
+ end
149
+ end
150
+
151
+ def load_prior_resource
152
+ begin
153
+ prior_resource = run_context.resource_collection.lookup(self.to_s)
154
+ Chef::Log.debug("Setting #{self.to_s} to the state of the prior #{self.to_s}")
155
+ prior_resource.instance_variables.each do |iv|
156
+ unless iv.to_sym == :@source_line || iv.to_sym == :@action
157
+ self.instance_variable_set(iv, prior_resource.instance_variable_get(iv))
158
+ end
159
+ end
160
+ true
161
+ rescue Chef::Exceptions::ResourceNotFound => e
162
+ true
163
+ end
164
+ end
165
+
166
+ def supports(args={})
167
+ if args.any?
168
+ @supports = args
169
+ else
170
+ @supports
171
+ end
172
+ end
173
+
174
+ def provider(arg=nil)
175
+ klass = if arg.kind_of?(String) || arg.kind_of?(Symbol)
176
+ lookup_provider_constant(arg)
177
+ else
178
+ arg
179
+ end
180
+ set_or_return(
181
+ :provider,
182
+ klass,
183
+ :kind_of => [ Class ]
184
+ )
185
+ end
186
+
187
+ def action(arg=nil)
188
+ if arg
189
+ action_list = arg.kind_of?(Array) ? arg : [ arg ]
190
+ action_list = action_list.collect { |a| a.to_sym }
191
+ action_list.each do |action|
192
+ validate(
193
+ {
194
+ :action => action,
195
+ },
196
+ {
197
+ :action => { :kind_of => Symbol, :equal_to => @allowed_actions },
198
+ }
199
+ )
200
+ end
201
+ @action = action_list
202
+ else
203
+ @action
204
+ end
205
+ end
206
+
207
+ def name(name=nil)
208
+ set_if_args(@name, name) do
209
+ raise ArgumentError, "name must be a string!" unless name.kind_of?(String)
210
+ @name = name
211
+ end
212
+ end
213
+
214
+ def noop(tf=nil)
215
+ set_if_args(@noop, tf) do
216
+ raise ArgumentError, "noop must be true or false!" unless tf == true || tf == false
217
+ @noop = tf
218
+ end
219
+ end
220
+
221
+ def ignore_failure(arg=nil)
222
+ set_or_return(
223
+ :ignore_failure,
224
+ arg,
225
+ :kind_of => [ TrueClass, FalseClass ]
226
+ )
227
+ end
228
+
229
+ def retries(arg=nil)
230
+ set_or_return(
231
+ :retries,
232
+ arg,
233
+ :kind_of => Integer
234
+ )
235
+ end
236
+
237
+ def retry_delay(arg=nil)
238
+ set_or_return(
239
+ :retry_delay,
240
+ arg,
241
+ :kind_of => Integer
242
+ )
243
+ end
244
+
245
+ def epic_fail(arg=nil)
246
+ ignore_failure(arg)
247
+ end
248
+
249
+ def notifies(*args)
250
+ unless ( args.size > 0 && args.size < 4)
251
+ raise ArgumentError, "Wrong number of arguments for notifies: should be 1-3 arguments, you gave #{args.inspect}"
252
+ end
253
+
254
+ if args.size > 1 # notifies(:action, resource) OR notifies(:action, resource, :immediately)
255
+ add_notification(*args)
256
+ else
257
+ # This syntax is so weird. surely people will just give us one hash?
258
+ notifications = args.flatten
259
+ notifications.each do |resources_notifications|
260
+ resources_notifications.each do |resource, notification|
261
+ action, timing = notification[0], notification[1]
262
+ Chef::Log.debug "Adding notification from resource #{self} to `#{resource.inspect}' => `#{notification.inspect}'"
263
+ add_notification(action, resource, timing)
264
+ end
265
+ end
266
+ end
267
+ rescue NoMethodError
268
+ Chef::Log.fatal("Error processing notifies(#{args.inspect}) on #{self}")
269
+ raise
270
+ end
271
+
272
+ def add_notification(action, resources, timing=:delayed)
273
+ resources = [resources].flatten
274
+ resources.each do |resource|
275
+ case timing.to_s
276
+ when 'delayed'
277
+ notifies_delayed(action, resource)
278
+ when 'immediate', 'immediately'
279
+ notifies_immediately(action, resource)
280
+ else
281
+ raise ArgumentError, "invalid timing: #{timing} for notifies(#{action}, #{resources.inspect}, #{timing}) resource #{self} "\
282
+ "Valid timings are: :delayed, :immediate, :immediately"
283
+ end
284
+ end
285
+
286
+ true
287
+ end
288
+
289
+ # Iterates over all immediate and delayed notifications, calling
290
+ # resolve_resource_reference on each in turn, causing them to
291
+ # resolve lazy/forward references.
292
+ def resolve_notification_references
293
+ @immediate_notifications.each { |n| n.resolve_resource_reference(run_context.resource_collection) }
294
+ @delayed_notifications.each {|n| n.resolve_resource_reference(run_context.resource_collection) }
295
+ end
296
+
297
+ def notifies_immediately(action, resource_spec)
298
+ @immediate_notifications << Notification.new(resource_spec, action, self)
299
+ end
300
+
301
+ def notifies_delayed(action, resource_spec)
302
+ @delayed_notifications << Notification.new(resource_spec, action, self)
303
+ end
304
+
305
+ def resources(*args)
306
+ run_context.resource_collection.find(*args)
307
+ end
308
+
309
+ def subscribes(action, resources, timing=:delayed)
310
+ resources = [resources].flatten
311
+ resources.each do |resource|
312
+ resource.notifies(action, self, timing)
313
+ end
314
+ true
315
+ end
316
+
317
+ def is(*args)
318
+ if args.size == 1
319
+ args.first
320
+ else
321
+ return *args
322
+ end
323
+ end
324
+
325
+ def to_s
326
+ "#{@resource_name}[#{@name}]"
327
+ end
328
+
329
+ def to_text
330
+ ivars = instance_variables.map { |ivar| ivar.to_sym } - HIDDEN_IVARS
331
+ text = "# Declared in #{@source_line}\n"
332
+ text << convert_to_snake_case(self.class.name, 'Chef::Resource') + "(\"#{name}\") do\n"
333
+ ivars.each do |ivar|
334
+ if (value = instance_variable_get(ivar)) && !(value.respond_to?(:empty?) && value.empty?)
335
+ text << " #{ivar.to_s.sub(/^@/,'')}(#{value.inspect})\n"
336
+ end
337
+ end
338
+ text << "end\n"
339
+ end
340
+
341
+ def inspect
342
+ ivars = instance_variables.map { |ivar| ivar.to_sym } - FORBIDDEN_IVARS
343
+ ivars.inject("<#{to_s}") do |str, ivar|
344
+ str << " #{ivar}: #{instance_variable_get(ivar).inspect}"
345
+ end << ">"
346
+ end
347
+
348
+ # Serialize this object as a hash
349
+ def to_json(*a)
350
+ safe_ivars = instance_variables.map { |ivar| ivar.to_sym } - FORBIDDEN_IVARS
351
+ instance_vars = Hash.new
352
+ safe_ivars.each do |iv|
353
+ instance_vars[iv.to_s.sub(/^@/, '')] = instance_variable_get(iv)
354
+ end
355
+ results = {
356
+ 'json_class' => self.class.name,
357
+ 'instance_vars' => instance_vars
358
+ }
359
+ results.to_json(*a)
360
+ end
361
+
362
+ def to_hash
363
+ safe_ivars = instance_variables.map { |ivar| ivar.to_sym } - FORBIDDEN_IVARS
364
+ instance_vars = Hash.new
365
+ safe_ivars.each do |iv|
366
+ key = iv.to_s.sub(/^@/,'').to_sym
367
+ instance_vars[key] = instance_variable_get(iv)
368
+ end
369
+ instance_vars
370
+ end
371
+
372
+ # If command is a block, returns true if the block returns true, false if it returns false.
373
+ # ("Only run this resource if the block is true")
374
+ #
375
+ # If the command is not a block, executes the command. If it returns any status other than
376
+ # 0, it returns false (clearly, a 0 status code is true)
377
+ #
378
+ # === Parameters
379
+ # command<String>:: A a string to execute.
380
+ # opts<Hash>:: Options control the execution of the command
381
+ # block<Proc>:: A ruby block to run. Ignored if a command is given.
382
+ #
383
+ # === Evaluation
384
+ # * evaluates to true if the block is true, or if the command returns 0
385
+ # * evaluates to false if the block is false, or if the command returns a non-zero exit code.
386
+ def only_if(command=nil, opts={}, &block)
387
+ if command || block_given?
388
+ @only_if << Conditional.only_if(command, opts, &block)
389
+ end
390
+ @only_if
391
+ end
392
+
393
+ # If command is a block, returns false if the block returns true, true if it returns false.
394
+ # ("Do not run this resource if the block is true")
395
+ #
396
+ # If the command is not a block, executes the command. If it returns a 0 exitstatus, returns false.
397
+ # ("Do not run this resource if the command returns 0")
398
+ #
399
+ # === Parameters
400
+ # command<String>:: A a string to execute.
401
+ # opts<Hash>:: Options control the execution of the command
402
+ # block<Proc>:: A ruby block to run. Ignored if a command is given.
403
+ #
404
+ # === Evaluation
405
+ # * evaluates to true if the block is false, or if the command returns a non-zero exit status.
406
+ # * evaluates to false if the block is true, or if the command returns a 0 exit status.
407
+ def not_if(command=nil, opts={}, &block)
408
+ if command || block_given?
409
+ @not_if << Conditional.not_if(command, opts, &block)
410
+ end
411
+ @not_if
412
+ end
413
+
414
+ def defined_at
415
+ if cookbook_name && recipe_name && source_line
416
+ "#{cookbook_name}::#{recipe_name} line #{source_line.split(':')[1]}"
417
+ elsif source_line
418
+ file, line_no = source_line.split(':')
419
+ "#{file} line #{line_no}"
420
+ else
421
+ "dynamically defined"
422
+ end
423
+ end
424
+
425
+ def run_action(action)
426
+ if Chef::Config[:verbose_logging] || Chef::Log.level == :debug
427
+ # This can be noisy
428
+ Chef::Log.info("Processing #{self} action #{action} (#{defined_at})")
429
+ end
430
+
431
+ # ensure that we don't leave @updated_by_last_action set to true
432
+ # on accident
433
+ updated_by_last_action(false)
434
+
435
+ begin
436
+ return if should_skip?
437
+
438
+ provider = Chef::Platform.provider_for_resource(self)
439
+ provider.load_current_resource
440
+ provider.send("action_#{action}")
441
+ rescue => e
442
+ if ignore_failure
443
+ Chef::Log.error("#{self} (#{defined_at}) had an error: #{e.message}")
444
+ else
445
+ Chef::Log.error("#{self} (#{defined_at}) has had an error")
446
+ new_exception = e.exception("#{self} (#{defined_at}) had an error: #{e.class.name}: #{e.message}")
447
+ new_exception.set_backtrace(e.backtrace)
448
+ raise new_exception
449
+ end
450
+ end
451
+ end
452
+
453
+ # Evaluates not_if and only_if conditionals. Returns a falsey value if any
454
+ # of the conditionals indicate that this resource should be skipped, i.e.,
455
+ # if an only_if evaluates to false or a not_if evaluates to true.
456
+ #
457
+ # If this resource should be skipped, returns the first conditional that
458
+ # "fails" its check. Subsequent conditionals are not evaluated, so in
459
+ # general it's not a good idea to rely on side effects from not_if or
460
+ # only_if commands/blocks being evaluated.
461
+ def should_skip?
462
+ conditionals = only_if + not_if
463
+ return false if conditionals.empty?
464
+
465
+ conditionals.find do |conditional|
466
+ if conditional.continue?
467
+ false
468
+ else
469
+ Chef::Log.debug("Skipping #{self} due to #{conditional.description}")
470
+ true
471
+ end
472
+ end
473
+ end
474
+
475
+ def updated_by_last_action(true_or_false)
476
+ @updated ||= true_or_false
477
+ @updated_by_last_action = true_or_false
478
+ end
479
+
480
+ def updated_by_last_action?
481
+ @updated_by_last_action
482
+ end
483
+
484
+ def updated?
485
+ updated
486
+ end
487
+
488
+ class << self
489
+
490
+ def json_create(o)
491
+ resource = self.new(o["instance_vars"]["@name"])
492
+ o["instance_vars"].each do |k,v|
493
+ resource.instance_variable_set("@#{k}".to_sym, v)
494
+ end
495
+ resource
496
+ end
497
+
498
+ include Chef::Mixin::ConvertToClassName
499
+
500
+ def attribute(attr_name, validation_opts={})
501
+ # This atrocity is the only way to support 1.8 and 1.9 at the same time
502
+ # When you're ready to drop 1.8 support, do this:
503
+ # define_method attr_name.to_sym do |arg=nil|
504
+ # etc.
505
+ shim_method=<<-SHIM
506
+ def #{attr_name}(arg=nil)
507
+ _set_or_return_#{attr_name}(arg)
508
+ end
509
+ SHIM
510
+ class_eval(shim_method)
511
+
512
+ define_method("_set_or_return_#{attr_name.to_s}".to_sym) do |arg|
513
+ set_or_return(attr_name.to_sym, arg, validation_opts)
514
+ end
515
+ end
516
+
517
+ def build_from_file(cookbook_name, filename, run_context)
518
+ rname = filename_to_qualified_string(cookbook_name, filename)
519
+
520
+ # Add log entry if we override an existing light-weight resource.
521
+ class_name = convert_to_class_name(rname)
522
+ overriding = Chef::Resource.const_defined?(class_name)
523
+ Chef::Log.info("#{class_name} light-weight resource already initialized -- overriding!") if overriding
524
+
525
+ new_resource_class = Class.new self do |cls|
526
+
527
+ # default initialize method that ensures that when initialize is finally
528
+ # wrapped (see below), super is called in the event that the resource
529
+ # definer does not implement initialize
530
+ def initialize(name, run_context)
531
+ super(name, run_context)
532
+ end
533
+
534
+ @actions_to_create = []
535
+
536
+ class << cls
537
+ include Chef::Mixin::FromFile
538
+
539
+ attr_accessor :run_context
540
+
541
+ def node
542
+ self.run_context.node
543
+ end
544
+
545
+ def actions_to_create
546
+ @actions_to_create
547
+ end
548
+
549
+ define_method(:actions) do |*action_names|
550
+ actions_to_create.push(*action_names)
551
+ end
552
+ end
553
+
554
+ # set the run context in the class instance variable
555
+ cls.run_context = run_context
556
+
557
+ # load resource definition from file
558
+ cls.class_from_file(filename)
559
+
560
+ # create a new constructor that wraps the old one and adds the actions
561
+ # specified in the DSL
562
+ old_init = instance_method(:initialize)
563
+
564
+ define_method(:initialize) do |name, *optional_args|
565
+ args_run_context = optional_args.shift
566
+ @resource_name = rname.to_sym
567
+ old_init.bind(self).call(name, args_run_context)
568
+ allowed_actions.push(self.class.actions_to_create).flatten!
569
+ end
570
+ end
571
+
572
+ # register new class as a Chef::Resource
573
+ class_name = convert_to_class_name(rname)
574
+ Chef::Resource.const_set(class_name, new_resource_class)
575
+ Chef::Log.debug("Loaded contents of #{filename} into a resource named #{rname} defined in Chef::Resource::#{class_name}")
576
+
577
+ new_resource_class
578
+ end
579
+
580
+ # Resources that want providers namespaced somewhere other than
581
+ # Chef::Provider can set the namespace with +provider_base+
582
+ # Ex:
583
+ # class MyResource < Chef::Resource
584
+ # provider_base Chef::Provider::Deploy
585
+ # # ...other stuff
586
+ # end
587
+ def provider_base(arg=nil)
588
+ @provider_base ||= arg
589
+ @provider_base ||= Chef::Provider
590
+ end
591
+
592
+ end
593
+
594
+ private
595
+
596
+ def lookup_provider_constant(name)
597
+ begin
598
+ self.class.provider_base.const_get(convert_to_class_name(name.to_s))
599
+ rescue NameError => e
600
+ if e.to_s =~ /#{Regexp.escape(self.class.provider_base.to_s)}/
601
+ raise ArgumentError, "No provider found to match '#{name}'"
602
+ else
603
+ raise e
604
+ end
605
+ end
606
+ end
607
+
608
+ end
609
+ end