puppet 6.11.1-universal-darwin → 6.16.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 (395) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +3 -8
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +1 -0
  5. data/Gemfile.lock +39 -36
  6. data/README.md +17 -24
  7. data/ext/build_defaults.yaml +1 -0
  8. data/ext/project_data.yaml +1 -1
  9. data/ext/windows/service/daemon.rb +25 -20
  10. data/lib/puppet.rb +52 -13
  11. data/lib/puppet/agent.rb +20 -14
  12. data/lib/puppet/application/agent.rb +12 -14
  13. data/lib/puppet/application/describe.rb +7 -5
  14. data/lib/puppet/application/device.rb +2 -2
  15. data/lib/puppet/application/filebucket.rb +19 -15
  16. data/lib/puppet/application/plugin.rb +1 -0
  17. data/lib/puppet/application/resource.rb +1 -1
  18. data/lib/puppet/application/ssl.rb +4 -4
  19. data/lib/puppet/concurrent.rb +2 -0
  20. data/lib/puppet/concurrent/lock.rb +16 -0
  21. data/lib/puppet/concurrent/synchronized.rb +15 -0
  22. data/lib/puppet/concurrent/thread_local_singleton.rb +14 -0
  23. data/lib/puppet/configurer.rb +85 -83
  24. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  25. data/lib/puppet/context/trusted_information.rb +14 -8
  26. data/lib/puppet/daemon.rb +13 -27
  27. data/lib/puppet/defaults.rb +158 -40
  28. data/lib/puppet/environments.rb +30 -20
  29. data/lib/puppet/error.rb +9 -1
  30. data/lib/puppet/face/facts.rb +8 -5
  31. data/lib/puppet/face/help.rb +29 -3
  32. data/lib/puppet/face/module/search.rb +5 -0
  33. data/lib/puppet/face/plugin.rb +2 -2
  34. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  35. data/lib/puppet/file_system/file_impl.rb +13 -9
  36. data/lib/puppet/file_system/memory_file.rb +6 -0
  37. data/lib/puppet/file_system/memory_impl.rb +13 -0
  38. data/lib/puppet/file_system/uniquefile.rb +4 -0
  39. data/lib/puppet/file_system/windows.rb +7 -10
  40. data/lib/puppet/forge.rb +3 -3
  41. data/lib/puppet/forge/errors.rb +2 -2
  42. data/lib/puppet/forge/repository.rb +31 -86
  43. data/lib/puppet/functions/call.rb +1 -1
  44. data/lib/puppet/functions/camelcase.rb +2 -2
  45. data/lib/puppet/functions/epp.rb +4 -4
  46. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  47. data/lib/puppet/functions/filter.rb +1 -0
  48. data/lib/puppet/functions/find_file.rb +9 -9
  49. data/lib/puppet/functions/find_template.rb +63 -0
  50. data/lib/puppet/functions/inline_epp.rb +5 -5
  51. data/lib/puppet/functions/reduce.rb +2 -4
  52. data/lib/puppet/http.rb +7 -0
  53. data/lib/puppet/http/client.rb +341 -54
  54. data/lib/puppet/http/errors.rb +2 -0
  55. data/lib/puppet/http/external_client.rb +90 -0
  56. data/lib/puppet/http/redirector.rb +34 -0
  57. data/lib/puppet/http/resolver.rb +57 -1
  58. data/lib/puppet/http/resolver/server_list.rb +98 -0
  59. data/lib/puppet/http/resolver/settings.rb +23 -2
  60. data/lib/puppet/http/resolver/srv.rb +36 -4
  61. data/lib/puppet/http/response.rb +68 -1
  62. data/lib/puppet/http/retry_after_handler.rb +39 -0
  63. data/lib/puppet/http/service.rb +179 -3
  64. data/lib/puppet/http/service/ca.rb +84 -21
  65. data/lib/puppet/http/service/compiler.rb +319 -0
  66. data/lib/puppet/http/service/file_server.rb +206 -0
  67. data/lib/puppet/http/service/report.rb +66 -0
  68. data/lib/puppet/http/session.rb +106 -31
  69. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  70. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  71. data/lib/puppet/indirector/facts/rest.rb +42 -0
  72. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  73. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  74. data/lib/puppet/indirector/file_content/http.rb +5 -0
  75. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  76. data/lib/puppet/indirector/file_metadata/http.rb +4 -4
  77. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  78. data/lib/puppet/indirector/json.rb +1 -1
  79. data/lib/puppet/indirector/msgpack.rb +1 -1
  80. data/lib/puppet/indirector/node/rest.rb +24 -0
  81. data/lib/puppet/indirector/report/rest.rb +19 -0
  82. data/lib/puppet/indirector/report/yaml.rb +23 -0
  83. data/lib/puppet/indirector/rest.rb +12 -0
  84. data/lib/puppet/indirector/status/rest.rb +18 -0
  85. data/lib/puppet/loaders.rb +6 -0
  86. data/lib/puppet/metatype/manager.rb +80 -80
  87. data/lib/puppet/network/http/base_pool.rb +19 -1
  88. data/lib/puppet/network/http/compression.rb +7 -0
  89. data/lib/puppet/network/http/connection.rb +6 -0
  90. data/lib/puppet/network/http/connection_adapter.rb +182 -0
  91. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  92. data/lib/puppet/network/http/pool.rb +13 -6
  93. data/lib/puppet/network/http_pool.rb +2 -1
  94. data/lib/puppet/node/environment.rb +24 -8
  95. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  96. data/lib/puppet/pal/pal_impl.rb +9 -29
  97. data/lib/puppet/parser/ast/pops_bridge.rb +6 -11
  98. data/lib/puppet/parser/compiler.rb +42 -32
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/epp.rb +3 -3
  101. data/lib/puppet/parser/functions/filter.rb +1 -0
  102. data/lib/puppet/parser/functions/inline_epp.rb +5 -5
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  105. data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
  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/lookup/invocation.rb +10 -3
  109. data/lib/puppet/pops/model/pn_transformer.rb +5 -9
  110. data/lib/puppet/pops/parser/evaluating_parser.rb +8 -11
  111. data/lib/puppet/pops/serialization/json_path.rb +3 -3
  112. data/lib/puppet/pops/time/timespan.rb +3 -5
  113. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  114. data/lib/puppet/pops/types/string_converter.rb +6 -9
  115. data/lib/puppet/pops/types/type_calculator.rb +30 -10
  116. data/lib/puppet/pops/types/type_formatter.rb +9 -11
  117. data/lib/puppet/pops/types/type_parser.rb +3 -3
  118. data/lib/puppet/pops/validation/checker4_0.rb +1 -1
  119. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  120. data/lib/puppet/provider/aix_object.rb +4 -2
  121. data/lib/puppet/provider/group/aix.rb +1 -0
  122. data/lib/puppet/provider/group/groupadd.rb +57 -24
  123. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  124. data/lib/puppet/provider/package/aix.rb +17 -2
  125. data/lib/puppet/provider/package/apt.rb +78 -4
  126. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  127. data/lib/puppet/provider/package/dpkg.rb +14 -7
  128. data/lib/puppet/provider/package/fink.rb +20 -3
  129. data/lib/puppet/provider/package/gem.rb +41 -7
  130. data/lib/puppet/provider/package/openbsd.rb +13 -1
  131. data/lib/puppet/provider/package/pacman.rb +2 -5
  132. data/lib/puppet/provider/package/pip.rb +143 -48
  133. data/lib/puppet/provider/package/pip3.rb +0 -2
  134. data/lib/puppet/provider/package/pkg.rb +18 -5
  135. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  136. data/lib/puppet/provider/package/pkgng.rb +16 -4
  137. data/lib/puppet/provider/package/portage.rb +5 -5
  138. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  139. data/lib/puppet/provider/package/rpm.rb +6 -213
  140. data/lib/puppet/provider/package/yum.rb +108 -24
  141. data/lib/puppet/provider/package/zypper.rb +59 -1
  142. data/lib/puppet/provider/package_targetable.rb +5 -4
  143. data/lib/puppet/provider/service/systemd.rb +23 -5
  144. data/lib/puppet/provider/user/aix.rb +1 -0
  145. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  146. data/lib/puppet/provider/user/hpux.rb +1 -1
  147. data/lib/puppet/provider/user/useradd.rb +11 -8
  148. data/lib/puppet/reports/http.rb +13 -9
  149. data/lib/puppet/reports/store.rb +1 -1
  150. data/lib/puppet/resource/type_collection.rb +20 -16
  151. data/lib/puppet/runtime.rb +32 -1
  152. data/lib/puppet/settings.rb +4 -0
  153. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  154. data/lib/puppet/ssl.rb +1 -0
  155. data/lib/puppet/ssl/certificate.rb +2 -1
  156. data/lib/puppet/ssl/host.rb +4 -4
  157. data/lib/puppet/ssl/oids.rb +1 -0
  158. data/lib/puppet/ssl/ssl_provider.rb +20 -0
  159. data/lib/puppet/ssl/state_machine.rb +81 -35
  160. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  161. data/lib/puppet/test/test_helper.rb +7 -1
  162. data/lib/puppet/transaction.rb +33 -11
  163. data/lib/puppet/transaction/report.rb +2 -2
  164. data/lib/puppet/transaction/resource_harness.rb +1 -1
  165. data/lib/puppet/type.rb +7 -2
  166. data/lib/puppet/type/file.rb +13 -0
  167. data/lib/puppet/type/file/data_sync.rb +5 -1
  168. data/lib/puppet/type/file/source.rb +49 -58
  169. data/lib/puppet/type/group.rb +5 -4
  170. data/lib/puppet/type/package.rb +102 -10
  171. data/lib/puppet/type/service.rb +6 -8
  172. data/lib/puppet/type/user.rb +6 -30
  173. data/lib/puppet/util.rb +34 -11
  174. data/lib/puppet/util/at_fork.rb +1 -1
  175. data/lib/puppet/util/autoload.rb +4 -18
  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/logging.rb +30 -18
  179. data/lib/puppet/util/package/version/debian.rb +175 -0
  180. data/lib/puppet/util/package/version/gem.rb +15 -0
  181. data/lib/puppet/util/package/version/pip.rb +167 -0
  182. data/lib/puppet/util/package/version/range.rb +53 -0
  183. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  185. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  187. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  188. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  189. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  190. data/lib/puppet/util/package/version/rpm.rb +73 -0
  191. data/lib/puppet/util/pidlock.rb +36 -10
  192. data/lib/puppet/util/platform.rb +5 -0
  193. data/lib/puppet/util/plist.rb +6 -0
  194. data/lib/puppet/util/rpm_compare.rb +193 -0
  195. data/lib/puppet/util/storage.rb +0 -1
  196. data/lib/puppet/util/windows/adsi.rb +50 -20
  197. data/lib/puppet/util/windows/process.rb +15 -14
  198. data/lib/puppet/util/windows/security.rb +1 -0
  199. data/lib/puppet/util/windows/sid.rb +3 -3
  200. data/lib/puppet/util/yaml.rb +1 -1
  201. data/lib/puppet/version.rb +1 -1
  202. data/lib/puppet/x509/cert_provider.rb +9 -5
  203. data/locales/puppet.pot +640 -521
  204. data/man/man5/puppet.conf.5 +88 -9
  205. data/man/man8/puppet-agent.8 +6 -6
  206. data/man/man8/puppet-apply.8 +1 -1
  207. data/man/man8/puppet-catalog.8 +1 -1
  208. data/man/man8/puppet-config.8 +1 -1
  209. data/man/man8/puppet-describe.8 +1 -1
  210. data/man/man8/puppet-device.8 +2 -2
  211. data/man/man8/puppet-doc.8 +1 -1
  212. data/man/man8/puppet-epp.8 +1 -1
  213. data/man/man8/puppet-facts.8 +1 -1
  214. data/man/man8/puppet-filebucket.8 +17 -2
  215. data/man/man8/puppet-generate.8 +1 -1
  216. data/man/man8/puppet-help.8 +6 -3
  217. data/man/man8/puppet-key.8 +1 -1
  218. data/man/man8/puppet-lookup.8 +1 -1
  219. data/man/man8/puppet-man.8 +1 -1
  220. data/man/man8/puppet-module.8 +4 -1
  221. data/man/man8/puppet-node.8 +1 -1
  222. data/man/man8/puppet-parser.8 +1 -1
  223. data/man/man8/puppet-plugin.8 +1 -1
  224. data/man/man8/puppet-report.8 +1 -1
  225. data/man/man8/puppet-resource.8 +1 -1
  226. data/man/man8/puppet-script.8 +1 -1
  227. data/man/man8/puppet-ssl.8 +2 -2
  228. data/man/man8/puppet-status.8 +1 -1
  229. data/man/man8/puppet.8 +2 -2
  230. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  231. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  232. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  233. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  234. data/spec/fixtures/unit/forge/bacula.json +76 -0
  235. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  236. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  237. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  238. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  239. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  240. 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
  241. 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
  242. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  243. 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
  244. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  245. 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
  246. 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
  247. data/spec/integration/application/agent_spec.rb +394 -0
  248. data/spec/integration/application/apply_spec.rb +132 -3
  249. data/spec/integration/application/filebucket_spec.rb +190 -0
  250. data/spec/integration/application/plugin_spec.rb +73 -0
  251. data/spec/integration/configurer_spec.rb +26 -7
  252. data/spec/integration/http/client_spec.rb +154 -0
  253. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  254. data/spec/integration/indirector/report/yaml.rb +83 -0
  255. data/spec/integration/module_tool/forge_spec.rb +51 -0
  256. data/spec/integration/network/http_pool_spec.rb +76 -20
  257. data/spec/integration/node/environment_spec.rb +15 -0
  258. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  259. data/spec/lib/puppet/test_ca.rb +2 -2
  260. data/spec/lib/puppet_spec/https.rb +20 -9
  261. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  262. data/spec/shared_contexts/https.rb +29 -0
  263. data/spec/spec_helper.rb +6 -2
  264. data/spec/unit/agent_spec.rb +80 -26
  265. data/spec/unit/application/agent_spec.rb +9 -5
  266. data/spec/unit/application/apply_spec.rb +2 -12
  267. data/spec/unit/application/describe_spec.rb +88 -50
  268. data/spec/unit/application/device_spec.rb +2 -2
  269. data/spec/unit/application/filebucket_spec.rb +22 -2
  270. data/spec/unit/application/resource_spec.rb +2 -2
  271. data/spec/unit/concurrent/lock_spec.rb +29 -0
  272. data/spec/unit/configurer/fact_handler_spec.rb +0 -4
  273. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  274. data/spec/unit/configurer_spec.rb +400 -406
  275. data/spec/unit/context/trusted_information_spec.rb +17 -0
  276. data/spec/unit/daemon_spec.rb +5 -64
  277. data/spec/unit/defaults_spec.rb +38 -4
  278. data/spec/unit/environments_spec.rb +65 -28
  279. data/spec/unit/face/facts_spec.rb +24 -20
  280. data/spec/unit/face/module/search_spec.rb +17 -0
  281. data/spec/unit/face/plugin_spec.rb +12 -10
  282. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  283. data/spec/unit/file_system_spec.rb +26 -2
  284. data/spec/unit/forge/errors_spec.rb +1 -1
  285. data/spec/unit/forge/forge_spec.rb +12 -54
  286. data/spec/unit/forge/module_release_spec.rb +19 -6
  287. data/spec/unit/forge/repository_spec.rb +63 -157
  288. data/spec/unit/forge_spec.rb +46 -116
  289. data/spec/unit/functions/find_template_spec.rb +69 -0
  290. data/spec/unit/functions/lookup_spec.rb +13 -0
  291. data/spec/unit/http/client_spec.rb +395 -27
  292. data/spec/unit/http/external_client_spec.rb +201 -0
  293. data/spec/unit/http/resolver_spec.rb +81 -12
  294. data/spec/unit/http/response_spec.rb +69 -0
  295. data/spec/unit/http/service/ca_spec.rb +100 -7
  296. data/spec/unit/http/service/compiler_spec.rb +627 -0
  297. data/spec/unit/http/service/file_server_spec.rb +308 -0
  298. data/spec/unit/http/service/report_spec.rb +118 -0
  299. data/spec/unit/http/service_spec.rb +117 -4
  300. data/spec/unit/http/session_spec.rb +237 -19
  301. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  302. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  303. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  304. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  305. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  306. data/spec/unit/indirector/file_metadata/http_spec.rb +167 -0
  307. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  308. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  309. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  310. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  311. data/spec/unit/indirector/rest_spec.rb +13 -0
  312. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  313. data/spec/unit/network/http/connection_spec.rb +549 -176
  314. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  315. data/spec/unit/network/http/pool_spec.rb +89 -11
  316. data/spec/unit/network/http_pool_spec.rb +63 -57
  317. data/spec/unit/network/http_spec.rb +1 -1
  318. data/spec/unit/node/environment_spec.rb +16 -0
  319. data/spec/unit/node/facts_spec.rb +2 -1
  320. data/spec/unit/node_spec.rb +7 -4
  321. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
  322. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  323. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  324. data/spec/unit/provider/aix_object_spec.rb +16 -2
  325. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  326. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  327. data/spec/unit/provider/package/aix_spec.rb +29 -0
  328. data/spec/unit/provider/package/apt_spec.rb +43 -2
  329. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  330. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  331. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  332. data/spec/unit/provider/package/gem_spec.rb +40 -0
  333. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  334. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  335. data/spec/unit/provider/package/pip_spec.rb +68 -19
  336. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  337. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  338. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  339. data/spec/unit/provider/package/portage_spec.rb +9 -4
  340. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  341. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  342. data/spec/unit/provider/package/yum_spec.rb +292 -0
  343. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  344. data/spec/unit/provider/package_targetable_spec.rb +60 -0
  345. data/spec/unit/provider/service/init_spec.rb +1 -0
  346. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  347. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  348. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  349. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  350. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  351. data/spec/unit/provider/user/hpux_spec.rb +2 -2
  352. data/spec/unit/provider/user/useradd_spec.rb +21 -8
  353. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  354. data/spec/unit/puppet_pal_2pec.rb +0 -26
  355. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  356. data/spec/unit/puppet_spec.rb +47 -0
  357. data/spec/unit/reports/http_spec.rb +70 -52
  358. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  359. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  360. data/spec/unit/ssl/certificate_spec.rb +7 -0
  361. data/spec/unit/ssl/host_spec.rb +4 -2
  362. data/spec/unit/ssl/oids_spec.rb +1 -0
  363. data/spec/unit/ssl/ssl_provider_spec.rb +71 -0
  364. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  365. data/spec/unit/transaction/persistence_spec.rb +1 -10
  366. data/spec/unit/transaction/report_spec.rb +4 -0
  367. data/spec/unit/transaction_spec.rb +45 -1
  368. data/spec/unit/type/file/content_spec.rb +9 -3
  369. data/spec/unit/type/file/ensure_spec.rb +1 -2
  370. data/spec/unit/type/file/source_spec.rb +86 -35
  371. data/spec/unit/type/package_spec.rb +8 -0
  372. data/spec/unit/type/service_spec.rb +9 -8
  373. data/spec/unit/type/user_spec.rb +1 -2
  374. data/spec/unit/util/at_fork_spec.rb +3 -2
  375. data/spec/unit/util/autoload_spec.rb +2 -1
  376. data/spec/unit/util/log/destinations_spec.rb +1 -29
  377. data/spec/unit/util/log_spec.rb +0 -138
  378. data/spec/unit/util/logging_spec.rb +200 -0
  379. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  380. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  381. data/spec/unit/util/package/version/range_spec.rb +175 -0
  382. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  383. data/spec/unit/util/pidlock_spec.rb +112 -42
  384. data/spec/unit/util/plist_spec.rb +20 -0
  385. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  386. data/spec/unit/util/storage_spec.rb +1 -8
  387. data/spec/unit/util/windows/adsi_spec.rb +55 -4
  388. data/spec/unit/util/windows/sid_spec.rb +2 -2
  389. data/spec/unit/x509/cert_provider_spec.rb +24 -4
  390. data/tasks/generate_cert_fixtures.rake +15 -1
  391. data/tasks/manpages.rake +6 -35
  392. metadata +92 -12
  393. data/COMMITTERS.md +0 -244
  394. data/spec/integration/faces/plugin_spec.rb +0 -61
  395. data/spec/lib/puppet_spec/validators.rb +0 -37
