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
@@ -31,6 +31,7 @@ class ValidatorFactory_4_0 < Factory
31
31
  p[Issues::RT_NO_STORECONFIGS] = Puppet[:storeconfigs] ? :ignore : :warning
32
32
 
33
33
  p[Issues::FUTURE_RESERVED_WORD] = :deprecation
34
+ p[Issues::DEPRECATED_APP_ORCHESTRATION] = :deprecation
34
35
 
35
36
  p[Issues::DUPLICATE_KEY] = Puppet[:strict] == :off ? :ignore : Puppet[:strict]
36
37
  p[Issues::NAME_WITH_HYPHEN] = :error
@@ -126,7 +126,7 @@ Puppet::Type.type(:file).provide :windows do
126
126
  # If the SYSTEM account does _not_ have FullControl in this scenario, we should
127
127
  # force the resource out of sync no matter what.
128
128
  #TRANSLATORS 'SYSTEM' is a Windows name and should not be translated
129
- Puppet.debug _("%{resource_name}: %{mode_part_type} set to SYSTEM. SYSTEM permissions cannot be set below FullControl ('7')") % { resource_name: resource[:name], mode_part_type: mode_part['type']}
129
+ Puppet.debug { _("%{resource_name}: %{mode_part_type} set to SYSTEM. SYSTEM permissions cannot be set below FullControl ('7')") % { resource_name: resource[:name], mode_part_type: mode_part['type']} }
130
130
  return nil
131
131
  end
132
132
  end
@@ -24,7 +24,7 @@ Puppet::Type.type(:group).provide :windows_adsi do
24
24
  # since the default array_matching comparison is not commutative
25
25
 
26
26
  # dupes automatically weeded out when hashes built
27
- current_members = Puppet::Util::Windows::ADSI::Group.name_sid_hash(current)
27
+ current_members = Puppet::Util::Windows::ADSI::Group.name_sid_hash(current, true)
28
28
  specified_members = Puppet::Util::Windows::ADSI::Group.name_sid_hash(should)
29
29
 
30
30
  current_sids = current_members.keys.to_a
@@ -52,7 +52,7 @@ Puppet::Type.type(:group).provide :windows_adsi do
52
52
  account = sid.account
53
53
  end
54
54
  resource.debug("#{sid.domain}\\#{account} (#{sid.sid})")
55
- "#{sid.domain}\\#{account}"
55
+ sid.domain ? "#{sid.domain}\\#{account}" : account
56
56
  end
57
57
  return users.join(',')
58
58
  end
@@ -66,7 +66,7 @@ Puppet::Type.type(:group).provide :windows_adsi do
66
66
  end
67
67
 
68
68
  def members
69
- @members ||= Puppet::Util::Windows::ADSI::Group.name_sid_hash(group.members)
69
+ @members ||= Puppet::Util::Windows::ADSI::Group.name_sid_hash(group.members, true)
70
70
 
71
71
  # @members.keys returns an array of SIDs. We need to convert those SIDs into
72
72
  # names so that `puppet resource` prints the right output.
@@ -29,6 +29,15 @@ Puppet::Type.type(:package).provide :aix, :parent => Puppet::Provider::Package d
29
29
 
30
30
  attr_accessor :latest_info
31
31
 
32
+ STATE_CODE = {
33
+ 'A' => :applied,
34
+ 'B' => :broken,
35
+ 'C' => :committed,
36
+ 'E' => :efix_locked,
37
+ 'O' => :obsolete,
38
+ '?' => :inconsistent,
39
+ }.freeze
40
+
32
41
  def self.srclistcmd(source)
33
42
  [ command(:installp), "-L", "-d", source ]
34
43
  end
@@ -97,6 +106,11 @@ Puppet::Type.type(:package).provide :aix, :parent => Puppet::Provider::Package d
97
106
  if output =~ /^#{Regexp.escape(@resource[:name])}\s+.*\s+Already superseded by.*$/
98
107
  self.fail _("aix package provider is unable to downgrade packages")
99
108
  end
109
+
110
+ pkg_info = query
111
+ if pkg_info && [:broken, :inconsistent].include?(pkg_info[:status])
112
+ self.fail _("Package '%{name}' is in a %{status} state and requires manual intervention") % { name: @resource[:name], status: pkg_info[:status] }
113
+ end
100
114
  end
