chef 15.7.32-universal-mingw32 → 15.8.23-universal-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/chef-universal-mingw32.gemspec +1 -1
- data/lib/chef/dsl/declare_resource.rb +9 -9
- data/lib/chef/knife/client_key_create.rb +4 -1
- data/lib/chef/knife/client_key_delete.rb +4 -1
- data/lib/chef/knife/client_key_edit.rb +4 -1
- data/lib/chef/knife/client_key_list.rb +4 -1
- data/lib/chef/knife/client_key_show.rb +4 -1
- data/lib/chef/knife/config_list_profiles.rb +4 -1
- data/lib/chef/knife/config_use_profile.rb +4 -2
- data/lib/chef/knife/configure.rb +1 -1
- data/lib/chef/knife/cookbook_upload.rb +3 -6
- data/lib/chef/knife/data_bag_from_file.rb +1 -1
- data/lib/chef/knife/exec.rb +4 -1
- data/lib/chef/knife/raw.rb +0 -1
- data/lib/chef/knife/rehash.rb +4 -1
- data/lib/chef/knife/search.rb +1 -1
- data/lib/chef/knife/ssh.rb +3 -3
- data/lib/chef/knife/ssl_check.rb +1 -1
- data/lib/chef/knife/ssl_fetch.rb +1 -1
- data/lib/chef/knife/supermarket_install.rb +1 -1
- data/lib/chef/knife/user_key_create.rb +4 -1
- data/lib/chef/knife/user_key_delete.rb +4 -1
- data/lib/chef/knife/user_key_edit.rb +4 -1
- data/lib/chef/knife/user_key_list.rb +4 -1
- data/lib/chef/knife/user_key_show.rb +4 -1
- data/lib/chef/node/attribute.rb +3 -1
- data/lib/chef/node/common_api.rb +3 -1
- data/lib/chef/provider/ifconfig.rb +13 -4
- data/lib/chef/provider/user/mac.rb +53 -9
- data/lib/chef/resource/notify_group.rb +70 -0
- data/lib/chef/resource/sysctl.rb +26 -2
- data/lib/chef/resource/user/mac_user.rb +4 -1
- data/lib/chef/resource/windows_task.rb +2 -1
- data/lib/chef/resources.rb +2 -1
- data/lib/chef/search/query.rb +1 -1
- data/lib/chef/shell.rb +4 -5
- data/lib/chef/shell/ext.rb +3 -5
- data/lib/chef/version.rb +1 -1
- data/spec/unit/cookbook_uploader_spec.rb +1 -0
- data/spec/unit/knife/cookbook_upload_spec.rb +2 -2
- data/spec/unit/provider/ifconfig_spec.rb +43 -14
- data/spec/unit/resource/notify_group_spec.rb +34 -0
- data/spec/unit/resource/sysctl_spec.rb +23 -1
- data/spec/unit/search/query_spec.rb +8 -1
- metadata +10 -8
@@ -17,7 +17,6 @@
|
|
17
17
|
#
|
18
18
|
|
19
19
|
require_relative "../knife"
|
20
|
-
require_relative "key_delete"
|
21
20
|
|
22
21
|
class Chef
|
23
22
|
class Knife
|
@@ -30,6 +29,10 @@ class Chef
|
|
30
29
|
class UserKeyDelete < Knife
|
31
30
|
banner "knife user key delete USER KEYNAME (options)"
|
32
31
|
|
32
|
+
deps do
|
33
|
+
require_relative "key_delete"
|
34
|
+
end
|
35
|
+
|
33
36
|
attr_reader :actor
|
34
37
|
|
35
38
|
def initialize(argv = [])
|
@@ -17,7 +17,6 @@
|
|
17
17
|
#
|
18
18
|
|
19
19
|
require_relative "../knife"
|
20
|
-
require_relative "key_edit"
|
21
20
|
require_relative "key_edit_base"
|
22
21
|
|
23
22
|
class Chef
|
@@ -33,6 +32,10 @@ class Chef
|
|
33
32
|
|
34
33
|
banner "knife user key edit USER KEYNAME (options)"
|
35
34
|
|
35
|
+
deps do
|
36
|
+
require_relative "key_edit"
|
37
|
+
end
|
38
|
+
|
36
39
|
attr_reader :actor
|
37
40
|
|
38
41
|
def initialize(argv = [])
|
@@ -17,7 +17,6 @@
|
|
17
17
|
#
|
18
18
|
|
19
19
|
require_relative "../knife"
|
20
|
-
require_relative "key_list"
|
21
20
|
require_relative "key_list_base"
|
22
21
|
|
23
22
|
class Chef
|
@@ -33,6 +32,10 @@ class Chef
|
|
33
32
|
|
34
33
|
banner "knife user key list USER (options)"
|
35
34
|
|
35
|
+
deps do
|
36
|
+
require_relative "key_list"
|
37
|
+
end
|
38
|
+
|
36
39
|
attr_reader :actor
|
37
40
|
|
38
41
|
def initialize(argv = [])
|
@@ -17,7 +17,6 @@
|
|
17
17
|
#
|
18
18
|
|
19
19
|
require_relative "../knife"
|
20
|
-
require_relative "key_show"
|
21
20
|
|
22
21
|
class Chef
|
23
22
|
class Knife
|
@@ -30,6 +29,10 @@ class Chef
|
|
30
29
|
class UserKeyShow < Knife
|
31
30
|
banner "knife user key show USER KEYNAME (options)"
|
32
31
|
|
32
|
+
deps do
|
33
|
+
require_relative "key_show"
|
34
|
+
end
|
35
|
+
|
33
36
|
attr_reader :actor
|
34
37
|
|
35
38
|
def initialize(argv = [])
|
data/lib/chef/node/attribute.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#--
|
2
2
|
# Author:: Adam Jacob (<adam@chef.io>)
|
3
3
|
# Author:: AJ Christensen (<aj@chef.io>)
|
4
|
-
# Copyright:: Copyright 2008-
|
4
|
+
# Copyright:: Copyright 2008-2020, Chef Software Inc.
|
5
5
|
# License:: Apache License, Version 2.0
|
6
6
|
#
|
7
7
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -453,6 +453,8 @@ class Chef
|
|
453
453
|
merged_attributes.read(*path)
|
454
454
|
end
|
455
455
|
|
456
|
+
alias :dig :read
|
457
|
+
|
456
458
|
def read!(*path)
|
457
459
|
merged_attributes.read!(*path)
|
458
460
|
end
|
data/lib/chef/node/common_api.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright:: Copyright 2016, Chef Software
|
2
|
+
# Copyright:: Copyright 2016-2020, Chef Software Inc.
|
3
3
|
# License:: Apache License, Version 2.0
|
4
4
|
#
|
5
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -98,6 +98,8 @@ class Chef
|
|
98
98
|
nil
|
99
99
|
end
|
100
100
|
|
101
|
+
alias :dig :read
|
102
|
+
|
101
103
|
# non-autovivifying reader that throws an exception if the attribute does not exist
|
102
104
|
def read!(*path)
|
103
105
|
raise Chef::Exceptions::NoSuchAttribute.new(path.join ".") unless exist?(*path)
|
@@ -39,6 +39,10 @@ class Chef
|
|
39
39
|
attr_accessor :config_template
|
40
40
|
attr_accessor :config_path
|
41
41
|
|
42
|
+
# @api private
|
43
|
+
# @return [String] the major.minor of the net-tools version as a string
|
44
|
+
attr_accessor :ifconfig_version
|
45
|
+
|
42
46
|
def initialize(new_resource, run_context)
|
43
47
|
super(new_resource, run_context)
|
44
48
|
@config_template = nil
|
@@ -54,15 +58,20 @@ class Chef
|
|
54
58
|
@ifconfig_version = nil
|
55
59
|
|
56
60
|
@net_tools_version = shell_out("ifconfig", "--version")
|
61
|
+
@net_tools_version.stdout.each_line do |line|
|
62
|
+
if line =~ /^net-tools (\d+\.\d+)/
|
63
|
+
@ifconfig_version = line.match(/^net-tools (\d+\.\d+)/)[1]
|
64
|
+
end
|
65
|
+
end
|
57
66
|
@net_tools_version.stderr.each_line do |line|
|
58
|
-
if line =~ /^net-tools (\d
|
59
|
-
@ifconfig_version = line.match(/^net-tools (\d
|
67
|
+
if line =~ /^net-tools (\d+\.\d+)/
|
68
|
+
@ifconfig_version = line.match(/^net-tools (\d+\.\d+)/)[1]
|
60
69
|
end
|
61
70
|
end
|
62
71
|
|
63
72
|
if @ifconfig_version.nil?
|
64
73
|
raise "net-tools not found - this is required for ifconfig"
|
65
|
-
elsif @ifconfig_version.
|
74
|
+
elsif @ifconfig_version.to_i < 2
|
66
75
|
# Example output for 1.60 is as follows: (sanitized but format intact)
|
67
76
|
# eth0 Link encap:Ethernet HWaddr 00:00:00:00:00:00
|
68
77
|
# inet addr:192.168.1.1 Bcast:192.168.0.1 Mask:255.255.248.0
|
@@ -99,7 +108,7 @@ class Chef
|
|
99
108
|
current_resource.mtu(@interface["mtu"])
|
100
109
|
current_resource.metric(@interface["metric"])
|
101
110
|
end
|
102
|
-
elsif @ifconfig_version.
|
111
|
+
elsif @ifconfig_version.to_i >= 2
|
103
112
|
# Example output for 2.10-alpha is as follows: (sanitized but format intact)
|
104
113
|
# eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
|
105
114
|
# inet 192.168.1.1 netmask 255.255.240.0 broadcast 192.168.0.1
|
@@ -52,6 +52,10 @@ class Chef
|
|
52
52
|
current_resource.shell(user_plist[:shell][0])
|
53
53
|
current_resource.comment(user_plist[:comment][0])
|
54
54
|
|
55
|
+
if user_plist[:is_hidden]
|
56
|
+
current_resource.hidden(user_plist[:is_hidden][0] == "1" ? true : false)
|
57
|
+
end
|
58
|
+
|
55
59
|
shadow_hash = user_plist[:shadow_hash]
|
56
60
|
if shadow_hash
|
57
61
|
current_resource.password(shadow_hash[0]["SALTED-SHA512-PBKDF2"]["entropy"].string.unpack("H*")[0])
|
@@ -137,7 +141,7 @@ class Chef
|
|
137
141
|
def create_user
|
138
142
|
cmd = [-"-addUser", new_resource.username]
|
139
143
|
cmd += ["-fullName", new_resource.comment] if prop_is_set?(:comment)
|
140
|
-
cmd += ["-UID",
|
144
|
+
cmd += ["-UID", prop_is_set?(:uid) ? new_resource.uid : get_free_uid]
|
141
145
|
cmd += ["-shell", new_resource.shell]
|
142
146
|
cmd += ["-home", new_resource.home]
|
143
147
|
cmd += ["-admin"] if new_resource.admin
|
@@ -165,6 +169,10 @@ class Chef
|
|
165
169
|
reload_user_plist
|
166
170
|
reload_admin_group_plist
|
167
171
|
|
172
|
+
if prop_is_set?(:hidden)
|
173
|
+
set_hidden
|
174
|
+
end
|
175
|
+
|
168
176
|
if prop_is_set?(:password)
|
169
177
|
converge_by("set password") { set_password }
|
170
178
|
end
|
@@ -196,7 +204,7 @@ class Chef
|
|
196
204
|
end.run_action(group_action)
|
197
205
|
|
198
206
|
converge_by("create primary group ID") do
|
199
|
-
run_dscl("create", "/Users/#{new_resource.username}", "PrimaryGroupID",
|
207
|
+
run_dscl("create", "/Users/#{new_resource.username}", "PrimaryGroupID", group_id)
|
200
208
|
end
|
201
209
|
end
|
202
210
|
|
@@ -208,7 +216,7 @@ class Chef
|
|
208
216
|
end
|
209
217
|
|
210
218
|
def compare_user
|
211
|
-
%i{comment shell uid gid salt password admin secure_token}.any? { |m| diverged?(m) }
|
219
|
+
%i{comment shell uid gid salt password admin secure_token hidden}.any? { |m| diverged?(m) }
|
212
220
|
end
|
213
221
|
|
214
222
|
def manage_user
|
@@ -272,7 +280,13 @@ class Chef
|
|
272
280
|
|
273
281
|
if diverged?(:gid)
|
274
282
|
converge_by("alter group membership") do
|
275
|
-
run_dscl("create", "/Users/#{new_resource.username}", "PrimaryGroupID",
|
283
|
+
run_dscl("create", "/Users/#{new_resource.username}", "PrimaryGroupID", group_id)
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
if diverged?(:hidden)
|
288
|
+
converge_by("alter hidden") do
|
289
|
+
set_hidden
|
276
290
|
end
|
277
291
|
end
|
278
292
|
|
@@ -336,6 +350,8 @@ class Chef
|
|
336
350
|
user_group_diverged?
|
337
351
|
when :secure_token
|
338
352
|
secure_token_diverged?
|
353
|
+
when :hidden
|
354
|
+
hidden_diverged?
|
339
355
|
else
|
340
356
|
# Other fields are have been set on current resource so just compare
|
341
357
|
# them.
|
@@ -343,6 +359,24 @@ class Chef
|
|
343
359
|
end
|
344
360
|
end
|
345
361
|
|
362
|
+
# Find the next available uid on the system.
|
363
|
+
# Starting with 200 if `system` is set, 501 otherwise.
|
364
|
+
def get_free_uid(search_limit = 1000)
|
365
|
+
uid = nil
|
366
|
+
base_uid = new_resource.system ? 200 : 501
|
367
|
+
next_uid_guess = base_uid
|
368
|
+
users_uids = run_dscl("list", "/Users", "uid")
|
369
|
+
while next_uid_guess < search_limit + base_uid
|
370
|
+
if users_uids =~ Regexp.new("#{Regexp.escape(next_uid_guess.to_s)}\n")
|
371
|
+
next_uid_guess += 1
|
372
|
+
else
|
373
|
+
uid = next_uid_guess
|
374
|
+
break
|
375
|
+
end
|
376
|
+
end
|
377
|
+
uid || raise("uid not found. Exhausted. Searched #{search_limit} times")
|
378
|
+
end
|
379
|
+
|
346
380
|
# Attempt to resolve the group name, gid, and the action required for
|
347
381
|
# associated group resource. If a group exists we'll modify it, otherwise
|
348
382
|
# create it.
|
@@ -410,12 +444,21 @@ class Chef
|
|
410
444
|
return false unless prop_is_set?(:gid)
|
411
445
|
|
412
446
|
group_name, group_id = user_group_info
|
447
|
+
current_resource.gid != group_id.to_i
|
448
|
+
end
|
413
449
|
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
450
|
+
def hidden_diverged?
|
451
|
+
return false unless prop_is_set?(:hidden)
|
452
|
+
|
453
|
+
(current_resource.hidden ? 1 : 0) != hidden_value.to_i
|
454
|
+
end
|
455
|
+
|
456
|
+
def set_hidden
|
457
|
+
run_dscl("create", "/Users/#{new_resource.username}", "IsHidden", hidden_value.to_i)
|
458
|
+
end
|
459
|
+
|
460
|
+
def hidden_value
|
461
|
+
new_resource.hidden ? 1 : 0
|
419
462
|
end
|
420
463
|
|
421
464
|
def password_diverged?
|
@@ -593,6 +636,7 @@ class Chef
|
|
593
636
|
auth_authority: "dsAttrTypeStandard:AuthenticationAuthority",
|
594
637
|
shadow_hash: "dsAttrTypeNative:ShadowHashData",
|
595
638
|
group_members: "dsAttrTypeStandard:GroupMembers",
|
639
|
+
is_hidden: "dsAttrTypeNative:IsHidden",
|
596
640
|
}.freeze
|
597
641
|
|
598
642
|
attr_accessor :plist_hash, :property_map
|
@@ -0,0 +1,70 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: 2019-2020, Chef Software Inc.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
require_relative "../resource"
|
18
|
+
require_relative "../dist"
|
19
|
+
|
20
|
+
class Chef
|
21
|
+
class Resource
|
22
|
+
class NotifyGroup < Chef::Resource
|
23
|
+
resource_name :notify_group
|
24
|
+
provides :notify_group
|
25
|
+
|
26
|
+
unified_mode true
|
27
|
+
|
28
|
+
description "The notify_group resource does nothing, and always fires notifications which are set on it. Use it to DRY blocks of notifications that are common to multiple resources, and provide a single target for other resources to notify. Unlike most resources, its default action is :nothing."
|
29
|
+
introduced "15.8"
|
30
|
+
|
31
|
+
examples <<~DOC
|
32
|
+
Wire up a notification from a service resource to stop and start the service with a 60 second delay.
|
33
|
+
|
34
|
+
```
|
35
|
+
service "crude" do
|
36
|
+
action [ :enable, :start ]
|
37
|
+
end
|
38
|
+
|
39
|
+
chef_sleep "60" do
|
40
|
+
action :nothing
|
41
|
+
end
|
42
|
+
|
43
|
+
# Example code for a hypothetical badly behaved service that requires
|
44
|
+
# 60 seconds between a stop and start in order to restart the service
|
45
|
+
# (due to race conditions, bleeding connections down, resources that only
|
46
|
+
# slowly unlock in the background, or other poor software behaviors that
|
47
|
+
# are sometimes encountered).
|
48
|
+
#
|
49
|
+
notify_group "crude_stop_and_start" do
|
50
|
+
notifies :stop, "service[crude]", :immediately
|
51
|
+
notifies :sleep, "chef_sleep[60]", :immediately
|
52
|
+
notifies :start, "service[crude]", :immediately
|
53
|
+
end
|
54
|
+
|
55
|
+
template "/etc/crude/crude.conf" do
|
56
|
+
source "crude.conf.erb"
|
57
|
+
variables node["crude"]
|
58
|
+
notifies :run, "notify_group[crude_stop_and_start]", :immediately
|
59
|
+
end
|
60
|
+
```
|
61
|
+
DOC
|
62
|
+
|
63
|
+
action :run do
|
64
|
+
new_resource.updated_by_last_action(true)
|
65
|
+
end
|
66
|
+
|
67
|
+
default_action :nothing
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/lib/chef/resource/sysctl.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# Copyright:: 2018, Webb Agile Solutions Ltd.
|
3
|
-
# Copyright:: 2018-
|
3
|
+
# Copyright:: 2018-2020, Chef Software Inc.
|
4
4
|
#
|
5
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
6
|
# you may not use this file except in compliance with the License.
|
@@ -45,6 +45,11 @@ class Chef
|
|
45
45
|
coerce: proc { |v| coerce_value(v) },
|
46
46
|
required: true
|
47
47
|
|
48
|
+
property :comment, [Array, String],
|
49
|
+
description: "Comments, placed above the resource setting in the generated file. For multi-line comments, use an array of strings, one per line.",
|
50
|
+
default: [],
|
51
|
+
introduced: "15.8"
|
52
|
+
|
48
53
|
property :conf_dir, String,
|
49
54
|
description: "The configuration directory to write the config to.",
|
50
55
|
default: "/etc/sysctl.d"
|
@@ -81,7 +86,7 @@ class Chef
|
|
81
86
|
directory new_resource.conf_dir
|
82
87
|
|
83
88
|
file "#{new_resource.conf_dir}/99-chef-#{new_resource.key.tr("/", ".")}.conf" do
|
84
|
-
content
|
89
|
+
content contruct_sysctl_content
|
85
90
|
end
|
86
91
|
|
87
92
|
execute "Load sysctl values" do
|
@@ -112,9 +117,28 @@ class Chef
|
|
112
117
|
end
|
113
118
|
|
114
119
|
action_class do
|
120
|
+
#
|
121
|
+
# Shell out to set the sysctl value
|
122
|
+
#
|
123
|
+
# @param [String] key The sysctl key
|
124
|
+
# @param [String] value The value of the sysctl key
|
125
|
+
#
|
115
126
|
def set_sysctl_param(key, value)
|
116
127
|
shell_out!("sysctl #{"-e " if new_resource.ignore_error}-w \"#{key}=#{value}\"")
|
117
128
|
end
|
129
|
+
|
130
|
+
#
|
131
|
+
# construct a string, joining members of new_resource.comment and new_resource.value
|
132
|
+
#
|
133
|
+
# @return [String] The text file content
|
134
|
+
#
|
135
|
+
def contruct_sysctl_content
|
136
|
+
sysctl_lines = Array(new_resource.comment).map { |c| "# #{c.strip}" }
|
137
|
+
|
138
|
+
sysctl_lines << "#{new_resource.key} = #{new_resource.value}"
|
139
|
+
|
140
|
+
sysctl_lines.join("\n")
|
141
|
+
end
|
118
142
|
end
|
119
143
|
|
120
144
|
private
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Ryan Cragun (<ryan@chef.io>)
|
3
|
-
# Copyright:: Copyright 2019, Chef Software Inc.
|
3
|
+
# Copyright:: Copyright 2019-2020, Chef Software Inc.
|
4
4
|
# License:: Apache License, Version 2.0
|
5
5
|
#
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -100,6 +100,9 @@ class Chef
|
|
100
100
|
|
101
101
|
property :admin, [TrueClass, FalseClass], description: "Create the user as an admin", default: false
|
102
102
|
|
103
|
+
# Hide a user account in the macOS login window
|
104
|
+
property :hidden, [TrueClass, FalseClass, nil], description: "Hide account from loginwindow and system preferences", default: nil, introduced: "15.8"
|
105
|
+
|
103
106
|
# TCC on macOS >= 10.14 requires admin credentials of an Admin user that
|
104
107
|
# has SecureToken enabled in order to toggle SecureToken.
|
105
108
|
property :admin_username, String, description: "Admin username for superuser actions"
|
@@ -77,7 +77,8 @@ class Chef
|
|
77
77
|
description: "The frequency with which to run the task."
|
78
78
|
|
79
79
|
property :start_day, String,
|
80
|
-
description: "Specifies the first date on which the task runs in MM/DD/YYYY format."
|
80
|
+
description: "Specifies the first date on which the task runs in MM/DD/YYYY format.",
|
81
|
+
default_description: "The current date."
|
81
82
|
|
82
83
|
property :start_time, String,
|
83
84
|
description: "Specifies the start time to run the task, in HH:mm format."
|
data/lib/chef/resources.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Daniel DeLeo (<dan@chef.io>)
|
3
|
-
# Copyright:: Copyright 2010-
|
3
|
+
# Copyright:: Copyright 2010-2020, Chef Software Inc.
|
4
4
|
# License:: Apache License, Version 2.0
|
5
5
|
#
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -66,6 +66,7 @@ require_relative "resource/macports_package"
|
|
66
66
|
require_relative "resource/macos_userdefaults"
|
67
67
|
require_relative "resource/mdadm"
|
68
68
|
require_relative "resource/mount"
|
69
|
+
require_relative "resource/notify_group"
|
69
70
|
require_relative "resource/ohai"
|
70
71
|
require_relative "resource/ohai_hint"
|
71
72
|
require_relative "resource/openbsd_package"
|