puppet 6.12.0-universal-darwin → 6.17.0-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 (412) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +4 -2
  5. data/Gemfile.lock +39 -36
  6. data/README.md +18 -25
  7. data/ext/project_data.yaml +1 -1
  8. data/ext/windows/service/daemon.rb +3 -3
  9. data/lib/puppet.rb +52 -13
  10. data/lib/puppet/agent.rb +20 -14
  11. data/lib/puppet/application/agent.rb +26 -17
  12. data/lib/puppet/application/describe.rb +7 -5
  13. data/lib/puppet/application/device.rb +2 -2
  14. data/lib/puppet/application/filebucket.rb +19 -15
  15. data/lib/puppet/application/plugin.rb +1 -0
  16. data/lib/puppet/application/resource.rb +1 -1
  17. data/lib/puppet/application/ssl.rb +4 -4
  18. data/lib/puppet/configurer.rb +65 -69
  19. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  20. data/lib/puppet/confine.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 +154 -58
  24. data/lib/puppet/environments.rb +27 -20
  25. data/lib/puppet/face/facts.rb +8 -5
  26. data/lib/puppet/face/help.rb +29 -3
  27. data/lib/puppet/face/module/search.rb +5 -0
  28. data/lib/puppet/face/plugin.rb +2 -2
  29. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  30. data/lib/puppet/file_serving/metadata.rb +4 -1
  31. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  32. data/lib/puppet/file_system/file_impl.rb +14 -10
  33. data/lib/puppet/file_system/memory_file.rb +6 -0
  34. data/lib/puppet/file_system/memory_impl.rb +13 -0
  35. data/lib/puppet/file_system/uniquefile.rb +12 -16
  36. data/lib/puppet/file_system/windows.rb +7 -10
  37. data/lib/puppet/forge.rb +1 -1
  38. data/lib/puppet/forge/cache.rb +1 -1
  39. data/lib/puppet/forge/repository.rb +4 -7
  40. data/lib/puppet/functions/call.rb +1 -1
  41. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  42. data/lib/puppet/functions/filter.rb +1 -0
  43. data/lib/puppet/functions/reduce.rb +2 -4
  44. data/lib/puppet/http.rb +5 -0
  45. data/lib/puppet/http/client.rb +293 -73
  46. data/lib/puppet/http/errors.rb +2 -0
  47. data/lib/puppet/http/external_client.rb +90 -0
  48. data/lib/puppet/http/redirector.rb +43 -7
  49. data/lib/puppet/http/resolver.rb +46 -3
  50. data/lib/puppet/http/resolver/server_list.rb +76 -16
  51. data/lib/puppet/http/resolver/settings.rb +23 -3
  52. data/lib/puppet/http/resolver/srv.rb +29 -3
  53. data/lib/puppet/http/response.rb +87 -1
  54. data/lib/puppet/http/retry_after_handler.rb +39 -0
  55. data/lib/puppet/http/service.rb +151 -7
  56. data/lib/puppet/http/service/ca.rb +76 -14
  57. data/lib/puppet/http/service/compiler.rb +319 -0
  58. data/lib/puppet/http/service/file_server.rb +206 -0
  59. data/lib/puppet/http/service/report.rb +49 -23
  60. data/lib/puppet/http/session.rb +103 -7
  61. data/lib/puppet/indirector.rb +1 -1
  62. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  63. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  64. data/lib/puppet/indirector/facts/rest.rb +42 -0
  65. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  66. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  67. data/lib/puppet/indirector/file_content/http.rb +5 -0
  68. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  69. data/lib/puppet/indirector/file_metadata/http.rb +27 -8
  70. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  71. data/lib/puppet/indirector/json.rb +1 -1
  72. data/lib/puppet/indirector/msgpack.rb +1 -1
  73. data/lib/puppet/indirector/node/rest.rb +24 -0
  74. data/lib/puppet/indirector/report/rest.rb +19 -0
  75. data/lib/puppet/indirector/report/yaml.rb +23 -0
  76. data/lib/puppet/indirector/request.rb +1 -1
  77. data/lib/puppet/indirector/rest.rb +12 -0
  78. data/lib/puppet/indirector/status/rest.rb +18 -0
  79. data/lib/puppet/loaders.rb +6 -0
  80. data/lib/puppet/metatype/manager.rb +80 -80
  81. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  82. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  83. data/lib/puppet/network/http/base_pool.rb +7 -2
  84. data/lib/puppet/network/http/compression.rb +7 -0
  85. data/lib/puppet/network/http/connection.rb +6 -0
  86. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  87. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  88. data/lib/puppet/network/http/pool.rb +13 -6
  89. data/lib/puppet/network/http_pool.rb +2 -1
  90. data/lib/puppet/node/environment.rb +11 -1
  91. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  92. data/lib/puppet/pal/pal_impl.rb +4 -29
  93. data/lib/puppet/parser/ast/leaf.rb +5 -5
  94. data/lib/puppet/parser/ast/pops_bridge.rb +6 -15
  95. data/lib/puppet/parser/compiler.rb +43 -33
  96. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  97. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  98. data/lib/puppet/parser/environment_compiler.rb +4 -1
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/filter.rb +1 -0
  101. data/lib/puppet/parser/resource.rb +3 -2
  102. data/lib/puppet/parser/resource/param.rb +6 -0
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +6 -6
  105. data/lib/puppet/pops/issues.rb +5 -0
  106. data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +12 -3
  107. data/lib/puppet/pops/loaders.rb +7 -5
  108. data/lib/puppet/pops/parser/evaluating_parser.rb +5 -7
  109. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  110. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  111. data/lib/puppet/pops/types/type_calculator.rb +24 -0
  112. data/lib/puppet/pops/validation/checker4_0.rb +11 -1
  113. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  114. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  115. data/lib/puppet/provider/aix_object.rb +4 -2
  116. data/lib/puppet/provider/group/aix.rb +1 -0
  117. data/lib/puppet/provider/group/groupadd.rb +57 -24
  118. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  119. data/lib/puppet/provider/package/aix.rb +17 -2
  120. data/lib/puppet/provider/package/apt.rb +78 -4
  121. data/lib/puppet/provider/package/aptitude.rb +1 -1
  122. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  123. data/lib/puppet/provider/package/dpkg.rb +14 -7
  124. data/lib/puppet/provider/package/fink.rb +20 -3
  125. data/lib/puppet/provider/package/gem.rb +41 -7
  126. data/lib/puppet/provider/package/openbsd.rb +13 -1
  127. data/lib/puppet/provider/package/pacman.rb +2 -5
  128. data/lib/puppet/provider/package/pip.rb +143 -48
  129. data/lib/puppet/provider/package/pip3.rb +0 -2
  130. data/lib/puppet/provider/package/pkg.rb +18 -5
  131. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  132. data/lib/puppet/provider/package/pkgng.rb +16 -4
  133. data/lib/puppet/provider/package/portage.rb +2 -2
  134. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  135. data/lib/puppet/provider/package/rpm.rb +6 -213
  136. data/lib/puppet/provider/package/yum.rb +109 -25
  137. data/lib/puppet/provider/package/zypper.rb +59 -1
  138. data/lib/puppet/provider/service/systemd.rb +22 -4
  139. data/lib/puppet/provider/service/windows.rb +23 -7
  140. data/lib/puppet/provider/user/aix.rb +1 -0
  141. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  142. data/lib/puppet/provider/user/useradd.rb +22 -12
  143. data/lib/puppet/reports/http.rb +15 -9
  144. data/lib/puppet/reports/store.rb +1 -1
  145. data/lib/puppet/resource.rb +2 -1
  146. data/lib/puppet/resource/type.rb +8 -0
  147. data/lib/puppet/resource/type_collection.rb +20 -16
  148. data/lib/puppet/runtime.rb +31 -1
  149. data/lib/puppet/settings.rb +4 -0
  150. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  151. data/lib/puppet/ssl.rb +1 -0
  152. data/lib/puppet/ssl/certificate.rb +2 -1
  153. data/lib/puppet/ssl/host.rb +4 -4
  154. data/lib/puppet/ssl/oids.rb +1 -0
  155. data/lib/puppet/ssl/ssl_context.rb +2 -2
  156. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  157. data/lib/puppet/ssl/state_machine.rb +81 -35
  158. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  159. data/lib/puppet/test/test_helper.rb +15 -11
  160. data/lib/puppet/transaction/report.rb +2 -2
  161. data/lib/puppet/transaction/resource_harness.rb +1 -1
  162. data/lib/puppet/trusted_external.rb +29 -1
  163. data/lib/puppet/type.rb +18 -6
  164. data/lib/puppet/type/file.rb +51 -13
  165. data/lib/puppet/type/file/checksum.rb +4 -4
  166. data/lib/puppet/type/file/source.rb +51 -60
  167. data/lib/puppet/type/group.rb +2 -2
  168. data/lib/puppet/type/package.rb +102 -10
  169. data/lib/puppet/type/service.rb +55 -8
  170. data/lib/puppet/type/user.rb +3 -28
  171. data/lib/puppet/util.rb +39 -15
  172. data/lib/puppet/util/at_fork.rb +1 -1
  173. data/lib/puppet/util/autoload.rb +4 -18
  174. data/lib/puppet/util/checksums.rb +19 -4
  175. data/lib/puppet/util/fileparsing.rb +2 -2
  176. data/lib/puppet/util/instance_loader.rb +14 -10
  177. data/lib/puppet/util/log/destinations.rb +2 -11
  178. data/lib/puppet/util/package/version/debian.rb +175 -0
  179. data/lib/puppet/util/package/version/gem.rb +15 -0
  180. data/lib/puppet/util/package/version/pip.rb +167 -0
  181. data/lib/puppet/util/package/version/range.rb +53 -0
  182. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  183. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  185. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  187. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  188. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  189. data/lib/puppet/util/package/version/rpm.rb +73 -0
  190. data/lib/puppet/util/pidlock.rb +36 -10
  191. data/lib/puppet/util/platform.rb +5 -0
  192. data/lib/puppet/util/plist.rb +6 -0
  193. data/lib/puppet/util/provider_features.rb +1 -1
  194. data/lib/puppet/util/reference.rb +1 -1
  195. data/lib/puppet/util/rpm_compare.rb +193 -0
  196. data/lib/puppet/util/storage.rb +0 -1
  197. data/lib/puppet/util/windows/adsi.rb +2 -2
  198. data/lib/puppet/util/windows/api_types.rb +45 -32
  199. data/lib/puppet/util/windows/eventlog.rb +1 -6
  200. data/lib/puppet/util/windows/principal.rb +8 -6
  201. data/lib/puppet/util/windows/process.rb +15 -14
  202. data/lib/puppet/util/windows/registry.rb +11 -11
  203. data/lib/puppet/util/windows/security.rb +1 -0
  204. data/lib/puppet/util/windows/service.rb +43 -26
  205. data/lib/puppet/util/windows/sid.rb +3 -3
  206. data/lib/puppet/util/windows/user.rb +23 -8
  207. data/lib/puppet/util/yaml.rb +1 -1
  208. data/lib/puppet/version.rb +1 -1
  209. data/locales/puppet.pot +707 -574
  210. data/man/man5/puppet.conf.5 +74 -14
  211. data/man/man8/puppet-agent.8 +7 -7
  212. data/man/man8/puppet-apply.8 +1 -1
  213. data/man/man8/puppet-catalog.8 +1 -1
  214. data/man/man8/puppet-config.8 +1 -1
  215. data/man/man8/puppet-describe.8 +1 -1
  216. data/man/man8/puppet-device.8 +2 -2
  217. data/man/man8/puppet-doc.8 +1 -1
  218. data/man/man8/puppet-epp.8 +1 -1
  219. data/man/man8/puppet-facts.8 +1 -1
  220. data/man/man8/puppet-filebucket.8 +17 -2
  221. data/man/man8/puppet-generate.8 +1 -1
  222. data/man/man8/puppet-help.8 +6 -3
  223. data/man/man8/puppet-key.8 +1 -1
  224. data/man/man8/puppet-lookup.8 +1 -1
  225. data/man/man8/puppet-man.8 +1 -1
  226. data/man/man8/puppet-module.8 +4 -1
  227. data/man/man8/puppet-node.8 +1 -1
  228. data/man/man8/puppet-parser.8 +1 -1
  229. data/man/man8/puppet-plugin.8 +1 -1
  230. data/man/man8/puppet-report.8 +1 -1
  231. data/man/man8/puppet-resource.8 +1 -1
  232. data/man/man8/puppet-script.8 +1 -1
  233. data/man/man8/puppet-ssl.8 +2 -2
  234. data/man/man8/puppet-status.8 +1 -1
  235. data/man/man8/puppet.8 +2 -2
  236. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  237. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  238. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  239. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  240. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  241. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  242. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  243. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  244. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  245. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -102
  246. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -106
  247. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  248. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -102
  249. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  250. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -102
  251. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -102
  252. data/spec/integration/application/agent_spec.rb +483 -0
  253. data/spec/integration/application/apply_spec.rb +132 -3
  254. data/spec/integration/application/filebucket_spec.rb +190 -0
  255. data/spec/integration/application/plugin_spec.rb +73 -0
  256. data/spec/integration/configurer_spec.rb +26 -7
  257. data/spec/integration/defaults_spec.rb +1 -2
  258. data/spec/integration/http/client_spec.rb +47 -37
  259. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  260. data/spec/integration/indirector/report/yaml.rb +83 -0
  261. data/spec/integration/module_tool/forge_spec.rb +2 -15
  262. data/spec/integration/network/http_pool_spec.rb +93 -20
  263. data/spec/integration/node/environment_spec.rb +15 -0
  264. data/spec/integration/parser/compiler_spec.rb +11 -0
  265. data/spec/integration/type/file_spec.rb +1 -1
  266. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  267. data/spec/integration/util/windows/registry_spec.rb +7 -7
  268. data/spec/integration/util/windows/user_spec.rb +40 -5
  269. data/spec/lib/puppet/test_ca.rb +2 -2
  270. data/spec/lib/puppet_spec/https.rb +16 -7
  271. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  272. data/spec/shared_contexts/https.rb +29 -0
  273. data/spec/unit/agent_spec.rb +80 -26
  274. data/spec/unit/application/agent_spec.rb +9 -5
  275. data/spec/unit/application/apply_spec.rb +2 -12
  276. data/spec/unit/application/describe_spec.rb +88 -50
  277. data/spec/unit/application/device_spec.rb +2 -2
  278. data/spec/unit/application/filebucket_spec.rb +22 -2
  279. data/spec/unit/application/resource_spec.rb +2 -2
  280. data/spec/unit/configurer/fact_handler_spec.rb +4 -8
  281. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  282. data/spec/unit/configurer_spec.rb +17 -18
  283. data/spec/unit/context/trusted_information_spec.rb +25 -2
  284. data/spec/unit/daemon_spec.rb +5 -64
  285. data/spec/unit/defaults_spec.rb +25 -2
  286. data/spec/unit/environments_spec.rb +65 -28
  287. data/spec/unit/face/facts_spec.rb +24 -20
  288. data/spec/unit/face/module/search_spec.rb +17 -0
  289. data/spec/unit/face/plugin_spec.rb +12 -10
  290. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  291. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  292. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  293. data/spec/unit/file_system_spec.rb +26 -2
  294. data/spec/unit/functions/lookup_spec.rb +13 -0
  295. data/spec/unit/http/client_spec.rb +327 -35
  296. data/spec/unit/http/external_client_spec.rb +201 -0
  297. data/spec/unit/http/resolver_spec.rb +34 -2
  298. data/spec/unit/http/response_spec.rb +75 -0
  299. data/spec/unit/http/service/ca_spec.rb +53 -11
  300. data/spec/unit/http/service/compiler_spec.rb +627 -0
  301. data/spec/unit/http/service/file_server_spec.rb +308 -0
  302. data/spec/unit/http/service/report_spec.rb +27 -9
  303. data/spec/unit/http/service_spec.rb +98 -5
  304. data/spec/unit/http/session_spec.rb +190 -7
  305. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  306. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  307. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  308. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  309. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  310. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  311. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  312. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  313. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  314. data/spec/unit/indirector/request_spec.rb +1 -1
  315. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  316. data/spec/unit/indirector/rest_spec.rb +13 -0
  317. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  318. data/spec/unit/interface_spec.rb +3 -3
  319. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  320. data/spec/unit/network/http/connection_spec.rb +559 -175
  321. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  322. data/spec/unit/network/http/pool_spec.rb +89 -11
  323. data/spec/unit/network/http_pool_spec.rb +63 -57
  324. data/spec/unit/network/http_spec.rb +1 -1
  325. data/spec/unit/node/environment_spec.rb +16 -0
  326. data/spec/unit/node/facts_spec.rb +2 -1
  327. data/spec/unit/node_spec.rb +7 -4
  328. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  329. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  330. data/spec/unit/parser/scope_spec.rb +1 -1
  331. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  332. data/spec/unit/pops/loaders/loaders_spec.rb +1 -1
  333. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  334. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  335. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  336. data/spec/unit/provider/aix_object_spec.rb +16 -2
  337. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  338. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  339. data/spec/unit/provider/package/aix_spec.rb +29 -0
  340. data/spec/unit/provider/package/apt_spec.rb +43 -2
  341. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  342. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  343. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  344. data/spec/unit/provider/package/gem_spec.rb +40 -0
  345. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  346. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  347. data/spec/unit/provider/package/pip_spec.rb +68 -19
  348. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  349. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  350. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  351. data/spec/unit/provider/package/portage_spec.rb +5 -0
  352. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  353. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  354. data/spec/unit/provider/package/yum_spec.rb +292 -0
  355. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  356. data/spec/unit/provider/service/init_spec.rb +1 -0
  357. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  358. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  359. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  360. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  361. data/spec/unit/provider/service/windows_spec.rb +22 -14
  362. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  363. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  364. data/spec/unit/provider/user/useradd_spec.rb +43 -24
  365. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  366. data/spec/unit/puppet_pal_2pec.rb +0 -26
  367. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  368. data/spec/unit/puppet_spec.rb +47 -0
  369. data/spec/unit/reports/http_spec.rb +70 -52
  370. data/spec/unit/resource_spec.rb +3 -3
  371. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  372. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  373. data/spec/unit/ssl/certificate_spec.rb +7 -0
  374. data/spec/unit/ssl/host_spec.rb +4 -2
  375. data/spec/unit/ssl/oids_spec.rb +1 -0
  376. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  377. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  378. data/spec/unit/test/test_helper_spec.rb +17 -0
  379. data/spec/unit/transaction/persistence_spec.rb +1 -10
  380. data/spec/unit/transaction/report_spec.rb +5 -1
  381. data/spec/unit/transaction_spec.rb +0 -2
  382. data/spec/unit/type/file/ensure_spec.rb +1 -2
  383. data/spec/unit/type/file/source_spec.rb +89 -38
  384. data/spec/unit/type/file_spec.rb +122 -96
  385. data/spec/unit/type/package_spec.rb +8 -0
  386. data/spec/unit/type/service_spec.rb +185 -8
  387. data/spec/unit/type/user_spec.rb +1 -2
  388. data/spec/unit/type_spec.rb +50 -0
  389. data/spec/unit/util/at_fork_spec.rb +3 -2
  390. data/spec/unit/util/autoload_spec.rb +2 -1
  391. data/spec/unit/util/checksums_spec.rb +16 -0
  392. data/spec/unit/util/log/destinations_spec.rb +1 -29
  393. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  394. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  395. data/spec/unit/util/package/version/range_spec.rb +175 -0
  396. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  397. data/spec/unit/util/pidlock_spec.rb +112 -42
  398. data/spec/unit/util/plist_spec.rb +20 -0
  399. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  400. data/spec/unit/util/storage_spec.rb +1 -8
  401. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  402. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  403. data/spec/unit/util/windows/service_spec.rb +4 -4
  404. data/spec/unit/util/windows/sid_spec.rb +2 -2
  405. data/spec/unit/util_spec.rb +3 -3
  406. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  407. data/tasks/generate_cert_fixtures.rake +15 -1
  408. data/tasks/manpages.rake +5 -35
  409. metadata +73 -12
  410. data/COMMITTERS.md +0 -244
  411. data/spec/integration/faces/plugin_spec.rb +0 -61
  412. data/spec/integration/test/test_helper_spec.rb +0 -31
