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.
- data/LICENSE +201 -0
- data/README.rdoc +172 -0
- data/bin/chef-client +26 -0
- data/bin/chef-solo +25 -0
- data/bin/knife +26 -0
- data/bin/shef +34 -0
- data/distro/README +2 -0
- data/distro/common/man/man1/chef-indexer.1 +42 -0
- data/distro/common/man/man1/chef-server-webui.1 +106 -0
- data/distro/common/man/man1/chef-server.1 +107 -0
- data/distro/common/man/man1/chef-solr-indexer.1 +55 -0
- data/distro/common/man/man1/chef-solr.1 +55 -0
- data/distro/common/man/man8/chef-client.8 +63 -0
- data/distro/common/man/man8/chef-solo.8 +57 -0
- data/distro/common/man/man8/chef-solr-rebuild.8 +37 -0
- data/distro/common/man/man8/knife.8 +1349 -0
- data/distro/common/man/man8/shef.8 +45 -0
- data/distro/common/markdown/README +3 -0
- data/distro/common/markdown/knife.mkd +832 -0
- data/distro/debian/etc/default/chef-client +4 -0
- data/distro/debian/etc/default/chef-server +9 -0
- data/distro/debian/etc/default/chef-server-webui +9 -0
- data/distro/debian/etc/default/chef-solr +7 -0
- data/distro/debian/etc/default/chef-solr-indexer +7 -0
- data/distro/debian/etc/init/chef-client.conf +17 -0
- data/distro/debian/etc/init/chef-server-webui.conf +17 -0
- data/distro/debian/etc/init/chef-server.conf +17 -0
- data/distro/debian/etc/init/chef-solr-indexer.conf +17 -0
- data/distro/debian/etc/init/chef-solr.conf +17 -0
- data/distro/debian/etc/init.d/chef-client +175 -0
- data/distro/debian/etc/init.d/chef-server +122 -0
- data/distro/debian/etc/init.d/chef-server-webui +123 -0
- data/distro/debian/etc/init.d/chef-solr +177 -0
- data/distro/debian/etc/init.d/chef-solr-indexer +176 -0
- data/distro/redhat/etc/init.d/chef-client +106 -0
- data/distro/redhat/etc/init.d/chef-server +112 -0
- data/distro/redhat/etc/init.d/chef-server-webui +112 -0
- data/distro/redhat/etc/init.d/chef-solr +104 -0
- data/distro/redhat/etc/init.d/chef-solr-indexer +104 -0
- data/distro/redhat/etc/logrotate.d/chef-client +8 -0
- data/distro/redhat/etc/logrotate.d/chef-server +8 -0
- data/distro/redhat/etc/logrotate.d/chef-server-webui +8 -0
- data/distro/redhat/etc/logrotate.d/chef-solr +8 -0
- data/distro/redhat/etc/logrotate.d/chef-solr-indexer +8 -0
- data/distro/redhat/etc/sysconfig/chef-client +15 -0
- data/distro/redhat/etc/sysconfig/chef-server +14 -0
- data/distro/redhat/etc/sysconfig/chef-server-webui +14 -0
- data/distro/redhat/etc/sysconfig/chef-solr +8 -0
- data/distro/redhat/etc/sysconfig/chef-solr-indexer +7 -0
- data/lib/chef/api_client.rb +264 -0
- data/lib/chef/application/agent.rb +18 -0
- data/lib/chef/application/client.rb +246 -0
- data/lib/chef/application/knife.rb +171 -0
- data/lib/chef/application/solo.rb +215 -0
- data/lib/chef/application.rb +127 -0
- data/lib/chef/applications.rb +4 -0
- data/lib/chef/certificate.rb +194 -0
- data/lib/chef/checksum.rb +182 -0
- data/lib/chef/checksum_cache.rb +173 -0
- data/lib/chef/client.rb +304 -0
- data/lib/chef/config.rb +240 -0
- data/lib/chef/cookbook/cookbook_collection.rb +44 -0
- data/lib/chef/cookbook/file_system_file_vendor.rb +54 -0
- data/lib/chef/cookbook/file_vendor.rb +48 -0
- data/lib/chef/cookbook/metadata/version.rb +87 -0
- data/lib/chef/cookbook/metadata.rb +500 -0
- data/lib/chef/cookbook/remote_file_vendor.rb +87 -0
- data/lib/chef/cookbook/syntax_check.rb +136 -0
- data/lib/chef/cookbook_loader.rb +227 -0
- data/lib/chef/cookbook_site_streaming_uploader.rb +244 -0
- data/lib/chef/cookbook_uploader.rb +103 -0
- data/lib/chef/cookbook_version.rb +930 -0
- data/lib/chef/couchdb.rb +239 -0
- data/lib/chef/daemon.rb +172 -0
- data/lib/chef/data_bag.rb +215 -0
- data/lib/chef/data_bag_item.rb +228 -0
- data/lib/chef/exceptions.rb +66 -0
- data/lib/chef/file_access_control.rb +140 -0
- data/lib/chef/file_cache.rb +218 -0
- data/lib/chef/handler/json_file.rb +58 -0
- data/lib/chef/handler.rb +206 -0
- data/lib/chef/index_queue/amqp_client.rb +113 -0
- data/lib/chef/index_queue/consumer.rb +76 -0
- data/lib/chef/index_queue/indexable.rb +76 -0
- data/lib/chef/index_queue.rb +29 -0
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +44 -0
- data/lib/chef/knife/bootstrap/centos5-gems.erb +41 -0
- data/lib/chef/knife/bootstrap/client-install.vbs +80 -0
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +38 -0
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +32 -0
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +43 -0
- data/lib/chef/knife/bootstrap/windows-gems.erb +34 -0
- data/lib/chef/knife/bootstrap.rb +181 -0
- data/lib/chef/knife/client_bulk_delete.rb +40 -0
- data/lib/chef/knife/client_create.rb +70 -0
- data/lib/chef/knife/client_delete.rb +45 -0
- data/lib/chef/knife/client_edit.rb +45 -0
- data/lib/chef/knife/client_list.rb +40 -0
- data/lib/chef/knife/client_reregister.rb +56 -0
- data/lib/chef/knife/client_show.rb +50 -0
- data/lib/chef/knife/configure.rb +140 -0
- data/lib/chef/knife/configure_client.rb +52 -0
- data/lib/chef/knife/cookbook_bulk_delete.rb +58 -0
- data/lib/chef/knife/cookbook_create.rb +209 -0
- data/lib/chef/knife/cookbook_delete.rb +143 -0
- data/lib/chef/knife/cookbook_download.rb +130 -0
- data/lib/chef/knife/cookbook_list.rb +41 -0
- data/lib/chef/knife/cookbook_metadata.rb +82 -0
- data/lib/chef/knife/cookbook_metadata_from_file.rb +40 -0
- data/lib/chef/knife/cookbook_show.rb +98 -0
- data/lib/chef/knife/cookbook_site_download.rb +58 -0
- data/lib/chef/knife/cookbook_site_list.rb +56 -0
- data/lib/chef/knife/cookbook_site_search.rb +51 -0
- data/lib/chef/knife/cookbook_site_share.rb +109 -0
- data/lib/chef/knife/cookbook_site_show.rb +57 -0
- data/lib/chef/knife/cookbook_site_unshare.rb +52 -0
- data/lib/chef/knife/cookbook_site_vendor.rb +133 -0
- data/lib/chef/knife/cookbook_test.rb +82 -0
- data/lib/chef/knife/cookbook_upload.rb +95 -0
- data/lib/chef/knife/data_bag_create.rb +59 -0
- data/lib/chef/knife/data_bag_delete.rb +48 -0
- data/lib/chef/knife/data_bag_edit.rb +50 -0
- data/lib/chef/knife/data_bag_from_file.rb +44 -0
- data/lib/chef/knife/data_bag_list.rb +43 -0
- data/lib/chef/knife/data_bag_show.rb +41 -0
- data/lib/chef/knife/ec2_instance_data.rb +46 -0
- data/lib/chef/knife/ec2_server_create.rb +216 -0
- data/lib/chef/knife/ec2_server_delete.rb +90 -0
- data/lib/chef/knife/ec2_server_list.rb +88 -0
- data/lib/chef/knife/exec.rb +52 -0
- data/lib/chef/knife/index_rebuild.rb +51 -0
- data/lib/chef/knife/node_bulk_delete.rb +43 -0
- data/lib/chef/knife/node_create.rb +47 -0
- data/lib/chef/knife/node_delete.rb +44 -0
- data/lib/chef/knife/node_edit.rb +44 -0
- data/lib/chef/knife/node_from_file.rb +42 -0
- data/lib/chef/knife/node_list.rb +41 -0
- data/lib/chef/knife/node_run_list_add.rb +64 -0
- data/lib/chef/knife/node_run_list_remove.rb +45 -0
- data/lib/chef/knife/node_show.rb +54 -0
- data/lib/chef/knife/rackspace_server_create.rb +156 -0
- data/lib/chef/knife/rackspace_server_delete.rb +57 -0
- data/lib/chef/knife/rackspace_server_list.rb +59 -0
- data/lib/chef/knife/recipe_list.rb +32 -0
- data/lib/chef/knife/role_bulk_delete.rb +44 -0
- data/lib/chef/knife/role_create.rb +52 -0
- data/lib/chef/knife/role_delete.rb +44 -0
- data/lib/chef/knife/role_edit.rb +45 -0
- data/lib/chef/knife/role_from_file.rb +46 -0
- data/lib/chef/knife/role_list.rb +40 -0
- data/lib/chef/knife/role_show.rb +51 -0
- data/lib/chef/knife/search.rb +94 -0
- data/lib/chef/knife/slicehost_images_list.rb +53 -0
- data/lib/chef/knife/slicehost_server_create.rb +103 -0
- data/lib/chef/knife/slicehost_server_delete.rb +61 -0
- data/lib/chef/knife/slicehost_server_list.rb +64 -0
- data/lib/chef/knife/ssh.rb +328 -0
- data/lib/chef/knife/status.rb +87 -0
- data/lib/chef/knife/terremark_server_create.rb +152 -0
- data/lib/chef/knife/terremark_server_delete.rb +87 -0
- data/lib/chef/knife/terremark_server_list.rb +77 -0
- data/lib/chef/knife/windows_bootstrap.rb +154 -0
- data/lib/chef/knife.rb +522 -0
- data/lib/chef/log.rb +61 -0
- data/lib/chef/mixin/check_helper.rb +31 -0
- data/lib/chef/mixin/checksum.rb +32 -0
- data/lib/chef/mixin/command/unix.rb +215 -0
- data/lib/chef/mixin/command/windows.rb +72 -0
- data/lib/chef/mixin/command.rb +220 -0
- data/lib/chef/mixin/convert_to_class_name.rb +63 -0
- data/lib/chef/mixin/create_path.rb +56 -0
- data/lib/chef/mixin/deep_merge.rb +225 -0
- data/lib/chef/mixin/deprecation.rb +65 -0
- data/lib/chef/mixin/find_preferred_file.rb +92 -0
- data/lib/chef/mixin/from_file.rb +50 -0
- data/lib/chef/mixin/language.rb +156 -0
- data/lib/chef/mixin/language_include_attribute.rb +61 -0
- data/lib/chef/mixin/language_include_recipe.rb +52 -0
- data/lib/chef/mixin/params_validate.rb +225 -0
- data/lib/chef/mixin/recipe_definition_dsl_core.rb +81 -0
- data/lib/chef/mixin/shell_out.rb +38 -0
- data/lib/chef/mixin/template.rb +95 -0
- data/lib/chef/mixin/xml_escape.rb +140 -0
- data/lib/chef/mixins.rb +16 -0
- data/lib/chef/monkey_patches/dir.rb +36 -0
- data/lib/chef/monkey_patches/string.rb +28 -0
- data/lib/chef/monkey_patches/tempfile.rb +64 -0
- data/lib/chef/node/attribute.rb +465 -0
- data/lib/chef/node.rb +601 -0
- data/lib/chef/openid_registration.rb +187 -0
- data/lib/chef/platform.rb +371 -0
- data/lib/chef/provider/breakpoint.rb +36 -0
- data/lib/chef/provider/cookbook_file.rb +100 -0
- data/lib/chef/provider/cron/solaris.rb +195 -0
- data/lib/chef/provider/cron.rb +186 -0
- data/lib/chef/provider/deploy/revision.rb +73 -0
- data/lib/chef/provider/deploy/timestamped.rb +33 -0
- data/lib/chef/provider/deploy.rb +319 -0
- data/lib/chef/provider/directory.rb +72 -0
- data/lib/chef/provider/env/windows.rb +75 -0
- data/lib/chef/provider/env.rb +152 -0
- data/lib/chef/provider/erl_call.rb +72 -0
- data/lib/chef/provider/execute.rb +58 -0
- data/lib/chef/provider/file.rb +213 -0
- data/lib/chef/provider/git.rb +211 -0
- data/lib/chef/provider/group/dscl.rb +121 -0
- data/lib/chef/provider/group/gpasswd.rb +53 -0
- data/lib/chef/provider/group/groupadd.rb +78 -0
- data/lib/chef/provider/group/pw.rb +84 -0
- data/lib/chef/provider/group/usermod.rb +57 -0
- data/lib/chef/provider/group/windows.rb +79 -0
- data/lib/chef/provider/group.rb +133 -0
- data/lib/chef/provider/http_request.rb +122 -0
- data/lib/chef/provider/ifconfig.rb +132 -0
- data/lib/chef/provider/link.rb +161 -0
- data/lib/chef/provider/log.rb +54 -0
- data/lib/chef/provider/mdadm.rb +91 -0
- data/lib/chef/provider/mount/mount.rb +232 -0
- data/lib/chef/provider/mount/windows.rb +80 -0
- data/lib/chef/provider/mount.rb +117 -0
- data/lib/chef/provider/ohai.rb +41 -0
- data/lib/chef/provider/package/apt.rb +110 -0
- data/lib/chef/provider/package/dpkg.rb +112 -0
- data/lib/chef/provider/package/easy_install.rb +114 -0
- data/lib/chef/provider/package/freebsd.rb +123 -0
- data/lib/chef/provider/package/macports.rb +105 -0
- data/lib/chef/provider/package/pacman.rb +101 -0
- data/lib/chef/provider/package/portage.rb +124 -0
- data/lib/chef/provider/package/rpm.rb +101 -0
- data/lib/chef/provider/package/rubygems.rb +462 -0
- data/lib/chef/provider/package/solaris.rb +127 -0
- data/lib/chef/provider/package/yum-dump.py +128 -0
- data/lib/chef/provider/package/yum.rb +222 -0
- data/lib/chef/provider/package/zypper.rb +133 -0
- data/lib/chef/provider/package.rb +160 -0
- data/lib/chef/provider/remote_directory.rb +140 -0
- data/lib/chef/provider/remote_file.rb +120 -0
- data/lib/chef/provider/route.rb +195 -0
- data/lib/chef/provider/ruby_block.rb +33 -0
- data/lib/chef/provider/script.rb +55 -0
- data/lib/chef/provider/service/arch.rb +109 -0
- data/lib/chef/provider/service/debian.rb +105 -0
- data/lib/chef/provider/service/freebsd.rb +156 -0
- data/lib/chef/provider/service/gentoo.rb +54 -0
- data/lib/chef/provider/service/init.rb +71 -0
- data/lib/chef/provider/service/redhat.rb +60 -0
- data/lib/chef/provider/service/simple.rb +118 -0
- data/lib/chef/provider/service/solaris.rb +85 -0
- data/lib/chef/provider/service/upstart.rb +192 -0
- data/lib/chef/provider/service/windows.rb +129 -0
- data/lib/chef/provider/service.rb +128 -0
- data/lib/chef/provider/subversion.rb +159 -0
- data/lib/chef/provider/template.rb +105 -0
- data/lib/chef/provider/user/dscl.rb +280 -0
- data/lib/chef/provider/user/pw.rb +113 -0
- data/lib/chef/provider/user/useradd.rb +137 -0
- data/lib/chef/provider/user/windows.rb +124 -0
- data/lib/chef/provider/user.rb +187 -0
- data/lib/chef/provider.rb +124 -0
- data/lib/chef/providers.rb +91 -0
- data/lib/chef/recipe.rb +130 -0
- data/lib/chef/resource/apt_package.rb +34 -0
- data/lib/chef/resource/bash.rb +33 -0
- data/lib/chef/resource/breakpoint.rb +35 -0
- data/lib/chef/resource/cookbook_file.rb +45 -0
- data/lib/chef/resource/cron.rb +188 -0
- data/lib/chef/resource/csh.rb +33 -0
- data/lib/chef/resource/deploy.rb +371 -0
- data/lib/chef/resource/deploy_revision.rb +35 -0
- data/lib/chef/resource/directory.rb +76 -0
- data/lib/chef/resource/dpkg_package.rb +34 -0
- data/lib/chef/resource/easy_install_package.rb +41 -0
- data/lib/chef/resource/env.rb +58 -0
- data/lib/chef/resource/erl_call.rb +83 -0
- data/lib/chef/resource/execute.rb +127 -0
- data/lib/chef/resource/file.rb +92 -0
- data/lib/chef/resource/freebsd_package.rb +35 -0
- data/lib/chef/resource/gem_package.rb +49 -0
- data/lib/chef/resource/git.rb +36 -0
- data/lib/chef/resource/group.rb +70 -0
- data/lib/chef/resource/http_request.rb +61 -0
- data/lib/chef/resource/ifconfig.rb +134 -0
- data/lib/chef/resource/link.rb +78 -0
- data/lib/chef/resource/log.rb +62 -0
- data/lib/chef/resource/macports_package.rb +29 -0
- data/lib/chef/resource/mdadm.rb +82 -0
- data/lib/chef/resource/mount.rb +135 -0
- data/lib/chef/resource/ohai.rb +40 -0
- data/lib/chef/resource/package.rb +80 -0
- data/lib/chef/resource/pacman_package.rb +33 -0
- data/lib/chef/resource/perl.rb +33 -0
- data/lib/chef/resource/portage_package.rb +33 -0
- data/lib/chef/resource/python.rb +33 -0
- data/lib/chef/resource/remote_directory.rb +109 -0
- data/lib/chef/resource/remote_file.rb +83 -0
- data/lib/chef/resource/route.rb +135 -0
- data/lib/chef/resource/rpm_package.rb +34 -0
- data/lib/chef/resource/ruby.rb +33 -0
- data/lib/chef/resource/ruby_block.rb +40 -0
- data/lib/chef/resource/scm.rb +146 -0
- data/lib/chef/resource/script.rb +60 -0
- data/lib/chef/resource/service.rb +160 -0
- data/lib/chef/resource/solaris_package.rb +36 -0
- data/lib/chef/resource/subversion.rb +36 -0
- data/lib/chef/resource/template.rb +69 -0
- data/lib/chef/resource/timestamped_deploy.rb +31 -0
- data/lib/chef/resource/user.rb +130 -0
- data/lib/chef/resource/yum_package.rb +43 -0
- data/lib/chef/resource.rb +523 -0
- data/lib/chef/resource_collection/stepable_iterator.rb +124 -0
- data/lib/chef/resource_collection.rb +217 -0
- data/lib/chef/resource_definition.rb +67 -0
- data/lib/chef/resource_definition_list.rb +38 -0
- data/lib/chef/resources.rb +64 -0
- data/lib/chef/rest/auth_credentials.rb +78 -0
- data/lib/chef/rest/cookie_jar.rb +31 -0
- data/lib/chef/rest/rest_request.rb +188 -0
- data/lib/chef/rest.rb +394 -0
- data/lib/chef/role.rb +287 -0
- data/lib/chef/run_context.rb +110 -0
- data/lib/chef/run_list/run_list_expansion.rb +172 -0
- data/lib/chef/run_list/run_list_item.rb +78 -0
- data/lib/chef/run_list.rb +150 -0
- data/lib/chef/run_status.rb +121 -0
- data/lib/chef/runner.rb +107 -0
- data/lib/chef/sandbox.rb +153 -0
- data/lib/chef/search/query.rb +60 -0
- data/lib/chef/shef/ext.rb +568 -0
- data/lib/chef/shef/model_wrapper.rb +120 -0
- data/lib/chef/shef/shef_rest.rb +28 -0
- data/lib/chef/shef/shef_session.rb +271 -0
- data/lib/chef/shef.rb +325 -0
- data/lib/chef/shell_out.rb +413 -0
- data/lib/chef/streaming_cookbook_uploader.rb +201 -0
- data/lib/chef/tasks/chef_repo.rake +256 -0
- data/lib/chef/util/file_edit.rb +122 -0
- data/lib/chef/util/windows/net_group.rb +101 -0
- data/lib/chef/util/windows/net_use.rb +121 -0
- data/lib/chef/util/windows/net_user.rb +198 -0
- data/lib/chef/util/windows/volume.rb +59 -0
- data/lib/chef/util/windows.rb +56 -0
- data/lib/chef/version.rb +21 -0
- data/lib/chef/webui_user.rb +231 -0
- data/lib/chef.rb +39 -0
- 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
|