chef 11.14.0.alpha.4 → 11.14.0.rc.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CONTRIBUTING.md +0 -4
- data/README.md +1 -1
- data/distro/common/man/man1/chef-shell.1 +4 -4
- data/distro/common/man/man1/knife-bootstrap.1 +14 -11
- data/distro/common/man/man1/knife-client.1 +14 -11
- data/distro/common/man/man1/knife-configure.1 +7 -7
- data/distro/common/man/man1/knife-cookbook-site.1 +23 -23
- data/distro/common/man/man1/knife-cookbook.1 +23 -23
- data/distro/common/man/man1/knife-data-bag.1 +13 -13
- data/distro/common/man/man1/knife-delete.1 +9 -9
- data/distro/common/man/man1/knife-deps.1 +9 -9
- data/distro/common/man/man1/knife-diff.1 +10 -10
- data/distro/common/man/man1/knife-download.1 +9 -9
- data/distro/common/man/man1/knife-edit.1 +7 -7
- data/distro/common/man/man1/knife-environment.1 +10 -10
- data/distro/common/man/man1/knife-exec.1 +7 -7
- data/distro/common/man/man1/knife-index-rebuild.1 +1 -1
- data/distro/common/man/man1/knife-list.1 +12 -12
- data/distro/common/man/man1/knife-node.1 +12 -9
- data/distro/common/man/man1/knife-raw.1 +7 -7
- data/distro/common/man/man1/knife-recipe-list.1 +1 -1
- data/distro/common/man/man1/knife-role.1 +8 -8
- data/distro/common/man/man1/knife-search.1 +9 -9
- data/distro/common/man/man1/knife-serve.1 +109 -0
- data/distro/common/man/man1/knife-show.1 +8 -8
- data/distro/common/man/man1/knife-ssh.1 +9 -9
- data/distro/common/man/man1/knife-ssl-check.1 +9 -9
- data/distro/common/man/man1/knife-ssl-fetch.1 +10 -10
- data/distro/common/man/man1/knife-status.1 +9 -9
- data/distro/common/man/man1/knife-tag.1 +7 -7
- data/distro/common/man/man1/knife-upload.1 +10 -10
- data/distro/common/man/man1/knife-user.1 +9 -9
- data/distro/common/man/man1/knife-xargs.1 +7 -7
- data/distro/common/man/man1/knife.1 +118 -14
- data/distro/common/man/man8/chef-client.8 +13 -10
- data/distro/common/man/man8/chef-solo.8 +13 -14
- data/distro/common/markdown/man1/knife.mkd +1 -1
- data/lib/chef/application/knife.rb +1 -1
- data/lib/chef/application/windows_service.rb +0 -1
- data/lib/chef/chef_fs/file_system.rb +6 -2
- data/lib/chef/config.rb +3 -2
- data/lib/chef/config_fetcher.rb +1 -1
- data/lib/chef/cookbook/metadata.rb +20 -14
- data/lib/chef/cookbook/synchronizer.rb +24 -13
- data/lib/chef/encrypted_data_bag_item/decryptor.rb +3 -3
- data/lib/chef/encrypted_data_bag_item/encryptor.rb +2 -2
- data/lib/chef/exceptions.rb +1 -0
- data/lib/chef/file_content_management/deploy/mv_windows.rb +1 -1
- data/lib/chef/formatters/error_inspectors/resource_failure_inspector.rb +1 -1
- data/lib/chef/http.rb +6 -1
- data/lib/chef/http/http_request.rb +9 -1
- data/lib/chef/http/simple.rb +2 -1
- data/lib/chef/json_compat.rb +5 -16
- data/lib/chef/knife/bootstrap.rb +2 -0
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +2 -2
- data/lib/chef/knife/core/object_loader.rb +3 -1
- data/lib/chef/knife/ssh.rb +14 -7
- data/lib/chef/mixin/convert_to_class_name.rb +1 -0
- data/lib/chef/mixin/windows_architecture_helper.rb +24 -4
- data/lib/chef/platform/provider_mapping.rb +13 -0
- data/lib/chef/provider/env/windows.rb +3 -6
- data/lib/chef/provider/git.rb +1 -2
- data/lib/chef/provider/log.rb +15 -1
- data/lib/chef/provider/package/apt.rb +3 -3
- data/lib/chef/provider/package/dpkg.rb +35 -16
- data/lib/chef/provider/package/paludis.rb +91 -0
- data/lib/chef/provider/package/rpm.rb +3 -2
- data/lib/chef/provider/package/yum-dump.py +6 -6
- data/lib/chef/provider/package/yum.rb +2 -0
- data/lib/chef/provider/registry_key.rb +4 -5
- data/lib/chef/provider/remote_file/cache_control_data.rb +1 -1
- data/lib/chef/provider/service/solaris.rb +1 -1
- data/lib/chef/provider/service/upstart.rb +2 -1
- data/lib/chef/provider/service/windows.rb +37 -9
- data/lib/chef/provider/user/pw.rb +1 -1
- data/lib/chef/provider/user/useradd.rb +1 -1
- data/lib/chef/provider/windows_script.rb +2 -1
- data/lib/chef/providers.rb +1 -0
- data/lib/chef/resource.rb +10 -0
- data/lib/chef/resource/file.rb +0 -9
- data/lib/chef/resource/package.rb +14 -4
- data/lib/chef/resource/paludis_package.rb +33 -0
- data/lib/chef/resource/registry_key.rb +62 -3
- data/lib/chef/resource/service.rb +21 -4
- data/lib/chef/resource_reporter.rb +10 -0
- data/lib/chef/resources.rb +1 -0
- data/lib/chef/role.rb +14 -10
- data/lib/chef/shell.rb +8 -0
- data/lib/chef/shell/shell_session.rb +3 -3
- data/lib/chef/user.rb +12 -11
- data/lib/chef/util/selinux.rb +1 -1
- data/lib/chef/version.rb +1 -1
- data/lib/chef/version_constraint.rb +6 -5
- data/lib/chef/win32/api/process.rb +1 -0
- data/lib/chef/win32/api/system.rb +14 -0
- data/lib/chef/win32/error.rb +1 -1
- data/lib/chef/win32/security.rb +5 -5
- data/lib/chef/win32/version.rb +6 -2
- data/spec/data/trusted_certs/opscode.pem +57 -35
- data/spec/functional/application_spec.rb +2 -2
- data/spec/functional/resource/mount_spec.rb +3 -1
- data/spec/functional/shell_spec.rb +10 -0
- data/spec/functional/tiny_server_spec.rb +2 -2
- data/spec/support/chef_helpers.rb +1 -1
- data/spec/support/shared/functional/securable_resource.rb +11 -2
- data/spec/support/shared/functional/securable_resource_with_reporting.rb +13 -2
- data/spec/tiny_server.rb +1 -1
- data/spec/unit/config_spec.rb +5 -0
- data/spec/unit/cookbook/metadata_spec.rb +24 -0
- data/spec/unit/environment_spec.rb +6 -0
- data/spec/unit/http/http_request_spec.rb +91 -0
- data/spec/unit/http_spec.rb +23 -0
- data/spec/unit/knife/bootstrap_spec.rb +2 -2
- data/spec/unit/knife/ssh_spec.rb +7 -13
- data/spec/unit/knife_spec.rb +1 -1
- data/spec/unit/mixin/convert_to_class_name_spec.rb +4 -0
- data/spec/unit/provider/git_spec.rb +2 -2
- data/spec/unit/provider/log_spec.rb +18 -0
- data/spec/unit/provider/mount/solaris_spec.rb +3 -1
- data/spec/unit/provider/package/apt_spec.rb +85 -40
- data/spec/unit/provider/package/dpkg_spec.rb +24 -48
- data/spec/unit/provider/package/paludis_spec.rb +135 -0
- data/spec/unit/provider/package/rpm_spec.rb +40 -32
- data/spec/unit/provider/package/yum_spec.rb +11 -4
- data/spec/unit/provider/registry_key_spec.rb +67 -53
- data/spec/unit/provider/remote_file/cache_control_data_spec.rb +10 -1
- data/spec/unit/provider/service/solaris_smf_service_spec.rb +23 -2
- data/spec/unit/provider/service/upstart_service_spec.rb +7 -0
- data/spec/unit/provider/service/windows_spec.rb +72 -0
- data/spec/unit/provider/user/pw_spec.rb +21 -4
- data/spec/unit/provider/user/useradd_spec.rb +10 -0
- data/spec/unit/resource/package_spec.rb +26 -18
- data/spec/unit/resource/registry_key_spec.rb +28 -0
- data/spec/unit/resource/service_spec.rb +14 -0
- data/spec/unit/resource_reporter_spec.rb +37 -12
- data/spec/unit/resource_spec.rb +41 -6
- data/spec/unit/rest_spec.rb +2 -2
- data/spec/unit/role_spec.rb +46 -28
- data/spec/unit/shell/shell_session_spec.rb +42 -2
- data/spec/unit/shell_spec.rb +1 -1
- data/spec/unit/user_spec.rb +12 -0
- data/spec/unit/util/selinux_spec.rb +4 -4
- data/spec/unit/version_constraint_spec.rb +14 -2
- metadata +195 -161
- checksums.yaml +0 -7
@@ -41,7 +41,7 @@ documentation using `knife help TOPIC`.
|
|
41
41
|
* `-c`, `--config` CONFIG:
|
42
42
|
The configuration file to use
|
43
43
|
* `-E`, `--environment ENVIRONMENT`:
|
44
|
-
Set the Chef environment
|
44
|
+
Set the Chef environment (except for in searches, where this will be flagrantly ignored)
|
45
45
|
* `-e`, `--editor` EDITOR:
|
46
46
|
Set the editor to use for interactive commands
|
47
47
|
* `-F`, `--format` FORMAT:
|
@@ -51,7 +51,7 @@ class Chef::Application::Knife < Chef::Application
|
|
51
51
|
option :environment,
|
52
52
|
:short => "-E ENVIRONMENT",
|
53
53
|
:long => "--environment ENVIRONMENT",
|
54
|
-
:description => "Set the Chef environment"
|
54
|
+
:description => "Set the Chef environment (except for in searches, where this will be flagrantly ignored)"
|
55
55
|
|
56
56
|
option :editor,
|
57
57
|
:short => "-e EDITOR",
|
@@ -211,7 +211,6 @@ class Chef
|
|
211
211
|
def reconfigure(startup_parameters=[])
|
212
212
|
configure_chef startup_parameters
|
213
213
|
configure_logging
|
214
|
-
configure_proxy_environment_variables
|
215
214
|
|
216
215
|
Chef::Config[:chef_server_url] = config[:chef_server_url] if config.has_key? :chef_server_url
|
217
216
|
unless Chef::Config[:exception_handlers].any? {|h| Chef::Handler::ErrorReport === h}
|
@@ -285,8 +285,12 @@ class Chef
|
|
285
285
|
if options[:dry_run]
|
286
286
|
ui.output "Would delete #{dest_path}" if ui
|
287
287
|
else
|
288
|
-
|
289
|
-
|
288
|
+
begin
|
289
|
+
dest_entry.delete(true)
|
290
|
+
ui.output "Deleted extra entry #{dest_path} (purge is on)" if ui
|
291
|
+
rescue Chef::ChefFS::FileSystem::NotFoundError
|
292
|
+
ui.output "Entry #{dest_path} does not exist. Nothing to do. (purge is on)" if ui
|
293
|
+
end
|
290
294
|
end
|
291
295
|
else
|
292
296
|
ui.output ("Not deleting extra entry #{dest_path} (purge is off)") if ui
|
data/lib/chef/config.rb
CHANGED
@@ -331,6 +331,7 @@ class Chef
|
|
331
331
|
|
332
332
|
default :rest_timeout, 300
|
333
333
|
default :yum_timeout, 900
|
334
|
+
default :yum_lock_timeout, 30
|
334
335
|
default :solo, false
|
335
336
|
default :splay, nil
|
336
337
|
default :why_run, false
|
@@ -551,8 +552,8 @@ class Chef
|
|
551
552
|
windows_home_path = env['SYSTEMDRIVE'] + env['HOMEPATH'] if env['SYSTEMDRIVE'] && env['HOMEPATH']
|
552
553
|
end
|
553
554
|
|
554
|
-
# returns a platform specific path to the user home dir
|
555
|
-
default( :user_home ) { env['HOME'] || windows_home_path || env['USERPROFILE'] }
|
555
|
+
# returns a platform specific path to the user home dir if set, otherwise default to current directory.
|
556
|
+
default( :user_home ) { env['HOME'] || windows_home_path || env['USERPROFILE'] || Dir.pwd }
|
556
557
|
|
557
558
|
# Enable file permission fixup for selinux. Fixup will be done
|
558
559
|
# only if selinux is enabled in the system.
|
data/lib/chef/config_fetcher.rb
CHANGED
@@ -18,7 +18,7 @@ class Chef
|
|
18
18
|
config_data = read_config
|
19
19
|
begin
|
20
20
|
Chef::JSONCompat.from_json(config_data)
|
21
|
-
rescue
|
21
|
+
rescue FFI_Yajl::ParseError => error
|
22
22
|
Chef::Application.fatal!("Could not parse the provided JSON file (#{config_location}): " + error.message, 2)
|
23
23
|
end
|
24
24
|
end
|
@@ -242,8 +242,8 @@ class Chef
|
|
242
242
|
# versions<Array>:: Returns the list of versions for the platform
|
243
243
|
def supports(platform, *version_args)
|
244
244
|
version = new_args_format(:supports, platform, version_args)
|
245
|
-
|
246
|
-
@platforms[platform] =
|
245
|
+
normalized_version = normalize_version_constraint(:supports, platform, version)
|
246
|
+
@platforms[platform] = normalized_version
|
247
247
|
@platforms[platform]
|
248
248
|
end
|
249
249
|
|
@@ -259,8 +259,8 @@ class Chef
|
|
259
259
|
# versions<Array>:: Returns the list of versions for the platform
|
260
260
|
def depends(cookbook, *version_args)
|
261
261
|
version = new_args_format(:depends, cookbook, version_args)
|
262
|
-
|
263
|
-
@dependencies[cookbook] =
|
262
|
+
normalized_version = normalize_version_constraint(:depends, cookbook, version)
|
263
|
+
@dependencies[cookbook] = normalized_version
|
264
264
|
@dependencies[cookbook]
|
265
265
|
end
|
266
266
|
|
@@ -276,8 +276,8 @@ class Chef
|
|
276
276
|
# versions<Array>:: Returns the list of versions for the platform
|
277
277
|
def recommends(cookbook, *version_args)
|
278
278
|
version = new_args_format(:recommends, cookbook, version_args)
|
279
|
-
|
280
|
-
@recommendations[cookbook] =
|
279
|
+
normalized_version = normalize_version_constraint(:recommends, cookbook, version)
|
280
|
+
@recommendations[cookbook] = normalized_version
|
281
281
|
@recommendations[cookbook]
|
282
282
|
end
|
283
283
|
|
@@ -293,8 +293,8 @@ class Chef
|
|
293
293
|
# versions<Array>:: Returns the list of versions for the platform
|
294
294
|
def suggests(cookbook, *version_args)
|
295
295
|
version = new_args_format(:suggests, cookbook, version_args)
|
296
|
-
|
297
|
-
@suggestions[cookbook] =
|
296
|
+
normalized_version = normalize_version_constraint(:suggests, cookbook, version)
|
297
|
+
@suggestions[cookbook] = normalized_version
|
298
298
|
@suggestions[cookbook]
|
299
299
|
end
|
300
300
|
|
@@ -310,8 +310,8 @@ class Chef
|
|
310
310
|
# versions<Array>:: Returns the list of versions for the platform
|
311
311
|
def conflicts(cookbook, *version_args)
|
312
312
|
version = new_args_format(:conflicts, cookbook, version_args)
|
313
|
-
|
314
|
-
@conflicting[cookbook] =
|
313
|
+
normalized_version = normalize_version_constraint(:conflicts, cookbook, version)
|
314
|
+
@conflicting[cookbook] = normalized_version
|
315
315
|
@conflicting[cookbook]
|
316
316
|
end
|
317
317
|
|
@@ -331,8 +331,8 @@ class Chef
|
|
331
331
|
# versions<Array>:: Returns the list of versions for the platform
|
332
332
|
def provides(cookbook, *version_args)
|
333
333
|
version = new_args_format(:provides, cookbook, version_args)
|
334
|
-
|
335
|
-
@providing[cookbook] =
|
334
|
+
normalized_version = normalize_version_constraint(:provides, cookbook, version)
|
335
|
+
@providing[cookbook] = normalized_version
|
336
336
|
@providing[cookbook]
|
337
337
|
end
|
338
338
|
|
@@ -347,8 +347,8 @@ class Chef
|
|
347
347
|
# versions<Array>:: Returns the list of versions for the platform
|
348
348
|
def replaces(cookbook, *version_args)
|
349
349
|
version = new_args_format(:replaces, cookbook, version_args)
|
350
|
-
|
351
|
-
@replacing[cookbook] =
|
350
|
+
normalized_version = normalize_version_constraint(:replaces, cookbook, version)
|
351
|
+
@replacing[cookbook] = normalized_version
|
352
352
|
@replacing[cookbook]
|
353
353
|
end
|
354
354
|
|
@@ -532,6 +532,12 @@ Called from:
|
|
532
532
|
INVALID
|
533
533
|
raise Exceptions::InvalidVersionConstraint, msg
|
534
534
|
end
|
535
|
+
|
536
|
+
def normalize_version_constraint(caller_name, dep_name, constraint_str)
|
537
|
+
version_constraint = validate_version_constraint(caller_name, dep_name, constraint_str)
|
538
|
+
"#{version_constraint.op} #{version_constraint.raw_version}"
|
539
|
+
end
|
540
|
+
|
535
541
|
# Verify that the given array is an array of strings
|
536
542
|
#
|
537
543
|
# Raise an exception if the members of the array are not Strings
|
@@ -68,6 +68,8 @@ class Chef
|
|
68
68
|
@eager_segments.freeze
|
69
69
|
|
70
70
|
@cookbooks_by_name, @events = cookbooks_by_name, events
|
71
|
+
|
72
|
+
@cookbook_full_file_paths = {}
|
71
73
|
end
|
72
74
|
|
73
75
|
def cache
|
@@ -136,14 +138,20 @@ class Chef
|
|
136
138
|
|
137
139
|
files.each do |file|
|
138
140
|
queue << lambda do |lock|
|
139
|
-
sync_file(file)
|
140
|
-
|
141
|
+
full_file_path = sync_file(file)
|
142
|
+
|
143
|
+
lock.synchronize {
|
144
|
+
# Save the full_path of the downloaded file to be restored in the manifest later
|
145
|
+
save_full_file_path(file, full_file_path)
|
146
|
+
mark_file_synced(file)
|
147
|
+
}
|
141
148
|
end
|
142
149
|
end
|
143
150
|
|
144
151
|
@events.cookbook_sync_start(cookbook_count)
|
145
152
|
queue.process(Chef::Config[:cookbook_sync_threads])
|
146
|
-
|
153
|
+
# Update the full file paths in the manifest
|
154
|
+
update_cookbook_filenames()
|
147
155
|
|
148
156
|
rescue Exception => e
|
149
157
|
@events.cookbook_sync_failed(cookbooks, e)
|
@@ -153,6 +161,14 @@ class Chef
|
|
153
161
|
true
|
154
162
|
end
|
155
163
|
|
164
|
+
# Saves the full_path to the file of the cookbook to be updated
|
165
|
+
# in the manifest later
|
166
|
+
def save_full_file_path(file, full_path)
|
167
|
+
@cookbook_full_file_paths[file.cookbook] ||= { }
|
168
|
+
@cookbook_full_file_paths[file.cookbook][file.segment] ||= [ ]
|
169
|
+
@cookbook_full_file_paths[file.cookbook][file.segment] << full_path
|
170
|
+
end
|
171
|
+
|
156
172
|
# Iterates over cached cookbooks' files, removing files belonging to
|
157
173
|
# cookbooks that don't appear in +cookbook_hash+
|
158
174
|
def clear_obsoleted_cookbooks
|
@@ -170,14 +186,9 @@ class Chef
|
|
170
186
|
end
|
171
187
|
|
172
188
|
def update_cookbook_filenames
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
segment_files = files_by_segment[segment]
|
177
|
-
next unless segment_files
|
178
|
-
|
179
|
-
filenames = segment_files.map { |file| file.manifest_record['path'] }
|
180
|
-
cookbook.replace_segment_filenames(segment, filenames)
|
189
|
+
@cookbook_full_file_paths.each do |cookbook, file_segments|
|
190
|
+
file_segments.each do |segment, full_paths|
|
191
|
+
cookbook.replace_segment_filenames(segment, full_paths)
|
181
192
|
end
|
182
193
|
end
|
183
194
|
end
|
@@ -204,8 +215,8 @@ class Chef
|
|
204
215
|
Chef::Log.debug("Not storing #{cache_filename}, as the cache is up to date.")
|
205
216
|
end
|
206
217
|
|
207
|
-
#
|
208
|
-
|
218
|
+
# Load the file in the cache and return the full file path to the loaded file
|
219
|
+
cache.load(cache_filename, false)
|
209
220
|
end
|
210
221
|
|
211
222
|
def cached_copy_up_to_date?(local_path, expected_checksum)
|
@@ -17,7 +17,7 @@
|
|
17
17
|
#
|
18
18
|
|
19
19
|
require 'yaml'
|
20
|
-
require '
|
20
|
+
require 'ffi_yajl'
|
21
21
|
require 'openssl'
|
22
22
|
require 'base64'
|
23
23
|
require 'digest/sha2'
|
@@ -121,8 +121,8 @@ class Chef::EncryptedDataBagItem
|
|
121
121
|
end
|
122
122
|
|
123
123
|
def for_decrypted_item
|
124
|
-
|
125
|
-
rescue
|
124
|
+
FFI_Yajl::Parser.parse(decrypted_data)["json_wrapper"]
|
125
|
+
rescue FFI_Yajl::ParseError
|
126
126
|
# convert to a DecryptionFailure error because the most likely scenario
|
127
127
|
# here is that the decryption step was unsuccessful but returned bad
|
128
128
|
# data rather than raising an error.
|
@@ -19,7 +19,7 @@
|
|
19
19
|
require 'base64'
|
20
20
|
require 'digest/sha2'
|
21
21
|
require 'openssl'
|
22
|
-
require '
|
22
|
+
require 'ffi_yajl'
|
23
23
|
require 'chef/encrypted_data_bag_item'
|
24
24
|
require 'chef/encrypted_data_bag_item/unsupported_encrypted_data_bag_item_format'
|
25
25
|
|
@@ -111,7 +111,7 @@ class Chef::EncryptedDataBagItem
|
|
111
111
|
# Strings) that do not produce valid JSON when serialized without the
|
112
112
|
# wrapper.
|
113
113
|
def serialized_data
|
114
|
-
|
114
|
+
FFI_Yajl::Encoder.encode(:json_wrapper => plaintext_data)
|
115
115
|
end
|
116
116
|
end
|
117
117
|
|
data/lib/chef/exceptions.rb
CHANGED
@@ -64,6 +64,7 @@ class Chef
|
|
64
64
|
class PrivateKeyMissing < RuntimeError; end
|
65
65
|
class CannotWritePrivateKey < RuntimeError; end
|
66
66
|
class RoleNotFound < RuntimeError; end
|
67
|
+
class DuplicateRole < RuntimeError; end
|
67
68
|
class ValidationFailed < ArgumentError; end
|
68
69
|
class InvalidPrivateKey < ArgumentError; end
|
69
70
|
class ConfigurationError < ArgumentError; end
|
@@ -60,7 +60,7 @@ class Chef
|
|
60
60
|
# Catch and raise if the user is not elevated enough.
|
61
61
|
# At this point we can't configure the file as expected so
|
62
62
|
# we're failing action on the resource.
|
63
|
-
raise Chef::Exceptions::WindowsNotAdmin, "can not get the security information for '#{dst}' due to missing Administrator
|
63
|
+
raise Chef::Exceptions::WindowsNotAdmin, "can not get the security information for '#{dst}' due to missing Administrator privileges."
|
64
64
|
end
|
65
65
|
|
66
66
|
if dst_sd.dacl_present?
|
@@ -40,7 +40,7 @@ class Chef
|
|
40
40
|
end
|
41
41
|
|
42
42
|
unless dynamic_resource?
|
43
|
-
error_description.section("Resource Declaration:", recipe_snippet)
|
43
|
+
error_description.section("Resource Declaration:", resource.sensitive ? "suppressed sensitive resource output" : recipe_snippet)
|
44
44
|
end
|
45
45
|
|
46
46
|
error_description.section("Compiled Resource:", "#{resource.to_text}")
|
data/lib/chef/http.rb
CHANGED
@@ -21,12 +21,14 @@
|
|
21
21
|
# limitations under the License.
|
22
22
|
#
|
23
23
|
|
24
|
+
require 'tempfile'
|
24
25
|
require 'net/https'
|
25
26
|
require 'uri'
|
26
27
|
require 'chef/http/basic_client'
|
27
28
|
require 'chef/monkey_patches/string'
|
28
29
|
require 'chef/monkey_patches/net_http'
|
29
30
|
require 'chef/config'
|
31
|
+
require 'chef/platform/query_helpers'
|
30
32
|
require 'chef/exceptions'
|
31
33
|
|
32
34
|
class Chef
|
@@ -207,7 +209,10 @@ class Chef
|
|
207
209
|
elsif path.nil? or path.empty?
|
208
210
|
URI.parse(@url)
|
209
211
|
else
|
210
|
-
|
212
|
+
# The regular expressions used here are to make sure '@url' does not have
|
213
|
+
# any trailing slashes and 'path' does not have any leading slashes. This
|
214
|
+
# way they are always joined correctly using just one slash.
|
215
|
+
URI.parse(@url.gsub(%r{/+$}, '') + '/' + path.gsub(%r{^/+}, ''))
|
211
216
|
end
|
212
217
|
end
|
213
218
|
|
@@ -60,6 +60,8 @@ class Chef
|
|
60
60
|
|
61
61
|
HOST_LOWER = "host".freeze
|
62
62
|
|
63
|
+
URI_SCHEME_DEFAULT_PORT = { 'http' => 80, 'https' => 443 }.freeze
|
64
|
+
|
63
65
|
def self.user_agent=(ua)
|
64
66
|
@user_agent = ua
|
65
67
|
end
|
@@ -138,7 +140,13 @@ class Chef
|
|
138
140
|
# No response compression unless we asked for it explicitly:
|
139
141
|
@headers[HTTPRequest::ACCEPT_ENCODING] ||= "identity"
|
140
142
|
@headers['X-Chef-Version'] = ::Chef::VERSION
|
141
|
-
|
143
|
+
|
144
|
+
# Only include port in Host header when it is not the default port
|
145
|
+
# for the url scheme (80;443) - Fixes CHEF-5355
|
146
|
+
host_header = uri_safe_host.dup
|
147
|
+
host_header << ":#{port}" unless URI_SCHEME_DEFAULT_PORT[@url.scheme] == port.to_i
|
148
|
+
@headers['Host'] = host_header unless @headers.keys.any? {|k| k.downcase.to_s == HOST_LOWER }
|
149
|
+
|
142
150
|
@headers
|
143
151
|
end
|
144
152
|
|
data/lib/chef/http/simple.rb
CHANGED
data/lib/chef/json_compat.rb
CHANGED
@@ -17,8 +17,8 @@
|
|
17
17
|
|
18
18
|
# Wrapper class for interacting with JSON.
|
19
19
|
|
20
|
-
require '
|
21
|
-
require '
|
20
|
+
require 'ffi_yajl'
|
21
|
+
require 'ffi_yajl/json_gem' # XXX: parts of chef require JSON gem's Hash#to_json monkeypatch
|
22
22
|
|
23
23
|
class Chef
|
24
24
|
class JSONCompat
|
@@ -40,20 +40,9 @@ class Chef
|
|
40
40
|
|
41
41
|
class <<self
|
42
42
|
|
43
|
-
# See CHEF-1292/PL-538. Increase the max nesting for JSON, which defaults
|
44
|
-
# to 19, and isn't enough for some (for example, a Node within a Node)
|
45
|
-
# structures.
|
46
|
-
def opts_add_max_nesting(opts)
|
47
|
-
if opts.nil? || !opts.has_key?(:max_nesting)
|
48
|
-
opts = opts.nil? ? Hash.new : opts.clone
|
49
|
-
opts[:max_nesting] = JSON_MAX_NESTING
|
50
|
-
end
|
51
|
-
opts
|
52
|
-
end
|
53
|
-
|
54
43
|
# Just call the JSON gem's parse method with a modified :max_nesting field
|
55
44
|
def from_json(source, opts = {})
|
56
|
-
obj = ::
|
45
|
+
obj = ::FFI_Yajl::Parser.parse(source)
|
57
46
|
|
58
47
|
# JSON gem requires top level object to be a Hash or Array (otherwise
|
59
48
|
# you get the "must contain two octets" error). Yajl doesn't impose the
|
@@ -99,11 +88,11 @@ class Chef
|
|
99
88
|
end
|
100
89
|
|
101
90
|
def to_json(obj, opts = nil)
|
102
|
-
obj.to_json(
|
91
|
+
obj.to_json(opts)
|
103
92
|
end
|
104
93
|
|
105
94
|
def to_json_pretty(obj, opts = nil)
|
106
|
-
::JSON.pretty_generate(obj,
|
95
|
+
::JSON.pretty_generate(obj, opts)
|
107
96
|
end
|
108
97
|
|
109
98
|
|
data/lib/chef/knife/bootstrap.rb
CHANGED
@@ -239,6 +239,8 @@ class Chef
|
|
239
239
|
if Array(@name_args).first.nil?
|
240
240
|
ui.error("Must pass an FQDN or ip to bootstrap")
|
241
241
|
exit 1
|
242
|
+
elsif Array(@name_args).first == "windows"
|
243
|
+
ui.warn("Hostname containing 'windows' specified. Please install 'knife-windows' if you are attempting to bootstrap a Windows node via WinRM.")
|
242
244
|
end
|
243
245
|
end
|
244
246
|
|
@@ -5,8 +5,8 @@ if [ ! -f /usr/bin/chef-client ]; then
|
|
5
5
|
pacman -Syy
|
6
6
|
pacman -S --noconfirm ruby ntp base-devel
|
7
7
|
ntpdate -u pool.ntp.org
|
8
|
-
gem install ohai --no-
|
9
|
-
gem install chef --no-
|
8
|
+
gem install ohai --no-user-install --no-document --verbose
|
9
|
+
gem install chef --no-user-install --no-document --verbose <%= bootstrap_version_string %>
|
10
10
|
fi
|
11
11
|
|
12
12
|
mkdir -p /etc/chef
|
@@ -16,6 +16,8 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
18
|
|
19
|
+
require 'ffi_yajl'
|
20
|
+
|
19
21
|
class Chef
|
20
22
|
class Knife
|
21
23
|
module Core
|
@@ -83,7 +85,7 @@ class Chef
|
|
83
85
|
def object_from_file(filename)
|
84
86
|
case filename
|
85
87
|
when /\.(js|json)$/
|
86
|
-
r =
|
88
|
+
r = FFI_Yajl::Parser.parse(IO.read(filename))
|
87
89
|
|
88
90
|
# Chef::DataBagItem doesn't work well with the json_create method
|
89
91
|
if @klass == Chef::DataBagItem
|