puppet 5.5.16 → 5.5.21

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 (359) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +10 -10
  3. data/Gemfile +2 -3
  4. data/Gemfile.lock +57 -52
  5. data/ext/build_defaults.yaml +1 -0
  6. data/ext/cert_inspector +3 -3
  7. data/ext/project_data.yaml +2 -2
  8. data/ext/puppet-test +2 -2
  9. data/ext/regexp_nodes/regexp_nodes.rb +4 -4
  10. data/ext/windows/service/daemon.rb +54 -8
  11. data/install.rb +6 -24
  12. data/lib/puppet.rb +5 -2
  13. data/lib/puppet/agent.rb +5 -13
  14. data/lib/puppet/application.rb +1 -1
  15. data/lib/puppet/application/agent.rb +15 -1
  16. data/lib/puppet/application/apply.rb +2 -2
  17. data/lib/puppet/application/describe.rb +3 -9
  18. data/lib/puppet/application/device.rb +4 -4
  19. data/lib/puppet/application/doc.rb +1 -1
  20. data/lib/puppet/application/filebucket.rb +13 -0
  21. data/lib/puppet/application/lookup.rb +1 -1
  22. data/lib/puppet/application/resource.rb +4 -4
  23. data/lib/puppet/application/script.rb +2 -2
  24. data/lib/puppet/configurer.rb +86 -28
  25. data/lib/puppet/configurer/downloader.rb +2 -6
  26. data/lib/puppet/daemon.rb +1 -1
  27. data/lib/puppet/defaults.rb +82 -38
  28. data/lib/puppet/error.rb +9 -1
  29. data/lib/puppet/external/nagios/base.rb +1 -1
  30. data/lib/puppet/face/ca.rb +1 -1
  31. data/lib/puppet/face/config.rb +10 -48
  32. data/lib/puppet/face/facts.rb +1 -1
  33. data/lib/puppet/face/module/list.rb +5 -5
  34. data/lib/puppet/face/module/search.rb +1 -1
  35. data/lib/puppet/face/module/uninstall.rb +1 -1
  36. data/lib/puppet/face/module/upgrade.rb +1 -1
  37. data/lib/puppet/face/plugin.rb +9 -2
  38. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  39. data/lib/puppet/file_system.rb +0 -8
  40. data/lib/puppet/file_system/memory_file.rb +1 -1
  41. data/lib/puppet/file_system/posix.rb +3 -2
  42. data/lib/puppet/file_system/uniquefile.rb +4 -0
  43. data/lib/puppet/forge.rb +3 -3
  44. data/lib/puppet/functions/epp.rb +4 -4
  45. data/lib/puppet/functions/inline_epp.rb +5 -5
  46. data/lib/puppet/functions/reduce.rb +2 -4
  47. data/lib/puppet/gettext/module_translations.rb +1 -1
  48. data/lib/puppet/graph/rb_tree_map.rb +2 -2
  49. data/lib/puppet/graph/simple_graph.rb +6 -5
  50. data/lib/puppet/indirector/catalog/compiler.rb +8 -0
  51. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  52. data/lib/puppet/indirector/hiera.rb +2 -0
  53. data/lib/puppet/indirector/resource/ral.rb +1 -3
  54. data/lib/puppet/indirector/resource/validator.rb +1 -1
  55. data/lib/puppet/interface.rb +2 -1
  56. data/lib/puppet/loaders.rb +0 -1
  57. data/lib/puppet/metatype/manager.rb +1 -1
  58. data/lib/puppet/module.rb +1 -1
  59. data/lib/puppet/module_tool/applications/builder.rb +1 -1
  60. data/lib/puppet/module_tool/applications/installer.rb +1 -1
  61. data/lib/puppet/module_tool/applications/uninstaller.rb +3 -3
  62. data/lib/puppet/module_tool/metadata.rb +1 -1
  63. data/lib/puppet/module_tool/shared_behaviors.rb +4 -4
  64. data/lib/puppet/module_tool/tar/mini.rb +12 -2
  65. data/lib/puppet/network/http/api/indirected_routes.rb +13 -12
  66. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  67. data/lib/puppet/network/http/connection.rb +14 -12
  68. data/lib/puppet/network/http/factory.rb +1 -11
  69. data/lib/puppet/network/http/pool.rb +7 -1
  70. data/lib/puppet/network/http/rack/rest.rb +2 -2
  71. data/lib/puppet/network/http/site.rb +1 -1
  72. data/lib/puppet/network/resolver.rb +2 -2
  73. data/lib/puppet/node/environment.rb +4 -2
  74. data/lib/puppet/parameter.rb +8 -0
  75. data/lib/puppet/parser/ast.rb +1 -1
  76. data/lib/puppet/parser/ast/resourceparam.rb +1 -1
  77. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  78. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  79. data/lib/puppet/parser/environment_compiler.rb +3 -0
  80. data/lib/puppet/parser/functions.rb +1 -1
  81. data/lib/puppet/parser/functions/epp.rb +3 -3
  82. data/lib/puppet/parser/functions/inline_epp.rb +5 -5
  83. data/lib/puppet/parser/resource.rb +3 -2
  84. data/lib/puppet/parser/resource/param.rb +6 -0
  85. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  86. data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +1 -1
  87. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +1 -1
  88. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  89. data/lib/puppet/pops/evaluator/external_syntax_support.rb +3 -2
  90. data/lib/puppet/pops/evaluator/runtime3_support.rb +4 -4
  91. data/lib/puppet/pops/issues.rb +5 -0
  92. data/lib/puppet/pops/loaders.rb +1 -1
  93. data/lib/puppet/pops/lookup/hiera_config.rb +1 -0
  94. data/lib/puppet/pops/lookup/sub_lookup.rb +1 -1
  95. data/lib/puppet/pops/merge_strategy.rb +22 -18
  96. data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
  97. data/lib/puppet/pops/parser/interpolation_support.rb +4 -4
  98. data/lib/puppet/pops/parser/locator.rb +1 -1
  99. data/lib/puppet/pops/parser/pn_parser.rb +17 -16
  100. data/lib/puppet/pops/puppet_stack.rb +51 -48
  101. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  102. data/lib/puppet/pops/types/p_sensitive_type.rb +1 -1
  103. data/lib/puppet/pops/types/string_converter.rb +10 -10
  104. data/lib/puppet/pops/types/type_calculator.rb +24 -0
  105. data/lib/puppet/pops/types/types.rb +3 -3
  106. data/lib/puppet/pops/validation/checker4_0.rb +10 -0
  107. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  108. data/lib/puppet/property.rb +1 -1
  109. data/lib/puppet/property/ensure.rb +1 -1
  110. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  111. data/lib/puppet/provider/cron/crontab.rb +1 -1
  112. data/lib/puppet/provider/exec.rb +6 -2
  113. data/lib/puppet/provider/file/posix.rb +5 -0
  114. data/lib/puppet/provider/group/groupadd.rb +19 -19
  115. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  116. data/lib/puppet/provider/mailalias/aliases.rb +1 -1
  117. data/lib/puppet/provider/mount.rb +1 -1
  118. data/lib/puppet/provider/mount/parsed.rb +8 -8
  119. data/lib/puppet/provider/nameservice.rb +10 -3
  120. data/lib/puppet/provider/nameservice/directoryservice.rb +1 -1
  121. data/lib/puppet/provider/nameservice/pw.rb +2 -2
  122. data/lib/puppet/provider/package/aix.rb +17 -2
  123. data/lib/puppet/provider/package/apt.rb +14 -3
  124. data/lib/puppet/provider/package/dnf.rb +1 -1
  125. data/lib/puppet/provider/package/dnfmodule.rb +141 -0
  126. data/lib/puppet/provider/package/dpkg.rb +16 -18
  127. data/lib/puppet/provider/package/fink.rb +20 -3
  128. data/lib/puppet/provider/package/openbsd.rb +14 -2
  129. data/lib/puppet/provider/package/pip.rb +37 -10
  130. data/lib/puppet/provider/package/pkg.rb +18 -5
  131. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  132. data/lib/puppet/provider/package/pkgng.rb +16 -4
  133. data/lib/puppet/provider/package/portage.rb +4 -4
  134. data/lib/puppet/provider/package/rpm.rb +57 -19
  135. data/lib/puppet/provider/package/windows/package.rb +1 -1
  136. data/lib/puppet/provider/package/yum.rb +35 -24
  137. data/lib/puppet/provider/package/zypper.rb +1 -0
  138. data/lib/puppet/provider/package_targetable.rb +5 -4
  139. data/lib/puppet/provider/parsedfile.rb +1 -1
  140. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +3 -3
  141. data/lib/puppet/provider/selmodule/semodule.rb +43 -26
  142. data/lib/puppet/provider/service/daemontools.rb +9 -9
  143. data/lib/puppet/provider/service/launchd.rb +20 -5
  144. data/lib/puppet/provider/service/openbsd.rb +1 -1
  145. data/lib/puppet/provider/service/rcng.rb +2 -2
  146. data/lib/puppet/provider/service/runit.rb +2 -8
  147. data/lib/puppet/provider/service/systemd.rb +35 -22
  148. data/lib/puppet/provider/service/windows.rb +8 -0
  149. data/lib/puppet/provider/user/directoryservice.rb +31 -6
  150. data/lib/puppet/provider/user/hpux.rb +1 -1
  151. data/lib/puppet/provider/user/pw.rb +12 -3
  152. data/lib/puppet/provider/user/user_role_add.rb +5 -1
  153. data/lib/puppet/provider/user/useradd.rb +62 -27
  154. data/lib/puppet/provider/user/windows_adsi.rb +4 -5
  155. data/lib/puppet/provider/yumrepo/inifile.rb +2 -2
  156. data/lib/puppet/reference/indirection.rb +2 -2
  157. data/lib/puppet/reference/metaparameter.rb +1 -3
  158. data/lib/puppet/reference/providers.rb +1 -1
  159. data/lib/puppet/reference/type.rb +3 -9
  160. data/lib/puppet/reports.rb +1 -1
  161. data/lib/puppet/resource.rb +18 -1
  162. data/lib/puppet/resource/catalog.rb +1 -1
  163. data/lib/puppet/resource/type.rb +8 -0
  164. data/lib/puppet/settings.rb +43 -3
  165. data/lib/puppet/settings/environment_conf.rb +1 -0
  166. data/lib/puppet/ssl/certificate.rb +2 -1
  167. data/lib/puppet/ssl/certificate_authority.rb +6 -5
  168. data/lib/puppet/ssl/certificate_authority/interface.rb +1 -1
  169. data/lib/puppet/ssl/certificate_factory.rb +2 -2
  170. data/lib/puppet/ssl/host.rb +3 -3
  171. data/lib/puppet/ssl/oids.rb +1 -1
  172. data/lib/puppet/test/test_helper.rb +15 -10
  173. data/lib/puppet/transaction/report.rb +1 -1
  174. data/lib/puppet/transaction/resource_harness.rb +1 -1
  175. data/lib/puppet/type.rb +15 -4
  176. data/lib/puppet/type/cron.rb +1 -1
  177. data/lib/puppet/type/exec.rb +21 -9
  178. data/lib/puppet/type/file.rb +14 -2
  179. data/lib/puppet/type/file/data_sync.rb +5 -1
  180. data/lib/puppet/type/group.rb +4 -2
  181. data/lib/puppet/type/interface.rb +1 -1
  182. data/lib/puppet/type/notify.rb +3 -2
  183. data/lib/puppet/type/package.rb +107 -8
  184. data/lib/puppet/type/schedule.rb +1 -1
  185. data/lib/puppet/type/selboolean.rb +17 -3
  186. data/lib/puppet/type/service.rb +9 -10
  187. data/lib/puppet/type/user.rb +6 -24
  188. data/lib/puppet/type/yumrepo.rb +3 -7
  189. data/lib/puppet/util.rb +47 -25
  190. data/lib/puppet/util/command_line/trollop.rb +1 -1
  191. data/lib/puppet/util/execution.rb +4 -3
  192. data/lib/puppet/util/http_proxy.rb +24 -16
  193. data/lib/puppet/util/instance_loader.rb +1 -1
  194. data/lib/puppet/util/log.rb +1 -1
  195. data/lib/puppet/util/log/destinations.rb +3 -12
  196. data/lib/puppet/util/logging.rb +30 -18
  197. data/lib/puppet/util/metric.rb +2 -2
  198. data/lib/puppet/util/monkey_patches.rb +1 -1
  199. data/lib/puppet/util/nagios_maker.rb +2 -2
  200. data/lib/puppet/util/network_device/cisco/device.rb +1 -1
  201. data/lib/puppet/util/network_device/cisco/interface.rb +2 -2
  202. data/lib/puppet/util/network_device/transport/ssh.rb +1 -1
  203. data/lib/puppet/util/pidlock.rb +12 -6
  204. data/lib/puppet/util/plist.rb +6 -0
  205. data/lib/puppet/util/provider_features.rb +2 -4
  206. data/lib/puppet/util/rdoc.rb +1 -1
  207. data/lib/puppet/util/reference.rb +1 -1
  208. data/lib/puppet/util/resource_template.rb +1 -1
  209. data/lib/puppet/util/selinux.rb +8 -2
  210. data/lib/puppet/util/windows/adsi.rb +60 -30
  211. data/lib/puppet/util/windows/api_types.rb +45 -32
  212. data/lib/puppet/util/windows/eventlog.rb +1 -6
  213. data/lib/puppet/util/windows/principal.rb +8 -6
  214. data/lib/puppet/util/windows/process.rb +16 -15
  215. data/lib/puppet/util/windows/registry.rb +17 -15
  216. data/lib/puppet/util/windows/security.rb +3 -0
  217. data/lib/puppet/util/windows/service.rb +149 -4
  218. data/lib/puppet/util/windows/sid.rb +4 -3
  219. data/lib/puppet/vendor.rb +1 -1
  220. data/lib/puppet/version.rb +1 -1
  221. data/lib/puppet_pal.rb +2 -2
  222. data/locales/puppet.pot +479 -443
  223. data/man/man5/puppet.conf.5 +38 -8
  224. data/man/man8/puppet-agent.8 +2 -2
  225. data/man/man8/puppet-apply.8 +1 -1
  226. data/man/man8/puppet-ca.8 +1 -1
  227. data/man/man8/puppet-catalog.8 +1 -1
  228. data/man/man8/puppet-cert.8 +1 -1
  229. data/man/man8/puppet-certificate.8 +1 -1
  230. data/man/man8/puppet-certificate_request.8 +1 -1
  231. data/man/man8/puppet-certificate_revocation_list.8 +1 -1
  232. data/man/man8/puppet-config.8 +1 -1
  233. data/man/man8/puppet-describe.8 +1 -1
  234. data/man/man8/puppet-device.8 +1 -1
  235. data/man/man8/puppet-doc.8 +1 -1
  236. data/man/man8/puppet-epp.8 +1 -1
  237. data/man/man8/puppet-facts.8 +1 -1
  238. data/man/man8/puppet-filebucket.8 +16 -1
  239. data/man/man8/puppet-generate.8 +1 -1
  240. data/man/man8/puppet-help.8 +1 -1
  241. data/man/man8/puppet-key.8 +1 -1
  242. data/man/man8/puppet-lookup.8 +1 -1
  243. data/man/man8/puppet-man.8 +1 -1
  244. data/man/man8/puppet-master.8 +1 -1
  245. data/man/man8/puppet-module.8 +1 -1
  246. data/man/man8/puppet-node.8 +1 -1
  247. data/man/man8/puppet-parser.8 +1 -1
  248. data/man/man8/puppet-plugin.8 +1 -1
  249. data/man/man8/puppet-report.8 +1 -1
  250. data/man/man8/puppet-resource.8 +1 -1
  251. data/man/man8/puppet-script.8 +1 -1
  252. data/man/man8/puppet-status.8 +1 -1
  253. data/man/man8/puppet.8 +2 -2
  254. data/spec/fixtures/integration/provider/mailalias/aliases/test1 +1 -0
  255. data/spec/fixtures/unit/provider/package/dnfmodule/dnf-module-list.txt +19 -0
  256. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  257. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  258. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  259. data/spec/integration/configurer_spec.rb +52 -0
  260. data/spec/integration/defaults_spec.rb +1 -2
  261. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  262. data/spec/integration/parser/compiler_spec.rb +11 -0
  263. data/spec/integration/provider/service/systemd_spec.rb +8 -5
  264. data/spec/integration/type/file_spec.rb +28 -0
  265. data/spec/integration/type/notify_spec.rb +46 -0
  266. data/spec/integration/util/execution_spec.rb +27 -0
  267. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  268. data/spec/integration/util/windows/registry_spec.rb +7 -7
  269. data/spec/unit/agent_spec.rb +34 -26
  270. data/spec/unit/application/agent_spec.rb +18 -0
  271. data/spec/unit/application/apply_spec.rb +2 -12
  272. data/spec/unit/application/device_spec.rb +1 -1
  273. data/spec/unit/configurer/fact_handler_spec.rb +0 -4
  274. data/spec/unit/configurer_spec.rb +377 -397
  275. data/spec/unit/daemon_spec.rb +0 -1
  276. data/spec/unit/face/facts_spec.rb +9 -0
  277. data/spec/unit/face/plugin_spec.rb +8 -0
  278. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  279. data/spec/unit/forge/forge_spec.rb +1 -3
  280. data/spec/unit/forge/repository_spec.rb +1 -3
  281. data/spec/unit/indirector/catalog/compiler_spec.rb +45 -26
  282. data/spec/unit/indirector/resource/ral_spec.rb +4 -4
  283. data/spec/unit/module_tool/tar/mini_spec.rb +1 -1
  284. data/spec/unit/network/http/api/indirected_routes_spec.rb +28 -11
  285. data/spec/unit/network/http/connection_spec.rb +43 -1
  286. data/spec/unit/network/http/factory_spec.rb +27 -5
  287. data/spec/unit/network/http/pool_spec.rb +32 -0
  288. data/spec/unit/node_spec.rb +7 -4
  289. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  290. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
  291. data/spec/unit/pops/validator/validator_spec.rb +7 -0
  292. data/spec/unit/provider/exec_spec.rb +209 -0
  293. data/spec/unit/provider/group/groupadd_spec.rb +30 -1
  294. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  295. data/spec/unit/provider/package/aix_spec.rb +29 -0
  296. data/spec/unit/provider/package/apt_spec.rb +13 -2
  297. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  298. data/spec/unit/provider/package/aptrpm_spec.rb +1 -1
  299. data/spec/unit/provider/package/dnf_spec.rb +7 -0
  300. data/spec/unit/provider/package/dnfmodule_spec.rb +247 -0
  301. data/spec/unit/provider/package/dpkg_spec.rb +35 -7
  302. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  303. data/spec/unit/provider/package/pip_spec.rb +93 -22
  304. data/spec/unit/provider/package/pkg_spec.rb +13 -1
  305. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  306. data/spec/unit/provider/package/pkgng_spec.rb +36 -0
  307. data/spec/unit/provider/package/portage_spec.rb +4 -4
  308. data/spec/unit/provider/package/rpm_spec.rb +150 -16
  309. data/spec/unit/provider/package/yum_spec.rb +66 -0
  310. data/spec/unit/provider/package/zypper_spec.rb +13 -0
  311. data/spec/unit/provider/package_targetable_spec.rb +60 -0
  312. data/spec/unit/provider/selmodule_spec.rb +118 -47
  313. data/spec/unit/provider/service/daemontools_spec.rb +24 -0
  314. data/spec/unit/provider/service/launchd_spec.rb +28 -0
  315. data/spec/unit/provider/service/runit_spec.rb +24 -0
  316. data/spec/unit/provider/service/systemd_spec.rb +109 -36
  317. data/spec/unit/provider/service/windows_spec.rb +20 -0
  318. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  319. data/spec/unit/provider/user/hpux_spec.rb +2 -2
  320. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  321. data/spec/unit/provider/user/pw_spec.rb +37 -0
  322. data/spec/unit/provider/user/useradd_spec.rb +122 -15
  323. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  324. data/spec/unit/puppet_pal_2pec.rb +3 -0
  325. data/spec/unit/resource_spec.rb +26 -1
  326. data/spec/unit/ssl/certificate_authority_spec.rb +2 -3
  327. data/spec/unit/ssl/certificate_spec.rb +7 -0
  328. data/spec/unit/test/test_helper_spec.rb +17 -0
  329. data/spec/unit/transaction_spec.rb +18 -0
  330. data/spec/unit/type/exec_spec.rb +15 -12
  331. data/spec/unit/type/file/content_spec.rb +9 -3
  332. data/spec/unit/type/file/source_spec.rb +4 -4
  333. data/spec/unit/type/file_spec.rb +9 -4
  334. data/spec/unit/type/package_spec.rb +8 -0
  335. data/spec/unit/type/schedule_spec.rb +3 -1
  336. data/spec/unit/type/selboolean_spec.rb +4 -6
  337. data/spec/unit/type/service_spec.rb +25 -8
  338. data/spec/unit/type/user_spec.rb +32 -26
  339. data/spec/unit/type/yumrepo_spec.rb +30 -0
  340. data/spec/unit/type_spec.rb +40 -0
  341. data/spec/unit/util/execution_spec.rb +16 -0
  342. data/spec/unit/util/http_proxy_spec.rb +121 -1
  343. data/spec/unit/util/log/destinations_spec.rb +2 -26
  344. data/spec/unit/util/log_spec.rb +0 -112
  345. data/spec/unit/util/logging_spec.rb +200 -0
  346. data/spec/unit/util/pidlock_spec.rb +67 -40
  347. data/spec/unit/util/plist_spec.rb +20 -0
  348. data/spec/unit/util/windows/adsi_spec.rb +55 -4
  349. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  350. data/spec/unit/util/windows/service_spec.rb +9 -0
  351. data/spec/unit/util/windows/sid_spec.rb +2 -2
  352. data/tasks/manpages.rake +1 -0
  353. metadata +16 -11
  354. data/ext/windows/eventlog/Rakefile +0 -32
  355. data/ext/windows/eventlog/puppetres.dll +0 -0
  356. data/ext/windows/eventlog/puppetres.mc +0 -18
  357. data/lib/puppet/pops/loader/null_loader.rb +0 -60
  358. data/locales/ja/puppet.po +0 -12114
  359. data/spec/integration/test/test_helper_spec.rb +0 -31
