chef 0.10.2 → 0.10.4.rc.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/distro/common/html/chef-client.8.html +4 -4
  2. data/distro/common/html/knife-cookbook.1.html +5 -3
  3. data/distro/common/html/knife-node.1.html +4 -4
  4. data/distro/common/man/man1/knife-cookbook.1 +5 -1
  5. data/distro/common/man/man1/knife-node.1 +1 -1
  6. data/distro/common/markdown/man1/knife-cookbook-site.mkd +3 -3
  7. data/distro/common/markdown/man1/knife-cookbook.mkd +7 -0
  8. data/distro/common/markdown/man1/knife-node.mkd +4 -3
  9. data/distro/common/markdown/man1/knife-ssh.mkd +2 -0
  10. data/lib/chef/application.rb +1 -0
  11. data/lib/chef/cookbook_loader.rb +18 -0
  12. data/lib/chef/cookbook_uploader.rb +1 -1
  13. data/lib/chef/data_bag.rb +14 -2
  14. data/lib/chef/data_bag_item.rb +8 -2
  15. data/lib/chef/encrypted_data_bag_item.rb +19 -6
  16. data/lib/chef/environment.rb +12 -6
  17. data/lib/chef/exceptions.rb +1 -0
  18. data/lib/chef/knife.rb +0 -28
  19. data/lib/chef/knife/bootstrap.rb +7 -0
  20. data/lib/chef/knife/bootstrap/archlinux-gems.erb +14 -12
  21. data/lib/chef/knife/bootstrap/centos5-gems.erb +8 -5
  22. data/lib/chef/knife/bootstrap/fedora13-gems.erb +2 -0
  23. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +16 -9
  24. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +6 -3
  25. data/lib/chef/knife/client_bulk_delete.rb +28 -6
  26. data/lib/chef/knife/cookbook_site_install.rb +2 -2
  27. data/lib/chef/knife/cookbook_upload.rb +71 -0
  28. data/lib/chef/knife/core/bootstrap_context.rb +13 -3
  29. data/lib/chef/knife/core/cookbook_scm_repo.rb +2 -3
  30. data/lib/chef/knife/core/node_presenter.rb +5 -2
  31. data/lib/chef/knife/help.rb +13 -12
  32. data/lib/chef/knife/help_topics.rb +4 -0
  33. data/lib/chef/knife/ssh.rb +25 -4
  34. data/lib/chef/mixin/create_path.rb +3 -2
  35. data/lib/chef/mixin/get_source_from_package.rb +42 -0
  36. data/lib/chef/mixin/language.rb +8 -11
  37. data/lib/chef/monkey_patches/numeric.rb +9 -1
  38. data/lib/chef/monkey_patches/string.rb +21 -0
  39. data/lib/chef/platform.rb +2 -1
  40. data/lib/chef/provider.rb +1 -1
  41. data/lib/chef/provider/git.rb +16 -3
  42. data/lib/chef/provider/group/suse.rb +53 -0
  43. data/lib/chef/provider/mount/mount.rb +28 -20
  44. data/lib/chef/provider/package/apt.rb +39 -24
  45. data/lib/chef/provider/package/dpkg.rb +5 -2
  46. data/lib/chef/provider/package/easy_install.rb +2 -2
  47. data/lib/chef/provider/package/freebsd.rb +5 -2
  48. data/lib/chef/provider/package/macports.rb +4 -4
  49. data/lib/chef/provider/package/rpm.rb +4 -1
  50. data/lib/chef/provider/package/rubygems.rb +3 -0
  51. data/lib/chef/provider/package/solaris.rb +3 -0
  52. data/lib/chef/provider/package/yum-dump.py +239 -81
  53. data/lib/chef/provider/package/yum.rb +977 -110
  54. data/lib/chef/provider/package/zypper.rb +20 -3
  55. data/lib/chef/provider/remote_directory.rb +0 -1
  56. data/lib/chef/provider/service/arch.rb +35 -28
  57. data/lib/chef/provider/service/systemd.rb +102 -0
  58. data/lib/chef/provider/service/upstart.rb +8 -2
  59. data/lib/chef/providers.rb +2 -0
  60. data/lib/chef/resource.rb +31 -2
  61. data/lib/chef/resource/git.rb +9 -0
  62. data/lib/chef/resource/mount.rb +1 -2
  63. data/lib/chef/resource/yum_package.rb +20 -0
  64. data/lib/chef/rest.rb +1 -1
  65. data/lib/chef/role.rb +1 -1
  66. data/lib/chef/run_context.rb +3 -3
  67. data/lib/chef/runner.rb +15 -2
  68. data/lib/chef/shell_out.rb +1 -1
  69. data/lib/chef/shell_out/windows.rb +2 -2
  70. data/lib/chef/solr_query.rb +1 -1
  71. data/lib/chef/tasks/chef_repo.rake +1 -1
  72. data/lib/chef/version.rb +1 -1
  73. metadata +425 -441
