puppet 6.15.0-universal-darwin → 6.19.1-universal-darwin

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 (418) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/Gemfile +4 -2
  4. data/Gemfile.lock +29 -27
  5. data/README.md +3 -4
  6. data/Rakefile +4 -12
  7. data/lib/puppet.rb +32 -8
  8. data/lib/puppet/agent.rb +18 -4
  9. data/lib/puppet/agent/locker.rb +0 -7
  10. data/lib/puppet/application/agent.rb +23 -8
  11. data/lib/puppet/application/apply.rb +18 -20
  12. data/lib/puppet/application/device.rb +1 -1
  13. data/lib/puppet/application/doc.rb +1 -1
  14. data/lib/puppet/application/lookup.rb +16 -4
  15. data/lib/puppet/application/plugin.rb +1 -0
  16. data/lib/puppet/application/ssl.rb +1 -1
  17. data/lib/puppet/configurer.rb +61 -21
  18. data/lib/puppet/configurer/downloader.rb +31 -10
  19. data/lib/puppet/confine.rb +2 -2
  20. data/lib/puppet/confine/any.rb +1 -1
  21. data/lib/puppet/context/trusted_information.rb +14 -8
  22. data/lib/puppet/daemon.rb +13 -27
  23. data/lib/puppet/defaults.rb +119 -39
  24. data/lib/puppet/environments.rb +51 -10
  25. data/lib/puppet/face/catalog.rb +1 -1
  26. data/lib/puppet/face/config.rb +46 -16
  27. data/lib/puppet/face/facts.rb +1 -1
  28. data/lib/puppet/face/help.rb +29 -3
  29. data/lib/puppet/face/module/search.rb +5 -0
  30. data/lib/puppet/face/node.rb +3 -3
  31. data/lib/puppet/face/node/clean.rb +2 -2
  32. data/lib/puppet/face/plugin.rb +1 -1
  33. data/lib/puppet/face/status.rb +1 -1
  34. data/lib/puppet/feature/base.rb +1 -1
  35. data/lib/puppet/file_bucket/dipper.rb +1 -1
  36. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  37. data/lib/puppet/file_serving/metadata.rb +4 -1
  38. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  39. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  40. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  41. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  42. data/lib/puppet/file_system/file_impl.rb +4 -4
  43. data/lib/puppet/file_system/uniquefile.rb +12 -16
  44. data/lib/puppet/forge.rb +1 -1
  45. data/lib/puppet/forge/cache.rb +1 -1
  46. data/lib/puppet/forge/repository.rb +4 -7
  47. data/lib/puppet/functions/filter.rb +1 -0
  48. data/lib/puppet/functions/lstrip.rb +4 -4
  49. data/lib/puppet/functions/new.rb +8 -3
  50. data/lib/puppet/functions/reverse_each.rb +1 -1
  51. data/lib/puppet/functions/rstrip.rb +4 -4
  52. data/lib/puppet/functions/step.rb +1 -1
  53. data/lib/puppet/functions/strip.rb +4 -4
  54. data/lib/puppet/gettext/config.rb +5 -5
  55. data/lib/puppet/gettext/module_translations.rb +4 -4
  56. data/lib/puppet/http.rb +1 -0
  57. data/lib/puppet/http/client.rb +28 -12
  58. data/lib/puppet/http/external_client.rb +0 -6
  59. data/lib/puppet/http/redirector.rb +9 -7
  60. data/lib/puppet/http/resolver.rb +5 -8
  61. data/lib/puppet/http/resolver/server_list.rb +18 -36
  62. data/lib/puppet/http/resolver/settings.rb +4 -4
  63. data/lib/puppet/http/resolver/srv.rb +5 -5
  64. data/lib/puppet/http/response.rb +19 -0
  65. data/lib/puppet/http/service.rb +3 -1
  66. data/lib/puppet/http/service/compiler.rb +1 -1
  67. data/lib/puppet/http/service/file_server.rb +1 -1
  68. data/lib/puppet/http/service/puppetserver.rb +39 -0
  69. data/lib/puppet/http/session.rb +5 -4
  70. data/lib/puppet/indirector.rb +1 -1
  71. data/lib/puppet/indirector/catalog/compiler.rb +1 -1
  72. data/lib/puppet/indirector/exec.rb +1 -1
  73. data/lib/puppet/indirector/facts/facter.rb +3 -3
  74. data/lib/puppet/indirector/facts/yaml.rb +1 -1
  75. data/lib/puppet/indirector/file_content/http.rb +5 -0
  76. data/lib/puppet/indirector/file_content/rest.rb +1 -1
  77. data/lib/puppet/indirector/file_metadata/http.rb +28 -8
  78. data/lib/puppet/indirector/file_metadata/rest.rb +2 -2
  79. data/lib/puppet/indirector/hiera.rb +4 -0
  80. data/lib/puppet/indirector/indirection.rb +1 -1
  81. data/lib/puppet/indirector/json.rb +1 -1
  82. data/lib/puppet/indirector/msgpack.rb +1 -1
  83. data/lib/puppet/indirector/report/processor.rb +2 -2
  84. data/lib/puppet/indirector/request.rb +5 -5
  85. data/lib/puppet/indirector/rest.rb +7 -1
  86. data/lib/puppet/indirector/yaml.rb +1 -1
  87. data/lib/puppet/module.rb +1 -2
  88. data/lib/puppet/network/format_support.rb +2 -2
  89. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  90. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  91. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  92. data/lib/puppet/network/http/compression.rb +7 -0
  93. data/lib/puppet/network/http/connection.rb +2 -0
  94. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  95. data/lib/puppet/network/http/nocache_pool.rb +1 -0
  96. data/lib/puppet/network/http/route.rb +2 -2
  97. data/lib/puppet/network/http_pool.rb +2 -2
  98. data/lib/puppet/node/environment.rb +12 -5
  99. data/lib/puppet/node/facts.rb +17 -0
  100. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  101. data/lib/puppet/pal/pal_impl.rb +31 -4
  102. data/lib/puppet/parameter.rb +1 -1
  103. data/lib/puppet/parser/ast/leaf.rb +5 -5
  104. data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
  105. data/lib/puppet/parser/compiler.rb +29 -26
  106. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  107. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  108. data/lib/puppet/parser/environment_compiler.rb +4 -1
  109. data/lib/puppet/parser/functions.rb +21 -17
  110. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  111. data/lib/puppet/parser/functions/filter.rb +1 -0
  112. data/lib/puppet/parser/resource.rb +3 -2
  113. data/lib/puppet/parser/resource/param.rb +6 -0
  114. data/lib/puppet/parser/type_loader.rb +2 -2
  115. data/lib/puppet/pops/adaptable.rb +7 -13
  116. data/lib/puppet/pops/adapters.rb +8 -4
  117. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  118. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  119. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  120. data/lib/puppet/pops/issues.rb +5 -0
  121. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  122. data/lib/puppet/pops/loaders.rb +18 -11
  123. data/lib/puppet/pops/lookup/context.rb +1 -1
  124. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  125. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  126. data/lib/puppet/pops/types/iterable.rb +34 -8
  127. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  128. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  129. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  130. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  131. data/lib/puppet/provider/file/windows.rb +1 -1
  132. data/lib/puppet/provider/package/aix.rb +17 -2
  133. data/lib/puppet/provider/package/apt.rb +38 -1
  134. data/lib/puppet/provider/package/aptitude.rb +1 -1
  135. data/lib/puppet/provider/package/dnfmodule.rb +24 -4
  136. data/lib/puppet/provider/package/dpkg.rb +1 -1
  137. data/lib/puppet/provider/package/gem.rb +4 -2
  138. data/lib/puppet/provider/package/pip.rb +60 -37
  139. data/lib/puppet/provider/package/pip2.rb +17 -0
  140. data/lib/puppet/provider/package/portage.rb +2 -2
  141. data/lib/puppet/provider/package/puppet_gem.rb +5 -0
  142. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  143. data/lib/puppet/provider/package/yum.rb +9 -1
  144. data/lib/puppet/provider/package/zypper.rb +62 -1
  145. data/lib/puppet/provider/service/systemd.rb +21 -4
  146. data/lib/puppet/provider/service/windows.rb +23 -7
  147. data/lib/puppet/provider/user/aix.rb +1 -1
  148. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  149. data/lib/puppet/provider/user/useradd.rb +16 -5
  150. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  151. data/lib/puppet/reports/http.rb +7 -3
  152. data/lib/puppet/resource.rb +2 -1
  153. data/lib/puppet/resource/type.rb +10 -1
  154. data/lib/puppet/rest/route.rb +2 -2
  155. data/lib/puppet/runtime.rb +25 -2
  156. data/lib/puppet/settings.rb +43 -6
  157. data/lib/puppet/ssl/ssl_context.rb +2 -2
  158. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  159. data/lib/puppet/ssl/state_machine.rb +33 -8
  160. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  161. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  162. data/lib/puppet/test/test_helper.rb +19 -14
  163. data/lib/puppet/transaction.rb +2 -2
  164. data/lib/puppet/transaction/persistence.rb +1 -1
  165. data/lib/puppet/transaction/report.rb +12 -8
  166. data/lib/puppet/trusted_external.rb +29 -1
  167. data/lib/puppet/type.rb +15 -7
  168. data/lib/puppet/type/file.rb +40 -15
  169. data/lib/puppet/type/file/checksum.rb +4 -4
  170. data/lib/puppet/type/file/source.rb +33 -13
  171. data/lib/puppet/type/filebucket.rb +1 -1
  172. data/lib/puppet/type/notify.rb +2 -2
  173. data/lib/puppet/type/package.rb +16 -1
  174. data/lib/puppet/type/service.rb +59 -8
  175. data/lib/puppet/type/user.rb +19 -10
  176. data/lib/puppet/util.rb +41 -3
  177. data/lib/puppet/util/autoload.rb +10 -25
  178. data/lib/puppet/util/character_encoding.rb +9 -5
  179. data/lib/puppet/util/checksums.rb +19 -4
  180. data/lib/puppet/util/connection.rb +8 -8
  181. data/lib/puppet/util/execution.rb +2 -2
  182. data/lib/puppet/util/fileparsing.rb +2 -2
  183. data/lib/puppet/util/log/destinations.rb +1 -10
  184. data/lib/puppet/util/package/version/range.rb +4 -1
  185. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  186. data/lib/puppet/util/provider_features.rb +1 -1
  187. data/lib/puppet/util/reference.rb +1 -1
  188. data/lib/puppet/util/run_mode.rb +5 -1
  189. data/lib/puppet/util/windows.rb +1 -0
  190. data/lib/puppet/util/windows/api_types.rb +60 -33
  191. data/lib/puppet/util/windows/eventlog.rb +1 -6
  192. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  193. data/lib/puppet/util/windows/principal.rb +8 -6
  194. data/lib/puppet/util/windows/registry.rb +11 -11
  195. data/lib/puppet/util/windows/security.rb +4 -4
  196. data/lib/puppet/util/windows/service.rb +43 -26
  197. data/lib/puppet/util/windows/user.rb +242 -8
  198. data/lib/puppet/version.rb +1 -1
  199. data/locales/puppet.pot +541 -427
  200. data/man/man5/puppet.conf.5 +84 -19
  201. data/man/man8/puppet-agent.8 +7 -4
  202. data/man/man8/puppet-apply.8 +1 -1
  203. data/man/man8/puppet-catalog.8 +1 -1
  204. data/man/man8/puppet-config.8 +6 -6
  205. data/man/man8/puppet-describe.8 +1 -1
  206. data/man/man8/puppet-device.8 +1 -1
  207. data/man/man8/puppet-doc.8 +1 -1
  208. data/man/man8/puppet-epp.8 +1 -1
  209. data/man/man8/puppet-facts.8 +1 -1
  210. data/man/man8/puppet-filebucket.8 +1 -1
  211. data/man/man8/puppet-generate.8 +1 -1
  212. data/man/man8/puppet-help.8 +6 -3
  213. data/man/man8/puppet-key.8 +1 -1
  214. data/man/man8/puppet-lookup.8 +2 -2
  215. data/man/man8/puppet-man.8 +1 -1
  216. data/man/man8/puppet-module.8 +4 -1
  217. data/man/man8/puppet-node.8 +4 -4
  218. data/man/man8/puppet-parser.8 +1 -1
  219. data/man/man8/puppet-plugin.8 +1 -1
  220. data/man/man8/puppet-report.8 +1 -1
  221. data/man/man8/puppet-resource.8 +1 -1
  222. data/man/man8/puppet-script.8 +1 -1
  223. data/man/man8/puppet-ssl.8 +1 -1
  224. data/man/man8/puppet-status.8 +2 -2
  225. data/man/man8/puppet.8 +2 -2
  226. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  227. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  228. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  229. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  230. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-enabled.txt → dnf-module-list.txt} +6 -0
  231. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  232. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  233. data/spec/integration/application/agent_spec.rb +202 -52
  234. data/spec/integration/application/apply_spec.rb +149 -149
  235. data/spec/integration/application/config_spec.rb +74 -0
  236. data/spec/integration/application/doc_spec.rb +16 -6
  237. data/spec/integration/application/filebucket_spec.rb +70 -21
  238. data/spec/integration/application/help_spec.rb +42 -0
  239. data/spec/integration/application/lookup_spec.rb +13 -0
  240. data/spec/integration/application/module_spec.rb +68 -0
  241. data/spec/integration/application/plugin_spec.rb +75 -2
  242. data/spec/integration/configurer_spec.rb +14 -0
  243. data/spec/integration/data_binding_spec.rb +82 -0
  244. data/spec/integration/defaults_spec.rb +27 -3
  245. data/spec/integration/directory_environments_spec.rb +17 -17
  246. data/spec/integration/http/client_spec.rb +6 -1
  247. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  248. data/spec/integration/network/http_pool_spec.rb +73 -0
  249. data/spec/integration/node/environment_spec.rb +1 -1
  250. data/spec/integration/parser/compiler_spec.rb +11 -0
  251. data/spec/integration/type/file_spec.rb +1 -1
  252. data/spec/integration/util/execution_spec.rb +22 -0
  253. data/spec/integration/util/windows/adsi_spec.rb +7 -2
  254. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  255. data/spec/integration/util/windows/process_spec.rb +26 -32
  256. data/spec/integration/util/windows/registry_spec.rb +7 -7
  257. data/spec/integration/util/windows/user_spec.rb +47 -5
  258. data/spec/integration/util_spec.rb +7 -33
  259. data/spec/lib/puppet_spec/https.rb +6 -0
  260. data/spec/lib/puppet_spec/matchers.rb +0 -80
  261. data/spec/lib/puppet_spec/puppetserver.rb +8 -0
  262. data/spec/shared_contexts/types_setup.rb +2 -0
  263. data/spec/unit/agent_spec.rb +47 -1
  264. data/spec/unit/application/agent_spec.rb +7 -8
  265. data/spec/unit/application/doc_spec.rb +2 -2
  266. data/spec/unit/application/face_base_spec.rb +6 -4
  267. data/spec/unit/application/facts_spec.rb +41 -10
  268. data/spec/unit/application/man_spec.rb +52 -0
  269. data/spec/unit/application/resource_spec.rb +3 -1
  270. data/spec/unit/application/ssl_spec.rb +15 -2
  271. data/spec/unit/application_spec.rb +9 -4
  272. data/spec/unit/configurer/downloader_spec.rb +10 -0
  273. data/spec/unit/configurer/fact_handler_spec.rb +4 -4
  274. data/spec/unit/configurer_spec.rb +86 -37
  275. data/spec/unit/confine_spec.rb +2 -1
  276. data/spec/unit/context/trusted_information_spec.rb +25 -2
  277. data/spec/unit/daemon_spec.rb +5 -64
  278. data/spec/unit/environments_spec.rb +99 -32
  279. data/spec/unit/face/config_spec.rb +59 -1
  280. data/spec/unit/face/module/search_spec.rb +17 -0
  281. data/spec/unit/face/node_spec.rb +2 -2
  282. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  283. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  284. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  285. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  286. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  287. data/spec/unit/file_system/uniquefile_spec.rb +29 -0
  288. data/spec/unit/file_system_spec.rb +1 -2
  289. data/spec/unit/http/client_spec.rb +74 -19
  290. data/spec/unit/http/external_client_spec.rb +9 -9
  291. data/spec/unit/http/resolver_spec.rb +24 -5
  292. data/spec/unit/http/response_spec.rb +6 -0
  293. data/spec/unit/http/service/ca_spec.rb +2 -3
  294. data/spec/unit/http/service/compiler_spec.rb +2 -3
  295. data/spec/unit/http/service/file_server_spec.rb +2 -3
  296. data/spec/unit/http/service/puppetserver_spec.rb +82 -0
  297. data/spec/unit/http/service/report_spec.rb +2 -3
  298. data/spec/unit/http/service_spec.rb +0 -1
  299. data/spec/unit/http/session_spec.rb +8 -21
  300. data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
  301. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  302. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  303. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  304. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  305. data/spec/unit/indirector/file_metadata/rest_spec.rb +15 -14
  306. data/spec/unit/indirector/json_spec.rb +8 -8
  307. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  308. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  309. data/spec/unit/indirector/request_spec.rb +5 -5
  310. data/spec/unit/indirector/rest_spec.rb +14 -1
  311. data/spec/unit/indirector/status/rest_spec.rb +1 -1
  312. data/spec/unit/indirector/yaml_spec.rb +7 -7
  313. data/spec/unit/interface_spec.rb +3 -3
  314. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  315. data/spec/unit/network/format_support_spec.rb +3 -2
  316. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  317. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  318. data/spec/unit/network/http/connection_spec.rb +552 -190
  319. data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
  320. data/spec/unit/network/http_pool_spec.rb +63 -57
  321. data/spec/unit/network/http_spec.rb +1 -1
  322. data/spec/unit/node/environment_spec.rb +18 -1
  323. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  324. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  325. data/spec/unit/parser/scope_spec.rb +1 -1
  326. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  327. data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
  328. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  329. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  330. data/spec/unit/provider/exec_spec.rb +4 -3
  331. data/spec/unit/provider/package/aix_spec.rb +29 -0
  332. data/spec/unit/provider/package/apt_spec.rb +77 -0
  333. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  334. data/spec/unit/provider/package/dnfmodule_spec.rb +25 -5
  335. data/spec/unit/provider/package/dpkg_spec.rb +22 -7
  336. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  337. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  338. data/spec/unit/provider/package/pip_spec.rb +42 -16
  339. data/spec/unit/provider/package/portage_spec.rb +5 -0
  340. data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
  341. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  342. data/spec/unit/provider/package/yum_spec.rb +47 -8
  343. data/spec/unit/provider/package/zypper_spec.rb +98 -0
  344. data/spec/unit/provider/service/base_spec.rb +2 -4
  345. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  346. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  347. data/spec/unit/provider/service/debian_spec.rb +3 -5
  348. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  349. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  350. data/spec/unit/provider/service/init_spec.rb +46 -5
  351. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  352. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  353. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  354. data/spec/unit/provider/service/openwrt_spec.rb +2 -1
  355. data/spec/unit/provider/service/redhat_spec.rb +10 -1
  356. data/spec/unit/provider/service/runit_spec.rb +2 -1
  357. data/spec/unit/provider/service/smf_spec.rb +1 -1
  358. data/spec/unit/provider/service/src_spec.rb +3 -5
  359. data/spec/unit/provider/service/systemd_spec.rb +87 -19
  360. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  361. data/spec/unit/provider/service/windows_spec.rb +50 -14
  362. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  363. data/spec/unit/provider/user/useradd_spec.rb +30 -16
  364. data/spec/unit/provider/user/windows_adsi_spec.rb +82 -0
  365. data/spec/unit/puppet_pal_2pec.rb +40 -0
  366. data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
  367. data/spec/unit/puppet_spec.rb +33 -0
  368. data/spec/unit/reports/http_spec.rb +1 -1
  369. data/spec/unit/reports/store_spec.rb +17 -13
  370. data/spec/unit/resource_spec.rb +3 -3
  371. data/spec/unit/rest/route_spec.rb +4 -4
  372. data/spec/unit/settings_spec.rb +182 -22
  373. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  374. data/spec/unit/ssl/state_machine_spec.rb +52 -8
  375. data/spec/unit/test/test_helper_spec.rb +17 -0
  376. data/spec/unit/transaction/persistence_spec.rb +15 -0
  377. data/spec/unit/transaction/report_spec.rb +3 -1
  378. data/spec/unit/type/file/source_spec.rb +4 -4
  379. data/spec/unit/type/file_spec.rb +122 -96
  380. data/spec/unit/type/filebucket_spec.rb +1 -1
  381. data/spec/unit/type/service_spec.rb +218 -8
  382. data/spec/unit/type/user_spec.rb +32 -3
  383. data/spec/unit/type_spec.rb +50 -0
  384. data/spec/unit/util/autoload_spec.rb +2 -1
  385. data/spec/unit/util/character_encoding_spec.rb +4 -4
  386. data/spec/unit/util/checksums_spec.rb +16 -0
  387. data/spec/unit/util/command_line_spec.rb +11 -6
  388. data/spec/unit/util/log/destinations_spec.rb +1 -29
  389. data/spec/unit/util/package/version/range_spec.rb +22 -1
  390. data/spec/unit/util/run_mode_spec.rb +6 -6
  391. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  392. data/spec/unit/util/windows/service_spec.rb +4 -4
  393. data/spec/unit/util_spec.rb +3 -3
  394. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  395. data/tasks/manpages.rake +5 -35
  396. metadata +43 -49
  397. data/spec/integration/faces/config_spec.rb +0 -91
  398. data/spec/integration/faces/documentation_spec.rb +0 -57
  399. data/spec/integration/file_bucket/file_spec.rb +0 -50
  400. data/spec/integration/file_serving/content_spec.rb +0 -7
  401. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  402. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  403. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  404. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  405. data/spec/integration/module_tool/forge_spec.rb +0 -51
  406. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  407. data/spec/integration/provider/service/init_spec.rb +0 -48
  408. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  409. data/spec/integration/provider/service/windows_spec.rb +0 -50
  410. data/spec/integration/reference/providers_spec.rb +0 -21
  411. data/spec/integration/reports_spec.rb +0 -13
  412. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  413. data/spec/integration/ssl/host_spec.rb +0 -72
  414. data/spec/integration/ssl/key_spec.rb +0 -99
  415. data/spec/integration/test/test_helper_spec.rb +0 -31
  416. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  417. data/spec/unit/face/man_spec.rb +0 -25
  418. data/spec/unit/man_spec.rb +0 -31
