mbailey-chef 0.9.12.1

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 (345) hide show
  1. data/LICENSE +201 -0
  2. data/README.rdoc +172 -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/common/man/man1/chef-indexer.1 +42 -0
  9. data/distro/common/man/man1/chef-server-webui.1 +106 -0
  10. data/distro/common/man/man1/chef-server.1 +107 -0
  11. data/distro/common/man/man1/chef-solr-indexer.1 +55 -0
  12. data/distro/common/man/man1/chef-solr.1 +55 -0
  13. data/distro/common/man/man8/chef-client.8 +63 -0
  14. data/distro/common/man/man8/chef-solo.8 +57 -0
  15. data/distro/common/man/man8/chef-solr-rebuild.8 +37 -0
  16. data/distro/common/man/man8/knife.8 +1349 -0
  17. data/distro/common/man/man8/shef.8 +45 -0
  18. data/distro/common/markdown/README +3 -0
  19. data/distro/common/markdown/knife.mkd +832 -0
  20. data/distro/debian/etc/default/chef-client +4 -0
  21. data/distro/debian/etc/default/chef-server +9 -0
  22. data/distro/debian/etc/default/chef-server-webui +9 -0
  23. data/distro/debian/etc/default/chef-solr +7 -0
  24. data/distro/debian/etc/default/chef-solr-indexer +7 -0
  25. data/distro/debian/etc/init/chef-client.conf +17 -0
  26. data/distro/debian/etc/init/chef-server-webui.conf +17 -0
  27. data/distro/debian/etc/init/chef-server.conf +17 -0
  28. data/distro/debian/etc/init/chef-solr-indexer.conf +17 -0
  29. data/distro/debian/etc/init/chef-solr.conf +17 -0
  30. data/distro/debian/etc/init.d/chef-client +175 -0
  31. data/distro/debian/etc/init.d/chef-server +122 -0
  32. data/distro/debian/etc/init.d/chef-server-webui +123 -0
  33. data/distro/debian/etc/init.d/chef-solr +177 -0
  34. data/distro/debian/etc/init.d/chef-solr-indexer +176 -0
  35. data/distro/redhat/etc/init.d/chef-client +106 -0
  36. data/distro/redhat/etc/init.d/chef-server +112 -0
  37. data/distro/redhat/etc/init.d/chef-server-webui +112 -0
  38. data/distro/redhat/etc/init.d/chef-solr +104 -0
  39. data/distro/redhat/etc/init.d/chef-solr-indexer +104 -0
  40. data/distro/redhat/etc/logrotate.d/chef-client +8 -0
  41. data/distro/redhat/etc/logrotate.d/chef-server +8 -0
  42. data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
  43. data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
  44. data/distro/redhat/etc/logrotate.d/chef-solr-indexer +8 -0
  45. data/distro/redhat/etc/sysconfig/chef-client +15 -0
  46. data/distro/redhat/etc/sysconfig/chef-server +14 -0
  47. data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
  48. data/distro/redhat/etc/sysconfig/chef-solr +8 -0
  49. data/distro/redhat/etc/sysconfig/chef-solr-indexer +7 -0
  50. data/lib/chef/api_client.rb +264 -0
  51. data/lib/chef/application/agent.rb +18 -0
  52. data/lib/chef/application/client.rb +246 -0
  53. data/lib/chef/application/knife.rb +171 -0
  54. data/lib/chef/application/solo.rb +215 -0
  55. data/lib/chef/application.rb +127 -0
  56. data/lib/chef/applications.rb +4 -0
  57. data/lib/chef/certificate.rb +194 -0
  58. data/lib/chef/checksum.rb +182 -0
  59. data/lib/chef/checksum_cache.rb +173 -0
  60. data/lib/chef/client.rb +304 -0
  61. data/lib/chef/config.rb +240 -0
  62. data/lib/chef/cookbook/cookbook_collection.rb +44 -0
  63. data/lib/chef/cookbook/file_system_file_vendor.rb +54 -0
  64. data/lib/chef/cookbook/file_vendor.rb +48 -0
  65. data/lib/chef/cookbook/metadata/version.rb +87 -0
  66. data/lib/chef/cookbook/metadata.rb +500 -0
  67. data/lib/chef/cookbook/remote_file_vendor.rb +87 -0
  68. data/lib/chef/cookbook/syntax_check.rb +136 -0
  69. data/lib/chef/cookbook_loader.rb +227 -0
  70. data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
  71. data/lib/chef/cookbook_uploader.rb +103 -0
  72. data/lib/chef/cookbook_version.rb +930 -0
  73. data/lib/chef/couchdb.rb +239 -0
  74. data/lib/chef/daemon.rb +172 -0
  75. data/lib/chef/data_bag.rb +215 -0
  76. data/lib/chef/data_bag_item.rb +228 -0
  77. data/lib/chef/exceptions.rb +66 -0
  78. data/lib/chef/file_access_control.rb +140 -0
  79. data/lib/chef/file_cache.rb +218 -0
  80. data/lib/chef/handler/json_file.rb +58 -0
  81. data/lib/chef/handler.rb +206 -0
  82. data/lib/chef/index_queue/amqp_client.rb +113 -0
  83. data/lib/chef/index_queue/consumer.rb +76 -0
  84. data/lib/chef/index_queue/indexable.rb +76 -0
  85. data/lib/chef/index_queue.rb +29 -0
  86. data/lib/chef/knife/bootstrap/archlinux-gems.erb +44 -0
  87. data/lib/chef/knife/bootstrap/centos5-gems.erb +41 -0
  88. data/lib/chef/knife/bootstrap/client-install.vbs +80 -0
  89. data/lib/chef/knife/bootstrap/fedora13-gems.erb +38 -0
  90. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +32 -0
  91. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +43 -0
  92. data/lib/chef/knife/bootstrap/windows-gems.erb +34 -0
  93. data/lib/chef/knife/bootstrap.rb +181 -0
  94. data/lib/chef/knife/client_bulk_delete.rb +40 -0
  95. data/lib/chef/knife/client_create.rb +70 -0
  96. data/lib/chef/knife/client_delete.rb +45 -0
  97. data/lib/chef/knife/client_edit.rb +45 -0
  98. data/lib/chef/knife/client_list.rb +40 -0
  99. data/lib/chef/knife/client_reregister.rb +56 -0
  100. data/lib/chef/knife/client_show.rb +50 -0
  101. data/lib/chef/knife/configure.rb +140 -0
  102. data/lib/chef/knife/configure_client.rb +52 -0
  103. data/lib/chef/knife/cookbook_bulk_delete.rb +58 -0
  104. data/lib/chef/knife/cookbook_create.rb +209 -0
  105. data/lib/chef/knife/cookbook_delete.rb +143 -0
  106. data/lib/chef/knife/cookbook_download.rb +130 -0
  107. data/lib/chef/knife/cookbook_list.rb +41 -0
  108. data/lib/chef/knife/cookbook_metadata.rb +82 -0
  109. data/lib/chef/knife/cookbook_metadata_from_file.rb +40 -0
  110. data/lib/chef/knife/cookbook_show.rb +98 -0
  111. data/lib/chef/knife/cookbook_site_download.rb +58 -0
  112. data/lib/chef/knife/cookbook_site_list.rb +56 -0
  113. data/lib/chef/knife/cookbook_site_search.rb +51 -0
  114. data/lib/chef/knife/cookbook_site_share.rb +109 -0
  115. data/lib/chef/knife/cookbook_site_show.rb +57 -0
  116. data/lib/chef/knife/cookbook_site_unshare.rb +52 -0
  117. data/lib/chef/knife/cookbook_site_vendor.rb +133 -0
  118. data/lib/chef/knife/cookbook_test.rb +82 -0
  119. data/lib/chef/knife/cookbook_upload.rb +95 -0
  120. data/lib/chef/knife/data_bag_create.rb +59 -0
  121. data/lib/chef/knife/data_bag_delete.rb +48 -0
  122. data/lib/chef/knife/data_bag_edit.rb +50 -0
  123. data/lib/chef/knife/data_bag_from_file.rb +44 -0
  124. data/lib/chef/knife/data_bag_list.rb +43 -0
  125. data/lib/chef/knife/data_bag_show.rb +41 -0
  126. data/lib/chef/knife/ec2_instance_data.rb +46 -0
  127. data/lib/chef/knife/ec2_server_create.rb +216 -0
  128. data/lib/chef/knife/ec2_server_delete.rb +90 -0
  129. data/lib/chef/knife/ec2_server_list.rb +88 -0
  130. data/lib/chef/knife/exec.rb +52 -0
  131. data/lib/chef/knife/index_rebuild.rb +51 -0
  132. data/lib/chef/knife/node_bulk_delete.rb +43 -0
  133. data/lib/chef/knife/node_create.rb +47 -0
  134. data/lib/chef/knife/node_delete.rb +44 -0
  135. data/lib/chef/knife/node_edit.rb +44 -0
  136. data/lib/chef/knife/node_from_file.rb +42 -0
  137. data/lib/chef/knife/node_list.rb +41 -0
  138. data/lib/chef/knife/node_run_list_add.rb +64 -0
  139. data/lib/chef/knife/node_run_list_remove.rb +45 -0
  140. data/lib/chef/knife/node_show.rb +54 -0
  141. data/lib/chef/knife/rackspace_server_create.rb +156 -0
  142. data/lib/chef/knife/rackspace_server_delete.rb +57 -0
  143. data/lib/chef/knife/rackspace_server_list.rb +59 -0
  144. data/lib/chef/knife/recipe_list.rb +32 -0
  145. data/lib/chef/knife/role_bulk_delete.rb +44 -0
  146. data/lib/chef/knife/role_create.rb +52 -0
  147. data/lib/chef/knife/role_delete.rb +44 -0
  148. data/lib/chef/knife/role_edit.rb +45 -0
  149. data/lib/chef/knife/role_from_file.rb +46 -0
  150. data/lib/chef/knife/role_list.rb +40 -0
  151. data/lib/chef/knife/role_show.rb +51 -0
  152. data/lib/chef/knife/search.rb +94 -0
  153. data/lib/chef/knife/slicehost_images_list.rb +53 -0
  154. data/lib/chef/knife/slicehost_server_create.rb +103 -0
  155. data/lib/chef/knife/slicehost_server_delete.rb +61 -0
  156. data/lib/chef/knife/slicehost_server_list.rb +64 -0
  157. data/lib/chef/knife/ssh.rb +328 -0
  158. data/lib/chef/knife/status.rb +87 -0
  159. data/lib/chef/knife/terremark_server_create.rb +152 -0
  160. data/lib/chef/knife/terremark_server_delete.rb +87 -0
  161. data/lib/chef/knife/terremark_server_list.rb +77 -0
  162. data/lib/chef/knife/windows_bootstrap.rb +154 -0
  163. data/lib/chef/knife.rb +522 -0
  164. data/lib/chef/log.rb +61 -0
  165. data/lib/chef/mixin/check_helper.rb +31 -0
  166. data/lib/chef/mixin/checksum.rb +32 -0
  167. data/lib/chef/mixin/command/unix.rb +215 -0
  168. data/lib/chef/mixin/command/windows.rb +72 -0
  169. data/lib/chef/mixin/command.rb +220 -0
  170. data/lib/chef/mixin/convert_to_class_name.rb +63 -0
  171. data/lib/chef/mixin/create_path.rb +56 -0
  172. data/lib/chef/mixin/deep_merge.rb +225 -0
  173. data/lib/chef/mixin/deprecation.rb +65 -0
  174. data/lib/chef/mixin/find_preferred_file.rb +92 -0
  175. data/lib/chef/mixin/from_file.rb +50 -0
  176. data/lib/chef/mixin/language.rb +156 -0
  177. data/lib/chef/mixin/language_include_attribute.rb +61 -0
  178. data/lib/chef/mixin/language_include_recipe.rb +52 -0
  179. data/lib/chef/mixin/params_validate.rb +225 -0
  180. data/lib/chef/mixin/recipe_definition_dsl_core.rb +81 -0
  181. data/lib/chef/mixin/shell_out.rb +38 -0
  182. data/lib/chef/mixin/template.rb +95 -0
  183. data/lib/chef/mixin/xml_escape.rb +140 -0
  184. data/lib/chef/mixins.rb +16 -0
  185. data/lib/chef/monkey_patches/dir.rb +36 -0
  186. data/lib/chef/monkey_patches/string.rb +28 -0
  187. data/lib/chef/monkey_patches/tempfile.rb +64 -0
  188. data/lib/chef/node/attribute.rb +465 -0
  189. data/lib/chef/node.rb +601 -0
  190. data/lib/chef/openid_registration.rb +187 -0
  191. data/lib/chef/platform.rb +371 -0
  192. data/lib/chef/provider/breakpoint.rb +36 -0
  193. data/lib/chef/provider/cookbook_file.rb +100 -0
  194. data/lib/chef/provider/cron/solaris.rb +195 -0
  195. data/lib/chef/provider/cron.rb +186 -0
  196. data/lib/chef/provider/deploy/revision.rb +73 -0
  197. data/lib/chef/provider/deploy/timestamped.rb +33 -0
  198. data/lib/chef/provider/deploy.rb +319 -0
  199. data/lib/chef/provider/directory.rb +72 -0
  200. data/lib/chef/provider/env/windows.rb +75 -0
  201. data/lib/chef/provider/env.rb +152 -0
  202. data/lib/chef/provider/erl_call.rb +72 -0
  203. data/lib/chef/provider/execute.rb +58 -0
  204. data/lib/chef/provider/file.rb +213 -0
  205. data/lib/chef/provider/git.rb +211 -0
  206. data/lib/chef/provider/group/dscl.rb +121 -0
  207. data/lib/chef/provider/group/gpasswd.rb +53 -0
  208. data/lib/chef/provider/group/groupadd.rb +78 -0
  209. data/lib/chef/provider/group/pw.rb +84 -0
  210. data/lib/chef/provider/group/usermod.rb +57 -0
  211. data/lib/chef/provider/group/windows.rb +79 -0
  212. data/lib/chef/provider/group.rb +133 -0
  213. data/lib/chef/provider/http_request.rb +122 -0
  214. data/lib/chef/provider/ifconfig.rb +132 -0
  215. data/lib/chef/provider/link.rb +161 -0
  216. data/lib/chef/provider/log.rb +54 -0
  217. data/lib/chef/provider/mdadm.rb +91 -0
  218. data/lib/chef/provider/mount/mount.rb +232 -0
  219. data/lib/chef/provider/mount/windows.rb +80 -0
  220. data/lib/chef/provider/mount.rb +117 -0
  221. data/lib/chef/provider/ohai.rb +41 -0
  222. data/lib/chef/provider/package/apt.rb +110 -0
  223. data/lib/chef/provider/package/dpkg.rb +112 -0
  224. data/lib/chef/provider/package/easy_install.rb +114 -0
  225. data/lib/chef/provider/package/freebsd.rb +123 -0
  226. data/lib/chef/provider/package/macports.rb +105 -0
  227. data/lib/chef/provider/package/pacman.rb +101 -0
  228. data/lib/chef/provider/package/portage.rb +124 -0
  229. data/lib/chef/provider/package/rpm.rb +101 -0
  230. data/lib/chef/provider/package/rubygems.rb +462 -0
  231. data/lib/chef/provider/package/solaris.rb +127 -0
  232. data/lib/chef/provider/package/yum-dump.py +128 -0
  233. data/lib/chef/provider/package/yum.rb +222 -0
  234. data/lib/chef/provider/package/zypper.rb +133 -0
  235. data/lib/chef/provider/package.rb +160 -0
  236. data/lib/chef/provider/remote_directory.rb +140 -0
  237. data/lib/chef/provider/remote_file.rb +120 -0
  238. data/lib/chef/provider/route.rb +195 -0
  239. data/lib/chef/provider/ruby_block.rb +33 -0
  240. data/lib/chef/provider/script.rb +55 -0
  241. data/lib/chef/provider/service/arch.rb +109 -0
  242. data/lib/chef/provider/service/debian.rb +105 -0
  243. data/lib/chef/provider/service/freebsd.rb +156 -0
  244. data/lib/chef/provider/service/gentoo.rb +54 -0
  245. data/lib/chef/provider/service/init.rb +71 -0
  246. data/lib/chef/provider/service/redhat.rb +60 -0
  247. data/lib/chef/provider/service/simple.rb +118 -0
  248. data/lib/chef/provider/service/solaris.rb +85 -0
  249. data/lib/chef/provider/service/upstart.rb +192 -0
  250. data/lib/chef/provider/service/windows.rb +129 -0
  251. data/lib/chef/provider/service.rb +128 -0
  252. data/lib/chef/provider/subversion.rb +159 -0
  253. data/lib/chef/provider/template.rb +105 -0
  254. data/lib/chef/provider/user/dscl.rb +280 -0
  255. data/lib/chef/provider/user/pw.rb +113 -0
  256. data/lib/chef/provider/user/useradd.rb +137 -0
  257. data/lib/chef/provider/user/windows.rb +124 -0
  258. data/lib/chef/provider/user.rb +187 -0
  259. data/lib/chef/provider.rb +124 -0
  260. data/lib/chef/providers.rb +91 -0
  261. data/lib/chef/recipe.rb +130 -0
  262. data/lib/chef/resource/apt_package.rb +34 -0
  263. data/lib/chef/resource/bash.rb +33 -0
  264. data/lib/chef/resource/breakpoint.rb +35 -0
  265. data/lib/chef/resource/cookbook_file.rb +45 -0
  266. data/lib/chef/resource/cron.rb +188 -0
  267. data/lib/chef/resource/csh.rb +33 -0
  268. data/lib/chef/resource/deploy.rb +371 -0
  269. data/lib/chef/resource/deploy_revision.rb +35 -0
  270. data/lib/chef/resource/directory.rb +76 -0
  271. data/lib/chef/resource/dpkg_package.rb +34 -0
  272. data/lib/chef/resource/easy_install_package.rb +41 -0
  273. data/lib/chef/resource/env.rb +58 -0
  274. data/lib/chef/resource/erl_call.rb +83 -0
  275. data/lib/chef/resource/execute.rb +127 -0
  276. data/lib/chef/resource/file.rb +92 -0
  277. data/lib/chef/resource/freebsd_package.rb +35 -0
  278. data/lib/chef/resource/gem_package.rb +49 -0
  279. data/lib/chef/resource/git.rb +36 -0
  280. data/lib/chef/resource/group.rb +70 -0
  281. data/lib/chef/resource/http_request.rb +61 -0
  282. data/lib/chef/resource/ifconfig.rb +134 -0
  283. data/lib/chef/resource/link.rb +78 -0
  284. data/lib/chef/resource/log.rb +62 -0
  285. data/lib/chef/resource/macports_package.rb +29 -0
  286. data/lib/chef/resource/mdadm.rb +82 -0
  287. data/lib/chef/resource/mount.rb +135 -0
  288. data/lib/chef/resource/ohai.rb +40 -0
  289. data/lib/chef/resource/package.rb +80 -0
  290. data/lib/chef/resource/pacman_package.rb +33 -0
  291. data/lib/chef/resource/perl.rb +33 -0
  292. data/lib/chef/resource/portage_package.rb +33 -0
  293. data/lib/chef/resource/python.rb +33 -0
  294. data/lib/chef/resource/remote_directory.rb +109 -0
  295. data/lib/chef/resource/remote_file.rb +83 -0
  296. data/lib/chef/resource/route.rb +135 -0
  297. data/lib/chef/resource/rpm_package.rb +34 -0
  298. data/lib/chef/resource/ruby.rb +33 -0
  299. data/lib/chef/resource/ruby_block.rb +40 -0
  300. data/lib/chef/resource/scm.rb +146 -0
  301. data/lib/chef/resource/script.rb +60 -0
  302. data/lib/chef/resource/service.rb +160 -0
  303. data/lib/chef/resource/solaris_package.rb +36 -0
  304. data/lib/chef/resource/subversion.rb +36 -0
  305. data/lib/chef/resource/template.rb +69 -0
  306. data/lib/chef/resource/timestamped_deploy.rb +31 -0
  307. data/lib/chef/resource/user.rb +130 -0
  308. data/lib/chef/resource/yum_package.rb +43 -0
  309. data/lib/chef/resource.rb +523 -0
  310. data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
  311. data/lib/chef/resource_collection.rb +217 -0
  312. data/lib/chef/resource_definition.rb +67 -0
  313. data/lib/chef/resource_definition_list.rb +38 -0
  314. data/lib/chef/resources.rb +64 -0
  315. data/lib/chef/rest/auth_credentials.rb +78 -0
  316. data/lib/chef/rest/cookie_jar.rb +31 -0
  317. data/lib/chef/rest/rest_request.rb +188 -0
  318. data/lib/chef/rest.rb +394 -0
  319. data/lib/chef/role.rb +287 -0
  320. data/lib/chef/run_context.rb +110 -0
  321. data/lib/chef/run_list/run_list_expansion.rb +172 -0
  322. data/lib/chef/run_list/run_list_item.rb +78 -0
  323. data/lib/chef/run_list.rb +150 -0
  324. data/lib/chef/run_status.rb +121 -0
  325. data/lib/chef/runner.rb +107 -0
  326. data/lib/chef/sandbox.rb +153 -0
  327. data/lib/chef/search/query.rb +60 -0
  328. data/lib/chef/shef/ext.rb +568 -0
  329. data/lib/chef/shef/model_wrapper.rb +120 -0
  330. data/lib/chef/shef/shef_rest.rb +28 -0
  331. data/lib/chef/shef/shef_session.rb +271 -0
  332. data/lib/chef/shef.rb +325 -0
  333. data/lib/chef/shell_out.rb +413 -0
  334. data/lib/chef/streaming_cookbook_uploader.rb +201 -0
  335. data/lib/chef/tasks/chef_repo.rake +256 -0
  336. data/lib/chef/util/file_edit.rb +122 -0
  337. data/lib/chef/util/windows/net_group.rb +101 -0
  338. data/lib/chef/util/windows/net_use.rb +121 -0
  339. data/lib/chef/util/windows/net_user.rb +198 -0
  340. data/lib/chef/util/windows/volume.rb +59 -0
  341. data/lib/chef/util/windows.rb +56 -0
  342. data/lib/chef/version.rb +21 -0
  343. data/lib/chef/webui_user.rb +231 -0
  344. data/lib/chef.rb +39 -0
  345. metadata +533 -0
