chef 0.9.18 → 0.10.0.beta.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|