@@ -254,6 +254,6 @@ class Puppet::Forge < SemanticPuppet::Dependency::Source
254
254
  def decode_uri(uri)
255
255
  return if uri.nil?
256
256
 
257
- URI.decode(uri.tr('+', ' '))
257
+ Puppet::Util.uri_unescape(uri.tr('+', ' '))
258
258
  end
259
259
  end
@@ -25,7 +25,7 @@ class Puppet::Forge
25
25
  unless cached_file.file?
26
26
  if uri.scheme == 'file'
27
27
  # CGI.unescape butchers Uris that are escaped properly
28
- FileUtils.cp(URI.unescape(uri.path), cached_file)
28
+ FileUtils.cp(Puppet::Util.uri_unescape(uri.path), cached_file)
29
29
  else
30
30
  # TODO: Handle HTTPS; probably should use repository.contact
31
31
  data = read_retrieve(uri)
@@ -37,18 +37,15 @@ class Puppet::Forge
37
37
  uri = URI(str)
38
38
 
39
39
  headers = { "User-Agent" => user_agent }
40
- user = nil
41
- password = nil
42
40
 
43
41
  if forge_authorization
42
+ uri.user = nil
43
+ uri.password = nil
44
44
  headers["Authorization"] = forge_authorization
45
- elsif @uri.user && @uri.password
46
- user = @uri.user
47
- password = @uri.password
48
45
  end