@@ -22,9 +22,9 @@ module Puppet::SSL
22
22
  # This is an idiom to initialize a Struct from keyword
23
23
  # arguments. Ruby 2.5 introduced `keyword_init: true` for
24
24
  # that purpose, but we need to support older versions.
25
- def initialize(**kwargs)
25
+ def initialize(kwargs = {})
26
26
  super({})
27
- DEFAULTS.merge(kwargs).each { |k,v| self[k] = v }
27
+ DEFAULTS.merge(**kwargs).each { |k,v| self[k] = v }
28
28
  end
29
29
  end
30
30
  end
@@ -46,13 +46,32 @@ class Puppet::SSL::SSLProvider
46
46
  # perform revocation checking.
47
47
  #
48
48
  # @param cacerts [Array<OpenSSL::X509::Certificate>] Array of trusted CA certs
49
+ # @param path [String, nil] A file containing additional trusted CA certs.
49
50
  # @return [Puppet::SSL::SSLContext] A context to use to create connections
50
51
  # @raise (see #create_context)
51
52
  # @api private
52
- def create_system_context(cacerts:)
53
+ def create_system_context(cacerts:, path: Puppet[:ssl_trust_store])
53
54
  store = create_x509_store(cacerts, [], false)
54
55
  store.set_default_paths
