puppet 7.10.0 → 7.13.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (192) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -3
  3. data/Gemfile.lock +20 -15
  4. data/ext/project_data.yaml +1 -1
  5. data/lib/puppet/application/agent.rb +4 -0
  6. data/lib/puppet/application/apply.rb +20 -2
  7. data/lib/puppet/application/lookup.rb +72 -24
  8. data/lib/puppet/application/resource.rb +15 -13
  9. data/lib/puppet/concurrent/thread_local_singleton.rb +6 -3
  10. data/lib/puppet/configurer.rb +98 -29
  11. data/lib/puppet/confine/variable.rb +1 -1
  12. data/lib/puppet/defaults.rb +17 -3
  13. data/lib/puppet/facter_impl.rb +96 -0
  14. data/lib/puppet/file_serving/metadata.rb +3 -0
  15. data/lib/puppet/file_serving/mount/file.rb +4 -4
  16. data/lib/puppet/file_system/file_impl.rb +10 -8
  17. data/lib/puppet/file_system/jruby.rb +1 -1
  18. data/lib/puppet/file_system/path_pattern.rb +10 -15
  19. data/lib/puppet/file_system/uniquefile.rb +1 -1
  20. data/lib/puppet/file_system/windows.rb +4 -4
  21. data/lib/puppet/file_system.rb +3 -2
  22. data/lib/puppet/forge.rb +1 -1
  23. data/lib/puppet/functions/versioncmp.rb +6 -2
  24. data/lib/puppet/graph/simple_graph.rb +2 -1
  25. data/lib/puppet/http/client.rb +1 -1
  26. data/lib/puppet/http/redirector.rb +5 -0
  27. data/lib/puppet/indirector/catalog/compiler.rb +3 -3
  28. data/lib/puppet/indirector/facts/facter.rb +6 -6
  29. data/lib/puppet/indirector/indirection.rb +1 -1
  30. data/lib/puppet/module_tool/applications/uninstaller.rb +1 -1
  31. data/lib/puppet/module_tool/applications/upgrader.rb +1 -1
  32. data/lib/puppet/pal/pal_impl.rb +1 -1
  33. data/lib/puppet/parser/resource.rb +1 -1
  34. data/lib/puppet/parser/scope.rb +8 -7
  35. data/lib/puppet/parser/templatewrapper.rb +1 -0
  36. data/lib/puppet/pops/evaluator/closure.rb +7 -5
  37. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +1 -0
  38. data/lib/puppet/pops/lookup/lookup_adapter.rb +3 -2
  39. data/lib/puppet/pops/model/ast.rb +1 -0
  40. data/lib/puppet/pops/model/factory.rb +14 -13
  41. data/lib/puppet/pops/parser/code_merger.rb +4 -4
  42. data/lib/puppet/pops/parser/egrammar.ra +4 -2
  43. data/lib/puppet/pops/parser/eparser.rb +909 -894
  44. data/lib/puppet/pops/parser/lexer2.rb +69 -68
  45. data/lib/puppet/pops/parser/slurp_support.rb +1 -0
  46. data/lib/puppet/pops/serialization/to_data_converter.rb +6 -18
  47. data/lib/puppet/pops/serialization/to_stringified_converter.rb +1 -1
  48. data/lib/puppet/pops/types/type_formatter.rb +7 -6
  49. data/lib/puppet/pops/types/types.rb +1 -1
  50. data/lib/puppet/pops/validation/checker4_0.rb +7 -2
  51. data/lib/puppet/provider/aix_object.rb +1 -1
  52. data/lib/puppet/provider/group/groupadd.rb +5 -2
  53. data/lib/puppet/provider/package/pkg.rb +11 -1
  54. data/lib/puppet/provider/package/puppet_gem.rb +1 -1
  55. data/lib/puppet/provider/package/puppetserver_gem.rb +1 -1
  56. data/lib/puppet/provider/package/yum.rb +1 -1
  57. data/lib/puppet/provider/service/base.rb +1 -1
  58. data/lib/puppet/provider/service/init.rb +10 -9
  59. data/lib/puppet/provider/service/launchd.rb +1 -1
  60. data/lib/puppet/provider/service/redhat.rb +1 -1
  61. data/lib/puppet/provider/service/smf.rb +3 -3
  62. data/lib/puppet/provider/service/systemd.rb +1 -1
  63. data/lib/puppet/provider/service/upstart.rb +5 -5
  64. data/lib/puppet/provider/user/aix.rb +44 -1
  65. data/lib/puppet/provider/user/directoryservice.rb +1 -1
  66. data/lib/puppet/provider/user/useradd.rb +30 -7
  67. data/lib/puppet/provider.rb +1 -1
  68. data/lib/puppet/reference/providers.rb +2 -2
  69. data/lib/puppet/resource/catalog.rb +1 -1
  70. data/lib/puppet/resource/type_collection.rb +2 -1
  71. data/lib/puppet/resource.rb +38 -5
  72. data/lib/puppet/runtime.rb +11 -1
  73. data/lib/puppet/settings/file_setting.rb +3 -8
  74. data/lib/puppet/settings.rb +2 -2
  75. data/lib/puppet/ssl/verifier.rb +3 -1
  76. data/lib/puppet/test/test_helper.rb +4 -1
  77. data/lib/puppet/transaction/persistence.rb +22 -12
  78. data/lib/puppet/type/exec.rb +9 -1
  79. data/lib/puppet/type/file/data_sync.rb +1 -1
  80. data/lib/puppet/type/file/group.rb +8 -1
  81. data/lib/puppet/type/file/owner.rb +8 -1
  82. data/lib/puppet/type/group.rb +0 -1
  83. data/lib/puppet/type/resources.rb +1 -1
  84. data/lib/puppet/type/service.rb +8 -3
  85. data/lib/puppet/type/user.rb +40 -39
  86. data/lib/puppet/util/autoload.rb +1 -1
  87. data/lib/puppet/util/command_line.rb +1 -1
  88. data/lib/puppet/util/filetype.rb +2 -2
  89. data/lib/puppet/util/json.rb +20 -0
  90. data/lib/puppet/util/log.rb +8 -4
  91. data/lib/puppet/util/logging.rb +1 -25
  92. data/lib/puppet/util/monkey_patches.rb +26 -2
  93. data/lib/puppet/util/package.rb +25 -16
  94. data/lib/puppet/util/pidlock.rb +1 -1
  95. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +1 -1
  96. data/lib/puppet/util/suidmanager.rb +1 -2
  97. data/lib/puppet/util/tagging.rb +1 -0
  98. data/lib/puppet/util/windows/service.rb +0 -5
  99. data/lib/puppet/util/windows/user.rb +0 -1
  100. data/lib/puppet/util/windows.rb +3 -0
  101. data/lib/puppet/util/yaml.rb +11 -0
  102. data/lib/puppet/util.rb +4 -3
  103. data/lib/puppet/version.rb +1 -1
  104. data/lib/puppet.rb +3 -6
  105. data/locales/puppet.pot +265 -239
  106. data/man/man5/puppet.conf.5 +18 -2
  107. data/man/man8/puppet-agent.8 +4 -1
  108. data/man/man8/puppet-apply.8 +1 -1
  109. data/man/man8/puppet-catalog.8 +1 -1
  110. data/man/man8/puppet-config.8 +1 -1
  111. data/man/man8/puppet-describe.8 +1 -1
  112. data/man/man8/puppet-device.8 +1 -1
  113. data/man/man8/puppet-doc.8 +1 -1
  114. data/man/man8/puppet-epp.8 +1 -1
  115. data/man/man8/puppet-facts.8 +1 -1
  116. data/man/man8/puppet-filebucket.8 +1 -1
  117. data/man/man8/puppet-generate.8 +1 -1
  118. data/man/man8/puppet-help.8 +1 -1
  119. data/man/man8/puppet-lookup.8 +9 -6
  120. data/man/man8/puppet-module.8 +1 -1
  121. data/man/man8/puppet-node.8 +1 -1
  122. data/man/man8/puppet-parser.8 +1 -1
  123. data/man/man8/puppet-plugin.8 +1 -1
  124. data/man/man8/puppet-report.8 +1 -1
  125. data/man/man8/puppet-resource.8 +1 -1
  126. data/man/man8/puppet-script.8 +1 -1
  127. data/man/man8/puppet-ssl.8 +1 -1
  128. data/man/man8/puppet.8 +2 -2
  129. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +2 -1
  130. data/spec/fixtures/unit/forge/bacula.json +1 -1
  131. data/spec/integration/application/agent_spec.rb +44 -0
  132. data/spec/integration/application/lookup_spec.rb +29 -6
  133. data/spec/integration/configurer_spec.rb +1 -1
  134. data/spec/integration/indirector/facts/facter_spec.rb +3 -3
  135. data/spec/integration/parser/pcore_resource_spec.rb +20 -0
  136. data/spec/integration/transaction/report_spec.rb +1 -1
  137. data/spec/integration/type/file_spec.rb +2 -2
  138. data/spec/integration/type/package_spec.rb +6 -6
  139. data/spec/integration/util/rdoc/parser_spec.rb +1 -1
  140. data/spec/integration/util/windows/process_spec.rb +1 -9
  141. data/spec/shared_contexts/l10n.rb +5 -0
  142. data/spec/unit/application/apply_spec.rb +76 -56
  143. data/spec/unit/application/lookup_spec.rb +131 -10
  144. data/spec/unit/application/resource_spec.rb +29 -0
  145. data/spec/unit/concurrent/thread_local_singleton_spec.rb +39 -0
  146. data/spec/unit/configurer_spec.rb +113 -28
  147. data/spec/unit/facter_impl_spec.rb +31 -0
  148. data/spec/unit/file_bucket/dipper_spec.rb +2 -2
  149. data/spec/unit/file_system/uniquefile_spec.rb +7 -1
  150. data/spec/unit/file_system_spec.rb +41 -4
  151. data/spec/unit/forge/module_release_spec.rb +3 -3
  152. data/spec/unit/functions/lookup_spec.rb +64 -0
  153. data/spec/unit/functions/versioncmp_spec.rb +40 -4
  154. data/spec/unit/http/client_spec.rb +58 -1
  155. data/spec/unit/indirector/indirection_spec.rb +10 -3
  156. data/spec/unit/network/formats_spec.rb +6 -0
  157. data/spec/unit/pops/parser/parse_containers_spec.rb +2 -2
  158. data/spec/unit/pops/serialization/to_from_hr_spec.rb +0 -58
  159. data/spec/unit/pops/serialization/to_stringified_spec.rb +5 -0
  160. data/spec/unit/pops/types/type_calculator_spec.rb +6 -0
  161. data/spec/unit/pops/validator/validator_spec.rb +5 -0
  162. data/spec/unit/provider/package/gem_spec.rb +1 -1
  163. data/spec/unit/provider/package/pip2_spec.rb +1 -1
  164. data/spec/unit/provider/package/pip3_spec.rb +1 -1
  165. data/spec/unit/provider/package/pip_spec.rb +1 -1
  166. data/spec/unit/provider/package/pkg_spec.rb +15 -0
  167. data/spec/unit/provider/package/puppet_gem_spec.rb +1 -1
  168. data/spec/unit/provider/package/puppetserver_gem_spec.rb +1 -1
  169. data/spec/unit/provider/service/gentoo_spec.rb +6 -5
  170. data/spec/unit/provider/service/init_spec.rb +15 -9
  171. data/spec/unit/provider/service/openwrt_spec.rb +21 -29
  172. data/spec/unit/provider/service/redhat_spec.rb +3 -2
  173. data/spec/unit/provider/user/aix_spec.rb +100 -0
  174. data/spec/unit/provider/user/directoryservice_spec.rb +1 -1
  175. data/spec/unit/provider/user/useradd_spec.rb +40 -0
  176. data/spec/unit/provider_spec.rb +4 -4
  177. data/spec/unit/puppet_spec.rb +12 -4
  178. data/spec/unit/resource/catalog_spec.rb +14 -1
  179. data/spec/unit/resource_spec.rb +58 -2
  180. data/spec/unit/settings/file_setting_spec.rb +10 -7
  181. data/spec/unit/transaction/persistence_spec.rb +51 -0
  182. data/spec/unit/type/file/group_spec.rb +7 -0
  183. data/spec/unit/type/file/owner_spec.rb +7 -0
  184. data/spec/unit/type/service_spec.rb +27 -0
  185. data/spec/unit/type/user_spec.rb +0 -45
  186. data/spec/unit/type_spec.rb +2 -2
  187. data/spec/unit/util/autoload_spec.rb +25 -8
  188. data/spec/unit/util/json_spec.rb +126 -0
  189. data/spec/unit/util/logging_spec.rb +2 -0
  190. data/spec/unit/util/yaml_spec.rb +37 -13
  191. data/tasks/parallel.rake +3 -3
  192. metadata +17 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bb14045c978960e4e7b09aed6c3520ec4de726569117031ae3ba5bd96c2e077a