@@ -0,0 +1,206 @@
1
+ require 'puppet/file_serving/metadata'
2
+
3
+ #
4
+ # @api private
5
+ #
6
+ # The FileServer service is used to retrieve file metadata and content
7
+ #
8
+ class Puppet::HTTP::Service::FileServer < Puppet::HTTP::Service
9
+ # @api private
10
+ # @return [String] Default API for the FileServer service
11
+ API = '/puppet/v3'.freeze
12
+
13
+ # @api private
14
+ # @return [RegEx] RegEx used to determine if a path contains a leading slash
15
+ PATH_REGEX = /^\//
16
+
17
+ #
18
+ # @api private
19
+ #
20
+ # @param [Puppet::HTTP::Client] client
21
+ # @param [Puppet::HTTP::Session] session
22
+ # @param [String] server (Puppet[:ca_server]) If an explicit server is given,
23
+ # create a service using that server. If server is nil, the default value
24
+ # is used to create the service.
25
+ # @param [Integer] port (Puppet[:ca_port]) If an explicit port is given, create
26
+ # a service using that port. If port is nil, the default value is used to
27
+ # create the service.
28
+ #
29
+ def initialize(client, session, server, port)
30
+ url = build_url(API, server || Puppet[:server], port || Puppet[:masterport])
31
+ super(client, session, url)
32
+ end
33
+
34
+ #
35
+ # @api private
36
+ #
37
+ # Submit a GET request to the server to retrieve the metadata for a specified
38
+ # file
39
+ #
40
+ # @param [String] path path to the file to retrieve data from
41
+ # @param [String] environment the name of the environment we are operating in
42
+ # @param [Symbol] links Can be one of either `:follow` or `:manage`, defines
43
+ # how links are handled.
44
+ # @param [String] checksum_type The digest algorithm used to verify the file.
45
+ # Currently if fips is enabled, this defaults to `sha256`. Otherwise, it
46
+ # defaults to `md5`.
47
+ # @param [Symbol] source_permissions Can be one of `:use`, `:use_when_creating`,
48
+ # or `:ignore`. This parameter tells the server if it should include the
49
+ # file permissions in the response. If set to `:ignore`, the server will
50
+ # return default permissions.
51
+ #
52
+ # @return [Array<Puppet::HTTP::Response, Puppet::FileServing::Metadata>] An
53
+ # array with the request response and the deserialized metadata for the
54
+ # file returned from the server
55
+ #
56
+ def get_file_metadata(path:, environment:, links: :manage, checksum_type: Puppet[:digest_algorithm], source_permissions: :ignore)
57
+ validate_path(path)
58
+
59
+ headers = add_puppet_headers('Accept' => get_mime_types(Puppet::FileServing::Metadata).join(', '))
60
+
61
+ response = @client.get(
62
+ with_base_url("/file_metadata#{path}"),
63
+ headers: headers,
64
+ params: {
65
+ links: links,
66
+ checksum_type: checksum_type,
67
+ source_permissions: source_permissions,
68
+ environment: environment
69
+ }
70
+ )
71
+
72
+ process_response(response)
73
+
74
+ [response, deserialize(response, Puppet::FileServing::Metadata)]
75
+ end
76
+
77
+ #
78
+ # @api private
79
+ #
80
+ # Submit a GET request to the server to retrieve the metadata for multiple files
81
+ #
82
+ # @param [String] path path to the file(s) to retrieve data from
83
+ # @param [String] environment the name of the environment we are operating in
84
+ # @param [Symbol] recurse Can be `:true`, `:false`, or `:remote`. Defines if
85
+ # we recursively return the contents of the directory. Used in conjunction
86
+ # with `:recurselimit`. See the reference documentation for the file type
87
+ # for more details.
88
+ # @param [Integer] recurselimit When `recurse` is set, `recurselimit` defines
89
+ # how far Puppet should descend into subdirectories. `0` is effectively the
90
+ # same as `recurse => false`, `1` will return files and directories directly
91
+ # inside the defined directory, `2` will return the direct content of the
92
+ # directory as well as the contents of the _first_ level of subdirectories.
93
+ # The pattern continues for each incremental value. See the reference
94
+ # documentation for the file type for more details.
95
+ # @param [Array<String>] ignore An optional array of files to ignore, ie `['CVS', '.git', '.hg']`
96
+ # @param [Symbol] links Can be one of either `:follow` or `:manage`, defines
97
+ # how links are handled.
98
+ # @param [String] checksum_type The digest algorithm used to verify the file.
99
+ # Currently if fips is enabled, this defaults to `sha256`. Otherwise, it's `md5`.
100
+ # @param [Symbol] source_permissions Can be one of `:use`, `:use_when_creating`,
101
+ # or `:ignore`. This parameter tells the server if it should include the
102
+ # file permissions in the report. If set to `:ignore`, the server will return
103
+ # default permissions.
104
+ #
105
+ # @return [Array<Puppet::HTTP::Response, Array<Puppet::FileServing::Metadata>>]
106
+ # An array with the request response and an array of the deserialized
107
+ # metadata for each file returned from the server
108
+ #
109
+ def get_file_metadatas(path: nil, environment:, recurse: :false, recurselimit: nil, ignore: nil, links: :manage, checksum_type: Puppet[:digest_algorithm], source_permissions: :ignore)
110
+ validate_path(path)
111
+
112
+ headers = add_puppet_headers('Accept' => get_mime_types(Puppet::FileServing::Metadata).join(', '))
113
+
114
+ response = @client.get(
115
+ with_base_url("/file_metadatas#{path}"),
116
+ headers: headers,
117
+ params: {
118
+ recurse: recurse,
119
+ recurselimit: recurselimit,
120
+ ignore: ignore,
121
+ links: links,
122
+ checksum_type: checksum_type,
123
+ source_permissions: source_permissions,
124
+ environment: environment,
125
+ }
126
+ )
127
+
128
+ process_response(response)
129
+
130
+ [response, deserialize_multiple(response, Puppet::FileServing::Metadata)]
131
+ end
132
+
133
+ #
134
+ # @api private
135
+ #
136
+ # Submit a GET request to the server to retrieve content of a file
137
+ #
138
+ # @param [String] path path to the file to retrieve data from
139
+ # @param [String] environment the name of the environment we are operating in
140
+ #
141
+ # @yield [Sting] Yields the body of the response returned from the server
142
+ #
143
+ # @return [Puppet::HTTP::Response] The request response
144
+ #
145
+ def get_file_content(path:, environment:, &block)
146
+ validate_path(path)
147
+
148
+ headers = add_puppet_headers('Accept' => 'application/octet-stream')
149
+ response = @client.get(
150
+ with_base_url("/file_content#{path}"),
151
+ headers: headers,
152
+ params: {
153
+ environment: environment
154
+ }
155
+ ) do |res|
156
+ if res.success?
157
+ res.read_body(&block)
158
+ end
159
+ end
160
+
161
+ process_response(response)
162
+
163
+ response
164
+ end
165
+
166
+ #
167
+ # @api private
168
+ #
169
+ # Submit a GET request to
170
+ #
171
+ # @param [String] path path to the file to retrieve data from
172
+ # @param [String] environment the name of the environment we are operating in
173
+ # @param [String] code_id Defines the version of the resource to return
174
+ #
175
+ # @yield [String] Yields the body of the response returned
176
+ #
177
+ # @return [Puppet::HTTP::Response] The request response
178
+ #
179
+ def get_static_file_content(path:, environment:, code_id:, &block)
180
+ validate_path(path)
181
+
182
+ headers = add_puppet_headers('Accept' => 'application/octet-stream')
183
+ response = @client.get(
184
+ with_base_url("/static_file_content#{path}"),
185
+ headers: headers,
186
+ params: {
187
+ environment: environment,
188
+ code_id: code_id,
189
+ }
190
+ ) do |res|
191
+ if res.success?
192
+ res.read_body(&block)
193
+ end
194
+ end
195
+
196
+ process_response(response)
197
+
198
+ response
199
+ end
200
+
201
+ private
202
+
203
+ def validate_path(path)
204
+ raise ArgumentError, "Path must start with a slash" unless path =~ PATH_REGEX
205
+ end
206
+ end
@@ -0,0 +1,66 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # The Report service is used to submit run reports to the report server
5
+ #
6
+ class Puppet::HTTP::Service::Report < Puppet::HTTP::Service
7
+
8
+ # @api private
9
+ # @return [String] Default API for the report service
10
+ API = '/puppet/v3'.freeze
11
+
12
+ #
13
+ # @api private
14
+ #
15
+ # @param [Puppet::HTTP::Client] client
16
+ # @param [Puppet::HTTP::Session] session
17
+ # @param [String] server (Puppet[:ca_server]) If an explicit server is given,
18
+ # create a service using that server. If server is nil, the default value
19
+ # is used to create the service.
20
+ # @param [Integer] port (Puppet[:ca_port]) If an explicit port is given, create
21
+ # a service using that port. If port is nil, the default value is used to
22
+ # create the service.
23
+ #
24
+ def initialize(client, session, server, port)
25
+ url = build_url(API, server || Puppet[:report_server], port || Puppet[:report_port])
26
+ super(client, session, url)
27
+ end
28
+
29
+ #
30
+ # @api private
31
+ #
32
+ # Submit a report to the report server
33
+ #
34
+ # @param [String] name the name of the report being submitted
35
+ # @param [Puppet::Transaction::Report] report run report to be submitted
36
+ # @param [String] environment name of the agent environment
37
+ #
38
+ # @return [Puppet::HTTP::Response] response returned by the server
39
+ #
40
+ def put_report(name, report, environment:)
41
+ formatter = Puppet::Network::FormatHandler.format_for(Puppet[:preferred_serialization_format])
42
+ headers = add_puppet_headers(
43
+ 'Accept' => get_mime_types(Puppet::Transaction::Report).join(', '),
44
+ 'Content-Type' => formatter.mime
45
+ )
46
+
47
+ response = @client.put(
48
+ with_base_url("/report/#{name}"),
49
+ serialize(formatter, report),
50
+ headers: headers,
51
+ params: { environment: environment },
52
+ )
53
+
54
+ # override parent's process_response handling
55
+ @session.process_response(response)
56
+
57
+ if response.success?
58
+ response
59
+ elsif !@session.supports?(:report, 'json') && Puppet[:preferred_serialization_format] != 'pson'
60
+ #TRANSLATORS "pson", "preferred_serialization_format", and "puppetserver" should not be translated
61
+ raise Puppet::HTTP::ProtocolError.new(_("To submit reports to a server running puppetserver %{server_version}, set preferred_serialization_format to pson") % { server_version: response[Puppet::HTTP::HEADER_PUPPET_VERSION]})
62
+ else
63
+ raise Puppet::HTTP::ResponseError.new(response)
64
+ end
65
+ end
66
+ end
@@ -1,55 +1,130 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # The session is the mechanism by which services may be connected to and accessed.
5
+ #
1
6
  class Puppet::HTTP::Session
