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,120 @@
1
+ #--
2
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
3
+ # Copyright:: Copyright (c) 2010 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'chef/mixin/convert_to_class_name'
20
+ require 'chef/mixin/language'
21
+
22
+ module Shef
23
+ class ModelWrapper
24
+
25
+ include Chef::Mixin::ConvertToClassName
26
+
27
+ attr_reader :model_symbol
28
+
29
+ def initialize(model_class, symbol=nil)
30
+ @model_class = model_class
31
+ @model_symbol = symbol || convert_to_snake_case(model_class.name, "Chef").to_sym
32
+ end
33
+
34
+ def search(query)
35
+ return all if query.to_s == "all"
36
+ results = []
37
+ Chef::Search::Query.new.search(@model_symbol, format_query(query)) do |obj|
38
+ if block_given?
39
+ results << yield(obj)
40
+ else
41
+ results << obj
42
+ end
43
+ end
44
+ results
45
+ end
46
+
47
+ alias :find :search
48
+
49
+ def all(&block)
50
+ all_objects = list_objects
51
+ block_given? ? all_objects.map(&block) : all_objects
52
+ end
53
+
54
+ alias :list :all
55
+
56
+ def show(obj_id)
57
+ @model_class.load(obj_id)
58
+ end
59
+
60
+ alias :load :show
61
+
62
+ def transform(what_to_transform, &block)
63
+ if what_to_transform == :all
64
+ objects_to_transform = list_objects
65
+ else
66
+ objects_to_transform = search(what_to_transform)
67
+ end
68
+ objects_to_transform.each do |obj|
69
+ if result = yield(obj)
70
+ obj.save
71
+ end
72
+ end
73
+ end
74
+
75
+ alias :bulk_edit :transform
76
+
77
+ private
78
+
79
+ # paper over inconsistencies in the model classes APIs, and return the objects
80
+ # the user wanted instead of the URI=>object stuff
81
+ def list_objects
82
+ objects = @model_class.method(:list).arity == 0? @model_class.list : @model_class.list(true)
83
+ objects.map { |obj| Array(obj).find {|o| o.kind_of?(@model_class)} }
84
+ end
85
+
86
+ def format_query(query)
87
+ if query.respond_to?(:keys)
88
+ query.map { |key, value| "#{key}:#{value}" }.join(" AND ")
89
+ else
90
+ query
91
+ end
92
+ end
93
+ end
94
+
95
+ class NamedDataBagWrapper < ModelWrapper
96
+
97
+ def initialize(databag_name)
98
+ @model_symbol = @databag_name = databag_name
99
+ end
100
+
101
+
102
+ alias :list :all
103
+
104
+ def show(item)
105
+ Chef::DataBagItem.load(@databag_name, item)
106
+ end
107
+
108
+ private
109
+
110
+ def list_objects
111
+ all_items = []
112
+ Chef::Search::Query.new.search(@databag_name) do |item|
113
+ all_items << item
114
+ end
115
+ all_items
116
+ end
117
+
118
+ end
119
+
120
+ end
@@ -0,0 +1,28 @@
1
+ #--
2
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
3
+ # Copyright:: Copyright (c) 2010 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ module Shef
20
+ class ShefREST < Chef::REST
21
+
22
+ alias :get :get_rest
23
+ alias :put :put_rest
24
+ alias :post :post_rest
25
+ alias :delete :delete_rest
26
+
27
+ end
28
+ end
@@ -0,0 +1,284 @@
1
+ #--
2
+ # Author:: Daniel DeLeo (<dan@kallistec.com>)
3
+ # Author:: Tim Hinderliter (<tim@opscode.com>)
4
+ # Copyright:: Copyright (c) 2009 Daniel DeLeo
5
+ # Copyright:: Copyright (c) 2011 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/recipe'
22
+ require 'chef/run_context'
23
+ require 'chef/config'
24
+ require 'chef/client'
25
+ require 'chef/cookbook/cookbook_collection'
26
+ require 'chef/cookbook_loader'
27
+ require 'chef/run_list/run_list_expansion'
28
+
29
+ module Shef
30
+ class ShefSession
31
+ include Singleton
32
+
33
+ def self.session_type(type=nil)
34
+ @session_type = type if type
35
+ @session_type
36
+ end
37
+
38
+ attr_accessor :node, :compile, :recipe, :run_context
39
+ attr_reader :node_attributes, :client
40
+ def initialize
41
+ @node_built = false
42
+ end
43
+
44
+ def node_built?
45
+ !!@node_built
46
+ end
47
+
48
+ def reset!
49
+ loading do
50
+ rebuild_node
51
+ @node = client.node
52
+ shorten_node_inspect
53
+ Shef::Extensions.extend_context_node(@node)
54
+ rebuild_context
55
+ node.consume_attributes(node_attributes) if node_attributes
56
+ @recipe = Chef::Recipe.new(nil, nil, run_context)
57
+ Shef::Extensions.extend_context_recipe(@recipe)
58
+ @node_built = true
59
+ end
60
+ end
61
+
62
+ def node_attributes=(attrs)
63
+ @node_attributes = attrs
64
+ @node.consume_attributes(@node_attributes)
65
+ end
66
+
67
+ def resource_collection
68
+ run_context.resource_collection
69
+ end
70
+
71
+ def run_context
72
+ @run_context ||= rebuild_context
73
+ end
74
+
75
+ def definitions
76
+ nil
77
+ end
78
+
79
+ def cookbook_loader
80
+ nil
81
+ end
82
+
83
+ def save_node
84
+ raise "Not Supported! #{self.class.name} doesn't support #save_node, maybe you need to run shef in client mode?"
85
+ end
86
+
87
+ def rebuild_context
88
+ raise "Not Implemented! :rebuild_collection should be implemented by subclasses"
89
+ end
90
+
91
+ private
92
+
93
+ def loading
94
+ show_loading_progress
95
+ begin
96
+ yield
97
+ rescue => e
98
+ loading_complete(false)
99
+ raise e
100
+ else
101
+ loading_complete(true)
102
+ end
103
+ end
104
+
105
+ def show_loading_progress
106
+ print "Loading"
107
+ @loading = true
108
+ @dot_printer = Thread.new do
109
+ while @loading
110
+ print "."
111
+ sleep 0.5
112
+ end
113
+ end
114
+ end
115
+
116
+ def loading_complete(success)
117
+ @loading = false
118
+ @dot_printer.join
119
+ msg = success ? "done.\n\n" : "epic fail!\n\n"
120
+ print msg
121
+ end
122
+
123
+ def shorten_node_inspect
124
+ def @node.inspect
125
+ "<Chef::Node:0x#{self.object_id.to_s(16)} @name=\"#{self.name}\">"
126
+ end
127
+ end
128
+
129
+ def rebuild_node
130
+ raise "Not Implemented! :rebuild_node should be implemented by subclasses"
131
+ end
132
+
133
+ end
134
+
135
+ class StandAloneSession < ShefSession
136
+
137
+ session_type :standalone
138
+
139
+ def rebuild_context
140
+ @run_context = Chef::RunContext.new(@node, {}) # no recipes
141
+ @run_context.load(Chef::RunList::RunListExpansionFromDisk.new("_default", [])) # empty recipe list
142
+ end
143
+
144
+ private
145
+
146
+ def rebuild_node
147
+ Chef::Config[:solo] = true
148
+ @client = Chef::Client.new
149
+ @client.run_ohai
150
+ @client.build_node
151
+ end
152
+
153
+ end
154
+
155
+ class SoloSession < ShefSession
156
+
157
+ session_type :solo
158
+
159
+ def definitions
160
+ @run_context.definitions
161
+ end
162
+
163
+ def rebuild_context
164
+ Chef::Cookbook::FileVendor.on_create { |manifest| Chef::Cookbook::FileSystemFileVendor.new(manifest, Chef::Config[:cookbook_path]) }
165
+ @run_context = Chef::RunContext.new(@node, Chef::CookbookCollection.new(Chef::CookbookLoader.new(Chef::Config[:cookbook_path])))
166
+ @run_context.load(Chef::RunList::RunListExpansionFromDisk.new("_default", []))
167
+ run_status.run_context = run_context
168
+ end
169
+
170
+ private
171
+
172
+ def rebuild_node
173
+ # Tell the client we're chef solo so it won't try to contact the server
174
+ Chef::Config[:solo] = true
175
+ @client = Chef::Client.new
176
+ @client.run_ohai
177
+ @client.build_node
178
+ end
179
+
180
+ end
181
+
182
+ class ClientSession < SoloSession
183
+
184
+ session_type :client
185
+
186
+ def save_node
187
+ @client.save_node
188
+ end
189
+
190
+ def rebuild_context
191
+ @run_status = Chef::RunStatus.new(@node)
192
+ Chef::Cookbook::FileVendor.on_create { |manifest| Chef::Cookbook::RemoteFileVendor.new(manifest, Chef::REST.new(Chef::Config[:server_url])) }
193
+ cookbook_hash = @client.sync_cookbooks
194
+ @run_context = Chef::RunContext.new(node, Chef::CookbookCollection.new(cookbook_hash))
195
+ @run_context.load(Chef::RunList::RunListExpansionFromAPI.new("_default", []))
196
+ @run_status.run_context = run_context
197
+ end
198
+
199
+ private
200
+
201
+ def rebuild_node
202
+ # Make sure the client knows this is not chef solo
203
+ Chef::Config[:solo] = false
204
+ @client = Chef::Client.new
205
+ @client.run_ohai
206
+ @client.register
207
+ @client.build_node
208
+ end
209
+
210
+ end
211
+
212
+ class DoppelGangerClient < Chef::Client
213
+
214
+ attr_reader :node_name
215
+
216
+ def initialize(node_name)
217
+ @node_name = node_name
218
+ @ohai = Ohai::System.new
219
+ end
220
+
221
+ # Run the very smallest amount of ohai we can get away with and still
222
+ # hope to have things work. Otherwise we're not very good doppelgangers
223
+ def run_ohai
224
+ @ohai.require_plugin('os')
225
+ end
226
+
227
+ # DoppelGanger implementation of build_node. preserves as many of the node's
228
+ # attributes, and does not save updates to the server
229
+ def build_node
230
+ Chef::Log.debug("Building node object for #{@node_name}")
231
+
232
+ @node = Chef::Node.find_or_create(node_name)
233
+
234
+ ohai_data = @ohai.data.merge(@node.automatic_attrs)
235
+
236
+ @node.consume_external_attrs(ohai_data,nil)
237
+
238
+ @node
239
+ end
240
+
241
+ def register
242
+ @rest = Chef::REST.new(Chef::Config[:chef_server_url], Chef::Config[:node_name], Chef::Config[:client_key])
243
+ end
244
+
245
+ end
246
+
247
+ class DoppelGangerSession < ClientSession
248
+
249
+ session_type "doppelganger client"
250
+
251
+ def save_node
252
+ puts "A doppelganger should think twice before saving the node"
253
+ end
254
+
255
+ def assume_identity(node_name)
256
+ Chef::Config[:doppelganger] = @node_name = node_name
257
+ reset!
258
+ rescue Exception => e
259
+ puts "#{e.class.name}: #{e.message}"
260
+ puts Array(e.backtrace).join("\n")
261
+ puts
262
+ puts "* " * 40
263
+ puts "failed to assume the identity of node '#{node_name}', resetting"
264
+ puts "* " * 40
265
+ puts
266
+ Chef::Config[:doppelganger] = false
267
+ @node_built = false
268
+ Shef.session
269
+ end
270
+
271
+ def rebuild_node
272
+ # Make sure the client knows this is not chef solo
273
+ Chef::Config[:solo] = false
274
+ @client = DoppelGangerClient.new(@node_name)
275
+ @client.run_ohai
276
+ @client.register
277
+ @client.build_node
278
+
279
+ @client.sync_cookbooks
280
+ end
281
+
282
+ end
283
+
284
+ end
@@ -0,0 +1,238 @@
1
+ #--
2
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
3
+ # Copyright:: Copyright (c) 2010 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'etc'
20
+ require 'tmpdir'
21
+ require 'chef/log'
22
+ require 'fcntl'
23
+ require 'chef/exceptions'
24
+ require 'chef/shell_out/unix'
25
+
26
+ class Chef
27
+
28
+ # == Chef::ShellOut
29
+ # Provides a simplified interface to shelling out yet still collecting both
30
+ # standard out and standard error and providing full control over environment,
31
+ # working directory, uid, gid, etc.
32
+ #
33
+ # No means for passing input to the subprocess is provided, nor is there any
34
+ # way to inspect the output of the command as it is being read. If you need
35
+ # to do that, you have to use popen4 (in Chef::Mixin::Command)
36
+ #
37
+ # === Platform Support
38
+ # Chef::ShellOut uses Kernel.fork() and is therefore unsuitable for Windows
39
+ # or jruby.
40
+ class ShellOut
41
+ READ_WAIT_TIME = 0.01
42
+ READ_SIZE = 4096
43
+ DEFAULT_READ_TIMEOUT = 60
44
+ DEFAULT_ENVIRONMENT = {'LC_ALL' => 'C'}
45
+
46
+ if RUBY_PLATFORM =~ /mswin|mingw32|windows/
47
+ require 'chef/shell_out/windows'
48
+ include ShellOut::Windows
49
+ else
50
+ require 'chef/shell_out/unix'
51
+ include ShellOut::Unix
52
+ end
53
+
54
+ attr_accessor :user
55
+ attr_accessor :group
56
+ attr_accessor :cwd
57
+ attr_accessor :valid_exit_codes
58
+ attr_accessor :live_stream
59
+
60
+ attr_reader :command, :umask, :environment
61
+ attr_writer :timeout
62
+ attr_reader :execution_time
63
+
64
+ attr_reader :stdout, :stderr, :status
65
+
66
+ attr_reader :stdin_pipe, :stdout_pipe, :stderr_pipe, :process_status_pipe
67
+
68
+ # === Arguments:
69
+ # Takes a single command, or a list of command fragments. These are used
70
+ # as arguments to Kernel.exec. See the Kernel.exec documentation for more
71
+ # explanation of how arguments are evaluated. The last argument can be an
72
+ # options Hash.
73
+ # === Options:
74
+ # If the last argument is a Hash, it is removed from the list of args passed
75
+ # to exec and used as an options hash. The following options are available:
76
+ # * +user+: the user the commmand should run as. if an integer is given, it is
77
+ # used as a uid. A string is treated as a username and resolved to a uid
78
+ # with Etc.getpwnam
79
+ # * +group+: the group the command should run as. works similarly to +user+
80
+ # * +cwd+: the directory to chdir to before running the command
81
+ # * +umask+: a umask to set before running the command. If given as an Integer,
82
+ # be sure to use two leading zeros so it's parsed as Octal. A string will
83
+ # be treated as an octal integer
84
+ # * +returns+: one or more Integer values to use as valid exit codes for the
85
+ # subprocess. This only has an effect if you call +error!+ after
86
+ # +run_command+.
87
+ # * +environment+: a Hash of environment variables to set before the command
88
+ # is run. By default, the environment will *always* be set to 'LC_ALL' => 'C'
89
+ # to prevent issues with multibyte characters in Ruby 1.8. To avoid this,
90
+ # use :environment => nil for *no* extra environment settings, or
91
+ # :environment => {'LC_ALL'=>nil, ...} to set other environment settings
92
+ # without changing the locale.
93
+ # * +timeout+: a Numeric value for the number of seconds to wait on the
94
+ # child process before raising an Exception. This is calculated as the
95
+ # total amount of time that ShellOut waited on the child process without
96
+ # receiving any output (i.e., IO.select returned nil). Default is 60
97
+ # seconds. Note: the stdlib Timeout library is not used.
98
+ # === Examples:
99
+ # Invoke find(1) to search for .rb files:
100
+ # find = Chef::ShellOut.new("find . -name '*.rb'")
101
+ # find.run_command
102
+ # # If all went well, the results are on +stdout+
103
+ # puts find.stdout
104
+ # # find(1) prints diagnostic info to STDERR:
105
+ # puts "error messages" + find.stderr
106
+ # # Raise an exception if it didn't exit with 0
107
+ # find.error!
108
+ # Run a command as the +www+ user with no extra ENV settings from +/tmp+
109
+ # cmd = Chef::ShellOut.new("apachectl", "start", :user => 'www', :env => nil, :cwd => '/tmp')
110
+ # cmd.run_command # etc.
111
+ def initialize(*command_args)
112
+ @stdout, @stderr = '', ''
113
+ @live_stream = nil
114
+ @environment = DEFAULT_ENVIRONMENT
115
+ @cwd = nil
116
+ @valid_exit_codes = [0]
117
+
118
+ if command_args.last.is_a?(Hash)
119
+ parse_options(command_args.pop)
120
+ end
121
+
122
+ @command = command_args.size == 1 ? command_args.first : command_args
123
+ end
124
+
125
+ def umask=(new_umask)
126
+ @umask = (new_umask.respond_to?(:oct) ? new_umask.oct : new_umask.to_i) & 007777
127
+ end
128
+
129
+ def uid
130
+ return nil unless user
131
+ user.kind_of?(Integer) ? user : Etc.getpwnam(user.to_s).uid
132
+ end
133
+
134
+ def gid
135
+ return nil unless group
136
+ group.kind_of?(Integer) ? group : Etc.getgrnam(group.to_s).gid
137
+ end
138
+
139
+ def timeout
140
+ @timeout || DEFAULT_READ_TIMEOUT
141
+ end
142
+
143
+ # Creates a String showing the output of the command, including a banner
144
+ # showing the exact command executed. Used by +invalid!+ to show command
145
+ # results when the command exited with an unexpected status.
146
+ def format_for_exception
147
+ msg = ""
148
+ msg << "---- Begin output of #{command} ----\n"
149
+ msg << "STDOUT: #{stdout.strip}\n"
150
+ msg << "STDERR: #{stderr.strip}\n"
151
+ msg << "---- End output of #{command} ----\n"
152
+ msg << "Ran #{command} returned #{status.exitstatus}" if status
153
+ msg
154
+ end
155
+
156
+ def exitstatus
157
+ @status && @status.exitstatus
158
+ end
159
+
160
+ # Run the command, writing the command's standard out and standard error
161
+ # to +stdout+ and +stderr+, and saving its exit status object to +status+
162
+ # === Returns
163
+ # returns +self+; +stdout+, +stderr+, +status+, and +exitstatus+ will be
164
+ # populated with results of the command
165
+ # === Raises
166
+ # * Errno::EACCES when you are not privileged to execute the command
167
+ # * Errno::ENOENT when the command is not available on the system (or not
168
+ # in the current $PATH)
169
+ # * Chef::Exceptions::CommandTimeout when the command does not complete
170
+ # within +timeout+ seconds (default: 60s)
171
+ def run_command
172
+ Chef::Log.info("sh(#{@command})")
173
+ super
174
+ end
175
+
176
+ # Checks the +exitstatus+ against the set of +valid_exit_codes+. If
177
+ # +exitstatus+ is not in the list of +valid_exit_codes+, calls +invalid!+,
178
+ # which raises an Exception.
179
+ # === Returns
180
+ # nil::: always returns nil when it does not raise
181
+ # === Raises
182
+ # Chef::Exceptions::ShellCommandFailed::: via +invalid!+
183
+ def error!
184
+ unless Array(valid_exit_codes).include?(exitstatus)
185
+ invalid!("Expected process to exit 0, but it exited with #{exitstatus}")
186
+ end
187
+ end
188
+
189
+ # Raises a Chef::Exceptions::ShellCommandFailed exception, appending the
190
+ # command's stdout, stderr, and exitstatus to the exception message.
191
+ # === Arguments
192
+ # +msg+: A String to use as the basis of the exception message. The
193
+ # default explanation is very generic, providing a more informative message
194
+ # is highly encouraged.
195
+ # === Raises
196
+ # Chef::Exceptions::ShellCommandFailed always
197
+ def invalid!(msg=nil)
198
+ msg ||= "Command produced unexpected results"
199
+ raise Chef::Exceptions::ShellCommandFailed, msg + "\n" + format_for_exception
200
+ end
201
+
202
+ def inspect
203
+ "<#{self.class.name}##{object_id}: command: '#@command' process_status: #{@status.inspect} " +
204
+ "stdout: '#{stdout.strip}' stderr: '#{stderr.strip}' child_pid: #{@child_pid.inspect} " +
205
+ "environment: #{@environment.inspect} timeout: #{timeout} user: #@user group: #@group working_dir: #@cwd >"
206
+ end
207
+
208
+ private
209
+
210
+ def parse_options(opts)
211
+ opts.each do |option, setting|
212
+ case option.to_s
213
+ when 'cwd'
214
+ self.cwd = setting
215
+ when 'user'
216
+ self.user = setting
217
+ when 'group'
218
+ self.group = setting
219
+ when 'umask'
220
+ self.umask = setting
221
+ when 'timeout'
222
+ self.timeout = setting
223
+ when 'returns'
224
+ self.valid_exit_codes = Array(setting)
225
+ when 'live_stream'
226
+ self.live_stream = setting
227
+ when 'environment', 'env'
228
+ # passing :environment => nil means don't set any new ENV vars
229
+ @environment = setting.nil? ? {} : @environment.dup.merge!(setting)
230
+ else
231
+ raise Chef::Exceptions::InvalidCommandOption, "option '#{option.inspect}' is not a valid option for #{self.class.name}"
232
+ end
233
+ end
234
+ end
235
+
236
+
237
+ end
238
+ end