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.

Files changed (242) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -4
  3. data/Gemfile.lock +20 -12
  4. data/ext/project_data.yaml +3 -2
  5. data/ext/regexp_nodes/regexp_nodes.rb +4 -4
  6. data/ext/windows/service/daemon.rb +33 -8
  7. data/install.rb +6 -6
  8. data/lib/puppet.rb +8 -0
  9. data/lib/puppet/application.rb +1 -1
  10. data/lib/puppet/application/agent.rb +3 -0
  11. data/lib/puppet/application/apply.rb +2 -2
  12. data/lib/puppet/application/describe.rb +3 -9
  13. data/lib/puppet/application/device.rb +3 -0
  14. data/lib/puppet/application/doc.rb +1 -1
  15. data/lib/puppet/application/lookup.rb +1 -1
  16. data/lib/puppet/application/script.rb +2 -2
  17. data/lib/puppet/application/ssl.rb +25 -21
  18. data/lib/puppet/configurer.rb +42 -0
  19. data/lib/puppet/configurer/downloader.rb +2 -6
  20. data/lib/puppet/context/trusted_information.rb +42 -4
  21. data/lib/puppet/defaults.rb +19 -4
  22. data/lib/puppet/face/module/list.rb +5 -5
  23. data/lib/puppet/face/module/search.rb +1 -1
  24. data/lib/puppet/face/module/uninstall.rb +1 -1
  25. data/lib/puppet/face/module/upgrade.rb +1 -1
  26. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  27. data/lib/puppet/file_system.rb +0 -8
  28. data/lib/puppet/file_system/memory_file.rb +1 -1
  29. data/lib/puppet/file_system/posix.rb +3 -2
  30. data/lib/puppet/forge.rb +3 -3
  31. data/lib/puppet/functions.rb +1 -2
  32. data/lib/puppet/gettext/module_translations.rb +1 -1
  33. data/lib/puppet/graph/rb_tree_map.rb +2 -2
  34. data/lib/puppet/graph/simple_graph.rb +4 -3
  35. data/lib/puppet/http.rb +29 -0
  36. data/lib/puppet/http/client.rb +156 -0
  37. data/lib/puppet/http/errors.rb +30 -0
  38. data/lib/puppet/http/redirector.rb +48 -0
  39. data/lib/puppet/http/resolver.rb +5 -0
  40. data/lib/puppet/http/resolver/settings.rb +5 -0
  41. data/lib/puppet/http/resolver/srv.rb +13 -0
  42. data/lib/puppet/http/response.rb +34 -0
  43. data/lib/puppet/http/retry_after_handler.rb +47 -0
  44. data/lib/puppet/http/service.rb +18 -0
  45. data/lib/puppet/http/service/ca.rb +49 -0
  46. data/lib/puppet/http/session.rb +55 -0
  47. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  48. data/lib/puppet/indirector/hiera.rb +2 -0
  49. data/lib/puppet/indirector/request.rb +1 -1
  50. data/lib/puppet/indirector/resource/ral.rb +1 -3
  51. data/lib/puppet/indirector/resource/validator.rb +1 -1
  52. data/lib/puppet/interface.rb +2 -1
  53. data/lib/puppet/interface/documentation.rb +1 -1
  54. data/lib/puppet/loaders.rb +0 -1
  55. data/lib/puppet/metatype/manager.rb +1 -1
  56. data/lib/puppet/module.rb +1 -1
  57. data/lib/puppet/module/task.rb +20 -4
  58. data/lib/puppet/module_tool/applications/installer.rb +1 -1
  59. data/lib/puppet/module_tool/applications/uninstaller.rb +3 -3
  60. data/lib/puppet/module_tool/metadata.rb +1 -1
  61. data/lib/puppet/module_tool/shared_behaviors.rb +4 -4
  62. data/lib/puppet/module_tool/tar/mini.rb +1 -1
  63. data/lib/puppet/network/http.rb +2 -6
  64. data/lib/puppet/network/http/api/indirected_routes.rb +12 -11
  65. data/lib/puppet/network/http/connection.rb +10 -12
  66. data/lib/puppet/network/http/pool.rb +2 -0
  67. data/lib/puppet/network/http/site.rb +5 -1
  68. data/lib/puppet/network/resolver.rb +4 -4
  69. data/lib/puppet/node/environment.rb +4 -2
  70. data/lib/puppet/pal/pal_impl.rb +2 -2
  71. data/lib/puppet/parser/ast.rb +1 -1
  72. data/lib/puppet/parser/ast/resourceparam.rb +1 -1
  73. data/lib/puppet/parser/functions.rb +1 -1
  74. data/lib/puppet/parser/scope.rb +8 -7
  75. data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +1 -1
  76. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +1 -1
  77. data/lib/puppet/pops/evaluator/external_syntax_support.rb +3 -2
  78. data/lib/puppet/pops/evaluator/runtime3_support.rb +4 -7
  79. data/lib/puppet/pops/loader/module_loaders.rb +1 -1
  80. data/lib/puppet/pops/loader/task_instantiator.rb +4 -0
  81. data/lib/puppet/pops/loaders.rb +1 -1
  82. data/lib/puppet/pops/lookup/hiera_config.rb +1 -0
  83. data/lib/puppet/pops/lookup/sub_lookup.rb +1 -1
  84. data/lib/puppet/pops/merge_strategy.rb +22 -18
  85. data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
  86. data/lib/puppet/pops/parser/interpolation_support.rb +4 -4
  87. data/lib/puppet/pops/parser/locator.rb +1 -1
  88. data/lib/puppet/pops/parser/pn_parser.rb +17 -16
  89. data/lib/puppet/pops/puppet_stack.rb +52 -48
  90. data/lib/puppet/pops/types/p_sensitive_type.rb +1 -1
  91. data/lib/puppet/pops/types/p_uri_type.rb +1 -1
  92. data/lib/puppet/pops/types/string_converter.rb +10 -10
  93. data/lib/puppet/pops/types/types.rb +3 -3
  94. data/lib/puppet/property.rb +1 -1
  95. data/lib/puppet/property/ensure.rb +1 -1
  96. data/lib/puppet/provider/exec.rb +6 -2
  97. data/lib/puppet/provider/nameservice/directoryservice.rb +1 -1
  98. data/lib/puppet/provider/nameservice/pw.rb +2 -2
  99. data/lib/puppet/provider/package/apt.rb +5 -1
  100. data/lib/puppet/provider/package/dnfmodule.rb +87 -0
  101. data/lib/puppet/provider/package/dpkg.rb +31 -17
  102. data/lib/puppet/provider/package/openbsd.rb +1 -1
  103. data/lib/puppet/provider/package/pip.rb +34 -9
  104. data/lib/puppet/provider/package/portage.rb +1 -1
  105. data/lib/puppet/provider/package/rpm.rb +5 -5
  106. data/lib/puppet/provider/package/windows/package.rb +1 -1
  107. data/lib/puppet/provider/package/yum.rb +1 -1
  108. data/lib/puppet/provider/parsedfile.rb +1 -1
  109. data/lib/puppet/provider/service/daemontools.rb +9 -9
  110. data/lib/puppet/provider/service/openbsd.rb +1 -1
  111. data/lib/puppet/provider/service/rcng.rb +2 -2
  112. data/lib/puppet/provider/service/runit.rb +2 -8
  113. data/lib/puppet/provider/service/systemd.rb +10 -10
  114. data/lib/puppet/provider/user/directoryservice.rb +1 -1
  115. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  116. data/lib/puppet/provider/user/useradd.rb +22 -13
  117. data/lib/puppet/provider/user/windows_adsi.rb +4 -5
  118. data/lib/puppet/reference/indirection.rb +2 -2
  119. data/lib/puppet/reference/metaparameter.rb +1 -3
  120. data/lib/puppet/reference/providers.rb +1 -1
  121. data/lib/puppet/reference/type.rb +3 -9
  122. data/lib/puppet/reports.rb +1 -1
  123. data/lib/puppet/resource.rb +1 -1
  124. data/lib/puppet/resource/catalog.rb +1 -1
  125. data/lib/puppet/rest/errors.rb +1 -0
  126. data/lib/puppet/rest/response.rb +1 -0
  127. data/lib/puppet/rest/route.rb +1 -0
  128. data/lib/puppet/rest/routes.rb +3 -0
  129. data/lib/puppet/runtime.rb +25 -0
  130. data/lib/puppet/settings.rb +3 -3
  131. data/lib/puppet/settings/environment_conf.rb +1 -0
  132. data/lib/puppet/ssl/host.rb +1 -1
  133. data/lib/puppet/ssl/oids.rb +1 -1
  134. data/lib/puppet/ssl/state_machine.rb +23 -15
  135. data/lib/puppet/test/test_helper.rb +1 -1
  136. data/lib/puppet/transaction/report.rb +1 -1
  137. data/lib/puppet/trusted_external.rb +13 -0
  138. data/lib/puppet/type.rb +1 -3
  139. data/lib/puppet/type/exec.rb +7 -3
  140. data/lib/puppet/type/file.rb +1 -2
  141. data/lib/puppet/type/file/source.rb +2 -2
  142. data/lib/puppet/type/package.rb +10 -3
  143. data/lib/puppet/type/schedule.rb +1 -1
  144. data/lib/puppet/type/service.rb +1 -1
  145. data/lib/puppet/util.rb +2 -2
  146. data/lib/puppet/util/command_line/trollop.rb +1 -1
  147. data/lib/puppet/util/http_proxy.rb +2 -10
  148. data/lib/puppet/util/log.rb +2 -2
  149. data/lib/puppet/util/log/destinations.rb +2 -2
  150. data/lib/puppet/util/logging.rb +2 -2
  151. data/lib/puppet/util/metric.rb +2 -2
  152. data/lib/puppet/util/platform.rb +15 -4
  153. data/lib/puppet/util/provider_features.rb +2 -4
  154. data/lib/puppet/util/rdoc.rb +1 -1
  155. data/lib/puppet/util/reference.rb +1 -1
  156. data/lib/puppet/util/resource_template.rb +1 -1
  157. data/lib/puppet/util/selinux.rb +3 -1
  158. data/lib/puppet/util/windows/registry.rb +7 -5
  159. data/lib/puppet/vendor.rb +1 -1
  160. data/lib/puppet/vendor/require_vendored.rb +0 -1
  161. data/lib/puppet/version.rb +1 -1
  162. data/lib/puppet/x509/cert_provider.rb +4 -1
  163. data/locales/puppet.pot +279 -203
  164. data/man/man5/puppet.conf.5 +30 -8
  165. data/man/man8/puppet-agent.8 +4 -1
  166. data/man/man8/puppet-apply.8 +1 -1
  167. data/man/man8/puppet-catalog.8 +1 -1
  168. data/man/man8/puppet-config.8 +1 -1
  169. data/man/man8/puppet-describe.8 +1 -1
  170. data/man/man8/puppet-device.8 +1 -1
  171. data/man/man8/puppet-doc.8 +1 -1
  172. data/man/man8/puppet-epp.8 +1 -1
  173. data/man/man8/puppet-facts.8 +1 -1
  174. data/man/man8/puppet-filebucket.8 +1 -1
  175. data/man/man8/puppet-generate.8 +1 -1
  176. data/man/man8/puppet-help.8 +1 -1
  177. data/man/man8/puppet-key.8 +1 -1
  178. data/man/man8/puppet-lookup.8 +1 -1
  179. data/man/man8/puppet-man.8 +1 -1
  180. data/man/man8/puppet-module.8 +1 -1
  181. data/man/man8/puppet-node.8 +1 -1
  182. data/man/man8/puppet-parser.8 +1 -1
  183. data/man/man8/puppet-plugin.8 +1 -1
  184. data/man/man8/puppet-report.8 +1 -1
  185. data/man/man8/puppet-resource.8 +1 -1
  186. data/man/man8/puppet-script.8 +1 -1
  187. data/man/man8/puppet-ssl.8 +1 -1
  188. data/man/man8/puppet-status.8 +1 -1
  189. data/man/man8/puppet.8 +2 -2
  190. data/spec/fixtures/unit/provider/package/dnfmodule/dnf-module-list-installed.txt +11 -0
  191. data/spec/integration/configurer_spec.rb +52 -0
  192. data/spec/lib/puppet/certificate_factory.rb +2 -2
  193. data/spec/spec_helper.rb +24 -0
  194. data/spec/unit/application/device_spec.rb +6 -0
  195. data/spec/unit/application/ssl_spec.rb +4 -7
  196. data/spec/unit/configurer_spec.rb +1 -0
  197. data/spec/unit/context/trusted_information_spec.rb +41 -2
  198. data/spec/unit/http/client_spec.rb +440 -0
  199. data/spec/unit/http/resolver_spec.rb +45 -0
  200. data/spec/unit/http/service/ca_spec.rb +106 -0
  201. data/spec/unit/http/service_spec.rb +32 -0
  202. data/spec/unit/http/session_spec.rb +102 -0
  203. data/spec/unit/indirector/resource/ral_spec.rb +4 -4
  204. data/spec/unit/network/http/connection_spec.rb +119 -145
  205. data/spec/unit/network/http/site_spec.rb +7 -0
  206. data/spec/unit/parser/scope_spec.rb +10 -0
  207. data/spec/unit/pops/loaders/loaders_spec.rb +13 -2
  208. data/spec/unit/pops/loaders/module_loaders_spec.rb +37 -0
  209. data/spec/unit/provider/exec_spec.rb +209 -0
  210. data/spec/unit/provider/package/dnfmodule_spec.rb +186 -0
  211. data/spec/unit/provider/package/dpkg_spec.rb +238 -78
  212. data/spec/unit/provider/package/pip_spec.rb +51 -6
  213. data/spec/unit/provider/service/daemontools_spec.rb +24 -0
  214. data/spec/unit/provider/service/runit_spec.rb +24 -0
  215. data/spec/unit/provider/service/systemd_spec.rb +25 -25
  216. data/spec/unit/provider/user/useradd_spec.rb +46 -0
  217. data/spec/unit/ssl/host_spec.rb +0 -5
  218. data/spec/unit/ssl/state_machine_spec.rb +16 -10
  219. data/spec/unit/type/exec_spec.rb +6 -12
  220. data/spec/unit/type/file_spec.rb +9 -4
  221. data/spec/unit/type/package_spec.rb +5 -0
  222. data/spec/unit/util/execution_spec.rb +16 -0
  223. data/spec/unit/util/http_proxy_spec.rb +79 -27
  224. data/spec/unit/util/log/destinations_spec.rb +7 -3
  225. metadata +45 -22
  226. data/lib/puppet/pops/loader/null_loader.rb +0 -60
  227. data/lib/puppet/vendor/deep_merge/CHANGELOG +0 -45
  228. data/lib/puppet/vendor/deep_merge/Gemfile +0 -3
  229. data/lib/puppet/vendor/deep_merge/LICENSE +0 -21
  230. data/lib/puppet/vendor/deep_merge/PUPPET_README.md +0 -6
  231. data/lib/puppet/vendor/deep_merge/README.md +0 -113
  232. data/lib/puppet/vendor/deep_merge/Rakefile +0 -19
  233. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +0 -35
  234. data/lib/puppet/vendor/deep_merge/lib/deep_merge.rb +0 -2
  235. data/lib/puppet/vendor/deep_merge/lib/deep_merge/core.rb +0 -210
  236. data/lib/puppet/vendor/deep_merge/lib/deep_merge/deep_merge_hash.rb +0 -28
  237. data/lib/puppet/vendor/deep_merge/lib/deep_merge/rails_compat.rb +0 -27
  238. data/lib/puppet/vendor/deep_merge/test/test_deep_merge.rb +0 -608
  239. data/lib/puppet/vendor/load_deep_merge.rb +0 -1
  240. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +0 -24
  241. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +0 -24
  242. 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 = Resolv::DNS.new
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.to_s}"
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.to_s}:#{next_rr.port}"
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:
@@ -470,8 +470,8 @@ module Pal
470
470
  end