2
- Route = Struct.new(:service_class, :api, :server_setting, :port_setting)
7
+ # capabilities for a site
8
+ CAP_LOCALES = 'locales'.freeze
9
+ CAP_JSON = 'json'.freeze
3
10
 
4
- ROUTES = {
5
- ca: Route.new(Puppet::HTTP::Service::Ca, '/puppet-ca/v1', :ca_server, :ca_port),
6
- }.freeze
11
+ # puppet version where locales mount was added
12
+ SUPPORTED_LOCALES_MOUNT_AGENT_VERSION = Gem::Version.new("5.3.4")
7
13
 
14
+ # puppet version where JSON was enabled by default
15
+ SUPPORTED_JSON_DEFAULT = Gem::Version.new("5.0.0")
16
+
17
+ #
18
+ # @api private
19
+ #
20
+ # Create a new HTTP session. The session is the mechanism by which services
21
+ # may be connected to and accessed.
22
+ #
23
+ # @param [Puppet::HTTP::Client] client the container for this session
24
+ # @param [Array<Puppet::HTTP::Resolver>] resolvers array of resolver strategies
25
+ # to implement.
26
+ #
8
27
  def initialize(client, resolvers)
9
28
  @client = client
10
29
  @resolvers = resolvers
11
30
  @resolved_services = {}