55
56
 
57
+ if path
58
+ stat = Puppet::FileSystem.stat(path)
59
+ if stat
60
+ if stat.ftype == 'file'
61
+ # don't add empty files as ruby/openssl will raise
62
+ if stat.size > 0
63
+ begin
64
+ store.add_file(path)
65
+ rescue => e
66
+ Puppet.err(_("Failed to add '%{path}' as a trusted CA file: %{detail}" % { path: path, detail: e.message }, e))
67
+ end
68
+ end
69
+ else
70
+ Puppet.warning(_("The 'ssl_trust_store' setting does not refer to a file and will be ignored: '%{path}'" % { path: path }))
71
+ end
72
+ end
73
+ end
74
+
56
75
  Puppet::SSL::SSLContext.new(store: store, cacerts: cacerts, crls: [], revocation: false).freeze
57
76
  end
58
77
 
@@ -279,8 +279,8 @@ class Puppet::SSL::StateMachine
279
279
  Puppet.info(_("Will try again in %{time} seconds.") % {time: time})
280
280
 
281
281
  # close persistent connections and session state before sleeping
282
- Puppet.runtime['http'].close
283
- @machine.session = Puppet.runtime['http'].create_session
282
+ Puppet.runtime[:http].close
283
+ @machine.session = Puppet.runtime[:http].create_session
284
284
 
