puppet 6.11.1 → 6.16.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (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,15 @@
1
+ module Puppet::Util::Package::Version
2
+ class Gem < ::Gem::Version
3
+ def self.parse(version)
4
+ raise ValidationFailure, version unless version.is_a? String
5
+ raise ValidationFailure, version unless version =~ ANCHORED_VERSION_PATTERN
6
+ new(version)
7
+ end
8
+
9
+ class ValidationFailure < ArgumentError
10
+ def initialize(version)
11
+ super("#{version} is not a valid ruby gem version.")
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,167 @@
1
+ module Puppet::Util::Package::Version
2
+ class Pip
3
+ include Comparable
4
+
5
+ VERSION_PATTERN = "
6
+ v?
7
+ (?:
8
+ (?:(?<epoch>[0-9]+)!)? # epoch
9
+ (?<release>[0-9]+(?:\\.[0-9]+)*) # release segment
10
+ (?<pre> # pre-release
11
+ [-_\\.]?
12
+ (?<pre_l>(a|b|c|rc|alpha|beta|pre|preview))
13
+ [-_\\.]?
14
+ (?<pre_n>[0-9]+)?
15
+ )?
16
+ (?<post> # post release
17
+ (?:-(?<post_n1>[0-9]+))
18
+ |
19
+ (?:
20
+ [-_\\.]?
21
+ (?<post_l>post|rev|r)
22
+ [-_\\.]?
23
+ (?<post_n2>[0-9]+)?
24
+ )
25
+ )?
26
+ (?<dev> # dev release
27
+ [-_\\.]?
28
+ (?<dev_l>dev)
29
+ [-_\\.]?
30
+ (?<dev_n>[0-9]+)?
31
+ )?
32
+ )
33
+ (?:\\+(?<local>[a-z0-9]+(?:[-_\\.][a-z0-9]+)*))? # local version
34
+ ".freeze
35
+
36
+ def self.parse(version)
37
+ raise ValidationFailure, version.to_s unless version.is_a? String
38
+
39
+ matched = version.match(Regexp.new(("^\\s*") + VERSION_PATTERN + ("\\s*$"), Regexp::EXTENDED | Regexp::MULTILINE | Regexp::IGNORECASE))
40
+ raise ValidationFailure, version unless matched
41
+
42
+ new(matched)
43
+ end
44
+
45
+ def self.compare(version_a, version_b)
46
+ version_a = parse(version_a) unless version_a.is_a?(self)
47
+ version_b = parse(version_b) unless version_b.is_a?(self)
48
+
49
+ version_a <=> version_b
50
+ end
51
+
52
+ def to_s
53
+ parts = []
54
+
55
+ parts.push("#{@epoch_data}!") if @epoch_data && @epoch_data != 0
56
+ parts.push(@release_data.join(".")) if @release_data
57
+ parts.push(@pre_data.join) if @pre_data
58
+ parts.push(".post#{@post_data[1]}") if @post_data
59
+ parts.push(".dev#{@dev_data[1]}") if @dev_data
60
+ parts.push("+#{@local_data.join(".")}") if @local_data
61
+
62
+ parts.join
63
+ end
64
+ alias inspect to_s
65
+
66
+ def eql?(other)
67
+ other.is_a?(self.class) && key.eql?(other.key)
68
+ end
69
+ alias == eql?
70
+
71
+ def <=>(other)
72
+ raise ValidationFailure, other.to_s unless other.is_a?(self.class)
73
+ compare(key, other.key)
74
+ end
75
+
76
+ attr_reader :key
77
+
78
+ private
79
+
80
+ def initialize(matched)
81
+ @epoch_data = matched[:epoch].to_i
82
+ @release_data = matched[:release].split('.').map(&:to_i) if matched[:release]
83
+ @pre_data = parse_letter_version(matched[:pre_l], matched[:pre_n]) if matched[:pre_l] || matched[:pre_n]
84
+ @post_data = parse_letter_version(matched[:post_l], matched[:post_n1] || matched[:post_n2]) if matched[:post_l] || matched[:post_n1] || matched[:post_n2]
85
+ @dev_data = parse_letter_version(matched[:dev_l], matched[:dev_n]) if matched[:dev_l] || matched[:dev_n]
86
+ @local_data = parse_local_version(matched[:local]) if matched[:local]
87
+
88
+ @key = compose_key(@epoch_data, @release_data, @pre_data, @post_data, @dev_data, @local_data)
89
+ end
90
+
91
+ def parse_letter_version(letter, number)
92
+ if letter
93
+ number = 0 if !number
94
+ letter.downcase!
95
+
96
+ if letter == "alpha"
97
+ letter = "a"
98
+ elsif letter == "beta"
99
+ letter = "b"
100
+ elsif ["c", "pre", "preview"].include?(letter)
101
+ letter = "rc"
102
+ elsif ["rev", "r"].include?(letter)
103
+ letter = "post"
104
+ end
105
+
106
+ return [letter, number.to_i]
107
+ end
108
+
109
+ ["post", number.to_i] if !letter && number
110
+ end
111
+
112
+ def parse_local_version(local_version)
113
+ local_version.split(/[\\._-]/).map{|part| part =~ /[0-9]+/ && part !~ /[a-zA-Z]+/ ? part.to_i : part.downcase} if local_version
114
+ end
115
+
116
+ def compose_key(epoch, release, pre, post, dev, local)
117
+ release_key = release.reverse
118
+ release_key.each_with_index do |element, index|
119
+ break unless element == 0
120
+ release_key.delete_at(index) unless release_key.at(index + 1) != 0
121
+ end
122
+ release_key.reverse!
123
+
124
+ if !pre && !post && dev
125
+ pre_key = -Float::INFINITY
126
+ else
127
+ pre_key = pre || Float::INFINITY
128
+ end
129
+
130
+ post_key = post || -Float::INFINITY
131
+
132
+ dev_key = dev || Float::INFINITY
133
+
134
+ if !local
135
+ local_key = [[-Float::INFINITY, ""]]
136
+ else
137
+ local_key = local.map{|i| (i.is_a? Integer) ? [i, ""] : [-Float::INFINITY, i]}
138
+ end
139
+
140
+ [epoch, release_key, pre_key, post_key, dev_key, local_key]
141
+ end
142
+
143
+ def compare(this, other)
144
+ if (this.is_a? Array) && (other.is_a? Array)
145
+ this << -Float::INFINITY if this.length < other.length
146
+ other << -Float::INFINITY if this.length > other.length
147
+
148
+ this.each_with_index do |element, index|
149
+ return compare(element, other.at(index)) if element != other.at(index)
150
+ end
151
+ elsif (this.is_a? Array) && !(other.is_a? Array)
152
+ raise Puppet::Error, 'Cannot compare #{this} (Array) with #{other} (#{other.class}). Only ±Float::INFINITY accepted.' unless other.abs == Float::INFINITY
153
+ return other == -Float::INFINITY ? 1 : -1
154
+ elsif !(this.is_a? Array) && (other.is_a? Array)
155
+ raise Puppet::Error, 'Cannot compare #{this} (#{this.class}) with #{other} (Array). Only ±Float::INFINITY accepted.' unless this.abs == Float::INFINITY
156
+ return this == -Float::INFINITY ? -1 : 1
157
+ end
158
+ this <=> other
159
+ end
160
+
161
+ class ValidationFailure < ArgumentError
162
+ def initialize(version)
163
+ super("#{version} is not a valid python package version. Please refer to https://www.python.org/dev/peps/pep-0440/.")
164
+ end
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,53 @@
1
+ require 'puppet/util/package/version/range/lt'
2
+ require 'puppet/util/package/version/range/lt_eq'
3
+ require 'puppet/util/package/version/range/gt'
4
+ require 'puppet/util/package/version/range/gt_eq'
5
+ require 'puppet/util/package/version/range/eq'
6
+ require 'puppet/util/package/version/range/min_max'
7
+
8
+ module Puppet::Util::Package::Version
9
+ class Range
10
+ class ValidationFailure < ArgumentError; end
11
+ # Parses a version range string into a comparable {Range} instance.
12
+ #
13
+ # Currently parsed version range string may take any of the following
14
+ # forms:
15
+ #
16
+ # * Regular Version strings
17
+ # * ex. `"1.0.0"`, `"1.2.3-pre"`
18
+ # * Inequalities
19
+ # * ex. `">1.0.0"`, `"<3.2.0"`, `">=4.0.0"`
20
+ # * Range Intersections (min is always first)
21
+ # * ex. `">1.0.0 <=2.3.0"`
22
+ #
23
+ RANGE_SPLIT = /\s+/
24
+ FULL_REGEX = /\A((?:[<>=])*)(.+)\Z/
25
+
26
+ # @param range_string [String] the version range string to parse
27
+ # @param version_class [Version] a version class implementing comparison operators and parse method
28
+ # @return [Range] a new {Range} instance
29
+ # @api public
30
+ def self.parse(range_string, version_class)
31
+ raise ValidationFailure, "Unable to parse '#{range_string}' as a string" unless range_string.is_a?(String)
32
+ simples = range_string.split(RANGE_SPLIT).map do |simple|
33
+ match, operator, version = *simple.match(FULL_REGEX)
34
+ raise ValidationFailure, "Unable to parse '#{simple}' as a version range identifier" unless match
35
+ case operator
36
+ when '>'
37
+ Gt.new(version_class::parse(version))
38
+ when '>='
39
+ GtEq.new(version_class::parse(version))
40
+ when '<'
41
+ Lt.new(version_class::parse(version))
42
+ when '<='
43
+ LtEq.new(version_class::parse(version))
44
+ when ''
45
+ Eq.new(version_class::parse(version))
46
+ else
47
+ raise ValidationFailure, "Operator '#{operator}' is not implemented"
48
+ end
49
+ end
50
+ simples.size == 1 ? simples[0] : MinMax.new(simples[0], simples[1])
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,14 @@
1
+ require 'puppet/util/package/version/range/simple'
2
+
3
+ module Puppet::Util::Package::Version
4
+ class Range
5
+ class Eq < Simple
6
+ def to_s
7
+ "#{@version}"
8
+ end
9
+ def include?(version)
10
+ version == @version
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require 'puppet/util/package/version/range/simple'
2
+
3
+ module Puppet::Util::Package::Version
4
+ class Range
5
+ class Gt < Simple
6
+ def to_s
7
+ ">#{@version}"
8
+ end
9
+ def include?(version)
10
+ version > @version
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require 'puppet/util/package/version/range/simple'
2
+
3
+ module Puppet::Util::Package::Version
4
+ class Range
5
+ class GtEq < Simple
6
+ def to_s
7
+ ">=#{@version}"
8
+ end
9
+ def include?(version)
10
+ version >= @version
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require 'puppet/util/package/version/range/simple'
2
+
3
+ module Puppet::Util::Package::Version
4
+ class Range
5
+ class Lt< Simple
6
+ def to_s
7
+ "<#{@version}"
8
+ end
9
+ def include?(version)
10
+ version < @version
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require 'puppet/util/package/version/range/simple'
2
+
3
+ module Puppet::Util::Package::Version
4
+ class Range
5
+ class LtEq < Simple
6
+ def to_s
7
+ "<=#{@version}"
8
+ end
9
+ def include?(version)
10
+ version <= @version
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ require 'puppet/util/package/version/range'
2
+
3
+ module Puppet::Util::Package::Version
4
+ class Range
5
+ class MinMax
6
+ def initialize(min, max)
7
+ @min = min
8
+ @max = max
9
+ end
10
+ def to_s
11
+ "#{@min} #{@max}"
12
+ end
13
+ def to_gem_version
14
+ "#{@min}, #{@max}"
15
+ end
16
+ def include?(version)
17
+ @min.include?(version) && @max.include?(version)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,11 @@
1
+ require 'puppet/util/package/version/range'
2
+
3
+ module Puppet::Util::Package::Version
4
+ class Range
5
+ class Simple
6
+ def initialize(version)
7
+ @version = version
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+ require 'puppet/util/rpm_compare'
3
+
4
+ module Puppet::Util::Package::Version
5
+ class Rpm < Numeric
6
+ # provides Rpm parsing and comparison
7
+ extend Puppet::Util::RpmCompare
8
+ include Puppet::Util::RpmCompare
9
+ include Comparable
10
+
11
+ class ValidationFailure < ArgumentError; end
12
+
13
+ attr_reader :epoch, :version, :release, :arch
14
+
15
+ def self.parse(ver)
16
+ raise ValidationFailure unless ver.is_a?(String)
17
+ version = rpm_parse_evr(ver)
18
+ new(version[:epoch], version[:version], version[:release], version[:arch]).freeze
19
+ end
20
+
21
+ def to_s
22
+ version_found = ''
23
+ version_found += "#{@epoch}:" if @epoch
24
+ version_found += @version
25
+ version_found += "-#{@release}" if @release
26
+ version_found
27
+ end
28
+ alias inspect to_s
29
+
30
+ def eql?(other)
31
+ other.is_a?(self.class) &&
32
+ @epoch.eql?(other.epoch) &&
33
+ @version.eql?(other.version) &&
34
+ @release.eql?(other.release) &&
35
+ @arch.eql?(other.arch)
36
+ end
37
+ alias == eql?
38
+
39
+ def <=>(other)
40
+ raise ArgumentError, _("Cannot compare, as %{other} is not a Rpm Version") % { other: other } unless other.is_a?(self.class)
41
+
42
+ rpm_compareEVR(self.to_s, other.to_s)
43
+ end
44
+
45
+ private
46
+
47
+ # overwrite rpm_compareEVR to treat no epoch as zero epoch
48
+ # in order to compare version correctly
49
+ #
50
+ # returns 1 if a is newer than b,
51
+ # 0 if they are identical
52
+ # -1 if a is older than b
53
+ def rpm_compareEVR(a, b)
54
+ a_hash = rpm_parse_evr(a)
55
+ b_hash = rpm_parse_evr(b)
56
+
57
+ a_hash[:epoch] ||= '0'
58
+ b_hash[:epoch] ||= '0'
59
+
60
+ rc = compare_values(a_hash[:epoch], b_hash[:epoch])
61
+ return rc unless rc == 0
62
+
63
+ super(a, b)
64
+ end
65
+
66
+ def initialize(epoch, version, release, arch)
67
+ @epoch = epoch
68
+ @version = version
69
+ @release = release
70
+ @arch = arch
71
+ end
72
+ end
73
+ end
@@ -43,8 +43,23 @@ class Puppet::Util::Pidlock
43
43
  @lockfile.file_path
44
44
  end
45
45
 
46
+ private
47
+
48
+ def ps_argument_for_current_kernel
49
+ case Facter.value(:kernel)
50
+ when "Linux"
51
+ "-eq"
52
+ when "AIX"
53
+ "-T"
54
+ else
55
+ "-p"
56
+ end
57
+ end
58
+
46
59
  def clear_if_stale
47
- return @lockfile.unlock if lock_pid.nil?
60
+ pid = lock_pid
61
+ return @lockfile.unlock if pid == nil
62
+ return if Process.pid == pid
48
63
 
49
64
  errors = [Errno::ESRCH]
50
65
  # Win32::Process now throws SystemCallError. Since this could be
@@ -52,25 +67,36 @@ class Puppet::Util::Pidlock
52
67
  errors << SystemCallError if Puppet::Util::Platform.windows?
53
68
 
54
69
  begin
55
- Process.kill(0, lock_pid)
70
+ Process.kill(0, pid)
56
71
  rescue *errors
57
72
  return @lockfile.unlock
58
73
  end
59
74
 
60
75
  # Ensure the process associated with this pid is our process. If
61
- # not, we can unlock the lockfile. For now this is only done on
62
- # POSIX and Windows platforms (PUP-9247).
76
+ # not, we can unlock the lockfile. CLI arguments used for identifying
77
+ # on POSIX depend on the os and sometimes even version.
63
78
  if Puppet.features.posix?
64
- procname = Puppet::Util::Execution.execute(["ps", "-p", lock_pid, "-o", "comm="]).strip
65
- args = Puppet::Util::Execution.execute(["ps", "-p", lock_pid, "-o", "args="]).strip
79
+ ps_argument = ps_argument_for_current_kernel
80
+
81
+ # Check, obtain and use the right ps argument
82
+ begin
83
+ procname = Puppet::Util::Execution.execute(["ps", ps_argument, pid, "-o", "comm="]).strip
84
+ rescue Puppet::ExecutionFailure
85
+ ps_argument = "-p"
86
+ procname = Puppet::Util::Execution.execute(["ps", ps_argument, pid, "-o", "comm="]).strip
87
+ end
88
+
89
+ args = Puppet::Util::Execution.execute(["ps", ps_argument, pid, "-o", "args="]).strip
66
90
  @lockfile.unlock unless procname =~ /ruby/ && args =~ /puppet/ || procname =~ /puppet(-.*)?$/
67
91
  elsif Puppet.features.microsoft_windows?
68
92
  # On Windows, we're checking if the filesystem path name of the running
69
93
  # process is our vendored ruby:
70
- exe_path = Puppet::Util::Windows::Process::get_process_image_name_by_pid(lock_pid)
71
- @lockfile.unlock unless exe_path =~ /\\bin\\ruby.exe$/
94
+ begin
95
+ exe_path = Puppet::Util::Windows::Process::get_process_image_name_by_pid(pid)
96
+ @lockfile.unlock unless exe_path =~ /\\bin\\ruby.exe$/
97
+ rescue Puppet::Util::Windows::Error => e
98
+ Puppet.debug("Failed to read pidfile #{file_path}: #{e.message}")
99
+ end
72
100
  end
73
101
  end
74
- private :clear_if_stale
75
-
76
102
  end