31
+ @server_versions = {}
12
32
  end
13
33
 
14
- def route_to(name, ssl_context: nil)
15
- route = ROUTES[name]
16
- raise ArgumentError, "Unknown service #{name}" unless route
34
+ #
35
+ # @api private
36
+ #
37
+ # If an explicit server and port are specified on the command line or
38
+ # configuration file, this method always returns a Service with that host and
39
+ # port. Otherwise, we walk the list of resolvers in priority order:
40
+ # - DNS SRV
41
+ # - Server List
42
+ # - Puppet server/port settings
43
+ # If a given resolver fails to connect, it tries the next available resolver
44
+ # until a successful connection is found and returned. The successful service
45
+ # is cached and returned if `route_to` is called again.
46
+ #
47
+ # @param [Symbol] name the service to resolve
48
+ # @param [URI] url (nil) optional explicit url to use, if it is already known
49
+ # @param [Puppet::SSL::SSLContext] ssl_context ssl_context ssl context to be
50
+ # used for connections
51
+ #
52
+ # @return [Puppet::HTTP::Service] the resolved service
53
+ #
54
+ def route_to(name, url: nil, ssl_context: nil)
55
+ raise ArgumentError, "Unknown service #{name}" unless Puppet::HTTP::Service.valid_name?(name)
56
+
57
+ # short circuit if explicit URL host & port given
58
+ if url && url.host != nil && !url.host.empty?
59
+ service = Puppet::HTTP::Service.create_service(@client, self, name, url.host, url.port)
60
+ service.connect(ssl_context: ssl_context)
61
+ return service
62
+ end
17
63
 