471
471
  end
472
472
 
473
- rescue Puppet::ParseErrorWithIssue, Puppet::Error
474
- # already logged and handled by the compiler for these two cases
473
+ rescue Puppet::Error
474
+ # already logged and handled by the compiler, including Puppet::ParseErrorWithIssue
475
475
  raise
476
476
 
477
477
  rescue => detail
@@ -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.to_s} #{@children.inspect} )"
14
+ "( #{self.class} #{self} #{@children.inspect} )"
15
15
  end
16
16
 
17
17
  # Evaluate the current object. Just a stub method, since the subclass
@@ -26,6 +26,6 @@ class Puppet::Parser::AST::ResourceParam < Puppet::Parser::AST::Branch
26
26
  end
27
27
 
28
28
  def to_s
29
- "#{@param} => #{@value.to_s}"
29
+ "#{@param} => #{@value}"
30
30
  end
31
31
  end
@@ -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.to_s}.") do |vals|
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
@@ -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
 
@@ -24,6 +24,6 @@ class Puppet::Pops::Evaluator::Collectors::CatalogCollector < Puppet::Pops::Eval
24
24
  end
25
25
 
26
26
  def to_s
27
- "Catalog-Collector[#{@type.to_s}]"
27
+ "Catalog-Collector[#{@type}]"
28
28
  end