4
- data.tar.gz: 47e721bc33f5564e98fc4b7bb6a4127e209b64efcb921cd5be3e5becd99ae76b
3
+ metadata.gz: 45045b95a6ecb2a310d7114e78c48e812cbaa18e396eba63a399b3f6221e947e
4
+ data.tar.gz: 9196874c694b632b984fd0fc7b2304a2a2b6551328cbb81d62f664c282bd0ba9
5
5
  SHA512:
6
- metadata.gz: b655140a24ba14e21ab4ae9b4587d450058e147cad7bf3670fb3a518359b8a5d1457ffe1d5adc1e655ffff3d1a89a0b2687a4713f07844f3110b5114f6969b2a
7
- data.tar.gz: '02850db07816869af5f43502f101f6fbcc7d395522721f3181f4a0b75c5729edbe75a880e324de5079e4a5ae38d221439e6557adda107d99b17c5a0870f64ca7'
6
+ metadata.gz: e318a7303b592cb3b2cd0dd26c5e7b8ea57ab410aa79bd77c06acf60509d6f2fb5a55bf4fbea9aeeb8e4f660dd3f3c2c65062b3f0a0a3ba806c713264140b24a
7
+ data.tar.gz: e23422e5834aa7eedbc7e25bcaaf04d9ca3a48604c94d2c84085348cc1c41aad33299e0de3a247f9769222ba7d67b55de0deeab96037245b3214ef903d8bbbaa
data/Gemfile CHANGED
@@ -3,7 +3,7 @@ source ENV['GEM_SOURCE'] || "https://rubygems.org"
3
3
  gemspec