18
64
  cached = @resolved_services[name]
19
65
  return cached if cached
20
66
 
21
- errors = []
67
+ resolution_exceptions = []
68
+ error_handler = proc { |e| resolution_exceptions << e }
22
69
 
23
70
  @resolvers.each do |resolver|
24
71
  Puppet.debug("Resolving service '#{name}' using #{resolver.class}")
25
- resolver.resolve(self, name) do |service|
26
- begin
27
- service.connect(ssl_context: ssl_context)
28
- @resolved_services[name] = service
29
- Puppet.debug("Resolved service '#{name}' to #{service.url}")
30
- return service
31
- rescue Puppet::HTTP::ConnectionError => e
32
- errors << e
33
- Puppet.debug("Connection to #{service.url} failed, trying next route: #{e.message}")
34
- end
72
+ service = resolver.resolve(self, name, ssl_context: ssl_context, error_handler: error_handler)
73
+ if service
74
+ @resolved_services[name] = service
75
+ Puppet.debug("Resolved service '#{name}' to #{service.url}")
76
+ return service
35
77
  end
36
78
  end
37
79
 
38
- errors.each { |e| Puppet.log_exception(e) }
39
-
80
+ resolution_exceptions.each { |e| Puppet.log_exception(e) }
40
81
  raise Puppet::HTTP::RouteError, "No more routes to #{name}"
