chef 15.13.8 → 15.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -2
- data/lib/chef/api_client/registration.rb +2 -2
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_dir.rb +2 -2
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_cookbook_entry.rb +1 -1
- data/lib/chef/chef_fs/file_system/repository/chef_repository_file_system_root_dir.rb +2 -2
- data/lib/chef/chef_fs/file_system/repository/directory.rb +1 -1
- data/lib/chef/chef_fs/file_system/repository/file_system_entry.rb +1 -1
- data/lib/chef/environment.rb +2 -2
- data/lib/chef/http.rb +2 -1
- data/lib/chef/knife/bootstrap.rb +2 -2
- data/lib/chef/knife/cookbook_download.rb +1 -1
- data/lib/chef/knife/cookbook_metadata.rb +1 -1
- data/lib/chef/knife/core/hashed_command_loader.rb +2 -2
- data/lib/chef/knife/exec.rb +2 -2
- data/lib/chef/knife/ssh.rb +16 -1
- data/lib/chef/provider/service/arch.rb +2 -2
- data/lib/chef/provider/service/debian.rb +1 -1
- data/lib/chef/provider/service/gentoo.rb +2 -2
- data/lib/chef/provider/service/macosx.rb +2 -2
- data/lib/chef/provider/service/openbsd.rb +1 -1
- data/lib/chef/provider/service/redhat.rb +2 -2
- data/lib/chef/provider/service/upstart.rb +1 -1
- data/lib/chef/resource/hostname.rb +18 -18
- data/lib/chef/resource/sudo.rb +1 -1
- data/lib/chef/resource/windows_feature_powershell.rb +6 -2
- data/lib/chef/resource/windows_font.rb +2 -1
- data/lib/chef/role.rb +2 -2
- data/lib/chef/shell.rb +1 -1
- data/lib/chef/util/diff.rb +1 -1
- data/lib/chef/util/powershell/cmdlet.rb +1 -1
- data/lib/chef/version.rb +1 -1
- data/lib/chef/win32/file.rb +2 -2
- data/spec/functional/resource/aixinit_service_spec.rb +7 -7
- data/spec/functional/resource/bff_spec.rb +2 -2
- data/spec/functional/resource/cookbook_file_spec.rb +1 -1
- data/spec/functional/resource/dsc_resource_spec.rb +1 -1
- data/spec/functional/resource/insserv_spec.rb +4 -4
- data/spec/functional/resource/link_spec.rb +17 -17
- data/spec/functional/resource/rpm_spec.rb +2 -2
- data/spec/functional/resource/user/dscl_spec.rb +1 -1
- data/spec/functional/resource/user/mac_user_spec.rb +1 -1
- data/spec/functional/resource/windows_certificate_spec.rb +3 -3
- data/spec/functional/resource/windows_font_spec.rb +49 -0
- data/spec/functional/win32/service_manager_spec.rb +1 -1
- data/spec/integration/recipes/lwrp_inline_resources_spec.rb +1 -1
- data/spec/spec_helper.rb +5 -4
- data/spec/support/platform_helpers.rb +12 -42
- data/spec/support/platforms/win32/spec_service.rb +1 -1
- data/spec/support/shared/functional/directory_resource.rb +1 -1
- data/spec/support/shared/functional/execute_resource.rb +1 -1
- data/spec/support/shared/functional/file_resource.rb +2 -2
- data/spec/support/shared/functional/win32_service.rb +1 -1
- data/spec/support/shared/functional/windows_script.rb +3 -3
- data/spec/unit/environment_spec.rb +7 -7
- data/spec/unit/knife/bootstrap_spec.rb +14 -14
- data/spec/unit/knife/cookbook_download_spec.rb +4 -4
- data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +1 -1
- data/spec/unit/knife/core/hashed_command_loader_spec.rb +3 -3
- data/spec/unit/knife/ssh_spec.rb +2 -2
- data/spec/unit/knife/supermarket_share_spec.rb +1 -1
- data/spec/unit/provider/service/arch_service_spec.rb +3 -2
- data/spec/unit/provider/service/debian_service_spec.rb +1 -1
- data/spec/unit/provider/service/gentoo_service_spec.rb +7 -7
- data/spec/unit/provider/service/macosx_spec.rb +3 -3
- data/spec/unit/provider/service/redhat_spec.rb +2 -2
- data/spec/unit/provider/service/upstart_service_spec.rb +3 -3
- data/spec/unit/resource/windows_feature_powershell_spec.rb +30 -4
- data/spec/unit/role_spec.rb +11 -11
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9cedb478d0c5c91ba1217dd228387261aa82eeb69b9f572ce7041719ce3f20f
|
4
|
+
data.tar.gz: a4c107cea2186b546e20e4a754a6288d5ccd7cae2c88792aa79a4fa2894acc94
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0f116046c01b46cb1de8e2e0eb07fa5bd4dff2045598460c5a7df71d77d2666caac0511071c6b91f1e879a68ae3c10ee72cdb58cbf9ff7b64bc93fbd6903738b
|
7
|
+
data.tar.gz: 5732ddd577cd6b20a07ee8c899747cb09fda3752136540f4f6cc16f1d406ad5b9e7365dc53dc3e415028c9e4aa5281dfde445e19f83bbc3b5f4f551ca168aa45
|
data/Gemfile
CHANGED
@@ -71,8 +71,7 @@ group(:development, :test) do
|
|
71
71
|
end
|
72
72
|
|
73
73
|
group(:chefstyle) do
|
74
|
-
# for
|
75
|
-
gem "chefstyle", git: "https://github.com/chef/chefstyle.git", branch: "master"
|
74
|
+
gem "chefstyle", "1.2.1" # pinned so we don't have to fixup 2 branches for new rules
|
76
75
|
end
|
77
76
|
|
78
77
|
instance_eval(ENV["GEMFILE_MOD"]) if ENV["GEMFILE_MOD"]
|
@@ -72,14 +72,14 @@ class Chef
|
|
72
72
|
|
73
73
|
def assert_destination_writable!
|
74
74
|
abs_path = File.expand_path(destination)
|
75
|
-
unless File.
|
75
|
+
unless File.exist?(File.dirname(abs_path))
|
76
76
|
begin
|
77
77
|
FileUtils.mkdir_p(File.dirname(abs_path))
|
78
78
|
rescue Errno::EACCES
|
79
79
|
raise Chef::Exceptions::CannotWritePrivateKey, "I can't create the configuration directory at #{File.dirname(abs_path)} - check permissions?"
|
80
80
|
end
|
81
81
|
end
|
82
|
-
if (File.
|
82
|
+
if (File.exist?(abs_path) && !File.writable?(abs_path)) || !File.writable?(File.dirname(abs_path))
|
83
83
|
raise Chef::Exceptions::CannotWritePrivateKey, "I can't write your private key to #{abs_path} - check permissions?"
|
84
84
|
end
|
85
85
|
end
|
@@ -76,7 +76,7 @@ class Chef
|
|
76
76
|
|
77
77
|
# Write out .uploaded-cookbook-version.json
|
78
78
|
# cookbook_file_path = File.join(file_path, cookbook_name) <- this should be the same as self.file_path
|
79
|
-
unless File.
|
79
|
+
unless File.exist?(file_path)
|
80
80
|
FileUtils.mkdir_p(file_path)
|
81
81
|
end
|
82
82
|
uploaded_cookbook_version_path = File.join(file_path, Chef::Cookbook::CookbookVersionLoader::UPLOADED_COOKBOOK_VERSION_FILE)
|
@@ -132,7 +132,7 @@ class Chef
|
|
132
132
|
end
|
133
133
|
|
134
134
|
def can_upload?
|
135
|
-
File.
|
135
|
+
File.exist?(uploaded_cookbook_version_path) || children.size > 0
|
136
136
|
end
|
137
137
|
|
138
138
|
protected
|
@@ -161,7 +161,7 @@ class Chef
|
|
161
161
|
# members.json and org.json may be found.
|
162
162
|
#
|
163
163
|
def root_dir
|
164
|
-
existing_paths = root_paths.select { |path| File.
|
164
|
+
existing_paths = root_paths.select { |path| File.exist?(path) }
|
165
165
|
if existing_paths.size > 0
|
166
166
|
MultiplexedDir.new(existing_paths.map do |path|
|
167
167
|
dir = FileSystemEntry.new(name, parent, path)
|
@@ -184,7 +184,7 @@ class Chef
|
|
184
184
|
return root_dir.child(name)
|
185
185
|
end
|
186
186
|
|
187
|
-
paths = (child_paths[name] || []).select { |path| File.
|
187
|
+
paths = (child_paths[name] || []).select { |path| File.exist?(path) }
|
188
188
|
if paths.size == 0
|
189
189
|
return NonexistentFSObject.new(name, self)
|
190
190
|
end
|
data/lib/chef/environment.rb
CHANGED
@@ -255,11 +255,11 @@ class Chef
|
|
255
255
|
js_file = File.join(Chef::Config[:environment_path], "#{name}.json")
|
256
256
|
rb_file = File.join(Chef::Config[:environment_path], "#{name}.rb")
|
257
257
|
|
258
|
-
if File.
|
258
|
+
if File.exist?(js_file)
|
259
259
|
# from_json returns object.class => json_class in the JSON.
|
260
260
|
hash = Chef::JSONCompat.parse(IO.read(js_file))
|
261
261
|
from_hash(hash)
|
262
|
-
elsif File.
|
262
|
+
elsif File.exist?(rb_file)
|
263
263
|
environment = Chef::Environment.new
|
264
264
|
environment.name(name)
|
265
265
|
environment.from_file(rb_file)
|
data/lib/chef/http.rb
CHANGED
@@ -22,7 +22,8 @@
|
|
22
22
|
#
|
23
23
|
|
24
24
|
require "tempfile" unless defined?(Tempfile)
|
25
|
-
require "
|
25
|
+
require "openssl" unless defined?(OpenSSL)
|
26
|
+
require "net/http" unless defined?(Net::HTTP)
|
26
27
|
require "uri" unless defined?(URI)
|
27
28
|
require_relative "http/basic_client"
|
28
29
|
require_relative "monkey_patches/net_http"
|
data/lib/chef/knife/bootstrap.rb
CHANGED
@@ -497,7 +497,7 @@ class Chef
|
|
497
497
|
template = bootstrap_template
|
498
498
|
|
499
499
|
# Use the template directly if it's a path to an actual file
|
500
|
-
if File.
|
500
|
+
if File.exist?(template)
|
501
501
|
Chef::Log.trace("Using the specified bootstrap template: #{File.dirname(template)}")
|
502
502
|
return template
|
503
503
|
end
|
@@ -512,7 +512,7 @@ class Chef
|
|
512
512
|
|
513
513
|
template_file = Array(bootstrap_files).find do |bootstrap_template|
|
514
514
|
Chef::Log.trace("Looking for bootstrap template in #{File.dirname(bootstrap_template)}")
|
515
|
-
File.
|
515
|
+
File.exist?(bootstrap_template)
|
516
516
|
end
|
517
517
|
|
518
518
|
unless template_file
|
@@ -73,7 +73,7 @@ class Chef
|
|
73
73
|
manifest = cookbook.cookbook_manifest
|
74
74
|
|
75
75
|
basedir = File.join(config[:download_directory], "#{@cookbook_name}-#{cookbook.version}")
|
76
|
-
if File.
|
76
|
+
if File.exist?(basedir)
|
77
77
|
if config[:force]
|
78
78
|
Chef::Log.trace("Deleting #{basedir}")
|
79
79
|
FileUtils.rm_rf(basedir)
|
@@ -62,7 +62,7 @@ class Chef
|
|
62
62
|
def generate_metadata(cookbook)
|
63
63
|
Array(config[:cookbook_path]).reverse_each do |path|
|
64
64
|
file = File.expand_path(File.join(path, cookbook, "metadata.rb"))
|
65
|
-
if File.
|
65
|
+
if File.exist?(file)
|
66
66
|
generate_metadata_from_file(cookbook, file)
|
67
67
|
else
|
68
68
|
validate_metadata_json(path, cookbook)
|
@@ -53,7 +53,7 @@ class Chef
|
|
53
53
|
paths = manifest[KEY]["plugins_paths"][command]
|
54
54
|
if paths && paths.is_a?(Array)
|
55
55
|
# It is only an error if all the paths don't exist
|
56
|
-
if paths.all? { |sc| !File.
|
56
|
+
if paths.all? { |sc| !File.exist?(sc) }
|
57
57
|
errors[command] = paths
|
58
58
|
end
|
59
59
|
end
|
@@ -77,7 +77,7 @@ class Chef
|
|
77
77
|
false
|
78
78
|
else
|
79
79
|
paths.each do |sc|
|
80
|
-
if File.
|
80
|
+
if File.exist?(sc)
|
81
81
|
Kernel.load sc
|
82
82
|
else
|
83
83
|
return false
|
data/lib/chef/knife/exec.rb
CHANGED
@@ -76,7 +76,7 @@ class Chef::Knife::Exec < Chef::Knife
|
|
76
76
|
def find_script(x)
|
77
77
|
# Try to find a script. First try expanding the path given.
|
78
78
|
script = File.expand_path(x)
|
79
|
-
return script if File.
|
79
|
+
return script if File.exist?(script)
|
80
80
|
|
81
81
|
# Failing that, try searching the script path. If we can't find
|
82
82
|
# anything, fail gracefully.
|
@@ -86,7 +86,7 @@ class Chef::Knife::Exec < Chef::Knife
|
|
86
86
|
path = File.expand_path(path)
|
87
87
|
test = File.join(path, x)
|
88
88
|
Chef::Log.trace("Testing: #{test}")
|
89
|
-
if File.
|
89
|
+
if File.exist?(test)
|
90
90
|
script = test
|
91
91
|
Chef::Log.trace("Found: #{test}")
|
92
92
|
return script
|
data/lib/chef/knife/ssh.rb
CHANGED
@@ -362,11 +362,21 @@ class Chef
|
|
362
362
|
subsession ||= session
|
363
363
|
command = fixup_sudo(command)
|
364
364
|
command.force_encoding("binary") if command.respond_to?(:force_encoding)
|
365
|
+
begin
|
366
|
+
open_session(subsession, command)
|
367
|
+
rescue => e
|
368
|
+
open_session(subsession, command, true)
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
def open_session(subsession, command, pty = false)
|
373
|
+
stderr = ""
|
374
|
+
exit_status = 0
|
365
375
|
subsession.open_channel do |chan|
|
366
376
|
if config[:on_error] && exit_status != 0
|
367
377
|
chan.close
|
368
378
|
else
|
369
|
-
chan.request_pty
|
379
|
+
chan.request_pty if pty
|
370
380
|
chan.exec command do |ch, success|
|
371
381
|
raise ArgumentError, "Cannot execute #{command}" unless success
|
372
382
|
|
@@ -377,6 +387,11 @@ class Chef
|
|
377
387
|
ichannel.send_data("#{get_password}\n")
|
378
388
|
end
|
379
389
|
end
|
390
|
+
|
391
|
+
ch.on_extended_data do |_, _type, data|
|
392
|
+
stderr += data
|
393
|
+
end
|
394
|
+
|
380
395
|
ch.on_request "exit-status" do |ichannel, data|
|
381
396
|
exit_status = [exit_status, data.read_long].max
|
382
397
|
end
|
@@ -32,8 +32,8 @@ class Chef::Provider::Service::Arch < Chef::Provider::Service::Init
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def load_current_resource
|
35
|
-
raise Chef::Exceptions::Service, "Could not find /etc/rc.conf" unless ::File.
|
36
|
-
raise Chef::Exceptions::Service, "No DAEMONS found in /etc/rc.conf" unless ::File.read("/etc/rc.conf")
|
35
|
+
raise Chef::Exceptions::Service, "Could not find /etc/rc.conf" unless ::File.exist?("/etc/rc.conf")
|
36
|
+
raise Chef::Exceptions::Service, "No DAEMONS found in /etc/rc.conf" unless /DAEMONS=\((.*)\)/m.match?(::File.read("/etc/rc.conf"))
|
37
37
|
|
38
38
|
super
|
39
39
|
|
@@ -45,7 +45,7 @@ class Chef
|
|
45
45
|
shared_resource_requirements
|
46
46
|
requirements.assert(:all_actions) do |a|
|
47
47
|
update_rcd = "/usr/sbin/update-rc.d"
|
48
|
-
a.assertion { ::File.
|
48
|
+
a.assertion { ::File.exist? update_rcd }
|
49
49
|
a.failure_message Chef::Exceptions::Service, "#{update_rcd} does not exist!"
|
50
50
|
# no whyrun recovery - this is a base system component of debian
|
51
51
|
# distros and must be present
|
@@ -34,7 +34,7 @@ class Chef::Provider::Service::Gentoo < Chef::Provider::Service::Init
|
|
34
34
|
@current_resource.enabled(
|
35
35
|
Dir.glob("/etc/runlevels/**/#{Chef::Util::PathHelper.escape_glob_dir(@current_resource.service_name)}").any? do |file|
|
36
36
|
@found_script = true
|
37
|
-
exists = ::File.
|
37
|
+
exists = ::File.exist? file
|
38
38
|
readable = ::File.readable? file
|
39
39
|
logger.trace "#{@new_resource} exists: #{exists}, readable: #{readable}"
|
40
40
|
exists && readable
|
@@ -47,7 +47,7 @@ class Chef::Provider::Service::Gentoo < Chef::Provider::Service::Init
|
|
47
47
|
|
48
48
|
def define_resource_requirements
|
49
49
|
requirements.assert(:all_actions) do |a|
|
50
|
-
a.assertion { ::File.
|
50
|
+
a.assertion { ::File.exist?("/sbin/rc-update") }
|
51
51
|
a.failure_message Chef::Exceptions::Service, "/sbin/rc-update does not exist"
|
52
52
|
# no whyrun recovery -t his is a core component whose presence is
|
53
53
|
# unlikely to be affected by what we do in the course of a chef run
|
@@ -84,7 +84,7 @@ class Chef
|
|
84
84
|
end
|
85
85
|
|
86
86
|
requirements.assert(:all_actions) do |a|
|
87
|
-
a.assertion { ::File.
|
87
|
+
a.assertion { ::File.exist?(@plist.to_s) }
|
88
88
|
a.failure_message Chef::Exceptions::Service,
|
89
89
|
"Could not find plist for #{@new_resource}"
|
90
90
|
end
|
@@ -215,7 +215,7 @@ class Chef
|
|
215
215
|
return nil if @plist.nil?
|
216
216
|
|
217
217
|
# Plist must exist by this point
|
218
|
-
raise Chef::Exceptions::FileNotFound, "Cannot find #{@plist}!" unless ::File.
|
218
|
+
raise Chef::Exceptions::FileNotFound, "Cannot find #{@plist}!" unless ::File.exist?(@plist)
|
219
219
|
|
220
220
|
# Most services have the same internal label as the name of the
|
221
221
|
# plist file. However, there is no rule saying that *has* to be
|
@@ -132,7 +132,7 @@ class Chef
|
|
132
132
|
end
|
133
133
|
|
134
134
|
def update_rcl(value)
|
135
|
-
FileUtils.touch RC_CONF_LOCAL_PATH unless ::File.
|
135
|
+
FileUtils.touch RC_CONF_LOCAL_PATH unless ::File.exist? RC_CONF_LOCAL_PATH
|
136
136
|
::File.write(RC_CONF_LOCAL_PATH, value)
|
137
137
|
@rc_conf_local = value
|
138
138
|
end
|
@@ -56,7 +56,7 @@ class Chef
|
|
56
56
|
|
57
57
|
requirements.assert(:all_actions) do |a|
|
58
58
|
chkconfig_file = "/sbin/chkconfig"
|
59
|
-
a.assertion { ::File.
|
59
|
+
a.assertion { ::File.exist? chkconfig_file }
|
60
60
|
a.failure_message Chef::Exceptions::Service, "#{chkconfig_file} does not exist!"
|
61
61
|
end
|
62
62
|
|
@@ -80,7 +80,7 @@ class Chef
|
|
80
80
|
|
81
81
|
super
|
82
82
|
|
83
|
-
if ::File.
|
83
|
+
if ::File.exist?("/sbin/chkconfig")
|
84
84
|
chkconfig = shell_out!("/sbin/chkconfig --list #{current_resource.service_name}", returns: [0, 1])
|
85
85
|
unless run_levels.nil? || run_levels.empty?
|
86
86
|
all_levels_match = true
|
@@ -135,7 +135,7 @@ class Chef
|
|
135
135
|
end
|
136
136
|
end
|
137
137
|
# Get enabled/disabled state by reading job configuration file
|
138
|
-
if ::File.
|
138
|
+
if ::File.exist?("#{@upstart_job_dir}/#{@new_resource.service_name}#{@upstart_conf_suffix}")
|
139
139
|
logger.trace("#{@new_resource} found #{@upstart_job_dir}/#{@new_resource.service_name}#{@upstart_conf_suffix}")
|
140
140
|
::File.open("#{@upstart_job_dir}/#{@new_resource.service_name}#{@upstart_conf_suffix}", "r") do |file|
|
141
141
|
while line = file.gets
|
@@ -67,8 +67,7 @@ class Chef
|
|
67
67
|
def updated_ec2_config_xml
|
68
68
|
begin
|
69
69
|
require "rexml/document" unless defined?(REXML::Document)
|
70
|
-
|
71
|
-
config = REXML::Document.new(::File.read(config_file))
|
70
|
+
config = REXML::Document.new(::File.read(WINDOWS_EC2_CONFIG))
|
72
71
|
# find an element named State with a sibling element whose value is Ec2SetComputerName
|
73
72
|
REXML::XPath.each(config, "//Plugin/State[../Name/text() = 'Ec2SetComputerName']") do |element|
|
74
73
|
element.text = "Disabled"
|
@@ -220,35 +219,36 @@ class Chef
|
|
220
219
|
end
|
221
220
|
|
222
221
|
else # windows
|
222
|
+
WINDOWS_EC2_CONFIG = 'C:\Program Files\Amazon\Ec2ConfigService\Settings\config.xml'.freeze
|
223
|
+
|
223
224
|
raise "Windows hostnames cannot contain a period." if new_resource.hostname.match?(/\./)
|
224
225
|
|
225
226
|
# suppress EC2 config service from setting our hostname
|
226
|
-
if ::File.exist?(
|
227
|
+
if ::File.exist?(WINDOWS_EC2_CONFIG)
|
227
228
|
xml_contents = updated_ec2_config_xml
|
228
229
|
if xml_contents.empty?
|
229
230
|
Chef::Log.warn('Unable to properly parse and update C:\Program Files\Amazon\Ec2ConfigService\Settings\config.xml contents. Skipping file update.')
|
230
231
|
else
|
231
|
-
|
232
|
+
file WINDOWS_EC2_CONFIG do
|
232
233
|
content xml_contents
|
233
234
|
end
|
234
235
|
end
|
235
236
|
end
|
236
237
|
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
not_if { Socket.gethostbyname(Socket.gethostname).first == new_resource.hostname }
|
245
|
-
end
|
238
|
+
unless Socket.gethostbyname(Socket.gethostname).first == new_resource.hostname
|
239
|
+
converge_by "set hostname to #{new_resource.hostname}" do
|
240
|
+
powershell_out! <<~EOH
|
241
|
+
$sysInfo = Get-WmiObject -Class Win32_ComputerSystem
|
242
|
+
$sysInfo.Rename("#{new_resource.hostname}")
|
243
|
+
EOH
|
244
|
+
end
|
246
245
|
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
246
|
+
# reboot because $windows
|
247
|
+
reboot "setting hostname" do
|
248
|
+
reason "#{Chef::Dist::PRODUCT} updated system hostname"
|
249
|
+
only_if { new_resource.windows_reboot }
|
250
|
+
action :request_reboot
|
251
|
+
end
|
252
252
|
end
|
253
253
|
end
|
254
254
|
end
|
data/lib/chef/resource/sudo.rb
CHANGED
@@ -228,7 +228,7 @@ class Chef
|
|
228
228
|
end
|
229
229
|
|
230
230
|
def visudo_content(path)
|
231
|
-
if ::File.
|
231
|
+
if ::File.exist?(path)
|
232
232
|
"cat #{new_resource.config_prefix}/sudoers | #{new_resource.visudo_binary} -cf - && #{new_resource.visudo_binary} -cf %{path}"
|
233
233
|
else
|
234
234
|
"cat #{new_resource.config_prefix}/sudoers %{path} | #{new_resource.visudo_binary} -cf -"
|
@@ -163,8 +163,12 @@ class Chef
|
|
163
163
|
|
164
164
|
# @return [Array] features the user has requested to install which need installation
|
165
165
|
def features_to_install
|
166
|
-
# the intersection of the features to install & disabled features are what needs installing
|
167
|
-
@
|
166
|
+
# the intersection of the features to install & disabled/removed features are what needs installing
|
167
|
+
@features_to_install ||= begin
|
168
|
+
features = node["powershell_features_cache"]["disabled"]
|
169
|
+
features |= node["powershell_features_cache"]["removed"] if new_resource.source
|
170
|
+
new_resource.feature_name & features
|
171
|
+
end
|
168
172
|
end
|
169
173
|
|
170
174
|
# @return [Array] features the user has requested to remove which need removing
|
@@ -90,8 +90,9 @@ class Chef
|
|
90
90
|
def font_exists?
|
91
91
|
require "win32ole" if RUBY_PLATFORM =~ /mswin|mingw32|windows/
|
92
92
|
fonts_dir = WIN32OLE.new("WScript.Shell").SpecialFolders("Fonts")
|
93
|
+
fonts_dir_local = Chef::Util::PathHelper.join(ENV["home"], "AppData/Local/Microsoft/Windows/fonts")
|
93
94
|
logger.trace("Seeing if the font at #{Chef::Util::PathHelper.join(fonts_dir, new_resource.font_name)} exists")
|
94
|
-
::File.exist?(Chef::Util::PathHelper.join(fonts_dir, new_resource.font_name))
|
95
|
+
::File.exist?(Chef::Util::PathHelper.join(fonts_dir, new_resource.font_name)) || ::File.exist?(Chef::Util::PathHelper.join(fonts_dir_local, new_resource.font_name))
|
95
96
|
end
|
96
97
|
|
97
98
|
# Parse out the schema provided to us to see if it's one we support via remote_file.
|
data/lib/chef/role.rb
CHANGED
@@ -257,11 +257,11 @@ class Chef
|
|
257
257
|
|
258
258
|
js_path, rb_path = js_files.first, rb_files.first
|
259
259
|
|
260
|
-
if js_path && File.
|
260
|
+
if js_path && File.exist?(js_path)
|
261
261
|
# from_json returns object.class => json_class in the JSON.
|
262
262
|
hsh = Chef::JSONCompat.parse(IO.read(js_path))
|
263
263
|
return from_hash(hsh)
|
264
|
-
elsif rb_path && File.
|
264
|
+
elsif rb_path && File.exist?(rb_path)
|
265
265
|
role = Chef::Role.new
|
266
266
|
role.name(name)
|
267
267
|
role.from_file(rb_path)
|