@@ -1,14 +1,17 @@
1
1
  bash -c '
2
+ <%= "export http_proxy=\"#{knife_config[:bootstrap_proxy]}\"" if knife_config[:bootstrap_proxy] -%>
3
+
2
4
  if [ ! -f /usr/bin/chef-client ]; then
3
- rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
4
- wget -O /etc/yum.repos.d/aegis.repo http://rpm.aegisco.com/aegisco/el5/aegisco.repo
5
+ wget <%= "--proxy=on " if knife_config[:bootstrap_proxy] %>http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
6
+ rpm -Uvh epel-release-5-4.noarch.rpm
7
+ wget <%= "--proxy=on " if knife_config[:bootstrap_proxy] %>-O /etc/yum.repos.d/aegis.repo http://rpm.aegisco.com/aegisco/el5/aegisco.repo
5
8
 
6
9
  yum install -y ruby-1.8.7.334-2.el5 ruby-devel-1.8.7.334-2.el5 gcc gcc-c++ automake autoconf make
7
10
 
8
11
  cd /tmp
9
- wget http://production.cf.rubygems.org/rubygems/rubygems-1.3.7.tgz
10
- tar zxf rubygems-1.3.7.tgz
11
- cd rubygems-1.3.7
12
+ wget <%= "--proxy=on " if knife_config[:bootstrap_proxy] %>http://production.cf.rubygems.org/rubygems/rubygems-1.6.2.tgz
13
+ tar zxf rubygems-1.6.2.tgz
14
+ cd rubygems-1.6.2
12
15
  ruby setup.rb --no-format-executable
13
16
  fi
14
17
 
@@ -1,4 +1,6 @@
1
1
  bash -c '
2
+ <%= "export http_proxy=\"#{knife_config[:bootstrap_proxy]}\"" if knife_config[:bootstrap_proxy] -%>
3
+
2
4
  yum install -y ruby ruby-devel gcc gcc-c++ automake autoconf rubygems make
3
5
 
4
6
  gem update --system
@@ -1,32 +1,39 @@
1
1
  bash -c '
2
+ <%= "export http_proxy=\"#{knife_config[:bootstrap_proxy]}\"" if knife_config[:bootstrap_proxy] -%>
3
+
2
4
  if [ ! -f /usr/bin/chef-client ]; then
3
- echo "chef chef/chef_server_url string <%= Chef::Config[:chef_server_url] %>" | debconf-set-selections
4
- [ -f /etc/apt/sources.list.d/opscode.list ] || echo "deb http://apt.opscode.com lucid main" > /etc/apt/sources.list.d/opscode.list
5
- wget -O- http://apt.opscode.com/packages@opscode.com.gpg.key | apt-key add -
5
+ echo "chef chef/chef_server_url string <%= @chef_config[:chef_server_url] %>" | debconf-set-selections
6
+ [ -f /etc/apt/sources.list.d/opscode.list ] || echo "deb http://apt.opscode.com <%= chef_version.to_f == 0.10 ? "lucid-0.10" : "lucid" %> main" > /etc/apt/sources.list.d/opscode.list
7
+ wget <%= "--proxy=on " if knife_config[:bootstrap_proxy] %>-O- http://apt.opscode.com/packages@opscode.com.gpg.key | apt-key add -
6
8
  fi