41
82
  end
42
83
 
43
- def create_service(name, server = nil, port = nil)
44
- route = ROUTES[name]
45
- raise ArgumentError, "Unknown service #{name}" unless route
46
-
47
- server ||= Puppet[route.server_setting]
48
- port ||= Puppet[route.port_setting]
49
- url = URI::HTTPS.build(host: server,
50
- port: port,
51
- path: route.api
52
- ).freeze
53
- route.service_class.new(@client, url)
84
+ #
85
+ # @api private
86
+ #
87
+ # Collect per-site server versions. This will allow us to modify future
88
+ # requests based on the version of puppetserver we are talking to.
89
+ #
90
+ # @param [Puppet::HTTP::Response] response the request response containing headers
91
+ #
92
+ def process_response(response)
93
+ version = response[Puppet::HTTP::HEADER_PUPPET_VERSION]
94
+ if version
95
+ site = Puppet::Network::HTTP::Site.from_uri(response.url)
96
+ @server_versions[site] = version
97
+ end
98
+ end
99
+
100
+ #
101
+ # @api private
102
+ #
103
+ # Determine if a session supports a capability. Depending on the server version
104
+ # we are talking to, we know certain features are available or not. These
105
+ # specifications are defined here so we can modify our requests appropriately.
106
+ #
107
+ # @param [Symbol] name name of the service to check
108
+ # @param [String] capability the capability, ie `locales` or `json`
109
+ #
110
+ # @return [Boolean]
111
+ #
112
+ def supports?(name, capability)
113
+ raise ArgumentError, "Unknown service #{name}" unless Puppet::HTTP::Service.valid_name?(name)
114
+
115
+ service = @resolved_services[name]
116
+ return false unless service
117
+
118
+ site = Puppet::Network::HTTP::Site.from_uri(service.url)
119
+ server_version = @server_versions[site]
120
+
121
+ case capability
122
+ when CAP_LOCALES
123
+ !server_version.nil? && Gem::Version.new(server_version) >= SUPPORTED_LOCALES_MOUNT_AGENT_VERSION
124
+ when CAP_JSON
125
+ server_version.nil? || Gem::Version.new(server_version) >= SUPPORTED_JSON_DEFAULT
126
+ else
127
+ false
128
+ end
54
129
  end
