puppet 6.19.0-x86-mingw32 → 6.22.1-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CODEOWNERS +2 -16
- data/Gemfile +3 -1
- data/Gemfile.lock +50 -39
- data/ext/project_data.yaml +2 -2
- data/lib/puppet/application.rb +10 -6
- data/lib/puppet/application/agent.rb +1 -0
- data/lib/puppet/application/apply.rb +3 -2
- data/lib/puppet/application/device.rb +1 -0
- data/lib/puppet/application/filebucket.rb +2 -2
- data/lib/puppet/application/script.rb +1 -0
- data/lib/puppet/application/ssl.rb +11 -0
- data/lib/puppet/application_support.rb +7 -0
- data/lib/puppet/configurer.rb +28 -18
- data/lib/puppet/defaults.rb +46 -20
- data/lib/puppet/environments.rb +54 -55
- data/lib/puppet/face/config.rb +10 -0
- data/lib/puppet/face/epp.rb +12 -2
- data/lib/puppet/face/facts.rb +158 -0
- data/lib/puppet/ffi/posix.rb +10 -0
- data/lib/puppet/ffi/posix/constants.rb +14 -0
- data/lib/puppet/ffi/posix/functions.rb +24 -0
- data/lib/puppet/file_system/memory_file.rb +8 -1
- data/lib/puppet/file_system/windows.rb +2 -0
- data/lib/puppet/functions/epp.rb +1 -0
- data/lib/puppet/functions/inline_epp.rb +1 -0
- data/lib/puppet/functions/partition.rb +8 -0
- data/lib/puppet/indirector/fact_search.rb +60 -0
- data/lib/puppet/indirector/facts/facter.rb +24 -3
- data/lib/puppet/indirector/facts/json.rb +27 -0
- data/lib/puppet/indirector/facts/yaml.rb +3 -58
- data/lib/puppet/indirector/json.rb +5 -1
- data/lib/puppet/indirector/node/json.rb +8 -0
- data/lib/puppet/indirector/report/json.rb +34 -0
- data/lib/puppet/module_tool/applications/installer.rb +48 -2
- data/lib/puppet/module_tool/errors/shared.rb +17 -2
- data/lib/puppet/network/formats.rb +69 -1
- data/lib/puppet/network/http/factory.rb +4 -0
- data/lib/puppet/pal/pal_impl.rb +70 -17
- data/lib/puppet/parser/ast/leaf.rb +3 -2
- data/lib/puppet/parser/templatewrapper.rb +1 -1
- data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -3
- data/lib/puppet/pops/model/ast_transformer.rb +1 -1
- data/lib/puppet/property/list.rb +1 -1
- data/lib/puppet/provider/group/groupadd.rb +13 -8
- data/lib/puppet/provider/package/apt.rb +34 -2
- data/lib/puppet/provider/package/aptitude.rb +6 -0
- data/lib/puppet/provider/package/dnfmodule.rb +1 -1
- data/lib/puppet/provider/service/debian.rb +2 -0
- data/lib/puppet/provider/service/systemd.rb +1 -1
- data/lib/puppet/provider/user/aix.rb +2 -2
- data/lib/puppet/provider/user/useradd.rb +62 -8
- data/lib/puppet/reference/configuration.rb +6 -5
- data/lib/puppet/settings.rb +43 -15
- data/lib/puppet/settings/alias_setting.rb +37 -0
- data/lib/puppet/settings/base_setting.rb +26 -2
- data/lib/puppet/settings/environment_conf.rb +1 -0
- data/lib/puppet/type/package.rb +3 -3
- data/lib/puppet/util/autoload.rb +1 -8
- data/lib/puppet/util/fact_dif.rb +81 -0
- data/lib/puppet/util/monkey_patches.rb +7 -0
- data/lib/puppet/util/posix.rb +54 -5
- data/lib/puppet/util/rubygems.rb +5 -1
- data/lib/puppet/util/windows/adsi.rb +46 -0
- data/lib/puppet/util/windows/api_types.rb +1 -1
- data/lib/puppet/util/windows/principal.rb +9 -2
- data/lib/puppet/util/windows/service.rb +1 -1
- data/lib/puppet/util/windows/sid.rb +4 -2
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +295 -219
- data/man/man5/puppet.conf.5 +15 -7
- data/man/man8/puppet-agent.8 +2 -2
- data/man/man8/puppet-apply.8 +2 -2
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +1 -1
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +2 -2
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +90 -1
- data/man/man8/puppet-filebucket.8 +3 -3
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +1 -1
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-lookup.8 +1 -1
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +1 -1
- data/man/man8/puppet-node.8 +4 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +4 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +2 -2
- data/man/man8/puppet-ssl.8 +5 -1
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
- data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services_vendor_preset +9 -0
- data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
- data/spec/integration/application/agent_spec.rb +160 -3
- data/spec/integration/application/apply_spec.rb +19 -0
- data/spec/integration/application/plugin_spec.rb +1 -1
- data/spec/integration/defaults_spec.rb +0 -7
- data/spec/integration/environments/setting_hooks_spec.rb +1 -1
- data/spec/integration/http/client_spec.rb +12 -0
- data/spec/integration/indirector/direct_file_server_spec.rb +1 -3
- data/spec/integration/resource/type_collection_spec.rb +2 -6
- data/spec/integration/transaction_spec.rb +4 -9
- data/spec/integration/util/windows/adsi_spec.rb +21 -1
- data/spec/integration/util/windows/principal_spec.rb +21 -0
- data/spec/integration/util/windows/registry_spec.rb +6 -10
- data/spec/lib/puppet_spec/settings.rb +6 -1
- data/spec/spec_helper.rb +12 -5
- data/spec/unit/agent_spec.rb +8 -6
- data/spec/unit/application/agent_spec.rb +0 -1
- data/spec/unit/application/config_spec.rb +224 -4
- data/spec/unit/application/facts_spec.rb +482 -3
- data/spec/unit/application/filebucket_spec.rb +0 -2
- data/spec/unit/application/ssl_spec.rb +23 -0
- data/spec/unit/application_spec.rb +51 -9
- data/spec/unit/confine/feature_spec.rb +1 -1
- data/spec/unit/confine_spec.rb +8 -2
- data/spec/unit/defaults_spec.rb +36 -1
- data/spec/unit/environments_spec.rb +221 -68
- data/spec/unit/face/config_spec.rb +27 -32
- data/spec/unit/face/facts_spec.rb +4 -0
- data/spec/unit/face/node_spec.rb +0 -11
- data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
- data/spec/unit/file_serving/metadata_spec.rb +3 -3
- data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
- data/spec/unit/file_system_spec.rb +9 -0
- data/spec/unit/forge/module_release_spec.rb +2 -7
- data/spec/unit/functions/inline_epp_spec.rb +26 -1
- data/spec/unit/http/service/compiler_spec.rb +49 -0
- data/spec/unit/http/service_spec.rb +1 -1
- data/spec/unit/indirector/face_spec.rb +0 -1
- data/spec/unit/indirector/facts/facter_spec.rb +95 -1
- data/spec/unit/indirector/facts/json_spec.rb +255 -0
- data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
- data/spec/unit/indirector/indirection_spec.rb +8 -12
- data/spec/unit/indirector/key/file_spec.rb +0 -1
- data/spec/unit/indirector/node/json_spec.rb +33 -0
- data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
- data/spec/unit/indirector/report/yaml_spec.rb +72 -8
- data/spec/unit/indirector_spec.rb +2 -2
- data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
- data/spec/unit/network/authconfig_spec.rb +0 -3
- data/spec/unit/network/formats_spec.rb +41 -0
- data/spec/unit/network/http/api/indirected_routes_spec.rb +0 -9
- data/spec/unit/network/http/factory_spec.rb +19 -0
- data/spec/unit/network/http/handler_spec.rb +0 -5
- data/spec/unit/parser/compiler_spec.rb +3 -19
- data/spec/unit/parser/resource_spec.rb +14 -8
- data/spec/unit/parser/templatewrapper_spec.rb +4 -3
- data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
- data/spec/unit/property_spec.rb +1 -0
- data/spec/unit/provider/group/groupadd_spec.rb +5 -2
- data/spec/unit/provider/nameservice_spec.rb +66 -65
- data/spec/unit/provider/package/apt_spec.rb +28 -23
- data/spec/unit/provider/package/aptitude_spec.rb +1 -1
- data/spec/unit/provider/package/base_spec.rb +6 -5
- data/spec/unit/provider/package/dnfmodule_spec.rb +10 -1
- data/spec/unit/provider/package/pacman_spec.rb +18 -12
- data/spec/unit/provider/package/pip_spec.rb +6 -11
- data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
- data/spec/unit/provider/service/systemd_spec.rb +11 -0
- data/spec/unit/provider/user/aix_spec.rb +5 -0
- data/spec/unit/provider/user/hpux_spec.rb +1 -1
- data/spec/unit/provider/user/pw_spec.rb +2 -0
- data/spec/unit/provider/user/useradd_spec.rb +71 -3
- data/spec/unit/provider_spec.rb +8 -10
- data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
- data/spec/unit/resource/capability_finder_spec.rb +6 -1
- data/spec/unit/resource/catalog_spec.rb +1 -1
- data/spec/unit/resource/type_spec.rb +1 -1
- data/spec/unit/resource_spec.rb +11 -10
- data/spec/unit/settings_spec.rb +543 -228
- data/spec/unit/ssl/base_spec.rb +0 -1
- data/spec/unit/ssl/host_spec.rb +0 -5
- data/spec/unit/ssl/ssl_provider_spec.rb +14 -8
- data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -7
- data/spec/unit/transaction/event_manager_spec.rb +14 -11
- data/spec/unit/transaction_spec.rb +13 -4
- data/spec/unit/type/file/content_spec.rb +0 -1
- data/spec/unit/type/file/selinux_spec.rb +0 -2
- data/spec/unit/type/file_spec.rb +0 -6
- data/spec/unit/type/group_spec.rb +13 -6
- data/spec/unit/type/resources_spec.rb +7 -7
- data/spec/unit/type/service_spec.rb +1 -1
- data/spec/unit/type/tidy_spec.rb +0 -1
- data/spec/unit/type_spec.rb +2 -2
- data/spec/unit/util/at_fork_spec.rb +2 -2
- data/spec/unit/util/autoload_spec.rb +5 -1
- data/spec/unit/util/backups_spec.rb +1 -2
- data/spec/unit/util/execution_spec.rb +15 -11
- data/spec/unit/util/inifile_spec.rb +6 -14
- data/spec/unit/util/log_spec.rb +8 -7
- data/spec/unit/util/logging_spec.rb +3 -3
- data/spec/unit/util/posix_spec.rb +363 -15
- data/spec/unit/util/rubygems_spec.rb +2 -2
- data/spec/unit/util/selinux_spec.rb +76 -52
- data/spec/unit/util/storage_spec.rb +3 -1
- data/spec/unit/util/suidmanager_spec.rb +44 -41
- data/spec/unit/util/windows/sid_spec.rb +6 -0
- data/spec/unit/util_spec.rb +13 -6
- metadata +31 -16
- data/spec/integration/application/config_spec.rb +0 -74
- data/spec/lib/matchers/include.rb +0 -27
- data/spec/lib/matchers/include_spec.rb +0 -32
- data/spec/unit/face/catalog_spec.rb +0 -6
- data/spec/unit/face/module_spec.rb +0 -3
@@ -7,6 +7,7 @@ module Puppet::ModuleTool::Errors
|
|
7
7
|
@installed_version = options[:installed_version]
|
8
8
|
@conditions = options[:conditions]
|
9
9
|
@action = options[:action]
|
10
|
+
@unsatisfied = options[:unsatisfied]
|
10
11
|
|
11
12
|
super _("Could not %{action} '%{module_name}' (%{version}); no version satisfies all dependencies") % { action: @action, module_name: @requested_name, version: vstring }
|
12
13
|
end
|
@@ -14,9 +15,23 @@ module Puppet::ModuleTool::Errors
|
|
14
15
|
def multiline
|
15
16
|
message = []
|
16
17
|
message << _("Could not %{action} module '%{module_name}' (%{version})") % { action: @action, module_name: @requested_name, version: vstring }
|
17
|
-
|
18
|
+
|
19
|
+
if @unsatisfied
|
20
|
+
message << _(" The requested version cannot satisfy one or more of the following installed modules:")
|
21
|
+
if @unsatisfied[:current_version]
|
22
|
+
message << _(" %{name}, installed: %{current_version}, expected: %{constraints}") % { name: @unsatisfied[:name], current_version: @unsatisfied[:current_version], constraints: @unsatisfied[:constraints][@unsatisfied[:name]] }
|
23
|
+
else
|
24
|
+
@unsatisfied[:constraints].each do |mod, range|
|
25
|
+
message << _(" %{mod}, expects '%{name}': %{range}") % { mod: mod, name: @requested_name, range: range }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
message << _("")
|
29
|
+
else
|
30
|
+
message << _(" The requested version cannot satisfy all dependencies")
|
31
|
+
end
|
32
|
+
|
18
33
|
#TRANSLATORS `puppet module %{action} --ignore-dependencies` is a command line and should not be translated
|
19
|
-
message << _("
|
34
|
+
message << _(" Use `puppet module %{action} '%{module_name}' --ignore-dependencies` to %{action} only this module") % { action: @action, module_name: @requested_name }
|
20
35
|
message.join("\n")
|
21
36
|
end
|
22
37
|
end
|
@@ -183,6 +183,73 @@ Puppet::Network::FormatHandler.create(:console,
|
|
183
183
|
end
|
184
184
|
end
|
185
185
|
|
186
|
+
Puppet::Network::FormatHandler.create(:flat,
|
187
|
+
:mime => 'text/x-flat-text',
|
188
|
+
:weight => 0) do
|
189
|
+
|
190
|
+
def flatten_hash(hash)
|
191
|
+
hash.each_with_object({}) do |(k, v), h|
|
192
|
+
if v.is_a? Hash
|
193
|
+
flatten_hash(v).map do |h_k, h_v|
|
194
|
+
h["#{k}.#{h_k}"] = h_v
|
195
|
+
end
|
196
|
+
elsif v.is_a? Array
|
197
|
+
v.each_with_index do |el, i|
|
198
|
+
if el.is_a? Hash
|
199
|
+
flatten_hash(el).map do |el_k, el_v|
|
200
|
+
h["#{k}.#{i}.#{el_k}"] = el_v
|
201
|
+
end
|
202
|
+
else
|
203
|
+
h["#{k}.#{i}"] = el
|
204
|
+
end
|
205
|
+
end
|
206
|
+
else
|
207
|
+
h[k] = v
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
def flatten_array(array)
|
213
|
+
a={}
|
214
|
+
array.each_with_index do |el, i|
|
215
|
+
if el.is_a? Hash
|
216
|
+
flatten_hash(el).map do |el_k, el_v|
|
217
|
+
a["#{i}.#{el_k}"] = el_v
|
218
|
+
end
|
219
|
+
else
|
220
|
+
a["#{i}"] = el
|
221
|
+
end
|
222
|
+
end
|
223
|
+
a
|
224
|
+
end
|
225
|
+
|
226
|
+
def construct_output(data)
|
227
|
+
output = ''
|
228
|
+
data.each do |key, value|
|
229
|
+
output << "#{key}=#{value}"
|
230
|
+
output << "\n"
|
231
|
+
end
|
232
|
+
output
|
233
|
+
end
|
234
|
+
|
235
|
+
def render(datum)
|
236
|
+
return datum if datum.is_a?(String) || datum.is_a?(Numeric)
|
237
|
+
# Simple hash
|
238
|
+
if datum.is_a?(Hash)
|
239
|
+
data = flatten_hash(datum)
|
240
|
+
return construct_output(data)
|
241
|
+
elsif datum.is_a?(Array)
|
242
|
+
data = flatten_array(datum)
|
243
|
+
return construct_output(data)
|
244
|
+
end
|
245
|
+
Puppet::Util::Json.dump(datum, :pretty => true, :quirks_mode => true)
|
246
|
+
end
|
247
|
+
def render_multiple(data)
|
248
|
+
data.collect(&:render).join("\n")
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
|
186
253
|
Puppet::Network::FormatHandler.create(:rich_data_json, mime: 'application/vnd.puppet.rich+json', charset: Encoding::UTF_8, weight: 30) do
|
187
254
|
def intern(klass, text)
|
188
255
|
Puppet.override({:rich_data => true}) do
|
@@ -255,7 +322,8 @@ Puppet::Network::FormatHandler.create_serialized_formats(:rich_data_msgpack, mim
|
|
255
322
|
end
|
256
323
|
|
257
324
|
def supported?(klass)
|
258
|
-
|
325
|
+
suitable? &&
|
326
|
+
klass == Puppet::Resource::Catalog &&
|
259
327
|
Puppet.lookup(:current_environment).rich_data?
|
260
328
|
end
|
261
329
|
end
|
@@ -27,6 +27,10 @@ class Puppet::Network::HTTP::Factory
|
|
27
27
|
|
28
28
|
http = Puppet::Util::HttpProxy.proxy(URI(site.addr))
|
29
29
|
http.use_ssl = site.use_ssl?
|
30
|
+
if site.use_ssl?
|
31
|
+
http.min_version = OpenSSL::SSL::TLS1_VERSION if http.respond_to?(:min_version)
|
32
|
+
http.ciphers = Puppet[:ciphers]
|
33
|
+
end
|
30
34
|
http.read_timeout = Puppet[:http_read_timeout]
|
31
35
|
http.open_timeout = Puppet[:http_connect_timeout]
|
32
36
|
http.keep_alive_timeout = KEEP_ALIVE_TIMEOUT if http.respond_to?(:keep_alive_timeout=)
|
data/lib/puppet/pal/pal_impl.rb
CHANGED
@@ -58,8 +58,8 @@ module Pal
|
|
58
58
|
configured_by_env: false,
|
59
59
|
manifest_file: nil,
|
60
60
|
code_string: nil,
|
61
|
-
facts:
|
62
|
-
variables:
|
61
|
+
facts: {},
|
62
|
+
variables: {},
|
63
63
|
set_local_facts: true,
|
64
64
|
&block
|
65
65
|
)
|
@@ -93,7 +93,14 @@ module Pal
|
|
93
93
|
|
94
94
|
# If manifest_file is nil, the #main method will use the env configured manifest
|
95
95
|
# to do things in the block while a Script Compiler is in effect
|
96
|
-
main(
|
96
|
+
main(
|
97
|
+
manifest: manifest_file,
|
98
|
+
facts: facts,
|
99
|
+
variables: variables,
|
100
|
+
internal_compiler_class: :script,
|
101
|
+
set_local_facts: set_local_facts,
|
102
|
+
&block
|
103
|
+
)
|
97
104
|
ensure
|
98
105
|
Puppet[:tasks] = previous_tasks_value
|
99
106
|
Puppet[:code] = previous_code_value
|
@@ -157,8 +164,9 @@ module Pal
|
|
157
164
|
configured_by_env: false,
|
158
165
|
manifest_file: nil,
|
159
166
|
code_string: nil,
|
160
|
-
facts:
|
161
|
-
variables:
|
167
|
+
facts: {},
|
168
|
+
variables: {},
|
169
|
+
target_variables: {},
|
162
170
|
&block
|
163
171
|
)
|
164
172
|
# TRANSLATORS: do not translate variable name strings in these assertions
|
@@ -193,7 +201,15 @@ module Pal
|
|
193
201
|
|
194
202
|
# If manifest_file is nil, the #main method will use the env configured manifest
|
195
203
|
# to do things in the block while a Script Compiler is in effect
|
196
|
-
main(
|
204
|
+
main(
|
205
|
+
manifest: manifest_file,
|
206
|
+
facts: facts,
|
207
|
+
variables: variables,
|
208
|
+
target_variables: target_variables,
|
209
|
+
internal_compiler_class: :catalog,
|
210
|
+
set_local_facts: false,
|
211
|
+
&block
|
212
|
+
)
|
197
213
|
ensure
|
198
214
|
# Clean up after ourselves
|
199
215
|
Puppet[:tasks] = previous_tasks_value
|
@@ -382,11 +398,12 @@ module Pal
|
|
382
398
|
# the provided block
|
383
399
|
#
|
384
400
|
def self.main(
|
385
|
-
manifest,
|
386
|
-
facts,
|
387
|
-
variables,
|
388
|
-
|
389
|
-
|
401
|
+
manifest: nil,
|
402
|
+
facts: {},
|
403
|
+
variables: {},
|
404
|
+
target_variables: {},
|
405
|
+
internal_compiler_class: nil,
|
406
|
+
set_local_facts: true
|
390
407
|
)
|
391
408
|
# Configure the load path
|
392
409
|
env = Puppet.lookup(:pal_env)
|
@@ -403,14 +420,11 @@ module Pal
|
|
403
420
|
pal_variables = Puppet.lookup(:pal_variables)
|
404
421
|
|
405
422
|
overrides = {}
|
423
|
+
|
406
424
|
unless facts.nil? || facts.empty?
|
407
425
|
pal_facts = pal_facts.merge(facts)
|
408
426
|
overrides[:pal_facts] = pal_facts
|
409
427
|
end
|
410
|
-
unless variables.nil? || variables.empty?
|
411
|
-
pal_variables = pal_variables.merge(variables)
|
412
|
-
overrides[:pal_variables] = pal_variables
|
413
|
-
end
|
414
428
|
|
415
429
|
prepare_node_facts(node, pal_facts)
|
416
430
|
|
@@ -463,10 +477,17 @@ module Pal
|
|
463
477
|
# TRANSLATORS: Do not translate, symbolic name
|
464
478
|
Puppet.override(overrides, "PAL::with_#{internal_compiler_class}_compiler") do
|
465
479
|
compiler.compile do | compiler_yield |
|
466
|
-
# In case the
|
480
|
+
# In case the variables passed to the compiler are PCore types defined in modules, they
|
467
481
|
# need to be deserialized and added from within the this scope, so that loaders are
|
468
482
|
# available during deserizlization.
|
469
|
-
|
483
|
+
pal_variables = Puppet::Pops::Serialization::FromDataConverter.convert(pal_variables)
|
484
|
+
variables = Puppet::Pops::Serialization::FromDataConverter.convert(variables)
|
485
|
+
|
486
|
+
# Merge together target variables and plan variables. This will also shadow any
|
487
|
+
# collisions with facts and emit a warning.
|
488
|
+
topscope_vars = pal_variables.merge(merge_vars(target_variables, variables, node.facts.values))
|
489
|
+
|
490
|
+
add_variables(compiler.topscope, topscope_vars)
|
470
491
|
# wrap the internal compiler to prevent it from leaking in the PAL API
|
471
492
|
if block_given?
|
472
493
|
yield(pal_compiler)
|
@@ -486,6 +507,38 @@ module Pal
|
|
486
507
|
end
|
487
508
|
private_class_method :main
|
488
509
|
|
510
|
+
# Warn and remove variables that will be shadowed by facts of the same
|
511
|
+
# name, which are set in scope earlier.
|
512
|
+
def self.merge_vars(target_vars, vars, facts)
|
513
|
+
# First, shadow plan and target variables by facts of the same name
|
514
|
+
vars = shadow_vars(facts || {}, vars, 'fact', 'plan variable')
|
515
|
+
target_vars = shadow_vars(facts || {}, target_vars, 'fact', 'target variable')
|
516
|
+
# Then, shadow target variables by plan variables of the same name
|
517
|
+
target_vars = shadow_vars(vars, target_vars, 'plan variable', 'target variable')
|
518
|
+
|
519
|
+
target_vars.merge(vars)
|
520
|
+
end
|
521
|
+
private_class_method :merge_vars
|
522
|
+
|
523
|
+
def self.shadow_vars(vars, other_vars, vars_type, other_vars_type)
|
524
|
+
collisions, valid = other_vars.partition do |k, _|
|
525
|
+
vars.include?(k)
|
526
|
+
end
|
527
|
+
|
528
|
+
if collisions.any?
|
529
|
+
names = collisions.map { |k, _| "$#{k}" }.join(', ')
|
530
|
+
plural = collisions.length == 1 ? '' : 's'
|
531
|
+
|
532
|
+
Puppet.warning(
|
533
|
+
"#{other_vars_type.capitalize}#{plural} #{names} will be overridden by "\
|
534
|
+
"#{vars_type}#{plural} of the same name in the apply block"
|
535
|
+
)
|
536
|
+
end
|
537
|
+
|
538
|
+
valid.to_h
|
539
|
+
end
|
540
|
+
private_class_method :shadow_vars
|
541
|
+
|
489
542
|
def self.create_internal_compiler(compiler_class_reference, node)
|
490
543
|
case compiler_class_reference
|
491
544
|
when :script
|
@@ -50,8 +50,9 @@ class Puppet::Parser::AST::HostName < Puppet::Parser::AST::Leaf
|
|
50
50
|
end
|
51
51
|
|
52
52
|
class Puppet::Parser::AST::Regex < Puppet::Parser::AST::Leaf
|
53
|
-
def initialize(
|
54
|
-
super(
|
53
|
+
def initialize(value: nil, file: nil, line: nil, pos: nil)
|
54
|
+
super(value: value, file: file, line: line, pos: pos)
|
55
|
+
|
55
56
|
# transform value from hash options unless it is already a regular expression
|
56
57
|
@value = Regexp.new(@value) unless @value.is_a?(Regexp)
|
57
58
|
end
|
@@ -50,7 +50,7 @@ class Puppet::Parser::TemplateWrapper
|
|
50
50
|
# @return [Array<String>] The tags defined in the current scope
|
51
51
|
# @api public
|
52
52
|
def tags
|
53
|
-
|
53
|
+
raise NotImplementedError, "Call 'all_tags' instead."
|
54
54
|
end
|
55
55
|
|
56
56
|
# @return [Array<String>] All the defined tags
|
@@ -16,10 +16,12 @@ class DeferredResolver
|
|
16
16
|
#
|
17
17
|
# @param facts [Puppet::Node::Facts] the facts object for the node
|
18
18
|
# @param catalog [Puppet::Resource::Catalog] the catalog where all deferred values should be replaced
|
19
|
+
# @param environment [Puppet::Node::Environment] the environment whose anonymous module methods
|
20
|
+
# are to be mixed into the scope
|
19
21
|
# @return [nil] does not return anything - the catalog is modified as a side effect
|
20
22
|
#
|
21
|
-
def self.resolve_and_replace(facts, catalog)
|
22
|
-
compiler = Puppet::Parser::ScriptCompiler.new(
|
23
|
+
def self.resolve_and_replace(facts, catalog, environment = catalog.environment_instance)
|
24
|
+
compiler = Puppet::Parser::ScriptCompiler.new(environment, catalog.name, true)
|
23
25
|
resolver = new(compiler)
|
24
26
|
resolver.set_facts_variable(facts)
|
25
27
|
# TODO:
|
@@ -108,7 +110,7 @@ class DeferredResolver
|
|
108
110
|
# If any of the arguments to a future is a future it needs to be resolved first
|
109
111
|
func_name = f.name
|
110
112
|
mapped_arguments = map_arguments(f.arguments)
|
111
|
-
# if name starts with $ then this is a call to dig
|
113
|
+
# if name starts with $ then this is a call to dig
|
112
114
|
if func_name[0] == DOLLAR
|
113
115
|
var_name = func_name[1..-1]
|
114
116
|
func_name = DIG
|
@@ -462,10 +462,24 @@ class EvaluatorImpl
|
|
462
462
|
end
|
463
463
|
|
464
464
|
def eval_EppExpression(o, scope)
|
465
|
+
contains_sensitive = false
|
466
|
+
|
465
467
|
scope["@epp"] = []
|
466
468
|
evaluate(o.body, scope)
|
467
|
-
result = scope["@epp"].
|
468
|
-
|
469
|
+
result = scope["@epp"].map do |r|
|
470
|
+
if r.instance_of?(Puppet::Pops::Types::PSensitiveType::Sensitive)
|
471
|
+
contains_sensitive = true
|
472
|
+
string(r.unwrap, scope)
|
473
|
+
else
|
474
|
+
r
|
475
|
+
end
|
476
|
+
end.join
|
477
|
+
|
478
|
+
if contains_sensitive
|
479
|
+
Puppet::Pops::Types::PSensitiveType::Sensitive.new(result)
|
480
|
+
else
|
481
|
+
result
|
482
|
+
end
|
469
483
|
end
|
470
484
|
|
471
485
|
def eval_RenderStringExpression(o, scope)
|
@@ -474,7 +488,12 @@ class EvaluatorImpl
|
|
474
488
|
end
|
475
489
|
|
476
490
|
def eval_RenderExpression(o, scope)
|
477
|
-
|
491
|
+
result = evaluate(o.expr, scope)
|
492
|
+
if result.instance_of?(Puppet::Pops::Types::PSensitiveType::Sensitive)
|
493
|
+
scope["@epp"] << result
|
494
|
+
else
|
495
|
+
scope["@epp"] << string(result, scope)
|
496
|
+
end
|
478
497
|
nil
|
479
498
|
end
|
480
499
|
|
@@ -31,7 +31,7 @@ class Puppet::Pops::Model::AstTransformer
|
|
31
31
|
def ast(o, klass, hash={})
|
32
32
|
# create and pass hash with file and line information
|
33
33
|
# PUP-3274 - still needed since hostname transformation requires AST::HostName, and AST::Regexp
|
34
|
-
klass.new(merge_location(hash, o))
|
34
|
+
klass.new(**merge_location(hash, o))
|
35
35
|
end
|
36
36
|
|
37
37
|
# THIS IS AN EXPENSIVE OPERATION
|
data/lib/puppet/property/list.rb
CHANGED
@@ -47,7 +47,7 @@ module Puppet
|
|
47
47
|
#ok, some 'convention' if the list property is named groups, provider should implement a groups method
|
48
48
|
tmp = provider.send(name) if provider
|
49
49
|
if tmp && tmp != :absent
|
50
|
-
return tmp.split(delimiter)
|
50
|
+
return tmp.instance_of?(Array) ? tmp : tmp.split(delimiter)
|
51
51
|
else
|
52
52
|
return :absent
|
53
53
|
end
|
@@ -130,16 +130,21 @@ Puppet::Type.type(:group).provide :groupadd, :parent => Puppet::Provider::NameSe
|
|
130
130
|
private
|
131
131
|
|
132
132
|
def findgroup(key, value)
|
133
|
-
group_file =
|
133
|
+
group_file = '/etc/group'
|
134
134
|
group_keys = [:group_name, :password, :gid, :user_list]
|
135
|
-
|
136
|
-
@
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
135
|
+
|
136
|
+
unless @groups
|
137
|
+
unless Puppet::FileSystem.exist?(group_file)
|
138
|
+
raise Puppet::Error.new("Forcelocal set for group resource '#{resource[:name]}', but #{group_file} does not exist")
|
139
|
+
end
|
140
|
+
|
141
|
+
@groups = []
|
142
|
+
Puppet::FileSystem.each_line(group_file) do |line|
|
143
|
+
group = line.chomp.split(':')
|
144
|
+
@groups << Hash[group_keys.zip(group)]
|
141
145
|
end
|
142
146
|
end
|
143
|
-
|
147
|
+
|
148
|
+
@groups.find { |param| param[key] == value } || false
|
144
149
|
end
|
145
150
|
end
|
@@ -42,7 +42,11 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
|
|
42
42
|
|
43
43
|
def query
|
44
44
|
hash = super
|
45
|
-
|
45
|
+
|
46
|
+
if !%i(absent purged).include?(hash[:ensure]) && aptmark('showmanual', @resource[:name]).strip == @resource[:name]
|
47
|
+
hash[:mark] = :manual
|
48
|
+
end
|
49
|
+
|
46
50
|
hash
|
47
51
|
end
|
48
52
|
|
@@ -51,6 +55,10 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
|
|
51
55
|
@property_flush = {}
|
52
56
|
end
|
53
57
|
|
58
|
+
def mark
|
59
|
+
@property_flush[:mark]
|
60
|
+
end
|
61
|
+
|
54
62
|
def mark=(value)
|
55
63
|
@property_flush[:mark] = value
|
56
64
|
end
|
@@ -143,7 +151,13 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
|
|
143
151
|
end
|
144
152
|
|
145
153
|
cmd += install_options if @resource[:install_options]
|
146
|
-
cmd << :install
|
154
|
+
cmd << :install
|
155
|
+
|
156
|
+
if source
|
157
|
+
cmd << source
|
158
|
+
else
|
159
|
+
cmd << str
|
160
|
+
end
|
147
161
|
|
148
162
|
self.unhold if self.properties[:mark] == :hold
|
149
163
|
begin
|
@@ -151,6 +165,18 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
|
|
151
165
|
ensure
|
152
166
|
self.hold if @resource[:mark] == :hold
|
153
167
|
end
|
168
|
+
|
169
|
+
# If a source file was specified, we must make sure the expected version was installed from specified file
|
170
|
+
if source && !%i(present installed).include?(should)
|
171
|
+
is = self.query
|
172
|
+
raise Puppet::Error, _("Could not find package %{name}") % { name: self.name } unless is
|
173
|
+
|
174
|
+
version = is[:ensure]
|
175
|
+
|
176
|
+
raise Puppet::Error, _("Failed to update to version %{should}, got version %{version} instead") % { should: should, version: version } unless
|
177
|
+
insync?(version)
|
178
|
+
end
|
179
|
+
|
154
180
|
end
|
155
181
|
|
156
182
|
# What's the latest package version available?
|
@@ -227,4 +253,10 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
|
|
227
253
|
end
|
228
254
|
should_range.include?(is_version)
|
229
255
|
end
|
256
|
+
|
257
|
+
private
|
258
|
+
|
259
|
+
def source
|
260
|
+
@source ||= @resource[:source]
|
261
|
+
end
|
230
262
|
end
|