285
285
  @machine.unlock
286
286
  Kernel.sleep(time)
@@ -301,15 +301,31 @@ class Puppet::SSL::StateMachine
301
301
  # our ssl directory may have been cleaned while we were
302
302
  # sleeping, start over from the top
303
303
  NeedCACerts.new(@machine)
304
+ elsif @machine.waitforlock < 1
305
+ LockFailure.new(@machine, _("Another puppet instance is already running and the waitforlock setting is set to 0; exiting"))
306
+ elsif Time.now.to_i >= @machine.waitlock_deadline
307
+ LockFailure.new(@machine, _("Another puppet instance is already running and the maxwaitforlock timeout has been exceeded; exiting"))
304
308
  else
305
- LockFailure.new(@machine, nil)
309
+ Puppet.info _("Another puppet instance is already running; waiting for it to finish")
310
+ Puppet.info _("Will try again in %{time} seconds.") % {time: @machine.waitforlock}
311
+ Kernel.sleep @machine.waitforlock
312
+
313
+ # try again
314
+ self
306
315
  end
307
316
  end
308
317
  end
309
318
 
310
319
  # We failed to acquire the lock, so exit
311
320
  #
312
- class LockFailure < SSLState; end
321
+ class LockFailure < SSLState
322
+ attr_reader :message
323
+
324
+ def initialize(machine, message)
325
+ super(machine, nil)
326
+ @message = message
327
+ end
328
+ end
313
329
 