55
130
  end
@@ -1,3 +1,4 @@
1
+ require 'puppet/environments'
1
2
  require 'puppet/node'
2
3
  require 'puppet/resource/catalog'
3
4
  require 'puppet/indirector/code'
@@ -173,6 +174,7 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
173
174
  # Initially restricted to files sourced from codedir via puppet:/// uri.
174
175
  def inline_metadata(catalog, checksum_type)
175
176
  environment_path = Pathname.new File.join(Puppet[:environmentpath], catalog.environment, "")
177
+ environment_path = Puppet::Environments::Directories.real_path(environment_path)
176
178
  list_of_resources = catalog.resources.find_all { |res| res.type == "File" }
177
179
 
178
180
  # TODO: get property/parameter defaults if entries are nil in the resource
@@ -393,9 +395,17 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
393
395
 
394
396
  # Initialize our server fact hash; we add these to each client, and they
395
397
  # won't change while we're running, so it's safe to cache the values.
398
+ #
399
+ # See also set_server_facts in Puppet::Server::Compiler in puppetserver.
396
400
  def set_server_facts
397
401
  @server_facts = {}
398
402
 
403
+ # Add our server Puppet Enterprise version, if available.
404
+ pe_version_file = '/opt/puppetlabs/server/pe_version'
405
+ if File.readable?(pe_version_file) and !File.zero?(pe_version_file)
406
+ @server_facts['pe_serverversion'] = File.read(pe_version_file).chomp
407
+ end
408
+
399
409
  # Add our server version to the fact list
400
410
  @server_facts["serverversion"] = Puppet.version.to_s
401
411