knife 17.3.48 → 17.4.18
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.
- checksums.yaml +4 -4
- data/lib/chef/knife/bootstrap.rb +3 -0
- data/lib/chef/knife/bootstrap/train_connector.rb +3 -3
- data/lib/chef/knife/client_create.rb +21 -0
- data/lib/chef/knife/core/windows_bootstrap_context.rb +2 -2
- data/lib/chef/knife/version.rb +1 -1
- data/spec/data/knife/temp_dir/tmp.pem +0 -0
- data/spec/integration/client_create_spec.rb +1 -0
- data/spec/unit/knife/bootstrap_spec.rb +14 -1
- data/spec/unit/knife/client_create_spec.rb +37 -2
- data/spec/unit/knife/core/windows_bootstrap_context_spec.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 70c4e18afa9b4762387d8a0a6c9c75bca9e1e42723a041147bea36c2efaae176
|
4
|
+
data.tar.gz: '00953cd3c86ab1e11eb9ddb9a8fdf8fffbae40705671090169411877fa72a069'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f2d2130d599b56a3d43bbbbe5f64407dfc19aaec9df4ea87af2b835b950dda18ef1b9eb6cee28fae9ee05bafef8b6fe180219b36f1f7fbe5333b4efcd3236002
|
7
|
+
data.tar.gz: 0d500fcfd9e9aa0830d04bae3f9d4e3712ab52bf6fcd9b87c4f0e3bbb2149f8568d179c41656189b7614bdbdd91e8dbd5d14800c38771275466c5e3c9e0c78f0
|
data/lib/chef/knife/bootstrap.rb
CHANGED
@@ -20,6 +20,7 @@ require_relative "../knife"
|
|
20
20
|
require_relative "data_bag_secret_options"
|
21
21
|
require "chef-utils/dist" unless defined?(ChefUtils::Dist)
|
22
22
|
require "license_acceptance/cli_flags/mixlib_cli"
|
23
|
+
|
23
24
|
module LicenseAcceptance
|
24
25
|
autoload :Acceptor, "license_acceptance/acceptor"
|
25
26
|
end
|
@@ -705,6 +706,8 @@ class Chef
|
|
705
706
|
ui.warn("#{e.message} - trying with pty request")
|
706
707
|
conn_options[:pty] = true # ensure we can talk to systems with requiretty set true in sshd config
|
707
708
|
retry
|
709
|
+
elsif e.reason == :sudo_missing_terminal
|
710
|
+
ui.error "Sudo password is required for this operation. Please enter password using -P or --ssh-password option"
|
708
711
|
elsif config[:use_sudo_password] && (e.reason == :sudo_password_required || e.reason == :bad_sudo_password) && limit < 3
|
709
712
|
ui.warn("Failed to authenticate #{conn_options[:user]} to #{server_name} - #{e.message} \n sudo: #{limit} incorrect password attempt")
|
710
713
|
sudo_password = ui.ask("Enter sudo password for #{conn_options[:user]}@#{server_name}:", echo: false)
|
@@ -240,7 +240,7 @@ class Chef
|
|
240
240
|
|
241
241
|
# Now that everything is populated, fill in anything missing
|
242
242
|
# that may be found in user ssh config
|
243
|
-
opts.merge!(missing_opts_from_ssh_config(opts
|
243
|
+
opts.merge!(missing_opts_from_ssh_config(opts))
|
244
244
|
|
245
245
|
Train.target_config(opts)
|
246
246
|
end
|
@@ -297,12 +297,12 @@ class Chef
|
|
297
297
|
# in the configuration passed in.
|
298
298
|
# This is necessary because train will default these values
|
299
299
|
# itself - causing SSH config data to be ignored
|
300
|
-
def missing_opts_from_ssh_config(config
|
300
|
+
def missing_opts_from_ssh_config(config)
|
301
301
|
return {} unless config[:backend] == "ssh"
|
302
302
|
|
303
303
|
host_cfg = ssh_config_for_host(config[:host])
|
304
304
|
opts_out = {}
|
305
|
-
|
305
|
+
host_cfg.each do |key, _value|
|
306
306
|
if SSH_CONFIG_OVERRIDE_KEYS.include?(key) && !config.key?(key)
|
307
307
|
opts_out[key] = host_cfg[key]
|
308
308
|
end
|
@@ -81,6 +81,14 @@ class Chef
|
|
81
81
|
client.public_key File.read(File.expand_path(config[:public_key]))
|
82
82
|
end
|
83
83
|
|
84
|
+
# Check the file before creating the client so the api is more transactional.
|
85
|
+
if config[:file]
|
86
|
+
file = config[:file]
|
87
|
+
dir_name = File.dirname(file)
|
88
|
+
check_writable_or_exists(dir_name, "Directory")
|
89
|
+
check_writable_or_exists(file, "File")
|
90
|
+
end
|
91
|
+
|
84
92
|
output = edit_hash(client)
|
85
93
|
final_client = create_client(output)
|
86
94
|
ui.info("Created #{final_client}")
|
@@ -96,6 +104,19 @@ class Chef
|
|
96
104
|
end
|
97
105
|
end
|
98
106
|
end
|
107
|
+
|
108
|
+
# To check if file or directory exists or writable and raise exception accordingly
|
109
|
+
def check_writable_or_exists(file, type)
|
110
|
+
if File.exist?(file)
|
111
|
+
unless File.writable?(file)
|
112
|
+
ui.fatal "#{type} #{file} is not writable. Check permissions."
|
113
|
+
exit 1
|
114
|
+
end
|
115
|
+
else
|
116
|
+
ui.fatal "#{type} #{file} does not exist."
|
117
|
+
exit 1
|
118
|
+
end
|
119
|
+
end
|
99
120
|
end
|
100
121
|
end
|
101
122
|
end
|
@@ -86,8 +86,8 @@ class Chef
|
|
86
86
|
client_rb << "# Using default node name (fqdn)\n"
|
87
87
|
end
|
88
88
|
|
89
|
-
if
|
90
|
-
client_rb << %Q{log_level :#{
|
89
|
+
if chef_config[:config_log_level]
|
90
|
+
client_rb << %Q{log_level :#{chef_config[:config_log_level]}\n}
|
91
91
|
else
|
92
92
|
client_rb << "log_level :auto\n"
|
93
93
|
end
|
data/lib/chef/knife/version.rb
CHANGED
File without changes
|
@@ -50,6 +50,7 @@ describe "knife client create", :workstation do
|
|
50
50
|
|
51
51
|
it "saves the private key to a file" do
|
52
52
|
Dir.mktmpdir do |tgt|
|
53
|
+
File.open("#{tgt}/bah.pem", "w") { |pub| pub.write("test key") }
|
53
54
|
knife("client create -f #{tgt}/bah.pem bah").should_succeed stderr: out
|
54
55
|
expect(File).to exist("#{tgt}/bah.pem")
|
55
56
|
end
|
@@ -1307,7 +1307,7 @@ describe Chef::Knife::Bootstrap do
|
|
1307
1307
|
context "when no identity file is specified" do
|
1308
1308
|
it "generates the expected configuration (no keys, keys_only false)" do
|
1309
1309
|
expect(knife.ssh_identity_opts).to eq( {
|
1310
|
-
key_files: [
|
1310
|
+
key_files: [],
|
1311
1311
|
keys_only: false,
|
1312
1312
|
})
|
1313
1313
|
end
|
@@ -2050,6 +2050,19 @@ describe Chef::Knife::Bootstrap do
|
|
2050
2050
|
expect { knife.do_connect({}) }.to raise_error(expected_error)
|
2051
2051
|
end
|
2052
2052
|
end
|
2053
|
+
|
2054
|
+
context "when a train sudo error is thrown for missing terminal" do
|
2055
|
+
let(:ui_error_msg) { "Sudo password is required for this operation. Please enter password using -P or --ssh-password option" }
|
2056
|
+
let(:expected_error) { Train::UserError.new(ui_error_msg, :sudo_missing_terminal) }
|
2057
|
+
before do
|
2058
|
+
allow(connection).to receive(:connect!).and_raise(expected_error)
|
2059
|
+
end
|
2060
|
+
it "outputs user friendly error message" do
|
2061
|
+
expect { knife.do_connect({}) }.not_to raise_error
|
2062
|
+
expect(stderr.string).to include(ui_error_msg)
|
2063
|
+
end
|
2064
|
+
end
|
2065
|
+
|
2053
2066
|
end
|
2054
2067
|
|
2055
2068
|
describe "validate_winrm_transport_opts!" do
|
@@ -122,10 +122,12 @@ describe Chef::Knife::ClientCreate do
|
|
122
122
|
end
|
123
123
|
|
124
124
|
it "should write the private key to a file" do
|
125
|
-
|
125
|
+
file = Tempfile.new
|
126
|
+
file_path = file.path
|
127
|
+
knife.config[:file] = file_path
|
126
128
|
filehandle = double("Filehandle")
|
127
129
|
expect(filehandle).to receive(:print).with("woot")
|
128
|
-
expect(File).to receive(:open).with(
|
130
|
+
expect(File).to receive(:open).with(file_path, "w").and_yield(filehandle)
|
129
131
|
knife.run
|
130
132
|
end
|
131
133
|
end
|
@@ -164,6 +166,39 @@ describe Chef::Knife::ClientCreate do
|
|
164
166
|
expect(client.validator).to be_truthy
|
165
167
|
end
|
166
168
|
end
|
169
|
+
|
170
|
+
describe "with -f or --file when dir or file is not writable or does not exists" do
|
171
|
+
let(:dir_path) { File.expand_path(File.join(CHEF_SPEC_DATA, "knife", "temp_dir")) }
|
172
|
+
let(:file_path) { File.expand_path(File.join(dir_path, "tmp.pem")) }
|
173
|
+
|
174
|
+
it "when the directory does not exists" do
|
175
|
+
knife.config[:file] = "example/client1.pem"
|
176
|
+
expect(knife.ui).to receive(:fatal).with("Directory example does not exist.")
|
177
|
+
expect { knife.run }.to raise_error(SystemExit)
|
178
|
+
end
|
179
|
+
|
180
|
+
it "when the directory not writable" do
|
181
|
+
knife.config[:file] = file_path
|
182
|
+
File.chmod(777, dir_path)
|
183
|
+
expect(knife.ui).to receive(:fatal).with("Directory #{dir_path} is not writable. Check permissions.")
|
184
|
+
expect { knife.run }.to raise_error(SystemExit)
|
185
|
+
end
|
186
|
+
|
187
|
+
it "when the file does not exists" do
|
188
|
+
path = "#{dir_path}/client1.pem"
|
189
|
+
knife.config[:file] = path
|
190
|
+
File.chmod(0755, dir_path)
|
191
|
+
expect(knife.ui).to receive(:fatal).with("File #{path} does not exist.")
|
192
|
+
expect { knife.run }.to raise_error(SystemExit)
|
193
|
+
end
|
194
|
+
|
195
|
+
it "when the file is not writable" do
|
196
|
+
knife.config[:file] = file_path
|
197
|
+
File.chmod(777, file_path)
|
198
|
+
expect(knife.ui).to receive(:fatal).with("File #{file_path} is not writable. Check permissions.")
|
199
|
+
expect { knife.run }.to raise_error(SystemExit)
|
200
|
+
end
|
201
|
+
end
|
167
202
|
end
|
168
203
|
end
|
169
204
|
end
|
@@ -169,7 +169,7 @@ describe Chef::Knife::Core::WindowsBootstrapContext do
|
|
169
169
|
echo.file_backup_path "c:/chef/backup"
|
170
170
|
echo.cache_options ^({:path =^> "C:\\\\chef\\\\cache\\\\checksums", :skip_expires =^> true}^)
|
171
171
|
echo.# Using default node name ^(fqdn^)
|
172
|
-
echo.log_level
|
172
|
+
echo.log_level :info
|
173
173
|
echo.log_location STDOUT
|
174
174
|
EXPECTED
|
175
175
|
expect(bootstrap_context.config_content).to eq expected
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knife
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 17.
|
4
|
+
version: 17.4.18
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Jacob
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-08-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chef-config
|
@@ -751,6 +751,7 @@ files:
|
|
751
751
|
- spec/data/kitchen/openldap/recipes/woot.rb
|
752
752
|
- spec/data/knife-home/.chef/plugins/knife/example_home_subcommand.rb
|
753
753
|
- spec/data/knife-site-subcommands/plugins/knife/example_subcommand.rb
|
754
|
+
- spec/data/knife/temp_dir/tmp.pem
|
754
755
|
- spec/data/knife_subcommand/test_explicit_category.rb
|
755
756
|
- spec/data/knife_subcommand/test_name_mapping.rb
|
756
757
|
- spec/data/knife_subcommand/test_yourself.rb
|