@@ -0,0 +1,64 @@
1
+ #
2
+ # Author:: Ian Meyer (<ianmmeyer@gmail.com>)
3
+ # Copyright:: Copyright (c) 2009 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/knife'
20
+ require 'json'
21
+
22
+ class Chef
23
+ class Knife
24
+ class SlicehostServerList < Knife
25
+
26
+ banner "knife slicehost server list (options)"
27
+
28
+ def h
29
+ @highline ||= HighLine.new
30
+ end
31
+
32
+ def run
33
+ require 'fog'
34
+ require 'highline'
35
+ require 'net/ssh/multi'
36
+ require 'readline'
37
+
38
+ slicehost = Fog::Slicehost.new(
39
+ :slicehost_password => Chef::Config[:knife][:slicehost_password]
40
+ )
41
+
42
+ # Make hash of flavor id => name and image id => name
43
+ flavors = slicehost.flavors.inject({}) { |h,f| h[f.id] = f.name; h }
44
+ images = slicehost.images.inject({}) { |h,i| h[i.id] = i.name; h }
45
+
46
+ server_list = [ h.color('ID', :bold), h.color('Name', :bold), h.color('Public IP', :bold), h.color('Private IP', :bold), h.color('Image', :bold), h.color('Flavor', :bold) ]
47
+
48
+ slicehost.servers.each do |server|
49
+ server_list << server.id.to_s
50
+ server_list << server.name
51
+ server_list << server.addresses[1]
52
+ server_list << server.addresses[0]
53
+ server_list << images[server.image_id].to_s
54
+ server_list << flavors[server.flavor_id].to_s
55
+ end
56
+ puts h.list(server_list, :columns_across, 6)
57
+
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+
64
+
@@ -0,0 +1,328 @@
1
+ #
2
+ # Author:: Adam Jacob (<adam@opscode.com>)
3
+ # Copyright:: Copyright (c) 2009 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/knife'
20
+ require 'chef/data_bag_item'
21
+ require 'net/ssh'
22
+
23
+ begin
24
+ gem "net-ssh", ">= 2.0.23"
25
+ rescue LoadError
26
+ end
27
+
28
+ class Chef
29
+ class Knife
30
+ class Ssh < Knife
31
+
32
+ attr_writer :password
33
+
34
+ banner "knife ssh QUERY COMMAND (options)"
35
+
36
+ option :concurrency,
37
+ :short => "-C NUM",
38
+ :long => "--concurrency NUM",
39
+ :description => "The number of concurrent connections",
40
+ :default => nil,
41
+ :proc => lambda { |o| o.to_i }
42
+
43
+ option :attribute,
44
+ :short => "-a ATTR",
45
+ :long => "--attribute ATTR",
46
+ :description => "The attribute to use for opening the connection - default is fqdn",
47
+ :default => "fqdn"
48
+
49
+ option :manual,
50
+ :short => "-m",
51
+ :long => "--manual-list",
52
+ :boolean => true,
53
+ :description => "QUERY is a space separated list of servers",
54
+ :default => false
55
+
56
+ option :ssh_user,
57
+ :short => "-x USERNAME",
58
+ :long => "--ssh-user USERNAME",
59
+ :description => "The ssh username"
60
+
61
+ option :ssh_password,
62
+ :short => "-P PASSWORD",
63
+ :long => "--ssh-password PASSWORD",
64
+ :description => "The ssh password"
65
+
66
+ option :ssh_gateway,
67
+ :short => "-G GATEWAY",
68
+ :long => "--ssh-gateway GATEWAY",
69
+ :description => "The ssh gateway"
70
+
71
+ option :identity_file,
72
+ :short => "-i IDENTITY_FILE",
73
+ :long => "--identity-file IDENTITY_FILE",
74
+ :description => "The SSH identity file used for authentication"
75
+
76
+ def session
77
+ ssh_error_handler = Proc.new do |server|
78
+ if config[:manual]
79
+ node_name = server.host
80
+ else
81
+ @action_nodes.each do |n|
82
+ node_name = n if format_for_display(n)[config[:attribute]] == server.host
83
+ end
84
+ end
85
+ Chef::Log.warn "Failed to connect to #{node_name} -- #{$!.class.name}: #{$!.message}"
86
+ $!.backtrace.each { |l| Chef::Log.debug(l) }
87
+ end
88
+
89
+ @session ||= Net::SSH::Multi.start(:concurrent_connections => config[:concurrency], :on_error => ssh_error_handler)
90
+ end
91
+
92
+ def h
93
+ @highline ||= HighLine.new
94
+ end
95
+
96
+ def configure_session
97
+ list = case config[:manual]
98
+ when true
99
+ @name_args[0].split(" ")
100
+ when false
101
+ r = Array.new
102
+ q = Chef::Search::Query.new
103
+ @action_nodes = q.search(:node, @name_args[0])[0]
104
+ @action_nodes.each do |item|
105
+ i = format_for_display(item)[config[:attribute]]
106
+ r.push(i) unless i.nil?
107
+ end
108
+ r
109
+ end
110
+ (Chef::Log.fatal("No nodes returned from search!"); exit 10) if list.length == 0
111
+ session_from_list(list)
112
+ end
113
+
114
+ def session_from_list(list)
115
+ if config[:ssh_gateway]
116
+ gw_host, gw_user = config[:ssh_gateway].split('@').reverse
117
+ gw_host, gw_port = gw_host.split(':')
118
+ gw_opts = gw_port ? { :port => gw_port } : {}
119
+
120
+ session.via(gw_host, gw_user || config[:ssh_user], gw_opts)
121
+ end
122
+
123
+ list.each do |item|
124
+ Chef::Log.debug("Adding #{item}")
125
+
126
+ hostspec = config[:ssh_user] ? "#{config[:ssh_user]}@#{item}" : item
127
+ session_opts = {}
128
+ session_opts[:keys] = File.expand_path(config[:identity_file]) if config[:identity_file]
129
+ session_opts[:password] = config[:ssh_password] if config[:ssh_password]
130
+ session_opts[:logger] = Chef::Log.logger if Chef::Log.level == :debug
131
+
132
+ session.use(hostspec, session_opts)
133
+
134
+ @longest = item.length if item.length > @longest
135
+ end
136
+ session
137
+ end
138
+
139
+ def fixup_sudo(command)
140
+ command.sub(/^sudo/, 'sudo -p \'knife sudo password: \'')
141
+ end
142
+
143
+ def print_data(host, data)
144
+ if data =~ /\n/
145
+ data.split(/\n/).each { |d| print_data(host, d) }
146
+ else
147
+ padding = @longest - host.length
148
+ print h.color(host, :cyan)
149
+ padding.downto(0) { print " " }
150
+ puts data
151
+ end
152
+ end
153
+
154
+ def ssh_command(command, subsession=nil)
155
+ subsession ||= session
156
+ command = fixup_sudo(command)
157
+ subsession.open_channel do |ch|
158
+ ch.request_pty
159
+ ch.exec command do |ch, success|
160
+ raise ArgumentError, "Cannot execute #{command}" unless success
161
+ ch.on_data do |ichannel, data|
162
+ print_data(ichannel[:host], data)
163
+ if data =~ /^knife sudo password: /
164
+ ichannel.send_data("#{get_password}\n")
165
+ end
166
+ end
167
+ end
168
+ end
169
+ session.loop
170
+ end
171
+
172
+ def get_password
173
+ @password ||= h.ask("Enter your password: ") { |q| q.echo = false }
174
+ end
175
+
176
+ # Present the prompt and read a single line from the console. It also
177
+ # detects ^D and returns "exit" in that case. Adds the input to the
178
+ # history, unless the input is empty. Loops repeatedly until a non-empty
179
+ # line is input.
180
+ def read_line
181
+ loop do
182
+ command = reader.readline("#{h.color('knife-ssh>', :bold)} ", true)
183
+
184
+ if command.nil?
185
+ command = "exit"
186
+ puts(command)
187
+ else
188
+ command.strip!
189
+ end
190
+
191
+ unless command.empty?
192
+ return command
193
+ end
194
+ end
195
+ end
196
+
197
+ def reader
198
+ Readline
199
+ end
200
+
201
+ def interactive
202
+ puts "Connected to #{h.list(session.servers_for.collect { |s| h.color(s.host, :cyan) }, :inline, " and ")}"
203
+ puts
204
+ puts "To run a command on a list of servers, do:"
205
+ puts " on SERVER1 SERVER2 SERVER3; COMMAND"
206
+ puts " Example: on latte foamy; echo foobar"
207
+ puts
208
+ puts "To exit interactive mode, use 'quit!'"
209
+ puts
210
+ while 1
211
+ command = read_line
212
+ case command
213
+ when 'quit!'
214
+ puts 'Bye!'
215
+ break
216
+ when /^on (.+?); (.+)$/
217
+ raw_list = $1.split(" ")
218
+ server_list = Array.new
219
+ session.servers.each do |session_server|
220
+ server_list << session_server if raw_list.include?(session_server.host)
221
+ end
222
+ command = $2
223
+ ssh_command(command, session.on(*server_list))
224
+ else
225
+ ssh_command(command)
226
+ end
227
+ end
228
+ end
229
+
230
+ def screen
231
+ tf = Tempfile.new("knife-ssh-screen")
232
+ if File.exist? "#{ENV["HOME"]}/.screenrc"
233
+ tf.puts("source #{ENV["HOME"]}/.screenrc")
234
+ end
235
+ tf.puts("caption always '%-Lw%{= BW}%50>%n%f* %t%{-}%+Lw%<'")
236
+ tf.puts("hardstatus alwayslastline 'knife ssh #{@name_args[0]}'")
237
+ window = 0
238
+ session.servers_for.each do |server|
239
+ tf.print("screen -t \"#{server.host}\" #{window} ssh ")
240
+ server.user ? tf.puts("#{server.user}@#{server.host}") : tf.puts(server.host)
241
+ window += 1
242
+ end
243
+ tf.close
244
+ exec("screen -c #{tf.path}")
245
+ end
246
+
247
+ def tmux
248
+ begin
249
+ Chef::Mixin::Command.run_command(:command => "tmux new-session -d -s 'knife'")
250
+ rescue Chef::Exceptions::Exec
251
+ end
252
+ session.servers_for.each do |server|
253
+ begin
254
+ Chef::Mixin::Command.run_command(:command => "tmux new-window -d -n '#{server.host}' -t 'knife' 'ssh #{server.user ? "#{server.user}@#{server.host}" : server.host}'")
255
+ rescue Chef::Exceptions::Exec
256
+ end
257
+ end
258
+ exec("tmux attach-session -t knife")
259
+ end
260
+
261
+ def macterm
262
+ require 'appscript'
263
+ Appscript.app("/Applications/Utilities/Terminal.app").windows.first.activate
264
+ Appscript.app("System Events").application_processes["Terminal.app"].keystroke("n", :using=>:command_down)
265
+ term = Appscript.app('Terminal')
266
+ window = term.windows.first.get
267
+ session.servers_for.each do |server|
268
+ Appscript.app("System Events").application_processes["Terminal.app"].keystroke("t", :using=>:command_down)
269
+ cmd = "unset PROMPT_COMMAND; echo -e \"\\033]0;#{server.host}\\007\"; ssh #{server.user ? "#{server.user}@#{server.host}" : server.host}"
270
+ Appscript.app('Terminal').do_script(cmd, :in => window.tabs.last.get)
271
+ sleep 1
272
+ end
273
+ end
274
+
275
+ def run
276
+ @longest = 0
277
+
278
+ load_late_dependencies
279
+
280
+ configure_session
281
+
282
+ case @name_args[1]
283
+ when "interactive"
284
+ interactive
285
+ when "screen"
286
+ screen
287
+ when "tmux"
288
+ tmux
289
+ when "macterm"
290
+ macterm
291
+ else
292
+ ssh_command(@name_args[1..-1].join(" "))
293
+ end
294
+
295
+ session.close
296
+ end
297
+
298
+ def load_late_dependencies
299
+ require 'readline'
300
+ %w[net/ssh/multi highline].each do |dep|
301
+ load_late_dependency dep
302
+ end
303
+ assert_net_ssh_version_acceptable!
304
+ end
305
+
306
+ # :nodoc:
307
+ # TODO: remove this stuff entirely and package knife ssh as a knife plugin. (Dan - 08 Jul 2010)
308
+ #
309
+ # The correct way to specify version deps is in the gemspec or other packaging.
310
+ # However, we don't want to have a gem dep on net-ssh, because it's a hassle
311
+ # when you only need the chef-client (e.g., on a managed node). So we have to
312
+ # check here that you have a decent version of Net::SSH.
313
+ #
314
+ # net-ssh of lower versions has a bug that causes 'knife ssh (searchterm) (commandname)"
315
+ # to loop infinitely and consume all the CPU of one core.
316
+ def assert_net_ssh_version_acceptable!
317
+ netssh_version = Net::SSH::Version
318
+ # we want version 2.0.23 and higher:
319
+ unless (netssh_version::MAJOR == 2) && (netssh_version::TINY >= 23 || netssh_version::MINOR >= 1)
320
+ STDERR.puts "ERROR: Please install net-ssh version 2.0.23 or higher, as lower versions cause issues."
321
+ exit 1
322
+ end
323
+ end
324
+
325
+ end
326
+ end
327
+ end
328
+
@@ -0,0 +1,87 @@
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
+ require 'highline'
21
+ require 'chef/search/query'
22
+
23
+ class Chef
24
+ class Knife
25
+ class Status < Knife
26
+
27
+ banner "knife status QUERY (options)"
28
+
29
+ option :run_list,
30
+ :short => "-r",
31
+ :long => "--run-list",
32
+ :description => "Show the run list"
33
+
34
+ def highline
35
+ @h ||= HighLine.new
36
+ end
37
+
38
+ def run
39
+ all_nodes = []
40
+ q = Chef::Search::Query.new
41
+ query = @name_args[0] || "*:*"
42
+ q.search(:node, query) do |node|
43
+ all_nodes << node
44
+ end
45
+ all_nodes.sort { |n1, n2| n1["ohai_time"] <=> n2["ohai_time"] }.each do |node|
46
+ if node.has_key?("ec2")
47
+ fqdn = node['ec2']['public_hostname']
48
+ ipaddress = node['ec2']['public_ipv4']
49
+ else
50
+ fqdn = node['fqdn']
51
+ ipaddress = node['ipaddress']
52
+ end
53
+ hours, minutes, seconds = time_difference_in_hms(node["ohai_time"])
54
+ hours_text = "#{hours} hour#{hours == 1 ? ' ' : 's'}"
55
+ minutes_text = "#{minutes} minute#{minutes == 1 ? ' ' : 's'}"
56
+ run_list = ", #{node.run_list}." if config[:run_list]
57
+ if hours > 24
58
+ color = "RED"
59
+ text = hours_text
60
+ elsif hours >= 1
61
+ color = "YELLOW"
62
+ text = hours_text
63
+ else
64
+ color = "GREEN"
65
+ text = minutes_text
66
+ end
67
+
68
+ highline.say("<%= color('#{text}', #{color}) %> ago, #{node.name}, #{node['platform']} #{node['platform_version']}, #{fqdn}, #{ipaddress}#{run_list}")
69
+ end
70
+
71
+ end
72
+
73
+ # :nodoc:
74
+ # TODO: this is duplicated from StatusHelper in the Webui. dedup.
75
+ def time_difference_in_hms(unix_time)
76
+ now = Time.now.to_i
77
+ difference = now - unix_time.to_i
78
+ hours = (difference / 3600).to_i
79
+ difference = difference % 3600
80
+ minutes = (difference / 60).to_i
81
+ seconds = (difference % 60)
82
+ return [hours, minutes, seconds]
83
+ end
84
+
85
+ end
86
+ end
87
+ end