chef 0.9.18 → 0.10.0.beta.0
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/README.rdoc +0 -3
- data/distro/arch/etc/rc.d/chef-server +0 -4
- data/distro/arch/etc/rc.d/chef-server-webui +0 -4
- data/distro/arch/etc/rc.d/chef-solr +0 -4
- data/distro/arch/etc/rc.d/chef-solr-indexer +0 -4
- data/lib/chef.rb +3 -3
- data/lib/chef/api_client.rb +1 -1
- data/lib/chef/application.rb +11 -1
- data/lib/chef/application/client.rb +18 -22
- data/lib/chef/application/knife.rb +28 -29
- data/lib/chef/application/solo.rb +14 -12
- data/lib/chef/client.rb +112 -54
- data/lib/chef/config.rb +4 -0
- data/lib/chef/cookbook/chefignore.rb +66 -0
- data/lib/chef/cookbook/cookbook_collection.rb +6 -5
- data/lib/chef/cookbook/cookbook_version_loader.rb +151 -0
- data/lib/chef/cookbook/file_system_file_vendor.rb +10 -8
- data/lib/chef/cookbook/metadata.rb +200 -108
- data/lib/chef/cookbook_loader.rb +39 -163
- data/lib/chef/cookbook_uploader.rb +100 -78
- data/lib/chef/cookbook_version.rb +92 -47
- data/lib/chef/cookbook_version_selector.rb +163 -0
- data/lib/chef/couchdb.rb +9 -1
- data/lib/chef/data_bag.rb +1 -1
- data/lib/chef/data_bag_item.rb +1 -1
- data/lib/chef/encrypted_data_bag_item.rb +126 -0
- data/lib/chef/environment.rb +386 -0
- data/lib/chef/exceptions.rb +82 -1
- data/lib/chef/index_queue/amqp_client.rb +15 -12
- data/lib/chef/index_queue/indexable.rb +38 -4
- data/lib/chef/json_compat.rb +3 -3
- data/lib/chef/knife.rb +97 -202
- data/lib/chef/knife/bootstrap.rb +27 -61
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +4 -2
- data/lib/chef/knife/bootstrap/centos5-gems.erb +6 -15
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +3 -4
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +2 -2
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +6 -5
- data/lib/chef/knife/client_bulk_delete.rb +6 -3
- data/lib/chef/knife/client_create.rb +13 -10
- data/lib/chef/knife/client_delete.rb +10 -7
- data/lib/chef/knife/client_edit.rb +9 -6
- data/lib/chef/knife/client_list.rb +8 -5
- data/lib/chef/knife/client_reregister.rb +9 -6
- data/lib/chef/knife/client_show.rb +9 -6
- data/lib/chef/knife/configure.rb +15 -19
- data/lib/chef/knife/configure_client.rb +4 -4
- data/lib/chef/knife/cookbook_bulk_delete.rb +11 -8
- data/lib/chef/knife/cookbook_create.rb +120 -55
- data/lib/chef/knife/cookbook_delete.rb +18 -12
- data/lib/chef/knife/cookbook_download.rb +10 -6
- data/lib/chef/knife/cookbook_list.rb +15 -6
- data/lib/chef/knife/cookbook_metadata.rb +41 -21
- data/lib/chef/knife/cookbook_metadata_from_file.rb +4 -0
- data/lib/chef/knife/cookbook_show.rb +16 -5
- data/lib/chef/knife/cookbook_site_download.rb +2 -2
- data/lib/chef/knife/cookbook_site_share.rb +18 -13
- data/lib/chef/knife/cookbook_site_unshare.rb +7 -4
- data/lib/chef/knife/cookbook_site_vendor.rb +21 -18
- data/lib/chef/knife/cookbook_test.rb +14 -14
- data/lib/chef/knife/cookbook_upload.rb +91 -40
- data/lib/chef/knife/data_bag_create.rb +41 -6
- data/lib/chef/knife/data_bag_delete.rb +5 -3
- data/lib/chef/knife/data_bag_edit.rb +55 -11
- data/lib/chef/knife/data_bag_from_file.rb +47 -7
- data/lib/chef/knife/data_bag_list.rb +4 -1
- data/lib/chef/knife/data_bag_show.rb +44 -4
- data/lib/chef/knife/environment_create.rb +53 -0
- data/lib/chef/knife/environment_delete.rb +45 -0
- data/lib/chef/knife/environment_edit.rb +45 -0
- data/lib/chef/knife/environment_from_file.rb +39 -0
- data/lib/chef/knife/environment_list.rb +42 -0
- data/lib/chef/knife/environment_show.rb +46 -0
- data/lib/chef/knife/exec.rb +1 -1
- data/lib/chef/knife/index_rebuild.rb +8 -9
- data/lib/chef/knife/node_bulk_delete.rb +9 -6
- data/lib/chef/knife/node_create.rb +9 -6
- data/lib/chef/knife/node_delete.rb +10 -7
- data/lib/chef/knife/node_edit.rb +129 -10
- data/lib/chef/knife/node_from_file.rb +10 -7
- data/lib/chef/knife/node_list.rb +11 -6
- data/lib/chef/knife/node_run_list_add.rb +10 -7
- data/lib/chef/knife/node_run_list_remove.rb +9 -6
- data/lib/chef/knife/node_show.rb +15 -7
- data/lib/chef/knife/recipe_list.rb +4 -3
- data/lib/chef/knife/role_bulk_delete.rb +9 -6
- data/lib/chef/knife/role_create.rb +9 -6
- data/lib/chef/knife/role_delete.rb +10 -7
- data/lib/chef/knife/role_edit.rb +11 -8
- data/lib/chef/knife/role_from_file.rb +10 -7
- data/lib/chef/knife/role_list.rb +8 -5
- data/lib/chef/knife/role_show.rb +11 -8
- data/lib/chef/knife/search.rb +33 -10
- data/lib/chef/knife/ssh.rb +33 -61
- data/lib/chef/knife/status.rb +7 -4
- data/lib/chef/knife/subcommand_loader.rb +101 -0
- data/lib/chef/knife/tag_create.rb +31 -0
- data/lib/chef/knife/tag_delete.rb +31 -0
- data/lib/chef/knife/tag_list.rb +29 -0
- data/lib/chef/knife/ui.rb +229 -0
- data/lib/chef/knife/windows_bootstrap.rb +8 -5
- data/lib/chef/log.rb +5 -59
- data/lib/chef/mash.rb +211 -0
- data/lib/chef/mixins.rb +1 -2
- data/lib/chef/nil_argument.rb +3 -0
- data/lib/chef/node.rb +96 -34
- data/lib/chef/platform.rb +27 -0
- data/lib/chef/provider/cookbook_file.rb +21 -20
- data/lib/chef/provider/deploy/revision.rb +3 -0
- data/lib/chef/provider/file.rb +20 -11
- data/lib/chef/provider/git.rb +26 -26
- data/lib/chef/provider/group/aix.rb +70 -0
- data/lib/chef/provider/group/groupadd.rb +7 -4
- data/lib/chef/provider/group/usermod.rb +1 -1
- data/lib/chef/provider/package.rb +28 -28
- data/lib/chef/provider/package/dpkg.rb +1 -1
- data/lib/chef/provider/package/portage.rb +50 -39
- data/lib/chef/provider/package/rubygems.rb +1 -1
- data/lib/chef/provider/package/zypper.rb +3 -20
- data/lib/chef/provider/remote_directory.rb +0 -2
- data/lib/chef/provider/remote_file.rb +2 -3
- data/lib/chef/provider/service/arch.rb +28 -35
- data/lib/chef/provider/service/simple.rb +1 -1
- data/lib/chef/provider/subversion.rb +22 -22
- data/lib/chef/providers.rb +1 -0
- data/lib/chef/recipe.rb +10 -12
- data/lib/chef/resource.rb +49 -42
- data/lib/chef/resource/gem_package.rb +7 -3
- data/lib/chef/resource/git.rb +5 -5
- data/lib/chef/resource/package.rb +7 -7
- data/lib/chef/resource/scm.rb +2 -1
- data/lib/chef/resource/solaris_package.rb +0 -1
- data/lib/chef/resource/yum_package.rb +0 -1
- data/lib/chef/rest.rb +7 -16
- data/lib/chef/rest/rest_request.rb +0 -16
- data/lib/chef/role.rb +67 -13
- data/lib/chef/run_context.rb +37 -21
- data/lib/chef/run_list.rb +30 -15
- data/lib/chef/run_list/run_list_expansion.rb +41 -20
- data/lib/chef/run_list/run_list_item.rb +20 -6
- data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
- data/lib/chef/runner.rb +7 -15
- data/lib/chef/search/query.rb +12 -7
- data/lib/chef/shef.rb +6 -7
- data/lib/chef/shef/shef_session.rb +40 -35
- data/lib/chef/shell_out.rb +22 -201
- data/lib/chef/shell_out/unix.rb +224 -0
- data/lib/chef/shell_out/windows.rb +95 -0
- data/lib/chef/solr_query.rb +187 -0
- data/lib/chef/solr_query/lucene.treetop +145 -0
- data/lib/chef/solr_query/lucene_nodes.rb +285 -0
- data/lib/chef/solr_query/query_transform.rb +65 -0
- data/lib/chef/solr_query/solr_http_request.rb +118 -0
- data/lib/chef/version.rb +4 -2
- data/lib/chef/version_class.rb +70 -0
- data/lib/chef/version_constraint.rb +116 -0
- metadata +68 -37
- data/lib/chef/cookbook/metadata/version.rb +0 -87
- data/lib/chef/knife/bluebox_images_list.rb +0 -54
- data/lib/chef/knife/bluebox_server_create.rb +0 -157
- data/lib/chef/knife/bluebox_server_delete.rb +0 -63
- data/lib/chef/knife/bluebox_server_list.rb +0 -59
- data/lib/chef/knife/ec2_instance_data.rb +0 -46
- data/lib/chef/knife/ec2_server_create.rb +0 -218
- data/lib/chef/knife/ec2_server_delete.rb +0 -87
- data/lib/chef/knife/ec2_server_list.rb +0 -89
- data/lib/chef/knife/rackspace_server_create.rb +0 -184
- data/lib/chef/knife/rackspace_server_delete.rb +0 -57
- data/lib/chef/knife/rackspace_server_list.rb +0 -59
- data/lib/chef/knife/slicehost_images_list.rb +0 -53
- data/lib/chef/knife/slicehost_server_create.rb +0 -103
- data/lib/chef/knife/slicehost_server_delete.rb +0 -61
- data/lib/chef/knife/slicehost_server_list.rb +0 -64
- data/lib/chef/knife/terremark_server_create.rb +0 -152
- data/lib/chef/knife/terremark_server_delete.rb +0 -87
- data/lib/chef/knife/terremark_server_list.rb +0 -77
- data/lib/chef/mixin/find_preferred_file.rb +0 -92
data/lib/chef/knife/role_show.rb
CHANGED
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
7
|
# you may not use this file except in compliance with the License.
|
|
8
8
|
# You may obtain a copy of the License at
|
|
9
|
-
#
|
|
9
|
+
#
|
|
10
10
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
-
#
|
|
11
|
+
#
|
|
12
12
|
# Unless required by applicable law or agreed to in writing, software
|
|
13
13
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
14
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
@@ -17,13 +17,16 @@
|
|
|
17
17
|
#
|
|
18
18
|
|
|
19
19
|
require 'chef/knife'
|
|
20
|
-
require 'chef/node'
|
|
21
|
-
require 'chef/json_compat'
|
|
22
20
|
|
|
23
21
|
class Chef
|
|
24
22
|
class Knife
|
|
25
23
|
class RoleShow < Knife
|
|
26
24
|
|
|
25
|
+
deps do
|
|
26
|
+
require 'chef/node'
|
|
27
|
+
require 'chef/json_compat'
|
|
28
|
+
end
|
|
29
|
+
|
|
27
30
|
banner "knife role show ROLE (options)"
|
|
28
31
|
|
|
29
32
|
option :attribute,
|
|
@@ -31,17 +34,17 @@ class Chef
|
|
|
31
34
|
:long => "--attribute ATTR",
|
|
32
35
|
:description => "Show only one attribute"
|
|
33
36
|
|
|
34
|
-
def run
|
|
37
|
+
def run
|
|
35
38
|
@role_name = @name_args[0]
|
|
36
39
|
|
|
37
40
|
if @role_name.nil?
|
|
38
41
|
show_usage
|
|
39
|
-
|
|
42
|
+
ui.fatal("You must specify a role name")
|
|
40
43
|
exit 1
|
|
41
44
|
end
|
|
42
|
-
|
|
45
|
+
|
|
43
46
|
role = Chef::Role.load(@role_name)
|
|
44
|
-
output(format_for_display(role))
|
|
47
|
+
output(format_for_display(config[:environment] ? role.environment(config[:environment]) : role))
|
|
45
48
|
end
|
|
46
49
|
|
|
47
50
|
end
|
data/lib/chef/knife/search.rb
CHANGED
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
7
|
# you may not use this file except in compliance with the License.
|
|
8
8
|
# You may obtain a copy of the License at
|
|
9
|
-
#
|
|
9
|
+
#
|
|
10
10
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
-
#
|
|
11
|
+
#
|
|
12
12
|
# Unless required by applicable law or agreed to in writing, software
|
|
13
13
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
14
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
@@ -17,12 +17,15 @@
|
|
|
17
17
|
#
|
|
18
18
|
|
|
19
19
|
require 'chef/knife'
|
|
20
|
-
require 'chef/data_bag_item'
|
|
21
20
|
|
|
22
21
|
class Chef
|
|
23
22
|
class Knife
|
|
24
23
|
class Search < Knife
|
|
25
24
|
|
|
25
|
+
deps do
|
|
26
|
+
require 'chef/search/query'
|
|
27
|
+
end
|
|
28
|
+
|
|
26
29
|
banner "knife search INDEX QUERY (options)"
|
|
27
30
|
|
|
28
31
|
option :sort,
|
|
@@ -31,14 +34,14 @@ class Chef
|
|
|
31
34
|
:description => "The order to sort the results in",
|
|
32
35
|
:default => nil
|
|
33
36
|
|
|
34
|
-
option :start,
|
|
37
|
+
option :start,
|
|
35
38
|
:short => "-b ROW",
|
|
36
39
|
:long => "--start ROW",
|
|
37
40
|
:description => "The row to start returning results at",
|
|
38
41
|
:default => 0,
|
|
39
42
|
:proc => lambda { |i| i.to_i }
|
|
40
43
|
|
|
41
|
-
option :rows,
|
|
44
|
+
option :rows,
|
|
42
45
|
:short => "-R INT",
|
|
43
46
|
:long => "--rows INT",
|
|
44
47
|
:description => "The number of rows to return",
|
|
@@ -60,14 +63,34 @@ class Chef
|
|
|
60
63
|
:long => "--id-only",
|
|
61
64
|
:description => "Show only the ID of matching objects"
|
|
62
65
|
|
|
63
|
-
|
|
66
|
+
option :query,
|
|
67
|
+
:short => "-q QUERY",
|
|
68
|
+
:long => "--query QUERY",
|
|
69
|
+
:description => "The search query; useful to protect queries starting with -"
|
|
70
|
+
|
|
71
|
+
def run
|
|
72
|
+
if config[:query] && @name_args[1]
|
|
73
|
+
puts "please specify query as an argument or an option via -q, not both"
|
|
74
|
+
puts opt_parser
|
|
75
|
+
exit 1
|
|
76
|
+
end
|
|
77
|
+
raw_query = config[:query] || @name_args[1]
|
|
78
|
+
if !raw_query || raw_query.empty?
|
|
79
|
+
puts "no query specified"
|
|
80
|
+
puts opt_parser
|
|
81
|
+
exit 1
|
|
82
|
+
end
|
|
83
|
+
|
|
64
84
|
q = Chef::Search::Query.new
|
|
65
85
|
display = { :total => 0, :start => config[:start] ? config[:start] : 0, :rows => [ ] }
|
|
66
|
-
|
|
67
|
-
|
|
86
|
+
query = URI.escape(raw_query,
|
|
87
|
+
Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
|
|
88
|
+
rows = config[:rows] ? config[:rows] : 20
|
|
89
|
+
start = config[:start] ? config[:start] : 0
|
|
90
|
+
q.search(@name_args[0], query, config[:sort], start, rows) do |item|
|
|
68
91
|
formatted_item = format_for_display(item)
|
|
69
92
|
if formatted_item.respond_to?(:has_key?) && !formatted_item.has_key?('id')
|
|
70
|
-
formatted_item['id'] = item.has_key?('id') ? item['id'] : item.name
|
|
93
|
+
formatted_item['id'] = item.has_key?('id') ? item['id'] : item.name
|
|
71
94
|
end
|
|
72
95
|
display[:rows] << formatted_item
|
|
73
96
|
display[:total] += 1
|
|
@@ -79,7 +102,7 @@ class Chef
|
|
|
79
102
|
puts row[config[:attribute]] if row.has_key?(config[:attribute]) && !row[config[:attribute]].nil?
|
|
80
103
|
end
|
|
81
104
|
else
|
|
82
|
-
puts display[:rows].join("\n")
|
|
105
|
+
puts display[:rows].join("\n")
|
|
83
106
|
end
|
|
84
107
|
else
|
|
85
108
|
output(display)
|
data/lib/chef/knife/ssh.rb
CHANGED
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
7
|
# you may not use this file except in compliance with the License.
|
|
8
8
|
# You may obtain a copy of the License at
|
|
9
|
-
#
|
|
9
|
+
#
|
|
10
10
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
-
#
|
|
11
|
+
#
|
|
12
12
|
# Unless required by applicable law or agreed to in writing, software
|
|
13
13
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
14
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
@@ -17,17 +17,17 @@
|
|
|
17
17
|
#
|
|
18
18
|
|
|
19
19
|
require 'chef/knife'
|
|
20
|
-
require 'chef/data_bag_item'
|
|
21
|
-
|
|
22
|
-
begin
|
|
23
|
-
gem "net-ssh", ">= 2.0.23"
|
|
24
|
-
rescue LoadError
|
|
25
|
-
end
|
|
26
20
|
|
|
27
21
|
class Chef
|
|
28
22
|
class Knife
|
|
29
23
|
class Ssh < Knife
|
|
30
24
|
|
|
25
|
+
deps do
|
|
26
|
+
require 'net/ssh'
|
|
27
|
+
require 'net/ssh/multi'
|
|
28
|
+
require 'chef/search/query'
|
|
29
|
+
end
|
|
30
|
+
|
|
31
31
|
attr_writer :password
|
|
32
32
|
|
|
33
33
|
banner "knife ssh QUERY COMMAND (options)"
|
|
@@ -43,7 +43,7 @@ class Chef
|
|
|
43
43
|
:short => "-a ATTR",
|
|
44
44
|
:long => "--attribute ATTR",
|
|
45
45
|
:description => "The attribute to use for opening the connection - default is fqdn",
|
|
46
|
-
:default => "fqdn"
|
|
46
|
+
:default => "fqdn"
|
|
47
47
|
|
|
48
48
|
option :manual,
|
|
49
49
|
:short => "-m",
|
|
@@ -62,18 +62,17 @@ class Chef
|
|
|
62
62
|
:long => "--ssh-password PASSWORD",
|
|
63
63
|
:description => "The ssh password"
|
|
64
64
|
|
|
65
|
-
option :ssh_port,
|
|
66
|
-
:short => "-p PORT",
|
|
67
|
-
:long => "--ssh-port PORT",
|
|
68
|
-
:description => "The ssh port",
|
|
69
|
-
:default => "22",
|
|
70
|
-
:proc => Proc.new { |key| Chef::Config[:knife][:ssh_port] = key }
|
|
71
|
-
|
|
72
65
|
option :identity_file,
|
|
73
66
|
:short => "-i IDENTITY_FILE",
|
|
74
67
|
:long => "--identity-file IDENTITY_FILE",
|
|
75
68
|
:description => "The SSH identity file used for authentication"
|
|
76
69
|
|
|
70
|
+
option :no_host_key_verify,
|
|
71
|
+
:long => "--no-host-key-verify",
|
|
72
|
+
:description => "Disable host key verification",
|
|
73
|
+
:boolean => true,
|
|
74
|
+
:default => false
|
|
75
|
+
|
|
77
76
|
def session
|
|
78
77
|
ssh_error_handler = Proc.new do |server|
|
|
79
78
|
if config[:manual]
|
|
@@ -83,17 +82,13 @@ class Chef
|
|
|
83
82
|
node_name = n if format_for_display(n)[config[:attribute]] == server.host
|
|
84
83
|
end
|
|
85
84
|
end
|
|
86
|
-
|
|
85
|
+
ui.warn "Failed to connect to #{node_name} -- #{$!.class.name}: #{$!.message}"
|
|
87
86
|
$!.backtrace.each { |l| Chef::Log.debug(l) }
|
|
88
87
|
end
|
|
89
88
|
|
|
90
89
|
@session ||= Net::SSH::Multi.start(:concurrent_connections => config[:concurrency], :on_error => ssh_error_handler)
|
|
91
90
|
end
|
|
92
91
|
|
|
93
|
-
def h
|
|
94
|
-
@highline ||= HighLine.new
|
|
95
|
-
end
|
|
96
|
-
|
|
97
92
|
def configure_session
|
|
98
93
|
list = case config[:manual]
|
|
99
94
|
when true
|
|
@@ -108,7 +103,7 @@ class Chef
|
|
|
108
103
|
end
|
|
109
104
|
r
|
|
110
105
|
end
|
|
111
|
-
(
|
|
106
|
+
(ui.fatal("No nodes returned from search!"); exit 10) if list.length == 0
|
|
112
107
|
session_from_list(list)
|
|
113
108
|
end
|
|
114
109
|
|
|
@@ -120,13 +115,18 @@ class Chef
|
|
|
120
115
|
session_opts = {}
|
|
121
116
|
session_opts[:keys] = File.expand_path(config[:identity_file]) if config[:identity_file]
|
|
122
117
|
session_opts[:password] = config[:ssh_password] if config[:ssh_password]
|
|
123
|
-
session_opts[:port] = Chef::Config[:knife][:ssh_port] || config[:ssh_port]
|
|
124
118
|
session_opts[:logger] = Chef::Log.logger if Chef::Log.level == :debug
|
|
125
119
|
|
|
120
|
+
if config[:no_host_key_verify]
|
|
121
|
+
session_opts[:paranoid] = false
|
|
122
|
+
session_opts[:user_known_hosts_file] = "/dev/null"
|
|
123
|
+
end
|
|
124
|
+
|
|
126
125
|
session.use(hostspec, session_opts)
|
|
127
126
|
|
|
128
127
|
@longest = item.length if item.length > @longest
|
|
129
128
|
end
|
|
129
|
+
|
|
130
130
|
session
|
|
131
131
|
end
|
|
132
132
|
|
|
@@ -139,7 +139,7 @@ class Chef
|
|
|
139
139
|
data.split(/\n/).each { |d| print_data(host, d) }
|
|
140
140
|
else
|
|
141
141
|
padding = @longest - host.length
|
|
142
|
-
print
|
|
142
|
+
print ui.color(host, :cyan)
|
|
143
143
|
padding.downto(0) { print " " }
|
|
144
144
|
puts data
|
|
145
145
|
end
|
|
@@ -164,7 +164,7 @@ class Chef
|
|
|
164
164
|
end
|
|
165
165
|
|
|
166
166
|
def get_password
|
|
167
|
-
@password ||=
|
|
167
|
+
@password ||= ui.ask("Enter your password: ") { |q| q.echo = false }
|
|
168
168
|
end
|
|
169
169
|
|
|
170
170
|
# Present the prompt and read a single line from the console. It also
|
|
@@ -173,7 +173,7 @@ class Chef
|
|
|
173
173
|
# line is input.
|
|
174
174
|
def read_line
|
|
175
175
|
loop do
|
|
176
|
-
command = reader.readline("#{
|
|
176
|
+
command = reader.readline("#{ui.color('knife-ssh>', :bold)} ", true)
|
|
177
177
|
|
|
178
178
|
if command.nil?
|
|
179
179
|
command = "exit"
|
|
@@ -193,7 +193,7 @@ class Chef
|
|
|
193
193
|
end
|
|
194
194
|
|
|
195
195
|
def interactive
|
|
196
|
-
puts "Connected to #{
|
|
196
|
+
puts "Connected to #{ui.list(session.servers_for.collect { |s| ui.color(s.host, :cyan) }, :inline, " and ")}"
|
|
197
197
|
puts
|
|
198
198
|
puts "To run a command on a list of servers, do:"
|
|
199
199
|
puts " on SERVER1 SERVER2 SERVER3; COMMAND"
|
|
@@ -211,7 +211,7 @@ class Chef
|
|
|
211
211
|
raw_list = $1.split(" ")
|
|
212
212
|
server_list = Array.new
|
|
213
213
|
session.servers.each do |session_server|
|
|
214
|
-
server_list << session_server if raw_list.include?(session_server.host)
|
|
214
|
+
server_list << session_server if raw_list.include?(session_server.host)
|
|
215
215
|
end
|
|
216
216
|
command = $2
|
|
217
217
|
ssh_command(command, session.on(*server_list))
|
|
@@ -274,9 +274,9 @@ class Chef
|
|
|
274
274
|
raise
|
|
275
275
|
end
|
|
276
276
|
|
|
277
|
-
Appscript.app("/Applications/Utilities/Terminal.app").windows.first.activate
|
|
277
|
+
Appscript.app("/Applications/Utilities/Terminal.app").windows.first.activate
|
|
278
278
|
Appscript.app("System Events").application_processes["Terminal.app"].keystroke("n", :using=>:command_down)
|
|
279
|
-
term = Appscript.app('Terminal')
|
|
279
|
+
term = Appscript.app('Terminal')
|
|
280
280
|
window = term.windows.first.get
|
|
281
281
|
|
|
282
282
|
(session.servers_for.size - 1).times do |i|
|
|
@@ -290,16 +290,15 @@ class Chef
|
|
|
290
290
|
end
|
|
291
291
|
end
|
|
292
292
|
|
|
293
|
-
def run
|
|
294
|
-
@longest = 0
|
|
293
|
+
def run
|
|
295
294
|
|
|
296
|
-
|
|
295
|
+
@longest = 0
|
|
297
296
|
|
|
298
297
|
configure_session
|
|
299
298
|
|
|
300
299
|
case @name_args[1]
|
|
301
300
|
when "interactive"
|
|
302
|
-
interactive
|
|
301
|
+
interactive
|
|
303
302
|
when "screen"
|
|
304
303
|
screen
|
|
305
304
|
when "tmux"
|
|
@@ -313,33 +312,6 @@ class Chef
|
|
|
313
312
|
session.close
|
|
314
313
|
end
|
|
315
314
|
|
|
316
|
-
def load_late_dependencies
|
|
317
|
-
require 'readline'
|
|
318
|
-
%w[net/ssh/multi highline].each do |dep|
|
|
319
|
-
load_late_dependency dep
|
|
320
|
-
end
|
|
321
|
-
assert_net_ssh_version_acceptable!
|
|
322
|
-
end
|
|
323
|
-
|
|
324
|
-
# :nodoc:
|
|
325
|
-
# TODO: remove this stuff entirely and package knife ssh as a knife plugin. (Dan - 08 Jul 2010)
|
|
326
|
-
#
|
|
327
|
-
# The correct way to specify version deps is in the gemspec or other packaging.
|
|
328
|
-
# However, we don't want to have a gem dep on net-ssh, because it's a hassle
|
|
329
|
-
# when you only need the chef-client (e.g., on a managed node). So we have to
|
|
330
|
-
# check here that you have a decent version of Net::SSH.
|
|
331
|
-
#
|
|
332
|
-
# net-ssh of lower versions has a bug that causes 'knife ssh (searchterm) (commandname)"
|
|
333
|
-
# to loop infinitely and consume all the CPU of one core.
|
|
334
|
-
def assert_net_ssh_version_acceptable!
|
|
335
|
-
netssh_version = Net::SSH::Version
|
|
336
|
-
# we want version 2.0.23 and higher:
|
|
337
|
-
unless (netssh_version::MAJOR == 2) && (netssh_version::TINY >= 23 || netssh_version::MINOR >= 1)
|
|
338
|
-
STDERR.puts "ERROR: Please install net-ssh version 2.0.23 or higher, as lower versions cause issues."
|
|
339
|
-
exit 1
|
|
340
|
-
end
|
|
341
|
-
end
|
|
342
|
-
|
|
343
315
|
end
|
|
344
316
|
end
|
|
345
317
|
end
|
data/lib/chef/knife/status.rb
CHANGED
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
7
|
# you may not use this file except in compliance with the License.
|
|
8
8
|
# You may obtain a copy of the License at
|
|
9
|
-
#
|
|
9
|
+
#
|
|
10
10
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
-
#
|
|
11
|
+
#
|
|
12
12
|
# Unless required by applicable law or agreed to in writing, software
|
|
13
13
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
14
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
@@ -17,13 +17,16 @@
|
|
|
17
17
|
#
|
|
18
18
|
|
|
19
19
|
require 'chef/knife'
|
|
20
|
-
require 'highline'
|
|
21
|
-
require 'chef/search/query'
|
|
22
20
|
|
|
23
21
|
class Chef
|
|
24
22
|
class Knife
|
|
25
23
|
class Status < Knife
|
|
26
24
|
|
|
25
|
+
deps do
|
|
26
|
+
require 'highline'
|
|
27
|
+
require 'chef/search/query'
|
|
28
|
+
end
|
|
29
|
+
|
|
27
30
|
banner "knife status QUERY (options)"
|
|
28
31
|
|
|
29
32
|
option :run_list,
|
|
@@ -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
|