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,109 @@
1
+ #
2
+ # Author:: Daniel DeLeo (<dan@kallistec.com>)
3
+ # Author:: Seth Falcon (<seth@opscode.com>)
4
+ # Copyright:: Copyright (c) 2009 Daniel DeLeo
5
+ # Copyright:: Copyright (c) 2010 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
+ require 'chef/json_compat'
21
+
22
+ class Chef
23
+ module IndexQueue
24
+ module Indexable
25
+
26
+ module ClassMethods
27
+
28
+ def index_object_type(explicit_type_name=nil)
29
+ @index_object_type = explicit_type_name.to_s if explicit_type_name
30
+ @index_object_type
31
+ end
32
+
33
+ # Resets all metadata used for indexing to nil. Used for testing
34
+ def reset_index_metadata!
35
+ @index_object_type = nil
36
+ end
37
+
38
+ end
39
+
40
+ def self.included(including_class)
41
+ including_class.send(:extend, ClassMethods)
42
+ end
43
+
44
+ attr_accessor :index_id
45
+
46
+ def index_object_type
47
+ self.class.index_object_type || Mixin::ConvertToClassName.snake_case_basename(self.class.name)
48
+ end
49
+
50
+ def with_indexer_metadata(indexer_metadata={})
51
+ # changing input param symbol keys to strings, as the keys in hash that goes to solr are expected to be strings [cb]
52
+ # Ruby 1.9 hates you, cb [dan]
53
+ with_metadata = {}
54
+ indexer_metadata.each_key do |key|
55
+ with_metadata[key.to_s] = indexer_metadata[key]
56
+ end
57
+
58
+ with_metadata["type"] ||= self.index_object_type
59
+ with_metadata["id"] ||= self.index_id
60
+ with_metadata["database"] ||= Chef::Config[:couchdb_database]
61
+ with_metadata["item"] ||= self.to_hash
62
+ with_metadata["enqueued_at"] ||= Time.now.utc.to_i
63
+
64
+ raise ArgumentError, "Type, Id, or Database missing in index operation: #{with_metadata.inspect}" if (with_metadata["id"].nil? or with_metadata["type"].nil?)
65
+ with_metadata
66
+ end
67
+
68
+ def add_to_index(metadata={})
69
+ Chef::Log.debug("pushing item to index queue for addition: #{self.with_indexer_metadata(metadata)}")
70
+ object_with_metadata = with_indexer_metadata(metadata)
71
+ obj_id = object_with_metadata["id"]
72
+ obj = {:action => :add, :payload => self.with_indexer_metadata(metadata)}
73
+
74
+ publish_object(obj_id, obj)
75
+ end
76
+
77
+ def delete_from_index(metadata={})
78
+ Chef::Log.debug("pushing item to index queue for deletion: #{self.with_indexer_metadata(metadata)}")
79
+ object_with_metadata = with_indexer_metadata(metadata)
80
+ obj_id = object_with_metadata["id"]
81
+ obj = {:action => :delete, :payload => self.with_indexer_metadata(metadata)}
82
+
83
+ publish_object(obj_id, obj)
84
+ end
85
+
86
+ private
87
+
88
+ # Uses the publisher to update the object's queue. If
89
+ # Chef::Config[:persistent_queue] is true, the update is wrapped
90
+ # in a transaction.
91
+ def publish_object(object_id, object)
92
+ publisher = AmqpClient.instance
93
+ begin
94
+ publisher.amqp_client.tx_select if Chef::Config[:persistent_queue]
95
+ publisher.queue_for_object(object_id) do |queue|
96
+ queue.publish(Chef::JSONCompat.to_json(object), :persistent => Chef::Config[:persistent_queue])
97
+ end
98
+ publisher.amqp_client.tx_commit if Chef::Config[:persistent_queue]
99
+ rescue
100
+ publisher.amqp_client.tx_rollback if Chef::Config[:persistent_queue]
101
+ raise
102
+ end
103
+
104
+ true
105
+ end
106
+
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,52 @@
1
+ #
2
+ # Author:: Tim Hinderliter (<tim@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
+ # Wrapper class for interacting with JSON.
19
+
20
+ require 'json'
21
+
22
+ class Chef
23
+ class JSONCompat
24
+ JSON_MAX_NESTING = 1000
25
+
26
+ class <<self
27
+ # See CHEF-1292/PL-538. Increase the max nesting for JSON, which defaults
28
+ # to 19, and isn't enough for some (for example, a Node within a Node)
29
+ # structures.
30
+ def opts_add_max_nesting(opts)
31
+ if opts.nil? || !opts.has_key?(:max_nesting)
32
+ opts = opts.nil? ? Hash.new : opts.clone
33
+ opts[:max_nesting] = JSON_MAX_NESTING
34
+ end
35
+ opts
36
+ end
37
+
38
+ # Just call the JSON gem's parse method with a modified :max_nesting field
39
+ def from_json(source, opts = {})
40
+ ::JSON.parse(source, opts_add_max_nesting(opts))
41
+ end
42
+
43
+ def to_json(obj, opts = nil)
44
+ obj.to_json(opts_add_max_nesting(opts))
45
+ end
46
+
47
+ def to_json_pretty(obj, opts = nil)
48
+ ::JSON.pretty_generate(obj, opts_add_max_nesting(opts))
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,424 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Christopher Brown (<cb@opscode.com>)
4
+ # Copyright:: Copyright (c) 2009 Opscode, Inc.
5
+ # License:: Apache License, Version 2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ require 'forwardable'
21
+ require 'chef/version'
22
+ require 'mixlib/cli'
23
+ require 'chef/mixin/convert_to_class_name'
24
+ require 'chef/knife/subcommand_loader'
25
+ require 'chef/knife/ui'
26
+
27
+ require 'pp'
28
+
29
+ class Chef
30
+ class Knife
31
+ include Mixlib::CLI
32
+ extend Chef::Mixin::ConvertToClassName
33
+ extend Forwardable
34
+
35
+ # Backwards Compat:
36
+ # Ideally, we should not vomit all of these methods into this base class;
37
+ # instead, they should be accessed by hitting the ui object directly.
38
+ def_delegator :@ui, :stdout
39
+ def_delegator :@ui, :stderr
40
+ def_delegator :@ui, :stdin
41
+ def_delegator :@ui, :msg
42
+ def_delegator :@ui, :ask_question
43
+ def_delegator :@ui, :pretty_print
44
+ def_delegator :@ui, :output
45
+ def_delegator :@ui, :format_list_for_display
46
+ def_delegator :@ui, :format_for_display
47
+ def_delegator :@ui, :format_cookbook_list_for_display
48
+ def_delegator :@ui, :edit_data
49
+ def_delegator :@ui, :edit_object
50
+ def_delegator :@ui, :confirm
51
+
52
+ attr_accessor :name_args
53
+ attr_reader :ui
54
+
55
+ def self.ui
56
+ @ui ||= Chef::Knife::UI.new(STDOUT, STDERR, STDIN, {})
57
+ end
58
+
59
+ def self.msg(msg="")
60
+ ui.msg(msg)
61
+ end
62
+
63
+ def self.reset_subcommands!
64
+ @@subcommands = {}
65
+ @subcommands_by_category = nil
66
+ end
67
+
68
+ def self.inherited(subclass)
69
+ unless subclass.unnamed?
70
+ subcommands[subclass.snake_case_name] = subclass
71
+ end
72
+ end
73
+
74
+ # Explicitly set the category for the current command to +new_category+
75
+ # The category is normally determined from the first word of the command
76
+ # name, but some commands make more sense using two or more words
77
+ # ===Arguments
78
+ # new_category::: A String to set the category to (see examples)
79
+ # ===Examples:
80
+ # Data bag commands would be in the 'data' category by default. To put them
81
+ # in the 'data bag' category:
82
+ # category('data bag')
83
+ def self.category(new_category)
84
+ @category = new_category
85
+ end
86
+
87
+ def self.subcommand_category
88
+ @category || snake_case_name.split('_').first unless unnamed?
89
+ end
90
+
91
+ def self.snake_case_name
92
+ convert_to_snake_case(name.split('::').last) unless unnamed?
93
+ end
94
+
95
+ # Does this class have a name? (Classes created via Class.new don't)
96
+ def self.unnamed?
97
+ name.nil? || name.empty?
98
+ end
99
+
100
+ def self.subcommand_loader
101
+ @subcommand_loader ||= Knife::SubcommandLoader.new(chef_config_dir)
102
+ end
103
+
104
+ def self.load_commands
105
+ subcommand_loader.load_commands
106
+ end
107
+
108
+ def self.subcommands
109
+ @@subcommands ||= {}
110
+ end
111
+
112
+ def self.subcommands_by_category
113
+ unless @subcommands_by_category
114
+ @subcommands_by_category = Hash.new { |hash, key| hash[key] = [] }
115
+ subcommands.each do |snake_cased, klass|
116
+ @subcommands_by_category[klass.subcommand_category] << snake_cased
117
+ end
118
+ end
119
+ @subcommands_by_category
120
+ end
121
+
122
+ # Print the list of subcommands knife knows about. If +preferred_category+
123
+ # is given, only subcommands in that category are shown
124
+ def self.list_commands(preferred_category=nil)
125
+ load_commands
126
+ category_desc = preferred_category ? preferred_category + " " : ''
127
+ msg "Available #{category_desc}subcommands: (for details, knife SUB-COMMAND --help)\n\n"
128
+
129
+ if preferred_category && subcommands_by_category.key?(preferred_category)
130
+ commands_to_show = {preferred_category => subcommands_by_category[preferred_category]}
131
+ else
132
+ commands_to_show = subcommands_by_category
133
+ end
134
+
135
+ commands_to_show.sort.each do |category, commands|
136
+ msg "** #{category.upcase} COMMANDS **"
137
+ commands.each do |command|
138
+ msg subcommands[command].banner if subcommands[command]
139
+ end
140
+ msg
141
+ end
142
+ end
143
+
144
+ # Run knife for the given +args+ (ARGV), adding +options+ to the list of
145
+ # CLI options that the subcommand knows how to handle.
146
+ # ===Arguments
147
+ # args::: usually ARGV
148
+ # options::: A Mixlib::CLI option parser hash. These +options+ are how
149
+ # subcommands know about global knife CLI options
150
+ def self.run(args, options={})
151
+ load_commands
152
+ subcommand_class = subcommand_class_from(args)
153
+ subcommand_class.options = options.merge!(subcommand_class.options)
154
+ subcommand_class.load_deps
155
+ instance = subcommand_class.new(args)
156
+ instance.configure_chef
157
+ instance.run
158
+ end
159
+
160
+ def self.guess_category(args)
161
+ category_words = args.select {|arg| arg =~ /^([[:alnum:]]|_)+$/ }
162
+ matching_category = nil
163
+ while (!matching_category) && (!category_words.empty?)
164
+ candidate_category = category_words.join(' ')
165
+ matching_category = candidate_category if subcommands_by_category.key?(candidate_category)
166
+ matching_category || category_words.pop
167
+ end
168
+ matching_category
169
+ end
170
+
171
+ def self.subcommand_class_from(args)
172
+ command_words = args.select {|arg| arg =~ /^([[:alnum:]]|_)+$/ }
173
+ subcommand_class = nil
174
+
175
+ while ( !subcommand_class ) && ( !command_words.empty? )
176
+ snake_case_class_name = command_words.join("_")
177
+ unless subcommand_class = subcommands[snake_case_class_name]
178
+ command_words.pop
179
+ end
180
+ end
181
+ subcommand_class || subcommand_not_found!(args)
182
+ end
183
+
184
+ def self.deps(&block)
185
+ @dependency_loader = block
186
+ end
187
+
188
+ def self.load_deps
189
+ @dependency_loader && @dependency_loader.call
190
+ end
191
+
192
+ private
193
+
194
+ # :nodoc:
195
+ # Error out and print usage. probably becuase the arguments given by the
196
+ # user could not be resolved to a subcommand.
197
+ def self.subcommand_not_found!(args)
198
+ unless want_help?(args)
199
+ ui.fatal("Cannot find sub command for: '#{args.join(' ')}'")
200
+ end
201
+ list_commands(guess_category(args))
202
+ exit 10
203
+ end
204
+
205
+ # :nodoc:
206
+ # TODO: duplicated with chef/application/knife
207
+ # all logic should be removed from that and Chef::Knife should own it.
208
+ def self.want_help?(args)
209
+ (args.any? { |arg| arg =~ /^(:?(:?\-\-)?help|\-h)$/})
210
+ end
211
+
212
+ @@chef_config_dir = nil
213
+
214
+ # search upward from current_dir until .chef directory is found
215
+ def self.chef_config_dir
216
+ if @@chef_config_dir.nil? # share this with subclasses
217
+ @@chef_config_dir = false
218
+ full_path = Dir.pwd.split(File::SEPARATOR)
219
+ (full_path.length - 1).downto(0) do |i|
220
+ canidate_directory = File.join(full_path[0..i] + [".chef" ])
221
+ if File.exist?(canidate_directory) && File.directory?(canidate_directory)
222
+ @@chef_config_dir = canidate_directory
223
+ break
224
+ end
225
+ end
226
+ end
227
+ @@chef_config_dir
228
+ end
229
+
230
+
231
+ public
232
+
233
+ # Create a new instance of the current class configured for the given
234
+ # arguments and options
235
+ def initialize(argv=[])
236
+ super() # having to call super in initialize is the most annoying anti-pattern :(
237
+ @ui = Chef::Knife::UI.new(STDOUT, STDERR, STDIN, config)
238
+
239
+ command_name_words = self.class.snake_case_name.split('_')
240
+
241
+ # Mixlib::CLI ignores the embedded name_args
242
+ @name_args = parse_options(argv)
243
+ @name_args.reject! { |name_arg| command_name_words.delete(name_arg) }
244
+
245
+ # knife node run_list add requires that we have extra logic to handle
246
+ # the case that command name words could be joined by an underscore :/
247
+ command_name_words = command_name_words.join('_')
248
+ @name_args.reject! { |name_arg| command_name_words == name_arg }
249
+
250
+ if config[:help]
251
+ msg opt_parser
252
+ exit 1
253
+ end
254
+ end
255
+
256
+ def parse_options(args)
257
+ super
258
+ rescue OptionParser::InvalidOption => e
259
+ puts "Error: " + e.to_s
260
+ show_usage
261
+ exit(1)
262
+ end
263
+
264
+ def configure_chef
265
+ unless config[:config_file]
266
+ if self.class.chef_config_dir
267
+ candidate_config = File.expand_path('knife.rb',self.class.chef_config_dir)
268
+ config[:config_file] = candidate_config if File.exist?(candidate_config)
269
+ end
270
+ # If we haven't set a config yet and $HOME is set, and the home
271
+ # knife.rb exists, use it:
272
+ if (!config[:config_file]) && ENV['HOME'] && File.exist?(File.join(ENV['HOME'], '.chef', 'knife.rb'))
273
+ config[:config_file] = File.join(ENV['HOME'], '.chef', 'knife.rb')
274
+ end
275
+ end
276
+
277
+ # Don't try to load a knife.rb if it doesn't exist.
278
+ if config[:config_file]
279
+ Chef::Config.from_file(config[:config_file])
280
+ else
281
+ # ...but do log a message if no config was found.
282
+ self.msg("No knife configuration file found")
283
+ end
284
+
285
+ Chef::Config[:log_level] = config[:log_level] if config[:log_level]
286
+ Chef::Config[:log_location] = config[:log_location] if config[:log_location]
287
+ Chef::Config[:node_name] = config[:node_name] if config[:node_name]
288
+ Chef::Config[:client_key] = config[:client_key] if config[:client_key]
289
+ Chef::Config[:chef_server_url] = config[:chef_server_url] if config[:chef_server_url]
290
+ Chef::Config[:environment] = config[:environment] if config[:environment]
291
+
292
+ # Expand a relative path from the config directory. Config from command
293
+ # line should already be expanded, and absolute paths will be unchanged.
294
+ if Chef::Config[:client_key] && config[:config_file]
295
+ Chef::Config[:client_key] = File.expand_path(Chef::Config[:client_key], File.dirname(config[:config_file]))
296
+ end
297
+
298
+ Mixlib::Log::Formatter.show_time = false
299
+ Chef::Log.init(Chef::Config[:log_location])
300
+ Chef::Log.level(Chef::Config[:log_level] || :error)
301
+
302
+ Chef::Log.debug("Using configuration from #{config[:config_file]}")
303
+
304
+ if Chef::Config[:node_name].nil?
305
+ raise ArgumentError, "No user specified, pass via -u or specifiy 'node_name' in #{config[:config_file] ? config[:config_file] : "~/.chef/knife.rb"}"
306
+ end
307
+ end
308
+
309
+
310
+ def show_usage
311
+ stdout.puts("USAGE: " + self.opt_parser.to_s)
312
+ end
313
+
314
+ def load_from_file(klass, from_file, bag=nil)
315
+ relative_path = ""
316
+ if klass == Chef::Role
317
+ relative_path = "roles"
318
+ elsif klass == Chef::Node
319
+ relative_path = "nodes"
320
+ elsif klass == Chef::DataBagItem
321
+ relative_path = "data_bags/#{bag}"
322
+ elsif klass == Chef::Environment
323
+ relative_path = "environments"
324
+ end
325
+
326
+ relative_file = File.expand_path(File.join(Dir.pwd, relative_path, from_file))
327
+ filename = nil
328
+
329
+ if file_exists_and_is_readable?(from_file)
330
+ filename = from_file
331
+ elsif file_exists_and_is_readable?(relative_file)
332
+ filename = relative_file
333
+ else
334
+ ui.fatal("Cannot find file #{from_file}")
335
+ exit 30
336
+ end
337
+
338
+ case from_file
339
+ when /\.(js|json)$/
340
+ Chef::JSONCompat.from_json(IO.read(filename))
341
+ when /\.rb$/
342
+ r = klass.new
343
+ r.from_file(filename)
344
+ r
345
+ else
346
+ ui.fatal("File must end in .js, .json, or .rb")
347
+ exit 30
348
+ end
349
+ end
350
+
351
+ def file_exists_and_is_readable?(file)
352
+ File.exists?(file) && File.readable?(file)
353
+ end
354
+
355
+ def create_object(object, pretty_name=nil, &block)
356
+ output = edit_data(object)
357
+
358
+ if Kernel.block_given?
359
+ output = block.call(output)
360
+ else
361
+ output.save
362
+ end
363
+
364
+ pretty_name ||= output
365
+
366
+ self.msg("Created (or updated) #{pretty_name}")
367
+
368
+ output(output) if config[:print_after]
369
+ end
370
+
371
+ def delete_object(klass, name, delete_name=nil, &block)
372
+ confirm("Do you really want to delete #{name}")
373
+
374
+ if Kernel.block_given?
375
+ object = block.call
376
+ else
377
+ object = klass.load(name)
378
+ object.destroy
379
+ end
380
+
381
+ output(format_for_display(object)) if config[:print_after]
382
+
383
+ obj_name = delete_name ? "#{delete_name}[#{name}]" : object
384
+ self.msg("Deleted #{obj_name}!")
385
+ end
386
+
387
+ def bulk_delete(klass, fancy_name, delete_name=nil, list=nil, regex=nil, &block)
388
+ object_list = list ? list : klass.list(true)
389
+
390
+ if regex
391
+ to_delete = Hash.new
392
+ object_list.each_key do |object|
393
+ next if regex && object !~ /#{regex}/
394
+ to_delete[object] = object_list[object]
395
+ end
396
+ else
397
+ to_delete = object_list
398
+ end
399
+
400
+ output(format_list_for_display(to_delete))
401
+
402
+ confirm("Do you really want to delete the above items")
403
+
404
+ to_delete.each do |name, object|
405
+ if Kernel.block_given?
406
+ block.call(name, object)
407
+ else
408
+ object.destroy
409
+ end
410
+ output(format_for_display(object)) if config[:print_after]
411
+ self.msg("Deleted #{fancy_name} #{name}")
412
+ end
413
+ end
414
+
415
+ def rest
416
+ @rest ||= begin
417
+ require 'chef/rest'
418
+ Chef::REST.new(Chef::Config[:chef_server_url])
419
+ end
420
+ end
421
+
422
+ end
423
+ end
424
+