chef 16.7.61 → 16.9.20
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +3 -5
- data/README.md +2 -2
- data/chef.gemspec +12 -2
- data/lib/chef/application/base.rb +1 -1
- data/lib/chef/client.rb +3 -0
- data/lib/chef/compliance/default_attributes.rb +93 -0
- data/lib/chef/compliance/fetcher/automate.rb +69 -0
- data/lib/chef/compliance/fetcher/chef_server.rb +134 -0
- data/lib/chef/compliance/reporter/automate.rb +201 -0
- data/lib/chef/compliance/reporter/chef_server_automate.rb +94 -0
- data/lib/chef/compliance/reporter/compliance_enforcer.rb +20 -0
- data/lib/chef/compliance/reporter/json_file.rb +19 -0
- data/lib/chef/compliance/runner.rb +262 -0
- data/lib/chef/cookbook_manifest.rb +1 -0
- data/lib/chef/encrypted_data_bag_item/assertions.rb +1 -1
- data/lib/chef/exceptions.rb +4 -0
- data/lib/chef/http/ssl_policies.rb +33 -14
- data/lib/chef/knife/bootstrap/train_connector.rb +1 -1
- data/lib/chef/knife/core/formatting_options.rb +49 -0
- data/lib/chef/knife/core/node_presenter.rb +0 -25
- data/lib/chef/knife/core/status_presenter.rb +1 -26
- data/lib/chef/knife/core/ui.rb +4 -1
- data/lib/chef/knife/core/windows_bootstrap_context.rb +1 -1
- data/lib/chef/knife/node_show.rb +2 -1
- data/lib/chef/knife/search.rb +2 -1
- data/lib/chef/knife/ssh.rb +3 -1
- data/lib/chef/knife/status.rb +8 -11
- data/lib/chef/mixin/powershell_exec.rb +3 -1
- data/lib/chef/platform/query_helpers.rb +4 -4
- data/lib/chef/policy_builder/policyfile.rb +1 -1
- data/lib/chef/powershell.rb +2 -0
- data/lib/chef/provider/dsc_resource.rb +12 -24
- data/lib/chef/provider/dsc_script.rb +16 -20
- data/lib/chef/provider/git.rb +5 -5
- data/lib/chef/provider/package.rb +53 -19
- data/lib/chef/provider/package/dnf.rb +39 -12
- data/lib/chef/provider/package/dnf/dnf_helper.py +18 -5
- data/lib/chef/provider/package/dnf/python_helper.rb +6 -6
- data/lib/chef/provider/package/freebsd/pkgng.rb +3 -1
- data/lib/chef/provider/yum_repository.rb +2 -2
- data/lib/chef/resource/chef_client_config.rb +1 -1
- data/lib/chef/resource/chef_gem.rb +2 -2
- data/lib/chef/resource/cron/cron_d.rb +1 -0
- data/lib/chef/resource/dsc_script.rb +8 -1
- data/lib/chef/resource/file.rb +1 -1
- data/lib/chef/resource/gem_package.rb +2 -2
- data/lib/chef/resource/homebrew_cask.rb +3 -3
- data/lib/chef/resource/hostname.rb +3 -3
- data/lib/chef/resource/http_request.rb +1 -1
- data/lib/chef/resource/locale.rb +1 -1
- data/lib/chef/resource/mdadm.rb +2 -2
- data/lib/chef/resource/osx_profile.rb +7 -7
- data/lib/chef/resource/remote_directory.rb +1 -1
- data/lib/chef/resource/ruby.rb +1 -5
- data/lib/chef/resource/ruby_block.rb +1 -1
- data/lib/chef/resource/template.rb +2 -2
- data/lib/chef/resource/user/windows_user.rb +5 -0
- data/lib/chef/resource/windows_certificate.rb +9 -13
- data/lib/chef/resource/yum_repository.rb +5 -0
- data/lib/chef/resource_collection/resource_set.rb +1 -1
- data/lib/chef/util/dsc/configuration_generator.rb +52 -11
- data/lib/chef/util/dsc/lcm_output_parser.rb +3 -4
- data/lib/chef/util/dsc/local_configuration_manager.rb +17 -14
- data/lib/chef/util/dsc/resource_store.rb +5 -11
- data/lib/chef/version.rb +1 -1
- data/lib/chef/win32/api/file.rb +4 -0
- data/spec/data/rubygems.org/latest_specs.4.8.gz +0 -0
- data/spec/data/rubygems.org/nonexistent_gem +0 -0
- data/spec/data/rubygems.org/sexp_processor +0 -0
- data/spec/data/rubygems.org/sexp_processor-4.15.1.gemspec.rz +0 -0
- data/spec/data/ssl/binary/chef-rspec-der.cert +0 -0
- data/spec/data/ssl/binary/chef-rspec-der.key +0 -0
- data/spec/functional/resource/dnf_package_spec.rb +319 -16
- data/spec/functional/resource/dsc_script_spec.rb +3 -6
- data/spec/functional/resource/windows_certificate_spec.rb +204 -384
- data/spec/integration/client/client_spec.rb +2 -1
- data/spec/integration/compliance/compliance_spec.rb +81 -0
- data/spec/integration/recipes/recipe_dsl_spec.rb +1 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/unit/client_spec.rb +1 -0
- data/spec/unit/compliance/fetcher/automate_spec.rb +134 -0
- data/spec/unit/compliance/fetcher/chef_server_spec.rb +93 -0
- data/spec/unit/compliance/reporter/automate_spec.rb +427 -0
- data/spec/unit/compliance/reporter/chef_server_automate_spec.rb +177 -0
- data/spec/unit/compliance/reporter/compliance_enforcer_spec.rb +48 -0
- data/spec/unit/compliance/runner_spec.rb +167 -0
- data/spec/unit/http/ssl_policies_spec.rb +107 -68
- data/spec/unit/knife/bootstrap_spec.rb +5 -17
- data/spec/unit/knife/core/node_editor_spec.rb +1 -1
- data/spec/unit/knife/core/status_presenter_spec.rb +54 -0
- data/spec/unit/mixin/openssl_helper_spec.rb +0 -7
- data/spec/unit/mixin/powershell_exec_spec.rb +1 -1
- data/spec/unit/platform/query_helpers_spec.rb +11 -12
- data/spec/unit/provider/dsc_resource_spec.rb +10 -27
- data/spec/unit/provider/dsc_script_spec.rb +1 -1
- data/spec/unit/provider/mount/windows_spec.rb +1 -0
- data/spec/unit/provider/package/freebsd/pkgng_spec.rb +1 -1
- data/spec/unit/provider/package/rubygems_spec.rb +39 -7
- data/spec/unit/provider/systemd_unit_spec.rb +1 -1
- data/spec/unit/resource/user/windows_user_spec.rb +36 -0
- data/spec/unit/resource/windows_certificate_spec.rb +12 -0
- data/spec/unit/util/dsc/configuration_generator_spec.rb +79 -0
- data/spec/unit/util/dsc/local_configuration_manager_spec.rb +27 -35
- metadata +55 -18
- data/lib/chef/util/powershell/cmdlet.rb +0 -169
- data/lib/chef/util/powershell/cmdlet_result.rb +0 -61
- data/spec/data/trusted_certs_empty/.gitkeep +0 -0
- data/spec/data/trusted_certs_empty/README.md +0 -1
- data/spec/functional/util/powershell/cmdlet_spec.rb +0 -111
- data/spec/scripts/ssl-serve.rb +0 -47
- data/spec/unit/util/powershell/cmdlet_spec.rb +0 -106
@@ -26,7 +26,7 @@ class Chef
|
|
26
26
|
|
27
27
|
provides :http_request
|
28
28
|
|
29
|
-
description "Use the **http_request** resource to send an HTTP request (GET
|
29
|
+
description "Use the **http_request** resource to send an HTTP request (`GET`, `PUT`, `POST`, `DELETE`, `HEAD`, or `OPTIONS`) with an arbitrary message. This resource is often useful when custom callbacks are necessary."
|
30
30
|
|
31
31
|
default_action :get
|
32
32
|
allowed_actions :get, :patch, :put, :post, :delete, :head, :options
|
data/lib/chef/resource/locale.rb
CHANGED
@@ -125,7 +125,7 @@ class Chef
|
|
125
125
|
# @raise [Mixlib::ShellOut::ShellCommandFailed] not a supported language or locale
|
126
126
|
#
|
127
127
|
def generate_locales
|
128
|
-
shell_out!("locale-gen #{unavailable_locales.join(" ")}")
|
128
|
+
shell_out!("locale-gen #{unavailable_locales.join(" ")}", timeout: 1800)
|
129
129
|
end
|
130
130
|
|
131
131
|
# Sets the system locale for the current computer.
|
data/lib/chef/resource/mdadm.rb
CHANGED
@@ -36,7 +36,7 @@ class Chef
|
|
36
36
|
|
37
37
|
property :chunk, Integer,
|
38
38
|
default: 16,
|
39
|
-
description: "The chunk size. This property should not be used for a RAID 1 mirrored pair (i.e. when the level property is set to 1)."
|
39
|
+
description: "The chunk size. This property should not be used for a RAID 1 mirrored pair (i.e. when the `level` property is set to `1`)."
|
40
40
|
|
41
41
|
property :devices, Array,
|
42
42
|
default: lazy { [] },
|
@@ -63,7 +63,7 @@ class Chef
|
|
63
63
|
description: "An optional property to specify the name of the RAID device if it differs from the resource block's name."
|
64
64
|
|
65
65
|
property :layout, String,
|
66
|
-
description: "The RAID5 parity algorithm. Possible values: left-asymmetric (or la), left-symmetric (or ls), right-asymmetric (or ra), or right-symmetric (or rs)."
|
66
|
+
description: "The RAID5 parity algorithm. Possible values: `left-asymmetric` (or `la`), `left-symmetric` (or ls), `right-asymmetric` (or `ra`), or `right-symmetric` (or `rs`)."
|
67
67
|
|
68
68
|
action_class do
|
69
69
|
def load_current_resource
|
@@ -29,7 +29,7 @@ class Chef
|
|
29
29
|
|
30
30
|
provides :remote_directory
|
31
31
|
|
32
|
-
description "Use the **remote_directory** resource to incrementally transfer a directory from a cookbook to a node. The
|
32
|
+
description "Use the **remote_directory** resource to incrementally transfer a directory from a cookbook to a node. The directory that is copied from the cookbook should be located under `COOKBOOK_NAME/files/default/REMOTE_DIRECTORY`. The `remote_directory` resource will obey file specificity."
|
33
33
|
|
34
34
|
default_action :create
|
35
35
|
allowed_actions :create, :create_if_missing, :delete
|
data/lib/chef/resource/ruby.rb
CHANGED
@@ -25,11 +25,7 @@ class Chef
|
|
25
25
|
|
26
26
|
provides :ruby
|
27
27
|
|
28
|
-
description "Use the **ruby** resource to execute scripts using the Ruby interpreter. This"
|
29
|
-
" resource may also use any of the actions and properties that are available"\
|
30
|
-
" to the **execute** resource. Commands that are executed with this resource are (by"\
|
31
|
-
" their nature) not idempotent, as they are typically unique to the environment"\
|
32
|
-
" in which they are run. Use `not_if` and `only_if` to guard this resource for idempotence."
|
28
|
+
description "Use the **ruby** resource to execute scripts using the Ruby interpreter. This resource may also use any of the actions and properties that are available to the **execute** resource. Commands that are executed with this resource are (by their nature) not idempotent, as they are typically unique to the environment in which they are run. Use `not_if` and `only_if` to guard this resource for idempotence."
|
33
29
|
|
34
30
|
def initialize(name, run_context = nil)
|
35
31
|
super
|
@@ -28,7 +28,7 @@ class Chef
|
|
28
28
|
|
29
29
|
provides :ruby_block, target_mode: true
|
30
30
|
|
31
|
-
description "Use the **ruby_block** resource to execute Ruby code during a #{ChefUtils::Dist::Infra::PRODUCT} run. Ruby code in the ruby_block resource is evaluated with other resources during convergence, whereas Ruby code outside of a ruby_block resource is evaluated before other resources, as the recipe is compiled."
|
31
|
+
description "Use the **ruby_block** resource to execute Ruby code during a #{ChefUtils::Dist::Infra::PRODUCT} run. Ruby code in the `ruby_block` resource is evaluated with other resources during convergence, whereas Ruby code outside of a `ruby_block` resource is evaluated before other resources, as the recipe is compiled."
|
32
32
|
|
33
33
|
default_action :run
|
34
34
|
allowed_actions :create, :run
|
@@ -169,8 +169,8 @@ class Chef
|
|
169
169
|
elsif module_name.nil?
|
170
170
|
raise Exceptions::ValidationFailed,
|
171
171
|
"#helpers requires either a module name or inline module code as a block.\n" +
|
172
|
-
|
173
|
-
|
172
|
+
"e.g.: helpers do; helper_code; end;\n" +
|
173
|
+
"OR: helpers(MyHelpersModule)"
|
174
174
|
else
|
175
175
|
raise Exceptions::ValidationFailed,
|
176
176
|
"Argument to #helpers must be a module. You gave #{module_name.inspect} (#{module_name.class})"
|
@@ -29,6 +29,11 @@ class Chef
|
|
29
29
|
property :full_name, String,
|
30
30
|
description: "The full name of the user.",
|
31
31
|
introduced: "14.6"
|
32
|
+
|
33
|
+
# Override the property from the parent class to coerce to integer.
|
34
|
+
property :uid, [ String, Integer, NilClass ], # nil for backwards compat
|
35
|
+
description: "The numeric user identifier.",
|
36
|
+
coerce: proc { |n| n && Integer(n) rescue n }
|
32
37
|
end
|
33
38
|
end
|
34
39
|
end
|
@@ -69,7 +69,7 @@ class Chef
|
|
69
69
|
description: "The password to access the source if it is a pfx file."
|
70
70
|
|
71
71
|
property :private_key_acl, Array,
|
72
|
-
description: "An array of 'domain
|
72
|
+
description: "An array of 'domain\\account' entries to be granted read-only access to the certificate's private key. Not idempotent."
|
73
73
|
|
74
74
|
property :store_name, String,
|
75
75
|
description: "The certificate store to manipulate.",
|
@@ -87,6 +87,11 @@ class Chef
|
|
87
87
|
description: "Ensure that sensitive resource data is not logged by the #{ChefUtils::Dist::Infra::CLIENT}.",
|
88
88
|
default: lazy { pfx_password ? true : false }, skip_docs: true
|
89
89
|
|
90
|
+
property :exportable, [TrueClass, FalseClass],
|
91
|
+
description: "Ensure that imported pfx certificate is exportable. Please provide 'true' if you want the certificate to be exportable.",
|
92
|
+
default: false,
|
93
|
+
introduced: "16.8"
|
94
|
+
|
90
95
|
action :create do
|
91
96
|
description "Creates or updates a certificate."
|
92
97
|
|
@@ -162,8 +167,9 @@ class Chef
|
|
162
167
|
end
|
163
168
|
|
164
169
|
def add_pfx_cert
|
170
|
+
exportable = new_resource.exportable ? 1 : 0
|
165
171
|
store = ::Win32::Certstore.open(new_resource.store_name)
|
166
|
-
store.add_pfx(new_resource.source, new_resource.pfx_password)
|
172
|
+
store.add_pfx(new_resource.source, new_resource.pfx_password, exportable)
|
167
173
|
end
|
168
174
|
|
169
175
|
def delete_cert
|
@@ -303,11 +309,7 @@ class Chef
|
|
303
309
|
# @raise [OpenSSL::PKCS12::PKCS12Error] When incorrect password is provided for PFX certificate
|
304
310
|
#
|
305
311
|
def fetch_cert_object(ext)
|
306
|
-
contents =
|
307
|
-
::File.binread(new_resource.source)
|
308
|
-
else
|
309
|
-
::File.read(new_resource.source)
|
310
|
-
end
|
312
|
+
contents = ::File.binread(new_resource.source)
|
311
313
|
|
312
314
|
case ext
|
313
315
|
when ".pfx"
|
@@ -324,12 +326,6 @@ class Chef
|
|
324
326
|
end
|
325
327
|
end
|
326
328
|
|
327
|
-
# @return [Boolean] Whether the certificate file is binary encoded or not
|
328
|
-
#
|
329
|
-
def binary_cert?
|
330
|
-
shell_out!("file -b --mime-encoding #{new_resource.source}").stdout.strip == "binary"
|
331
|
-
end
|
332
|
-
|
333
329
|
# Imports the certificate object into cert store
|
334
330
|
#
|
335
331
|
# @param cert_objs [OpenSSL::X509::Certificate] Object containing certificate's attributes
|
@@ -50,6 +50,11 @@ class Chef
|
|
50
50
|
|
51
51
|
# http://linux.die.net/man/5/yum.conf as well as
|
52
52
|
# http://dnf.readthedocs.io/en/latest/conf_ref.html
|
53
|
+
property :reposdir, String,
|
54
|
+
description: "The directory where the Yum repository files should be stored",
|
55
|
+
default: "/etc/yum.repos.d/",
|
56
|
+
introduced: "16.9"
|
57
|
+
|
53
58
|
property :baseurl, [String, Array],
|
54
59
|
description: "URL to the directory where the Yum repository's `repodata` directory lives. Can be an `http://`, `https://` or a `ftp://` URLs. You can specify multiple URLs in one `baseurl` statement."
|
55
60
|
|
@@ -131,7 +131,7 @@ class Chef
|
|
131
131
|
else
|
132
132
|
raise Chef::Exceptions::InvalidResourceSpecification,
|
133
133
|
"The object `#{query_object.inspect}' is not valid for resource collection lookup. " +
|
134
|
-
|
134
|
+
"Use a String like `resource_type[resource_name]' or a Chef::Resource object"
|
135
135
|
end
|
136
136
|
end
|
137
137
|
|
@@ -16,36 +16,34 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
18
|
|
19
|
-
require_relative "
|
19
|
+
require_relative "../../mixin/powershell_exec"
|
20
20
|
|
21
21
|
class Chef::Util::DSC
|
22
22
|
class ConfigurationGenerator
|
23
|
+
include Chef::Mixin::PowershellExec
|
24
|
+
|
23
25
|
def initialize(node, config_directory)
|
24
26
|
@node = node
|
25
27
|
@config_directory = config_directory
|
26
28
|
end
|
27
29
|
|
28
|
-
def configuration_document_from_script_code(code, configuration_flags, imports
|
30
|
+
def configuration_document_from_script_code(code, configuration_flags, imports)
|
29
31
|
Chef::Log.trace("DSC: DSC code:\n '#{code}'")
|
30
32
|
generated_script_path = write_document_generation_script(code, "chef_dsc", imports)
|
31
33
|
begin
|
32
|
-
configuration_document_from_script_path(generated_script_path, "chef_dsc", configuration_flags
|
34
|
+
configuration_document_from_script_path(generated_script_path, "chef_dsc", configuration_flags)
|
33
35
|
ensure
|
34
36
|
::FileUtils.rm(generated_script_path)
|
35
37
|
end
|
36
38
|
end
|
37
39
|
|
38
|
-
def configuration_document_from_script_path(script_path, configuration_name, configuration_flags
|
40
|
+
def configuration_document_from_script_path(script_path, configuration_name, configuration_flags)
|
39
41
|
validate_configuration_name!(configuration_name)
|
40
42
|
|
41
|
-
|
42
|
-
|
43
|
-
configuration_document_generation_code(script_path, configuration_name)
|
44
|
-
)
|
45
|
-
|
46
|
-
merged_configuration_flags = get_merged_configuration_flags!(configuration_flags, configuration_name)
|
43
|
+
config_generation_code = configuration_document_generation_code(script_path, configuration_name)
|
44
|
+
switches_string = command_switches_string(get_merged_configuration_flags!(configuration_flags, configuration_name))
|
47
45
|
|
48
|
-
|
46
|
+
powershell_exec!("#{config_generation_code} #{switches_string}")
|
49
47
|
configuration_document_location = find_configuration_document(configuration_name)
|
50
48
|
|
51
49
|
unless configuration_document_location
|
@@ -59,6 +57,49 @@ class Chef::Util::DSC
|
|
59
57
|
|
60
58
|
protected
|
61
59
|
|
60
|
+
def validate_switch_name!(switch_parameter_name)
|
61
|
+
unless switch_parameter_name.match?(/\A[A-Za-z]+[_a-zA-Z0-9]*\Z/)
|
62
|
+
raise ArgumentError, "`#{switch_parameter_name}` is not a valid PowerShell cmdlet switch parameter name"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def escape_parameter_value(parameter_value)
|
67
|
+
parameter_value.gsub(/(`|'|"|#)/, '`\1')
|
68
|
+
end
|
69
|
+
|
70
|
+
def escape_string_parameter_value(parameter_value)
|
71
|
+
"'#{escape_parameter_value(parameter_value)}'"
|
72
|
+
end
|
73
|
+
|
74
|
+
def command_switches_string(switches)
|
75
|
+
command_switches = switches.map do |switch_name, switch_value|
|
76
|
+
if switch_name.class != Symbol
|
77
|
+
raise ArgumentError, "Invalid type `#{switch_name} `for PowerShell switch '#{switch_name}'. The switch must be specified as a Symbol'"
|
78
|
+
end
|
79
|
+
|
80
|
+
validate_switch_name!(switch_name)
|
81
|
+
|
82
|
+
switch_argument = ""
|
83
|
+
switch_present = true
|
84
|
+
|
85
|
+
case switch_value
|
86
|
+
when Numeric, Float
|
87
|
+
switch_argument = switch_value.to_s
|
88
|
+
when FalseClass
|
89
|
+
switch_present = false
|
90
|
+
when TrueClass
|
91
|
+
when String
|
92
|
+
switch_argument = escape_string_parameter_value(switch_value)
|
93
|
+
else
|
94
|
+
raise ArgumentError, "Invalid argument type `#{switch_value.class}` specified for PowerShell switch `:#{switch_name}`. Arguments to PowerShell must be of type `String`, `Numeric`, `Float`, `FalseClass`, or `TrueClass`"
|
95
|
+
end
|
96
|
+
|
97
|
+
switch_present ? ["-#{switch_name.to_s.downcase}", switch_argument].join(" ").strip : ""
|
98
|
+
end
|
99
|
+
|
100
|
+
command_switches.join(" ")
|
101
|
+
end
|
102
|
+
|
62
103
|
# From PowerShell error help for the Configuration language element:
|
63
104
|
# Standard names may only contain letters (a-z, A-Z), numbers (0-9), and underscore (_).
|
64
105
|
# The name may not be null or empty, and should start with a letter.
|
@@ -75,15 +75,15 @@ class Chef
|
|
75
75
|
#
|
76
76
|
|
77
77
|
def self.parse(lcm_output, test_dsc_configuration)
|
78
|
+
lcm_output = String(lcm_output).split("\n")
|
78
79
|
test_dsc_configuration ? test_dsc_parser(lcm_output) : what_if_parser(lcm_output)
|
79
80
|
end
|
80
81
|
|
81
82
|
def self.test_dsc_parser(lcm_output)
|
82
|
-
lcm_output ||= ""
|
83
83
|
current_resource = {}
|
84
84
|
|
85
85
|
resources = []
|
86
|
-
lcm_output.
|
86
|
+
lcm_output.each do |line|
|
87
87
|
op_action , op_value = line.strip.split(":")
|
88
88
|
op_action&.strip!
|
89
89
|
case op_action
|
@@ -107,11 +107,10 @@ class Chef
|
|
107
107
|
end
|
108
108
|
|
109
109
|
def self.what_if_parser(lcm_output)
|
110
|
-
lcm_output ||= ""
|
111
110
|
current_resource = {}
|
112
111
|
|
113
112
|
resources = []
|
114
|
-
lcm_output.
|
113
|
+
lcm_output.each do |line|
|
115
114
|
op_action, op_type, info = parse_line(line)
|
116
115
|
|
117
116
|
case op_action
|
@@ -16,25 +16,27 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
18
|
|
19
|
-
require_relative "
|
19
|
+
require_relative "../../mixin/powershell_exec"
|
20
20
|
require_relative "lcm_output_parser"
|
21
21
|
|
22
22
|
class Chef::Util::DSC
|
23
23
|
class LocalConfigurationManager
|
24
|
+
include Chef::Mixin::PowershellExec
|
25
|
+
|
24
26
|
def initialize(node, configuration_path)
|
25
27
|
@node = node
|
26
28
|
@configuration_path = configuration_path
|
27
29
|
clear_execution_time
|
28
30
|
end
|
29
31
|
|
30
|
-
def test_configuration(configuration_document
|
31
|
-
status = run_configuration_cmdlet(configuration_document, false
|
32
|
-
log_dsc_exception(status.
|
33
|
-
configuration_update_required?(status.
|
32
|
+
def test_configuration(configuration_document)
|
33
|
+
status = run_configuration_cmdlet(configuration_document, false)
|
34
|
+
log_dsc_exception(status.errors.join("\n")) if status.error?
|
35
|
+
configuration_update_required?(status.result)
|
34
36
|
end
|
35
37
|
|
36
|
-
def set_configuration(configuration_document
|
37
|
-
run_configuration_cmdlet(configuration_document, true
|
38
|
+
def set_configuration(configuration_document)
|
39
|
+
run_configuration_cmdlet(configuration_document, true)
|
38
40
|
end
|
39
41
|
|
40
42
|
def last_operation_execution_time_seconds
|
@@ -45,7 +47,7 @@ class Chef::Util::DSC
|
|
45
47
|
|
46
48
|
private
|
47
49
|
|
48
|
-
def run_configuration_cmdlet(configuration_document, apply_configuration
|
50
|
+
def run_configuration_cmdlet(configuration_document, apply_configuration)
|
49
51
|
Chef::Log.trace("DSC: Calling DSC Local Config Manager to #{apply_configuration ? "set" : "test"} configuration document.")
|
50
52
|
|
51
53
|
start_operation_timing
|
@@ -53,11 +55,12 @@ class Chef::Util::DSC
|
|
53
55
|
|
54
56
|
begin
|
55
57
|
save_configuration_document(configuration_document)
|
56
|
-
|
58
|
+
cmd = lcm_command(apply_configuration)
|
59
|
+
Chef::Log.trace("DSC: Calling DSC Local Config Manager with:\n#{cmd}")
|
60
|
+
|
61
|
+
status = powershell_exec(cmd)
|
57
62
|
if apply_configuration
|
58
|
-
status
|
59
|
-
else
|
60
|
-
status = cmdlet.run({}, shellout_flags)
|
63
|
+
status.error!
|
61
64
|
end
|
62
65
|
ensure
|
63
66
|
end_operation_timing
|
@@ -77,7 +80,7 @@ class Chef::Util::DSC
|
|
77
80
|
ps4_base_command
|
78
81
|
else
|
79
82
|
if ps_version_gte_5?
|
80
|
-
"#{common_command_prefix} Test-DscConfiguration -path #{@configuration_path} | format-list"
|
83
|
+
"#{common_command_prefix} Test-DscConfiguration -path #{@configuration_path} | format-list | Out-String"
|
81
84
|
else
|
82
85
|
ps4_base_command + " -whatif; if (! $?) { exit 1 }"
|
83
86
|
end
|
@@ -100,7 +103,7 @@ class Chef::Util::DSC
|
|
100
103
|
end
|
101
104
|
|
102
105
|
def whatif_not_supported?(dsc_exception_output)
|
103
|
-
!! (dsc_exception_output.gsub(/[\
|
106
|
+
!! (dsc_exception_output.gsub(/[\n]+/, "").gsub(/\s+/, " ") =~ /A parameter cannot be found that matches parameter name 'Whatif'/i)
|
104
107
|
end
|
105
108
|
|
106
109
|
def dsc_module_import_failure?(command_output)
|
@@ -16,14 +16,14 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
18
|
|
19
|
-
require_relative "
|
20
|
-
require_relative "../powershell/cmdlet_result"
|
19
|
+
require_relative "../../mixin/powershell_exec"
|
21
20
|
require_relative "../../exceptions"
|
22
21
|
|
23
22
|
class Chef
|
24
23
|
class Util
|
25
24
|
class DSC
|
26
25
|
class ResourceStore
|
26
|
+
include Chef::Mixin::PowershellExec
|
27
27
|
|
28
28
|
def self.instance
|
29
29
|
@@instance ||= ResourceStore.new.tap do |store|
|
@@ -83,19 +83,13 @@ class Chef
|
|
83
83
|
|
84
84
|
# Returns a list of dsc resources
|
85
85
|
def query_resources
|
86
|
-
|
87
|
-
:object)
|
88
|
-
result = cmdlet.run
|
89
|
-
result.return_value
|
86
|
+
powershell_exec("get-dscresource").result
|
90
87
|
end
|
91
88
|
|
92
89
|
# Returns a list of dsc resources matching the provided name
|
93
90
|
def query_resource(resource_name)
|
94
|
-
|
95
|
-
|
96
|
-
result = cmdlet.run
|
97
|
-
ret_val = result.return_value
|
98
|
-
if ret_val.nil?
|
91
|
+
ret_val = powershell_exec("get-dscresource #{resource_name}").result
|
92
|
+
if ret_val.empty?
|
99
93
|
[]
|
100
94
|
elsif ret_val.is_a? Array
|
101
95
|
ret_val
|