7
9
  apt-get update
8
10
  apt-get install -y chef
9
11
 
10
- <% unless Chef::Config[:validation_client_name] == "chef-validator" -%>
11
- [ `grep -qx "validation_client_name \"<%= Chef::Config[:validation_client_name] %>\"" /etc/chef/client.rb` ] || echo "validation_client_name \"<%= Chef::Config[:validation_client_name] %>\"" >> /etc/chef/client.rb
12
- <% end -%>
13
-
14
12
  (
15
13
  cat <<'EOP'
16
- <%= IO.read(Chef::Config[:validation_key]) %>
14
+ <%= validation_key %>
17
15
  EOP
18
16
  ) > /tmp/validation.pem
19
17
  awk NF /tmp/validation.pem > /etc/chef/validation.pem
20
18
  rm /tmp/validation.pem
21
19
 
20
+ <% unless @chef_config[:validation_client_name] == "chef-validator" -%>
21
+ [ `grep -qx "validation_client_name \"<%= @chef_config[:validation_client_name] %>\"" /etc/chef/client.rb` ] || echo "validation_client_name \"<%= @chef_config[:validation_client_name] %>\"" >> /etc/chef/client.rb
22
+ <% end -%>
23
+
22
24
  <% if @config[:chef_node_name] %>
23
25
  [ `grep -qx "node_name \"<%= @config[:chef_node_name] %>\"" /etc/chef/client.rb` ] || echo "node_name \"<%= @config[:chef_node_name] %>\"" >> /etc/chef/client.rb
24
26
  <% end -%>
25
27
 
28
+ <% if knife_config[:bootstrap_proxy] %>
29
+ echo 'http_proxy "knife_config[:bootstrap_proxy]"' >> /etc/chef/client.rb
30
+ echo 'https_proxy "knife_config[:bootstrap_proxy]"' >> /etc/chef/client.rb
31
+ <% end -%>
32
+
26
33
  (
27
34
  cat <<'EOP'
28
35
  <%= { "run_list" => @run_list }.to_json %>
29
36
  EOP
30
37
  ) > /etc/chef/first-boot.json
31
38
 
32
- /usr/bin/chef-client -j /etc/chef/first-boot.json'
39
+ <%= start_chef %>'
@@ -1,14 +1,17 @@
1
1
  bash -c '
2
+ <%= "export http_proxy=\"#{knife_config[:bootstrap_proxy]}\"" if knife_config[:bootstrap_proxy] -%>
3
+
2
4
  if [ ! -f /usr/bin/chef-client ]; then
3
5
  apt-get update
4
6
  apt-get install -y ruby ruby1.8-dev build-essential wget libruby-extras libruby1.8-extras
5
7
  cd /tmp
6
- wget http://production.cf.rubygems.org/rubygems/rubygems-1.3.7.tgz
7
- tar zxf rubygems-1.3.7.tgz
8
- cd rubygems-1.3.7
8
+ wget <%= "--proxy=on " if knife_config[:bootstrap_proxy] %>http://production.cf.rubygems.org/rubygems/rubygems-1.6.2.tgz
9
+ tar zxf rubygems-1.6.2.tgz
10
+ cd rubygems-1.6.2
9
11
  ruby setup.rb --no-format-executable
10
12
  fi
11
13
 
14
+ gem update --no-rdoc --no-ri
12
15
  gem install ohai --no-rdoc --no-ri --verbose
13
16
  gem install chef --no-rdoc --no-ri --verbose <%= bootstrap_version_string %>
14
17
 
@@ -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.
@@ -29,12 +29,34 @@ class Chef
29
29
 
30
30
  banner "knife client bulk delete REGEX (options)"
31
31
 
32
- def run
33
- if @name_args.length < 1
32
+ def run
33
+ if name_args.length < 1
34
34
  ui.fatal("You must supply a regular expression to match the results against")
35
35
  exit 42
