chef 17.6.18 → 17.7.22
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/Gemfile +5 -0
- data/chef.gemspec +1 -0
- data/lib/chef/chef_fs/file_pattern.rb +1 -1
- data/lib/chef/chef_fs/path_utils.rb +1 -1
- data/lib/chef/data_collector/run_end_message.rb +1 -1
- data/lib/chef/dsl/reboot_pending.rb +1 -1
- data/lib/chef/exceptions.rb +10 -0
- data/lib/chef/provider/cron.rb +4 -1
- data/lib/chef/provider/git.rb +1 -1
- data/lib/chef/provider/ifconfig/debian.rb +1 -1
- data/lib/chef/provider/subversion.rb +5 -5
- data/lib/chef/resource/chocolatey_config.rb +1 -1
- data/lib/chef/resource/chocolatey_feature.rb +1 -1
- data/lib/chef/resource/chocolatey_source.rb +24 -2
- data/lib/chef/resource/directory.rb +1 -1
- data/lib/chef/resource/habitat_install.rb +3 -3
- data/lib/chef/resource/inspec_waiver.rb +1 -1
- data/lib/chef/resource/inspec_waiver_file_entry.rb +1 -1
- data/lib/chef/resource/kernel_module.rb +27 -2
- data/lib/chef/resource/macos_userdefaults.rb +43 -128
- data/lib/chef/resource/windows_auto_run.rb +1 -1
- data/lib/chef/resource/windows_dfs_namespace.rb +2 -2
- data/lib/chef/resource/windows_update_settings.rb +3 -3
- data/lib/chef/resource.rb +1 -1
- data/lib/chef/resource_reporter.rb +1 -1
- data/lib/chef/secret_fetcher/azure_key_vault.rb +62 -8
- data/lib/chef/secret_fetcher.rb +0 -1
- data/lib/chef/version.rb +1 -1
- data/spec/functional/dsl/reboot_pending_spec.rb +3 -3
- data/spec/functional/dsl/registry_helper_spec.rb +1 -1
- data/spec/functional/resource/dsc_script_spec.rb +2 -2
- data/spec/functional/resource/macos_userdefaults_spec.rb +119 -0
- data/spec/functional/resource/registry_spec.rb +81 -81
- data/spec/functional/win32/registry_spec.rb +8 -8
- data/spec/unit/data_collector_spec.rb +24 -1
- data/spec/unit/dsl/reboot_pending_spec.rb +1 -1
- data/spec/unit/mixin/default_paths_spec.rb +1 -1
- data/spec/unit/mixin/securable_spec.rb +3 -3
- data/spec/unit/provider/cron_spec.rb +45 -0
- data/spec/unit/provider/package/rubygems_spec.rb +5 -5
- data/spec/unit/provider/package/windows_spec.rb +1 -1
- data/spec/unit/provider/registry_key_spec.rb +4 -4
- data/spec/unit/provider/service/windows_spec.rb +5 -5
- data/spec/unit/provider/subversion_spec.rb +4 -4
- data/spec/unit/provider/windows_env_spec.rb +1 -1
- data/spec/unit/provider/zypper_repository_spec.rb +1 -1
- data/spec/unit/resource/chocolatey_config_spec.rb +1 -1
- data/spec/unit/resource/chocolatey_feature_spec.rb +1 -1
- data/spec/unit/resource/chocolatey_source_spec.rb +1 -1
- data/spec/unit/resource/kernel_module_spec.rb +2 -1
- data/spec/unit/resource/macos_user_defaults_spec.rb +36 -96
- data/spec/unit/resource/registry_key_spec.rb +10 -10
- data/spec/unit/resource/windows_auto_run_spec.rb +1 -1
- data/spec/unit/resource/windows_feature_powershell_spec.rb +1 -1
- data/spec/unit/resource/windows_firewall_rule_spec.rb +2 -2
- data/spec/unit/resource/windows_task_spec.rb +3 -3
- data/spec/unit/resource_reporter_spec.rb +2 -2
- data/spec/unit/resource_spec.rb +5 -0
- data/spec/unit/secret_fetcher/azure_key_vault_spec.rb +99 -20
- data/spec/unit/util/backup_spec.rb +1 -1
- data/spec/unit/win32/registry_spec.rb +3 -3
- metadata +21 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 830ef86569d7fc3510b6428198eaf8f6befb9473f808af1f77ae7d1e95171fb7
|
4
|
+
data.tar.gz: 58d92cc9852026920805cb37699360c2f13edf4f8404839c8ab0ba5de1e54f21
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f07a07a8726c05f0b967e65f391388b7206b6590d598360b2aac3d26e48c773573366153d58dcf1392cbffc4552ed1756096d243ed2d076820d10394999abdb3
|
7
|
+
data.tar.gz: 8c6a775624f533de9112b3c77cae54ba033e94faca6a87fd0c44c7772a64e2f4f981c550813f2deb6c8bf1326adc33877fc15e4fb1d16a65ab98ec6f20297bde
|
data/Gemfile
CHANGED
@@ -39,6 +39,11 @@ group(:ruby_shadow) do
|
|
39
39
|
gem "ruby-shadow", git: "https://github.com/chef/ruby-shadow", branch: "lcg/ruby-3.0", platforms: :ruby
|
40
40
|
end
|
41
41
|
|
42
|
+
# deps that cannot be put in the knife gem because they require a compiler and fail on windows nodes
|
43
|
+
group(:knife_windows_deps) do
|
44
|
+
gem "ed25519", "~> 1.2" # ed25519 ssh key support
|
45
|
+
end
|
46
|
+
|
42
47
|
group(:development, :test) do
|
43
48
|
gem "rake"
|
44
49
|
gem "rspec"
|
data/chef.gemspec
CHANGED
@@ -52,6 +52,7 @@ Gem::Specification.new do |s|
|
|
52
52
|
s.add_dependency "addressable"
|
53
53
|
s.add_dependency "syslog-logger", "~> 1.6"
|
54
54
|
s.add_dependency "uuidtools", ">= 2.1.5", "< 3.0" # osx_profile resource
|
55
|
+
s.add_dependency "corefoundation", "~> 0.3.4" # macos_userdefaults resource
|
55
56
|
|
56
57
|
s.add_dependency "proxifier", "~> 1.0"
|
57
58
|
|
@@ -128,7 +128,7 @@ class Chef
|
|
128
128
|
|
129
129
|
if new_resource.cookbook_name
|
130
130
|
hash["cookbook_name"] = new_resource.cookbook_name
|
131
|
-
hash["cookbook_version"] = new_resource.cookbook_version
|
131
|
+
hash["cookbook_version"] = new_resource.cookbook_version&.version
|
132
132
|
hash["recipe_name"] = new_resource.recipe_name
|
133
133
|
end
|
134
134
|
|
@@ -37,7 +37,7 @@ class Chef
|
|
37
37
|
# due to a file being in use (usually a temporary file and a system file)
|
38
38
|
# \??\c:\temp\test.sys!\??\c:\winnt\system32\test.sys
|
39
39
|
# http://technet.microsoft.com/en-us/library/cc960241.aspx
|
40
|
-
registry_value_exists?(
|
40
|
+
registry_value_exists?("HKLM\\SYSTEM\\CurrentControlSet\\Control\\Session Manager", { name: "PendingFileRenameOperations" }) ||
|
41
41
|
|
42
42
|
# RebootRequired key contains Update IDs with a value of 1 if they require a reboot.
|
43
43
|
# The existence of RebootRequired alone is sufficient on my Windows 8.1 workstation in Windows Update
|
data/lib/chef/exceptions.rb
CHANGED
@@ -308,6 +308,16 @@ class Chef
|
|
308
308
|
super("No secret service provided. Supported services are: :#{fetcher_service_names.join(" :")}")
|
309
309
|
end
|
310
310
|
end
|
311
|
+
|
312
|
+
class Azure
|
313
|
+
class IdentityNotFound < RuntimeError
|
314
|
+
def initialize
|
315
|
+
super("The managed identity could not be found. This could mean one of the following things:\n\n" \
|
316
|
+
" 1. The VM has no system or user assigned identities.\n" \
|
317
|
+
" 2. The managed identity object_id or client_id that was specified is not assigned to the VM.\n")
|
318
|
+
end
|
319
|
+
end
|
320
|
+
end
|
311
321
|
end
|
312
322
|
|
313
323
|
# Exception class for collecting multiple failures. Used when running
|
data/lib/chef/provider/cron.rb
CHANGED
@@ -100,7 +100,10 @@ class Chef
|
|
100
100
|
newcron = get_crontab_entry
|
101
101
|
|
102
102
|
if @cron_exists
|
103
|
-
|
103
|
+
# Only compare the crontab if the current resource has a set command.
|
104
|
+
# This may not be set in cases where the Chef comment exists but the
|
105
|
+
# crontab command was commented out.
|
106
|
+
if current_resource.property_is_set?(:command) && !cron_different?
|
104
107
|
logger.debug("#{new_resource}: Skipping existing cron entry")
|
105
108
|
return
|
106
109
|
end
|
data/lib/chef/provider/git.rb
CHANGED
@@ -87,7 +87,7 @@ iface <%= new_resource.device %> <%= new_resource.family %> static
|
|
87
87
|
directory INTERFACES_DOT_D_DIR
|
88
88
|
|
89
89
|
# roll our own file_edit resource, this will not get reported until we have a file_edit resource
|
90
|
-
interfaces_dot_d_for_regexp = INTERFACES_DOT_D_DIR.gsub(/\./,
|
90
|
+
interfaces_dot_d_for_regexp = INTERFACES_DOT_D_DIR.gsub(/\./, "\\.") # escape dots for the regexp
|
91
91
|
regexp = %r{^\s*source\s+#{interfaces_dot_d_for_regexp}/\*\s*$}
|
92
92
|
|
93
93
|
return if ::File.exist?(INTERFACES_FILE) && regexp.match(IO.read(INTERFACES_FILE))
|
@@ -58,7 +58,7 @@ class Chef
|
|
58
58
|
action :checkout, description: "Clone or check out the source. When a checkout is available, this provider does nothing." do
|
59
59
|
if target_dir_non_existent_or_empty?
|
60
60
|
converge_by("perform checkout of #{new_resource.repository} into #{new_resource.destination}") do
|
61
|
-
shell_out!(checkout_command, run_options)
|
61
|
+
shell_out!(checkout_command, **run_options)
|
62
62
|
end
|
63
63
|
else
|
64
64
|
logger.debug "#{new_resource} checkout destination #{new_resource.destination} already exists or is a non-empty directory - nothing to do"
|
@@ -75,7 +75,7 @@ class Chef
|
|
75
75
|
|
76
76
|
action :force_export, description: "Export the source, excluding or removing any version control artifacts and force an export of the source that is overwriting the existing copy (if it exists)." do
|
77
77
|
converge_by("export #{new_resource.repository} into #{new_resource.destination}") do
|
78
|
-
shell_out!(export_command, run_options)
|
78
|
+
shell_out!(export_command, **run_options)
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
@@ -86,7 +86,7 @@ class Chef
|
|
86
86
|
logger.trace "#{new_resource} current revision: #{current_rev} target revision: #{revision_int}"
|
87
87
|
unless current_revision_matches_target_revision?
|
88
88
|
converge_by("sync #{new_resource.destination} from #{new_resource.repository}") do
|
89
|
-
shell_out!(sync_command, run_options)
|
89
|
+
shell_out!(sync_command, **run_options)
|
90
90
|
logger.info "#{new_resource} updated to revision: #{revision_int}"
|
91
91
|
end
|
92
92
|
end
|
@@ -125,7 +125,7 @@ class Chef
|
|
125
125
|
new_resource.revision
|
126
126
|
else
|
127
127
|
command = scm(:info, new_resource.repository, new_resource.svn_info_args, authentication, "-r#{new_resource.revision}")
|
128
|
-
svn_info = shell_out!(command, run_options(cwd: cwd, returns: [0, 1])).stdout
|
128
|
+
svn_info = shell_out!(command, **run_options(cwd: cwd, returns: [0, 1])).stdout
|
129
129
|
|
130
130
|
extract_revision_info(svn_info)
|
131
131
|
end
|
@@ -137,7 +137,7 @@ class Chef
|
|
137
137
|
return nil unless ::File.exist?(::File.join(new_resource.destination, ".svn"))
|
138
138
|
|
139
139
|
command = scm(:info)
|
140
|
-
svn_info = shell_out!(command, run_options(cwd: cwd, returns: [0, 1])).stdout
|
140
|
+
svn_info = shell_out!(command, **run_options(cwd: cwd, returns: [0, 1])).stdout
|
141
141
|
|
142
142
|
extract_revision_info(svn_info)
|
143
143
|
end
|
@@ -21,7 +21,7 @@ class Chef
|
|
21
21
|
|
22
22
|
provides :chocolatey_config
|
23
23
|
|
24
|
-
description "Use the **chocolatey_config** resource to add or remove Chocolatey configuration keys."
|
24
|
+
description "Use the **chocolatey_config** resource to add or remove Chocolatey configuration keys. Note: The Chocolatey package manager is not installed on Windows by default. You will need to install it prior to using this resource by adding the [Chocolatey cookbook](https://supermarket.chef.io/cookbooks/chocolatey/) to your node's run list."
|
25
25
|
introduced "14.3"
|
26
26
|
examples <<~DOC
|
27
27
|
**Set the Chocolatey cacheLocation config**:
|
@@ -20,7 +20,7 @@ class Chef
|
|
20
20
|
unified_mode true
|
21
21
|
provides :chocolatey_feature
|
22
22
|
|
23
|
-
description "Use the **chocolatey_feature** resource to enable and disable Chocolatey features."
|
23
|
+
description "Use the **chocolatey_feature** resource to enable and disable Chocolatey features. Note: The Chocolatey package manager is not installed on Windows by default. You will need to install it prior to using this resource by adding the [Chocolatey cookbook](https://supermarket.chef.io/cookbooks/chocolatey/) to your node's run list."
|
24
24
|
introduced "15.1"
|
25
25
|
examples <<~DOC
|
26
26
|
**Enable the checksumFiles Chocolatey feature**
|
@@ -20,7 +20,7 @@ class Chef
|
|
20
20
|
unified_mode true
|
21
21
|
provides :chocolatey_source
|
22
22
|
|
23
|
-
description "Use the **chocolatey_source** resource to add, remove, enable, or disable Chocolatey sources."
|
23
|
+
description "Use the **chocolatey_source** resource to add, remove, enable, or disable Chocolatey sources. Note: The Chocolatey package manager is not installed on Windows by default. You will need to install it prior to using this resource by adding the [Chocolatey cookbook](https://supermarket.chef.io/cookbooks/chocolatey/) to your node's run list."
|
24
24
|
introduced "14.3"
|
25
25
|
examples <<~DOC
|
26
26
|
**Add a Chocolatey source**
|
@@ -63,6 +63,22 @@ class Chef
|
|
63
63
|
|
64
64
|
property :disabled, [TrueClass, FalseClass], default: false, desired_state: false, skip_docs: true
|
65
65
|
|
66
|
+
property :username, String,
|
67
|
+
description: "The username to use when authenticating against the source",
|
68
|
+
introduced: "17.7"
|
69
|
+
|
70
|
+
property :password, String, sensitive: true, desired_state: false,
|
71
|
+
description: "The password to use when authenticating against the source",
|
72
|
+
introduced: "17.7"
|
73
|
+
|
74
|
+
property :cert, String,
|
75
|
+
description: "The certificate to use when authenticating against the source",
|
76
|
+
introduced: "17.7"
|
77
|
+
|
78
|
+
property :cert_password, String, sensitive: true, desired_state: false,
|
79
|
+
description: "The password for the certificate to use when authenticating against the source",
|
80
|
+
introduced: "17.7"
|
81
|
+
|
66
82
|
load_current_value do
|
67
83
|
element = fetch_source_element(source_name)
|
68
84
|
current_value_does_not_exist! if element.nil?
|
@@ -74,6 +90,8 @@ class Chef
|
|
74
90
|
allow_self_service element["selfService"] == "true"
|
75
91
|
priority element["priority"].to_i
|
76
92
|
disabled element["disabled"] == "true"
|
93
|
+
username element["user"]
|
94
|
+
cert element["certificate"]
|
77
95
|
end
|
78
96
|
|
79
97
|
# @param [String] id the source name
|
@@ -129,10 +147,14 @@ class Chef
|
|
129
147
|
def choco_cmd(action)
|
130
148
|
cmd = "#{ENV["ALLUSERSPROFILE"]}\\chocolatey\\bin\\choco source #{action} -n \"#{new_resource.source_name}\""
|
131
149
|
if action == "add"
|
132
|
-
cmd << "
|
150
|
+
cmd << " --source=\"#{new_resource.source}\" --priority=#{new_resource.priority}"
|
133
151
|
cmd << " --bypassproxy" if new_resource.bypass_proxy
|
134
152
|
cmd << " --allowselfservice" if new_resource.allow_self_service
|
135
153
|
cmd << " --adminonly" if new_resource.admin_only
|
154
|
+
cmd << " --user=\"#{new_resource.username}\"" if new_resource.username
|
155
|
+
cmd << " --password=\"#{new_resource.password}\"" if new_resource.password
|
156
|
+
cmd << " --cert=\"#{new_resource.cert}\"" if new_resource.cert
|
157
|
+
cmd << " --certpassword=\"#{new_resource.cert_password}\"" if new_resource.cert_password
|
136
158
|
end
|
137
159
|
cmd
|
138
160
|
end
|
@@ -46,7 +46,7 @@ class Chef
|
|
46
46
|
description: "The path to the directory. Using a fully qualified path is recommended, but is not always required."
|
47
47
|
|
48
48
|
property :recursive, [ TrueClass, FalseClass ],
|
49
|
-
description: "Create or delete
|
49
|
+
description: "Create parent directories recursively, or delete directory and all children recursively. For the owner, group, and mode properties, the value of this property applies only to the leaf directory.",
|
50
50
|
default: false
|
51
51
|
end
|
52
52
|
end
|
@@ -95,10 +95,10 @@ class Chef
|
|
95
95
|
path habfile
|
96
96
|
destination "#{Chef::Config[:file_cache_path]}/habitat"
|
97
97
|
action :extract
|
98
|
-
not_if { ::Dir.exist?(
|
98
|
+
not_if { ::Dir.exist?("c:\\habitat") }
|
99
99
|
end
|
100
100
|
|
101
|
-
directory
|
101
|
+
directory "c:\\habitat" do
|
102
102
|
notifies :run, "powershell_script[installing from archive]", :immediately
|
103
103
|
end
|
104
104
|
|
@@ -110,7 +110,7 @@ class Chef
|
|
110
110
|
end
|
111
111
|
|
112
112
|
# TODO: This won't self heal if missing until the next upgrade
|
113
|
-
windows_path
|
113
|
+
windows_path "C:\\habitat" do
|
114
114
|
action :add
|
115
115
|
end
|
116
116
|
else
|
@@ -116,7 +116,7 @@ class Chef
|
|
116
116
|
description: "The expiration date of the waiver - provided in YYYY-MM-DD format",
|
117
117
|
callbacks: {
|
118
118
|
"Expiration date should be a valid calendar date and match the following format: YYYY-MM-DD" => proc { |e|
|
119
|
-
re = Regexp.new(
|
119
|
+
re = Regexp.new("\\d{4}-\\d{2}-\\d{2}$").freeze
|
120
120
|
if re.match?(e)
|
121
121
|
Date.valid_date?(*e.split("-").map(&:to_i))
|
122
122
|
else
|
@@ -74,7 +74,7 @@ class Chef
|
|
74
74
|
description: "The expiration date of the given waiver - provided in YYYY-MM-DD format",
|
75
75
|
callbacks: {
|
76
76
|
"Expiration date should be a valid calendar date and match the following format: YYYY-MM-DD" => proc { |e|
|
77
|
-
re = Regexp.new(
|
77
|
+
re = Regexp.new("\\d{4}-\\d{2}-\\d{2}$").freeze
|
78
78
|
if re.match?(e)
|
79
79
|
Date.valid_date?(*e.split("-").map(&:to_i))
|
80
80
|
else
|
@@ -15,7 +15,7 @@ class Chef
|
|
15
15
|
|
16
16
|
provides :kernel_module
|
17
17
|
|
18
|
-
description "Use the **kernel_module** resource to manage kernel modules on Linux systems. This resource can load, unload, blacklist, disable, install, and uninstall modules."
|
18
|
+
description "Use the **kernel_module** resource to manage kernel modules on Linux systems. This resource can load, unload, blacklist, disable, enable, install, and uninstall modules."
|
19
19
|
introduced "14.3"
|
20
20
|
examples <<~DOC
|
21
21
|
Install and load a kernel module, and ensure it loads on reboot.
|
@@ -68,13 +68,21 @@ class Chef
|
|
68
68
|
end
|
69
69
|
```
|
70
70
|
|
71
|
-
Disable a kernel module.
|
71
|
+
Disable a kernel module so that it is not installable.
|
72
72
|
|
73
73
|
```ruby
|
74
74
|
kernel_module 'loop' do
|
75
75
|
action :disable
|
76
76
|
end
|
77
77
|
```
|
78
|
+
|
79
|
+
Enable a kernel module so that it is can be installed. Does not load or install.
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
kernel_module 'loop' do
|
83
|
+
action :enable
|
84
|
+
end
|
85
|
+
```
|
78
86
|
DOC
|
79
87
|
|
80
88
|
property :modname, String,
|
@@ -101,6 +109,9 @@ class Chef
|
|
101
109
|
end
|
102
110
|
end
|
103
111
|
|
112
|
+
# Remove the "disable file" before trying to install
|
113
|
+
action_enable
|
114
|
+
|
104
115
|
# create options file before loading the module
|
105
116
|
unless new_resource.options.nil?
|
106
117
|
file "#{new_resource.unload_dir}/options_#{new_resource.modname}.conf" do
|
@@ -178,6 +189,20 @@ class Chef
|
|
178
189
|
action_unload
|
179
190
|
end
|
180
191
|
|
192
|
+
action :enable, description: "Enable a kernel module. Reverse :disable actions" do
|
193
|
+
with_run_context :root do
|
194
|
+
find_resource(:execute, "update initramfs") do
|
195
|
+
command initramfs_command
|
196
|
+
action :nothing
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
file "#{new_resource.unload_dir}/disable_#{new_resource.modname}.conf" do
|
201
|
+
action :delete
|
202
|
+
notifies :run, "execute[update initramfs]", :delayed
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
181
206
|
action :load, description: "Load a kernel module." do
|
182
207
|
unless module_loaded?
|
183
208
|
converge_by("load kernel module #{new_resource.modname}") do
|
@@ -78,172 +78,87 @@ class Chef
|
|
78
78
|
required: true
|
79
79
|
|
80
80
|
property :host, [String, Symbol],
|
81
|
-
description: "Set either :current or a hostname to set the user default at the host level.",
|
81
|
+
description: "Set either :current, :all or a hostname to set the user default at the host level.",
|
82
82
|
desired_state: false,
|
83
|
-
introduced: "16.3"
|
83
|
+
introduced: "16.3",
|
84
|
+
coerce: proc { |value| to_cf_host(value) }
|
84
85
|
|
85
86
|
property :value, [Integer, Float, String, TrueClass, FalseClass, Hash, Array],
|
86
87
|
description: "The value of the key. Note: With the `type` property set to `bool`, `String` forms of Boolean true/false values that Apple accepts in the defaults command will be coerced: 0/1, 'TRUE'/'FALSE,' 'true'/false', 'YES'/'NO', or 'yes'/'no'.",
|
87
|
-
required: [:write]
|
88
|
-
coerce: proc { |v| v.is_a?(Hash) ? v.transform_keys(&:to_s) : v } # make sure keys are all strings for comparison
|
88
|
+
required: [:write]
|
89
89
|
|
90
90
|
property :type, String,
|
91
91
|
description: "The value type of the preference key.",
|
92
92
|
equal_to: %w{bool string int float array dict},
|
93
|
-
desired_state: false
|
93
|
+
desired_state: false,
|
94
|
+
deprecated: true
|
94
95
|
|
95
|
-
property :user, String,
|
96
|
-
description: "The system user that the default will be applied to.",
|
97
|
-
desired_state: false
|
96
|
+
property :user, [String, Symbol],
|
97
|
+
description: "The system user that the default will be applied to. Set :current for current user, :all for all users or pass a valid username",
|
98
|
+
desired_state: false,
|
99
|
+
coerce: proc { |value| to_cf_user(value) }
|
98
100
|
|
99
101
|
property :sudo, [TrueClass, FalseClass],
|
100
102
|
description: "Set to true if the setting you wish to modify requires privileged access. This requires passwordless sudo for the `/usr/bin/defaults` command to be setup for the user running #{ChefUtils::Dist::Infra::PRODUCT}.",
|
101
103
|
default: false,
|
102
|
-
desired_state: false
|
104
|
+
desired_state: false,
|
105
|
+
deprecated: true
|
103
106
|
|
104
107
|
load_current_value do |new_resource|
|
105
|
-
Chef::Log.debug "#load_current_value:
|
106
|
-
state = shell_out(defaults_export_cmd(new_resource), user: new_resource.user)
|
107
|
-
|
108
|
-
if state.error? || state.stdout.empty?
|
109
|
-
Chef::Log.debug "#load_current_value: #{defaults_export_cmd(new_resource).join(" ")} returned stdout: #{state.stdout} and stderr: #{state.stderr}"
|
110
|
-
current_value_does_not_exist!
|
111
|
-
end
|
112
|
-
|
113
|
-
plist_data = ::Plist.parse_xml(state.stdout)
|
114
|
-
|
115
|
-
# handle the situation where the key doesn't exist in the domain
|
116
|
-
if plist_data.key?(new_resource.key)
|
117
|
-
key new_resource.key
|
118
|
-
else
|
119
|
-
current_value_does_not_exist!
|
120
|
-
end
|
108
|
+
Chef::Log.debug "#load_current_value: attempting to read \"#{new_resource.domain}\" value from preferences to determine state"
|
121
109
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
#
|
126
|
-
# The defaults command to export a domain
|
127
|
-
#
|
128
|
-
# @return [Array] defaults command
|
129
|
-
#
|
130
|
-
def defaults_export_cmd(resource)
|
131
|
-
state_cmd = ["/usr/bin/defaults"]
|
132
|
-
|
133
|
-
if resource.host == "current"
|
134
|
-
state_cmd.concat(["-currentHost"])
|
135
|
-
elsif resource.host # they specified a non-nil value, which is a hostname
|
136
|
-
state_cmd.concat(["-host", resource.host])
|
137
|
-
end
|
110
|
+
pref = get_preference(new_resource)
|
111
|
+
current_value_does_not_exist! if pref.nil?
|
138
112
|
|
139
|
-
|
140
|
-
|
113
|
+
key new_resource.key
|
114
|
+
value pref
|
141
115
|
end
|
142
116
|
|
143
117
|
action :write, description: "Write the value to the specified domain/key." do
|
144
118
|
converge_if_changed do
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
shell_out!(cmd, user: new_resource.user)
|
119
|
+
Chef::Log.debug("Updating defaults value for #{new_resource.key} in #{new_resource.domain}")
|
120
|
+
CF::Preferences.set!(new_resource.key, new_resource.value, new_resource.domain, new_resource.user, new_resource.host)
|
149
121
|
end
|
150
122
|
end
|
151
123
|
|
152
124
|
action :delete, description: "Delete a key from a domain." do
|
153
125
|
# if it's not there there's nothing to remove
|
154
|
-
return
|
126
|
+
return if current_resource.nil?
|
155
127
|
|
156
128
|
converge_by("delete domain:#{new_resource.domain} key:#{new_resource.key}") do
|
157
|
-
|
158
|
-
|
159
|
-
Chef::Log.debug("Removing defaults key by shelling out: #{cmd.join(" ")}")
|
160
|
-
|
161
|
-
shell_out!(cmd, user: new_resource.user)
|
129
|
+
Chef::Log.debug("Removing defaults key: #{new_resource.key}")
|
130
|
+
CF::Preferences.set!(new_resource.key, nil, new_resource.domain, new_resource.user, new_resource.host)
|
162
131
|
end
|
163
132
|
end
|
164
133
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
#
|
169
|
-
# @return [Array] Array representation of defaults command to run
|
170
|
-
#
|
171
|
-
def defaults_modify_cmd
|
172
|
-
cmd = ["/usr/bin/defaults"]
|
173
|
-
|
174
|
-
if new_resource.host == :current
|
175
|
-
cmd.concat(["-currentHost"])
|
176
|
-
elsif new_resource.host # they specified a non-nil value, which is a hostname
|
177
|
-
cmd.concat(["-host", new_resource.host])
|
178
|
-
end
|
134
|
+
def get_preference(new_resource)
|
135
|
+
CF::Preferences.get(new_resource.key, new_resource.domain, new_resource.user, new_resource.host)
|
136
|
+
end
|
179
137
|
|
180
|
-
|
181
|
-
|
182
|
-
cmd.prepend("sudo") if new_resource.sudo
|
183
|
-
cmd
|
184
|
-
end
|
138
|
+
action_class do
|
139
|
+
require "corefoundation" if RUBY_PLATFORM.match?(/darwin/)
|
185
140
|
|
186
|
-
#
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
# when dict this creates an array of values ["Key1", "Value1", "Key2", "Value2" ...]
|
195
|
-
cmd_values = ["-#{type}"]
|
196
|
-
|
197
|
-
case type
|
198
|
-
when "dict"
|
199
|
-
cmd_values.concat(new_resource.value.flatten)
|
200
|
-
when "array"
|
201
|
-
cmd_values.concat(new_resource.value)
|
202
|
-
when "bool"
|
203
|
-
cmd_values.concat(bool_to_defaults_bool(new_resource.value))
|
141
|
+
# Return valid hostname based on the input from host property
|
142
|
+
def to_cf_host(value)
|
143
|
+
case value
|
144
|
+
when :all
|
145
|
+
CF::Preferences::ALL_HOSTS
|
146
|
+
when :current
|
147
|
+
CF::Preferences::CURRENT_HOST
|
204
148
|
else
|
205
|
-
|
149
|
+
value
|
206
150
|
end
|
207
|
-
|
208
|
-
cmd_values
|
209
151
|
end
|
210
152
|
|
211
|
-
#
|
212
|
-
|
213
|
-
#
|
214
|
-
# @param [String, Integer, Boolean] input <description>
|
215
|
-
#
|
216
|
-
# @return [String] TRUE or FALSE
|
217
|
-
#
|
218
|
-
def bool_to_defaults_bool(input)
|
219
|
-
return ["TRUE"] if [true, "TRUE", "1", "true", "YES", "yes"].include?(input)
|
220
|
-
return ["FALSE"] if [false, "FALSE", "0", "false", "NO", "no"].include?(input)
|
221
|
-
|
222
|
-
# make sure it's very clear bad input was given
|
223
|
-
raise ArgumentError, "#{input} cannot be converted to a boolean value for use with Apple's defaults command. Acceptable values are: 'TRUE', 'YES', 'true, 'yes', '0', true, 'FALSE', 'false', 'NO', 'no', '1', or false."
|
224
|
-
end
|
225
|
-
|
226
|
-
#
|
227
|
-
# convert ruby type to defaults type
|
228
|
-
#
|
229
|
-
# @param [Integer, Float, String, TrueClass, FalseClass, Hash, Array] value The value being set
|
230
|
-
#
|
231
|
-
# @return [string, nil] the type value used by defaults or nil if not applicable
|
232
|
-
#
|
233
|
-
def value_type(value)
|
153
|
+
# Return valid username based on the input from user property
|
154
|
+
def to_cf_user(value)
|
234
155
|
case value
|
235
|
-
when
|
236
|
-
|
237
|
-
when
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
when Hash
|
242
|
-
"dict"
|
243
|
-
when Array
|
244
|
-
"array"
|
245
|
-
when String
|
246
|
-
"string"
|
156
|
+
when :all
|
157
|
+
CF::Preferences::ALL_USERS
|
158
|
+
when :current
|
159
|
+
CF::Preferences::CURRENT_USER
|
160
|
+
else
|
161
|
+
value
|
247
162
|
end
|
248
163
|
end
|
249
164
|
end
|
@@ -38,7 +38,7 @@ class Chef
|
|
38
38
|
|
39
39
|
property :full_users, Array,
|
40
40
|
description: "Determines which users should have full access to the share.",
|
41
|
-
default: [
|
41
|
+
default: ["BUILTIN\\administrators"]
|
42
42
|
|
43
43
|
property :change_users, Array,
|
44
44
|
description: "Determines which users should have change access to the share.",
|
@@ -50,7 +50,7 @@ class Chef
|
|
50
50
|
|
51
51
|
property :root, String,
|
52
52
|
description: "The root from which to create the DFS tree. Defaults to C:\\DFSRoots.",
|
53
|
-
default:
|
53
|
+
default: "C:\\DFSRoots"
|
54
54
|
|
55
55
|
action :create, description: "Creates the dfs namespace on the server." do
|
56
56
|
directory file_path do
|
@@ -145,7 +145,7 @@ class Chef
|
|
145
145
|
action :set, description: "Set Windows Update settings." do
|
146
146
|
actual_day = convert_day(new_resource.scheduled_install_day)
|
147
147
|
|
148
|
-
registry_key
|
148
|
+
registry_key "HKEY_LOCAL_MACHINE\\Software\\Policies\\Microsoft\\Windows\\WindowsUpdate" do
|
149
149
|
recursive true
|
150
150
|
values [{
|
151
151
|
name: "DisableOSUpgrade",
|
@@ -180,7 +180,7 @@ class Chef
|
|
180
180
|
action :create
|
181
181
|
end
|
182
182
|
|
183
|
-
registry_key
|
183
|
+
registry_key "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer" do
|
184
184
|
recursive true
|
185
185
|
values [{
|
186
186
|
name: "NoWindowsUpdate",
|
@@ -190,7 +190,7 @@ class Chef
|
|
190
190
|
action :create
|
191
191
|
end
|
192
192
|
|
193
|
-
registry_key
|
193
|
+
registry_key "HKEY_LOCAL_MACHINE\\Software\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU" do
|
194
194
|
recursive true
|
195
195
|
values [{
|
196
196
|
name: "AUOptions",
|
data/lib/chef/resource.rb
CHANGED
@@ -1508,7 +1508,7 @@ class Chef
|
|
1508
1508
|
# @return Chef::CookbookVersion The cookbook in which this Resource was defined.
|
1509
1509
|
#
|
1510
1510
|
def cookbook_version
|
1511
|
-
if cookbook_name
|
1511
|
+
if cookbook_name && cookbook_name != "@recipe_files"
|
1512
1512
|
run_context.cookbook_collection[cookbook_name]
|
1513
1513
|
end
|
1514
1514
|
end
|