101
115
 
102
116
  def self.pkglist(hash = {})
@@ -108,8 +122,9 @@ Puppet::Type.type(:package).provide :aix, :parent => Puppet::Provider::Package d
108
122
  end
109
123
 
110
124
  begin
111
- list = execute(cmd).scan(/^[^#][^:]*:([^:]*):([^:]*)/).collect { |n,e|
112
- { :name => n, :ensure => e, :provider => self.name }
125
+ list = execute(cmd).scan(/^[^#][^:]*:([^:]*):([^:]*):[^:]*:[^:]*:([^:])/).collect { |n,e,s|
126
+ e = :absent if [:broken, :inconsistent].include?(STATE_CODE[s])
127
+ { :name => n, :ensure => e, :status => STATE_CODE[s], :provider => self.name }
113
128
  }
114
129
  rescue Puppet::ExecutionFailure => detail
115
130
  if hash[:pkgname]
@@ -1,7 +1,11 @@
1
+ require 'puppet/util/package/version/range'
2
+ require 'puppet/util/package/version/debian'
3
+
1
4
  Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
2
5
  # Provide sorting functionality
3
6
  include Puppet::Util::Package
4
-
7
+ DebianVersion = Puppet::Util::Package::Version::Debian
8
+ VersionRange = Puppet::Util::Package::Version::Range
5
9
  desc "Package management via `apt-get`.
6
10
 
7
11
  This provider supports the `install_options` attribute, which allows command-line flags to be passed to apt-get.
@@ -12,6 +16,7 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
12
16
 
13
17
  commands :aptget => "/usr/bin/apt-get"
14
18
  commands :aptcache => "/usr/bin/apt-cache"
19
+ commands :aptmark => "/usr/bin/apt-mark"
15
20
  commands :preseed => "/usr/bin/debconf-set-selections"
16
21
 
17
22
  defaultfor :osfamily => :debian
@@ -26,6 +31,39 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
26
31
  false
27
32
  end
28
33
 
34
+ def self.instances
35
+ packages = super
36
+ manual_marks = aptmark('showmanual').split("\n")
37
+ packages.each do |package|
38
+ package.mark = :manual if manual_marks.include?(package.name)
39
+ end
40
+ packages
41
+ end
42
+
43
+ def query
44
+ hash = super
45
+ hash[:mark] = :manual if aptmark('showmanual').split("\n").include?(@resource[:name])
46
+ hash
47
+ end
48
+
49
+ def initialize(value={})
50
+ super(value)
51
+ @property_flush = {}
52
+ end
53
+
54
+ def mark=(value)
55
+ @property_flush[:mark] = value
56
+ end
57
+
58
+ def flush
59
+ # unless we are removing the package mark it if it hasn't already been marked
60
+ if @property_flush
61
+ unless @property_flush[:mark] || [:purge, :absent].include?(resource[:ensure])
62
+ aptmark('manual', resource[:name])
63
+ end
64
+ end
65
+ end
66
+
29
67
  # A derivative of DPKG; this is how most people actually manage
30
68
  # Debian boxes, and the only thing that differs is that it can
31
69
  # install packages from remote sites.
@@ -44,12 +82,44 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
44
82
  end
45
83
  end
46
84
 
85
+ def best_version(should_range)
86
+ available_versions = SortedSet.new
87
+
88
+ output = aptcache :madison, @resource[:name]
89
+ output.each_line do |line|
90
+ is = line.split('|')[1].strip
91
+ begin
92
+ is_version = DebianVersion.parse(is)
93
+ available_versions << is_version if should_range.include?(is_version)
94
+ rescue DebianVersion::ValidationFailure
95
+ Puppet.debug("Cannot parse #{is} as a debian version")
96
+ end
97
+ end
98
+
99
+ return available_versions.to_a.last unless available_versions.empty?
100
+
101
+ Puppet.debug("No available version for package #{@resource[:name]} is included in range #{should_range}")
102
+ should_range
103
+ end
104
+
47
105
  # Install a package using 'apt-get'. This function needs to support
48
106
  # installing a specific version.
49
107
  def install
50
108
  self.run_preseed if @resource[:responsefile]
51
109
  should = @resource[:ensure]
52
110
 
111
+ if should.is_a?(String)
112
+ begin
113
+ should_range = VersionRange.parse(should, DebianVersion)
114
+
115
+ unless should_range.is_a?(VersionRange::Eq)
116
+ should = best_version(should_range)
117
+ end
118
+ rescue VersionRange::ValidationFailure, DebianVersion::ValidationFailure
119
+ Puppet.debug("Cannot parse #{should} as a debian version range, falling through")
120
+ end
121
+ end
122
+
53
123
  checkforcdrom
54
124
  cmd = %w{-q -y}
55
125
 
@@ -130,4 +200,31 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
130
200
  def install_options
131
201
  join_options(@resource[:install_options])
132
202
  end
203
+
204
+ def insync?(is)
205
+ # this is called after the generic version matching logic (insync? for the
206
+ # type), so we only get here if should != is
207
+
208
+ return false unless is && is != :absent
209
+
210
+ #if 'should' is a range and 'is' a debian version we should check if 'should' includes 'is'
211
+ should = @resource[:ensure]
212
+
213
+ return false unless is.is_a?(String) && should.is_a?(String)
214
+
215
+ begin
216
+ should_range = VersionRange.parse(should, DebianVersion)
217
+ rescue VersionRange::ValidationFailure, DebianVersion::ValidationFailure
218
+ Puppet.debug("Cannot parse #{should} as a debian version range")
219
+ return false
220
+ end
221
+
222
+ begin
223
+ is_version = DebianVersion.parse(is)
224
+ rescue DebianVersion::ValidationFailure
225
+ Puppet.debug("Cannot parse #{is} as a debian version")
226
+ return false
227
+ end
228
+ should_range.include?(is_version)
229
+ end
133
230
  end
@@ -16,7 +16,7 @@ Puppet::Type.type(:package).provide :aptitude, :parent => :apt, :source => :dpkg
16
16
  output = aptitude(*args)
17
17
 
18
18
  # Yay, stupid aptitude doesn't throw an error when the package is missing.
19
- if args.include?(:install) and output =~ /Couldn't find any package/
19
+ if args.include?(:install) and output.to_s =~ /Couldn't find any package/
20
20
  raise Puppet::Error.new(
21
21
  _("Could not find package %{name}") % { name: self.name }
22
22
  )
@@ -12,7 +12,7 @@ require 'puppet/provider/package'
12
12
 
13
13
  Puppet::Type.type(:package).provide :dnfmodule, :parent => :dnf do
14
14
 
15
- has_feature :installable, :uninstallable, :versionable, :supports_flavors
15
+ has_feature :installable, :uninstallable, :versionable, :supports_flavors, :disableable
16
16
  #has_feature :upgradeable
17
17
  # it's not (yet) feasible to make this upgradeable since module streams don't
18
18
  # always have matching version types (i.e. idm has streams DL1 and client,
@@ -34,14 +34,26 @@ Puppet::Type.type(:package).provide :dnfmodule, :parent => :dnf do
34
34
 
35
35
  def self.instances
36
36
  packages = []
37
- cmd = "#{command(:dnf)} module list --installed -d 0 -e #{error_level}"
37
+ cmd = "#{command(:dnf)} module list -d 0 -e #{error_level}"
38
38
  execute(cmd).each_line do |line|
39
- next unless line =~ /\[i\][, ]/ # get rid of non-package lines (including last Hint line)
40
- line.gsub!(/\[[de]\]/, '') # we don't care about default/enabled flags
39
+ # select only lines with actual packages since DNF clutters the output
40
+ next unless line =~ /\[[eix]\][, ]/
41
+ line.gsub!(/\[d\]/, '') # we don't care about the default flag
42
+
43
+ flavor = if line.include?('[i]')
44
+ line.split('[i]').first.split.last
45
+ else
46
+ :absent
47
+ end
48
+
41
49
  packages << new(
42
50
  name: line.split[0],
43
- ensure: line.split[1],
44
- flavor: line.split('[i]').first.split.last, # this is nasty
51
+ ensure: if line.include?('[x]')
52
+ :disabled
53
+ else
54
+ line.split[1]
55
+ end,
56
+ flavor: flavor,
45
57
  provider: name
46
58
  )
47
59
  end
@@ -55,28 +67,55 @@ Puppet::Type.type(:package).provide :dnfmodule, :parent => :dnf do
55
67
  pkg ? pkg.properties : nil
56
68
  end
57
69
 
58
- def reset
59
- execute([command(:dnf), 'module', 'reset', '-d', '0', '-e', self.class.error_level, '-y', @resource[:name]])
60
- end
61
-
62
70
  # to install specific streams and profiles:
63
71
  # $ dnf module install module-name:stream/profile
64
72
  # $ dnf module install perl:5.24/minimal
65
73
  # if unspecified, they will be defaulted (see [d] param in dnf module list output)
66
74
  def install
67
- args = @resource[:name]
68
75
  # ensure we start fresh (remove existing stream)
69
76
  uninstall unless [:absent, :purged].include?(@property_hash[:ensure])
77
+
78
+ args = @resource[:name].dup
70
79
  case @resource[:ensure]
71
80
  when true, false, Symbol
72
81
  # pass
73
82
  else
74
83
  args << ":#{@resource[:ensure]}"
75
84
  end
76
- if @resource[:flavor]
77
- args << "/#{@resource[:flavor]}"
85
+ args << "/#{@resource[:flavor]}" if @resource[:flavor]
86
+
87
+ if @resource[:enable_only] == true
88
+ enable(args)
89
+ else
90
+ begin
91
+ execute([command(:dnf), 'module', 'install', '-d', '0', '-e', self.class.error_level, '-y', args])
92
+ rescue Puppet::ExecutionFailure => e
93
+ # module has no default profile and no profile was requested, so just enable the stream
94
+ # DNF versions prior to 4.2.8 do not need this workaround
95
+ # see https://bugzilla.redhat.com/show_bug.cgi?id=1669527
96
+ if @resource[:flavor] == nil && e.message =~ /^missing groups or modules: #{Regexp.quote(@resource[:name])}$/
97
+ enable(args)
98
+ else
99
+ raise
100
+ end
101
+ end
102
+ end
103
+ end
104
+
105
+ # should only get here when @resource[ensure] is :disabled
106
+ def insync?(is)
107
+ if resource[:ensure] == :disabled
108
+ # in sync only if package is already disabled
109
+ pkg = self.class.instances.find do |package|
110
+ @resource[:name] == package.name && package.properties[:ensure] == :disabled
111
+ end
112
+ return true if pkg
78
113
  end
79
- execute([command(:dnf), 'module', 'install', '-d', '0', '-e', self.class.error_level, '-y', args])
114
+ return false
115
+ end
116
+
117
+ def enable(args = @resource[:name])
118
+ execute([command(:dnf), 'module', 'enable', '-d', '0', '-e', self.class.error_level, '-y', args])
80
119
  end
81
120
 
82
121
  def uninstall
@@ -84,6 +123,14 @@ Puppet::Type.type(:package).provide :dnfmodule, :parent => :dnf do
84
123
  reset # reset module to the default stream
85
124
  end
86
125
 
126
+ def disable(args = @resource[:name])
127
+ execute([command(:dnf), 'module', 'disable', '-d', '0', '-e', self.class.error_level, '-y', args])
128
+ end
129
+
130
+ def reset
131
+ execute([command(:dnf), 'module', 'reset', '-d', '0', '-e', self.class.error_level, '-y', @resource[:name]])
132
+ end
133
+
87
134
  def flavor
88
135
  @property_hash[:flavor]
89
136
  end
@@ -74,7 +74,7 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
74
74
  elsif ['config-files', 'half-installed', 'unpacked', 'half-configured'].include?(hash[:status])
75
75
  hash[:ensure] = :absent
76
76
  end
77
- hash[:mark] = :hold if hash[:desired] == 'hold'
77
+ hash[:mark] = hash[:desired] == 'hold' ? :hold : :none
78
78
  else
79
79
  Puppet.debug("Failed to match dpkg-query line #{line.inspect}")
80
80
  end
@@ -1,3 +1,5 @@
1
+ require 'puppet/util/package/version/gem'
2
+ require 'puppet/util/package/version/range'
1
3
  require 'puppet/provider/package_targetable'
2
4
  require 'uri'
3
5
 
@@ -15,7 +17,10 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package::
15
17
  These options should be specified as an array where each element is either a
16
18
  string or a hash."
17
19
 
18
- has_feature :versionable, :install_options, :uninstall_options, :targetable
20
+ has_feature :versionable, :install_options, :uninstall_options, :targetable, :version_ranges
21
+
22
+ GEM_VERSION = Puppet::Util::Package::Version::Gem
23
+ GEM_VERSION_RANGE = Puppet::Util::Package::Version::Range
19
24
 
20
25
  # Override the specificity method to return 1 if gem is not set as default provider
21
26
  def self.specificity
@@ -48,11 +53,13 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package::
48
53
  #
49
54
  # In this case, causing the puppet_gem provider to inherit the parent gem provider's convenience gemcmd() methods, with the wrong path.
50
55
 
51
- def self.execute_gem_command(command, command_options)
56
+ def self.execute_gem_command(command, command_options, custom_environment = {})
52
57
  validate_command(command)
53
58
  cmd = [command] << command_options
54
59
 
55
- execute(cmd, {:failonfail => true, :combine => true, :custom_environment => {"HOME"=>ENV["HOME"]}})
60
+ custom_environment = {'HOME'=>Puppet::Util.get_env('HOME')}.merge(custom_environment)
61
+
62
+ execute(cmd, {:failonfail => true, :combine => true, :custom_environment => custom_environment})
56
63
  end
57
64
 
58
65
  def self.instances(target_command = nil)
@@ -125,16 +132,35 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package::
125
132
 
126
133
  def insync?(is)
127
134
  return false unless is && is != :absent
135
+ is = [is] unless is.is_a? Array
136
+ should = @resource[:ensure]
137
+
138
+ unless should =~ Regexp.union(/,/, Gem::Requirement::PATTERN)
139
+ begin
140
+ should_range = GEM_VERSION_RANGE.parse(should, GEM_VERSION)
141
+ rescue GEM_VERSION_RANGE::ValidationFailure, GEM_VERSION::ValidationFailure
142
+ Puppet.debug("Cannot parse #{should} as a ruby gem version range")
143
+ return false
144
+ end
128
145
 
146
+ return is.any? do |version|
147
+ begin
148
+ should_range.include?(GEM_VERSION.parse(version))
149
+ rescue GEM_VERSION::ValidationFailure
150
+ Puppet.debug("Cannot parse #{version} as a ruby gem version")
151
+ false
152
+ end
153
+ end
154
+ end
155
+
129
156
  begin
130
- dependency = Gem::Dependency.new('', resource[:ensure])
157
+ # Range intersections are not supported by Gem::Requirement, so just split by comma.
158
+ dependency = Gem::Dependency.new('', should.split(','))
131
159
  rescue ArgumentError
132
160
  # Bad requirements will cause an error during gem command invocation, so just return not in sync
133
161
  return false
134
162
  end
135
163
 
136
- is = [is] unless is.is_a? Array
137
-
138
164
  # Check if any version matches the dependency
139
165
  is.any? { |version| dependency.match?('', version) }
140
166
  end
@@ -148,12 +174,22 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package::
148
174
  command = resource_or_provider_command
149
175
  command_options = ["install"]
150
176
  command_options += install_options if resource[:install_options]
177
+ should = resource[:ensure]
178
+
179
+ unless should =~ Regexp.union(/,/, Gem::Requirement::PATTERN)
180
+ begin
181
+ should_range = GEM_VERSION_RANGE.parse(should, GEM_VERSION)
182
+ should = should_range.to_gem_version
183
+ useversion = true
184
+ rescue GEM_VERSION_RANGE::ValidationFailure, GEM_VERSION::ValidationFailure
185
+ Puppet.debug("Cannot parse #{should} as a ruby gem version range. Falling through.")
186
+ end
187
+ end
151
188
 
152
189
  if Puppet::Util::Platform.windows?
153
- version = resource[:ensure]
154
- command_options << "-v" << %Q["#{version}"] if (! resource[:ensure].is_a? Symbol) and useversion
190
+ command_options << "-v" << %Q["#{should}"] if useversion && !should.is_a?(Symbol)
155
191
  else
156
- command_options << "-v" << resource[:ensure] if (! resource[:ensure].is_a? Symbol) and useversion
192
+ command_options << "-v" << should if useversion && !should.is_a?(Symbol)
157
193
  end
158
194
 
159
195
  if Puppet::Util::Package.versioncmp(rubygem_version(command), '2.0.0') == -1