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,71 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Thom May (<thom@clearairturbulence.org>)
4
+ # Author:: Nuo Yan (<nuo@opscode.com>)
5
+ # Author:: Christopher Brown (<cb@opscode.com>)
6
+ # Author:: Christopher Walters (<cw@opscode.com>)
7
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
8
+ # Copyright:: Copyright (c) 2009, 2010 Opscode, Inc.
9
+ # License:: Apache License, Version 2.0
10
+ #
11
+ # Licensed under the Apache License, Version 2.0 (the "License");
12
+ # you may not use this file except in compliance with the License.
13
+ # You may obtain a copy of the License at
14
+ #
15
+ # http://www.apache.org/licenses/LICENSE-2.0
16
+ #
17
+ # Unless required by applicable law or agreed to in writing, software
18
+ # distributed under the License is distributed on an "AS IS" BASIS,
19
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
+ # See the License for the specific language governing permissions and
21
+ # limitations under the License.
22
+ #
23
+ require 'chef/exceptions'
24
+ require 'mixlib/authentication/signedheaderauth'
25
+
26
+ class Chef
27
+ class REST
28
+ class AuthCredentials
29
+ attr_reader :key_file, :client_name, :key, :raw_key
30
+
31
+ def initialize(client_name=nil, key_file=nil)
32
+ @client_name, @key_file = client_name, key_file
33
+ load_signing_key if sign_requests?
34
+ end
35
+
36
+ def sign_requests?
37
+ !!key_file
38
+ end
39
+
40
+ def signature_headers(request_params={})
41
+ raise ArgumentError, "Cannot sign the request without a client name, check that :node_name is assigned" if client_name.nil?
42
+ Chef::Log.debug("Signing the request as #{client_name}")
43
+
44
+ # params_in = {:http_method => :GET, :path => "/clients", :body => "", :host => "localhost"}
45
+ request_params = request_params.dup
46
+ request_params[:timestamp] = Time.now.utc.iso8601
47
+ request_params[:user_id] = client_name
48
+ host = request_params.delete(:host) || "localhost"
49
+
50
+ sign_obj = Mixlib::Authentication::SignedHeaderAuth.signing_object(request_params)
51
+ signed = sign_obj.sign(key).merge({:host => host})
52
+ signed.inject({}){|memo, kv| memo["#{kv[0].to_s.upcase}"] = kv[1];memo}
53
+ end
54
+
55
+ private
56
+
57
+ def load_signing_key
58
+ @raw_key = IO.read(key_file).strip
59
+ @key = OpenSSL::PKey::RSA.new(@raw_key)
60
+ rescue SystemCallError, IOError => e
61
+ Chef::Log.warn "Failed to read the private key #{key_file}: #{e.inspect}"
62
+ raise Chef::Exceptions::PrivateKeyMissing, "I cannot read #{key_file}, which you told me to use to sign requests!"
63
+ rescue OpenSSL::PKey::RSAError
64
+ msg = "The file #{key_file} does not contain a correctly formatted private key.\n"
65
+ msg << "The key file should begin with '-----BEGIN RSA PRIVATE KEY-----' and end with '-----END RSA PRIVATE KEY-----'"
66
+ raise Chef::Exceptions::InvalidPrivateKey, msg
67
+ end
68
+
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,31 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Thom May (<thom@clearairturbulence.org>)
4
+ # Author:: Nuo Yan (<nuo@opscode.com>)
5
+ # Author:: Christopher Brown (<cb@opscode.com>)
6
+ # Author:: Christopher Walters (<cw@opscode.com>)
7
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
8
+ # Copyright:: Copyright (c) 2009, 2010 Opscode, Inc.
9
+ # License:: Apache License, Version 2.0
10
+ #
11
+ # Licensed under the Apache License, Version 2.0 (the "License");
12
+ # you may not use this file except in compliance with the License.
13
+ # You may obtain a copy of the License at
14
+ #
15
+ # http://www.apache.org/licenses/LICENSE-2.0
16
+ #
17
+ # Unless required by applicable law or agreed to in writing, software
18
+ # distributed under the License is distributed on an "AS IS" BASIS,
19
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
+ # See the License for the specific language governing permissions and
21
+ # limitations under the License.
22
+ #
23
+ require 'singleton'
24
+
25
+ class Chef
26
+ class REST
27
+ class CookieJar < Hash
28
+ include Singleton
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,213 @@
1
+ #--
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Thom May (<thom@clearairturbulence.org>)
4
+ # Author:: Nuo Yan (<nuo@opscode.com>)
5
+ # Author:: Christopher Brown (<cb@opscode.com>)
6
+ # Author:: Christopher Walters (<cw@opscode.com>)
7
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
8
+ # Copyright:: Copyright (c) 2009, 2010 Opscode, Inc.
9
+ # License:: Apache License, Version 2.0
10
+ #
11
+ # Licensed under the Apache License, Version 2.0 (the "License");
12
+ # you may not use this file except in compliance with the License.
13
+ # You may obtain a copy of the License at
14
+ #
15
+ # http://www.apache.org/licenses/LICENSE-2.0
16
+ #
17
+ # Unless required by applicable law or agreed to in writing, software
18
+ # distributed under the License is distributed on an "AS IS" BASIS,
19
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
+ # See the License for the specific language governing permissions and
21
+ # limitations under the License.
22
+ #
23
+ require 'uri'
24
+ require 'net/http'
25
+ require 'chef/rest/cookie_jar'
26
+
27
+ # To load faster, we only want ohai's version string.
28
+ # However, in ohai before 0.6.0, the version is defined
29
+ # in ohai, not ohai/version
30
+ begin
31
+ require 'ohai/version' #used in user agent string.
32
+ rescue LoadError
33
+ require 'ohai'
34
+ end
35
+
36
+ require 'chef/version'
37
+
38
+ class Chef
39
+ class REST
40
+ class RESTRequest
41
+
42
+ engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby"
43
+
44
+ UA_COMMON = "/#{::Chef::VERSION} (#{engine}-#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}; ohai-#{Ohai::VERSION}; #{RUBY_PLATFORM}; +http://opscode.com)"
45
+ DEFAULT_UA = "Chef Client" << UA_COMMON
46
+
47
+ def self.user_agent=(ua)
48
+ @user_agent = ua
49
+ end
50
+
51
+ def self.user_agent
52
+ @user_agent ||= DEFAULT_UA
53
+ end
54
+
55
+ attr_reader :method, :url, :headers, :http_client, :http_request
56
+
57
+ def initialize(method, url, req_body, base_headers={})
58
+ @method, @url = method, url
59
+ @request_body = nil
60
+ @cookies = CookieJar.instance
61
+ configure_http_client
62
+ build_headers(base_headers)
63
+ configure_http_request(req_body)
64
+ end
65
+
66
+ def host
67
+ @url.host
68
+ end
69
+
70
+ def port
71
+ @url.port
72
+ end
73
+
74
+ def query
75
+ @url.query
76
+ end
77
+
78
+ def path
79
+ @url.path.empty? ? "/" : @url.path
80
+ end
81
+
82
+ def call
83
+ hide_net_http_bug do
84
+ http_client.request(http_request) do |response|
85
+ store_cookie(response)
86
+ yield response if block_given?
87
+ response
88
+ end
89
+ end
90
+ end
91
+
92
+ def config
93
+ Chef::Config
94
+ end
95
+
96
+ private
97
+
98
+ def hide_net_http_bug
99
+ yield
100
+ rescue NoMethodError => e
101
+ # http://redmine.ruby-lang.org/issues/show/2708
102
+ # http://redmine.ruby-lang.org/issues/show/2758
103
+ if e.to_s =~ /#{Regexp.escape(%q|undefined method `closed?' for nil:NilClass|)}/
104
+ Chef::Log.debug("Rescued error in http connect, re-raising as Errno::ECONNREFUSED to hide bug in net/http")
105
+ Chef::Log.debug("#{e.class.name}: #{e.to_s}")
106
+ Chef::Log.debug(e.backtrace.join("\n"))
107
+ raise Errno::ECONNREFUSED, "Connection refused attempting to contact #{url.scheme}://#{host}:#{port}"
108
+ else
109
+ raise
110
+ end
111
+ end
112
+
113
+ def store_cookie(response)
114
+ if response['set-cookie']
115
+ @cookies["#{host}:#{port}"] = response['set-cookie']
116
+ end
117
+ end
118
+
119
+ def build_headers(headers)
120
+ @headers = headers.dup
121
+ # TODO: need to set accept somewhere else
122
+ # headers.merge!('Accept' => "application/json") unless raw
123
+ @headers['X-Chef-Version'] = ::Chef::VERSION
124
+
125
+ if @cookies.has_key?("#{host}:#{port}")
126
+ @headers['Cookie'] = @cookies["#{host}:#{port}"]
127
+ end
128
+ end
129
+
130
+ #adapted from buildr/lib/buildr/core/transports.rb
131
+ def proxy_uri
132
+ proxy = Chef::Config["#{url.scheme}_proxy"]
133
+ proxy = URI.parse(proxy) if String === proxy
134
+ excludes = Chef::Config[:no_proxy].to_s.split(/\s*,\s*/).compact
135
+ excludes = excludes.map { |exclude| exclude =~ /:\d+$/ ? exclude : "#{exclude}:*" }
136
+ return proxy unless excludes.any? { |exclude| File.fnmatch(exclude, "#{host}:#{port}") }
137
+ end
138
+
139
+ def configure_http_client
140
+ http_proxy = proxy_uri
141
+ if http_proxy.nil?
142
+ @http_client = Net::HTTP.new(host, port)
143
+ else
144
+ Chef::Log.debug("Using #{http_proxy.host}:#{http_proxy.port} for proxy")
145
+ user = Chef::Config["#{url.scheme}_proxy_user"]
146
+ pass = Chef::Config["#{url.scheme}_proxy_pass"]
147
+ @http_client = Net::HTTP.Proxy(http_proxy.host, http_proxy.port, user, pass).new(host, port)
148
+ end
149
+ if url.scheme == "https"
150
+ @http_client.use_ssl = true
151
+ if config[:ssl_verify_mode] == :verify_none
152
+ @http_client.verify_mode = OpenSSL::SSL::VERIFY_NONE
153
+ elsif config[:ssl_verify_mode] == :verify_peer
154
+ @http_client.verify_mode = OpenSSL::SSL::VERIFY_PEER
155
+ end
156
+ if config[:ssl_ca_path]
157
+ unless ::File.exist?(config[:ssl_ca_path])
158
+ raise Chef::Exceptions::ConfigurationError, "The configured ssl_ca_path #{config[:ssl_ca_path]} does not exist"
159
+ end
160
+ @http_client.ca_path = config[:ssl_ca_path]
161
+ elsif config[:ssl_ca_file]
162
+ unless ::File.exist?(config[:ssl_ca_file])
163
+ raise Chef::Exceptions::ConfigurationError, "The configured ssl_ca_file #{config[:ssl_ca_file]} does not exist"
164
+ end
165
+ @http_client.ca_file = config[:ssl_ca_file]
166
+ end
167
+ if (config[:ssl_client_cert] || config[:ssl_client_key])
168
+ unless (config[:ssl_client_cert] && config[:ssl_client_key])
169
+ raise Chef::Exceptions::ConfigurationError, "You must configure ssl_client_cert and ssl_client_key together"
170
+ end
171
+ unless ::File.exists?(config[:ssl_client_cert])
172
+ raise Chef::Exceptions::ConfigurationError, "The configured ssl_client_cert #{config[:ssl_client_cert]} does not exist"
173
+ end
174
+ unless ::File.exists?(config[:ssl_client_key])
175
+ raise Chef::Exceptions::ConfigurationError, "The configured ssl_client_key #{config[:ssl_client_key]} does not exist"
176
+ end
177
+ @http_client.cert = OpenSSL::X509::Certificate.new(::File.read(config[:ssl_client_cert]))
178
+ @http_client.key = OpenSSL::PKey::RSA.new(::File.read(config[:ssl_client_key]))
179
+ end
180
+ end
181
+
182
+ @http_client.read_timeout = config[:rest_timeout]
183
+ end
184
+
185
+
186
+ def configure_http_request(request_body=nil)
187
+ req_path = "#{path}"
188
+ req_path << "?#{query}" if query
189
+
190
+ @http_request = case method.to_s.downcase
191
+ when "get"
192
+ Net::HTTP::Get.new(req_path, headers)
193
+ when "post"
194
+ Net::HTTP::Post.new(req_path, headers)
195
+ when "put"
196
+ Net::HTTP::Put.new(req_path, headers)
197
+ when "delete"
198
+ Net::HTTP::Delete.new(req_path, headers)
199
+ when "head"
200
+ Net::HTTP::Head.new(req_path, headers)
201
+ else
202
+ raise ArgumentError, "You must provide :GET, :PUT, :POST, :DELETE or :HEAD as the method"
203
+ end
204
+
205
+ @http_request.body = request_body if (request_body && @http_request.request_body_permitted?)
206
+ # Optionally handle HTTP Basic Authentication
207
+ @http_request.basic_auth(url.user, url.password) if url.user
208
+ @http_request['User-Agent'] = self.class.user_agent
209
+ end
210
+
211
+ end
212
+ end
213
+ end
data/lib/chef/role.rb ADDED
@@ -0,0 +1,343 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Nuo Yan (<nuo@opscode.com>)
4
+ # Author:: Christopher Brown (<cb@opscode.com>)
5
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
6
+ # License:: Apache License, Version 2.0
7
+ #
8
+ # Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+ #
20
+
21
+ require 'chef/config'
22
+ require 'chef/mixin/params_validate'
23
+ require 'chef/mixin/from_file'
24
+ require 'chef/couchdb'
25
+ require 'chef/run_list'
26
+ require 'chef/index_queue'
27
+ require 'chef/mash'
28
+ require 'chef/json_compat'
29
+ require 'chef/search/query'
30
+
31
+ class Chef
32
+ class Role
33
+
34
+ include Chef::Mixin::FromFile
35
+ include Chef::Mixin::ParamsValidate
36
+ include Chef::IndexQueue::Indexable
37
+
38
+ DESIGN_DOCUMENT = {
39
+ "version" => 6,
40
+ "language" => "javascript",
41
+ "views" => {
42
+ "all" => {
43
+ "map" => <<-EOJS
44
+ function(doc) {
45
+ if (doc.chef_type == "role") {
46
+ emit(doc.name, doc);
47
+ }
48
+ }
49
+ EOJS
50
+ },
51
+ "all_id" => {
52
+ "map" => <<-EOJS
53
+ function(doc) {
54
+ if (doc.chef_type == "role") {
55
+ emit(doc.name, doc.name);
56
+ }
57
+ }
58
+ EOJS
59
+ }
60
+ }
61
+ }
62
+
63
+ attr_accessor :couchdb_rev, :couchdb
64
+ attr_reader :couchdb_id
65
+
66
+ # Create a new Chef::Role object.
67
+ def initialize(couchdb=nil)
68
+ @name = ''
69
+ @description = ''
70
+ @default_attributes = Mash.new
71
+ @override_attributes = Mash.new
72
+ @env_run_lists = {"_default" => Chef::RunList.new}
73
+ @couchdb_rev = nil
74
+ @couchdb_id = nil
75
+ @couchdb = couchdb || Chef::CouchDB.new
76
+ end
77
+
78
+ def couchdb_id=(value)
79
+ @couchdb_id = value
80
+ self.index_id = value
81
+ end
82
+
83
+ def chef_server_rest
84
+ Chef::REST.new(Chef::Config[:chef_server_url])
85
+ end
86
+
87
+ def self.chef_server_rest
88
+ Chef::REST.new(Chef::Config[:chef_server_url])
89
+ end
90
+
91
+ def name(arg=nil)
92
+ set_or_return(
93
+ :name,
94
+ arg,
95
+ :regex => /^[\-[:alnum:]_]+$/
96
+ )
97
+ end
98
+
99
+ def description(arg=nil)
100
+ set_or_return(
101
+ :description,
102
+ arg,
103
+ :kind_of => String
104
+ )
105
+ end
106
+
107
+ def run_list(*args)
108
+ if (args.length > 0)
109
+ @env_run_lists["_default"].reset!(args)
110
+ end
111
+ @env_run_lists["_default"]
112
+ end
113
+
114
+ alias_method :recipes, :run_list
115
+
116
+ # For run_list expansion
117
+ def run_list_for(environment)
118
+ if env_run_lists[environment].nil?
119
+ env_run_lists["_default"]
120
+ else
121
+ env_run_lists[environment]
122
+ end
123
+ end
124
+
125
+ def active_run_list_for(environment)
126
+ @env_run_lists.has_key?(environment) ? environment : '_default'
127
+ end
128
+
129
+ # Per environment run lists
130
+ def env_run_lists(env_run_lists=nil)
131
+ if (!env_run_lists.nil?)
132
+ unless env_run_lists.key?("_default")
133
+ msg = "_default key is required in env_run_lists.\n"
134
+ msg << "(env_run_lists: #{env_run_lists.inspect})"
135
+ raise Chef::Exceptions::InvalidEnvironmentRunListSpecification, msg
136
+ end
137
+ @env_run_lists.clear
138
+ env_run_lists.each { |k,v| @env_run_lists[k] = Chef::RunList.new(*Array(v))}
139
+ end
140
+ @env_run_lists
141
+ end
142
+
143
+ alias :env_run_list :env_run_lists
144
+
145
+ def default_attributes(arg=nil)
146
+ set_or_return(
147
+ :default_attributes,
148
+ arg,
149
+ :kind_of => Hash
150
+ )
151
+ end
152
+
153
+ def override_attributes(arg=nil)
154
+ set_or_return(
155
+ :override_attributes,
156
+ arg,
157
+ :kind_of => Hash
158
+ )
159
+ end
160
+
161
+ def to_hash
162
+ env_run_lists_without_default = @env_run_lists.dup
163
+ env_run_lists_without_default.delete("_default")
164
+ result = {
165
+ "name" => @name,
166
+ "description" => @description,
167
+ 'json_class' => self.class.name,
168
+ "default_attributes" => @default_attributes,
169
+ "override_attributes" => @override_attributes,
170
+ "chef_type" => "role",
171
+ "run_list" => run_list,
172
+ "env_run_lists" => env_run_lists_without_default
173
+ }
174
+ result["_rev"] = couchdb_rev if couchdb_rev
175
+ result
176
+ end
177
+
178
+ # Serialize this object as a hash
179
+ def to_json(*a)
180
+ to_hash.to_json(*a)
181
+ end
182
+
183
+ def update_from!(o)
184
+ description(o.description)
185
+ recipes(o.recipes) if defined?(o.recipes)
186
+ default_attributes(o.default_attributes)
187
+ override_attributes(o.override_attributes)
188
+ env_run_lists(o.env_run_lists) unless o.env_run_lists.nil?
189
+ self
190
+ end
191
+
192
+ # Create a Chef::Role from JSON
193
+ def self.json_create(o)
194
+ role = new
195
+ role.name(o["name"])
196
+ role.description(o["description"])
197
+ role.default_attributes(o["default_attributes"])
198
+ role.override_attributes(o["override_attributes"])
199
+
200
+ # _default run_list is in 'run_list' for newer clients, and
201
+ # 'recipes' for older clients.
202
+ env_run_list_hash = {"_default" => (o.has_key?("run_list") ? o["run_list"] : o["recipes"])}
203
+
204
+ # Clients before 0.10 do not include env_run_lists, so only
205
+ # merge if it's there.
206
+ if o["env_run_lists"]
207
+ env_run_list_hash.merge!(o["env_run_lists"])
208
+ end
209
+ role.env_run_lists(env_run_list_hash)
210
+
211
+ role.couchdb_rev = o["_rev"] if o.has_key?("_rev")
212
+ role.index_id = role.couchdb_id
213
+ role.couchdb_id = o["_id"] if o.has_key?("_id")
214
+ role
215
+ end
216
+
217
+ # List all the Chef::Role objects in the CouchDB. If inflate is set to true, you will get
218
+ # the full list of all Roles, fully inflated.
219
+ def self.cdb_list(inflate=false, couchdb=nil)
220
+ rs = (couchdb || Chef::CouchDB.new).list("roles", inflate)
221
+ lookup = (inflate ? "value" : "key")
222
+ rs["rows"].collect { |r| r[lookup] }
223
+ end
224
+
225
+ # Get the list of all roles from the API.
226
+ def self.list(inflate=false)
227
+ if inflate
228
+ response = Hash.new
229
+ Chef::Search::Query.new.search(:role) do |n|
230
+ response[n.name] = n unless n.nil?
231
+ end
232
+ response
233
+ else
234
+ chef_server_rest.get_rest("roles")
235
+ end
236
+ end
237
+
238
+ # Load a role by name from CouchDB
239
+ def self.cdb_load(name, couchdb=nil)
240
+ (couchdb || Chef::CouchDB.new).load("role", name)
241
+ end
242
+
243
+ # Load a role by name from the API
244
+ def self.load(name)
245
+ chef_server_rest.get_rest("roles/#{name}")
246
+ end
247
+
248
+ def self.exists?(rolename, couchdb)
249
+ begin
250
+ self.cdb_load(rolename, couchdb)
251
+ rescue Chef::Exceptions::CouchDBNotFound
252
+ nil
253
+ end
254
+ end
255
+
256
+ def environment(env_name)
257
+ chef_server_rest.get_rest("roles/#{@name}/environments/#{env_name}")
258
+ end
259
+
260
+ def environments
261
+ chef_server_rest.get_rest("roles/#{@name}/environments")
262
+ end
263
+
264
+ # Remove this role from the CouchDB
265
+ def cdb_destroy
266
+ couchdb.delete("role", @name, couchdb_rev)
267
+ end
268
+
269
+ # Remove this role via the REST API
270
+ def destroy
271
+ chef_server_rest.delete_rest("roles/#{@name}")
272
+ end
273
+
274
+ # Save this role to the CouchDB
275
+ def cdb_save
276
+ self.couchdb_rev = couchdb.store("role", @name, self)["rev"]
277
+ end
278
+
279
+ # Save this role via the REST API
280
+ def save
281
+ begin
282
+ chef_server_rest.put_rest("roles/#{@name}", self)
283
+ rescue Net::HTTPServerException => e
284
+ raise e unless e.response.code == "404"
285
+ chef_server_rest.post_rest("roles", self)
286
+ end
287
+ self
288
+ end
289
+
290
+ # Create the role via the REST API
291
+ def create
292
+ chef_server_rest.post_rest("roles", self)
293
+ self
294
+ end
295
+
296
+ # Set up our CouchDB design document
297
+ def self.create_design_document(couchdb=nil)
298
+ (couchdb || Chef::CouchDB.new).create_design_document("roles", DESIGN_DOCUMENT)
299
+ end
300
+
301
+ # As a string
302
+ def to_s
303
+ "role[#{@name}]"
304
+ end
305
+
306
+ # Load a role from disk - prefers to load the JSON, but will happily load
307
+ # the raw rb files as well.
308
+ def self.from_disk(name, force=nil)
309
+ js_file = File.join(Chef::Config[:role_path], "#{name}.json")
310
+ rb_file = File.join(Chef::Config[:role_path], "#{name}.rb")
311
+
312
+ if File.exists?(js_file) || force == "json"
313
+ # from_json returns object.class => json_class in the JSON.
314
+ Chef::JSONCompat.from_json(IO.read(js_file))
315
+ elsif File.exists?(rb_file) || force == "ruby"
316
+ role = Chef::Role.new
317
+ role.name(name)
318
+ role.from_file(rb_file)
319
+ role
320
+ else
321
+ raise Chef::Exceptions::RoleNotFound, "Role '#{name}' could not be loaded from disk"
322
+ end
323
+ end
324
+
325
+ # Sync all the json roles with couchdb from disk
326
+ def self.sync_from_disk_to_couchdb
327
+ Dir[File.join(Chef::Config[:role_path], "*.json")].each do |role_file|
328
+ short_name = File.basename(role_file, ".json")
329
+ Chef::Log.warn("Loading #{short_name}")
330
+ r = Chef::Role.from_disk(short_name, "json")
331
+ begin
332
+ couch_role = Chef::Role.cdb_load(short_name)
333
+ r.couchdb_rev = couch_role.couchdb_rev
334
+ Chef::Log.debug("Replacing role #{short_name} with data from #{role_file}")
335
+ rescue Chef::Exceptions::CouchDBNotFound
336
+ Chef::Log.debug("Creating role #{short_name} with data from #{role_file}")
337
+ end
338
+ r.cdb_save
339
+ end
340
+ end
341
+
342
+ end
343
+ end