49
46
 
50
- http = Puppet.runtime['http']
51
- response = http.get(uri, headers: headers, user: user, password: password, ssl_context: @ssl_context)
47
+ http = Puppet.runtime[:http]
48
+ response = http.get(uri, headers: headers, options: {ssl_context: @ssl_context})
52
49
  io.write(response.body) if io.respond_to?(:write)
53
50
  response
54
51
  rescue Puppet::SSL::CertVerifyError => e
@@ -51,7 +51,7 @@
51
51
  #
52
52
  # Would notice the value of `$facts['processors']['count']` at the time when the `call` is made.
53
53
  #
54
- # * Deferred values supported since Puppet 5.6.0
54
+ # * Deferred values supported since Puppet 6.0
55
55
  #
56
56
  # @since 5.0.0
57
57
  #
@@ -39,7 +39,7 @@ Puppet::Functions.create_function(:eyaml_lookup_key) do
39
39
  context.cache(nil, raw_data)
40
40
  end
41
41
  context.not_found unless raw_data.include?(key)
42
- context.cache(key, decrypt_value(raw_data[key], context, options))
42
+ context.cache(key, decrypt_value(raw_data[key], context, options, key))
43
43
  end
44
44
 
45
45
  def load_data_hash(options, context)
@@ -62,22 +62,22 @@ Puppet::Functions.create_function(:eyaml_lookup_key) do
62
62
  end
