puppet 6.14.0-x64-mingw32 → 6.19.0-x64-mingw32

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 (496) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/Gemfile +4 -2
  4. data/Gemfile.lock +36 -34
  5. data/README.md +3 -4
  6. data/Rakefile +4 -12
  7. data/ext/windows/service/daemon.rb +3 -3
  8. data/lib/puppet.rb +33 -9
  9. data/lib/puppet/agent.rb +20 -14
  10. data/lib/puppet/agent/locker.rb +0 -7
  11. data/lib/puppet/application/agent.rb +25 -9
  12. data/lib/puppet/application/apply.rb +18 -20
  13. data/lib/puppet/application/device.rb +1 -1
  14. data/lib/puppet/application/doc.rb +1 -1
  15. data/lib/puppet/application/filebucket.rb +5 -14
  16. data/lib/puppet/application/lookup.rb +16 -4
  17. data/lib/puppet/application/plugin.rb +1 -0
  18. data/lib/puppet/application/ssl.rb +3 -3
  19. data/lib/puppet/configurer.rb +68 -24
  20. data/lib/puppet/configurer/downloader.rb +31 -10
  21. data/lib/puppet/configurer/plugin_handler.rb +1 -1
  22. data/lib/puppet/confine.rb +2 -2
  23. data/lib/puppet/confine/any.rb +1 -1
  24. data/lib/puppet/context/trusted_information.rb +14 -8
  25. data/lib/puppet/daemon.rb +13 -27
  26. data/lib/puppet/defaults.rb +141 -41
  27. data/lib/puppet/environments.rb +55 -15
  28. data/lib/puppet/face/catalog.rb +1 -1
  29. data/lib/puppet/face/config.rb +46 -16
  30. data/lib/puppet/face/facts.rb +1 -1
  31. data/lib/puppet/face/help.rb +29 -3
  32. data/lib/puppet/face/module/search.rb +5 -0
  33. data/lib/puppet/face/node.rb +3 -3
  34. data/lib/puppet/face/node/clean.rb +2 -2
  35. data/lib/puppet/face/plugin.rb +2 -2
  36. data/lib/puppet/face/status.rb +1 -1
  37. data/lib/puppet/feature/base.rb +1 -1
  38. data/lib/puppet/file_bucket/dipper.rb +1 -1
  39. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  40. data/lib/puppet/file_serving/metadata.rb +4 -1
  41. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  42. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  43. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  44. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  45. data/lib/puppet/file_system/file_impl.rb +17 -13
  46. data/lib/puppet/file_system/uniquefile.rb +12 -16
  47. data/lib/puppet/forge.rb +1 -1
  48. data/lib/puppet/forge/cache.rb +1 -1
  49. data/lib/puppet/forge/repository.rb +4 -7
  50. data/lib/puppet/functions/call.rb +1 -1
  51. data/lib/puppet/functions/filter.rb +1 -0
  52. data/lib/puppet/functions/lstrip.rb +4 -4
  53. data/lib/puppet/functions/new.rb +8 -3
  54. data/lib/puppet/functions/reduce.rb +2 -4
  55. data/lib/puppet/functions/reverse_each.rb +1 -1
  56. data/lib/puppet/functions/rstrip.rb +4 -4
  57. data/lib/puppet/functions/step.rb +1 -1
  58. data/lib/puppet/functions/strip.rb +4 -4
  59. data/lib/puppet/gettext/config.rb +5 -5
  60. data/lib/puppet/gettext/module_translations.rb +4 -4
  61. data/lib/puppet/http.rb +3 -0
  62. data/lib/puppet/http/client.rb +215 -60
  63. data/lib/puppet/http/external_client.rb +90 -0
  64. data/lib/puppet/http/redirector.rb +43 -7
  65. data/lib/puppet/http/resolver.rb +43 -3
  66. data/lib/puppet/http/resolver/server_list.rb +66 -24
  67. data/lib/puppet/http/resolver/settings.rb +21 -1
  68. data/lib/puppet/http/resolver/srv.rb +28 -2
  69. data/lib/puppet/http/response.rb +82 -1
  70. data/lib/puppet/http/retry_after_handler.rb +39 -0
  71. data/lib/puppet/http/service.rb +70 -2
  72. data/lib/puppet/http/service/ca.rb +71 -9
  73. data/lib/puppet/http/service/compiler.rb +214 -12
  74. data/lib/puppet/http/service/file_server.rb +106 -5
  75. data/lib/puppet/http/service/puppetserver.rb +39 -0
  76. data/lib/puppet/http/service/report.rb +36 -3
  77. data/lib/puppet/http/session.rb +60 -8
  78. data/lib/puppet/indirector.rb +1 -1
  79. data/lib/puppet/indirector/catalog/compiler.rb +1 -1
  80. data/lib/puppet/indirector/catalog/rest.rb +2 -1
  81. data/lib/puppet/indirector/exec.rb +1 -1
  82. data/lib/puppet/indirector/facts/facter.rb +3 -3
  83. data/lib/puppet/indirector/facts/rest.rb +2 -1
  84. data/lib/puppet/indirector/facts/yaml.rb +1 -1
  85. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  86. data/lib/puppet/indirector/file_content/http.rb +5 -0
  87. data/lib/puppet/indirector/file_content/rest.rb +1 -1
  88. data/lib/puppet/indirector/file_metadata/http.rb +28 -8
  89. data/lib/puppet/indirector/file_metadata/rest.rb +6 -4
  90. data/lib/puppet/indirector/hiera.rb +4 -0
  91. data/lib/puppet/indirector/indirection.rb +1 -1
  92. data/lib/puppet/indirector/json.rb +1 -1
  93. data/lib/puppet/indirector/msgpack.rb +1 -1
  94. data/lib/puppet/indirector/node/rest.rb +2 -1
  95. data/lib/puppet/indirector/report/processor.rb +2 -2
  96. data/lib/puppet/indirector/report/yaml.rb +23 -0
  97. data/lib/puppet/indirector/request.rb +5 -5
  98. data/lib/puppet/indirector/rest.rb +7 -1
  99. data/lib/puppet/indirector/status/rest.rb +2 -1
  100. data/lib/puppet/indirector/yaml.rb +1 -1
  101. data/lib/puppet/metatype/manager.rb +80 -80
  102. data/lib/puppet/module.rb +1 -2
  103. data/lib/puppet/network/format_support.rb +2 -2
  104. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  105. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  106. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  107. data/lib/puppet/network/http/base_pool.rb +6 -1
  108. data/lib/puppet/network/http/compression.rb +7 -0
  109. data/lib/puppet/network/http/connection.rb +2 -0
  110. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  111. data/lib/puppet/network/http/nocache_pool.rb +1 -0
  112. data/lib/puppet/network/http/pool.rb +2 -4
  113. data/lib/puppet/network/http/route.rb +2 -2
  114. data/lib/puppet/network/http_pool.rb +2 -1
  115. data/lib/puppet/node/environment.rb +22 -5
  116. data/lib/puppet/node/facts.rb +17 -0
  117. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  118. data/lib/puppet/pal/pal_impl.rb +30 -31
  119. data/lib/puppet/parameter.rb +1 -1
  120. data/lib/puppet/parser/ast/leaf.rb +5 -5
  121. data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
  122. data/lib/puppet/parser/compiler.rb +43 -33
  123. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  124. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  125. data/lib/puppet/parser/environment_compiler.rb +4 -1
  126. data/lib/puppet/parser/functions.rb +18 -9
  127. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  128. data/lib/puppet/parser/functions/filter.rb +1 -0
  129. data/lib/puppet/parser/resource.rb +3 -2
  130. data/lib/puppet/parser/resource/param.rb +6 -0
  131. data/lib/puppet/parser/type_loader.rb +2 -2
  132. data/lib/puppet/pops/adaptable.rb +7 -13
  133. data/lib/puppet/pops/adapters.rb +8 -4
  134. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  135. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  136. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  137. data/lib/puppet/pops/issues.rb +5 -0
  138. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  139. data/lib/puppet/pops/loaders.rb +24 -15
  140. data/lib/puppet/pops/lookup/context.rb +1 -1
  141. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  142. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  143. data/lib/puppet/pops/types/iterable.rb +34 -8
  144. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  145. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  146. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  147. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  148. data/lib/puppet/provider/file/windows.rb +1 -1
  149. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  150. data/lib/puppet/provider/package/aix.rb +17 -2
  151. data/lib/puppet/provider/package/apt.rb +98 -1
  152. data/lib/puppet/provider/package/aptitude.rb +1 -1
  153. data/lib/puppet/provider/package/dnfmodule.rb +61 -14
  154. data/lib/puppet/provider/package/dpkg.rb +1 -1
  155. data/lib/puppet/provider/package/gem.rb +45 -9
  156. data/lib/puppet/provider/package/pacman.rb +2 -5
  157. data/lib/puppet/provider/package/pip.rb +143 -48
  158. data/lib/puppet/provider/package/pip2.rb +17 -0
  159. data/lib/puppet/provider/package/pip3.rb +0 -2
  160. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  161. data/lib/puppet/provider/package/pkgng.rb +16 -4
  162. data/lib/puppet/provider/package/portage.rb +2 -2
  163. data/lib/puppet/provider/package/puppet_gem.rb +11 -2
  164. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  165. data/lib/puppet/provider/package/rpm.rb +6 -213
  166. data/lib/puppet/provider/package/yum.rb +101 -20
  167. data/lib/puppet/provider/package/zypper.rb +62 -1
  168. data/lib/puppet/provider/service/systemd.rb +22 -4
  169. data/lib/puppet/provider/service/windows.rb +23 -7
  170. data/lib/puppet/provider/user/aix.rb +1 -1
  171. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  172. data/lib/puppet/provider/user/useradd.rb +16 -5
  173. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  174. data/lib/puppet/reports/http.rb +15 -9
  175. data/lib/puppet/resource.rb +2 -1
  176. data/lib/puppet/resource/type.rb +10 -1
  177. data/lib/puppet/resource/type_collection.rb +20 -16
  178. data/lib/puppet/rest/route.rb +2 -2
  179. data/lib/puppet/runtime.rb +25 -2
  180. data/lib/puppet/settings.rb +20 -6
  181. data/lib/puppet/ssl.rb +1 -0
  182. data/lib/puppet/ssl/host.rb +4 -4
  183. data/lib/puppet/ssl/oids.rb +1 -0
  184. data/lib/puppet/ssl/ssl_context.rb +2 -2
  185. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  186. data/lib/puppet/ssl/state_machine.rb +79 -37
  187. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  188. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  189. data/lib/puppet/test/test_helper.rb +19 -14
  190. data/lib/puppet/transaction.rb +2 -2
  191. data/lib/puppet/transaction/persistence.rb +1 -1
  192. data/lib/puppet/transaction/report.rb +14 -10
  193. data/lib/puppet/trusted_external.rb +29 -1
  194. data/lib/puppet/type.rb +21 -8
  195. data/lib/puppet/type/file.rb +40 -15
  196. data/lib/puppet/type/file/checksum.rb +4 -4
  197. data/lib/puppet/type/file/source.rb +35 -13
  198. data/lib/puppet/type/filebucket.rb +1 -1
  199. data/lib/puppet/type/notify.rb +2 -2
  200. data/lib/puppet/type/package.rb +41 -3
  201. data/lib/puppet/type/service.rb +59 -8
  202. data/lib/puppet/type/user.rb +19 -29
  203. data/lib/puppet/util.rb +41 -3
  204. data/lib/puppet/util/at_fork.rb +1 -1
  205. data/lib/puppet/util/autoload.rb +13 -25
  206. data/lib/puppet/util/character_encoding.rb +9 -5
  207. data/lib/puppet/util/checksums.rb +19 -4
  208. data/lib/puppet/util/connection.rb +8 -8
  209. data/lib/puppet/util/execution.rb +2 -2
  210. data/lib/puppet/util/fileparsing.rb +2 -2
  211. data/lib/puppet/util/instance_loader.rb +14 -10
  212. data/lib/puppet/util/log/destinations.rb +1 -10
  213. data/lib/puppet/util/package/version/debian.rb +175 -0
  214. data/lib/puppet/util/package/version/gem.rb +15 -0
  215. data/lib/puppet/util/package/version/pip.rb +167 -0
  216. data/lib/puppet/util/package/version/range.rb +53 -0
  217. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  218. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  219. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  220. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  221. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  222. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  223. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  224. data/lib/puppet/util/package/version/rpm.rb +73 -0
  225. data/lib/puppet/util/pidlock.rb +13 -7
  226. data/lib/puppet/util/platform.rb +5 -0
  227. data/lib/puppet/util/provider_features.rb +1 -1
  228. data/lib/puppet/util/reference.rb +1 -1
  229. data/lib/puppet/util/rpm_compare.rb +193 -0
  230. data/lib/puppet/util/run_mode.rb +5 -1
  231. data/lib/puppet/util/windows.rb +1 -0
  232. data/lib/puppet/util/windows/adsi.rb +2 -2
  233. data/lib/puppet/util/windows/api_types.rb +60 -33
  234. data/lib/puppet/util/windows/eventlog.rb +1 -6
  235. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  236. data/lib/puppet/util/windows/principal.rb +8 -6
  237. data/lib/puppet/util/windows/process.rb +15 -14
  238. data/lib/puppet/util/windows/registry.rb +11 -11
  239. data/lib/puppet/util/windows/security.rb +5 -4
  240. data/lib/puppet/util/windows/service.rb +43 -26
  241. data/lib/puppet/util/windows/sid.rb +3 -3
  242. data/lib/puppet/util/windows/user.rb +242 -8
  243. data/lib/puppet/version.rb +1 -1
  244. data/locales/puppet.pot +627 -507
  245. data/man/man5/puppet.conf.5 +93 -20
  246. data/man/man8/puppet-agent.8 +7 -4
  247. data/man/man8/puppet-apply.8 +1 -1
  248. data/man/man8/puppet-catalog.8 +1 -1
  249. data/man/man8/puppet-config.8 +6 -6
  250. data/man/man8/puppet-describe.8 +1 -1
  251. data/man/man8/puppet-device.8 +1 -1
  252. data/man/man8/puppet-doc.8 +1 -1
  253. data/man/man8/puppet-epp.8 +1 -1
  254. data/man/man8/puppet-facts.8 +1 -1
  255. data/man/man8/puppet-filebucket.8 +1 -1
  256. data/man/man8/puppet-generate.8 +1 -1
  257. data/man/man8/puppet-help.8 +6 -3
  258. data/man/man8/puppet-key.8 +1 -1
  259. data/man/man8/puppet-lookup.8 +2 -2
  260. data/man/man8/puppet-man.8 +1 -1
  261. data/man/man8/puppet-module.8 +4 -1
  262. data/man/man8/puppet-node.8 +4 -4
  263. data/man/man8/puppet-parser.8 +1 -1
  264. data/man/man8/puppet-plugin.8 +1 -1
  265. data/man/man8/puppet-report.8 +1 -1
  266. data/man/man8/puppet-resource.8 +1 -1
  267. data/man/man8/puppet-script.8 +1 -1
  268. data/man/man8/puppet-ssl.8 +1 -1
  269. data/man/man8/puppet-status.8 +2 -2
  270. data/man/man8/puppet.8 +2 -2
  271. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  272. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  273. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  274. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  275. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  276. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  277. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  278. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  279. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  280. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  281. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  282. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  283. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  284. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  285. data/spec/integration/application/agent_spec.rb +479 -0
  286. data/spec/integration/application/apply_spec.rb +279 -150
  287. data/spec/integration/application/config_spec.rb +74 -0
  288. data/spec/integration/application/doc_spec.rb +16 -6
  289. data/spec/integration/application/filebucket_spec.rb +239 -0
  290. data/spec/integration/application/help_spec.rb +42 -0
  291. data/spec/integration/application/lookup_spec.rb +13 -0
  292. data/spec/integration/application/module_spec.rb +68 -0
  293. data/spec/integration/application/plugin_spec.rb +123 -0
  294. data/spec/integration/configurer_spec.rb +14 -0
  295. data/spec/integration/data_binding_spec.rb +82 -0
  296. data/spec/integration/defaults_spec.rb +27 -3
  297. data/spec/integration/directory_environments_spec.rb +17 -17
  298. data/spec/integration/http/client_spec.rb +39 -40
  299. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  300. data/spec/integration/indirector/report/yaml.rb +83 -0
  301. data/spec/integration/network/http_pool_spec.rb +84 -19
  302. data/spec/integration/node/environment_spec.rb +15 -0
  303. data/spec/integration/parser/compiler_spec.rb +11 -0
  304. data/spec/integration/type/file_spec.rb +1 -1
  305. data/spec/integration/util/execution_spec.rb +22 -0
  306. data/spec/integration/util/windows/adsi_spec.rb +8 -3
  307. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  308. data/spec/integration/util/windows/process_spec.rb +26 -32
  309. data/spec/integration/util/windows/registry_spec.rb +7 -7
  310. data/spec/integration/util/windows/user_spec.rb +47 -5
  311. data/spec/integration/util_spec.rb +7 -33
  312. data/spec/lib/puppet/test_ca.rb +2 -2
  313. data/spec/lib/puppet_spec/https.rb +16 -7
  314. data/spec/lib/puppet_spec/matchers.rb +0 -80
  315. data/spec/lib/puppet_spec/puppetserver.rb +127 -0
  316. data/spec/shared_contexts/https.rb +29 -0
  317. data/spec/shared_contexts/types_setup.rb +2 -0
  318. data/spec/unit/agent_spec.rb +80 -26
  319. data/spec/unit/application/agent_spec.rb +12 -9
  320. data/spec/unit/application/device_spec.rb +2 -2
  321. data/spec/unit/application/doc_spec.rb +2 -2
  322. data/spec/unit/application/face_base_spec.rb +6 -4
  323. data/spec/unit/application/facts_spec.rb +41 -10
  324. data/spec/unit/application/filebucket_spec.rb +22 -2
  325. data/spec/unit/application/man_spec.rb +52 -0
  326. data/spec/unit/application/resource_spec.rb +3 -1
  327. data/spec/unit/application/ssl_spec.rb +15 -2
  328. data/spec/unit/application_spec.rb +9 -4
  329. data/spec/unit/configurer/downloader_spec.rb +10 -0
  330. data/spec/unit/configurer/fact_handler_spec.rb +4 -4
  331. data/spec/unit/configurer_spec.rb +87 -38
  332. data/spec/unit/confine_spec.rb +2 -1
  333. data/spec/unit/context/trusted_information_spec.rb +25 -2
  334. data/spec/unit/daemon_spec.rb +5 -64
  335. data/spec/unit/defaults_spec.rb +24 -1
  336. data/spec/unit/environments_spec.rb +107 -32
  337. data/spec/unit/face/config_spec.rb +59 -1
  338. data/spec/unit/face/module/search_spec.rb +17 -0
  339. data/spec/unit/face/node_spec.rb +2 -2
  340. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  341. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  342. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  343. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  344. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  345. data/spec/unit/file_system/uniquefile_spec.rb +29 -0
  346. data/spec/unit/file_system_spec.rb +11 -2
  347. data/spec/unit/http/client_spec.rb +173 -59
  348. data/spec/unit/http/external_client_spec.rb +201 -0
  349. data/spec/unit/http/resolver_spec.rb +44 -5
  350. data/spec/unit/http/response_spec.rb +6 -0
  351. data/spec/unit/http/service/ca_spec.rb +27 -5
  352. data/spec/unit/http/service/compiler_spec.rb +186 -9
  353. data/spec/unit/http/service/file_server_spec.rb +37 -6
  354. data/spec/unit/http/service/puppetserver_spec.rb +82 -0
  355. data/spec/unit/http/service/report_spec.rb +5 -4
  356. data/spec/unit/http/service_spec.rb +3 -4
  357. data/spec/unit/http/session_spec.rb +48 -12
  358. data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
  359. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  360. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  361. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  362. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  363. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  364. data/spec/unit/indirector/file_metadata/rest_spec.rb +15 -14
  365. data/spec/unit/indirector/json_spec.rb +8 -8
  366. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  367. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  368. data/spec/unit/indirector/request_spec.rb +5 -5
  369. data/spec/unit/indirector/rest_spec.rb +14 -1
  370. data/spec/unit/indirector/status/rest_spec.rb +1 -1
  371. data/spec/unit/indirector/yaml_spec.rb +7 -7
  372. data/spec/unit/interface_spec.rb +3 -3
  373. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  374. data/spec/unit/network/format_support_spec.rb +3 -2
  375. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  376. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  377. data/spec/unit/network/http/connection_spec.rb +552 -190
  378. data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
  379. data/spec/unit/network/http/pool_spec.rb +3 -3
  380. data/spec/unit/network/http_pool_spec.rb +63 -57
  381. data/spec/unit/network/http_spec.rb +1 -1
  382. data/spec/unit/node/environment_spec.rb +33 -0
  383. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  384. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  385. data/spec/unit/parser/scope_spec.rb +1 -1
  386. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  387. data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
  388. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  389. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  390. data/spec/unit/provider/exec_spec.rb +4 -3
  391. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  392. data/spec/unit/provider/package/aix_spec.rb +29 -0
  393. data/spec/unit/provider/package/apt_spec.rb +107 -0
  394. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  395. data/spec/unit/provider/package/dnfmodule_spec.rb +54 -15
  396. data/spec/unit/provider/package/dpkg_spec.rb +22 -7
  397. data/spec/unit/provider/package/gem_spec.rb +40 -0
  398. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  399. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  400. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  401. data/spec/unit/provider/package/pip_spec.rb +68 -19
  402. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  403. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  404. data/spec/unit/provider/package/portage_spec.rb +5 -0
  405. data/spec/unit/provider/package/puppet_gem_spec.rb +12 -1
  406. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  407. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  408. data/spec/unit/provider/package/yum_spec.rb +274 -1
  409. data/spec/unit/provider/package/zypper_spec.rb +98 -0
  410. data/spec/unit/provider/service/base_spec.rb +2 -4
  411. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  412. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  413. data/spec/unit/provider/service/debian_spec.rb +3 -5
  414. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  415. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  416. data/spec/unit/provider/service/init_spec.rb +46 -5
  417. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  418. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  419. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  420. data/spec/unit/provider/service/openwrt_spec.rb +2 -1
  421. data/spec/unit/provider/service/redhat_spec.rb +10 -1
  422. data/spec/unit/provider/service/runit_spec.rb +2 -1
  423. data/spec/unit/provider/service/smf_spec.rb +1 -1
  424. data/spec/unit/provider/service/src_spec.rb +3 -5
  425. data/spec/unit/provider/service/systemd_spec.rb +95 -18
  426. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  427. data/spec/unit/provider/service/windows_spec.rb +50 -14
  428. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  429. data/spec/unit/provider/user/useradd_spec.rb +30 -16
  430. data/spec/unit/provider/user/windows_adsi_spec.rb +85 -3
  431. data/spec/unit/puppet_pal_2pec.rb +11 -0
  432. data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
  433. data/spec/unit/puppet_spec.rb +33 -0
  434. data/spec/unit/reports/http_spec.rb +70 -52
  435. data/spec/unit/reports/store_spec.rb +17 -13
  436. data/spec/unit/resource_spec.rb +3 -3
  437. data/spec/unit/rest/route_spec.rb +4 -4
  438. data/spec/unit/settings_spec.rb +44 -22
  439. data/spec/unit/ssl/host_spec.rb +4 -2
  440. data/spec/unit/ssl/oids_spec.rb +1 -0
  441. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  442. data/spec/unit/ssl/state_machine_spec.rb +90 -14
  443. data/spec/unit/test/test_helper_spec.rb +17 -0
  444. data/spec/unit/transaction/persistence_spec.rb +15 -0
  445. data/spec/unit/transaction/report_spec.rb +7 -1
  446. data/spec/unit/type/file/source_spec.rb +4 -4
  447. data/spec/unit/type/file_spec.rb +122 -96
  448. data/spec/unit/type/filebucket_spec.rb +1 -1
  449. data/spec/unit/type/service_spec.rb +218 -8
  450. data/spec/unit/type/user_spec.rb +32 -3
  451. data/spec/unit/type_spec.rb +50 -0
  452. data/spec/unit/util/at_fork_spec.rb +2 -2
  453. data/spec/unit/util/autoload_spec.rb +2 -1
  454. data/spec/unit/util/character_encoding_spec.rb +4 -4
  455. data/spec/unit/util/checksums_spec.rb +16 -0
  456. data/spec/unit/util/command_line_spec.rb +11 -6
  457. data/spec/unit/util/log/destinations_spec.rb +1 -29
  458. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  459. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  460. data/spec/unit/util/package/version/range_spec.rb +175 -0
  461. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  462. data/spec/unit/util/pidlock_spec.rb +83 -47
  463. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  464. data/spec/unit/util/run_mode_spec.rb +6 -6
  465. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  466. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  467. data/spec/unit/util/windows/service_spec.rb +4 -4
  468. data/spec/unit/util/windows/sid_spec.rb +2 -2
  469. data/spec/unit/util_spec.rb +3 -3
  470. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  471. data/tasks/generate_cert_fixtures.rake +15 -1
  472. data/tasks/manpages.rake +5 -35
  473. metadata +90 -51
  474. data/spec/integration/faces/config_spec.rb +0 -91
  475. data/spec/integration/faces/documentation_spec.rb +0 -57
  476. data/spec/integration/faces/plugin_spec.rb +0 -63
  477. data/spec/integration/file_bucket/file_spec.rb +0 -50
  478. data/spec/integration/file_serving/content_spec.rb +0 -7
  479. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  480. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  481. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  482. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  483. data/spec/integration/module_tool/forge_spec.rb +0 -64
  484. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  485. data/spec/integration/provider/service/init_spec.rb +0 -48
  486. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  487. data/spec/integration/provider/service/windows_spec.rb +0 -50
  488. data/spec/integration/reference/providers_spec.rb +0 -21
  489. data/spec/integration/reports_spec.rb +0 -13
  490. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  491. data/spec/integration/ssl/host_spec.rb +0 -72
  492. data/spec/integration/ssl/key_spec.rb +0 -99
  493. data/spec/integration/test/test_helper_spec.rb +0 -31
  494. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  495. data/spec/unit/face/man_spec.rb +0 -25
  496. data/spec/unit/man_spec.rb +0 -31