314
330
  # We cannot make progress due to an error.
315
331
  #
@@ -333,7 +349,7 @@ class Puppet::SSL::StateMachine
333
349
  #
334
350
  class Done < SSLState; end
335
351
 
336
- attr_reader :waitforcert, :wait_deadline, :cert_provider, :ssl_provider, :ca_fingerprint, :digest
352
+ attr_reader :waitforcert, :wait_deadline, :waitforlock, :waitlock_deadline, :cert_provider, :ssl_provider, :ca_fingerprint, :digest
337
353
  attr_accessor :session
338
354
 
339
355
  # Construct a state machine to manage the SSL initialization process. By
@@ -346,7 +362,12 @@ class Puppet::SSL::StateMachine
346
362
  # then then state machine will exit instead of wait.
347
363
  #
348
364
  # @param waitforcert [Integer] how many seconds to wait between attempts
349
- # @param maxwiatforcert [Integer] maximum amount of second
365
+ # @param maxwaitforcert [Integer] maximum amount of seconds to wait for the
366
+ # server to sign the certificate request
367
+ # @param waitforlock [Integer] how many seconds to wait between attempts for
368
+ # acquiring the ssl lock
369
+ # @param maxwaitforlock [Integer] maximum amount of seconds to wait for an
370
+ # already running process to release the ssl lock
350
371
  # @param onetime [Boolean] whether to run onetime
351
372
  # @param lockfile [Puppet::Util::Pidlock] lockfile to protect against
352
373
  # concurrent modification by multiple processes
@@ -359,6 +380,8 @@ class Puppet::SSL::StateMachine
359
380
  # downloaded CA bundle
360
381
  def initialize(waitforcert: Puppet[:waitforcert],
361
382
  maxwaitforcert: Puppet[:maxwaitforcert],
383
+ waitforlock: Puppet[:waitforlock],
384
+ maxwaitforlock: Puppet[:maxwaitforlock],
362
385
  onetime: Puppet[:onetime],
363
386
  cert_provider: Puppet::X509::CertProvider.new,
364
387
  ssl_provider: Puppet::SSL::SSLProvider.new,
@@ -367,13 +390,15 @@ class Puppet::SSL::StateMachine
367
390
  ca_fingerprint: Puppet[:ca_fingerprint])
368
391
  @waitforcert = waitforcert
369
392
  @wait_deadline = Time.now.to_i + maxwaitforcert
393
+ @waitforlock = waitforlock
394
+ @waitlock_deadline = Time.now.to_i + maxwaitforlock
370
395
  @onetime = onetime
371
396
  @cert_provider = cert_provider
372
397
  @ssl_provider = ssl_provider
373
398
  @lockfile = lockfile
374
399
  @digest = digest
375
400
  @ca_fingerprint = ca_fingerprint
376
- @session = Puppet.runtime['http'].create_session
401
+ @session = Puppet.runtime[:http].create_session
377
402
  end
378
403
 
379
404
  # Run the state machine for CA certs and CRLs.
@@ -427,7 +452,7 @@ class Puppet::SSL::StateMachine
427
452
  when stop
428
453
  break
429
454
  when LockFailure
430
- raise Puppet::Error, _('Another puppet instance is already running; exiting')
455
+ raise Puppet::Error, state.message
431
456
  when Error
432
457
  if @onetime
433
458
  Puppet.log_exception(state.error)
@@ -104,7 +104,7 @@ class Puppet::SSL::Validator::DefaultValidator #< class Puppet::SSL::Validator
104
104
  crl = store_context.current_crl
105
105
  if crl
106
106
  if crl.last_update && crl.last_update < Time.now + FIVE_MINUTES_AS_SECONDS
107
- Puppet.debug("Ignoring CRL not yet valid, current time #{Time.now.utc}, CRL last updated #{crl.last_update.utc}")
107
+ Puppet.debug { "Ignoring CRL not yet valid, current time #{Time.now.utc}, CRL last updated #{crl.last_update.utc}" }
108
108
  preverify_ok = true
109
109
  else
110
110
  @verify_errors << "#{error_string} for #{crl.issuer.to_utf8}"
@@ -6,10 +6,18 @@
6
6
  # loaded above.
7
7
  #