63
63
  end
64
64
 
65
- def decrypt_value(value, context, options)
65
+ def decrypt_value(value, context, options, key)
66
66
  case value
67
67
  when String
68
- decrypt(value, context, options)
68
+ decrypt(value, context, options, key)
69
69
  when Hash
70
70
  result = {}
71
- value.each_pair { |k, v| result[context.interpolate(k)] = decrypt_value(v, context, options) }
71
+ value.each_pair { |k, v| result[context.interpolate(k)] = decrypt_value(v, context, options, key) }
72
72
  result
73
73
  when Array
74
- value.map { |v| decrypt_value(v, context, options) }
74
+ value.map { |v| decrypt_value(v, context, options, key) }
75
75
  else
76
76
  value
77
77
  end
78
78
  end
79
79
 
80
- def decrypt(data, context, options)
80
+ def decrypt(data, context, options, key)
81
81
  if encrypted?(data)
82
82
  # Options must be set prior to each call to #parse since they end up as static variables in
83
83
  # the Options class. They cannot be set once before #decrypt_value is called, since each #decrypt
@@ -85,8 +85,13 @@ Puppet::Functions.create_function(:eyaml_lookup_key) do
85
85
  # config.
86
86
  #
87
87
  Hiera::Backend::Eyaml::Options.set(options)