@@ -0,0 +1,180 @@
1
+ unless Puppet::Util::Platform.jruby_fips?
2
+ require 'rubygems/commands/list_command'
3
+ end
4
+ require 'stringio'
5
+ require 'uri'
6
+
7
+ # Ruby gems support.
8
+ Puppet::Type.type(:package).provide :puppetserver_gem, :parent => :gem do
9
+ desc "Puppet Server Ruby Gem support. If a URL is passed via `source`, then
10
+ that URL is appended to the list of remote gem repositories which by default
11
+ contains rubygems.org; To ensure that only the specified source is used also
12
+ pass `--clear-sources` in via `install_options`; if a source is present but
13
+ is not a valid URL, it will be interpreted as the path to a local gem file.
14
+ If source is not present at all, the gem will be installed from the default
15
+ gem repositories."
16
+
17
+ has_feature :versionable, :install_options, :uninstall_options
18
+
19
+ confine :feature => :hocon
20
+ # see SERVER-2578
21
+ confine :fips_enabled => false
22
+
23
+ # Define the default provider package command name, as the parent 'gem' provider is targetable.
24
+ # Required by Puppet::Provider::Package::Targetable::resource_or_provider_command
25
+
26
+ def self.provider_command
27
+ command(:puppetservercmd)
28
+ end
29
+
30
+ # The gem command uses HOME to locate a gemrc file.
31
+ # CommandDefiner in provider.rb will set failonfail, combine, and environment.
32
+
33
+ has_command(:puppetservercmd, '/opt/puppetlabs/bin/puppetserver') do
34
+ environment(HOME: ENV['HOME'])
35
+ end
36
+
37
+ def self.gemlist(options)
38
+ command_options = ['gem', 'list']
39
+
40
+ if options[:local]
41
+ command_options << '--local'
42
+ else
43
+ command_options << '--remote'
44
+ end
45
+
46
+ if options[:source]
47
+ command_options << '--source' << options[:source]
48
+ end
49
+
50
+ if options[:justme]
51
+ gem_regex = '\A' + options[:justme] + '\z'
52
+ command_options << gem_regex
53
+ end
54
+
55
+ if options[:local]
56
+ list = execute_rubygems_list_command(gem_regex)
57
+ else
58
+ begin
59
+ list = puppetservercmd(command_options)
60
+ rescue Puppet::ExecutionFailure => detail
61
+ raise Puppet::Error, _("Could not list gems: %{detail}") % { detail: detail }, detail.backtrace
62
+ end
63
+ end
64
+
65
+ # When `/tmp` is mounted `noexec`, `puppetserver gem list` will output:
66
+ # *** LOCAL GEMS ***
67
+ # causing gemsplit to output:
68
+ # Warning: Could not match *** LOCAL GEMS ***
69
+ gem_list = list
70
+ .lines
71
+ .select { |x| x =~ /^(\S+)\s+\((.+)\)/ }
72
+ .map { |set| gemsplit(set) }
73
+
74
+ if options[:justme]
75
+ return gem_list.shift
76
+ else
77
+ return gem_list
78
+ end
79
+ end
80
+
81
+ def install(useversion = true)
82
+ command_options = ['gem', 'install']
83
+ command_options += install_options if resource[:install_options]
84
+
85
+ command_options << '-v' << resource[:ensure] if (!resource[:ensure].is_a? Symbol) && useversion
86
+
87
+ command_options << '--no-document'
88
+
89
+ if resource[:source]
90
+ begin
91
+ uri = URI.parse(resource[:source])
92
+ rescue => detail
93
+ self.fail Puppet::Error, _("Invalid source '%{uri}': %{detail}") % { uri: uri, detail: detail }, detail
94
+ end
95
+
96
+ case uri.scheme
97
+ when nil
98
+ # no URI scheme => interpret the source as a local file
99
+ command_options << resource[:source]
100
+ when /file/i
101
+ command_options << uri.path
102
+ when 'puppet'
103
+ # we don't support puppet:// URLs (yet)
104
+ raise Puppet::Error.new(_('puppet:// URLs are not supported as gem sources'))
105
+ else
106
+ # interpret it as a gem repository
107
+ command_options << '--source' << "#{resource[:source]}" << resource[:name]
108
+ end
109
+ else
110
+ command_options << resource[:name]
111
+ end
112
+
113
+ output = puppetservercmd(command_options)
114
+ # Apparently, some gem versions don't exit non-0 on failure.
115
+ self.fail _("Could not install: %{output}") % { output: output.chomp } if output.include?('ERROR')
116
+ end
117
+
118
+ def uninstall
119
+ command_options = ['gem', 'uninstall']
120
+ command_options << '--executables' << '--all' << resource[:name]
121
+ command_options += uninstall_options if resource[:uninstall_options]
122
+
123
+ output = puppetservercmd(command_options)
124
+ # Apparently, some gem versions don't exit non-0 on failure.
125
+ self.fail _("Could not uninstall: %{output}") % { output: output.chomp } if output.include?('ERROR')
126
+ end
127
+
128
+ private
129
+
130
+ # The puppetserver gem cli command is very slow, since it starts a JVM.
131
+ #
132
+ # Instead, for the list subcommand (which is executed with every puppet run),
133
+ # use the rubygems library from puppet ruby: setting GEM_HOME and GEM_PATH
134
+ # to the default values, or the values in the puppetserver configuration file.
135
+ #
136
+ # The rubygems library cannot access java platform gems,
137
+ # for example: json (1.8.3 java)
138
+ # but java platform gems should not be managed by this (or any) provider.
139
+
140
+ def self.execute_rubygems_list_command(gem_regex)
141
+ puppetserver_default_gem_home = '/opt/puppetlabs/server/data/puppetserver/jruby-gems'
142
+ puppetserver_default_vendored_jruby_gems = '/opt/puppetlabs/server/data/puppetserver/vendored-jruby-gems'
143
+ puppet_default_vendor_gems = '/opt/puppetlabs/puppet/lib/ruby/vendor_gems'
144
+ puppetserver_default_gem_path = [puppetserver_default_gem_home, puppetserver_default_vendored_jruby_gems, puppet_default_vendor_gems].join(':')
145
+
146
+ pe_puppetserver_conf_file = '/etc/puppetlabs/puppetserver/conf.d/pe-puppet-server.conf'
147
+ os_puppetserver_conf_file = '/etc/puppetlabs/puppetserver/puppetserver.conf'
148
+ puppetserver_conf_file = Facter.value(:pe_server_version) ? pe_puppetserver_conf_file : os_puppetserver_conf_file
149
+ puppetserver_conf = Hocon.load(puppetserver_conf_file)
150
+
151
+ gem_env = {}
152
+ if puppetserver_conf.empty? || puppetserver_conf.key?('jruby-puppet') == false
153
+ gem_env['GEM_HOME'] = puppetserver_default_gem_home
154
+ gem_env['GEM_PATH'] = puppetserver_default_gem_path
155
+ else
156
+ gem_env['GEM_HOME'] = puppetserver_conf['jruby-puppet'].key?('gem-home') ? puppetserver_conf['jruby-puppet']['gem-home'] : puppetserver_default_gem_home
157
+ gem_env['GEM_PATH'] = puppetserver_conf['jruby-puppet'].key?('gem-path') ? puppetserver_conf['jruby-puppet']['gem-path'].join(':') : puppetserver_default_gem_path
158
+ end
159
+ gem_env['GEM_SPEC_CACHE'] = "/tmp/#{$$}"
160
+ Gem.paths = gem_env
161
+
162
+ sio_inn = StringIO.new
163
+ sio_out = StringIO.new
164
+ sio_err = StringIO.new
165
+ stream_ui = Gem::StreamUI.new(sio_inn, sio_out, sio_err, false)
166
+ gem_list_cmd = Gem::Commands::ListCommand.new
167
+ gem_list_cmd.options[:domain] = :local
168
+ gem_list_cmd.options[:args] = [gem_regex] if gem_regex
169
+ gem_list_cmd.ui = stream_ui
170
+ gem_list_cmd.execute
171
+
172
+ # There is no method exclude default gems from the local gem list,
173
+ # for example: psych (default: 2.2.2)
174
+ # but default gems should not be managed by this (or any) provider.
175
+ gem_list = sio_out.string.lines.reject { |gem| gem =~ / \(default\: / }
176
+ gem_list.join("\n")
177
+ ensure
178
+ Gem.clear_paths
179
+ end
180
+ end
@@ -1,13 +1,17 @@
1
1
  require 'puppet/provider/package'
2
+ require 'puppet/util/rpm_compare'
2
3
 
3
4
  # RPM packaging. Should work anywhere that has rpm installed.
4
5
  Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Provider::Package do
6
+ # provides Rpm parsing and comparison
7
+ include Puppet::Util::RpmCompare
8
+
5
9
  desc "RPM packaging support; should work anywhere with a working `rpm`
6
10
  binary.
7
11
 
8
12
  This provider supports the `install_options` and `uninstall_options`
9
13
  attributes, which allow command-line flags to be passed to rpm.
10
- These options should be specified as an array where each element is either a string or a hash."
14
+ These options should be specified as an array where each element is either a string or a hash."
11
15
 
12
16
  has_feature :versionable
13
17
  has_feature :install_options
@@ -23,31 +27,6 @@ These options should be specified as an array where each element is either a str
23
27
  self::NEVRA_FIELDS = [:name, :epoch, :version, :release, :arch]
24
28
  self::MULTIVERSION_SEPARATOR = "; "
25
29
 
26
- ARCH_LIST = [
27
- 'noarch',
28
- 'i386',
29
- 'i686',
30
- 'ppc',
31
- 'ppc64',
32
- 'armv3l',
33
- 'armv4b',
34
- 'armv4l',
35
- 'armv4tl',
36
- 'armv5tel',
37
- 'armv5tejl',
38
- 'armv6l',
39
- 'armv7l',
40
- 'm68kmint',
41
- 's390',
42
- 's390x',
43
- 'ia64',
44
- 'x86_64',
45
- 'sh3',
46
- 'sh4',
47
- ]
48
-
49
- ARCH_REGEX = Regexp.new(ARCH_LIST.join('|\.'))
50
-
51
30
  commands :rpm => "rpm"
52
31
 
53
32
  if command('rpm')
@@ -204,200 +183,14 @@ These options should be specified as an array where each element is either a str
204
183
  join_options(resource[:uninstall_options])
205
184
  end
206
185
 
207
- # This is an attempt at implementing RPM's
208
- # lib/rpmvercmp.c rpmvercmp(a, b) in Ruby.
209
- #
210
- # Some of the things in here look REALLY
211
- # UGLY and/or arbitrary. Our goal is to
212
- # match how RPM compares versions, quirks
213
- # and all.
214
- #
215
- # I've kept a lot of C-like string processing
216
- # in an effort to keep this as identical to RPM
217
- # as possible.
218
- #
219
- # returns 1 if str1 is newer than str2,
220
- # 0 if they are identical
221
- # -1 if str1 is older than str2
222
- def rpmvercmp(str1, str2)
223
- return 0 if str1 == str2
224
-
225
- front_strip_re = /^[^A-Za-z0-9~]+/
226
-
227
- while str1.length > 0 or str2.length > 0
228
- # trim anything that's in front_strip_re and != '~' off the beginning of each string
229
- str1 = str1.gsub(front_strip_re, '')
230
- str2 = str2.gsub(front_strip_re, '')
231
-
232
- # "handle the tilde separator, it sorts before everything else"
233
- if str1 =~ /^~/ && str2 =~ /^~/
234
- # if they both have ~, strip it
235
- str1 = str1[1..-1]
236
- str2 = str2[1..-1]
237
- next
238
- elsif str1 =~ /^~/
239
- return -1
240
- elsif str2 =~ /^~/
241
- return 1
242
- end
243
-
244
- break if str1.length == 0 or str2.length == 0
245
-
246
- # "grab first completely alpha or completely numeric segment"
247
- isnum = false
248
- # if the first char of str1 is a digit, grab the chunk of continuous digits from each string
249
- if str1 =~ /^[0-9]+/
250
- if str1 =~ /^[0-9]+/
251
- segment1 = $~.to_s
252
- str1 = $~.post_match
253
- else
254
- segment1 = ''
255
- end
256
- if str2 =~ /^[0-9]+/
257
- segment2 = $~.to_s
258
- str2 = $~.post_match
259
- else
260
- segment2 = ''
261
- end
262
- isnum = true
263
- # else grab the chunk of continuous alphas from each string (which may be '')
264
- else
265
- if str1 =~ /^[A-Za-z]+/
266
- segment1 = $~.to_s
267
- str1 = $~.post_match
268
- else
269
- segment1 = ''
270
- end
271
- if str2 =~ /^[A-Za-z]+/
272
- segment2 = $~.to_s
273
- str2 = $~.post_match
274
- else
275
- segment2 = ''
276
- end
277
- end
278
-
279
- # if the segments we just grabbed from the strings are different types (i.e. one numeric one alpha),
280
- # where alpha also includes ''; "numeric segments are always newer than alpha segments"
281
- if segment2.length == 0
282
- return 1 if isnum
283
- return -1
284
- end
285
-
286
- if isnum
287
- # "throw away any leading zeros - it's a number, right?"
288
- segment1 = segment1.gsub(/^0+/, '')
289
- segment2 = segment2.gsub(/^0+/, '')
290
- # "whichever number has more digits wins"
291
- return 1 if segment1.length > segment2.length
292
- return -1 if segment1.length < segment2.length
293
- end
294
-
295
- # "strcmp will return which one is greater - even if the two segments are alpha
296
- # or if they are numeric. don't return if they are equal because there might
297
- # be more segments to compare"
298
- rc = segment1 <=> segment2
299
- return rc if rc != 0
300
- end #end while loop
301
-
302
- # if we haven't returned anything yet, "whichever version still has characters left over wins"
303
- if str1.length > str2.length
304
- return 1
305
- elsif str1.length < str2.length
306
- return -1
307
- else
308
- return 0
309
- end
310
- end
311
-
312
186
  def insync?(is)
313
187
  return false if [:purged, :absent].include?(is)
314
188
  return false if is.include?(self.class::MULTIVERSION_SEPARATOR) && !@resource[:install_only]
315
189
 
316
190
  should = resource[:ensure]
317
191
  is.split(self.class::MULTIVERSION_SEPARATOR).any? do |version|
318
- 0 == self.rpm_compareEVR(rpm_parse_evr(should), rpm_parse_evr(version))
319
- end
320
- end
321
-
322
- # parse a rpm "version" specification
323
- # this re-implements rpm's
324
- # rpmUtils.miscutils.stringToVersion() in ruby
325
- def rpm_parse_evr(s)
326
- ei = s.index(':')
327
- if ei
328
- e = s[0,ei]
329
- s = s[ei+1,s.length]
330
- else
331
- e = nil
332
- end
333
- begin
334
- e = String(Integer(e))
335
- rescue
336
- # If there are non-digits in the epoch field, default to nil
337
- e = nil
338
- end
339
- ri = s.index('-')
340
- if ri
341
- v = s[0,ri]
342
- r = s[ri+1,s.length]
343
- arch = r.scan(ARCH_REGEX)[0]
344
- if arch
345
- a = arch.delete('.')
346
- r.gsub!(ARCH_REGEX, '')
347
- end
348
- else
349
- v = s
350
- r = nil
351
- end
352
- return { :epoch => e, :version => v, :release => r, :arch => a }
353
- end
354
-
355
- # how rpm compares two package versions:
356
- # rpmUtils.miscutils.compareEVR(), which massages data types and then calls
357
- # rpm.labelCompare(), found in rpm.git/python/header-py.c, which
358
- # sets epoch to 0 if null, then compares epoch, then ver, then rel
359
- # using compare_values() and returns the first non-0 result, else 0.
360
- # This function combines the logic of compareEVR() and labelCompare().
361
- #
362
- # "version_should" can be v, v-r, or e:v-r.
363
- # "version_is" will always be at least v-r, can be e:v-r
364
- def rpm_compareEVR(should_hash, is_hash)
365
- # pass on to rpm labelCompare
366
-
367
- if !should_hash[:epoch].nil?
368
- rc = compare_values(should_hash[:epoch], is_hash[:epoch])
369
- return rc unless rc == 0
370
- end
371
-
372
- rc = compare_values(should_hash[:version], is_hash[:version])
373
- return rc unless rc == 0
374
-
375
- # here is our special case, PUP-1244.
376
- # if should_hash[:release] is nil (not specified by the user),
377
- # and comparisons up to here are equal, return equal. We need to
378
- # evaluate to whatever level of detail the user specified, so we
379
- # don't end up upgrading or *downgrading* when not intended.
380
- #
381
- # This should NOT be triggered if we're trying to ensure latest.
382
- return 0 if should_hash[:release].nil?
383
-
384
- rc = compare_values(should_hash[:release], is_hash[:release])
385
-
386
- return rc
387
- end
388
-
389
- # this method is a native implementation of the
390
- # compare_values function in rpm's python bindings,
391
- # found in python/header-py.c, as used by rpm.
392
- def compare_values(s1, s2)
393
- if s1.nil? && s2.nil?
394
- return 0
395
- elsif ( not s1.nil? ) && s2.nil?
396
- return 1
397
- elsif s1.nil? && (not s2.nil?)
398
- return -1
192
+ 0 == rpm_compareEVR(should, version)
399
193
  end
400
- return rpmvercmp(s1, s2)
401
194
  end
402
195
 
403
196
  private
@@ -1,4 +1,11 @@
1
+ require 'puppet/util/package/version/range'
2
+ require 'puppet/util/package/version/rpm'
3
+ require 'puppet/util/rpm_compare'
4
+
1
5
  Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm do
6
+ # provides Rpm parsing and comparison
7
+ include Puppet::Util::RpmCompare
8
+
2
9
  desc "Support via `yum`.
3
10
 
4
11
  Using this provider's `uninstallable` feature will not remove dependent packages. To
@@ -10,6 +17,9 @@ Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm do
10
17
 
11
18
  has_feature :install_options, :versionable, :virtual_packages, :install_only
12
19
 
20
+ RPM_VERSION = Puppet::Util::Package::Version::Rpm
21
+ RPM_VERSION_RANGE = Puppet::Util::Package::Version::Range
22
+
13
23
  commands :cmd => "yum", :rpm => "rpm"
14
24
 
15
25
  if command('rpm')
@@ -25,6 +35,36 @@ Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm do
25
35
  defaultfor :operatingsystem => :amazon
26
36
  defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
27
37
 
38
+ def insync?(is)
39
+ return false if [:purged, :absent].include?(is)
40
+ return false if is.include?(self.class::MULTIVERSION_SEPARATOR) && !@resource[:install_only]
41
+
42
+ should = @resource[:ensure]
43
+ if should.is_a?(String)
44
+ begin
45
+ should_version = RPM_VERSION_RANGE.parse(should, RPM_VERSION)
46
+
47
+ if should_version.is_a?(RPM_VERSION_RANGE::Eq)
48
+ return super
49
+ end
50
+ rescue RPM_VERSION_RANGE::ValidationFailure, RPM_VERSION::ValidationFailure
51
+ Puppet.debug("Cannot parse #{should} as a RPM version range")
52
+ return super
53
+ end
54
+
55
+ is.split(self.class::MULTIVERSION_SEPARATOR).any? do |version|
56
+ begin
57
+ is_version = RPM_VERSION.parse(version)
58
+ should_version.include?(is_version)
59
+ rescue RPM_VERSION::ValidationFailure
60
+ Puppet.debug("Cannot parse #{is} as a RPM version")
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ VERSION_REGEX = /^(?:(\d+):)?(\S+)-(\S+)$/
67
+
28
68
  def self.prefetch(packages)
29
69
  raise Puppet::Error, _("The yum provider can only be used as root") if Process.euid != 0
30
70
  super
@@ -86,23 +126,24 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
86
126
  end
87
127
 
88
128
  def self.parse_updates(str)
89
- # Strip off all content before the first blank line
90
- body = str.partition(/^\s*\n/m).last
129
+ # Strip off all content that contains Obsoleting, Security: or Update
130
+ body = str.partition(/^(Obsoleting|Security:|Update)/).first
91
131
 
92
132
  updates = Hash.new { |h, k| h[k] = [] }
93
- body.split.each_slice(3) do |tuple|
94
- break if tuple[0] =~ /^(Obsoleting|Security:|Update)/
95
- break unless tuple[1] =~ /^(?:(\d+):)?(\S+)-(\S+)$/
96
- hash = update_to_hash(*tuple[0..1])
97
- # Create entries for both the package name without a version and a
98
- # version since yum considers those as mostly interchangeable.
99
- short_name = hash[:name]
100
- long_name = "#{hash[:name]}.#{hash[:arch]}"
101
-
102
- updates[short_name] << hash
103
- updates[long_name] << hash
104
- end
105
133
 
134
+ body.split(/^\s*\n/).each do |line|
135
+ line.split.each_slice(3) do |tuple|
136
+ next unless tuple[0].include?('.') && tuple[1] =~ VERSION_REGEX
137
+
138
+ hash = update_to_hash(*tuple[0..1])
139
+ # Create entries for both the package name without a version and a
140
+ # version since yum considers those as mostly interchangeable.
141
+ short_name = hash[:name]
142
+ long_name = "#{hash[:name]}.#{hash[:arch]}"
143
+ updates[short_name] << hash
144
+ updates[long_name] << hash
145
+ end
146
+ end
106
147
  updates
107
148
  end
108
149
 
@@ -117,7 +158,7 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
117
158
  raise _("Failed to parse package name and architecture from '%{pkgname}'") % { pkgname: pkgname }
118
159
  end
119
160
 
120
- match = pkgversion.match(/^(?:(\d+):)?(\S+)-(\S+)$/)
161
+ match = pkgversion.match(VERSION_REGEX)
121
162
  epoch = match[1] || '0'
122
163
  version = match[2]
123
164
  release = match[3]
@@ -151,6 +192,44 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
151
192
  'update'
152
193
  end
153
194
 
195
+ def best_version(should)
196
+ if should.is_a?(String)
197
+ begin
198
+ should_range = RPM_VERSION_RANGE.parse(should, RPM_VERSION)
199
+ if should_range.is_a?(RPM_VERSION_RANGE::Eq)
200
+ return should
201
+ end
202
+ rescue RPM_VERSION_RANGE::ValidationFailure, RPM_VERSION::ValidationFailure
203
+ Puppet.debug("Cannot parse #{should} as a RPM version range")
204
+ return should
205
+ end
206
+ sorted_versions = SortedSet.new
207
+ available_versions(@resource[:name]).each do |version|
208
+ begin
209
+ rpm_version = RPM_VERSION.parse(version)
210
+ sorted_versions << rpm_version if should_range.include?(rpm_version)
211
+ rescue RPM_VERSION::ValidationFailure
212
+ Puppet.debug("Cannot parse #{version} as a RPM version")
213
+ end
214
+ end
215
+
216
+ version = sorted_versions.entries.last
217
+
218
+ if version
219
+ version = version.to_s.sub(/^\d+:/, '')
220
+ return version
221
+ end
222
+
223
+ Puppet.debug("No available version for package #{@resource[:name]} is included in range #{should_range}")
224
+ should
225
+ end
226
+ end
227
+
228
+ def available_versions(package_name)
229
+ output = execute("yum list #{package_name} --showduplicates | sed -e '1,/Available Packages/ d' | awk '{print $2}'")
230
+ output.split("\n")
231
+ end
232
+
154
233
  def install
155
234
  wanted = @resource[:name]
156
235
  error_level = self.class.error_level
@@ -195,10 +274,11 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
195
274
  self.debug "Installing directly from #{wanted}"
196
275
  else
197
276
  # No explicit source was specified, so add the package version
277
+ should = best_version(should)
198
278
  wanted += "-#{should}"
199
- if wanted.scan(ARCH_REGEX)
279
+ if wanted.scan(self.class::ARCH_REGEX)
200
280
  self.debug "Detected Arch argument in package! - Moving arch to end of version string"
201
- wanted.gsub!(/(.+)(#{ARCH_REGEX})(.+)/,'\1\3\2')
281
+ wanted.gsub!(/(.+)(#{self.class::ARCH_REGEX})(.+)/,'\1\3\2')
202
282
  end
203
283
  end
204
284
  current_package = self.query
@@ -206,10 +286,10 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
206
286
  if @resource[:install_only]
207
287
  self.debug "Updating package #{@resource[:name]} from version #{current_package[:ensure]} to #{should} as install_only packages are never downgraded"
208
288
  operation = update_command
209
- elsif rpm_compareEVR(rpm_parse_evr(should), rpm_parse_evr(current_package[:ensure])) < 0
289
+ elsif rpm_compareEVR(should, current_package[:ensure]) < 0
210
290
  self.debug "Downgrading package #{@resource[:name]} from version #{current_package[:ensure]} to #{should}"
211
291
  operation = :downgrade
212
- elsif rpm_compareEVR(rpm_parse_evr(should), rpm_parse_evr(current_package[:ensure])) > 0
292
+ elsif rpm_compareEVR(should, current_package[:ensure]) > 0
213
293
  self.debug "Upgrading package #{@resource[:name]} from version #{current_package[:ensure]} to #{should}"
214
294
  operation = update_command
215
295
  end
@@ -222,7 +302,7 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
222
302
  command = [command(:cmd)] + no_debug + ["-e", error_level, "-y", install_options, operation, wanted].compact
223
303
  output = execute(command)
224
304
 
225
- if output =~ /^No package #{wanted} available\.$/
305
+ if output.to_s =~ /^No package #{wanted} available\.$/
226
306
  raise Puppet::Error, _("Could not find package %{wanted}") % { wanted: wanted }
227
307
  end
228
308
 
@@ -248,6 +328,7 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
248
328
  return "#{upd[:epoch]}:#{upd[:version]}-#{upd[:release]}"
249
329
  else
250
330
  # Yum didn't find updates, pretend the current version is the latest
331
+ self.debug "Yum didn't find updates, current version (#{properties[:ensure]}) is the latest"
251
332
  version = properties[:ensure]
252
333
  raise Puppet::DevError, _("Tried to get latest on a missing package") if version == :absent || version == :purged
253
334
  return version