puppet 6.10.1 → 6.11.0
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/Gemfile +4 -4
- data/Gemfile.lock +20 -12
- data/ext/project_data.yaml +3 -2
- data/ext/regexp_nodes/regexp_nodes.rb +4 -4
- data/ext/windows/service/daemon.rb +33 -8
- data/install.rb +6 -6
- data/lib/puppet.rb +8 -0
- data/lib/puppet/application.rb +1 -1
- data/lib/puppet/application/agent.rb +3 -0
- data/lib/puppet/application/apply.rb +2 -2
- data/lib/puppet/application/describe.rb +3 -9
- data/lib/puppet/application/device.rb +3 -0
- data/lib/puppet/application/doc.rb +1 -1
- data/lib/puppet/application/lookup.rb +1 -1
- data/lib/puppet/application/script.rb +2 -2
- data/lib/puppet/application/ssl.rb +25 -21
- data/lib/puppet/configurer.rb +42 -0
- data/lib/puppet/configurer/downloader.rb +2 -6
- data/lib/puppet/context/trusted_information.rb +42 -4
- data/lib/puppet/defaults.rb +19 -4
- data/lib/puppet/face/module/list.rb +5 -5
- data/lib/puppet/face/module/search.rb +1 -1
- data/lib/puppet/face/module/uninstall.rb +1 -1
- data/lib/puppet/face/module/upgrade.rb +1 -1
- data/lib/puppet/file_serving/http_metadata.rb +1 -1
- data/lib/puppet/file_system.rb +0 -8
- data/lib/puppet/file_system/memory_file.rb +1 -1
- data/lib/puppet/file_system/posix.rb +3 -2
- data/lib/puppet/forge.rb +3 -3
- data/lib/puppet/functions.rb +1 -2
- data/lib/puppet/gettext/module_translations.rb +1 -1
- data/lib/puppet/graph/rb_tree_map.rb +2 -2
- data/lib/puppet/graph/simple_graph.rb +4 -3
- data/lib/puppet/http.rb +29 -0
- data/lib/puppet/http/client.rb +156 -0
- data/lib/puppet/http/errors.rb +30 -0
- data/lib/puppet/http/redirector.rb +48 -0
- data/lib/puppet/http/resolver.rb +5 -0
- data/lib/puppet/http/resolver/settings.rb +5 -0
- data/lib/puppet/http/resolver/srv.rb +13 -0
- data/lib/puppet/http/response.rb +34 -0
- data/lib/puppet/http/retry_after_handler.rb +47 -0
- data/lib/puppet/http/service.rb +18 -0
- data/lib/puppet/http/service/ca.rb +49 -0
- data/lib/puppet/http/session.rb +55 -0
- data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
- data/lib/puppet/indirector/hiera.rb +2 -0
- data/lib/puppet/indirector/request.rb +1 -1
- data/lib/puppet/indirector/resource/ral.rb +1 -3
- data/lib/puppet/indirector/resource/validator.rb +1 -1
- data/lib/puppet/interface.rb +2 -1
- data/lib/puppet/interface/documentation.rb +1 -1
- data/lib/puppet/loaders.rb +0 -1
- data/lib/puppet/metatype/manager.rb +1 -1
- data/lib/puppet/module.rb +1 -1
- data/lib/puppet/module/task.rb +20 -4
- data/lib/puppet/module_tool/applications/installer.rb +1 -1
- data/lib/puppet/module_tool/applications/uninstaller.rb +3 -3
- data/lib/puppet/module_tool/metadata.rb +1 -1
- data/lib/puppet/module_tool/shared_behaviors.rb +4 -4
- data/lib/puppet/module_tool/tar/mini.rb +1 -1
- data/lib/puppet/network/http.rb +2 -6
- data/lib/puppet/network/http/api/indirected_routes.rb +12 -11
- data/lib/puppet/network/http/connection.rb +10 -12
- data/lib/puppet/network/http/pool.rb +2 -0
- data/lib/puppet/network/http/site.rb +5 -1
- data/lib/puppet/network/resolver.rb +4 -4
- data/lib/puppet/node/environment.rb +4 -2
- data/lib/puppet/pal/pal_impl.rb +2 -2
- data/lib/puppet/parser/ast.rb +1 -1
- data/lib/puppet/parser/ast/resourceparam.rb +1 -1
- data/lib/puppet/parser/functions.rb +1 -1
- data/lib/puppet/parser/scope.rb +8 -7
- data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +1 -1
- data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +1 -1
- data/lib/puppet/pops/evaluator/external_syntax_support.rb +3 -2
- data/lib/puppet/pops/evaluator/runtime3_support.rb +4 -7
- data/lib/puppet/pops/loader/module_loaders.rb +1 -1
- data/lib/puppet/pops/loader/task_instantiator.rb +4 -0
- data/lib/puppet/pops/loaders.rb +1 -1
- data/lib/puppet/pops/lookup/hiera_config.rb +1 -0
- data/lib/puppet/pops/lookup/sub_lookup.rb +1 -1
- data/lib/puppet/pops/merge_strategy.rb +22 -18
- data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
- data/lib/puppet/pops/parser/interpolation_support.rb +4 -4
- data/lib/puppet/pops/parser/locator.rb +1 -1
- data/lib/puppet/pops/parser/pn_parser.rb +17 -16
- data/lib/puppet/pops/puppet_stack.rb +52 -48
- data/lib/puppet/pops/types/p_sensitive_type.rb +1 -1
- data/lib/puppet/pops/types/p_uri_type.rb +1 -1
- data/lib/puppet/pops/types/string_converter.rb +10 -10
- data/lib/puppet/pops/types/types.rb +3 -3
- data/lib/puppet/property.rb +1 -1
- data/lib/puppet/property/ensure.rb +1 -1
- data/lib/puppet/provider/exec.rb +6 -2
- data/lib/puppet/provider/nameservice/directoryservice.rb +1 -1
- data/lib/puppet/provider/nameservice/pw.rb +2 -2
- data/lib/puppet/provider/package/apt.rb +5 -1
- data/lib/puppet/provider/package/dnfmodule.rb +87 -0
- data/lib/puppet/provider/package/dpkg.rb +31 -17
- data/lib/puppet/provider/package/openbsd.rb +1 -1
- data/lib/puppet/provider/package/pip.rb +34 -9
- data/lib/puppet/provider/package/portage.rb +1 -1
- data/lib/puppet/provider/package/rpm.rb +5 -5
- data/lib/puppet/provider/package/windows/package.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +1 -1
- data/lib/puppet/provider/parsedfile.rb +1 -1
- data/lib/puppet/provider/service/daemontools.rb +9 -9
- data/lib/puppet/provider/service/openbsd.rb +1 -1
- data/lib/puppet/provider/service/rcng.rb +2 -2
- data/lib/puppet/provider/service/runit.rb +2 -8
- data/lib/puppet/provider/service/systemd.rb +10 -10
- data/lib/puppet/provider/user/directoryservice.rb +1 -1
- data/lib/puppet/provider/user/user_role_add.rb +1 -1
- data/lib/puppet/provider/user/useradd.rb +22 -13
- data/lib/puppet/provider/user/windows_adsi.rb +4 -5
- data/lib/puppet/reference/indirection.rb +2 -2
- data/lib/puppet/reference/metaparameter.rb +1 -3
- data/lib/puppet/reference/providers.rb +1 -1
- data/lib/puppet/reference/type.rb +3 -9
- data/lib/puppet/reports.rb +1 -1
- data/lib/puppet/resource.rb +1 -1
- data/lib/puppet/resource/catalog.rb +1 -1
- data/lib/puppet/rest/errors.rb +1 -0
- data/lib/puppet/rest/response.rb +1 -0
- data/lib/puppet/rest/route.rb +1 -0
- data/lib/puppet/rest/routes.rb +3 -0
- data/lib/puppet/runtime.rb +25 -0
- data/lib/puppet/settings.rb +3 -3
- data/lib/puppet/settings/environment_conf.rb +1 -0
- data/lib/puppet/ssl/host.rb +1 -1
- data/lib/puppet/ssl/oids.rb +1 -1
- data/lib/puppet/ssl/state_machine.rb +23 -15
- data/lib/puppet/test/test_helper.rb +1 -1
- data/lib/puppet/transaction/report.rb +1 -1
- data/lib/puppet/trusted_external.rb +13 -0
- data/lib/puppet/type.rb +1 -3
- data/lib/puppet/type/exec.rb +7 -3
- data/lib/puppet/type/file.rb +1 -2
- data/lib/puppet/type/file/source.rb +2 -2
- data/lib/puppet/type/package.rb +10 -3
- data/lib/puppet/type/schedule.rb +1 -1
- data/lib/puppet/type/service.rb +1 -1
- data/lib/puppet/util.rb +2 -2
- data/lib/puppet/util/command_line/trollop.rb +1 -1
- data/lib/puppet/util/http_proxy.rb +2 -10
- data/lib/puppet/util/log.rb +2 -2
- data/lib/puppet/util/log/destinations.rb +2 -2
- data/lib/puppet/util/logging.rb +2 -2
- data/lib/puppet/util/metric.rb +2 -2
- data/lib/puppet/util/platform.rb +15 -4
- data/lib/puppet/util/provider_features.rb +2 -4
- data/lib/puppet/util/rdoc.rb +1 -1
- data/lib/puppet/util/reference.rb +1 -1
- data/lib/puppet/util/resource_template.rb +1 -1
- data/lib/puppet/util/selinux.rb +3 -1
- data/lib/puppet/util/windows/registry.rb +7 -5
- data/lib/puppet/vendor.rb +1 -1
- data/lib/puppet/vendor/require_vendored.rb +0 -1
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet/x509/cert_provider.rb +4 -1
- data/locales/puppet.pot +279 -203
- data/man/man5/puppet.conf.5 +30 -8
- data/man/man8/puppet-agent.8 +4 -1
- data/man/man8/puppet-apply.8 +1 -1
- 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 +1 -1
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +1 -1
- data/man/man8/puppet-filebucket.8 +1 -1
- 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 +1 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +1 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +1 -1
- data/man/man8/puppet-ssl.8 +1 -1
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/unit/provider/package/dnfmodule/dnf-module-list-installed.txt +11 -0
- data/spec/integration/configurer_spec.rb +52 -0
- data/spec/lib/puppet/certificate_factory.rb +2 -2
- data/spec/spec_helper.rb +24 -0
- data/spec/unit/application/device_spec.rb +6 -0
- data/spec/unit/application/ssl_spec.rb +4 -7
- data/spec/unit/configurer_spec.rb +1 -0
- data/spec/unit/context/trusted_information_spec.rb +41 -2
- data/spec/unit/http/client_spec.rb +440 -0
- data/spec/unit/http/resolver_spec.rb +45 -0
- data/spec/unit/http/service/ca_spec.rb +106 -0
- data/spec/unit/http/service_spec.rb +32 -0
- data/spec/unit/http/session_spec.rb +102 -0
- data/spec/unit/indirector/resource/ral_spec.rb +4 -4
- data/spec/unit/network/http/connection_spec.rb +119 -145
- data/spec/unit/network/http/site_spec.rb +7 -0
- data/spec/unit/parser/scope_spec.rb +10 -0
- data/spec/unit/pops/loaders/loaders_spec.rb +13 -2
- data/spec/unit/pops/loaders/module_loaders_spec.rb +37 -0
- data/spec/unit/provider/exec_spec.rb +209 -0
- data/spec/unit/provider/package/dnfmodule_spec.rb +186 -0
- data/spec/unit/provider/package/dpkg_spec.rb +238 -78
- data/spec/unit/provider/package/pip_spec.rb +51 -6
- data/spec/unit/provider/service/daemontools_spec.rb +24 -0
- data/spec/unit/provider/service/runit_spec.rb +24 -0
- data/spec/unit/provider/service/systemd_spec.rb +25 -25
- data/spec/unit/provider/user/useradd_spec.rb +46 -0
- data/spec/unit/ssl/host_spec.rb +0 -5
- data/spec/unit/ssl/state_machine_spec.rb +16 -10
- data/spec/unit/type/exec_spec.rb +6 -12
- data/spec/unit/type/file_spec.rb +9 -4
- data/spec/unit/type/package_spec.rb +5 -0
- data/spec/unit/util/execution_spec.rb +16 -0
- data/spec/unit/util/http_proxy_spec.rb +79 -27
- data/spec/unit/util/log/destinations_spec.rb +7 -3
- metadata +45 -22
- data/lib/puppet/pops/loader/null_loader.rb +0 -60
- data/lib/puppet/vendor/deep_merge/CHANGELOG +0 -45
- data/lib/puppet/vendor/deep_merge/Gemfile +0 -3
- data/lib/puppet/vendor/deep_merge/LICENSE +0 -21
- data/lib/puppet/vendor/deep_merge/PUPPET_README.md +0 -6
- data/lib/puppet/vendor/deep_merge/README.md +0 -113
- data/lib/puppet/vendor/deep_merge/Rakefile +0 -19
- data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +0 -35
- data/lib/puppet/vendor/deep_merge/lib/deep_merge.rb +0 -2
- data/lib/puppet/vendor/deep_merge/lib/deep_merge/core.rb +0 -210
- data/lib/puppet/vendor/deep_merge/lib/deep_merge/deep_merge_hash.rb +0 -28
- data/lib/puppet/vendor/deep_merge/lib/deep_merge/rails_compat.rb +0 -27
- data/lib/puppet/vendor/deep_merge/test/test_deep_merge.rb +0 -608
- data/lib/puppet/vendor/load_deep_merge.rb +0 -1
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +0 -24
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +0 -24
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +0 -24
@@ -23,8 +23,8 @@ module Puppet::Network
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
def initialize
|
27
|
-
@resolver =
|
26
|
+
def initialize(resolver = Resolv::DNS.new)
|
27
|
+
@resolver = resolver
|
28
28
|
|
29
29
|
# Stores DNS records per service, along with their TTL
|
30
30
|
# and the time at which they were resolved, for cache
|
@@ -50,7 +50,7 @@ module Puppet::Network
|
|
50
50
|
case service_name
|
51
51
|
when :puppet then service = '_x-puppet'
|
52
52
|
when :file then service = '_x-puppet-fileserver'
|
53
|
-
else service = "_x-puppet-#{service_name
|
53
|
+
else service = "_x-puppet-#{service_name}"
|
54
54
|
end
|
55
55
|
record_name = "#{service}._tcp.#{domain}"
|
56
56
|
|
@@ -72,7 +72,7 @@ module Puppet::Network
|
|
72
72
|
else
|
73
73
|
each_priority(records) do |recs|
|
74
74
|
while next_rr = recs.delete(find_weighted_server(recs)) #rubocop:disable Lint/AssignmentInCondition
|
75
|
-
Puppet.debug "Yielding next server of #{next_rr.target
|
75
|
+
Puppet.debug "Yielding next server of #{next_rr.target}:#{next_rr.port}"
|
76
76
|
yield next_rr.target.to_s, next_rr.port
|
77
77
|
end
|
78
78
|
end
|
@@ -480,8 +480,7 @@ class Puppet::Node::Environment
|
|
480
480
|
[self.class, name, full_modulepath, manifest].hash
|
481
481
|
end
|
482
482
|
|
483
|
-
private
|
484
|
-
|
483
|
+
# not private so it can be called in tests
|
485
484
|
def self.extralibs()
|
486
485
|
if Puppet::Util.get_env('PUPPETLIB')
|
487
486
|
split_path(Puppet::Util.get_env('PUPPETLIB'))
|
@@ -490,12 +489,15 @@ class Puppet::Node::Environment
|
|
490
489
|
end
|
491
490
|
end
|
492
491
|
|
492
|
+
# not private so it can be called in initialize
|
493
493
|
def self.expand_dirs(dirs)
|
494
494
|
dirs.collect do |dir|
|
495
495
|
Puppet::FileSystem.expand_path(dir)
|
496
496
|
end
|
497
497
|
end
|
498
498
|
|
499
|
+
private
|
500
|
+
|
499
501
|
# Reparse the manifests for the given environment
|
500
502
|
#
|
501
503
|
# There are two sources that can be used for the initial parse:
|
data/lib/puppet/pal/pal_impl.rb
CHANGED
@@ -470,8 +470,8 @@ module Pal
|
|
470
470
|
end
|
471
471
|
end
|
472
472
|
|
473
|
-
rescue Puppet::
|
474
|
-
# already logged and handled by the compiler
|
473
|
+
rescue Puppet::Error
|
474
|
+
# already logged and handled by the compiler, including Puppet::ParseErrorWithIssue
|
475
475
|
raise
|
476
476
|
|
477
477
|
rescue => detail
|
data/lib/puppet/parser/ast.rb
CHANGED
@@ -11,7 +11,7 @@ class Puppet::Parser::AST
|
|
11
11
|
attr_accessor :parent, :scope, :file, :line, :pos
|
12
12
|
|
13
13
|
def inspect
|
14
|
-
"( #{self.class} #{self
|
14
|
+
"( #{self.class} #{self} #{@children.inspect} )"
|
15
15
|
end
|
16
16
|
|
17
17
|
# Evaluate the current object. Just a stub method, since the subclass
|
@@ -24,7 +24,7 @@ module Puppet::Parser::Functions
|
|
24
24
|
Puppet::Util::Log.levels.each do |level|
|
25
25
|
newfunction(level,
|
26
26
|
:environment => root_env,
|
27
|
-
:doc => "Log a message on the server at level #{level
|
27
|
+
:doc => "Log a message on the server at level #{level}.") do |vals|
|
28
28
|
send(level, vals.join(" "))
|
29
29
|
end
|
30
30
|
end
|
data/lib/puppet/parser/scope.rb
CHANGED
@@ -66,8 +66,8 @@ class Puppet::Parser::Scope
|
|
66
66
|
false
|
67
67
|
end
|
68
68
|
|
69
|
-
def add_entries_to(target = {})
|
70
|
-
@parent.add_entries_to(target) unless @parent.nil?
|
69
|
+
def add_entries_to(target = {}, include_undef = false)
|
70
|
+
@parent.add_entries_to(target, include_undef) unless @parent.nil?
|
71
71
|
# do not include match data ($0-$n)
|
72
72
|
target
|
73
73
|
end
|
@@ -105,10 +105,10 @@ class Puppet::Parser::Scope
|
|
105
105
|
@symbols.include?(name)
|
106
106
|
end
|
107
107
|
|
108
|
-
def add_entries_to(target = {})
|
108
|
+
def add_entries_to(target = {}, include_undef = false)
|
109
109
|
super
|
110
110
|
@symbols.each do |k, v|
|
111
|
-
if v == :undef || v.nil?
|
111
|
+
if (v == :undef || v.nil?) && !include_undef
|
112
112
|
target.delete(k)
|
113
113
|
else
|
114
114
|
target[ k ] = v
|
@@ -160,7 +160,7 @@ class Puppet::Parser::Scope
|
|
160
160
|
raise Puppet::ParseError, _("Numerical variables cannot be deleted: Attempt to delete: $%{name}") % { name: name }
|
161
161
|
end
|
162
162
|
|
163
|
-
def add_entries_to(target = {})
|
163
|
+
def add_entries_to(target = {}, include_undef = false)
|
164
164
|
# do not include match data ($0-$n)
|
165
165
|
super
|
166
166
|
end
|
@@ -662,8 +662,9 @@ class Puppet::Parser::Scope
|
|
662
662
|
# Returns a Hash containing all variables and their values, optionally (and
|
663
663
|
# by default) including the values defined in parent. Local values
|
664
664
|
# shadow parent values. Ephemeral scopes for match results ($0 - $n) are not included.
|
665
|
+
# Optionally include the variables that are explicitly set to `undef`.
|
665
666
|
#
|
666
|
-
def to_hash(recursive = true)
|
667
|
+
def to_hash(recursive = true, include_undef = false)
|
667
668
|
if recursive and has_enclosing_scope?
|
668
669
|
target = enclosing_scope.to_hash(recursive)
|
669
670
|
if !(inherited = inherited_scope).nil?
|
@@ -674,7 +675,7 @@ class Puppet::Parser::Scope
|
|
674
675
|
end
|
675
676
|
|
676
677
|
# add all local scopes
|
677
|
-
@ephemeral.last.add_entries_to(target)
|
678
|
+
@ephemeral.last.add_entries_to(target, include_undef)
|
678
679
|
target
|
679
680
|
end
|
680
681
|
|
@@ -35,10 +35,11 @@ module Puppet::Pops::Evaluator::ExternalSyntaxSupport
|
|
35
35
|
def lookup_keys_for_syntax(syntax)
|
36
36
|
segments = syntax.split(/\+/)
|
37
37
|
result = []
|
38
|
-
|
38
|
+
loop do
|
39
39
|
result << segments.join("+")
|
40
40
|
segments.shift
|
41
|
-
|
41
|
+
break if segments.empty?
|
42
|
+
end
|
42
43
|
result
|
43
44
|
end
|
44
45
|
|
@@ -298,14 +298,11 @@ module Runtime3Support
|
|
298
298
|
def call_function(name, args, o, scope, &block)
|
299
299
|
file, line = extract_file_line(o)
|
300
300
|
loader = Adapters::LoaderAdapter.loader_for_model_object(o, file)
|
301
|
-
|
302
|
-
|
303
|
-
# underscore, we let Ruby know to not worry about whether it's unused or not.
|
304
|
-
_func = loader.load(:function, name) if loader
|
305
|
-
if _func
|
301
|
+
func = loader.load(:function, name) if loader
|
302
|
+
if func
|
306
303
|
Puppet::Util::Profiler.profile(name, [:functions, name]) do
|
307
|
-
# Add stack frame when calling.
|
308
|
-
return
|
304
|
+
# Add stack frame when calling.
|
305
|
+
return Puppet::Pops::PuppetStack.stack(file || '', line, func, :call, [scope, *args], &block)
|
309
306
|
end
|
310
307
|
end
|
311
308
|
# Call via 3x API if function exists there without having been autoloaded
|
@@ -18,6 +18,10 @@ class TaskInstantiator
|
|
18
18
|
task = { 'name' => name, 'metadata' => metadata, 'files' => files }
|
19
19
|
|
20
20
|
begin
|
21
|
+
unless metadata['parameters'].is_a?(Hash) || metadata['parameters'].nil?
|
22
|
+
msg = _('Failed to load metadata for task %{name}: \'parameters\' must be a hash') % { name: name }
|
23
|
+
raise Puppet::ParseError.new(msg, metadata_file)
|
24
|
+
end
|
21
25
|
task['parameters'] = convert_types(metadata['parameters'])
|
22
26
|
|
23
27
|
Types::TypeFactory.task.from_hash(task)
|
data/lib/puppet/pops/loaders.rb
CHANGED
@@ -283,7 +283,7 @@ class Loaders
|
|
283
283
|
nil
|
284
284
|
elsif File.directory?(file)
|
285
285
|
raise Puppet::Error, "manifest of environment '#{@environment.name}' appoints directory '#{file}'. It must be a file"
|
286
|
-
elsif File.
|
286
|
+
elsif File.exist?(file)
|
287
287
|
parser.parse_file(file)
|
288
288
|
else
|
289
289
|
raise Puppet::Error, "manifest of environment '#{@environment.name}' appoints '#{file}'. It does not exist"
|
@@ -339,6 +339,7 @@ class HieraConfig
|
|
339
339
|
def self.not_implemented(impl, method_name)
|
340
340
|
raise NotImplementedError, "The class #{impl.class.name} should have implemented the method #{method_name}()"
|
341
341
|
end
|
342
|
+
private_class_method :not_implemented
|
342
343
|
end
|
343
344
|
|
344
345
|
# @api private
|
@@ -30,7 +30,7 @@ module SubLookup
|
|
30
30
|
raise yield('Syntax error') unless segments.size * 2 == count + 1
|
31
31
|
segments.map! do |segment|
|
32
32
|
segment.strip!
|
33
|
-
if segment.start_with?('"'
|
33
|
+
if segment.start_with?('"', "'")
|
34
34
|
segment[1..-2]
|
35
35
|
elsif segment =~ /^(:?[+-]?[0-9]+)$/
|
36
36
|
segment.to_i
|
@@ -173,12 +173,14 @@ module Puppet::Pops
|
|
173
173
|
|
174
174
|
protected
|
175
175
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
176
|
+
class << self
|
177
|
+
# Returns the type used to validate the options hash
|
178
|
+
#
|
179
|
+
# @return [Types::PStructType] the puppet type
|
180
|
+
#
|
181
|
+
def options_t
|
182
|
+
@options_t ||=Types::TypeParser.singleton.parse("Struct[{strategy=>Optional[Pattern[/#{key}/]]}]")
|
183
|
+
end
|
182
184
|
end
|
183
185
|
|
184
186
|
# Returns the type used to validate the options hash
|
@@ -383,18 +385,20 @@ module Puppet::Pops
|
|
383
385
|
|
384
386
|
protected
|
385
387
|
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
388
|
+
class << self
|
389
|
+
# Returns a type that allows all deep_merge options except 'preserve_unmergeables' since we force
|
390
|
+
# the setting of that option to false
|
391
|
+
#
|
392
|
+
# @return [Types::PAnyType] the puppet type used when validating the options hash
|
393
|
+
def options_t
|
394
|
+
@options_t ||= Types::TypeParser.singleton.parse('Struct[{'\
|
395
|
+
"strategy=>Optional[Pattern[#{key}]],"\
|
396
|
+
'knockout_prefix=>Optional[String],'\
|
397
|
+
'merge_debug=>Optional[Boolean],'\
|
398
|
+
'merge_hash_arrays=>Optional[Boolean],'\
|
399
|
+
'sort_merged_arrays=>Optional[Boolean],'\
|
400
|
+
'}]')
|
401
|
+
end
|
398
402
|
end
|
399
403
|
|
400
404
|
def value_t
|
@@ -137,7 +137,7 @@ module HeredocSupport
|
|
137
137
|
# simply leaves lines that have text in the margin untouched.
|
138
138
|
#
|
139
139
|
processed_lines = lines.collect {|s| s.gsub(leading_pattern, '') }
|
140
|
-
margin_per_line = processed_lines.length
|
140
|
+
margin_per_line = Array.new(processed_lines.length) {|x| lines[x].length - processed_lines[x].length }
|
141
141
|
lines = processed_lines
|
142
142
|
else
|
143
143
|
# Array with a 0 per line
|
@@ -23,7 +23,7 @@ module Puppet::Pops::Parser::InterpolationSupport
|
|
23
23
|
value,terminator = slurp_dqstring()
|
24
24
|
text = value
|
25
25
|
after = scn.pos
|
26
|
-
|
26
|
+
loop do
|
27
27
|
case terminator
|
28
28
|
when '"'
|
29
29
|
# simple case, there was no interpolation, return directly
|
@@ -64,7 +64,7 @@ module Puppet::Pops::Parser::InterpolationSupport
|
|
64
64
|
value,terminator = slurp_dqstring
|
65
65
|
text = value
|
66
66
|
after = scn.pos
|
67
|
-
|
67
|
+
loop do
|
68
68
|
case terminator
|
69
69
|
when '"'
|
70
70
|
# simple case, there was no further interpolation, return directly
|
@@ -109,7 +109,7 @@ module Puppet::Pops::Parser::InterpolationSupport
|
|
109
109
|
value,terminator = slurp_uqstring()
|
110
110
|
text = value
|
111
111
|
after = scn.pos
|
112
|
-
|
112
|
+
loop do
|
113
113
|
case terminator
|
114
114
|
when ''
|
115
115
|
# simple case, there was no interpolation, return directly
|
@@ -150,7 +150,7 @@ module Puppet::Pops::Parser::InterpolationSupport
|
|
150
150
|
value,terminator = slurp_uqstring
|
151
151
|
text = value
|
152
152
|
after = scn.pos
|
153
|
-
|
153
|
+
loop do
|
154
154
|
case terminator
|
155
155
|
when ''
|
156
156
|
# simple case, there was no further interpolation, return directly
|
@@ -90,7 +90,7 @@ class Locator
|
|
90
90
|
f = Puppet::Util.path_to_uri(f).to_s
|
91
91
|
end
|
92
92
|
offset = ast.offset
|
93
|
-
URI("#{f}?line=#{line_for_offset(offset)
|
93
|
+
URI("#{f}?line=#{line_for_offset(offset)}&pos=#{pos_on_line(offset)}")
|
94
94
|
end
|
95
95
|
|
96
96
|
class AbstractLocator < Locator
|
@@ -48,6 +48,23 @@ class PNParser
|
|
48
48
|
parse_next
|
49
49
|
end
|
50
50
|
|
51
|
+
def self.char_types
|
52
|
+
unless instance_variable_defined?(:@char_types)
|
53
|
+
@char_types = Array.new(0x80, TYPE_IDENTIFIER)
|
54
|
+
@char_types[0] = TYPE_END
|
55
|
+
[0x09, 0x0d, 0x0a, 0x20].each { |n| @char_types[n] = TYPE_WS }
|
56
|
+
[TOKEN_LP, TOKEN_RP, TOKEN_LB, TOKEN_RB, TOKEN_LC, TOKEN_RC].each { |n| @char_types[n] = TYPE_DELIM }
|
57
|
+
@char_types[0x2d] = TYPE_MINUS
|
58
|
+
(0x30..0x39).each { |n| @char_types[n] = TYPE_DIGIT }
|
59
|
+
(0x41..0x5a).each { |n| @char_types[n] = TYPE_ALPHA }
|
60
|
+
(0x61..0x7a).each { |n| @char_types[n] = TYPE_ALPHA }
|
61
|
+
@char_types[TOKEN_KEY] = TYPE_KEY_START
|
62
|
+
@char_types[TOKEN_STRING] = TYPE_STRING_START
|
63
|
+
@char_types.freeze
|
64
|
+
end
|
65
|
+
@char_types
|
66
|
+
end
|
67
|
+
|
51
68
|
private
|
52
69
|
|
53
70
|
def parse_next
|
@@ -128,22 +145,6 @@ class PNParser
|
|
128
145
|
end
|
129
146
|
|
130
147
|
# All methods below belong to the PN lexer
|
131
|
-
def self.char_types
|
132
|
-
unless instance_variable_defined?(:@char_types)
|
133
|
-
@char_types = Array.new(0x80, TYPE_IDENTIFIER)
|
134
|
-
@char_types[0] = TYPE_END
|
135
|
-
[0x09, 0x0d, 0x0a, 0x20].each { |n| @char_types[n] = TYPE_WS }
|
136
|
-
[TOKEN_LP, TOKEN_RP, TOKEN_LB, TOKEN_RB, TOKEN_LC, TOKEN_RC].each { |n| @char_types[n] = TYPE_DELIM }
|
137
|
-
@char_types[0x2d] = TYPE_MINUS
|
138
|
-
(0x30..0x39).each { |n| @char_types[n] = TYPE_DIGIT }
|
139
|
-
(0x41..0x5a).each { |n| @char_types[n] = TYPE_ALPHA }
|
140
|
-
(0x61..0x7a).each { |n| @char_types[n] = TYPE_ALPHA }
|
141
|
-
@char_types[TOKEN_KEY] = TYPE_KEY_START
|
142
|
-
@char_types[TOKEN_STRING] = TYPE_STRING_START
|
143
|
-
@char_types.freeze
|
144
|
-
end
|
145
|
-
@char_types
|
146
|
-
end
|
147
148
|
|
148
149
|
def next_token
|
149
150
|
skip_white
|
@@ -1,57 +1,61 @@
|
|
1
|
-
|
2
|
-
# Module for making a call such that there is an identifiable entry on
|
3
|
-
# the ruby call stack enabling getting a puppet call stack
|
4
|
-
# To use this make a call with:
|
5
|
-
# ```
|
6
|
-
# Puppet::Pops::PuppetStack.stack(file, line, receiver, message, args)
|
7
|
-
# ```
|
8
|
-
# To get the stack call:
|
9
|
-
# ```
|
10
|
-
# Puppet::Pops::PuppetStack.stacktrace
|
11
|
-
#
|
12
|
-
# When getting a backtrace in Ruby, the puppet stack frames are
|
13
|
-
# identified as coming from "in 'stack'" and having a ".pp" file
|
14
|
-
# name.
|
15
|
-
# To support testing, a given file that is an empty string, or nil
|
16
|
-
# as well as a nil line number are supported. Such stack frames
|
17
|
-
# will be represented with the text `unknown` and `0´ respectively.
|
18
|
-
#
|
19
|
-
module PuppetStack
|
20
|
-
# Pattern matching an entry in the ruby stack that is a puppet entry
|
21
|
-
PP_ENTRY_PATTERN = /^(.*\.pp)?:([0-9]+):in (`stack'|`block in call_function'|`<eval>')/
|
1
|
+
require 'puppet/thread_local'
|
22
2
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
3
|
+
module Puppet
|
4
|
+
module Pops
|
5
|
+
# Utility class for keeping track of the "Puppet stack", ie the file
|
6
|
+
# and line numbers of Puppet Code that created the current context.
|
7
|
+
#
|
8
|
+
# To use this make a call with:
|
9
|
+
#
|
10
|
+
# ```rb
|
11
|
+
# Puppet::Pops::PuppetStack.stack(file, line, receiver, message, args)
|
12
|
+
# ```
|
13
|
+
#
|
14
|
+
# To get the stack call:
|
15
|
+
#
|
16
|
+
# ```rb
|
17
|
+
# Puppet::Pops::PuppetStack.stacktrace
|
18
|
+
# ```
|
19
|
+
#
|
20
|
+
# or
|
21
|
+
#
|
22
|
+
# ```rb
|
23
|
+
# Puppet::Pops::PuppetStack.top_of_stack
|
24
|
+
# ```
|
25
|
+
#
|
26
|
+
# To support testing, a given file that is an empty string, or nil
|
27
|
+
# as well as a nil line number are supported. Such stack frames
|
28
|
+
# will be represented with the text `unknown` and `0´ respectively.
|
29
|
+
module PuppetStack
|
30
|
+
@stack = Puppet::ThreadLocal.new { Array.new }
|
29
31
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
Kernel.eval("obj.send(message, *args)", Kernel.binding(), file, line)
|
34
|
-
end
|
35
|
-
end
|
32
|
+
def self.stack(file, line, obj, message, args, &block)
|
33
|
+
file = 'unknown' if (file.nil? || file == '')
|
34
|
+
line = 0 if line.nil?
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
36
|
+
result = nil
|
37
|
+
@stack.value.unshift([file, line])
|
38
|
+
begin
|
39
|
+
if block_given?
|
40
|
+
result = obj.send(message, *args, &block)
|
41
|
+
else
|
42
|
+
result = obj.send(message, *args)
|
43
|
+
end
|
44
|
+
ensure
|
45
|
+
@stack.value.shift()
|
46
|
+
end
|
47
|
+
result
|
41
48
|
end
|
42
|
-
memo
|
43
|
-
end
|
44
|
-
end
|
45
49
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
50
|
+
def self.stacktrace
|
51
|
+
@stack.value.dup
|
52
|
+
end
|
53
|
+
|
54
|
+
# Returns an Array with the top of the puppet stack, or an empty
|
55
|
+
# Array if there was no such entry.
|
56
|
+
def self.top_of_stack
|
57
|
+
@stack.value.first || []
|
52
58
|
end
|
53
59
|
end
|
54
|
-
[]
|
55
60
|
end
|
56
61
|
end
|
57
|
-
end
|