@@ -9,7 +9,7 @@ Puppet::Type.type(:package).provide :dnf, :parent => :yum do
9
9
  These options should be specified as a string (e.g. '--flag'), a hash (e.g. {'--flag' => 'value'}),
10
10
  or an array where each element is either a string or a hash."
11
11
 
12
- has_feature :install_options, :versionable, :virtual_packages
12
+ has_feature :install_options, :versionable, :virtual_packages, :install_only
13
13
 
14
14
  commands :cmd => "dnf", :rpm => "rpm"
15
15
 
@@ -0,0 +1,141 @@
1
+ # dnfmodule - A puppet package provider for DNF modules
2
+ #
3
+ # Installing a module:
4
+ # package { 'postgresql':
5
+ # provider => 'dnfmodule',
6
+ # ensure => '9.6', # install a specific stream
7
+ # flavor => 'client', # install a specific profile
8
+ # }
9
+
10
+
11
+ require 'puppet/provider/package'
12
+
13
+ Puppet::Type.type(:package).provide :dnfmodule, :parent => :dnf do
14
+
15
+ has_feature :installable, :uninstallable, :versionable, :supports_flavors, :disableable
16
+ #has_feature :upgradeable
17
+ # it's not (yet) feasible to make this upgradeable since module streams don't
18
+ # always have matching version types (i.e. idm has streams DL1 and client,
19
+ # other modules have semver streams, others have string streams... we cannot
20
+ # programatically determine a latest version for ensure => 'latest'
21
+
22
+ commands :dnf => '/usr/bin/dnf'
23
+
24
+ def self.current_version
25
+ @current_version ||= dnf('--version').split.first
26
+ end
27
+
28
+ def self.prefetch(packages)
29
+ if Puppet::Util::Package.versioncmp(current_version, '3.0.1') < 0
30
+ raise Puppet::Error, _("Modules are not supported on DNF versions lower than 3.0.1")
31
+ end
32
+ super
33
+ end
34
+
35
+ def self.instances
36
+ packages = []
37
+ cmd = "#{command(:dnf)} module list -d 0 -e #{error_level}"
38
+ execute(cmd).each_line do |line|
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
+
49
+ packages << new(
50
+ name: line.split[0],
51
+ ensure: if line.include?('[x]')
52
+ :disabled
53
+ else
54
+ line.split[1]
55
+ end,
56
+ flavor: flavor,
57
+ provider: name
58
+ )
59
+ end
60
+ packages
61
+ end
62
+
63
+ def query
64
+ pkg = self.class.instances.find do |package|
65
+ @resource[:name] == package.name
66
+ end
67
+ pkg ? pkg.properties : nil
68
+ end
69
+
70
+ # to install specific streams and profiles:
71
+ # $ dnf module install module-name:stream/profile
72
+ # $ dnf module install perl:5.24/minimal
73
+ # if unspecified, they will be defaulted (see [d] param in dnf module list output)
74
+ def install
75
+ # ensure we start fresh (remove existing stream)
76
+ uninstall unless [:absent, :purged].include?(@property_hash[:ensure])
77
+
78
+ args = @resource[:name].dup
79
+ case @resource[:ensure]
80
+ when true, false, Symbol
81
+ # pass
82
+ else
83
+ args << ":#{@resource[:ensure]}"
84
+ end
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
113
+ end
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])
119
+ end
120
+
121
+ def uninstall
122
+ execute([command(:dnf), 'module', 'remove', '-d', '0', '-e', self.class.error_level, '-y', @resource[:name]])
123
+ reset # reset module to the default stream
124
+ end
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
+
134
+ def flavor
135
+ @property_hash[:flavor]
136
+ end
137
+
138
+ def flavor=(value)
139
+ install if flavor != @resource.should(:flavor)
140
+ end
141
+ end
@@ -44,7 +44,7 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
44
44
  # Note: self:: is required here to keep these constants in the context of what will