88
- tokens = Hiera::Backend::Eyaml::Parser::ParserFactory.hiera_backend_parser.parse(data)
89
- data = tokens.map(&:to_plain_text).join.chomp
88
+ begin
89
+ tokens = Hiera::Backend::Eyaml::Parser::ParserFactory.hiera_backend_parser.parse(data)
90
+ data = tokens.map(&:to_plain_text).join.chomp
91
+ rescue StandardError => ex
92
+ raise Puppet::DataBinding::LookupError,
93
+ _("hiera-eyaml backend error decrypting %{data} when looking up %{key} in %{path}. Error was %{message}") % { data: data, key: key, path: options['path'], message: ex.message }
94
+ end
90
95
  end
91
96
  context.interpolate(data)
92
97
  end
@@ -38,6 +38,7 @@
38
38
  # $data = { "orange" => 0, "blueberry" => 1, "raspberry" => 2 }
39
39
  # $filtered_data = $data.filter |$items| { $items[0] =~ /berry$/ }
40
40
  # # $filtered_data = {blueberry => 1, raspberry => 2}
41
+ # ```
41
42
  #
42
43
  # When the first argument is an array and the lambda has two parameters, Puppet passes the
43
44
  # array's indexes (enumerated from 0) in the first parameter and its values in the second
@@ -39,11 +39,9 @@
39
39
  # values to the lambda.
40
40
  #
41
41
  # Puppet calls the lambda for each of the data structure's remaining values. For each
42
- # call, it passes the result of the previous call as the first parameter ($memo in the
42
+ # call, it passes the result of the previous call as the first parameter (`$memo` in the
43
43
  # above examples) and the next value from the data structure as the second parameter
44
- # ($value).
45
- #
46
- # If the structure has one value, Puppet returns the value and does not call the lambda.
44
+ # (`$value`).
47
45
  #
48
46
  # @example Using the `reduce` function
49
47
  #
@@ -11,13 +11,17 @@ module Puppet
11
11
  end
12
12
  end
13
13
 
14
+ # @api private
14
15
  module HTTP
15
16
  ACCEPT_ENCODING = "gzip;q=1.0,deflate;q=0.6,identity;q=0.3".freeze
17
+ HEADER_PUPPET_VERSION = "X-Puppet-Version".freeze
16
18
 
17
19
  require 'puppet/http/errors'
18
20
  require 'puppet/http/response'
19
21
  require 'puppet/http/service'
20
22
  require 'puppet/http/service/ca'
23
+ require 'puppet/http/service/compiler'
24
+ require 'puppet/http/service/file_server'
21
25
  require 'puppet/http/service/report'
22
26
  require 'puppet/http/session'
23
27
  require 'puppet/http/resolver'
@@ -27,5 +31,6 @@ module Puppet
27
31
  require 'puppet/http/client'
28
32
  require 'puppet/http/redirector'
29
33
  require 'puppet/http/retry_after_handler'
34
+ require 'puppet/http/external_client'
30
35
  end
31
36
  end
@@ -1,27 +1,85 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # The client contains a pool of persistent HTTP connections and creates HTTP
5
+ # sessions.
6
+ #
1
7
  class Puppet::HTTP::Client
2
- def initialize(pool: Puppet::Network::HTTP::Pool.new, ssl_context: nil, redirect_limit: 10, retry_limit: 100)
8
+
9
+ # @api private
10
+ # @return [Puppet::Network::HTTP::Pool] the pool instance associated with
11
+ # this client
12
+ attr_reader :pool
13
+
14
+ #
15
+ # @api private
16
+ #
17
+ # Create a new http client instance. The client contains a pool of persistent
18
+ # HTTP connections and creates HTTP sessions.
19
+ #
20
+ # @param [Puppet::Network::HTTP::Pool] pool pool of persistent Net::HTTP
21
+ # connections
22
+ # @param [Puppet::SSL::SSLContext] ssl_context ssl context to be used for
23
+ # connections
24
+ # @param [Puppet::SSL::SSLContext] system_ssl_context the system ssl context
25
+ # used if :include_system_store is set to true
26
+ # @param [Integer] redirect_limit default number of HTTP redirections to allow
27
+ # in a given request. Can also be specified per-request.
28
+ # @param [Integer] retry_limit number of HTTP reties allowed in a given
29
+ # request
30
+ #
31
+ def initialize(pool: Puppet::Network::HTTP::Pool.new(Puppet[:http_keepalive_timeout]), ssl_context: nil, system_ssl_context: nil, redirect_limit: 10, retry_limit: 100)
3
32
  @pool = pool
4
33
  @default_headers = {
5
34
  'X-Puppet-Version' => Puppet.version,
6
35
  'User-Agent' => Puppet[:http_user_agent],
7
36
  }.freeze