36
- else
37
- bulk_delete(Chef::ApiClient, "client", nil, nil, @name_args[0])
36
+ end
37
+ all_clients = Chef::ApiClient.list(true)
38
+
39
+ matcher = /#{name_args[0]}/
40
+ clients_to_delete = {}
41
+ all_clients.each do |name, client|
42
+ next unless name =~ matcher
43
+ clients_to_delete[client.name] = client
44
+ end
45
+
46
+ if clients_to_delete.empty?
47
+ ui.info "No clients match the expression /#{name_args[0]}/"
48
+ exit 0
49
+ end
50
+
51
+ ui.msg("The following clients will be deleted:")
52
+ ui.msg("")
53
+ ui.msg(ui.list(clients_to_delete.keys.sort, :columns_down))
54
+ ui.msg("")
55
+ ui.confirm("Are you sure you want to delete these clients")
56
+
57
+ clients_to_delete.sort.each do |name, client|
58
+ client.destroy
59
+ ui.msg("Deleted client #{name}")
38
60
  end
39
61
  end
40
62
  end
@@ -36,7 +36,7 @@ class Chef
36
36
  :short => "-D",
37
37
  :long => "--no-dependencies",
38
38
  :boolean => true,
39
- :description => "Grab dependencies automatically"
39
+ :description => "Do not install dependencies automatically"
40
40
 
41
41
  option :cookbook_path,
42
42
  :short => "-o PATH:PATH",
@@ -44,7 +44,7 @@ class Chef
44
44
  :description => "A colon-separated path to look for cookbooks in",
45
45
  :proc => lambda { |o| o.split(":") }
46
46
 
47
- option :branch_default,
47
+ option :default_branch,
48
48
  :short => "-B BRANCH",
49
49
  :long => "--branch BRANCH",
50
50
  :description => "Default branch to work with",
@@ -1,6 +1,7 @@
1
1
  #
2
2
  # Author:: Adam Jacob (<adam@opscode.com>)
3
3
  # Author:: Christopher Walters (<cw@opscode.com>)
4
+ # Author:: Nuo Yan (<yan.nuo@gmail.com>)
4
5
  # Copyright:: Copyright (c) 2009, 2010 Opscode, Inc.
5
6
  # License:: Apache License, Version 2.0
6
7
  #
@@ -61,11 +62,20 @@ class Chef
61
62
  :description => "Set ENVIRONMENT's version dependency match the version you're uploading.",
62
63
  :default => nil
63
64
 
65
+ option :depends,
66
+ :short => "-d",
67
+ :long => "--include-dependencies",
68
+ :description => "Also upload cookbook dependencies"
69
+
64
70
  def run
65
71
  config[:cookbook_path] ||= Chef::Config[:cookbook_path]
66
72
 
67
73
  assert_environment_valid!
74
+ warn_about_cookbook_shadowing
68
75
  version_constraints_to_update = {}
76
+ # Get a list of cookbooks and their versions from the server
77
+ # for checking existence of dependending cookbooks.
78
+ @server_side_cookbooks = Chef::CookbookVersion.list
69
79
 
70
80
  if config[:all]
71
81
  justify_width = cookbook_repo.cookbook_names.map {|name| name.size}.max.to_i + 2
@@ -84,6 +94,11 @@ class Chef
84
94
  @name_args.each do |cookbook_name|
85
95
  begin
86
96
  cookbook = cookbook_repo[cookbook_name]
97
+ if config[:depends]
98
+ cookbook.metadata.dependencies.each do |dep, versions|
99
+ @name_args.push dep
100
+ end
101
+ end
87
102
  cookbook.freeze_version if config[:freeze]
88
103
  upload(cookbook, justify_width)
89
104
  version_constraints_to_update[cookbook_name] = cookbook.version
@@ -117,6 +132,22 @@ class Chef
117
132
  @environment ||= config[:environment] ? Environment.load(config[:environment]) : nil
118
133
  end
119
134
 