4
4
 
5
5
  def location_for(place, fake_version = nil)
6
- if place.is_a?(String) && place =~ /^(git[:@][^#]*)#(.*)/
6
+ if place.is_a?(String) && place =~ /^((?:git[:@]|https:)[^#]*)#(.*)/
7
7
  [fake_version, { git: $1, branch: $2, require: false }].compact
8
8
  elsif place.is_a?(String) && place =~ /^file:\/\/(.*)/
9
9
  ['>= 0', { path: File.expand_path($1), require: false }]
@@ -53,7 +53,7 @@ end
53
53
  group(:development, optional: true) do
54
54
  gem 'memory_profiler', require: false, platforms: [:mri]
55
55
  gem 'pry', require: false, platforms: [:ruby]
56
- gem "racc", "1.4.9", require: false, platforms: [:ruby]
56
+ gem "racc", "1.5.2", require: false, platforms: [:ruby]
57
57
  if RUBY_PLATFORM != 'java'
58
58
  gem 'ruby-prof', '>= 0.16.0', require: false
59
59
  end
@@ -63,7 +63,7 @@ group(:packaging) do
63
63
  gem 'packaging', *location_for(ENV['PACKAGING_LOCATION'] || '~> 0.99')
64
64
  end
65
65
 
66
- group(:documentation) do
66
+ group(:documentation, optional: true) do
67
67
  gem 'gettext-setup', '~> 0.28', require: false, platforms: [:ruby]
68
68
  gem 'ronn', '~> 0.7.3', require: false, platforms: [:ruby]
69
69
  end
data/Gemfile.lock CHANGED
@@ -1,9 +1,10 @@
1
1
  GIT
2
- remote: git://github.com/puppetlabs/packaging
3
- revision: 804ad19a32455079917eaabd73fcec65078e8cee
2
+ remote: https://github.com/puppetlabs/packaging
3
+ revision: 98613aaebad419700b4c37163fe3bbc612f2239d
4
4
  branch: 1.0.x
5
5
  specs:
6
- packaging (0.99.79.2.g804ad19)
6
+ packaging (0.104.0.4.g98613aa)
7
+ apt_stage_artifacts
7
8
  artifactory (~> 2)
8
9
  csv (= 3.1.5)
9
10
  rake (>= 12.3)
@@ -12,12 +13,12 @@ GIT
12
13
  PATH
13
14
  remote: .
14
15
  specs:
15
- puppet (7.10.0)
16
+ puppet (7.13.1)
16
17
  CFPropertyList (~> 2.2)
17
18
  concurrent-ruby (~> 1.0)
18
19
  deep_merge (~> 1.0)
19
20
  facter (>= 2.4.0, < 5)
20
- fast_gettext (~> 1.1)
21
+ fast_gettext (>= 1.1, < 3)
21
22
  hiera (>= 3.2.1, < 4)
22
23
  locale (~> 2.1)
23
24
  multi_json (~> 1.13)
@@ -30,6 +31,8 @@ GEM
30
31
  CFPropertyList (2.3.6)
31
32
  addressable (2.8.0)
32
33
  public_suffix (>= 2.0.2, < 5.0)
34
+ apt_stage_artifacts (0.10.1)
35
+ docopt
33
36
  artifactory (2.8.2)
34
37
  ast (2.4.2)
35
38
  coderay (1.1.3)
@@ -40,11 +43,11 @@ GEM
40
43
  deep_merge (1.2.1)
41
44
  diff-lcs (1.4.4)
42
45
  docopt (0.6.1)
43
- facter (4.2.2)
46
+ facter (4.2.5)
44
47
  hocon (~> 1.3)
45
48
  thor (>= 1.0.1, < 2.0)
46
49
  fast_gettext (1.1.2)
47
- ffi (1.15.3)
50
+ ffi (1.15.4)
48
51
  gettext (3.2.9)
49
52
  locale (>= 2.0.5)
50
53
  text (>= 1.3.0)
@@ -70,7 +73,7 @@ GEM
70
73
  multi_json (1.15.0)
71
74
  mustache (1.1.1)
72
75
  optimist (3.0.1)
73
- parallel (1.20.1)
76
+ parallel (1.21.0)
74
77
  parser (2.7.2.0)
75
78
  ast (~> 2.4.1)
76
79
  powerpack (0.1.3)
@@ -80,14 +83,14 @@ GEM
80
83
  public_suffix (4.0.6)
81
84
  puppet-resource_api (1.8.14)
82
85
  hocon (>= 1.0)
83
- puppetserver-ca (2.3.1)
86
+ puppetserver-ca (2.3.5)
84
87
  facter (>= 2.0.1, < 5)
85
- racc (1.4.9)
88
+ racc (1.5.2)
86
89
  rainbow (2.2.2)
87
90
  rake
88
91
  rake (13.0.6)
89
92
  rdiscount (2.2.0.2)
90
- rdoc (6.3.2)
93
+ rdoc (6.3.3)
91
94
  release-metrics (1.1.0)
92
95
  csv
93
96
  docopt
@@ -111,7 +114,7 @@ GEM
111
114
  rspec-mocks (3.10.2)
112
115
  diff-lcs (>= 1.2.0, < 2.0)
113
116
  rspec-support (~> 3.10.0)
114
- rspec-support (3.10.2)
117
+ rspec-support (3.10.3)
115
118
  rubocop (0.49.1)
116
119
  parallel (~> 1.10)
117
120
  parser (>= 2.3.3.1, < 3.0)
@@ -127,13 +130,15 @@ GEM
127
130
  semantic_puppet (1.0.4)
128
131
  text (1.3.1)
129
132
  thor (1.1.0)
130
- unicode-display_width (1.7.0)
133
+ unicode-display_width (1.8.0)
131
134
  vcr (5.1.0)
132
135
  webmock (3.14.0)
133
136
  addressable (>= 2.8.0)
134
137
  crack (>= 0.3.2)
135
138
  hashdiff (>= 0.4.0, < 2.0.0)
136
- yard (0.9.26)
139
+ webrick (1.7.0)
140
+ yard (0.9.27)
141
+ webrick (~> 1.7.0)
137
142
 
138
143
  PLATFORMS
139
144
  ruby
@@ -153,7 +158,7 @@ DEPENDENCIES
153
158
  puppet!
154
159
  puppet-resource_api (~> 1.5)
155
160
  puppetserver-ca (~> 2.0)
156
- racc (= 1.4.9)
161
+ racc (= 1.5.2)
157
162
  rake (~> 13.0)
158
163
  rdoc (~> 6.0)
159
164
  ronn (~> 0.7.3)
@@ -21,7 +21,7 @@ gem_runtime_dependencies:
21
21
  facter: ['> 2.0.1', '< 5']
22
22
  hiera: ['>= 3.2.1', '< 4']
23
23
  semantic_puppet: '~> 1.0'
24
- fast_gettext: '~> 1.1'
24
+ fast_gettext: ['>= 1.1', '< 3']
25
25
  locale: '~> 2.1'
26
26
  multi_json: '~> 1.10'
27
27
  puppet-resource_api: '~>1.5'
@@ -334,6 +334,10 @@ generated by running puppet agent with '--genconfig'.
334
334
  specifying a time of 0.
335
335
  (This is a Puppet setting, and can go in puppet.conf.)
336
336
 
337
+ * --write_catalog_summary
338
+ After compiling the catalog saves the resource list and classes list to the node
339
+ in the state directory named classes.txt and resources.txt
340
+ (This is a Puppet setting, and can go in puppet.conf.)
337
341
 
338
342
  EXAMPLE
339
343
  -------
@@ -16,7 +16,9 @@ class Puppet::Application::Apply < Puppet::Application
16
16
  option("--use-nodes")
17
17
  option("--detailed-exitcodes")
18
18
 
19
- option("--write-catalog-summary")
19
+ option("--write-catalog-summary") do |arg|
20
+ Puppet[:write_catalog_summary] = arg
21
+ end
20
22
 
21
23
  option("--catalog catalog", "-c catalog") do |arg|
22
24
  options[:catalog] = arg
@@ -169,6 +171,7 @@ Copyright (c) 2011 Puppet Inc., LLC Licensed under the Apache 2.0 License
169
171
  def app_defaults
170
172
  super.merge({
171
173
  :default_file_terminus => :file_server,
174
+ :write_catalog_summary => false
172
175
  })
173
176
  end
174
177
 
@@ -247,7 +250,22 @@ Copyright (c) 2011 Puppet Inc., LLC Licensed under the Apache 2.0 License
247
250
 
248
251
  catalog.retrieval_duration = Time.now - starttime
249
252
 
250
- if options[:write_catalog_summary]
253
+ # We accept either the global option `--write_catalog_summary`
254
+ # corresponding to the new setting, or the application option
255
+ # `--write-catalog-summary`. The latter is needed to maintain backwards
256
+ # compatibility.
257
+ #
258
+ # Puppet settings parse global options using PuppetOptionParser, but it
259
+ # only recognizes underscores, not dashes.
260
+ # The base application parses app specific options using ruby's builtin
261
+ # OptionParser. As of ruby 2.4, it will accept either underscores or
262
+ # dashes, but prefer dashes.
263
+ #
264
+ # So if underscores are used, the PuppetOptionParser will parse it and
265
+ # store that in Puppet[:write_catalog_summary]. If dashes are used,
266
+ # OptionParser will parse it, and set Puppet[:write_catalog_summary]. In
267
+ # either case, settings will contain the correct value.
268
+ if Puppet[:write_catalog_summary]
251
269
  catalog.write_class_file
252
270
  catalog.write_resource_file
253
271
  end
@@ -7,6 +7,7 @@ class Puppet::Application::Lookup < Puppet::Application
7
7
 
8
8
  RUN_HELP = _("Run 'puppet lookup --help' for more details").freeze
9
9
  DEEP_MERGE_OPTIONS = '--knock-out-prefix, --sort-merged-arrays, and --merge-hash-arrays'.freeze
10
+ TRUSTED_INFORMATION_FACTS = ["hostname", "domain", "fqdn", "clientcert"].freeze
10
11
 
11
12
  run_mode :server
12
13
 
@@ -54,11 +55,7 @@ class Puppet::Application::Lookup < Puppet::Application
54
55
  end
55
56
 
56
57
  option('--facts FACT_FILE') do |arg|
57
- if %w{.yaml .yml .json}.include?(arg.match(/\.[^.]*$/)[0])
58
- options[:fact_file] = arg
59
- else
60
- raise _("The --fact file only accepts yaml and json files.\n%{run_help}") % { run_help: RUN_HELP }
61
- end
58
+ options[:fact_file] = arg
62
59
  end
63
60
 
64
61
  def app_defaults
@@ -137,7 +134,9 @@ DESCRIPTION
137
134
  The lookup command is a CLI for Puppet's 'lookup()' function. It searches your
138
135
  Hiera data and returns a value for the requested lookup key, so you can test and
139
136
  explore your data. It is a modern replacement for the 'hiera' command.
140
-
137
+ Lookup uses the setting for global hiera.yaml from puppet's config,
138
+ and the environment to find the environment level hiera.yaml as well as the
139
+ resulting modulepath for the environment (for hiera.yaml files in modules).
141
140
  Hiera usually relies on a node's facts to locate the relevant data sources. By
142
141
  default, 'puppet lookup' uses facts from the node you run the command on, but
143
142
  you can get data for any other node with the '--node <NAME>' option. If
@@ -186,7 +185,8 @@ OPTIONS
186
185
  * --environment <ENV>
187
186
  Like with most Puppet commands, you can specify an environment on the command
188
187
  line. This is important for lookup because different environments can have
189
- different Hiera data.
188
+ different Hiera data. This environment will be always be the one used regardless
189
+ of any other factors.
190
190
 
191
191
  * --merge first|unique|hash|deep:
192
192
  Specify the merge behavior, overriding any merge behavior from the data's
@@ -237,6 +237,13 @@ EXAMPLE
237
237
  To look up 'key_name' using the Puppet Server node's facts:
238
238
  $ puppet lookup key_name
239
239
 
240
+ To look up 'key_name' using the Puppet Server node's arbitrary variables from a manifest, and
241
+ classify the node if applicable:
242
+ $ puppet lookup key_name --compile
243
+
244
+ To look up 'key_name' using the Puppet Server node's facts, overridden by facts given in a file:
245
+ $ puppet lookup key_name --facts fact_file.yaml
246
+
240
247
  To look up 'key_name' with agent.local's facts:
241
248
  $ puppet lookup --node agent.local key_name
242
249
 
@@ -341,31 +348,60 @@ Copyright (c) 2015 Puppet Inc., LLC Licensed under the Apache 2.0 License
341
348
  Puppet.settings[:facts_terminus] = 'facter'
342
349
  end
343
350
 
344
- unless node.is_a?(Puppet::Node) # to allow unit tests to pass a node instance
345
- ni = Puppet::Node.indirection
346
- tc = ni.terminus_class
347
- if tc == :plain || options[:compile]
348
- node = ni.find(node)
349
- else
350
- ni.terminus_class = :plain
351
- node = ni.find(node)
352
- ni.terminus_class = tc
353
- end
354
- end
355
-
356
351
  fact_file = options[:fact_file]
357
352
 
358
353
  if fact_file
359
- if fact_file.end_with?("json")
360
- given_facts = Puppet::Util::Json.load(Puppet::FileSystem.read(fact_file, :encoding => 'utf-8'))
361
- else
354
+ if fact_file.end_with?('.json')
355
+ given_facts = Puppet::Util::Json.load_file(fact_file)
356
+ elsif fact_file.end_with?('.yml', '.yaml')
362
357
  given_facts = Puppet::Util::Yaml.safe_load_file(fact_file)
358
+ else
359
+ given_facts = Puppet::Util::Json.load_file_if_valid(fact_file)
360
+ given_facts = Puppet::Util::Yaml.safe_load_file_if_valid(fact_file) unless given_facts
363
361
  end
364
362
 
365
363
  unless given_facts.instance_of?(Hash)
366
- raise _("Incorrect formatted data in %{fact_file} given via the --facts flag") % { fact_file: fact_file }
364
+ raise _("Incorrectly formatted data in %{fact_file} given via the --facts flag (only accepts yaml and json files)") % { fact_file: fact_file }
365
+ end
366
+
367
+ if TRUSTED_INFORMATION_FACTS.any? { |key| given_facts.key? key }
368
+ unless TRUSTED_INFORMATION_FACTS.all? { |key| given_facts.key? key }
369
+ raise _("When overriding any of the %{trusted_facts_list} facts with %{fact_file} "\
370
+ "given via the --facts flag, they must all be overridden.") % { fact_file: fact_file ,trusted_facts_list: TRUSTED_INFORMATION_FACTS.join(',')}
371
+ end
367
372
  end
368
- node.add_extra_facts(given_facts)
373
+ end
374
+
375
+ unless node.is_a?(Puppet::Node) # to allow unit tests to pass a node instance
376
+ facts = retrieve_node_facts(node, given_facts)
377
+ if Puppet.settings.set_by_cli?('environment')
378
+ node = Puppet::Node.new(node, :classes => nil, :parameters => nil, :facts => facts, :environment => Puppet.settings.value('environment'))
379
+ else
380
+ ni = Puppet::Node.indirection
381
+ tc = ni.terminus_class
382
+
383
+ service = Puppet.runtime[:http]
384
+ session = service.create_session
385
+ cert = session.route_to(:ca)
386
+
387
+ _, x509 = cert.get_certificate(node)
388
+ cert = OpenSSL::X509::Certificate.new(x509)
389
+
390
+ Puppet::SSL::Oids.register_puppet_oids
391
+ trusted = Puppet::Context::TrustedInformation.remote(true, facts.values['certname'] || node, Puppet::SSL::Certificate.from_instance(cert))
392
+
393
+ Puppet.override(trusted_information: trusted) do
394
+ if tc == :plain || options[:compile]
395
+ node = ni.find(node, facts: facts)
396
+ else
397
+ ni.terminus_class = :plain
398
+ node = ni.find(node, facts: facts)
399
+ ni.terminus_class = tc
400
+ end
401
+ end
402
+ end
403
+ else
404
+ node.add_extra_facts(given_facts) if given_facts
369
405
  end
370
406
 
371
407
  Puppet[:code] = 'undef' unless options[:compile]
@@ -378,4 +414,16 @@ Copyright (c) 2015 Puppet Inc., LLC Licensed under the Apache 2.0 License
378
414
  compiler.compile { |catalog| yield(compiler.topscope); catalog }
379
415
  end
380
416
  end
417
+
418
+ def retrieve_node_facts(node, given_facts)
419
+ facts = Puppet::Node::Facts.indirection.find(node, :environment => Puppet.lookup(:current_environment))
420
+
421
+ facts = Puppet::Node::Facts.new(node, {}) if facts.nil?
422
+ facts.add_extra_values(given_facts) if given_facts
423
+
424
+ if facts.values.empty?
425
+ raise _("No facts available for target node: %{node}") % { node: node}
426
+ end
427
+ facts
428
+ end
381
429
  end
@@ -225,21 +225,23 @@ Copyright (c) 2011 Puppet Inc., LLC Licensed under the Apache 2.0 License
225
225
  def find_or_save_resources(type, name, params)
226
226
  key = local_key(type, name)
227
227
 
228
- if name
229
- if params.empty?
230
- [ Puppet::Resource.indirection.find( key ) ]
228
+ Puppet.override(stringify_rich: true) do
229
+ if name
230
+ if params.empty?
231
+ [ Puppet::Resource.indirection.find( key ) ]
232
+ else
233
+ resource = Puppet::Resource.new( type, name, :parameters => params )
234
+
235
+ # save returns [resource that was saved, transaction log from applying the resource]
236
+ save_result = Puppet::Resource.indirection.save(resource, key)
237
+ [ save_result.first ]
238
+ end
231
239
  else
232
- resource = Puppet::Resource.new( type, name, :parameters => params )
233
-
234
- # save returns [resource that was saved, transaction log from applying the resource]
235
- save_result = Puppet::Resource.indirection.save(resource, key)
236
- [ save_result.first ]
237
- end
238
- else
239
- if type == "file"
240
- raise _("Listing all file instances is not supported. Please specify a file or directory, e.g. puppet resource file /etc")
240
+ if type == "file"
241
+ raise _("Listing all file instances is not supported. Please specify a file or directory, e.g. puppet resource file /etc")
242
+ end
243
+ Puppet::Resource.indirection.search( key, {} )
241
244
  end
242
- Puppet::Resource.indirection.search( key, {} )
243
245
  end
244
246
  end
245
247
  end
@@ -1,13 +1,16 @@
1
+ # frozen_string_literal: true
1
2
  module Puppet
2
3
  module Concurrent
3
4
  module ThreadLocalSingleton
4
5
  def singleton
5
6
  key = (name + ".singleton").intern
6
7
  thread = Thread.current
7
- unless thread.thread_variable?(key)
8
- thread.thread_variable_set(key, new)
8
+ value = thread.thread_variable_get(key)
9
+ if value.nil?
10
+ value = new
11
+ thread.thread_variable_set(key, value)
9
12
  end
10
- thread.thread_variable_get(key)
13
+ value
11
14
  end
12
15
  end
13
16
  end
@@ -118,8 +118,11 @@ class Puppet::Configurer
118
118
  catalog = result.to_ral
119
119
  catalog.finalize
120
120
  catalog.retrieval_duration = duration
121
- catalog.write_class_file
122
- catalog.write_resource_file
121
+
122
+ if Puppet[:write_catalog_summary]
123
+ catalog.write_class_file
124
+ catalog.write_resource_file
125
+ end
123
126
  end
124
127
  options[:report].add_times(:convert_catalog, catalog_conversion_time) if options[:report]
125
128
 
@@ -387,9 +390,18 @@ class Puppet::Configurer
387
390
  # We only need to find out the environment to run in if we don't already have a catalog
388
391
  unless (cached_catalog || options[:catalog] || Puppet.settings.set_by_cli?(:environment) || Puppet[:strict_environment_mode])
389
392
  Puppet.debug(_("Environment not passed via CLI and no catalog was given, attempting to find out the last server-specified environment"))
390
- if last_server_specified_environment
391
- @environment = last_server_specified_environment
392
- report.environment = last_server_specified_environment
393
+ initial_environment, loaded_last_environment = last_server_specified_environment
394
+
395
+ unless loaded_last_environment
396
+ Puppet.debug(_("Requesting environment from the server"))
397
+ initial_environment = current_server_specified_environment(@environment, configured_environment, options)
398
+ end
399
+
400
+ if initial_environment
401
+ @environment = initial_environment
402
+ report.environment = initial_environment
403
+
404
+ push_current_environment_and_loaders
393
405
  else
394
406
  Puppet.debug(_("Could not find a usable environment in the lastrunfile. Either the file does not exist, does not have the required keys, or the values of 'initial_environment' and 'converged_environment' are identical."))
395
407
  end
@@ -400,14 +412,7 @@ class Puppet::Configurer
400
412
  # This is to maintain compatibility with anyone using this class
401
413
  # aside from agent, apply, device.
402
414
  unless Puppet.lookup(:loaders) { nil }
403
- new_env = Puppet::Node::Environment.remote(@environment)
404
- Puppet.push_context(
405
- {
406
- current_environment: new_env,
407
- loaders: Puppet::Pops::Loaders.new(new_env, true)
408
- },
409
- "Local node environment #{@environment} for configurer transaction"
410
- )
415
+ push_current_environment_and_loaders
411
416
  end
412
417
 
413
418
  temp_value = options[:pluginsync]
@@ -443,14 +448,7 @@ class Puppet::Configurer
443
448
  @environment = catalog.environment
444
449
  report.environment = @environment
445
450
 
446
- new_env = Puppet::Node::Environment.remote(@environment)
447
- Puppet.push_context(
448
- {
449
- :current_environment => new_env,
450
- :loaders => Puppet::Pops::Loaders.new(new_env, true)
451
- },
452
- "Local node environment #{@environment} for configurer transaction"
453
- )
451
+ push_current_environment_and_loaders
454
452
 
455
453
  query_options, facts = get_facts(options)
456
454
  query_options[:configured_environment] = configured_environment
@@ -560,28 +558,88 @@ class Puppet::Configurer
560
558
  end
561
559
  private :find_functional_server
562
560
 
561
+ #
562
+ # @api private
563
+ #
564
+ # Read the last server-specified environment from the lastrunfile. The
565
+ # environment is considered to be server-specified if the values of
566
+ # `initial_environment` and `converged_environment` are different.
567
+ #
568
+ # @return [String, Boolean] An array containing a string with the environment
569
+ # read from the lastrunfile in case the server is authoritative, and a
570
+ # boolean marking whether the last environment was correctly loaded.
563
571
  def last_server_specified_environment
564
- return @last_server_specified_environment if @last_server_specified_environment
572
+ return @last_server_specified_environment, @loaded_last_environment if @last_server_specified_environment
573
+
565
574
  if Puppet::FileSystem.exist?(Puppet[:lastrunfile])
566
575
  summary = Puppet::Util::Yaml.safe_load_file(Puppet[:lastrunfile])
567
- return unless summary.dig('application', 'run_mode') == 'agent'
568
- initial_environment = summary.dig('application', 'initial_environment')
569
- converged_environment = summary.dig('application', 'converged_environment')
576
+ return [nil, nil] unless summary['application']['run_mode'] == 'agent'
577
+ initial_environment = summary['application']['initial_environment']
578
+ converged_environment = summary['application']['converged_environment']
570
579
  @last_server_specified_environment = converged_environment if initial_environment != converged_environment
580
+ Puppet.debug(_("Successfully loaded last environment from the lastrunfile"))
581
+ @loaded_last_environment = true
571
582
  end
572
583
 
573
584
  Puppet.debug(_("Found last server-specified environment: %{environment}") % { environment: @last_server_specified_environment }) if @last_server_specified_environment
574
- @last_server_specified_environment
585
+ [@last_server_specified_environment, @loaded_last_environment]
575
586
  rescue => detail
576
587
  Puppet.debug(_("Could not find last server-specified environment: %{detail}") % { detail: detail })
577
- nil
588
+ [nil, nil]
578
589
  end
579
590
  private :last_server_specified_environment
580
591
 
592
+ def current_server_specified_environment(current_environment, configured_environment, options)
593
+ return @server_specified_environment if @server_specified_environment
594
+
595
+ begin
596
+ node_retr_time = thinmark do
597
+ node = Puppet::Node.indirection.find(Puppet[:node_name_value],
598
+ :environment => Puppet::Node::Environment.remote(current_environment),
599
+ :configured_environment => configured_environment,
600
+ :ignore_cache => true,
601
+ :transaction_uuid => @transaction_uuid,
602
+ :fail_on_404 => true)
603
+
604
+ # The :rest node terminus returns a node with an environment_name, but not an
605
+ # environment instance. Attempting to get the environment instance will load
606
+ # it from disk, which will likely fail. So create a remote environment.
607
+ #
608
+ # The :plain node terminus returns a node with an environment, but not an
609
+ # environment_name.
610
+ if !node.has_environment_instance? && node.environment_name
611
+ node.environment = Puppet::Node::Environment.remote(node.environment_name)
612
+ end
613
+
614
+ @server_specified_environment = node.environment.to_s
615
+
616
+ if @server_specified_environment != @environment
617
+ Puppet.notice _("Local environment: '%{local_env}' doesn't match server specified node environment '%{node_env}', switching agent to '%{node_env}'.") % { local_env: @environment, node_env: @server_specified_environment }
618
+ end
619
+ end
620
+
621
+ options[:report].add_times(:node_retrieval, node_retr_time)
622
+
623
+ @server_specified_environment
624
+ rescue => detail
625
+ Puppet.warning(_("Unable to fetch my node definition, but the agent run will continue:"))
626
+ Puppet.warning(detail)
627
+ nil
628
+ end
629
+ end
630
+ private :current_server_specified_environment
631
+
581
632
  def send_report(report)
582
633
  puts report.summary if Puppet[:summarize]
583
634
  save_last_run_summary(report)
584
- Puppet::Transaction::Report.indirection.save(report, nil, :environment => Puppet::Node::Environment.remote(@environment)) if Puppet[:report]
635
+ if Puppet[:report]
636
+ remote = Puppet::Node::Environment.remote(@environment)
637
+ begin
638
+ Puppet::Transaction::Report.indirection.save(report, nil, ignore_cache: true, environment: remote)
639
+ ensure
640
+ Puppet::Transaction::Report.indirection.save(report, nil, ignore_terminus: true, environment: remote)
641
+ end
642
+ end
585
643
  rescue => detail
586
644
  Puppet.log_exception(detail, _("Could not send report: %{detail}") % { detail: detail })
587
645
  end
@@ -604,7 +662,7 @@ class Puppet::Configurer
604
662
  # @return [false] If an exception is raised during fact generation or
605
663
  # submission.
606
664
  def resubmit_facts
607
- ::Facter.clear
665
+ Puppet.runtime[:facter].clear
608
666
  facts = find_facts
609
667
 
610
668
  client = Puppet.runtime[:http]
@@ -639,6 +697,17 @@ class Puppet::Configurer
639
697
  end
640
698
  end
641
699
 
700
+ def push_current_environment_and_loaders
701
+ new_env = Puppet::Node::Environment.remote(@environment)
702
+ Puppet.push_context(
703
+ {
704
+ :current_environment => new_env,
705
+ :loaders => Puppet::Pops::Loaders.new(new_env, true)
706
+ },
707
+ "Local node environment #{@environment} for configurer transaction"
708
+ )
709
+ end
710
+
642
711
  def retrieve_catalog_from_cache(query_options)
643
712
  result = nil
644
713
  @duration = thinmark do
@@ -18,7 +18,7 @@ class Puppet::Confine::Variable < Puppet::Confine
18
18
 
19
19
  # Retrieve the value from facter
20
20
  def facter_value
21
- @facter_value ||= ::Facter.value(name).to_s.downcase
21
+ @facter_value ||= Puppet.runtime[:facter].value(name).to_s.downcase
22
22
  end
23
23
 
24
24
  def initialize(values)