8
37
  @default_ssl_context = ssl_context
9
- @redirector = Puppet::HTTP::Redirector.new(redirect_limit)
38
+ @default_system_ssl_context = system_ssl_context
39
+ @default_redirect_limit = redirect_limit
10
40
  @retry_after_handler = Puppet::HTTP::RetryAfterHandler.new(retry_limit, Puppet[:runinterval])
11
- @resolvers = build_resolvers
12
41
  end
13
42
 
43
+ #
44
+ # @api private
45
+ #
46
+ # Create a new HTTP session. A session is the object through which services
47
+ # may be connected to and accessed.
48
+ #
49
+ # @return [Puppet::HTTP::Session] the newly created HTTP session
50
+ #
14
51
  def create_session
15
- Puppet::HTTP::Session.new(self, @resolvers)
52
+ Puppet::HTTP::Session.new(self, build_resolvers)
16
53
  end
17
54
 
18
- def connect(uri, ssl_context: nil, &block)
55
+ #
56
+ # @api private
57
+ #
58
+ # Open a connection to the given URI
59
+ #
60
+ # @param [URI] uri the connection destination
61
+ # @param [Hash] options
62
+ # @option options [Puppet::SSL::SSLContext] :ssl_context (nil) ssl context to
63
+ # be used for connections
64
+ # @option options [Boolean] :include_system_store (false) if we should include
65
+ # the system store for connection
66
+ #
67
+ # @yield [Net::HTTP] If a block is given, yields an active http connection
68
+ # from the pool
69
+ #
70
+ def connect(uri, options: {}, &block)
19
71
  start = Time.now
20
- ctx = ssl_context ? ssl_context : default_ssl_context
21
- site = Puppet::Network::HTTP::Site.from_uri(uri)
22
- verifier = Puppet::SSL::Verifier.new(site.host, ctx)
72
+ verifier = nil
23
73
  connected = false
24
74
 
75
+ site = Puppet::Network::HTTP::Site.from_uri(uri)
76
+ if site.use_ssl?
77
+ ssl_context = options.fetch(:ssl_context, nil)
78
+ include_system_store = options.fetch(:include_system_store, false)
79
+ ctx = resolve_ssl_context(ssl_context, include_system_store)
80
+ verifier = Puppet::SSL::Verifier.new(site.host, ctx)
81
+ end
82
+
25
83
  @pool.with_connection(site, verifier) do |http|
26
84
  connected = true
27
85
  if block_given?
@@ -43,117 +101,228 @@ class Puppet::HTTP::Client
43
101
  {uri: uri, elapsed: elapsed(start), message: e.message}, e, connected)
44
102
  end
45
103
 
46
- def get(url, headers: {}, params: {}, ssl_context: nil, user: nil, password: nil, &block)
47
- query = encode_params(params)
48
- unless query.empty?
49
- url = url.dup
50
- url.query = query
51
- end
104
+ #
105
+ # @api private
106
+ #
107
+ # Submits a GET HTTP request to the given url
108
+ #
109
+ # @param [URI] url the location to submit the http request
110
+ # @param [Hash] headers merged with the default headers defined by the client
111
+ # @param [Hash] params encoded and set as the url query
112
+ # @param [Hash] options passed through to the request execution
113
+ # @option options [Puppet::SSL::SSLContext] :ssl_context (nil) ssl context to
114
+ # be used for connections
115
+ # @option options [Boolean] :include_system_store (false) if we should include
116
+ # the system store for connection
117
+ # @param options [Integer] :redirect_limit number of HTTP redirections to allow
118
+ # for this request.
119
+ #
120
+ # @yield [Puppet::HTTP::Response] if a block is given yields the response
121
+ #
122
+ # @return [String] if a block is not given, returns the response body
123
+ #
124
+ def get(url, headers: {}, params: {}, options: {}, &block)
125
+ url = encode_query(url, params)
52
126
 
53
127
  request = Net::HTTP::Get.new(url, @default_headers.merge(headers))
54
128
 
55
- execute_streaming(request, ssl_context: ssl_context, user: user, password: password) do |response|
129
+ execute_streaming(request, options: options) do |response|
56
130
  if block_given?
57
131
  yield response
58
132
  else
59
- response.read_body
133
+ response.body
60
134
  end
61
135
  end
62
136
  end
63
137
 
64
- def head(url, headers: {}, params: {}, ssl_context: nil, user: nil, password: nil)
65
- query = encode_params(params)
66
- unless query.empty?
67
- url = url.dup
68
- url.query = query
69
- end
138
+ #
139
+ # @api private
140
+ #
141
+ # Submits a HEAD HTTP request to the given url
142
+ #
143
+ # @param [URI] url the location to submit the http request
144
+ # @param [Hash] headers merged with the default headers defined by the client
145
+ # @param [Hash] params encoded and set as the url query
146
+ # @param [Hash] options passed through to the request execution
147
+ # @option options [Puppet::SSL::SSLContext] :ssl_context (nil) ssl context to
148
+ # be used for connections
149
+ # @option options [Boolean] :include_system_store (false) if we should include
150
+ # the system store for connection
151
+ # @param options [Integer] :redirect_limit number of HTTP redirections to allow
152
+ # for this request.
153
+ #
154
+ # @return [String] the body of the request response
155
+ #
156
+ def head(url, headers: {}, params: {}, options: {})
157
+ url = encode_query(url, params)
70
158
 
71
159
  request = Net::HTTP::Head.new(url, @default_headers.merge(headers))
72
160
 
73
- execute_streaming(request, ssl_context: ssl_context, user: user, password: password) do |response|
74
- response.read_body
161
+ execute_streaming(request, options: options) do |response|
162
+ response.body
75
163
  end
76
164
  end
77
165
 