29
29
  end
@@ -65,6 +65,6 @@ class Puppet::Pops::Evaluator::Collectors::ExportedCollector < Puppet::Pops::Eva
65
65
  end
66
66
 
67
67
  def to_s
68
- "Exported-Collector[#{@type.to_s}]"
68
+ "Exported-Collector[#{@type}]"
69
69
  end
70
70
  end
@@ -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
- begin
38
+ loop do
39
39
  result << segments.join("+")
40
40
  segments.shift
41
- end until segments.empty?
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
- # 'ruby -wc' thinks that _func is unused, because the only reference to it
302
- # is inside of the Kernel.eval string below. By prefixing it with the
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. See Puppet::Pops::PuppetStack
308
- return Kernel.eval('_func.call(scope, *args, &block)'.freeze, Kernel.binding, file || '', line)
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
@@ -33,7 +33,7 @@ module ModuleLoaders
33
33
  NAMESPACE_WILDCARD,
34
34
  Puppet[:libdir],
35
35
  'cached_puppet_lib',
36
- [:func_4x, :datatype]
36
+ [:func_4x, :func_3x, :datatype]
37
37
  )
38
38
  end
39
39
 
@@ -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)
@@ -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.exists?(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?('"') || 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
- # Returns the type used to validate the options hash
177
- #
178
- # @return [Types::PStructType] the puppet type
179
- #
180
- def self.options_t
181
- @options_t ||=Types::TypeParser.singleton.parse("Struct[{strategy=>Optional[Pattern[/#{key}/]]}]")
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
- # Returns a type that allows all deep_merge options except 'preserve_unmergeables' since we force
387
- # the setting of that option to false
388
- #
389
- # @return [Types::PAnyType] the puppet type used when validating the options hash
390
- def self.options_t
391
- @options_t ||= Types::TypeParser.singleton.parse('Struct[{'\
392
- "strategy=>Optional[Pattern[#{key}]],"\
393
- 'knockout_prefix=>Optional[String],'\
394
- 'merge_debug=>Optional[Boolean],'\
395
- 'merge_hash_arrays=>Optional[Boolean],'\
396
- 'sort_merged_arrays=>Optional[Boolean],'\
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.times.map {|x| lines[x].length - processed_lines[x].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
- while true
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
- while true
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
- while true
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
- while true
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).to_s}&pos=#{pos_on_line(offset).to_s}")
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
- module Puppet::Pops
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
- # Sends a message to an obj such that it appears to come from
24
- # file, line when calling stacktrace.
25
- #
26
- def self.stack(file, line, obj, message, args, &block)
27
- file = '' if file.nil?
28
- line = 0 if line.nil?
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
- if block_given?
31
- Kernel.eval("obj.send(message, *args, &block)", Kernel.binding(), file, line)
32
- else
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
- def self.stacktrace
38
- caller().reduce([]) do |memo, loc|
39
- if loc =~ PP_ENTRY_PATTERN
40
- memo << [$1.nil? ? 'unknown' : $1, $2.to_i]
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
- # Returns an Array with the top of the puppet stack, or an empty Array if there was no such entry.
47
- #
48
- def self.top_of_stack
49
- caller.each do |loc|
50
- if loc =~ PP_ENTRY_PATTERN
51
- return [$1.nil? ? 'unknown' : $1, $2.to_i]
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