8
8
  class Puppet::SSL::VerifierAdapter
9
- attr_reader :validator
9
+ attr_reader :validator, :ssl_context
10
10
 
11
11
  def initialize(validator)
12
12
  @validator = validator
13
+
14
+ if validator.is_a?(Puppet::SSL::Validator::NoValidator)
15
+ ssl = Puppet::SSL::SSLProvider.new
16
+ @ssl_context = ssl.create_insecure_context
17
+ else
18
+ # nil means use the default SSLContext
19
+ @ssl_context = nil
20
+ end
13
21
  end
14
22
 
15
23
  # Return true if `self` is reusable with `verifier` meaning they
@@ -68,7 +68,14 @@ module Puppet::Test
68
68
  # any individual tests.
69
69
  # @return nil
70
70
  def self.before_all_tests()
71
- # Make sure that all of the setup is also done for any before(:all) blocks
71
+ # The process environment is a shared, persistent resource.
72
+ # Can't use Puppet.features.microsoft_windows? as it may be mocked out in a test. This can cause test recurring test failures
73
+ if (!!File::ALT_SEPARATOR)
74
+ mode = :windows
75
+ else
76
+ mode = :posix
77
+ end
78
+ $old_env = Puppet::Util.get_environment(mode)
72
79
  end
73
80
 
74
81
  # Call this method once, at the end of a test run, when no more tests
@@ -113,20 +120,14 @@ module Puppet::Test
113
120
  indirections = Puppet::Indirector::Indirection.send(:class_variable_get, :@@indirections)
114
121
  indirections.each do |indirector|
115
122
  $saved_indirection_state[indirector.name] = {
116
- :@terminus_class => indirector.instance_variable_get(:@terminus_class).value,
117
- :@cache_class => indirector.instance_variable_get(:@cache_class).value
123
+ :@terminus_class => indirector.instance_variable_get(:@terminus_class).value,
124
+ :@cache_class => indirector.instance_variable_get(:@cache_class).value,
125
+ # dup the termini hash so termini created and registered during
126
+ # the test aren't stored in our saved_indirection_state
127
+ :@termini => indirector.instance_variable_get(:@termini).dup
118
128
  }
119
129
  end
120
130
 
121
- # The process environment is a shared, persistent resource.
122
- # Can't use Puppet.features.microsoft_windows? as it may be mocked out in a test. This can cause test recurring test failures
123
- if (!!File::ALT_SEPARATOR)
124
- mode = :windows
125
- else
126
- mode = :posix
127
- end
128
- $old_env = Puppet::Util.get_environment(mode)
129
-
130
131
  # So is the load_path
131
132
  $old_load_path = $LOAD_PATH.dup
132
133
 
@@ -137,7 +138,7 @@ module Puppet::Test
137
138
  trusted_information:
138
139
  Puppet::Context::TrustedInformation.new('local', 'testing', {}, { "trusted_testhelper" => true }),
139
140
  ssl_context: Puppet::SSL::SSLContext.new(cacerts: []).freeze,
140
- http_session: proc { Puppet.runtime["http"].create_session }
141
+ http_session: proc { Puppet.runtime[:http].create_session }
141
142
  },
142
143
  "Context for specs")
143
144
 
@@ -178,7 +179,11 @@ module Puppet::Test
178
179
  indirections = Puppet::Indirector::Indirection.send(:class_variable_get, :@@indirections)
179
180
  indirections.each do |indirector|
180
181
  $saved_indirection_state.fetch(indirector.name, {}).each do |variable, value|
181
- indirector.instance_variable_get(variable).value = value
182
+ if variable == :@termini
183
+ indirector.instance_variable_set(variable, value)
184
+ else
185
+ indirector.instance_variable_get(variable).value = value
186
+ end
182
187
  end
183
188
  end
184
189
  $saved_indirection_state = nil
@@ -202,7 +202,7 @@ class Puppet::Transaction
202
202
  # mark the end of transaction evaluate.
203
203
  report.transaction_completed = true
204
204
 
205
- Puppet.debug "Finishing transaction #{object_id}"
205
+ Puppet.debug { "Finishing transaction #{object_id}" }
206
206
  end
207
207
 
208
208
  # Wraps application run state check to flag need to interrupt processing
@@ -373,7 +373,7 @@ class Puppet::Transaction
373
373
  type_name = provider_class.resource_type.name
374
374
  return if @prefetched_providers[type_name][provider_class.name] ||
375
375
  @prefetch_failed_providers[type_name][provider_class.name]
376
- Puppet.debug "Prefetching #{provider_class.name} resources for #{type_name}"
376
+ Puppet.debug { "Prefetching #{provider_class.name} resources for #{type_name}" }
377
377
  begin
378
378
  provider_class.prefetch(resources)
379
379
  rescue LoadError, Puppet::MissingCommand => detail
@@ -62,7 +62,7 @@ class Puppet::Transaction::Persistence
62
62
  result = nil
63
63
  Puppet::Util.benchmark(:debug, _("Loaded transaction store file in %{seconds} seconds")) do
64
64
  begin
65
- result = Puppet::Util::Yaml.safe_load_file(filename, [Symbol])
65
+ result = Puppet::Util::Yaml.safe_load_file(filename, [Symbol, Time])
66
66
  rescue Puppet::Util::Yaml::YamlLoadError => detail
67
67
  Puppet.log_exception(detail, _("Transaction store file %{filename} is corrupt (%{detail}); replacing") % { filename: filename, detail: detail })
68
68
 
@@ -63,9 +63,11 @@ class Puppet::Transaction::Report
63
63
  # or 'on_failure'
64
64
  attr_accessor :cached_catalog_status
65
65
 
66
- # Contains the name and port of the master that was successfully contacted
66
+ # Contains the name and port of the server that was successfully contacted
67
67
  # @return [String] a string of the format 'servername:port'
68
- attr_accessor :master_used
68
+ attr_accessor :server_used
69
+ alias :master_used :server_used
70
+ alias :master_used= :server_used=
69
71
 
70
72
  # The host name for which the report is generated
71
73
  # @return [String] the host name
@@ -122,7 +124,7 @@ class Puppet::Transaction::Report
122
124
 
123
125
  # @!attribute [r] corrective_change
124
126
  # @return [Boolean] true if the report contains any events and resources that had