78
- def put(url, headers: {}, params: {}, content_type:, body:, ssl_context: nil, user: nil, password: nil)
79
- query = encode_params(params)
80
- unless query.empty?
81
- url = url.dup
82
- url.query = query
83
- end
166
+ #
167
+ # @api private
168
+ #
169
+ # Submits a PUT HTTP request to the given url
170
+ #
171
+ # @param [URI] url the location to submit the http request
172
+ # @param [String] body the body of the PUT request
173
+ # @param [Hash] headers merged with the default headers defined by the client
174
+ # @param [Hash] params encoded and set as the url query
175
+ # @param [Hash] options passed through to the request execution
176
+ # @option options [String] :content_type the type of the body content
177
+ # @option options [Puppet::SSL::SSLContext] :ssl_context (nil) ssl context to
178
+ # be used for connections
179
+ # @option options [Boolean] :include_system_store (false) if we should include
180
+ # the system store for connection
181
+ # @param options [Integer] :redirect_limit number of HTTP redirections to allow
182
+ # for this request.
183
+ #
184
+ # @return [String] the body of the request response
185
+ #
186
+ def put(url, body, headers: {}, params: {}, options: {})
187
+ raise ArgumentError, "'put' requires a string 'body' argument" unless body.is_a?(String)
188
+ url = encode_query(url, params)
84
189
 
85
190
  request = Net::HTTP::Put.new(url, @default_headers.merge(headers))
86
191
  request.body = body
87
- request['Content-Length'] = body.bytesize
88
- request['Content-Type'] = content_type
192
+ request.content_length = body.bytesize
89
193
 
90
- execute_streaming(request, ssl_context: ssl_context, user: user, password: password) do |response|
91
- response.read_body
194
+ raise ArgumentError, "'put' requires a 'content-type' header" unless request['Content-Type']
195
+
196
+ execute_streaming(request, options: options) do |response|
197
+ response.body
92
198
  end
93
199
  end
94
200
 
95
- def post(url, headers: {}, params: {}, content_type:, body:, ssl_context: nil, user: nil, password: nil, &block)
96
- query = encode_params(params)
97
- unless query.empty?
98
- url = url.dup
99
- url.query = query
100
- end
201
+ #
202
+ # @api private
203
+ #
204
+ # Submits a POST HTTP request to the given url
205
+ #
206
+ # @param [URI] url the location to submit the http request
207
+ # @param [String] body the body of the POST request
208
+ # @param [Hash] headers merged with the default headers defined by the client
209
+ # @param [Hash] params encoded and set as the url query
210
+ # @param [Hash] options passed through to the request execution
211
+ # @option options [String] :content_type the type of the body content
212
+ # @option options [Puppet::SSL::SSLContext] :ssl_context (nil) ssl context to
213
+ # be used for connections
214
+ # @option options [Boolean] :include_system_store (false) if we should include
215
+ # the system store for connection
216
+ # @param options [Integer] :redirect_limit number of HTTP redirections to allow
217
+ # for this request.
218
+ #
219
+ # @return [String] the body of the request response
220
+ #
221
+ def post(url, body, headers: {}, params: {}, options: {}, &block)
222
+ raise ArgumentError, "'post' requires a string 'body' argument" unless body.is_a?(String)
223
+ url = encode_query(url, params)
101
224
 
102
225
  request = Net::HTTP::Post.new(url, @default_headers.merge(headers))
103
226
  request.body = body
104
- request['Content-Length'] = body.bytesize
105
- request['Content-Type'] = content_type
227
+ request.content_length = body.bytesize
106
228
 
107
- execute_streaming(request, ssl_context: ssl_context, user: user, password: password) do |response|
229
+ raise ArgumentError, "'post' requires a 'content-type' header" unless request['Content-Type']
230
+
231
+ execute_streaming(request, options: options) do |response|
108
232
  if block_given?
109
233
  yield response
110
234
  else
111
- response.read_body
235
+ response.body
112
236
  end
113
237
  end
114
238
  end
115
239
 
116
- def delete(url, headers: {}, params: {}, ssl_context: nil, user: nil, password: nil)
117
- query = encode_params(params)
118
- unless query.empty?
119
- url = url.dup
120
- url.query = query
121
- end
240
+ #
241
+ # @api private
242
+ #
243
+ # Submits a DELETE HTTP request to the given url
244
+ #
245
+ # @param [URI] url the location to submit the http request
246
+ # @param [Hash] headers merged with the default headers defined by the client
247
+ # @param [Hash] params encoded and set as the url query
248
+ # @param [Hash] options options hash passed through to the request execution
249
+ # @option options [Puppet::SSL::SSLContext] :ssl_context (nil) ssl context to
250
+ # be used for connections
251
+ # @option options [Boolean] :include_system_store (false) if we should include
252
+ # the system store for connection
253
+ # @param options [Integer] :redirect_limit number of HTTP redirections to allow
254
+ # for this request.
255
+ #
256
+ # @return [String] the body of the request response
257
+ #
258
+ def delete(url, headers: {}, params: {}, options: {})
259
+ url = encode_query(url, params)
122
260
 
123
261
  request = Net::HTTP::Delete.new(url, @default_headers.merge(headers))
124
262
 
125
- execute_streaming(request, ssl_context: ssl_context, user: user, password: password) do |response|
126
- response.read_body
263
+ execute_streaming(request, options: options) do |response|
264
+ response.body
127
265
  end
128
266
  end
129
267
 
268
+ #
269
+ # @api private
270
+ #
271
+ # Close persistent connections in the pool
272
+ #
130
273
  def close
131
274
  @pool.close
132
275
  end
133
276
 
277
+ protected
278
+
279
+ def encode_query(url, params)
280
+ return url if params.empty?
281
+
282
+ url = url.dup
283
+ url.query = encode_params(params)
284
+ url
285
+ end
286
+
134
287
  private
135
288
 
