TrueCar-chef 0.10.0.beta.3

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 (372) 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-server-webui.conf +10 -0
  10. data/distro/arch/etc/conf.d/chef-server.conf +10 -0
  11. data/distro/arch/etc/conf.d/chef-solr-indexer.conf +8 -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-server +78 -0
  15. data/distro/arch/etc/rc.d/chef-server-webui +78 -0
  16. data/distro/arch/etc/rc.d/chef-solr +78 -0
  17. data/distro/arch/etc/rc.d/chef-solr-indexer +78 -0
  18. data/distro/common/man/man1/chef-indexer.1 +42 -0
  19. data/distro/common/man/man1/chef-server-webui.1 +106 -0
  20. data/distro/common/man/man1/chef-server.1 +107 -0
  21. data/distro/common/man/man1/chef-solr-indexer.1 +55 -0
  22. data/distro/common/man/man1/chef-solr.1 +55 -0
  23. data/distro/common/man/man8/chef-client.8 +63 -0
  24. data/distro/common/man/man8/chef-solo.8 +57 -0
  25. data/distro/common/man/man8/chef-solr-rebuild.8 +37 -0
  26. data/distro/common/man/man8/knife.8 +1349 -0
  27. data/distro/common/man/man8/shef.8 +45 -0
  28. data/distro/common/markdown/README +3 -0
  29. data/distro/common/markdown/knife.mkd +865 -0
  30. data/distro/debian/etc/default/chef-client +4 -0
  31. data/distro/debian/etc/default/chef-server +9 -0
  32. data/distro/debian/etc/default/chef-server-webui +9 -0
  33. data/distro/debian/etc/default/chef-solr +8 -0
  34. data/distro/debian/etc/default/chef-solr-indexer +7 -0
  35. data/distro/debian/etc/init.d/chef-client +175 -0
  36. data/distro/debian/etc/init.d/chef-server +122 -0
  37. data/distro/debian/etc/init.d/chef-server-webui +123 -0
  38. data/distro/debian/etc/init.d/chef-solr +176 -0
  39. data/distro/debian/etc/init.d/chef-solr-indexer +176 -0
  40. data/distro/debian/etc/init/chef-client.conf +17 -0
  41. data/distro/debian/etc/init/chef-server-webui.conf +17 -0
  42. data/distro/debian/etc/init/chef-server.conf +17 -0
  43. data/distro/debian/etc/init/chef-solr-indexer.conf +17 -0
  44. data/distro/debian/etc/init/chef-solr.conf +17 -0
  45. data/distro/redhat/etc/init.d/chef-client +106 -0
  46. data/distro/redhat/etc/init.d/chef-server +112 -0
  47. data/distro/redhat/etc/init.d/chef-server-webui +112 -0
  48. data/distro/redhat/etc/init.d/chef-solr +104 -0
  49. data/distro/redhat/etc/init.d/chef-solr-indexer +104 -0
  50. data/distro/redhat/etc/logrotate.d/chef-client +8 -0
  51. data/distro/redhat/etc/logrotate.d/chef-server +8 -0
  52. data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
  53. data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
  54. data/distro/redhat/etc/logrotate.d/chef-solr-indexer +8 -0
  55. data/distro/redhat/etc/sysconfig/chef-client +15 -0
  56. data/distro/redhat/etc/sysconfig/chef-server +14 -0
  57. data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
  58. data/distro/redhat/etc/sysconfig/chef-solr +8 -0
  59. data/distro/redhat/etc/sysconfig/chef-solr-indexer +7 -0
  60. data/lib/chef.rb +40 -0
  61. data/lib/chef/api_client.rb +264 -0
  62. data/lib/chef/application.rb +137 -0
  63. data/lib/chef/application/agent.rb +18 -0
  64. data/lib/chef/application/client.rb +242 -0
  65. data/lib/chef/application/knife.rb +169 -0
  66. data/lib/chef/application/solo.rb +217 -0
  67. data/lib/chef/applications.rb +4 -0
  68. data/lib/chef/certificate.rb +194 -0
  69. data/lib/chef/checksum.rb +182 -0
  70. data/lib/chef/checksum_cache.rb +189 -0
  71. data/lib/chef/client.rb +362 -0
  72. data/lib/chef/config.rb +244 -0
  73. data/lib/chef/cookbook/chefignore.rb +66 -0
  74. data/lib/chef/cookbook/cookbook_collection.rb +45 -0
  75. data/lib/chef/cookbook/cookbook_version_loader.rb +151 -0
  76. data/lib/chef/cookbook/file_system_file_vendor.rb +56 -0
  77. data/lib/chef/cookbook/file_vendor.rb +48 -0
  78. data/lib/chef/cookbook/metadata.rb +592 -0
  79. data/lib/chef/cookbook/remote_file_vendor.rb +87 -0
  80. data/lib/chef/cookbook/syntax_check.rb +136 -0
  81. data/lib/chef/cookbook_loader.rb +103 -0
  82. data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
  83. data/lib/chef/cookbook_uploader.rb +125 -0
  84. data/lib/chef/cookbook_version.rb +979 -0
  85. data/lib/chef/cookbook_version_selector.rb +163 -0
  86. data/lib/chef/couchdb.rb +247 -0
  87. data/lib/chef/daemon.rb +172 -0
  88. data/lib/chef/data_bag.rb +223 -0
  89. data/lib/chef/data_bag_item.rb +267 -0
  90. data/lib/chef/encrypted_data_bag_item.rb +126 -0
  91. data/lib/chef/environment.rb +386 -0
  92. data/lib/chef/exceptions.rb +153 -0
  93. data/lib/chef/file_access_control.rb +140 -0
  94. data/lib/chef/file_cache.rb +218 -0
  95. data/lib/chef/handler.rb +206 -0
  96. data/lib/chef/handler/json_file.rb +58 -0
  97. data/lib/chef/index_queue.rb +29 -0
  98. data/lib/chef/index_queue/amqp_client.rb +116 -0
  99. data/lib/chef/index_queue/consumer.rb +76 -0
  100. data/lib/chef/index_queue/indexable.rb +109 -0
  101. data/lib/chef/json_compat.rb +52 -0
  102. data/lib/chef/knife.rb +424 -0
  103. data/lib/chef/knife/bootstrap.rb +185 -0
  104. data/lib/chef/knife/bootstrap/archlinux-gems.erb +47 -0
  105. data/lib/chef/knife/bootstrap/centos5-gems.erb +41 -0
  106. data/lib/chef/knife/bootstrap/client-install.vbs +80 -0
  107. data/lib/chef/knife/bootstrap/fedora13-gems.erb +38 -0
  108. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +32 -0
  109. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +46 -0
  110. data/lib/chef/knife/bootstrap/windows-gems.erb +34 -0
  111. data/lib/chef/knife/client_bulk_delete.rb +43 -0
  112. data/lib/chef/knife/client_create.rb +73 -0
  113. data/lib/chef/knife/client_delete.rb +48 -0
  114. data/lib/chef/knife/client_edit.rb +48 -0
  115. data/lib/chef/knife/client_list.rb +43 -0
  116. data/lib/chef/knife/client_reregister.rb +59 -0
  117. data/lib/chef/knife/client_show.rb +53 -0
  118. data/lib/chef/knife/configure.rb +136 -0
  119. data/lib/chef/knife/configure_client.rb +52 -0
  120. data/lib/chef/knife/cookbook_bulk_delete.rb +61 -0
  121. data/lib/chef/knife/cookbook_create.rb +274 -0
  122. data/lib/chef/knife/cookbook_delete.rb +149 -0
  123. data/lib/chef/knife/cookbook_download.rb +134 -0
  124. data/lib/chef/knife/cookbook_list.rb +50 -0
  125. data/lib/chef/knife/cookbook_metadata.rb +102 -0
  126. data/lib/chef/knife/cookbook_metadata_from_file.rb +44 -0
  127. data/lib/chef/knife/cookbook_show.rb +101 -0
  128. data/lib/chef/knife/cookbook_site_download.rb +58 -0
  129. data/lib/chef/knife/cookbook_site_list.rb +56 -0
  130. data/lib/chef/knife/cookbook_site_search.rb +51 -0
  131. data/lib/chef/knife/cookbook_site_share.rb +114 -0
  132. data/lib/chef/knife/cookbook_site_show.rb +57 -0
  133. data/lib/chef/knife/cookbook_site_unshare.rb +56 -0
  134. data/lib/chef/knife/cookbook_site_vendor.rb +145 -0
  135. data/lib/chef/knife/cookbook_test.rb +82 -0
  136. data/lib/chef/knife/cookbook_upload.rb +146 -0
  137. data/lib/chef/knife/data_bag_create.rb +94 -0
  138. data/lib/chef/knife/data_bag_delete.rb +51 -0
  139. data/lib/chef/knife/data_bag_edit.rb +94 -0
  140. data/lib/chef/knife/data_bag_from_file.rb +85 -0
  141. data/lib/chef/knife/data_bag_list.rb +46 -0
  142. data/lib/chef/knife/data_bag_show.rb +81 -0
  143. data/lib/chef/knife/environment_create.rb +53 -0
  144. data/lib/chef/knife/environment_delete.rb +45 -0
  145. data/lib/chef/knife/environment_edit.rb +45 -0
  146. data/lib/chef/knife/environment_from_file.rb +39 -0
  147. data/lib/chef/knife/environment_list.rb +42 -0
  148. data/lib/chef/knife/environment_show.rb +46 -0
  149. data/lib/chef/knife/exec.rb +51 -0
  150. data/lib/chef/knife/index_rebuild.rb +50 -0
  151. data/lib/chef/knife/node_bulk_delete.rb +46 -0
  152. data/lib/chef/knife/node_create.rb +50 -0
  153. data/lib/chef/knife/node_delete.rb +47 -0
  154. data/lib/chef/knife/node_edit.rb +163 -0
  155. data/lib/chef/knife/node_from_file.rb +45 -0
  156. data/lib/chef/knife/node_list.rb +46 -0
  157. data/lib/chef/knife/node_run_list_add.rb +67 -0
  158. data/lib/chef/knife/node_run_list_remove.rb +48 -0
  159. data/lib/chef/knife/node_show.rb +62 -0
  160. data/lib/chef/knife/recipe_list.rb +33 -0
  161. data/lib/chef/knife/role_bulk_delete.rb +47 -0
  162. data/lib/chef/knife/role_create.rb +55 -0
  163. data/lib/chef/knife/role_delete.rb +47 -0
  164. data/lib/chef/knife/role_edit.rb +48 -0
  165. data/lib/chef/knife/role_from_file.rb +49 -0
  166. data/lib/chef/knife/role_list.rb +43 -0
  167. data/lib/chef/knife/role_show.rb +54 -0
  168. data/lib/chef/knife/search.rb +123 -0
  169. data/lib/chef/knife/ssh.rb +318 -0
  170. data/lib/chef/knife/status.rb +90 -0
  171. data/lib/chef/knife/subcommand_loader.rb +101 -0
  172. data/lib/chef/knife/tag_create.rb +31 -0
  173. data/lib/chef/knife/tag_delete.rb +31 -0
  174. data/lib/chef/knife/tag_list.rb +29 -0
  175. data/lib/chef/knife/ui.rb +227 -0
  176. data/lib/chef/knife/windows_bootstrap.rb +157 -0
  177. data/lib/chef/log.rb +39 -0
  178. data/lib/chef/mash.rb +211 -0
  179. data/lib/chef/mixin/check_helper.rb +31 -0
  180. data/lib/chef/mixin/checksum.rb +32 -0
  181. data/lib/chef/mixin/command.rb +221 -0
  182. data/lib/chef/mixin/command/unix.rb +215 -0
  183. data/lib/chef/mixin/command/windows.rb +76 -0
  184. data/lib/chef/mixin/convert_to_class_name.rb +63 -0
  185. data/lib/chef/mixin/create_path.rb +56 -0
  186. data/lib/chef/mixin/deep_merge.rb +225 -0
  187. data/lib/chef/mixin/deprecation.rb +65 -0
  188. data/lib/chef/mixin/from_file.rb +50 -0
  189. data/lib/chef/mixin/language.rb +165 -0
  190. data/lib/chef/mixin/language_include_attribute.rb +61 -0
  191. data/lib/chef/mixin/language_include_recipe.rb +52 -0
  192. data/lib/chef/mixin/params_validate.rb +225 -0
  193. data/lib/chef/mixin/recipe_definition_dsl_core.rb +81 -0
  194. data/lib/chef/mixin/shell_out.rb +40 -0
  195. data/lib/chef/mixin/template.rb +95 -0
  196. data/lib/chef/mixin/xml_escape.rb +140 -0
  197. data/lib/chef/mixins.rb +15 -0
  198. data/lib/chef/monkey_patches/dir.rb +36 -0
  199. data/lib/chef/monkey_patches/numeric.rb +7 -0
  200. data/lib/chef/monkey_patches/regexp.rb +34 -0
  201. data/lib/chef/monkey_patches/string.rb +28 -0
  202. data/lib/chef/monkey_patches/tempfile.rb +64 -0
  203. data/lib/chef/nil_argument.rb +3 -0
  204. data/lib/chef/node.rb +661 -0
  205. data/lib/chef/node/attribute.rb +487 -0
  206. data/lib/chef/openid_registration.rb +187 -0
  207. data/lib/chef/platform.rb +409 -0
  208. data/lib/chef/provider.rb +124 -0
  209. data/lib/chef/provider/breakpoint.rb +36 -0
  210. data/lib/chef/provider/cookbook_file.rb +101 -0
  211. data/lib/chef/provider/cron.rb +186 -0
  212. data/lib/chef/provider/cron/solaris.rb +195 -0
  213. data/lib/chef/provider/deploy.rb +320 -0
  214. data/lib/chef/provider/deploy/revision.rb +80 -0
  215. data/lib/chef/provider/deploy/timestamped.rb +33 -0
  216. data/lib/chef/provider/directory.rb +72 -0
  217. data/lib/chef/provider/env.rb +152 -0
  218. data/lib/chef/provider/env/windows.rb +75 -0
  219. data/lib/chef/provider/erl_call.rb +100 -0
  220. data/lib/chef/provider/execute.rb +60 -0
  221. data/lib/chef/provider/file.rb +222 -0
  222. data/lib/chef/provider/git.rb +221 -0
  223. data/lib/chef/provider/group.rb +133 -0
  224. data/lib/chef/provider/group/aix.rb +70 -0
  225. data/lib/chef/provider/group/dscl.rb +121 -0
  226. data/lib/chef/provider/group/gpasswd.rb +53 -0
  227. data/lib/chef/provider/group/groupadd.rb +81 -0
  228. data/lib/chef/provider/group/pw.rb +84 -0
  229. data/lib/chef/provider/group/usermod.rb +57 -0
  230. data/lib/chef/provider/group/windows.rb +79 -0
  231. data/lib/chef/provider/http_request.rb +122 -0
  232. data/lib/chef/provider/ifconfig.rb +132 -0
  233. data/lib/chef/provider/link.rb +161 -0
  234. data/lib/chef/provider/log.rb +54 -0
  235. data/lib/chef/provider/mdadm.rb +91 -0
  236. data/lib/chef/provider/mount.rb +117 -0
  237. data/lib/chef/provider/mount/mount.rb +232 -0
  238. data/lib/chef/provider/mount/windows.rb +80 -0
  239. data/lib/chef/provider/ohai.rb +41 -0
  240. data/lib/chef/provider/package.rb +160 -0
  241. data/lib/chef/provider/package/apt.rb +110 -0
  242. data/lib/chef/provider/package/dpkg.rb +112 -0
  243. data/lib/chef/provider/package/easy_install.rb +136 -0
  244. data/lib/chef/provider/package/freebsd.rb +123 -0
  245. data/lib/chef/provider/package/macports.rb +105 -0
  246. data/lib/chef/provider/package/pacman.rb +101 -0
  247. data/lib/chef/provider/package/portage.rb +135 -0
  248. data/lib/chef/provider/package/rpm.rb +101 -0
  249. data/lib/chef/provider/package/rubygems.rb +462 -0
  250. data/lib/chef/provider/package/solaris.rb +127 -0
  251. data/lib/chef/provider/package/yum-dump.py +128 -0
  252. data/lib/chef/provider/package/yum.rb +261 -0
  253. data/lib/chef/provider/package/zypper.rb +133 -0
  254. data/lib/chef/provider/remote_directory.rb +138 -0
  255. data/lib/chef/provider/remote_file.rb +119 -0
  256. data/lib/chef/provider/route.rb +195 -0
  257. data/lib/chef/provider/ruby_block.rb +33 -0
  258. data/lib/chef/provider/script.rb +55 -0
  259. data/lib/chef/provider/service.rb +128 -0
  260. data/lib/chef/provider/service/arch.rb +109 -0
  261. data/lib/chef/provider/service/debian.rb +130 -0
  262. data/lib/chef/provider/service/freebsd.rb +156 -0
  263. data/lib/chef/provider/service/gentoo.rb +54 -0
  264. data/lib/chef/provider/service/init.rb +71 -0
  265. data/lib/chef/provider/service/insserv.rb +52 -0
  266. data/lib/chef/provider/service/redhat.rb +60 -0
  267. data/lib/chef/provider/service/simple.rb +118 -0
  268. data/lib/chef/provider/service/solaris.rb +85 -0
  269. data/lib/chef/provider/service/upstart.rb +192 -0
  270. data/lib/chef/provider/service/windows.rb +146 -0
  271. data/lib/chef/provider/subversion.rb +194 -0
  272. data/lib/chef/provider/template.rb +105 -0
  273. data/lib/chef/provider/user.rb +187 -0
  274. data/lib/chef/provider/user/dscl.rb +280 -0
  275. data/lib/chef/provider/user/pw.rb +113 -0
  276. data/lib/chef/provider/user/useradd.rb +137 -0
  277. data/lib/chef/provider/user/windows.rb +124 -0
  278. data/lib/chef/providers.rb +93 -0
  279. data/lib/chef/recipe.rb +128 -0
  280. data/lib/chef/resource.rb +530 -0
  281. data/lib/chef/resource/apt_package.rb +34 -0
  282. data/lib/chef/resource/bash.rb +33 -0
  283. data/lib/chef/resource/breakpoint.rb +35 -0
  284. data/lib/chef/resource/cookbook_file.rb +45 -0
  285. data/lib/chef/resource/cron.rb +188 -0
  286. data/lib/chef/resource/csh.rb +33 -0
  287. data/lib/chef/resource/deploy.rb +371 -0
  288. data/lib/chef/resource/deploy_revision.rb +35 -0
  289. data/lib/chef/resource/directory.rb +76 -0
  290. data/lib/chef/resource/dpkg_package.rb +34 -0
  291. data/lib/chef/resource/easy_install_package.rb +57 -0
  292. data/lib/chef/resource/env.rb +58 -0
  293. data/lib/chef/resource/erl_call.rb +83 -0
  294. data/lib/chef/resource/execute.rb +127 -0
  295. data/lib/chef/resource/file.rb +99 -0
  296. data/lib/chef/resource/freebsd_package.rb +35 -0
  297. data/lib/chef/resource/gem_package.rb +53 -0
  298. data/lib/chef/resource/git.rb +37 -0
  299. data/lib/chef/resource/group.rb +70 -0
  300. data/lib/chef/resource/http_request.rb +61 -0
  301. data/lib/chef/resource/ifconfig.rb +134 -0
  302. data/lib/chef/resource/link.rb +78 -0
  303. data/lib/chef/resource/log.rb +62 -0
  304. data/lib/chef/resource/macports_package.rb +29 -0
  305. data/lib/chef/resource/mdadm.rb +82 -0
  306. data/lib/chef/resource/mount.rb +135 -0
  307. data/lib/chef/resource/ohai.rb +40 -0
  308. data/lib/chef/resource/package.rb +80 -0
  309. data/lib/chef/resource/pacman_package.rb +33 -0
  310. data/lib/chef/resource/perl.rb +33 -0
  311. data/lib/chef/resource/portage_package.rb +33 -0
  312. data/lib/chef/resource/python.rb +33 -0
  313. data/lib/chef/resource/remote_directory.rb +109 -0
  314. data/lib/chef/resource/remote_file.rb +83 -0
  315. data/lib/chef/resource/route.rb +135 -0
  316. data/lib/chef/resource/rpm_package.rb +34 -0
  317. data/lib/chef/resource/ruby.rb +33 -0
  318. data/lib/chef/resource/ruby_block.rb +40 -0
  319. data/lib/chef/resource/scm.rb +147 -0
  320. data/lib/chef/resource/script.rb +60 -0
  321. data/lib/chef/resource/service.rb +160 -0
  322. data/lib/chef/resource/solaris_package.rb +36 -0
  323. data/lib/chef/resource/subversion.rb +36 -0
  324. data/lib/chef/resource/template.rb +69 -0
  325. data/lib/chef/resource/timestamped_deploy.rb +31 -0
  326. data/lib/chef/resource/user.rb +130 -0
  327. data/lib/chef/resource/yum_package.rb +43 -0
  328. data/lib/chef/resource_collection.rb +217 -0
  329. data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
  330. data/lib/chef/resource_definition.rb +67 -0
  331. data/lib/chef/resource_definition_list.rb +38 -0
  332. data/lib/chef/resources.rb +64 -0
  333. data/lib/chef/rest.rb +386 -0
  334. data/lib/chef/rest/auth_credentials.rb +71 -0
  335. data/lib/chef/rest/cookie_jar.rb +31 -0
  336. data/lib/chef/rest/rest_request.rb +188 -0
  337. data/lib/chef/role.rb +341 -0
  338. data/lib/chef/run_context.rb +126 -0
  339. data/lib/chef/run_list.rb +165 -0
  340. data/lib/chef/run_list/run_list_expansion.rb +193 -0
  341. data/lib/chef/run_list/run_list_item.rb +92 -0
  342. data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
  343. data/lib/chef/run_status.rb +121 -0
  344. data/lib/chef/runner.rb +99 -0
  345. data/lib/chef/sandbox.rb +153 -0
  346. data/lib/chef/search/query.rb +65 -0
  347. data/lib/chef/shef.rb +326 -0
  348. data/lib/chef/shef/ext.rb +569 -0
  349. data/lib/chef/shef/model_wrapper.rb +120 -0
  350. data/lib/chef/shef/shef_rest.rb +28 -0
  351. data/lib/chef/shef/shef_session.rb +284 -0
  352. data/lib/chef/shell_out.rb +238 -0
  353. data/lib/chef/shell_out/unix.rb +223 -0
  354. data/lib/chef/shell_out/windows.rb +98 -0
  355. data/lib/chef/solr_query.rb +187 -0
  356. data/lib/chef/solr_query/lucene.treetop +150 -0
  357. data/lib/chef/solr_query/lucene_nodes.rb +285 -0
  358. data/lib/chef/solr_query/query_transform.rb +65 -0
  359. data/lib/chef/solr_query/solr_http_request.rb +118 -0
  360. data/lib/chef/streaming_cookbook_uploader.rb +201 -0
  361. data/lib/chef/tasks/chef_repo.rake +256 -0
  362. data/lib/chef/util/file_edit.rb +122 -0
  363. data/lib/chef/util/windows.rb +56 -0
  364. data/lib/chef/util/windows/net_group.rb +101 -0
  365. data/lib/chef/util/windows/net_use.rb +121 -0
  366. data/lib/chef/util/windows/net_user.rb +198 -0
  367. data/lib/chef/util/windows/volume.rb +59 -0
  368. data/lib/chef/version.rb +23 -0
  369. data/lib/chef/version_class.rb +70 -0
  370. data/lib/chef/version_constraint.rb +116 -0
  371. data/lib/chef/webui_user.rb +231 -0
  372. metadata +600 -0