125
- # corrective changes.
127
+ # corrective changes, including noop corrective changes.
126
128
  attr_reader :corrective_change
127
129
 
128
130
  # @return [Boolean] true if one or more resources attempted to generate
@@ -224,7 +226,7 @@ class Puppet::Transaction::Report
224
226
  @external_times ||= {}
225
227
  @host = Puppet[:node_name_value]
226
228
  @time = start_time
227
- @report_format = 10
229
+ @report_format = 11
228
230
  @puppet_version = Puppet.version
229
231
  @configuration_version = configuration_version
230
232
  @transaction_uuid = transaction_uuid
@@ -232,7 +234,7 @@ class Puppet::Transaction::Report
232
234
  @job_id = job_id
233
235
  @catalog_uuid = nil
234
236
  @cached_catalog_status = nil
235
- @master_used = nil
237
+ @server_used = nil
236
238
  @environment = environment
237
239
  @status = 'failed' # assume failed until the report is finalized
238
240
  @noop = Puppet[:noop]
@@ -256,8 +258,10 @@ class Puppet::Transaction::Report
256
258
  @time = data['time']
257
259
  @corrective_change = data['corrective_change']
258
260
 
259
- if data['master_used']
260
- @master_used = data['master_used']
261
+ if data['server_used']
262
+ @server_used = data['server_used']
263
+ elsif data['master_used']
264
+ @server_used = data['master_used']
261
265
  end
262
266
 
263
267
  if data['catalog_uuid']
@@ -322,7 +326,7 @@ class Puppet::Transaction::Report
322
326
  }
323
327
 
324
328
  # The following is include only when set
325
- hash['master_used'] = @master_used unless @master_used.nil?
329
+ hash['master_used'] = hash['server_used'] = @server_used unless @server_used.nil?
326
330
  hash['catalog_uuid'] = @catalog_uuid unless @catalog_uuid.nil?
327
331
  hash['code_id'] = @code_id unless @code_id.nil?
328
332
  hash['job_id'] = @job_id unless @job_id.nil?
@@ -3,11 +3,39 @@ module Puppet::TrustedExternal
3
3
  def retrieve(certname)
4
4
  command = Puppet[:trusted_external_command]
5
5
  return nil unless command
6
+ Puppet.debug { _("Retrieving trusted external data from %{command}") % {command: command} }
7
+ setting_type = Puppet.settings.setting(:trusted_external_command).type
8
+ if setting_type == :file
9
+ return fetch_data(command, certname)
10
+ end
11
+ # command is a directory. Thus, data is a hash of <basename> => <data> for
12
+ # each executable file in command. For example, if the files 'servicenow.rb',
13
+ # 'unicorn.sh' are in command, then data is the following hash:
14
+ # { 'servicenow' => <servicenow.rb output>, 'unicorn' => <unicorn.sh output> }
15
+ data = {}
16
+ Puppet::FileSystem.children(command).each do |file|
17
+ abs_path = Puppet::FileSystem.expand_path(file)
18
+ executable_file = Puppet::FileSystem.file?(abs_path) && Puppet::FileSystem.executable?(abs_path)
19
+ unless executable_file
20
+ Puppet.debug { _("Skipping non-executable file %{file}") % { file: abs_path } }
21
+ next
22
+ end
23
+ basename = file.basename(file.extname).to_s
24
+ unless data[basename].nil?
25
+ raise Puppet::Error, _("There is more than one '%{basename}' script in %{dir}") % { basename: basename, dir: command }
26
+ end
27
+ data[basename] = fetch_data(abs_path, certname)
28
+ end
29
+ data
30
+ end
31
+ module_function :retrieve
32
+
33
+ def fetch_data(command, certname)
6
34
  result = Puppet::Util::Execution.execute([command, certname], {
7
35
  :combine => false,
8
36
  :failonfail => true,
9
37
  })
10
38
  JSON.parse(result)
11
39
  end
12
- module_function :retrieve
40
+ module_function :fetch_data
13
41
  end
@@ -116,8 +116,10 @@ class Type
116
116
 
117
117
  # Allow declaring that a type is actually a capability
118
118
  class << self
119
+ # @deprecated application orchestration will be removed in puppet 7
119
120
  attr_accessor :is_capability
120
121
 
122
+ # @deprecated application orchestration will be removed in puppet 7
121
123
  def is_capability?
122
124
  c = is_capability
123
125
  c.nil? ? false : c
@@ -129,6 +131,8 @@ class Type
129
131
  # represent application instances, this implementation always returns
130
132
  # +false+. Having this method though makes code checking whether a
131
133
  # resource is an application instance simpler
134
+ #
135
+ # @deprecated application orchestration will be removed in puppet 7
132
136
  def self.application?
133
137
  false
134
138
  end
@@ -749,7 +753,7 @@ class Type
749
753
  # @param options [Hash] options merged with a fixed set of options defined by this method, passed on to {Puppet::Transaction::Event}.
750
754
  # @return [Puppet::Transaction::Event] the created event
751
755
  def event(options = {})
752
- Puppet::Transaction::Event.new({:resource => self, :file => file, :line => line, :tags => tags}.merge(options))
756
+ Puppet::Transaction::Event.new(**{:resource => self, :file => file, :line => line, :tags => tags}.merge(options))
753
757
  end
754
758
 
755
759
  # @return [Object, nil] Returns the 'should' (wanted state) value for a specified property, or nil if the
@@ -1205,15 +1209,17 @@ class Type
1205
1209
  provider.instances.collect do |instance|
1206
1210
  # We always want to use the "first" provider instance we find, unless the resource
1207
1211
  # is already managed and has a different provider set
1208
- other = provider_instances[instance.name]
1212
+ title = instance.respond_to?(:title) ? instance.title : instance.name
1213
+ other = provider_instances[title]
1209
1214
  if other
1210
- Puppet.debug "%s %s found in both %s and %s; skipping the %s version" %
1211
- [self.name.to_s.capitalize, instance.name, other.class.name, instance.class.name, instance.class.name]
1215
+ Puppet.debug {
1216
+ "%s %s found in both %s and %s; skipping the %s version" % [self.name.to_s.capitalize, title, other.class.name, instance.class.name, instance.class.name]
1217
+ }
1212
1218
  next