136
- def execute_streaming(request, ssl_context:, user: nil, password: nil, &block)
289
+ def execute_streaming(request, options: {}, &block)
290
+ redirector = Puppet::HTTP::Redirector.new(options.fetch(:redirect_limit, @default_redirect_limit))
291
+
292
+ basic_auth = options.fetch(:basic_auth, nil)
293
+ unless basic_auth
294
+ if request.uri.user && request.uri.password
295
+ basic_auth = { user: request.uri.user, password: request.uri.password }
296
+ end
297
+ end
298
+
137
299
  redirects = 0
138
300
  retries = 0
301
+ response = nil
302
+ done = false
139
303
 
140
- loop do
141
- connect(request.uri, ssl_context: ssl_context) do |http|
142
- apply_auth(request, user, password)
304
+ while !done do
305
+ connect(request.uri, options: options) do |http|
306
+ apply_auth(request, basic_auth)
143
307
 
308
+ # don't call return within the `request` block
144
309
  http.request(request) do |nethttp|
145
- response = Puppet::HTTP::Response.new(nethttp)
310
+ response = Puppet::HTTP::Response.new(nethttp, request.uri)
146
311
  begin
147
312
  Puppet.debug("HTTP #{request.method.upcase} #{request.uri} returned #{response.code} #{response.reason}")
148
313
 
149
- if @redirector.redirect?(request, response)
150
- request = @redirector.redirect_to(request, response, redirects)
314
+ if redirector.redirect?(request, response)
315
+ request = redirector.redirect_to(request, response, redirects)
151
316
  redirects += 1
152
317
  next
153
318
  elsif @retry_after_handler.retry_after?(request, response)
154
319
  interval = @retry_after_handler.retry_after_interval(request, response, retries)
155
320
  retries += 1
156
321
  if interval
322
+ if http.started?
323
+ Puppet.debug("Closing connection for #{Puppet::Network::HTTP::Site.from_uri(request.uri)}")
324
+ http.finish
325
+ end
157
326
  Puppet.warning(_("Sleeping for %{interval} seconds before retrying the request") % { interval: interval })
158
327
  ::Kernel.sleep(interval)
159
328
  next
@@ -165,13 +334,45 @@ class Puppet::HTTP::Client
165
334
  response.drain
166
335
  end
167
336
 
168
- return response
337
+ done = true
169
338
  end
170
339
  end
171
340
  end
341
+
342
+ response
343
+ end
344
+
345
+ def expand_into_parameters(data)
346
+ data.inject([]) do |params, key_value|
347
+ key, value = key_value
348
+
349
+ expanded_value = case value
350
+ when Array
351
+ value.collect { |val| [key, val] }
352
+ else
353
+ [key_value]
354
+ end
355
+
356
+ params.concat(expand_primitive_types_into_parameters(expanded_value))
357
+ end
358
+ end
359
+
360
+ def expand_primitive_types_into_parameters(data)
361
+ data.inject([]) do |params, key_value|
362
+ key, value = key_value
363
+ case value
364
+ when nil
365
+ params
366
+ when true, false, String, Symbol, Integer, Float
367
+ params << [key, value]
368
+ else
369
+ raise Puppet::HTTP::SerializationError, _("HTTP REST queries cannot handle values of type '%{klass}'") % { klass: value.class }
370
+ end
371
+ end
172
372
  end
173
373
 
174
374
  def encode_params(params)
375
+ params = expand_into_parameters(params)
175
376
  params.map do |key, value|
176
377
  "#{key}=#{Puppet::Util.uri_query_encode(value.to_s)}"
177
378
  end.join('&')
@@ -189,13 +390,30 @@ class Puppet::HTTP::Client
189
390
  end
190
391
  end
191
392
 
192
- def default_ssl_context
193
- @default_ssl_context || Puppet.lookup(:ssl_context)
393
+ def resolve_ssl_context(ssl_context, include_system_store)
394
+ if ssl_context
395
+ raise Puppet::HTTP::HTTPError, "The ssl_context and include_system_store parameters are mutually exclusive" if include_system_store
396
+ ssl_context
397
+ elsif include_system_store
398
+ system_ssl_context
399
+ else
400
+ @default_ssl_context || Puppet.lookup(:ssl_context)
401
+ end
402
+ end
403
+
404
+ def system_ssl_context
405
+ return @default_system_ssl_context if @default_system_ssl_context
406
+
407
+ cert_provider = Puppet::X509::CertProvider.new
408
+ cacerts = cert_provider.load_cacerts || []
409
+
410
+ ssl = Puppet::SSL::SSLProvider.new
411
+ @default_system_ssl_context = ssl.create_system_context(cacerts: cacerts)
194
412
  end
195
413
 
196
- def apply_auth(request, user, password)
197
- if user && password
198
- request.basic_auth(user, password)
414
+ def apply_auth(request, basic_auth)
415
+ if basic_auth
416
+ request.basic_auth(basic_auth[:user], basic_auth[:password])
199
417
  end
200
418
  end
201
419
 
@@ -208,14 +426,16 @@ class Puppet::HTTP::Client
208
426
 
209
427
  server_list_setting = Puppet.settings.setting(:server_list)
210
428
  if server_list_setting.value && !server_list_setting.value.empty?
211
- services = [:puppet]
212
-
213
- # If we have not explicitly set :ca_server either on the command line or
214
- # in puppet.conf, we want to be able to try the servers defined by
215
- # :server_list when resolving the :ca service. Otherwise, :server_list
216
- # should only be used with the :puppet service.
217
- if !Puppet.settings.set_by_config?(:ca_server)
218
- services << :ca
429
+ # use server list to resolve all services
430
+ services = Puppet::HTTP::Service::SERVICE_NAMES.dup
431
+
432
+ # except if it's been explicitly set
433
+ if Puppet.settings.set_by_config?(:ca_server)
434
+ services.delete(:ca)
435
+ end
436
+
437
+ if Puppet.settings.set_by_config?(:report_server)
438
+ services.delete(:report)
219
439
  end
220
440
 
221
441
  resolvers << Puppet::HTTP::Resolver::ServerList.new(self, server_list_setting: server_list_setting, default_port: Puppet[:masterport], services: services)