45
45
  # eventually become this Puppet::Type::Package::ProviderDpkg class.
46
46
  self::DPKG_QUERY_FORMAT_STRING = %Q{'${Status} ${Package} ${Version}\\n'}
47
- self::FIELDS_REGEX = %r{^(\S+) +(\S+) +(\S+) (\S+) (\S*)$}
47
+ self::FIELDS_REGEX = %r{^'?(\S+) +(\S+) +(\S+) (\S+) (\S*)$}
48
48
  self::FIELDS= [:desired, :error, :status, :name, :ensure]
49
49
 
50
50
  # @param line [String] one line of dpkg-query output
@@ -67,7 +67,7 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
67
67
  elsif ['config-files', 'half-installed', 'unpacked', 'half-configured'].include?(hash[:status])
68
68
  hash[:ensure] = :absent
69
69
  end
70
- hash[:ensure] = :held if hash[:desired] == 'hold'
70
+ hash[:mark] = :hold if hash[:desired] == 'hold'
71
71
  else
72
72
  Puppet.debug("Failed to match dpkg-query line #{line.inspect}")
73
73
  end
@@ -83,8 +83,6 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
83
83
  end
84
84
  args = []
85
85
 
86
- # We always unhold when installing to remove any prior hold.
87
- self.unhold
88
86
 
89
87
  if @resource[:configfiles] == :keep
90
88
  args << '--force-confold'
@@ -93,7 +91,12 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
93
91
  end
94
92
  args << '-i' << file
95
93
 
96
- dpkg(*args)
94
+ self.unhold if self.properties[:mark] == :hold
95
+ begin
96
+ dpkg(*args)
97
+ ensure
98
+ self.hold if @resource[:mark] == :hold
99
+ end
97
100
  end
98
101
 
99
102
  def update
@@ -144,10 +147,14 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
144
147
  dpkg "--purge", @resource[:name]
145
148
  end
146
149
 
147
- def hold
148
- if package_not_installed?(@resource[:name])
150
+ def deprecated_hold
151
+ if package_not_installed?
149
152
  self.install
150
153
  end
154
+ hold
155
+ end
156
+
157
+ def hold
151
158
  Tempfile.open('puppet_dpkg_set_selection') do |tmpfile|
152
159
  tmpfile.write("#{@resource[:name]} hold\n")
153
160
  tmpfile.flush
@@ -163,16 +170,7 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
163
170
  end
164
171
  end
165
172
 
166
- def package_not_installed?(name)
167
- if !name.nil? && !name.empty?
168
- begin
169
- dpkgquery("-W", "--showformat", self.class::DPKG_QUERY_FORMAT_STRING, name)
170
- rescue Puppet::ExecutionFailure
171
- # return true if exception is generated because package is not found
172
- return true
173
- end
174
- return false
175
- end
176
- raise ArgumentError.new("Package name is nil or empty")
173
+ def package_not_installed?
174
+ query[:status] != "installed"
177
175
  end
178
176
  end
@@ -37,7 +37,12 @@ Puppet::Type.type(:package).provide :fink, :parent => :dpkg, :source => :dpkg do
37
37
 
38
38
  cmd << :install << str
39
39
 
40
- finkcmd(cmd)
40
+ self.unhold if self.properties[:mark] == :hold
41
+ begin
42
+ finkcmd(cmd)
43
+ ensure
44
+ self.hold if @resource[:mark] == :hold
45
+ end
41
46
  end
42
47
 
43
48
  # What's the latest package version available?
@@ -70,10 +75,22 @@ Puppet::Type.type(:package).provide :fink, :parent => :dpkg, :source => :dpkg do
70
75
  end
71
76
 
72
77
  def uninstall
73
- finkcmd "-y", "-q", :remove, @model[:name]
78
+ self.unhold if self.properties[:mark] == :hold
79
+ begin
80
+ finkcmd "-y", "-q", :remove, @model[:name]
81
+ rescue StandardError, LoadError => e
82
+ self.hold if self.properties[:mark] == :hold
83
+ raise e
84
+ end
74
85
  end
75
86
 
76
87
  def purge
77
- aptget '-y', '-q', 'remove', '--purge', @resource[:name]
88
+ self.unhold if self.properties[:mark] == :hold
89
+ begin
90
+ aptget '-y', '-q', 'remove', '--purge', @resource[:name]
91
+ rescue StandardError, LoadError => e
92
+ self.hold if self.properties[:mark] == :hold
93
+ raise e
94
+ end
78
95
  end
79
96
  end
@@ -20,6 +20,7 @@ Puppet::Type.type(:package).provide :openbsd, :parent => Puppet::Provider::Packa
20
20
  has_feature :install_options
21
21
  has_feature :uninstall_options
22
22
  has_feature :upgradeable
23
+ has_feature :supports_flavors
23
24
 
24
25
  def self.instances
25
26
  packages = []
@@ -27,7 +28,7 @@ Puppet::Type.type(:package).provide :openbsd, :parent => Puppet::Provider::Packa
27
28
  begin
28
29
  execpipe(listcmd) do |process|
29
30
  # our regex for matching pkg_info output
30
- regex = /^(.*)-(\d[^-]*)[-]?(\w*)(.*)$/
31
+ regex = /^(.*)-(\d[^-]*)[-]?([\w-]*)(.*)$/
31
32
  fields = [:name, :ensure, :flavor ]
32
33
  hash = {}
33
34
 
@@ -180,7 +181,7 @@ Puppet::Type.type(:package).provide :openbsd, :parent => Puppet::Provider::Packa
180
181
  # If :ensure contains a version, use that instead of looking it up.
181
182
  # This allows for installing packages with the same stem, but multiple
182
183
  # version such as openldap-server.
183
- if /(\d[^-]*)$/.match(@resource[:ensure].to_s)
184
+ if @resource[:ensure].to_s =~ /(\d[^-]*)$/
184
185
  use_version = @resource[:ensure]
185
186
  else
186
187
  use_version = get_version
@@ -239,4 +240,15 @@ Puppet::Type.type(:package).provide :openbsd, :parent => Puppet::Provider::Packa
239
240
  def purge
240
241
  pkgdelete "-c", "-q", @resource[:name]
241
242
  end
243
+
244
+ def flavor
245
+ @property_hash[:flavor]
246
+ end
247
+
248
+ def flavor=(value)
249
+ if flavor != @resource.should(:flavor)
250
+ uninstall
251
+ install
252
+ end
253
+ end
242
254
  end
@@ -36,16 +36,25 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
36
36
  if Puppet.features.microsoft_windows?
37
37
  ["pip.exe"]
38
38
  else
39
- ["pip", "pip-python"]
39
+ ["pip", "pip-python", "pip2", "pip-2"]
40
40
  end
41
41
  end
42
42
 
43
43
  def self.pip_version(command)
44
- execpipe [command, '--version'] do |process|
44
+ version = nil
45
+ execpipe [quote(command), '--version'] do |process|
45
46
  process.collect do |line|
46
- return line.strip.match(/^pip (\d+\.\d+\.?\d*).*$/)[1]
47
+ md = line.strip.match(/^pip (\d+\.\d+\.?\d*).*$/)
48
+ if md
49
+ version = md[1]
50
+ break
51
+ end
47
52
  end
48
53
  end
54
+
55
+ raise Puppet::Error, _("Cannot resolve pip version") unless version
56
+
57
+ version
49
58
  end
50
59
 
51
60
  # Return an array of structured information about every installed package
@@ -68,7 +77,7 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
68
77
  command_options << '--all'
69
78
  end
70
79
 
71
- execpipe [command, command_options] do |process|
80
+ execpipe [quote(command), command_options] do |process|
72
81
  process.collect do |line|
73
82
  next unless pkg = parse(line)
74
83
  pkg[:command] = command
@@ -103,7 +112,7 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
103
112
  self.class.validate_command(command)
104
113
 
105
114
  self.class.instances(command).each do |pkg|
106
- return pkg.properties if @resource[:name].downcase == pkg.name.downcase
115
+ return pkg.properties if @resource[:name].casecmp(pkg.name).zero?
107
116
  end
108
117
  return nil
109
118
  end
@@ -123,14 +132,17 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
123
132
  end
124
133
  end
125
134
 
135
+ # Less resource-intensive approach for pip version 1.5.4 and newer.
136
+
126
137
  def latest_with_new_pip
127
138
  command = resource_or_provider_command
128
139
  self.class.validate_command(command)
129
140
 
130
- # Less resource intensive approach for pip version 1.5.4 and above
131
- execpipe [command, "install", "#{@resource[:name]}==versionplease"] do |process|
141
+ command_and_options = [self.class.quote(command), 'install', "#{@resource[:name]}==versionplease"]
142
+ command_and_options << install_options if @resource[:install_options]
143
+ execpipe command_and_options do |process|
132
144
  process.collect do |line|
133
- # PIP OUTPUT: Could not find a version that satisfies the requirement Django==versionplease (from versions: 1.1.3, 1.8rc1)
145
+ # PIP OUTPUT: Could not find a version that satisfies the requirement example==versionplease (from versions: 1.2.3, 4.5.6)
134
146
  if line =~ /from versions: /
135
147
  textAfterLastMatch = $'.chomp(")\n")
136
148
  versionList = textAfterLastMatch.split(', ').sort do |x,y|
@@ -143,14 +155,18 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
143
155
  end
144
156
  end
145
157
 
158
+ # More resource-intensive approach for pip version 1.5.3 and older.
159
+
146
160
  def latest_with_old_pip
147
161
  command = resource_or_provider_command
148
162
  self.class.validate_command(command)
149
163
 
150
164
  Dir.mktmpdir("puppet_pip") do |dir|
151
- execpipe [command, "install", "#{@resource[:name]}", "-d", "#{dir}", "-v"] do |process|
165
+ command_and_options = [self.class.quote(command), 'install', "#{@resource[:name]}", '-d', "#{dir}", '-v']
166
+ command_and_options << install_options if @resource[:install_options]
167
+ execpipe command_and_options do |process|
152
168
  process.collect do |line|
153
- # PIP OUTPUT: Using version 0.10.1 (newest of versions: 0.10.1, 0.10, 0.9, 0.8.1, 0.8, 0.7.2, 0.7.1, 0.7, 0.6.1, 0.6, 0.5.2, 0.5.1, 0.5, 0.4, 0.3.1, 0.3, 0.2, 0.1)
169
+ # PIP OUTPUT: Using version 0.10.1 (newest of versions: 1.2.3, 4.5.6)
154
170
  if line =~ /Using version (.+?) \(newest of versions/
155
171
  return $1
156
172
  end
@@ -210,4 +226,15 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
210
226
  def install_options
211
227
  join_options(@resource[:install_options])
212
228
  end
229
+
230
+ # Quoting is required if the path to the pip command contains spaces.
231
+ # Required for execpipe() but not execute(), as execute() already does this.
232
+
233
+ def self.quote(path)
234
+ if path.include?(" ")
235
+ "\"#{path}\""
236
+ else
237
+ path
238
+ end
239
+ end
213
240
  end
@@ -49,7 +49,7 @@ Puppet::Type.type(:package).provide :pkg, :parent => Puppet::Provider::Package d
49
49
  ).merge(
50
50
  case flags[1..1]
51
51
  when 'f'
52
- {:ensure => 'held'}
52
+ {:mark => :hold}
53
53
  when '-'
54
54
  {}
55
55
  else
@@ -107,6 +107,10 @@ Puppet::Type.type(:package).provide :pkg, :parent => Puppet::Provider::Package d
107
107
  end).merge({:provider => self.name})
108
108
  end
109
109
 
110
+ def deprecated_hold
111
+ hold
112
+ end
113
+
110
114
  def hold
111
115
  pkg(:freeze, @resource[:name])
112
116
  end
@@ -201,8 +205,6 @@ Puppet::Type.type(:package).provide :pkg, :parent => Puppet::Provider::Package d
201
205
  def install(nofail = false)
202
206
  name = @resource[:name]
203
207
  should = @resource[:ensure]
204
- # always unhold if explicitly told to install/update
205
- self.unhold
206
208
  is = self.query
207
209
  if is[:ensure].to_sym == :absent
208
210
  command = 'install'
@@ -216,7 +218,12 @@ Puppet::Type.type(:package).provide :pkg, :parent => Puppet::Provider::Package d
216
218
  unless should.is_a? Symbol
217
219
  name += "@#{should}"
218
220
  end
219
- r = exec_cmd(command(:pkg), command, *args, name)
221
+ self.unhold if self.properties[:mark] == :hold
222
+ begin
223
+ r = exec_cmd(command(:pkg), command, *args, name)
224
+ ensure
225
+ self.hold if @resource[:mark] == :hold
226
+ end
220
227
  return r if nofail
221
228
  raise Puppet::Error, _("Unable to update %{package}") % { package: r[:out] } if r[:exit] != 0
222
229
  end
@@ -230,7 +237,13 @@ Puppet::Type.type(:package).provide :pkg, :parent => Puppet::Provider::Package d
230
237
  cmd << '-r'
231
238
  end
232
239
  cmd << @resource[:name]
233
- pkg cmd
240
+ self.unhold if self.properties[:mark] == :hold
241
+ begin
242
+ pkg cmd
243
+ rescue StandardError, LoadError => e
244
+ self.hold if self.properties[:mark] == :hold
245
+ raise e
246
+ end
234
247
  end
235
248
 
236
249
  # update the package to the latest version available