1213
1219
  end
1214
- provider_instances[instance.name] = instance
1220
+ provider_instances[title] = instance
1215
1221
 
1216
- result = new(:name => instance.name, :provider => instance)
1222
+ result = new(:name => instance.name, :provider => instance, :title => title)
1217
1223
  properties.each { |name| result.newattr(name) }
1218
1224
  result
1219
1225
  end
@@ -1714,6 +1720,7 @@ class Type
1714
1720
  }
1715
1721
  end
1716
1722
 
1723
+ # @deprecated application orchestration will be removed in puppet 7
1717
1724
  newmetaparam(:export, :parent => RelationshipMetaparam, :attributes => {:direction => :out, :events => :NONE}) do
1718
1725
  desc <<EOS
1719
1726
  Export a capability resource.
@@ -1739,6 +1746,7 @@ web { server:
1739
1746
  EOS
1740
1747
  end
1741
1748
 
1749
+ # @deprecated application orchestration will be removed in puppet 7
1742
1750
  newmetaparam(:consume, :parent => RelationshipMetaparam, :attributes => {:direction => :in, :events => :NONE}) do
1743
1751
  desc <<EOS
1744
1752
  Consume a capability resource.
@@ -1888,7 +1896,7 @@ end
1888
1896
  name = name.intern
1889
1897
 
1890
1898
  if unprovide(name)
1891
- Puppet.debug "Reloading #{name} #{self.name} provider"
1899
+ Puppet.debug { "Reloading #{name} #{self.name} provider" }
1892
1900
  end
1893
1901
 
1894
1902
  pname = options[:parent]
@@ -116,9 +116,9 @@ Puppet::Type.newtype(:file) do
116
116
  that sufficient disk space is available for the file backups. Generally, you
117
117
  can implement this using one of the following two options:
118
118
  - Use a `find` command and `crontab` entry to retain only the last X days
119
- of file backups. For example,
119
+ of file backups. For example:
120
120
 
121
- ```shell script
121
+ ```
122
122
  find /opt/puppetlabs/server/data/puppetserver/bucket -type f -mtime +45 -atime +45 -print0 | xargs -0 rm
123
123
  ```
124
124
 
@@ -401,8 +401,12 @@ Puppet::Type.newtype(:file) do
401
401
  end
402
402
  end
403
403
 
404
- CREATORS = [:content, :source, :target]
405
- SOURCE_ONLY_CHECKSUMS = [:none, :ctime, :mtime]
404
+ # mutually exclusive ways to create files
405
+ CREATORS = [:content, :source, :target].freeze
406
+
407
+ # This is both "checksum types that can't be used with the content property"
408
+ # and "checksum types that are not digest based"
409
+ SOURCE_ONLY_CHECKSUMS = [:none, :ctime, :mtime].freeze
406
410
 
407
411
  validate do
408
412
  creator_count = 0
@@ -428,7 +432,7 @@ Puppet::Type.newtype(:file) do
428
432
  @parameters[:content].value = @parameters[:checksum].sum(@parameters[:content].actual_content)
429
433
  end
430
434
 
431
- if self[:checksum] && self[:checksum_value] && !send("#{self[:checksum]}?", self[:checksum_value])
435
+ if self[:checksum] && self[:checksum_value] && !valid_checksum?(self[:checksum], self[:checksum_value])
432
436
  self.fail _("Checksum value '%{value}' is not a valid checksum type %{checksum}") % { value: self[:checksum_value], checksum: self[:checksum] }
433
437
  end
434
438
 
@@ -930,7 +934,7 @@ Puppet::Type.newtype(:file) do
930
934
  # that out.
931
935
  end
932
936
 
933
- fail_if_checksum_is_wrong(file.path, content_checksum) if validate_checksum?
937
+ fail_if_checksum_is_wrong(property, file.path, content_checksum)
934
938
  end
935
939
  else
936
940
  umask = mode ? 000 : 022
@@ -1040,17 +1044,38 @@ Puppet::Type.newtype(:file) do
1040
1044
  end
1041
1045
  end
1042
1046
 
1043
- # Should we validate the checksum of the file we're writing?
1044
- def validate_checksum?
1045
- self[:checksum] !~ /time/
1046
- end
1047
-
1048
1047
  # Make sure the file we wrote out is what we think it is.
1049
- def fail_if_checksum_is_wrong(path, content_checksum)
1050
- newsum = parameter(:checksum).sum_file(path)
1051
- return if [:absent, nil, content_checksum].include?(newsum)
1048
+ # @param [Puppet::Parameter] property the param or property that wrote the file, or nil
1049
+ # @param [String] path to the file
1050
+ # @param [String] the checksum for the local file
1051
+ #
1052
+ # @api private
1053
+ #
1054
+ def fail_if_checksum_is_wrong(property, path, content_checksum)
1055
+ desired_checksum = desired_checksum(property, path)
1052
1056
 
1053
- self.fail _("File written to disk did not match checksum; discarding changes (%{content_checksum} vs %{newsum})") % { content_checksum: content_checksum, newsum: newsum }
1057
+ if desired_checksum && content_checksum != desired_checksum
1058
+ self.fail _("File written to disk did not match desired checksum; discarding changes (%{content_checksum} vs %{desired_checksum})") % { content_checksum: content_checksum, desired_checksum: desired_checksum }
1059
+ end
1060
+ end
1061
+
1062
+ # Return the desired checksum or nil
1063
+ def desired_checksum(property, path)
1064
+ return if SOURCE_ONLY_CHECKSUMS.include?(self[:checksum])
1065
+
1066
+ if self[:checksum] && self[:checksum_value]
1067
+ "{#{self[:checksum]}}#{self[:checksum_value]}"
1068
+ elsif property && property.name == :source
1069
+ meta = property.metadata
1070
+ return unless meta
1071
+
1072
+ # due to HttpMetadata the checksum type may fallback to mtime, so recheck
1073
+ return if SOURCE_ONLY_CHECKSUMS.include?(meta.checksum_type)
1074
+ meta.checksum
1075
+ elsif property && property.name == :content
1076
+ str = property.actual_content
1077
+ str ? parameter(:checksum).sum(str) : nil
1078
+ end
1054
1079
  end
1055
1080
 
1056
1081
  def write_temporary_file?