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,90 @@
1
+ #
2
+ # Author:: Ian Meyer (<ianmmeyer@gmail.com>)
3
+ # Copyright:: Copyright (c) 2010 Ian Meyer
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/knife'
20
+
21
+ class Chef
22
+ class Knife
23
+ class Status < Knife
24
+
25
+ deps do
26
+ require 'highline'
27
+ require 'chef/search/query'
28
+ end
29
+
30
+ banner "knife status QUERY (options)"
31
+
32
+ option :run_list,
33
+ :short => "-r",
34
+ :long => "--run-list",
35
+ :description => "Show the run list"
36
+
37
+ def highline
38
+ @h ||= HighLine.new
39
+ end
40
+
41
+ def run
42
+ all_nodes = []
43
+ q = Chef::Search::Query.new
44
+ query = @name_args[0] || "*:*"
45
+ q.search(:node, query) do |node|
46
+ all_nodes << node
47
+ end
48
+ all_nodes.sort { |n1, n2| (n1["ohai_time"] or 0) <=> (n2["ohai_time"] or 0) }.each do |node|
49
+ if node.has_key?("ec2")
50
+ fqdn = node['ec2']['public_hostname']
51
+ ipaddress = node['ec2']['public_ipv4']
52
+ else
53
+ fqdn = node['fqdn']
54
+ ipaddress = node['ipaddress']
55
+ end
56
+ hours, minutes, seconds = time_difference_in_hms(node["ohai_time"])
57
+ hours_text = "#{hours} hour#{hours == 1 ? ' ' : 's'}"
58
+ minutes_text = "#{minutes} minute#{minutes == 1 ? ' ' : 's'}"
59
+ run_list = ", #{node.run_list}." if config[:run_list]
60
+ if hours > 24
61
+ color = "RED"
62
+ text = hours_text
63
+ elsif hours >= 1
64
+ color = "YELLOW"
65
+ text = hours_text
66
+ else
67
+ color = "GREEN"
68
+ text = minutes_text
69
+ end
70
+
71
+ highline.say("<%= color('#{text}', #{color}) %> ago, #{node.name}, #{node['platform']} #{node['platform_version']}, #{fqdn}, #{ipaddress}#{run_list}")
72
+ end
73
+
74
+ end
75
+
76
+ # :nodoc:
77
+ # TODO: this is duplicated from StatusHelper in the Webui. dedup.
78
+ def time_difference_in_hms(unix_time)
79
+ now = Time.now.to_i
80
+ difference = now - unix_time.to_i
81
+ hours = (difference / 3600).to_i
82
+ difference = difference % 3600
83
+ minutes = (difference / 60).to_i
84
+ seconds = (difference % 60)
85
+ return [hours, minutes, seconds]
86
+ end
87
+
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,101 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Christopher Brown (<cb@opscode.com>)
4
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
5
+ # Copyright:: Copyright (c) 2009, 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/version'
22
+
23
+ class Chef
24
+ class Knife
25
+ class SubcommandLoader
26
+
27
+ CHEF_FILE_IN_GEM = /chef-[\d]+\.[\d]+\.[\d]+/
28
+ CURRENT_CHEF_GEM = /chef-#{Regexp.escape(Chef::VERSION)}/
29
+
30
+ attr_reader :chef_config_dir
31
+ attr_reader :env
32
+
33
+ def initialize(chef_config_dir, env=ENV)
34
+ @chef_config_dir, @env = chef_config_dir, env
35
+ end
36
+
37
+ # Load all the sub-commands
38
+ def load_commands
39
+ subcommand_files.each { |subcommand| require subcommand }
40
+ true
41
+ end
42
+
43
+ # Returns an Array of paths to knife commands located in chef_config_dir/plugins/knife/
44
+ # and ~/.chef/plugins/knife/
45
+ def site_subcommands
46
+ user_specific_files = []
47
+
48
+ if chef_config_dir
49
+ user_specific_files.concat Dir.glob(File.expand_path("plugins/knife/*.rb", chef_config_dir))
50
+ end
51
+
52
+ # finally search ~/.chef/plugins/knife/*.rb
53
+ user_specific_files.concat Dir.glob(File.join(env['HOME'], '.chef', 'plugins', 'knife', '*.rb'))
54
+
55
+ user_specific_files.map! { |path| path[/(.+).rb/, 1] }
56
+ user_specific_files
57
+ end
58
+
59
+ # Returns an Array of paths to knife commands built-in to chef, or installed via gem.
60
+ # If rubygems is not installed, falls back to globbing the knife directory.
61
+ def gem_and_builtin_subcommands
62
+ # search all gems for chef/knife/*.rb
63
+ require 'rubygems'
64
+ find_subcommands_via_rubygems
65
+ rescue LoadError
66
+ find_subcommands_via_dirglob
67
+ end
68
+
69
+ def subcommand_files
70
+ @subcommand_files ||= (gem_and_builtin_subcommands + site_subcommands).flatten.uniq
71
+ end
72
+
73
+ def find_subcommands_via_dirglob
74
+ # The "require paths" of the core knife subcommands bundled with chef
75
+ files = Dir[File.expand_path('../../knife/*.rb', __FILE__)]
76
+ files.map! { |knife_file| knife_file[/#{CHEF_ROOT}#{Regexp.escape(File::SEPARATOR)}(.*)\.rb/,1] }
77
+ files
78
+ end
79
+
80
+ def find_subcommands_via_rubygems
81
+ files = Gem.find_files 'chef/knife/*.rb'
82
+ files.reject! {|f| from_old_gem?(f) }
83
+ files.map! do |file|
84
+ file[/(#{Regexp.escape File.join('chef', 'knife', '')}.*)\.rb/, 1]
85
+ end.uniq!
86
+ files
87
+ end
88
+
89
+ private
90
+
91
+ # wow, this is a sad hack :(
92
+ # Gem.find_files finds files in all versions of a gem, which
93
+ # means that if chef 0.10 and 0.9.x are installed, we'll try to
94
+ # require, e.g., chef/knife/ec2_server_create, which will cause
95
+ # a gem activation error. So remove files from older chef gems.
96
+ def from_old_gem?(path)
97
+ path =~ CHEF_FILE_IN_GEM && path !~ CURRENT_CHEF_GEM
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,31 @@
1
+ require 'chef/knife'
2
+
3
+ class Chef
4
+ class Knife
5
+ class TagCreate < Knife
6
+
7
+ deps do
8
+ require 'chef/node'
9
+ end
10
+
11
+ banner "knife tag create NODE TAG ..."
12
+
13
+ def run
14
+ name = @name_args[0]
15
+ tags = @name_args[1..-1].join(",").split(/\s*,\s*/)
16
+
17
+ unless name or tags.empty?
18
+ show_usage
19
+ # TODO: blah blah
20
+ ui.fatal("You must specify a node name")
21
+ exit 1
22
+ end
23
+
24
+ node = Chef::Node.load name
25
+ tags.each do |tag|
26
+ node.tags << tag
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ require 'chef/knife'
2
+
3
+ class Chef
4
+ class Knife
5
+ class TagDelete < Knife
6
+
7
+ deps do
8
+ require 'chef/node'
9
+ end
10
+
11
+ banner "knife tag delete NODE TAG ..."
12
+
13
+ def run
14
+ name = @name_args[0]
15
+ tags = @name_args[1..-1].join(",").split(/\s*,\s*/)
16
+
17
+ unless name or tags.empty?
18
+ show_usage
19
+ # TODO: blah blah
20
+ ui.fatal("You must specify a node name")
21
+ exit 1
22
+ end
23
+
24
+ node = Chef::Node.load name
25
+ tags.each do |tag|
26
+ node.tags.delete tag
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,29 @@
1
+ require 'chef/knife'
2
+
3
+ class Chef
4
+ class Knife
5
+ class TagList < Knife
6
+
7
+ deps do
8
+ require 'chef/node'
9
+ end
10
+
11
+ banner "knife tag list NODE"
12
+
13
+ def run
14
+ name = @name_args[0]
15
+ tags = @name_args[1..-1].join(",").split(/\s*,\s*/)
16
+
17
+ unless name or tags.empty?
18
+ show_usage
19
+ # TODO: blah blah
20
+ ui.fatal("You must specify a node name")
21
+ exit 1
22
+ end
23
+
24
+ node = Chef::Node.load name
25
+ output node.tags
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,227 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Author:: Christopher Brown (<cb@opscode.com>)
4
+ # Author:: Daniel DeLeo (<dan@opscode.com>)
5
+ # Copyright:: Copyright (c) 2009, 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
+
22
+ class Chef
23
+ class Knife
24
+ class UI
25
+
26
+ attr_reader :stdout
27
+ attr_reader :stderr
28
+ attr_reader :stdin
29
+ attr_reader :config
30
+
31
+ def initialize(stdout, stderr, stdin, config)
32
+ @stdout, @stderr, @stdin, @config = stdout, stderr, stdin, config
33
+ end
34
+
35
+ def highline
36
+ @highline ||= begin
37
+ require 'highline'
38
+ HighLine.new
39
+ end
40
+ end
41
+
42
+ def msg(message)
43
+ stdout.puts message
44
+ end
45
+
46
+ alias :info :msg
47
+
48
+ def warn(message)
49
+ msg("WARNING: #{message}")
50
+ end
51
+
52
+ def error(message)
53
+ msg("ERROR: #{message}")
54
+ end
55
+
56
+ def fatal(message)
57
+ msg("FATAL: #{message}")
58
+ end
59
+
60
+ def color(*args)
61
+ highline.color(*args)
62
+ end
63
+
64
+ def ask(*args, &block)
65
+ highline.ask(*args, &block)
66
+ end
67
+
68
+ def list(*args)
69
+ highline.list(*args)
70
+ end
71
+
72
+ def ask_question(question, opts={})
73
+ question = question + "[#{opts[:default]}] " if opts[:default]
74
+
75
+ if opts[:default] and config[:defaults]
76
+ opts[:default]
77
+ else
78
+ stdout.print question
79
+ a = stdin.readline.strip
80
+
81
+ if opts[:default]
82
+ a.empty? ? opts[:default] : a
83
+ else
84
+ a
85
+ end
86
+ end
87
+ end
88
+
89
+ def pretty_print(data)
90
+ stdout.puts data
91
+ end
92
+
93
+ def output(data)
94
+ case config[:format]
95
+ when "json", nil
96
+ stdout.puts Chef::JSONCompat.to_json_pretty(data)
97
+ when "yaml"
98
+ require 'yaml'
99
+ stdout.puts YAML::dump(data)
100
+ when "text"
101
+ # If you were looking for some attribute and there is only one match
102
+ # just dump the attribute value
103
+ if data.length == 1 and config[:attribute]
104
+ stdout.puts data.values[0]
105
+ else
106
+ PP.pp(data, stdout)
107
+ end
108
+ else
109
+ raise ArgumentError, "Unknown output format #{config[:format]}"
110
+ end
111
+ end
112
+
113
+ def format_list_for_display(list)
114
+ config[:with_uri] ? list : list.keys.sort { |a,b| a <=> b }
115
+ end
116
+
117
+ def format_for_display(data)
118
+ if config[:attribute]
119
+ config[:attribute].split(".").each do |attr|
120
+ if data.respond_to?(:[])
121
+ data = data[attr]
122
+ elsif data.nil?
123
+ nil # don't get no method error on nil
124
+ else data.respond_to?(attr.to_sym)
125
+ data = data.send(attr.to_sym)
126
+ end
127
+ end
128
+ { config[:attribute] => data.respond_to?(:to_hash) ? data.to_hash : data }
129
+ elsif config[:run_list]
130
+ data = data.run_list.run_list
131
+ { "run_list" => data }
132
+ elsif config[:environment]
133
+ if data.respond_to?(:chef_environment)
134
+ {"chef_environment" => data.chef_environment}
135
+ else
136
+ # this is a place holder for now. Feel free to modify (i.e. add other cases). [nuo]
137
+ data
138
+ end
139
+ elsif config[:id_only]
140
+ data.respond_to?(:name) ? data.name : data["id"]
141
+ else
142
+ data
143
+ end
144
+ end
145
+
146
+ def format_cookbook_list_for_display(item)
147
+ if config[:with_uri]
148
+ item
149
+ else
150
+ item.inject({}){|result, (k,v)|
151
+ result[k] = v["versions"].inject([]){|res, ver| res.push(ver["version"]); res}
152
+ result
153
+ }
154
+ end
155
+ end
156
+
157
+ def edit_data(data, parse_output=true)
158
+ output = Chef::JSONCompat.to_json_pretty(data)
159
+
160
+ if (!config[:no_editor])
161
+ filename = "knife-edit-"
162
+ 0.upto(20) { filename += rand(9).to_s }
163
+ filename << ".js"
164
+ filename = File.join(Dir.tmpdir, filename)
165
+ tf = File.open(filename, "w")
166
+ tf.sync = true
167
+ tf.puts output
168
+ tf.close
169
+ raise "Please set EDITOR environment variable" unless system("#{config[:editor]} #{tf.path}")
170
+ tf = File.open(filename, "r")
171
+ output = tf.gets(nil)
172
+ tf.close
173
+ File.unlink(filename)
174
+ end
175
+
176
+ parse_output ? Chef::JSONCompat.from_json(output) : output
177
+ end
178
+
179
+ def edit_object(klass, name)
180
+ object = klass.load(name)
181
+
182
+ output = edit_data(object)
183
+
184
+ # Only make the save if the user changed the object.
185
+ #
186
+ # Output JSON for the original (object) and edited (output), then parse
187
+ # them without reconstituting the objects into real classes
188
+ # (create_additions=false). Then, compare the resulting simple objects,
189
+ # which will be Array/Hash/String/etc.
190
+ #
191
+ # We wouldn't have to do these shenanigans if all the editable objects
192
+ # implemented to_hash, or if to_json against a hash returned a string
193
+ # with stable key order.
194
+ object_parsed_again = Chef::JSONCompat.from_json(Chef::JSONCompat.to_json(object), :create_additions => false)
195
+ output_parsed_again = Chef::JSONCompat.from_json(Chef::JSONCompat.to_json(output), :create_additions => false)
196
+ if object_parsed_again != output_parsed_again
197
+ output.save
198
+ self.msg("Saved #{output}")
199
+ else
200
+ self.msg("Object unchanged, not saving")
201
+ end
202
+ output(format_for_display(object)) if config[:print_after]
203
+ end
204
+
205
+ def confirm(question, append_instructions=true)
206
+ return true if config[:yes]
207
+
208
+ stdout.print question
209
+ stdout.print "? (Y/N) " if append_instructions
210
+ answer = stdin.readline
211
+ answer.chomp!
212
+ case answer
213
+ when "Y", "y"
214
+ true
215
+ when "N", "n"
216
+ self.msg("You said no, so I'm done here.")
217
+ exit 3
218
+ else
219
+ self.msg("I have no idea what to do with #{answer}")
220
+ self.msg("Just say Y or N, please.")
221
+ confirm(question)
222
+ end
223
+ end
224
+
225
+ end
226
+ end
227
+ end