@@ -0,0 +1,487 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: AJ Christensen (<aj@opscode.com>)
4
+ # Copyright:: Copyright (c) 2008 Opscode, Inc.
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ require 'chef/mixin/deep_merge'
21
+ require 'chef/log'
22
+
23
+ class Chef
24
+ class Node
25
+ class Attribute
26
+ HIDDEN_ATTRIBUES = [:@override, :@attribute, :@default, :@normal, :@automatic]
27
+
28
+ attr_accessor :normal,
29
+ :default,
30
+ :override,
31
+ :automatic,
32
+ :current_normal,
33
+ :current_default,
34
+ :current_override,
35
+ :current_automatic,
36
+ :auto_vivifiy_on_read,
37
+ :set_unless_value_present,
38
+ :set_type
39
+
40
+ include Enumerable
41
+
42
+ def initialize(normal, default, override, automatic, state=[])
43
+ @normal = normal
44
+ @current_normal = normal
45
+ @default = default
46
+ @current_default = default
47
+ @override = override
48
+ @current_override = override
49
+ @automatic = automatic
50
+ @current_automatic = automatic
51
+ @current_nesting_level = state
52
+ @auto_vivifiy_on_read = false
53
+ @set_unless_value_present = false
54
+ @set_type = nil
55
+ @has_been_read = false
56
+ end
57
+
58
+ def attribute
59
+ normal
60
+ end
61
+
62
+ def attribute=(value)
63
+ normal = value
64
+ end
65
+
66
+ def set_type_hash
67
+ case @set_type
68
+ when :normal
69
+ @normal
70
+ when :override
71
+ @override
72
+ when :default
73
+ @default
74
+ when :automatic
75
+ @automatic
76
+ end
77
+ end
78
+
79
+ # Reset our internal current_nesting_level to the top of every tree
80
+ def reset
81
+ @current_normal = @normal
82
+ @current_default = @default
83
+ @current_override = @override
84
+ @current_automatic = @automatic
85
+ @has_been_read = false
86
+ @current_nesting_level = []
87
+ end
88
+
89
+ def [](key)
90
+ @current_nesting_level << key
91
+
92
+ # We set this to so that we can cope with ||= as a setting.
93
+ # See the comments in []= for more details.
94
+ @has_been_read = true
95
+
96
+ # If we have a set type, our destiny is to write
97
+ if @set_type
98
+ a_value = @set_type == :automatic ? value_or_descend(current_automatic, key, auto_vivifiy_on_read) : nil
99
+ o_value = @set_type == :override ? value_or_descend(current_override, key, auto_vivifiy_on_read) : nil
100
+ n_value = @set_type == :normal ? value_or_descend(current_normal, key, auto_vivifiy_on_read) : nil
101
+ d_value = @set_type == :default ? value_or_descend(current_default, key, auto_vivifiy_on_read) : nil
102
+
103
+ determine_value(a_value, o_value, n_value, d_value)
104
+ # Our destiny is only to read, so we get the full list.
105
+ else
106
+ a_value = value_or_descend(current_automatic, key)
107
+ o_value = value_or_descend(current_override, key)
108
+ n_value = value_or_descend(current_normal, key)
109
+ d_value = value_or_descend(current_default, key)
110
+
111
+ determine_value(a_value, o_value, n_value, d_value)
112
+ end
113
+ end
114
+
115
+ def has_key?(key)
116
+ return true if component_has_key?(@default,key)
117
+ return true if component_has_key?(@automatic,key)
118
+ return true if component_has_key?(@normal,key)
119
+ return true if component_has_key?(@override,key)
120
+ false
121
+ end
122
+
123
+ alias :attribute? :has_key?
124
+ alias :include? :has_key?
125
+ alias :key? :has_key?
126
+ alias :member? :has_key?
127
+
128
+ def each(&block)
129
+ get_keys.each do |key|
130
+ value = determine_value(
131
+ get_value(automatic, key),
132
+ get_value(override, key),
133
+ get_value(normal, key),
134
+ get_value(default, key)
135
+ )
136
+ block.call([key, value])
137
+ end
138
+ end
139
+
140
+ def each_pair(&block)
141
+ get_keys.each do |key|
142
+ value = determine_value(
143
+ get_value(automatic, key),
144
+ get_value(override, key),
145
+ get_value(normal, key),
146
+ get_value(default, key)
147
+ )
148
+ block.call(key, value)
149
+ end
150
+ end
151
+
152
+ def each_attribute(&block)
153
+ get_keys.each do |key|
154
+ value = determine_value(
155
+ get_value(automatic, key),
156
+ get_value(override, key),
157
+ get_value(normal, key),
158
+ get_value(default, key)
159
+ )
160
+ block.call(key, value)
161
+ end
162
+ end
163
+
164
+ def each_key(&block)
165
+ get_keys.each do |key|
166
+ block.call(key)
167
+ end
168
+ end
169
+
170
+ def each_value(&block)
171
+ get_keys.each do |key|
172
+ value = determine_value(
173
+ get_value(automatic, key),
174
+ get_value(override, key),
175
+ get_value(normal, key),
176
+ get_value(default, key)
177
+ )
178
+ block.call(value)
179
+ end
180
+ end
181
+
182
+ def empty?
183
+ get_keys.empty?
184
+ end
185
+
186
+ def fetch(key, default_value=nil, &block)
187
+ if get_keys.include? key
188
+ determine_value(
189
+ get_value(automatic, key),
190
+ get_value(override, key),
191
+ get_value(normal, key),
192
+ get_value(default, key)
193
+ )
194
+ elsif default_value
195
+ default_value
196
+ elsif block_given?
197
+ block.call(key)
198
+ else
199
+ raise IndexError, "Key #{key} does not exist"
200
+ end
201
+ end
202
+
203
+ # Writing this method hurts me a little bit.
204
+ #
205
+ # TODO: Refactor all this stuff so this kind of horror is no longer needed
206
+ #
207
+ # We have invented a new kind of duck-typing, we call it Madoff typing.
208
+ # We just lie and hope we die before you recognize our scheme. :)
209
+ def kind_of?(klass)
210
+ if klass == Hash || klass == Mash || klass == Chef::Node::Attribute
211
+ true
212
+ else
213
+ false
214
+ end
215
+ end
216
+
217
+ def has_value?(value)
218
+ self.any? do |k,v|
219
+ value == v
220
+ end
221
+ end
222
+
223
+ alias :value? :has_value?
224
+
225
+ def index(value)
226
+ index = self.find do |h|
227
+ value == h[1]
228
+ end
229
+ index.first if index.is_a? Array || nil
230
+ end
231
+
232
+ def values
233
+ self.collect { |h| h[1] }
234
+ end
235
+
236
+ def size
237
+ self.collect{}.length
238
+ end
239
+
240
+ alias :length :size
241
+
242
+ def get_keys
243
+ keys
244
+ end
245
+
246
+ def keys
247
+ tkeys = current_automatic ? current_automatic.keys : []
248
+ [ current_override, current_normal, current_default ].each do |attr_hash|
249
+ if attr_hash
250
+ attr_hash.keys.each do |key|
251
+ tkeys << key unless tkeys.include?(key)
252
+ end
253
+ end
254
+ end
255
+ tkeys
256
+ end
257
+
258
+ def get_value(data_hash, key)
259
+ last = nil
260
+
261
+ if @current_nesting_level.length == 0
262
+ if data_hash.has_key?(key) && ! data_hash[key].nil?
263
+ return data_hash[key]
264
+ else
265
+ return nil
266
+ end
267
+ end
268
+
269
+ 0.upto(@current_nesting_level.length) do |i|
270
+ if i == 0
271
+ last = auto_vivifiy(data_hash, @current_nesting_level[i])
272
+ elsif i == @current_nesting_level.length
273
+ fk = last[@current_nesting_level[i - 1]]
274
+ if fk.has_key?(key) && ! fk[key].nil?
275
+ return fk[key]
276
+ else
277
+ return nil
278
+ end
279
+ else
280
+ last = auto_vivifiy(last[@current_nesting_level[i - 1]], @current_nesting_level[i])
281
+ end
282
+ end
283
+ end
284
+
285
+ def hash_and_not_cna?(to_check)
286
+ (! to_check.kind_of?(Chef::Node::Attribute)) && to_check.respond_to?(:has_key?)
287
+ end
288
+
289
+ def determine_value(a_value, o_value, n_value, d_value)
290
+ if hash_and_not_cna?(a_value)
291
+ value = {}
292
+ value = Chef::Mixin::DeepMerge.merge(value, d_value) if hash_and_not_cna?(d_value)
293
+ value = Chef::Mixin::DeepMerge.merge(value, n_value) if hash_and_not_cna?(n_value)
294
+ value = Chef::Mixin::DeepMerge.merge(value, o_value) if hash_and_not_cna?(o_value)
295
+ value = Chef::Mixin::DeepMerge.merge(value, a_value)
296
+ value
297
+ elsif hash_and_not_cna?(o_value)
298
+ value = {}
299
+ value = Chef::Mixin::DeepMerge.merge(value, d_value) if hash_and_not_cna?(d_value)
300
+ value = Chef::Mixin::DeepMerge.merge(value, n_value) if hash_and_not_cna?(n_value)
301
+ value = Chef::Mixin::DeepMerge.merge(value, o_value)
302
+ value
303
+ elsif hash_and_not_cna?(n_value)
304
+ value = {}
305
+ value = Chef::Mixin::DeepMerge.merge(value, d_value) if hash_and_not_cna?(d_value)
306
+ value = Chef::Mixin::DeepMerge.merge(value, n_value)
307
+ value
308
+ elsif hash_and_not_cna?(d_value)
309
+ d_value
310
+ else
311
+ return a_value if ! a_value.nil?
312
+ return o_value if ! o_value.nil?
313
+ return n_value if ! n_value.nil?
314
+ return d_value if ! d_value.nil?
315
+ return nil
316
+ end
317
+ end
318
+
319
+ def []=(key, value)
320
+ # If we don't have one, then we'll pretend we're normal
321
+ @set_type ||= :normal
322
+
323
+ if set_unless_value_present
324
+ if get_value(set_type_hash, key) != nil
325
+ Chef::Log.debug("Not setting #{@current_nesting_level.join("/")}/#{key} to #{value.inspect} because it has a #{@set_type} value already")
326
+ return false
327
+ end
328
+ end
329
+
330
+ # If we have been read, and the key we are writing is the same
331
+ # as our parent, we have most like been ||='ed. So we need to
332
+ # just rewind a bit.
333
+ #
334
+ # In practice, these objects are single use - this is just
335
+ # supporting one more single-use style.
336
+ @current_nesting_level.pop if @has_been_read && @current_nesting_level.last == key
337
+
338
+ set_value(set_type_hash, key, value)
339
+ value
340
+ end
341
+
342
+ def set_value(data_hash, key, value)
343
+ last = nil
344
+
345
+ # If there is no current_nesting_level, just set the value
346
+ if @current_nesting_level.length == 0
347
+ data_hash[key] = value
348
+ return data_hash
349
+ end
350
+
351
+ # Walk all the previous places we have been
352
+ 0.upto(@current_nesting_level.length) do |i|
353
+ # If we are the first, we are top level, and should vivifiy the data_hash
354
+ if i == 0
355
+ last = auto_vivifiy(data_hash, @current_nesting_level[i])
356
+ # If we are one past the last current_nesting_level, we are adding a key to that hash with a value
357
+ elsif i == @current_nesting_level.length
358
+ last[@current_nesting_level[i - 1]][key] = value
359
+ # Otherwise, we're auto-vivifiy-ing an interim mash
360
+ else
361
+ last = auto_vivifiy(last[@current_nesting_level[i - 1]], @current_nesting_level[i])
362
+ end
363
+ end
364
+ data_hash
365
+ end
366
+
367
+ def auto_vivifiy_on_read?
368
+ auto_vivifiy_on_read
369
+ end
370
+
371
+ def auto_vivifiy(data_hash, key)
372
+ if data_hash.has_key?(key)
373
+ unless data_hash[key].respond_to?(:has_key?)
374
+ raise ArgumentError, "You tried to set a nested key, where the parent is not a hash-like object: #{@current_nesting_level.join("/")}/#{key} " unless auto_vivifiy_on_read
375
+ end
376
+ else
377
+ data_hash[key] = Mash.new
378
+ end
379
+ data_hash
380
+ end
381
+
382
+ def value_or_descend(data_hash, key, auto_vivifiy=false)
383
+ if auto_vivifiy
384
+ hash_to_vivifiy = auto_vivifiy(data_hash, key)
385
+ data_hash[key] = hash_to_vivifiy[key]
386
+ else
387
+ return nil if data_hash == nil
388
+ return nil unless data_hash.has_key?(key)
389
+ end
390
+
391
+ if data_hash[key].respond_to?(:has_key?)
392
+ cna = Chef::Node::Attribute.new(@normal, @default, @override, @automatic, @current_nesting_level)
393
+ cna.current_normal = current_normal.nil? ? Mash.new : current_normal[key]
394
+ cna.current_default = current_default.nil? ? Mash.new : current_default[key]
395
+ cna.current_override = current_override.nil? ? Mash.new : current_override[key]
396
+ cna.current_automatic = current_automatic.nil? ? Mash.new : current_automatic[key]
397
+ cna.auto_vivifiy_on_read = auto_vivifiy_on_read
398
+ cna.set_unless_value_present = set_unless_value_present
399
+ cna.set_type = set_type
400
+ cna
401
+ else
402
+ data_hash[key]
403
+ end
404
+ end
405
+
406
+ # Fetches or sets the value, depending on if any arguments are given.
407
+ # ==== Fetching
408
+ # If no arguments are given, fetches the value:
409
+ # node.network
410
+ # => {network data}
411
+ # Getters will find either a string or symbol key.
412
+ # ==== Setting
413
+ # If arguments are given, a value will be set. Both normal setter and DSL
414
+ # style setters are allowed:
415
+ # node.foo = "bar"
416
+ # node.foo("bar")
417
+ # Both set node[:foo] = "bar"
418
+ def method_missing(symbol, *args)
419
+ if args.empty?
420
+ if key?(symbol)
421
+ self[symbol]
422
+ elsif key?(symbol.to_s)
423
+ self[symbol.to_s]
424
+ elsif auto_vivifiy_on_read?
425
+ self[symbol] = Mash.new
426
+ self[symbol]
427
+ else
428
+ raise ArgumentError, "Attribute #{symbol} is not defined!" unless auto_vivifiy_on_read
429
+ end
430
+ else
431
+ key_to_set = symbol.to_s[/^(.+)=$/, 1] || symbol
432
+ self[key_to_set] = (args.length == 1 ? args[0] : args)
433
+ end
434
+ end
435
+
436
+ def inspect
437
+ determine_value(current_automatic, current_override, current_normal, current_default)
438
+
439
+ "#<#{self.class} " << instance_variables.map{|iv|
440
+ iv.to_s + '=' + (HIDDEN_ATTRIBUES.include?(iv.to_sym) ? "{...}" : instance_variable_get(iv).inspect)
441
+ }.join(', ') << ">"
442
+ end
443
+
444
+ def to_hash
445
+ result = determine_value(current_automatic, current_override, current_normal, current_default)
446
+ if result.class == Hash
447
+ result
448
+ else
449
+ result.to_hash
450
+ end
451
+ end
452
+
453
+ def delete(key)
454
+ [@automatic, @override, @normal, @default].inject(nil) do |return_value, attrs|
455
+ deleted_value = delete_from_component(attrs, key)
456
+ return_value || deleted_value
457
+ end
458
+ end
459
+
460
+ def delete_from_component(component_attrs, key)
461
+ # get the Hash-like object at the current nesting level:
462
+ nested_attrs = value_at_current_nesting(component_attrs, key)
463
+
464
+ if nested_attrs.respond_to?(:delete)
465
+ nested_attrs.delete(key)
466
+ else
467
+ nil
468
+ end
469
+ end
470
+
471
+ def component_has_key?(component_attrs,key)
472
+ # get the Hash-like object at the current nesting level:
473
+ nested_attrs = value_at_current_nesting(component_attrs, key)
474
+ nested_attrs.respond_to?(:key?) && nested_attrs.key?(key)
475
+ end
476
+
477
+ def value_at_current_nesting(component_attrs, key)
478
+ @current_nesting_level.inject(component_attrs) do |subtree, intermediate_key|
479
+ # if the intermediate value isn't a hash or doesn't have the intermediate key,
480
+ # it can't have the bottom-level key we're looking for.
481
+ (subtree.respond_to?(:key?) && subtree[intermediate_key]) or (return false)
482
+ end
483
+ end
484
+
485
+ end
486
+ end
487
+ end