135
+ def warn_about_cookbook_shadowing
136
+ unless cookbook_repo.merged_cookbooks.empty?
137
+ ui.warn "* " * 40
138
+ ui.warn(<<-WARNING)
139
+ The cookbooks: #{cookbook_repo.merged_cookbooks.join(', ')} exist in multiple places in your cookbook_path.
140
+ A composite version of these cookbooks has been compiled for uploading.
141
+
142
+ #{ui.color('IMPORTANT:', :red, :bold)} In a future version of Chef, this behavior will be removed and you will no longer
143
+ be able to have the same version of a cookbook in multiple places in your cookbook_path.
144
+ WARNING
145
+ ui.warn "The affected cookbooks are located:"
146
+ ui.output ui.format_for_display(cookbook_repo.merged_cookbook_paths)
147
+ ui.warn "* " * 40
148
+ end
149
+ end
150
+
120
151
  private
121
152
 
122
153
  def assert_environment_valid!
@@ -135,6 +166,7 @@ class Chef
135
166
  ui.info("Uploading #{cookbook.name.to_s.ljust(justify_width + 10)} [#{cookbook.version}]")
136
167
 
137
168
  check_for_broken_links(cookbook)
169
+ check_dependencies(cookbook)
138
170
  Chef::CookbookUploader.new(cookbook, config[:cookbook_path], :force => config[:force]).upload_cookbook
139
171
  rescue Net::HTTPServerException => e
140
172
  case e.response.code
@@ -164,6 +196,45 @@ class Chef
164
196
  end
165
197
  end
166
198
 
199
+ def check_dependencies(cookbook)
200
+ # for each dependency, check if the version is on the server, or
201
+ # the version is in the cookbooks being uploaded. If not, exit and warn the user.
202
+ cookbook.metadata.dependencies.each do |cookbook_name, version|
203
+ unless check_server_side_cookbooks(cookbook_name, version) || check_uploading_cookbooks(cookbook_name, version)
204
+ # warn the user and exit
205
+ ui.error "Cookbook #{cookbook.name} depends on cookbook #{cookbook_name} version #{version},"
206
+ ui.error "which is not currently being uploaded and cannot be found on the server."
207
+ exit 1
208
+ end
209
+ end
210
+ end
211
+
212
+ def check_server_side_cookbooks(cookbook_name, version)
213
+ if @server_side_cookbooks[cookbook_name].nil?
214
+ false
215
+ else
216
+ @server_side_cookbooks[cookbook_name]["versions"].each do |versions_hash|
217
+ return true if Chef::VersionConstraint.new(version).include?(versions_hash["version"])
218
+ end
219
+ false
220
+ end
221
+ end
222
+
223
+ def check_uploading_cookbooks(cookbook_name, version)
224
+ if config[:all]
225
+ # check from all local cookbooks in the path
226
+ unless cookbook_repo[cookbook_name].nil?
227
+ return Chef::VersionConstraint.new(version).include?(cookbook_repo[cookbook_name].version)
228
+ end
229
+ else
230
+ # check from only those in the command argument
231
+ if @name_args.include?(cookbook_name)
232
+ return Chef::VersionConstraint.new(version).include?(cookbook_repo[cookbook_name].version)
233
+ end
234
+ end
235
+ false
236
+ end
237
+
167
238
  end
168
239
  end
169
240
  end
@@ -38,8 +38,7 @@ class Chef
38
38
  if @config[:prerelease]
39
39
  "--prerelease"
40
40
  else
41
- version = knife_config[:bootstrap_version] || Chef::VERSION
42
- "--version #{version}"
41
+ "--version #{chef_version}"
43
42
  end
44
43
  end
45
44
 
@@ -63,17 +62,28 @@ CONFIG
63
62
  else
64
63
  client_rb << "# Using default node name (fqdn)\n"
65
64
  end
65
+
66
+ if knife_config[:bootstrap_proxy]
67
+ client_rb << %Q{http_proxy "#{knife_config[:bootstrap_proxy]}"\n}
68
+ client_rb << %Q{https_proxy "#{knife_config[:bootstrap_proxy]}"\n}
69
+ end
66
70
  client_rb
67
71
  end
68
72
 
69
73
  def start_chef
