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,49 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ # == String (Patch)
20
+ # On ruby 1.9, Strings are aware of multibyte characters, so +size+ and +length+
21
+ # give the actual number of characters. In Chef::REST, we need the bytesize
22
+ # so we can correctly set the Content-Length headers, but ruby 1.8.6 and lower
23
+ # don't define String#bytesize. Monkey patching time!
24
+
25
+ begin
26
+ require 'enumerator'
27
+ rescue LoadError
28
+ end
29
+
30
+ class String
31
+ unless method_defined?(:bytesize)
32
+ alias :bytesize :size
33
+ end
34
+
35
+ unless method_defined?(:lines)
36
+ def lines
37
+ enum_for(:each)
38
+ end
39
+ end
40
+ end
41
+
42
+ # <= 1.8.6 needs some ord!
43
+ class String
44
+ unless method_defined?(:ord)
45
+ def ord
46
+ self.unpack('c').first
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,64 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ # == Tempfile (Patch)
20
+ # Tempfile has a horrible bug where it causes an IOError: closed stream in its
21
+ # finalizer, leading to intermittent application crashes with confusing stack
22
+ # traces. Here we monkey patch the fix into place. You can track the bug on
23
+ # ruby's redmine: http://redmine.ruby-lang.org/issues/show/3119
24
+ #
25
+ # The patch is slightly different for Ruby 1.8 and Ruby 1.9, both patches are
26
+ # included here.
27
+ class Tempfile # :nodoc:
28
+ # Tempfile has changes between 1.8.x and 1.9.x
29
+ # so we monkey patch separately
30
+ if RUBY_VERSION =~ /^1\.8/
31
+ def unlink
32
+ # keep this order for thread safeness
33
+ begin
34
+ File.unlink(@tmpname) if File.exist?(@tmpname)
35
+ @@cleanlist.delete(@tmpname)
36
+ @tmpname = nil
37
+ ObjectSpace.undefine_finalizer(self)
38
+ rescue Errno::EACCES
39
+ # may not be able to unlink on Windows; just ignore
40
+ end
41
+ end
42
+ alias delete unlink
43
+
44
+
45
+ # There is a patch for this, to be merged into 1.9 at some point.
46
+ # When that happens, we'll want to also check the RUBY_PATCHLEVEL
47
+ elsif RUBY_VERSION =~ /^1\.9/
48
+ def unlink
49
+ # keep this order for thread safeness
50
+ return unless @tmpname
51
+ begin
52
+ if File.exist?(@tmpname)
53
+ File.unlink(@tmpname)
54
+ end
55
+ # remove tmpname from remover
56
+ @data[0] = @data[2] = nil
57
+ @tmpname = nil
58
+ rescue Errno::EACCES
59
+ # may not be able to unlink on Windows; just ignore
60
+ end
61
+ end
62
+ alias delete unlink
63
+ end
64
+ end
@@ -0,0 +1,3 @@
1
+ class Chef
2
+ NIL_ARGUMENT = Object.new
3
+ end
data/lib/chef/node.rb ADDED
@@ -0,0 +1,677 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Christopher Brown (<cb@opscode.com>)
4
+ # Author:: Christopher Walters (<cw@opscode.com>)
5
+ # Author:: Tim Hinderliter (<tim@opscode.com>)
6
+ # Copyright:: Copyright (c) 2008-2011 Opscode, Inc.
7
+ # License:: Apache License, Version 2.0
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+
22
+ require 'forwardable'
23
+ require 'chef/config'
24
+ require 'chef/cookbook/cookbook_collection'
25
+ require 'chef/nil_argument'
26
+ require 'chef/mixin/check_helper'
27
+ require 'chef/mixin/params_validate'
28
+ require 'chef/mixin/from_file'
29
+ require 'chef/mixin/language_include_attribute'
30
+ require 'chef/mixin/deep_merge'
31
+ require 'chef/environment'
32
+ require 'chef/couchdb'
33
+ require 'chef/rest'
34
+ require 'chef/run_list'
35
+ require 'chef/node/attribute'
36
+ require 'chef/index_queue'
37
+ require 'chef/mash'
38
+ require 'chef/json_compat'
39
+ require 'chef/search/query'
40
+
41
+ class Chef
42
+ class Node
43
+
44
+ extend Forwardable
45
+
46
+ def_delegators :construct_attributes, :keys, :each_key, :each_value, :key?, :has_key?
47
+
48
+ attr_accessor :recipe_list, :couchdb, :couchdb_rev, :run_state, :run_list
49
+ attr_accessor :override_attrs, :default_attrs, :normal_attrs, :automatic_attrs
50
+ attr_reader :couchdb_id
51
+
52
+ # TODO: 5/18/2010 cw/timh. cookbook_collection should be removed
53
+ # from here and for any place it's needed, it should be accessed
54
+ # through a Chef::RunContext
55
+ attr_accessor :cookbook_collection
56
+
57
+ include Chef::Mixin::CheckHelper
58
+ include Chef::Mixin::FromFile
59
+ include Chef::Mixin::ParamsValidate
60
+ include Chef::Mixin::LanguageIncludeAttribute
61
+ include Chef::IndexQueue::Indexable
62
+
63
+ DESIGN_DOCUMENT = {
64
+ "version" => 11,
65
+ "language" => "javascript",
66
+ "views" => {
67
+ "all" => {
68
+ "map" => <<-EOJS
69
+ function(doc) {
70
+ if (doc.chef_type == "node") {
71
+ emit(doc.name, doc);
72
+ }
73
+ }
74
+ EOJS
75
+ },
76
+ "all_id" => {
77
+ "map" => <<-EOJS
78
+ function(doc) {
79
+ if (doc.chef_type == "node") {
80
+ emit(doc.name, doc.name);
81
+ }
82
+ }
83
+ EOJS
84
+ },
85
+ "status" => {
86
+ "map" => <<-EOJS
87
+ function(doc) {
88
+ if (doc.chef_type == "node") {
89
+ var to_emit = { "name": doc.name, "chef_environment": doc.chef_environment };
90
+ if (doc["attributes"]["fqdn"]) {
91
+ to_emit["fqdn"] = doc["attributes"]["fqdn"];
92
+ } else {
93
+ to_emit["fqdn"] = "Undefined";
94
+ }
95
+ if (doc["attributes"]["ipaddress"]) {
96
+ to_emit["ipaddress"] = doc["attributes"]["ipaddress"];
97
+ } else {
98
+ to_emit["ipaddress"] = "Undefined";
99
+ }
100
+ if (doc["attributes"]["ohai_time"]) {
101
+ to_emit["ohai_time"] = doc["attributes"]["ohai_time"];
102
+ } else {
103
+ to_emit["ohai_time"] = "Undefined";
104
+ }
105
+ if (doc["attributes"]["uptime"]) {
106
+ to_emit["uptime"] = doc["attributes"]["uptime"];
107
+ } else {
108
+ to_emit["uptime"] = "Undefined";
109
+ }
110
+ if (doc["attributes"]["platform"]) {
111
+ to_emit["platform"] = doc["attributes"]["platform"];
112
+ } else {
113
+ to_emit["platform"] = "Undefined";
114
+ }
115
+ if (doc["attributes"]["platform_version"]) {
116
+ to_emit["platform_version"] = doc["attributes"]["platform_version"];
117
+ } else {
118
+ to_emit["platform_version"] = "Undefined";
119
+ }
120
+ if (doc["run_list"]) {
121
+ to_emit["run_list"] = doc["run_list"];
122
+ } else {
123
+ to_emit["run_list"] = "Undefined";
124
+ }
125
+ emit(doc.name, to_emit);
126
+ }
127
+ }
128
+ EOJS
129
+ },
130
+ "by_run_list" => {
131
+ "map" => <<-EOJS
132
+ function(doc) {
133
+ if (doc.chef_type == "node") {
134
+ if (doc['run_list']) {
135
+ for (var i=0; i < doc.run_list.length; i++) {
136
+ emit(doc['run_list'][i], doc.name);
137
+ }
138
+ }
139
+ }
140
+ }
141
+ EOJS
142
+ },
143
+ "by_environment" => {
144
+ "map" => <<-EOJS
145
+ function(doc) {
146
+ if (doc.chef_type == "node") {
147
+ var env = (doc['chef_environment'] == null ? "_default" : doc['chef_environment']);
148
+ emit(env, doc.name);
149
+ }
150
+ }
151
+ EOJS
152
+ }
153
+ },
154
+ }
155
+
156
+ # Create a new Chef::Node object.
157
+ def initialize(couchdb=nil)
158
+ @name = nil
159
+
160
+ @chef_environment = '_default'
161
+ @normal_attrs = Mash.new
162
+ @override_attrs = Mash.new
163
+ @default_attrs = Mash.new
164
+ @automatic_attrs = Mash.new
165
+ @run_list = Chef::RunList.new
166
+
167
+ @couchdb_rev = nil
168
+ @couchdb_id = nil
169
+ @couchdb = couchdb || Chef::CouchDB.new
170
+
171
+ @run_state = {
172
+ :template_cache => Hash.new,
173
+ :seen_recipes => Hash.new,
174
+ :seen_attributes => Hash.new
175
+ }
176
+ # TODO: 5/20/2010 need this here as long as other objects try to access
177
+ # the cookbook collection via Node, otherwise get NoMethodError on nil.
178
+ @cookbook_collection = CookbookCollection.new
179
+ end
180
+
181
+ def couchdb_id=(value)
182
+ @couchdb_id = value
183
+ @index_id = value
184
+ end
185
+
186
+ # Used by DSL
187
+ def node
188
+ self
189
+ end
190
+
191
+ def chef_server_rest
192
+ Chef::REST.new(Chef::Config[:chef_server_url])
193
+ end
194
+
195
+ # Find a recipe for this Chef::Node by fqdn. Will search first for
196
+ # Chef::Config["node_path"]/fqdn.rb, then hostname.rb, then default.rb.
197
+ #
198
+ # Returns a new Chef::Node object.
199
+ #
200
+ # Raises an ArgumentError if it cannot find the node.
201
+ def find_file(fqdn)
202
+ host_parts = fqdn.split(".")
203
+ hostname = host_parts[0]
204
+
205
+ [fqdn, hostname, "default"].each { |fname|
206
+ node_file = File.join(Chef::Config[:node_path], "#{fname.to_s}.rb")
207
+ return self.from_file(node_file) if File.exists?(node_file)
208
+ }
209
+
210
+ raise ArgumentError, "Cannot find a node matching #{fqdn}, not even with default.rb!"
211
+ end
212
+
213
+ # Set the name of this Node, or return the current name.
214
+ def name(arg=nil)
215
+ if arg != nil
216
+ validate(
217
+ {:name => arg },
218
+ {:name => { :kind_of => String,
219
+ :cannot_be => :blank,
220
+ :regex => /^[\-[:alnum:]_:.]+$/}
221
+ })
222
+ @name = arg
223
+ else
224
+ @name
225
+ end
226
+ end
227
+
228
+ def chef_environment(arg=nil)
229
+ set_or_return(
230
+ :chef_environment,
231
+ arg,
232
+ { :regex => /^[\-[:alnum:]_]+$/, :kind_of => String }
233
+ )
234
+ end
235
+
236
+ # Used by the DSL
237
+ def attribute
238
+ construct_attributes
239
+ end
240
+
241
+ def construct_attributes
242
+ Chef::Node::Attribute.new(normal_attrs, default_attrs, override_attrs, automatic_attrs)
243
+ end
244
+
245
+ def attribute=(value)
246
+ self.normal_attrs = value
247
+ end
248
+
249
+ # Return an attribute of this node. Returns nil if the attribute is not found.
250
+ def [](attrib)
251
+ construct_attributes[attrib]
252
+ end
253
+
254
+ # Set an attribute of this node
255
+ def []=(attrib, value)
256
+ construct_attributes[attrib] = value
257
+ end
258
+
259
+ def store(attrib, value)
260
+ self[attrib] = value
261
+ end
262
+
263
+ # Set a normal attribute of this node, but auto-vivifiy any Mashes that
264
+ # might be missing
265
+ def normal
266
+ attrs = construct_attributes
267
+ attrs.set_type = :normal
268
+ attrs.auto_vivifiy_on_read = true
269
+ attrs
270
+ end
271
+
272
+ alias_method :set, :normal
273
+
274
+ # Set a normal attribute of this node, auto-vivifiying any mashes that are
275
+ # missing, but if the final value already exists, don't set it
276
+ def normal_unless
277
+ attrs = construct_attributes
278
+ attrs.set_type = :normal
279
+ attrs.auto_vivifiy_on_read = true
280
+ attrs.set_unless_value_present = true
281
+ attrs
282
+ end
283
+ alias_method :set_unless, :normal_unless
284
+
285
+ # Set a default of this node, but auto-vivifiy any Mashes that might
286
+ # be missing
287
+ def default
288
+ attrs = construct_attributes
289
+ attrs.set_type = :default
290
+ attrs.auto_vivifiy_on_read = true
291
+ attrs
292
+ end
293
+
294
+ # Set a default attribute of this node, auto-vivifiying any mashes that are
295
+ # missing, but if the final value already exists, don't set it
296
+ def default_unless
297
+ attrs = construct_attributes
298
+ attrs.set_type = :default
299
+ attrs.auto_vivifiy_on_read = true
300
+ attrs.set_unless_value_present = true
301
+ attrs
302
+ end
303
+
304
+ # Set an override attribute of this node, but auto-vivifiy any Mashes that
305
+ # might be missing
306
+ def override
307
+ attrs = construct_attributes
308
+ attrs.set_type = :override
309
+ attrs.auto_vivifiy_on_read = true
310
+ attrs
311
+ end
312
+
313
+ # Set an override attribute of this node, auto-vivifiying any mashes that
314
+ # are missing, but if the final value already exists, don't set it
315
+ def override_unless
316
+ attrs = construct_attributes
317
+ attrs.set_type = :override
318
+ attrs.auto_vivifiy_on_read = true
319
+ attrs.set_unless_value_present = true
320
+ attrs
321
+ end
322
+
323
+ # Return true if this Node has a given attribute, false if not. Takes either a symbol or
324
+ # a string.
325
+ #
326
+ # Only works on the top level. Preferred way is to use the normal [] style
327
+ # lookup and call attribute?()
328
+ def attribute?(attrib)
329
+ construct_attributes.attribute?(attrib)
330
+ end
331
+
332
+ # Yield each key of the top level to the block.
333
+ def each(&block)
334
+ construct_attributes.each(&block)
335
+ end
336
+
337
+ # Iterates over each attribute, passing the attribute and value to the block.
338
+ def each_attribute(&block)
339
+ construct_attributes.each_attribute(&block)
340
+ end
341
+
342
+ # Encouraged to only get used for lookups - while you can do sets from here, it's not as explicit
343
+ # as using the normal/default/override interface.
344
+ def method_missing(symbol, *args)
345
+ attrs = construct_attributes
346
+ attrs.send(symbol, *args)
347
+ end
348
+
349
+ # Returns true if this Node expects a given recipe, false if not.
350
+ #
351
+ # First, the run list is consulted to see whether the recipe is
352
+ # explicitly included. If it's not there, it looks in
353
+ # run_state[:seen_recipes], which is populated by include_recipe
354
+ # statements in the DSL (and thus would not be in the run list).
355
+ #
356
+ # NOTE: It's used by cookbook authors
357
+ def recipe?(recipe_name)
358
+ run_list.include?(recipe_name) || run_state[:seen_recipes].include?(recipe_name)
359
+ end
360
+
361
+ # Returns true if this Node expects a given role, false if not.
362
+ def role?(role_name)
363
+ run_list.include?("role[#{role_name}]")
364
+ end
365
+
366
+ # Returns an Array of roles and recipes, in the order they will be applied.
367
+ # If you call it with arguments, they will become the new list of roles and recipes.
368
+ def run_list(*args)
369
+ args.length > 0 ? @run_list.reset!(args) : @run_list
370
+ end
371
+
372
+ # Returns true if this Node expects a given role, false if not.
373
+ def run_list?(item)
374
+ run_list.detect { |r| r == item } ? true : false
375
+ end
376
+
377
+ # Consume data from ohai and Attributes provided as JSON on the command line.
378
+ def consume_external_attrs(ohai_data, json_cli_attrs)
379
+ Chef::Log.debug("Extracting run list from JSON attributes provided on command line")
380
+ consume_attributes(json_cli_attrs)
381
+
382
+ @automatic_attrs = ohai_data
383
+
384
+ platform, version = Chef::Platform.find_platform_and_version(self)
385
+ Chef::Log.debug("Platform is #{platform} version #{version}")
386
+ @automatic_attrs[:platform] = platform
387
+ @automatic_attrs[:platform_version] = version
388
+ end
389
+
390
+ # Consumes the combined run_list and other attributes in +attrs+
391
+ def consume_attributes(attrs)
392
+ normal_attrs_to_merge = consume_run_list(attrs)
393
+ Chef::Log.debug("Applying attributes from json file")
394
+ @normal_attrs = Chef::Mixin::DeepMerge.merge(@normal_attrs,normal_attrs_to_merge)
395
+ self.tags # make sure they're defined
396
+ end
397
+
398
+ # Lazy initializer for tags attribute
399
+ def tags
400
+ self[:tags] = [] unless attribute?(:tags)
401
+ self[:tags]
402
+ end
403
+
404
+ # Extracts the run list from +attrs+ and applies it. Returns the remaining attributes
405
+ def consume_run_list(attrs)
406
+ attrs = attrs ? attrs.dup : {}
407
+ if new_run_list = attrs.delete("recipes") || attrs.delete("run_list")
408
+ if attrs.key?("recipes") || attrs.key?("run_list")
409
+ raise Chef::Exceptions::AmbiguousRunlistSpecification, "please set the node's run list using the 'run_list' attribute only."
410
+ end
411
+ Chef::Log.info("Setting the run_list to #{new_run_list.inspect} from JSON")
412
+ run_list(new_run_list)
413
+ end
414
+ attrs
415
+ end
416
+
417
+ # Clear defaults and overrides, so that any deleted attributes
418
+ # between runs are still gone.
419
+ def reset_defaults_and_overrides
420
+ @default_attrs = Mash.new
421
+ @override_attrs = Mash.new
422
+ end
423
+
424
+ # Expands the node's run list and sets the default and override
425
+ # attributes. Also applies stored attributes (from json provided
426
+ # on the command line)
427
+ #
428
+ # Returns the fully-expanded list of recipes, a RunListExpansion.
429
+ #
430
+ #--
431
+ # TODO: timh/cw, 5-14-2010: Should this method exist? Should we
432
+ # instead modify default_attrs and override_attrs whenever our
433
+ # run_list is mutated? Or perhaps do something smarter like
434
+ # on-demand generation of default_attrs and override_attrs,
435
+ # invalidated only when run_list is mutated?
436
+ def expand!(data_source = 'server')
437
+ expansion = run_list.expand(chef_environment, data_source)
438
+ raise Chef::Exceptions::MissingRole if expansion.errors?
439
+
440
+ self.tags # make sure they're defined
441
+
442
+ @automatic_attrs[:recipes] = expansion.recipes
443
+ @automatic_attrs[:roles] = expansion.roles
444
+
445
+ expansion
446
+ end
447
+
448
+ # Apply the default and overrides attributes from the expansion
449
+ # passed in, which came from roles.
450
+ def apply_expansion_attributes(expansion)
451
+ load_chef_environment_object = (chef_environment == "_default" ? nil : Chef::Environment.load(chef_environment))
452
+ environment_default_attrs = load_chef_environment_object.nil? ? {} : load_chef_environment_object.default_attributes
453
+ default_before_roles = Chef::Mixin::DeepMerge.merge(default_attrs, environment_default_attrs)
454
+ @default_attrs = Chef::Mixin::DeepMerge.merge(default_before_roles, expansion.default_attrs)
455
+ environment_override_attrs = load_chef_environment_object.nil? ? {} : load_chef_environment_object.override_attributes
456
+ overrides_before_environments = Chef::Mixin::DeepMerge.merge(override_attrs, expansion.override_attrs)
457
+ @override_attrs = Chef::Mixin::DeepMerge.merge(overrides_before_environments, environment_override_attrs)
458
+ end
459
+
460
+ # Transform the node to a Hash
461
+ def to_hash
462
+ index_hash = Hash.new
463
+ index_hash["chef_type"] = "node"
464
+ index_hash["name"] = name
465
+ index_hash["chef_environment"] = chef_environment
466
+ attribute.each do |key, value|
467
+ index_hash[key] = value
468
+ end
469
+ index_hash["recipe"] = run_list.recipe_names if run_list.recipe_names.length > 0
470
+ index_hash["role"] = run_list.role_names if run_list.role_names.length > 0
471
+ index_hash["run_list"] = run_list.run_list if run_list.run_list.length > 0
472
+ index_hash
473
+ end
474
+
475
+ def display_hash
476
+ display = {}
477
+ display["name"] = name
478
+ display["chef_environment"] = chef_environment
479
+ display["automatic"] = automatic_attrs
480
+ display["normal"] = normal_attrs
481
+ display["default"] = default_attrs
482
+ display["override"] = override_attrs
483
+ display["run_list"] = run_list.run_list
484
+ display
485
+ end
486
+
487
+ # Serialize this object as a hash
488
+ def to_json(*a)
489
+ result = {
490
+ "name" => name,
491
+ "chef_environment" => chef_environment,
492
+ 'json_class' => self.class.name,
493
+ "automatic" => automatic_attrs,
494
+ "normal" => normal_attrs,
495
+ "chef_type" => "node",
496
+ "default" => default_attrs,
497
+ "override" => override_attrs,
498
+ "run_list" => run_list.run_list
499
+ }
500
+ result["_rev"] = couchdb_rev if couchdb_rev
501
+ result.to_json(*a)
502
+ end
503
+
504
+ def update_from!(o)
505
+ run_list.reset!(o.run_list)
506
+ @automatic_attrs = o.automatic_attrs
507
+ @normal_attrs = o.normal_attrs
508
+ @override_attrs = o.override_attrs
509
+ @default_attrs = o.default_attrs
510
+ chef_environment(o.chef_environment)
511
+ self
512
+ end
513
+
514
+ # Create a Chef::Node from JSON
515
+ def self.json_create(o)
516
+ node = new
517
+ node.name(o["name"])
518
+ node.chef_environment(o["chef_environment"])
519
+ if o.has_key?("attributes")
520
+ node.normal_attrs = o["attributes"]
521
+ end
522
+ node.automatic_attrs = Mash.new(o["automatic"]) if o.has_key?("automatic")
523
+ node.normal_attrs = Mash.new(o["normal"]) if o.has_key?("normal")
524
+ node.default_attrs = Mash.new(o["default"]) if o.has_key?("default")
525
+ node.override_attrs = Mash.new(o["override"]) if o.has_key?("override")
526
+
527
+ if o.has_key?("run_list")
528
+ node.run_list.reset!(o["run_list"])
529
+ else
530
+ o["recipes"].each { |r| node.recipes << r }
531
+ end
532
+ node.couchdb_rev = o["_rev"] if o.has_key?("_rev")
533
+ node.couchdb_id = o["_id"] if o.has_key?("_id")
534
+ node.index_id = node.couchdb_id
535
+ node
536
+ end
537
+
538
+ def self.cdb_list_by_environment(environment, inflate=false, couchdb=nil)
539
+ rs = (couchdb || Chef::CouchDB.new).get_view("nodes", "by_environment", :include_docs => inflate, :startkey => environment, :endkey => environment)
540
+ inflate ? rs["rows"].collect {|r| r["doc"]} : rs["rows"].collect {|r| r["value"]}
541
+ end
542
+
543
+ def self.list_by_environment(environment, inflate=false)
544
+ if inflate
545
+ response = Hash.new
546
+ Chef::Search::Query.new.search(:node, "chef_environment:#{environment}") {|n| response[n.name] = n unless n.nil?}
547
+ response
548
+ else
549
+ Chef::REST.new(Chef::Config[:chef_server_url]).get_rest("environments/#{environment}/nodes")
550
+ end
551
+ end
552
+
553
+ # List all the Chef::Node objects in the CouchDB. If inflate is set to true, you will get
554
+ # the full list of all Nodes, fully inflated.
555
+ def self.cdb_list(inflate=false, couchdb=nil)
556
+ rs =(couchdb || Chef::CouchDB.new).list("nodes", inflate)
557
+ lookup = (inflate ? "value" : "key")
558
+ rs["rows"].collect { |r| r[lookup] }
559
+ end
560
+
561
+ def self.list(inflate=false)
562
+ if inflate
563
+ response = Hash.new
564
+ Chef::Search::Query.new.search(:node) do |n|
565
+ response[n.name] = n unless n.nil?
566
+ end
567
+ response
568
+ else
569
+ Chef::REST.new(Chef::Config[:chef_server_url]).get_rest("nodes")
570
+ end
571
+ end
572
+
573
+ # Load a node by name from CouchDB
574
+ def self.cdb_load(name, couchdb=nil)
575
+ (couchdb || Chef::CouchDB.new).load("node", name)
576
+ end
577
+
578
+ def self.exists?(nodename, couchdb)
579
+ begin
580
+ self.cdb_load(nodename, couchdb)
581
+ rescue Chef::Exceptions::CouchDBNotFound
582
+ nil
583
+ end
584
+ end
585
+
586
+ def self.find_or_create(node_name)
587
+ load(node_name)
588
+ rescue Net::HTTPServerException => e
589
+ raise unless e.response.code == '404'
590
+ node = build(node_name)
591
+ node.create
592
+ end
593
+
594
+ def self.build(node_name)
595
+ node = new
596
+ node.name(node_name)
597
+ node.chef_environment(Chef::Config[:environment]) unless Chef::Config[:environment].nil? || Chef::Config[:environment].chop.empty?
598
+ node
599
+ end
600
+
601
+ # Load a node by name
602
+ def self.load(name)
603
+ Chef::REST.new(Chef::Config[:chef_server_url]).get_rest("nodes/#{name}")
604
+ end
605
+
606
+ # Remove this node from the CouchDB
607
+ def cdb_destroy
608
+ couchdb.delete("node", name, couchdb_rev)
609
+ end
610
+
611
+ # Remove this node via the REST API
612
+ def destroy
613
+ chef_server_rest.delete_rest("nodes/#{name}")
614
+ end
615
+
616
+ # Save this node to the CouchDB
617
+ def cdb_save
618
+ @couchdb_rev = couchdb.store("node", name, self)["rev"]
619
+ end
620
+
621
+ # Save this node via the REST API
622
+ def save
623
+ # Try PUT. If the node doesn't yet exist, PUT will return 404,
624
+ # so then POST to create.
625
+ begin
626
+ chef_server_rest.put_rest("nodes/#{name}", self)
627
+ rescue Net::HTTPServerException => e
628
+ raise e unless e.response.code == "404"
629
+ chef_server_rest.post_rest("nodes", self)
630
+ end
631
+ self
632
+ end
633
+
634
+ # Create the node via the REST API
635
+ def create
636
+ chef_server_rest.post_rest("nodes", self)
637
+ self
638
+ end
639
+
640
+ # Set up our CouchDB design document
641
+ def self.create_design_document(couchdb=nil)
642
+ (couchdb || Chef::CouchDB.new).create_design_document("nodes", DESIGN_DOCUMENT)
643
+ end
644
+
645
+ def to_s
646
+ "node[#{name}]"
647
+ end
648
+
649
+ # Load all attribute files for all cookbooks associated with this
650
+ # node.
651
+ def load_attributes
652
+ cookbook_collection.values.each do |cookbook|
653
+ cookbook.segment_filenames(:attributes).each do |segment_filename|
654
+ Chef::Log.debug("Node #{name} loading cookbook #{cookbook.name}'s attribute file #{segment_filename}")
655
+ self.from_file(segment_filename)
656
+ end
657
+ end
658
+ end
659
+
660
+ # Used by DSL.
661
+ # Loads the attribute file specified by the short name of the
662
+ # file, e.g., loads specified cookbook's
663
+ # "attributes/mailservers.rb"
664
+ # if passed
665
+ # "mailservers"
666
+ def load_attribute_by_short_filename(name, src_cookbook_name)
667
+ src_cookbook = cookbook_collection[src_cookbook_name]
668
+ raise Chef::Exceptions::CookbookNotFound, "could not find cookbook #{src_cookbook_name} while loading attribute #{name}" unless src_cookbook
669
+
670
+ attribute_filename = src_cookbook.attribute_filenames_by_short_filename[name]
671
+ raise Chef::Exceptions::AttributeNotFound, "could not find filename for attribute #{name} in cookbook #{src_cookbook_name}" unless attribute_filename
672
+
673
+ self.from_file(attribute_filename)
674
+ self
675
+ end
676
+ end
677
+ end