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.
Files changed (177) hide show
  1. data/README.rdoc +0 -3
  2. data/distro/arch/etc/rc.d/chef-server +0 -4
  3. data/distro/arch/etc/rc.d/chef-server-webui +0 -4
  4. data/distro/arch/etc/rc.d/chef-solr +0 -4
  5. data/distro/arch/etc/rc.d/chef-solr-indexer +0 -4
  6. data/lib/chef.rb +3 -3
  7. data/lib/chef/api_client.rb +1 -1
  8. data/lib/chef/application.rb +11 -1
  9. data/lib/chef/application/client.rb +18 -22
  10. data/lib/chef/application/knife.rb +28 -29
  11. data/lib/chef/application/solo.rb +14 -12
  12. data/lib/chef/client.rb +112 -54
  13. data/lib/chef/config.rb +4 -0
  14. data/lib/chef/cookbook/chefignore.rb +66 -0
  15. data/lib/chef/cookbook/cookbook_collection.rb +6 -5
  16. data/lib/chef/cookbook/cookbook_version_loader.rb +151 -0
  17. data/lib/chef/cookbook/file_system_file_vendor.rb +10 -8
  18. data/lib/chef/cookbook/metadata.rb +200 -108
  19. data/lib/chef/cookbook_loader.rb +39 -163
  20. data/lib/chef/cookbook_uploader.rb +100 -78
  21. data/lib/chef/cookbook_version.rb +92 -47
  22. data/lib/chef/cookbook_version_selector.rb +163 -0
  23. data/lib/chef/couchdb.rb +9 -1
  24. data/lib/chef/data_bag.rb +1 -1
  25. data/lib/chef/data_bag_item.rb +1 -1
  26. data/lib/chef/encrypted_data_bag_item.rb +126 -0
  27. data/lib/chef/environment.rb +386 -0
  28. data/lib/chef/exceptions.rb +82 -1
  29. data/lib/chef/index_queue/amqp_client.rb +15 -12
  30. data/lib/chef/index_queue/indexable.rb +38 -4
  31. data/lib/chef/json_compat.rb +3 -3
  32. data/lib/chef/knife.rb +97 -202
  33. data/lib/chef/knife/bootstrap.rb +27 -61
  34. data/lib/chef/knife/bootstrap/archlinux-gems.erb +4 -2
  35. data/lib/chef/knife/bootstrap/centos5-gems.erb +6 -15
  36. data/lib/chef/knife/bootstrap/fedora13-gems.erb +3 -4
  37. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +2 -2
  38. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +6 -5
  39. data/lib/chef/knife/client_bulk_delete.rb +6 -3
  40. data/lib/chef/knife/client_create.rb +13 -10
  41. data/lib/chef/knife/client_delete.rb +10 -7
  42. data/lib/chef/knife/client_edit.rb +9 -6
  43. data/lib/chef/knife/client_list.rb +8 -5
  44. data/lib/chef/knife/client_reregister.rb +9 -6
  45. data/lib/chef/knife/client_show.rb +9 -6
  46. data/lib/chef/knife/configure.rb +15 -19
  47. data/lib/chef/knife/configure_client.rb +4 -4
  48. data/lib/chef/knife/cookbook_bulk_delete.rb +11 -8
  49. data/lib/chef/knife/cookbook_create.rb +120 -55
  50. data/lib/chef/knife/cookbook_delete.rb +18 -12
  51. data/lib/chef/knife/cookbook_download.rb +10 -6
  52. data/lib/chef/knife/cookbook_list.rb +15 -6
  53. data/lib/chef/knife/cookbook_metadata.rb +41 -21
  54. data/lib/chef/knife/cookbook_metadata_from_file.rb +4 -0
  55. data/lib/chef/knife/cookbook_show.rb +16 -5
  56. data/lib/chef/knife/cookbook_site_download.rb +2 -2
  57. data/lib/chef/knife/cookbook_site_share.rb +18 -13
  58. data/lib/chef/knife/cookbook_site_unshare.rb +7 -4
  59. data/lib/chef/knife/cookbook_site_vendor.rb +21 -18
  60. data/lib/chef/knife/cookbook_test.rb +14 -14
  61. data/lib/chef/knife/cookbook_upload.rb +91 -40
  62. data/lib/chef/knife/data_bag_create.rb +41 -6
  63. data/lib/chef/knife/data_bag_delete.rb +5 -3
  64. data/lib/chef/knife/data_bag_edit.rb +55 -11
  65. data/lib/chef/knife/data_bag_from_file.rb +47 -7
  66. data/lib/chef/knife/data_bag_list.rb +4 -1
  67. data/lib/chef/knife/data_bag_show.rb +44 -4
  68. data/lib/chef/knife/environment_create.rb +53 -0
  69. data/lib/chef/knife/environment_delete.rb +45 -0
  70. data/lib/chef/knife/environment_edit.rb +45 -0
  71. data/lib/chef/knife/environment_from_file.rb +39 -0
  72. data/lib/chef/knife/environment_list.rb +42 -0
  73. data/lib/chef/knife/environment_show.rb +46 -0
  74. data/lib/chef/knife/exec.rb +1 -1
  75. data/lib/chef/knife/index_rebuild.rb +8 -9
  76. data/lib/chef/knife/node_bulk_delete.rb +9 -6
  77. data/lib/chef/knife/node_create.rb +9 -6
  78. data/lib/chef/knife/node_delete.rb +10 -7
  79. data/lib/chef/knife/node_edit.rb +129 -10
  80. data/lib/chef/knife/node_from_file.rb +10 -7
  81. data/lib/chef/knife/node_list.rb +11 -6
  82. data/lib/chef/knife/node_run_list_add.rb +10 -7
  83. data/lib/chef/knife/node_run_list_remove.rb +9 -6
  84. data/lib/chef/knife/node_show.rb +15 -7
  85. data/lib/chef/knife/recipe_list.rb +4 -3
  86. data/lib/chef/knife/role_bulk_delete.rb +9 -6
  87. data/lib/chef/knife/role_create.rb +9 -6
  88. data/lib/chef/knife/role_delete.rb +10 -7
  89. data/lib/chef/knife/role_edit.rb +11 -8
  90. data/lib/chef/knife/role_from_file.rb +10 -7
  91. data/lib/chef/knife/role_list.rb +8 -5
  92. data/lib/chef/knife/role_show.rb +11 -8
  93. data/lib/chef/knife/search.rb +33 -10
  94. data/lib/chef/knife/ssh.rb +33 -61
  95. data/lib/chef/knife/status.rb +7 -4
  96. data/lib/chef/knife/subcommand_loader.rb +101 -0
  97. data/lib/chef/knife/tag_create.rb +31 -0
  98. data/lib/chef/knife/tag_delete.rb +31 -0
  99. data/lib/chef/knife/tag_list.rb +29 -0
  100. data/lib/chef/knife/ui.rb +229 -0
  101. data/lib/chef/knife/windows_bootstrap.rb +8 -5
  102. data/lib/chef/log.rb +5 -59
  103. data/lib/chef/mash.rb +211 -0
  104. data/lib/chef/mixins.rb +1 -2
  105. data/lib/chef/nil_argument.rb +3 -0
  106. data/lib/chef/node.rb +96 -34
  107. data/lib/chef/platform.rb +27 -0
  108. data/lib/chef/provider/cookbook_file.rb +21 -20
  109. data/lib/chef/provider/deploy/revision.rb +3 -0
  110. data/lib/chef/provider/file.rb +20 -11
  111. data/lib/chef/provider/git.rb +26 -26
  112. data/lib/chef/provider/group/aix.rb +70 -0
  113. data/lib/chef/provider/group/groupadd.rb +7 -4
  114. data/lib/chef/provider/group/usermod.rb +1 -1
  115. data/lib/chef/provider/package.rb +28 -28
  116. data/lib/chef/provider/package/dpkg.rb +1 -1
  117. data/lib/chef/provider/package/portage.rb +50 -39
  118. data/lib/chef/provider/package/rubygems.rb +1 -1
  119. data/lib/chef/provider/package/zypper.rb +3 -20
  120. data/lib/chef/provider/remote_directory.rb +0 -2
  121. data/lib/chef/provider/remote_file.rb +2 -3
  122. data/lib/chef/provider/service/arch.rb +28 -35
  123. data/lib/chef/provider/service/simple.rb +1 -1
  124. data/lib/chef/provider/subversion.rb +22 -22
  125. data/lib/chef/providers.rb +1 -0
  126. data/lib/chef/recipe.rb +10 -12
  127. data/lib/chef/resource.rb +49 -42
  128. data/lib/chef/resource/gem_package.rb +7 -3
  129. data/lib/chef/resource/git.rb +5 -5
  130. data/lib/chef/resource/package.rb +7 -7
  131. data/lib/chef/resource/scm.rb +2 -1
  132. data/lib/chef/resource/solaris_package.rb +0 -1
  133. data/lib/chef/resource/yum_package.rb +0 -1
  134. data/lib/chef/rest.rb +7 -16
  135. data/lib/chef/rest/rest_request.rb +0 -16
  136. data/lib/chef/role.rb +67 -13
  137. data/lib/chef/run_context.rb +37 -21
  138. data/lib/chef/run_list.rb +30 -15
  139. data/lib/chef/run_list/run_list_expansion.rb +41 -20
  140. data/lib/chef/run_list/run_list_item.rb +20 -6
  141. data/lib/chef/run_list/versioned_recipe_list.rb +68 -0
  142. data/lib/chef/runner.rb +7 -15
  143. data/lib/chef/search/query.rb +12 -7
  144. data/lib/chef/shef.rb +6 -7
  145. data/lib/chef/shef/shef_session.rb +40 -35
  146. data/lib/chef/shell_out.rb +22 -201
  147. data/lib/chef/shell_out/unix.rb +224 -0
  148. data/lib/chef/shell_out/windows.rb +95 -0
  149. data/lib/chef/solr_query.rb +187 -0
  150. data/lib/chef/solr_query/lucene.treetop +145 -0
  151. data/lib/chef/solr_query/lucene_nodes.rb +285 -0
  152. data/lib/chef/solr_query/query_transform.rb +65 -0
  153. data/lib/chef/solr_query/solr_http_request.rb +118 -0
  154. data/lib/chef/version.rb +4 -2
  155. data/lib/chef/version_class.rb +70 -0
  156. data/lib/chef/version_constraint.rb +116 -0
  157. metadata +68 -37
  158. data/lib/chef/cookbook/metadata/version.rb +0 -87
  159. data/lib/chef/knife/bluebox_images_list.rb +0 -54
  160. data/lib/chef/knife/bluebox_server_create.rb +0 -157
  161. data/lib/chef/knife/bluebox_server_delete.rb +0 -63
  162. data/lib/chef/knife/bluebox_server_list.rb +0 -59
  163. data/lib/chef/knife/ec2_instance_data.rb +0 -46
  164. data/lib/chef/knife/ec2_server_create.rb +0 -218
  165. data/lib/chef/knife/ec2_server_delete.rb +0 -87
  166. data/lib/chef/knife/ec2_server_list.rb +0 -89
  167. data/lib/chef/knife/rackspace_server_create.rb +0 -184
  168. data/lib/chef/knife/rackspace_server_delete.rb +0 -57
  169. data/lib/chef/knife/rackspace_server_list.rb +0 -59
  170. data/lib/chef/knife/slicehost_images_list.rb +0 -53
  171. data/lib/chef/knife/slicehost_server_create.rb +0 -103
  172. data/lib/chef/knife/slicehost_server_delete.rb +0 -61
  173. data/lib/chef/knife/slicehost_server_list.rb +0 -64
  174. data/lib/chef/knife/terremark_server_create.rb +0 -152
  175. data/lib/chef/knife/terremark_server_delete.rb +0 -87
  176. data/lib/chef/knife/terremark_server_list.rb +0 -77
  177. data/lib/chef/mixin/find_preferred_file.rb +0 -92
@@ -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
- Chef::Log.fatal("You must specify a role name")
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
@@ -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
- def run
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
- q.search(@name_args[0], @name_args[1], config[:sort], config[:start] ? config[:start] : 0, config[:rows] ? config[:rows] : 20) do |item|
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)
@@ -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
- Chef::Log.warn "Failed to connect to #{node_name} -- #{$!.class.name}: #{$!.message}"
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
- (Chef::Log.fatal("No nodes returned from search!"); exit 10) if list.length == 0
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 h.color(host, :cyan)
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 ||= h.ask("Enter your password: ") { |q| q.echo = false }
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("#{h.color('knife-ssh>', :bold)} ", true)
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 #{h.list(session.servers_for.collect { |s| h.color(s.host, :cyan) }, :inline, " and ")}"
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
- load_late_dependencies
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
@@ -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