70
- "/usr/bin/chef-client -j /etc/chef/first-boot.json -E #{bootstrap_environment}"
74
+ s = "/usr/bin/chef-client -j /etc/chef/first-boot.json"
75
+ s << " -E #{bootstrap_environment}" if chef_version.to_f != 0.9 # only use the -E option on Chef 0.10+
76
+ s
71
77
  end
72
78
 
73
79
  def knife_config
74
80
  @chef_config.key?(:knife) ? @chef_config[:knife] : {}
75
81
  end
76
82
 
83
+ def chef_version
84
+ knife_config[:bootstrap_version] || Chef::VERSION
85
+ end
86
+
77
87
  end
78
88
  end
79
89
  end
@@ -34,6 +34,7 @@ class Chef
34
34
  @repo_path = repo_path
35
35
  @ui = ui
36
36
  @default_branch = 'master'
37
+ apply_opts(opts)
37
38
  end
38
39
 
39
40
  def sanity_check
@@ -113,7 +114,7 @@ class Chef
113
114
  end
114
115
 
115
116
  def branch_exists?(branch_name)
116
- git("branch --no-color").stdout.lines.any? {|l| l.include?(branch_name) }
117
+ git("branch --no-color").stdout.lines.any? {|l| l =~ /\s#{Regexp.escape(branch_name)}(?:\s|$)/ }
117
118
  end
118
119
 
119
120
  private
@@ -133,8 +134,6 @@ class Chef
133
134
  case option.to_s
134
135
  when 'default_branch'
135
136
  @default_branch = value
136
- else
137
- raise ArgumentError, "invalid option `#{option}' passed to CookbookRepo.new()"
138
137
  end
139
138
  end
140
139
  end
@@ -60,14 +60,17 @@ class Chef
60
60
  def summarize(data)
61
61
  if data.kind_of?(Chef::Node)
62
62
  node = data
63
+ # special case ec2 with their split horizon whatsis.
64
+ ip = (node[:ec2] && node[:ec2][:public_ipv4]) || node[:ipaddress]
65
+
63
66
  summarized=<<-SUMMARY
64
67
  #{ui.color('Node Name:', :bold)} #{ui.color(node.name, :bold)}
65
68
  #{key('Environment:')} #{node.chef_environment}
66
69
  #{key('FQDN:')} #{node[:fqdn]}
67
- #{key('IP:')} #{node[:ipaddress]}
70
+ #{key('IP:')} #{ip}
68
71
  #{key('Run List:')} #{node.run_list}
69
72
  #{key('Roles:')} #{Array(node[:roles]).join(', ')}
70
- #{key('Recipes')} #{Array(node[:recipes]).join(', ')}
73
+ #{key('Recipes:')} #{Array(node[:recipes]).join(', ')}
71
74
  #{key('Platform:')} #{node[:platform]} #{node[:platform_version]}
72
75
  SUMMARY
73
76
  if config[:medium_output] || config[:long_output]
@@ -55,23 +55,25 @@ MOAR_HELP
55
55
  @topic = find_manpages_for_query(@query)
56
56
  end
57
57
 
58
- manpage_path = available_manpages_by_basename[@topic]
58
+ manpage_path = find_manpage_path(@topic)
59
59
  exec "man #{manpage_path}"
60
60
  end
61
61
 
62
62
  def help_topics
63
- available_manpages_by_basename.keys.map {|c| c.sub(/^knife\-/, '')}.sort
63
+ # The list of help topics is generated by a rake task from the available man pages
64
+ # This constant is provided in help_topics.rb which is automatically required/loaded by the knife subcommand loader.
65
+ HELP_TOPICS
64
66
  end
65
67
 
66
68
  def print_help_topics
67
69
  ui.info "Available help topics are: "
68
- help_topics.each do |topic|
70
+ help_topics.collect {|t| t.gsub(/knife-/, '') }.sort.each do |topic|
69
71
  ui.msg " #{topic}"
70
72
  end
71
73
  end
72
74
 
73
75
  def find_manpages_for_query(query)
74
- possibilities = available_manpages_by_basename.keys.select do |manpage|
76
+ possibilities = help_topics.select do |manpage|
75
77
  ::File.fnmatch("knife-#{query}*", manpage) || ::File.fnmatch("#{query}*", manpage)
76
78
  end
77
79
  if possibilities.empty?
@@ -87,16 +89,15 @@ MOAR_HELP
87
89
  end
88
90
  end
89
91
 
90
- def available_manpages_by_basename
91
- @available_manpages_by_basename ||= begin
92
- available_manpages = Dir[File.expand_path("../distro/common/man/man1/*1", CHEF_ROOT)]
93
- available_manpages.inject({}) do |map, manpath|
94
- map[::File.basename(manpath, '.1')] = manpath
95
- map
96
- end
92
+ def find_manpage_path(topic)
93
+ if ::File.exists?(::File.expand_path("../distro/common/man/man1/#{topic}.1", CHEF_ROOT))
94
+ # If we've provided the man page in the gem, give that
95
+ return ::File.expand_path("../distro/common/man/man1/#{topic}.1", CHEF_ROOT)
96
+ else
97
+ # Otherwise, we'll just be using MANPATH
98
+ topic
97
99
  end
98
100
  end
99
-
100
101
  end
101
102
  end
102
103
  end
@@ -0,0 +1,4 @@
1
+ # Do not edit this file by hand
2
+ # This file is autogenerated by the docs:list rake task from the available manpages
3
+
4
+ HELP_TOPICS = ["knife-ssh", "knife-environment", "knife-bootstrap", "knife-cookbook", "knife-exec", "knife-tag", "knife-status", "knife", "knife-data-bag", "knife-index", "knife-configure", "knife-search", "knife-node", "knife-client", "shef", "knife-role", "knife-cookbook-site"]
@@ -149,9 +149,8 @@ class Chef
149
149
  data.split(/\n/).each { |d| print_data(host, d) }
150
150
  else
151
151
  padding = @longest - host.length
152
- print ui.color(host, :cyan)
153
- padding.downto(0) { print " " }
154
- puts data
152
+ str = ui.color(host, :cyan) + (" " * (padding + 1)) + data
153
+ ui.msg(str)
155
154
  end
156
155
  end
157
156
 
@@ -241,6 +240,7 @@ class Chef
241
240
  window = 0
242
241
  session.servers_for.each do |server|
243
242
  tf.print("screen -t \"#{server.host}\" #{window} ssh ")
243
+ tf.print("-i #{config[:identity_file]} ") if config[:identity_file]
244
244
  server.user ? tf.puts("#{server.user}@#{server.host}") : tf.puts(server.host)
245
245
  window += 1
246
246
  end
@@ -250,8 +250,9 @@ class Chef
250
250
 
251
251
  def tmux
252
252
  ssh_dest = lambda do |server|
253
+ identity = "-i #{config[:identity_file]} " if config[:identity_file]
253
254
  prefix = server.user ? "#{server.user}@" : ""
254
- "'ssh #{prefix}#{server.host}'"
255
+ "'ssh #{identity}#{prefix}#{server.host}'"
255
256
  end
256
257
 
257
258
  new_window_cmds = lambda do
@@ -300,11 +301,31 @@ class Chef
300
301
  end
301
302
  end
302
303
 
304
+ def configure_attribute
305
+ config[:attribute] = (config[:attribute] ||
306
+ Chef::Config[:knife][:ssh_attribute] ||
307
+ "fqdn").strip
308
+ end
309
+
310
+ def configure_user
311
+ config[:ssh_user] = (config[:ssh_user] ||
312
+ Chef::Config[:knife][:ssh_user])
313
+ config[:ssh_user].strip! unless config[:ssh_user].nil?
314
+ end
315
+
316
+ def configure_identity_file
317
+ config[:identity_file] = (config[:identity_file] || Chef::Config[:knife][:ssh_identity_file])
318
+ config[:identity_file].strip! unless config[:identity_file].nil?
319
+ end
320
+
303
321
  def run
304
322
  extend Chef::Mixin::Command
305
323
 
306
324
  @longest = 0
307
325
 
326
+ configure_attribute
327
+ configure_user
328
+ configure_identity_file
308
329
  configure_session
309
330
 
310
331
  case @name_args[1]