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
@@ -102,7 +102,7 @@ Puppet::Type.type(:package).provide :pkgdmg, :parent => Puppet::Provider::Packag
102
102
  if source =~ /\.dmg$/i
103
103
  # If you fix this to use open-uri again, you must update the docs above. -NF
104
104
  File.open(cached_source) do |dmg|
105
- xml_str = hdiutil "mount", "-plist", "-nobrowse", "-readonly", "-noidme", "-mountrandom", "/tmp", dmg.path
105
+ xml_str = hdiutil "mount", "-plist", "-nobrowse", "-readonly", "-mountrandom", "/tmp", dmg.path
106
106
  hdiutil_info = Puppet::Util::Plist.parse_plist(xml_str)
107
107
  raise Puppet::Error.new(_("No disk entities returned by mount at %{path}") % { path: dmg.path }) unless hdiutil_info.has_key?("system-entities")
108
108
  mounts = hdiutil_info["system-entities"].collect { |entity|
@@ -11,6 +11,7 @@ Puppet::Type.type(:package).provide :pkgng, :parent => Puppet::Provider::Package
11
11
 
12
12
  has_feature :versionable
13
13
  has_feature :upgradeable
14
+ has_feature :install_options
14
15
 
15
16
  def self.get_query
16
17
  pkg(['query', '-a', '%n %v %o'])
@@ -22,7 +23,11 @@ Puppet::Type.type(:package).provide :pkgng, :parent => Puppet::Provider::Package
22
23
 
23
24
  def self.get_latest_version(origin, version_list)
24
25
  if latest_version = version_list.lines.find { |l| l =~ /^#{origin} / }
25
- latest_version = latest_version.split(' ').last.split(')').first
26
+ _name, compare, status = latest_version.chomp.split(' ', 3)
27
+ if ['!', '?'].include?(compare)
28
+ return nil
29
+ end
30
+ latest_version = status.split(' ').last.split(')').first
26
31
  return latest_version
27
32
  end
28
33
  nil
@@ -97,13 +102,16 @@ Puppet::Type.type(:package).provide :pkgng, :parent => Puppet::Provider::Package
97
102
  end
98
103
 
99
104
  if not source # install using default repo logic
100
- args = ['install', '-qy', installname]
105
+ args = ['install', '-qy']
101
106
  elsif source.scheme == 'urn' # install from repo named in URN
102
107
  tag = repo_tag_from_urn(source.to_s)
103
- args = ['install', '-qy', '-r', tag, installname]
108
+ args = ['install', '-qy', '-r', tag]
104
109
  else # add package located at URL
105
- args = ['add', '-q', source.to_s]
110
+ args = ['add', '-q']
111
+ installname = source.to_s
106
112
  end
113
+ args += install_options if @resource[:install_options]
114
+ args << installname
107
115
 
108
116
  pkg(args)
109
117
  end
@@ -140,4 +148,8 @@ Puppet::Type.type(:package).provide :pkgng, :parent => Puppet::Provider::Package
140
148
  @property_hash[:origin]
141
149
  end
142
150
 
151
+ def install_options
152
+ join_options(@resource[:install_options])
153
+ end
154
+
143
155
  end
@@ -70,7 +70,7 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
70
70
  name = qatom[:pfx] + name if qatom[:pfx]
71
71
  name = name + '-' + qatom[:pv] if qatom[:pv]
72
72
  name = name + '-' + qatom[:pr] if qatom[:pr]
73
- name = name + qatom[:slot] if qatom[:slot]
73
+ name = name + ':' + qatom[:slot] if qatom[:slot]
74
74
  cmd << '--update' if [:latest].include?(should)
75
75
  cmd += install_options if @resource[:install_options]
76
76
  cmd << name
@@ -84,7 +84,7 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
84
84
  name = qatom[:pfx] + name if qatom[:pfx]
85
85
  name = name + '-' + qatom[:pv] if qatom[:pv]
86
86
  name = name + '-' + qatom[:pr] if qatom[:pr]
87
- name = name + qatom[:slot] if qatom[:slot]
87
+ name = name + ':' + qatom[:slot] if qatom[:slot]
88
88
  cmd += uninstall_options if @resource[:uninstall_options]
89
89
  cmd << name
90
90
  if [:purged].include?(should)
@@ -169,7 +169,7 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
169
169
  package_sets << package_set.to_s.strip
170
170
  end
171
171
 
172
- if @resource[:name].match(/^@/)
172
+ if @resource[:name] =~ /^@/
173
173
  if package_sets.include?(@resource[:name][1..-1].to_s)
174
174
  return({:name => "#{@resource[:name]}", :ensure => '9999', :version_available => nil, :installed_versions => nil, :installable_versions => "9999,"})
175
175
  end
@@ -247,7 +247,7 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
247
247
  # [2.7.12: 2.7
248
248
  # 3.4.5: 3.4
249
249
  # 3.5.2: 3.5]
250
- version_for_slot = versions_and_slots.find { |version_and_slot| version_and_slot.last == slot[1..-1] }
250
+ version_for_slot = versions_and_slots.find { |version_and_slot| version_and_slot.last == slot }
251
251
  # [3.5.2: 3.5]
252
252
  version_for_slot.first if version_for_slot
253
253
  # 3.5.2
@@ -14,6 +14,7 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
14
14
  has_feature :install_options
15
15
  has_feature :uninstall_options
16
16
  has_feature :virtual_packages
17
+ has_feature :install_only
17
18
 
18
19
  # Note: self:: is required here to keep these constants in the context of what will
19
20
  # eventually become this Puppet::Type::Package::ProviderRpm class.
@@ -21,6 +22,7 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
21
22
  self::NEVRA_FORMAT = %Q{%{NAME} %|EPOCH?{%{EPOCH}}:{0}| %{VERSION} %{RELEASE} %{ARCH}\\n}
22
23
  self::NEVRA_REGEX = %r{^'?(\S+) (\S+) (\S+) (\S+) (\S+)$}
23
24
  self::NEVRA_FIELDS = [:name, :epoch, :version, :release, :arch]
25
+ self::MULTIVERSION_SEPARATOR = "; "
24
26
 
25
27
  ARCH_LIST = [
26
28
  'noarch',
@@ -80,12 +82,9 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
80
82
 
81
83
  # list out all of the packages
82
84
  begin
83
- execpipe("#{command(:rpm)} -qa #{nosignature} #{nodigest} --qf '#{self::NEVRA_FORMAT}'") { |process|
85
+ execpipe("#{command(:rpm)} -qa #{nosignature} #{nodigest} --qf '#{self::NEVRA_FORMAT}' | sort") { |process|
84
86
  # now turn each returned line into a package object
85
- process.each_line { |line|
86
- hash = nevra_to_hash(line)
87
- packages << new(hash) unless hash.empty?
88
- }
87
+ nevra_to_multiversion_hash(process).each { |hash| packages << new(hash) }
89
88
  }
90
89
  rescue Puppet::ExecutionFailure
91
90
  raise Puppet::Error, _("Failed to list packages"), $!.backtrace
@@ -101,7 +100,7 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
101
100
  #NOTE: Prior to a fix for issue 1243, this method potentially returned a cached value
102
101
  #IF YOU CALL THIS METHOD, IT WILL CALL RPM
103
102
  #Use get(:property) to check if cached values are available
104
- cmd = ["-q", @resource[:name], "#{self.class.nosignature}", "#{self.class.nodigest}", "--qf", "'#{self.class::NEVRA_FORMAT}'"]
103
+ cmd = ["-q", @resource[:name], "#{self.class.nosignature}", "#{self.class.nodigest}", "--qf", "#{self.class::NEVRA_FORMAT}"]
105
104
 
106
105
  begin
107
106
  output = rpm(*cmd)
@@ -118,9 +117,7 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
118
117
  return nil
119
118
  end
120
119
  end
121
- # FIXME: We could actually be getting back multiple packages
122
- # for multilib and this will only return the first such package
123
- @property_hash.update(self.class.nevra_to_hash(output))
120
+ @property_hash.update(self.class.nevra_to_multiversion_hash(output))
124
121
 
125
122
  @property_hash.dup
126
123
  end
@@ -131,8 +128,8 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
131
128
  @resource.fail _("RPMs must specify a package source")
132
129
  end
133
130
 
134
- cmd = [command(:rpm), "-q", "--qf", "'#{self.class::NEVRA_FORMAT}'", "-p", source]
135
- h = self.class.nevra_to_hash(execute(cmd))
131
+ cmd = [command(:rpm), "-q", "--qf", "#{self.class::NEVRA_FORMAT}", "-p", source]
132
+ h = self.class.nevra_to_multiversion_hash(execute(cmd))
136
133
  h[:ensure]
137
134
  rescue Puppet::ExecutionFailure => e
138
135
  raise Puppet::Error, e.message, e.backtrace
@@ -169,7 +166,11 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
169
166
  if @resource[:name].start_with? nav
170
167
  identifier = nav
171
168
  else
172
- identifier = name
169
+ if @resource[:install_only]
170
+ identifier = get(:ensure).split(self.class::MULTIVERSION_SEPARATOR).map { |ver| "#{name}-#{ver}" }
171
+ else
172
+ identifier = name
173
+ end
173
174
  end
174
175
  end
175
176
  # If an arch is specified in the resource, uninstall that arch,
@@ -228,14 +229,14 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
228
229
  str2 = str2.gsub(front_strip_re, '')
229
230
 
230
231
  # "handle the tilde separator, it sorts before everything else"
231
- if /^~/.match(str1) && /^~/.match(str2)
232
+ if str1 =~ /^~/ && str2 =~ /^~/
232
233
  # if they both have ~, strip it
233
234
  str1 = str1[1..-1]
234
235
  str2 = str2[1..-1]
235
236
  next
236
- elsif /^~/.match(str1)
237
+ elsif str1 =~ /^~/
237
238
  return -1
238
- elsif /^~/.match(str2)
239
+ elsif str2 =~ /^~/
239
240
  return 1
240
241
  end
241
242
 
@@ -244,7 +245,7 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
244
245
  # "grab first completely alpha or completely numeric segment"
245
246
  isnum = false
246
247
  # if the first char of str1 is a digit, grab the chunk of continuous digits from each string
247
- if /^[0-9]+/.match(str1)
248
+ if str1 =~ /^[0-9]+/
248
249
  if str1 =~ /^[0-9]+/
249
250
  segment1 = $~.to_s
250
251
  str1 = $~.post_match
@@ -309,8 +310,12 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
309
310
 
310
311
  def insync?(is)
311
312
  return false if [:purged, :absent].include?(is)
313
+ return false if is.include?(self.class::MULTIVERSION_SEPARATOR) && !@resource[:install_only]
314
+
312
315
  should = resource[:ensure]
313
- 0 == rpm_compareEVR(rpm_parse_evr(should), rpm_parse_evr(is))
316
+ is.split(self.class::MULTIVERSION_SEPARATOR).any? do |version|
317
+ 0 == self.rpm_compareEVR(rpm_parse_evr(should), rpm_parse_evr(version))
318
+ end
314
319
  end
315
320
 
316
321
  # parse a rpm "version" specification
@@ -335,8 +340,8 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
335
340
  v = s[0,ri]
336
341
  r = s[ri+1,s.length]
337
342
  if arch = r.scan(ARCH_REGEX)[0]
338
- a = arch.gsub(/\./, '')
339
- r.gsub!(ARCH_REGEX, '')
343
+ a = arch.delete('.')
344
+ r.gsub!(ARCH_REGEX, '')
340
345
  end
341
346
  else
342
347
  v = s
@@ -413,4 +418,37 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
413
418
 
414
419
  return hash
415
420
  end
421
+
422
+ # @param line [String] multiple lines of rpm package query information
423
+ # @return list of [Hash] of NEVRA_FIELDS strings parsed from package info
424
+ # or an empty list if we failed to parse
425
+ # @api private
426
+ def self.nevra_to_multiversion_hash(multiline)
427
+ list = []
428
+ multiversion_hash = {}
429
+ multiline.each_line do |line|
430
+ hash = self.nevra_to_hash(line)
431
+ if !hash.empty?
432
+ if multiversion_hash.empty?
433
+ multiversion_hash = hash.dup
434
+ next
435
+ end
436
+
437
+ if multiversion_hash[:name] != hash[:name]
438
+ list << multiversion_hash
439
+ multiversion_hash = hash.dup
440
+ next
441
+ end
442
+
443
+ if !multiversion_hash[:ensure].include?(hash[:ensure])
444
+ multiversion_hash[:ensure].concat("#{self::MULTIVERSION_SEPARATOR}#{hash[:ensure]}")
445
+ end
446
+ end
447
+ end
448
+ list << multiversion_hash if multiversion_hash
449
+ if list.size == 1
450
+ return list[0]
451
+ end
452
+ return list
453
+ end
416
454
  end
@@ -79,7 +79,7 @@ class Puppet::Provider::Package::Windows
79
79
 
80
80
  def self.replace_forward_slashes(value)
81
81
  if value.include?('/')
82
- value.gsub!('/', "\\")
82
+ value.tr!('/', "\\")
83
83
  Puppet.debug('Package source parameter contained /s - replaced with \\s')
84
84
  end
85
85
  value
@@ -9,7 +9,7 @@ Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm 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 => "yum", :rpm => "rpm"
15
15
 
@@ -25,6 +25,8 @@ Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm do
25
25
 
26
26
  defaultfor :osfamily => :redhat
27
27
 
28
+ VERSION_REGEX = /^(?:(\d+):)?(\S+)-(\S+)$/
29
+
28
30
  def self.prefetch(packages)
29
31
  raise Puppet::Error, _("The yum provider can only be used as root") if Process.euid != 0
30
32
  super
@@ -86,23 +88,24 @@ Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm do
86
88
  end
87
89
 
88
90
  def self.parse_updates(str)
89
- # Strip off all content before the first blank line
90
- body = str.partition(/^\s*\n/m).last
91
+ # Strip off all content that contains Obsoleting, Security: or Update
92
+ body = str.partition(/^(Obsoleting|Security:|Update)/).first
91
93
 
92
94
  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].match(/^(?:(\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
95
 
96
+ body.split(/^\s*\n/).each do |line|
97
+ line.split.each_slice(3) do |tuple|
98
+ next unless tuple[0].include?('.') && tuple[1] =~ VERSION_REGEX
99
+
100
+ hash = update_to_hash(*tuple[0..1])
101
+ # Create entries for both the package name without a version and a
102
+ # version since yum considers those as mostly interchangeable.
103
+ short_name = hash[:name]
104
+ long_name = "#{hash[:name]}.#{hash[:arch]}"
105
+ updates[short_name] << hash
106
+ updates[long_name] << hash
107
+ end
108
+ end
106
109
  updates
107
110
  end
108
111
 
@@ -117,7 +120,7 @@ Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm do
117
120
  raise _("Failed to parse package name and architecture from '%{pkgname}'") % { pkgname: pkgname }
118
121
  end
119
122
 
120
- match = pkgversion.match(/^(?:(\d+):)?(\S+)-(\S+)$/)
123
+ match = pkgversion.match(VERSION_REGEX)
121
124
  epoch = match[1] || '0'
122
125
  version = match[2]
123
126
  release = match[3]
@@ -203,7 +206,10 @@ Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm do
203
206
  end
204
207
  current_package = self.query
205
208
  if current_package
206
- if rpm_compareEVR(rpm_parse_evr(should), rpm_parse_evr(current_package[:ensure])) < 0
209
+ if @resource[:install_only]
210
+ self.debug "Updating package #{@resource[:name]} from version #{current_package[:ensure]} to #{should} as install_only packages are never downgraded"
211
+ operation = update_command
212
+ elsif rpm_compareEVR(rpm_parse_evr(should), rpm_parse_evr(current_package[:ensure])) < 0
207
213
  self.debug "Downgrading package #{@resource[:name]} from version #{current_package[:ensure]} to #{should}"
208
214
  operation = :downgrade
209
215
  elsif rpm_compareEVR(rpm_parse_evr(should), rpm_parse_evr(current_package[:ensure])) > 0
@@ -228,10 +234,11 @@ Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm do
228
234
  is = self.query
229
235
  raise Puppet::Error, _("Could not find package %{name}") % { name: self.name } unless is
230
236
 
237
+ version = is[:ensure]
231
238
  # FIXME: Should we raise an exception even if should == :latest
232
239
  # and yum updated us to a version other than @param_hash[:ensure] ?
233
- vercmp_result = rpm_compareEVR(rpm_parse_evr(should), rpm_parse_evr(is[:ensure]))
234
- raise Puppet::Error, _("Failed to update to version %{should}, got version %{version} instead") % { should: should, version: is[:ensure] } if vercmp_result != 0
240
+ raise Puppet::Error, _("Failed to update to version %{should}, got version %{version} instead") % { should: should, version: version } unless
241
+ insync?(version)
235
242
  end
236
243
  end
237
244
 
@@ -282,12 +289,16 @@ Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm do
282
289
  # @param key [String] The key to look for in all contained hashes
283
290
  # @return [Array<String>] All hash values with the given key.
284
291
  def scan_options(options, key)
285
- return [] if options.nil?
286
- options.inject([]) do |repos, opt|
287
- if opt.is_a? Hash and opt[key]
288
- repos << opt[key]
292
+ return [] unless options.is_a?(Enumerable)
293
+ values = options.map do | repo |
294
+ value = if repo.is_a?(String)
295
+ next unless repo.include?('=')
296
+ Hash[*repo.strip.split('=')] # make it a hash
297
+ else
298
+ repo
289
299
  end
290
- repos
300
+ value[key]
291
301
  end
302
+ values.compact.uniq
292
303
  end
293
304
  end
@@ -89,6 +89,7 @@ Puppet::Type.type(:package).provide :zypper, :parent => :rpm, :source => :rpm do
89
89
  options = []
90
90
  options << quiet
91
91
  options << '--no-gpg-check' unless inst_opts.delete('--no-gpg-check').nil?
92
+ options << '--no-gpg-checks' unless inst_opts.delete('--no-gpg-checks').nil?
92
93
  options << :install
93
94
 
94
95
  #zypper 0.6.13 (OpenSuSE 10.2) does not support auto agree with licenses
@@ -25,24 +25,25 @@ require 'puppet/provider/package'
25
25
  class Puppet::Provider::Package::Targetable < Puppet::Provider::Package
26
26
  # Prefetch our package list, yo.
27
27
  def self.prefetch(packages)
28
- catalog_packages = packages.first[1]::catalog::resources.select{ |p| p.provider.class == self }
28
+ catalog_packages = packages.values.first.catalog.resources.select{ |p| p.provider.class == self }
29
29
  package_commands = catalog_packages.map { |catalog_package| catalog_package::original_parameters[:command] }.uniq
30
30
  package_commands.each do |command|
31
31
  instances(command).each do |instance|
32
32
  catalog_packages.each do |catalog_package|
33
- if catalog_package[:name] == instance.name && catalog_package::original_parameters[:command] == command
33
+ if catalog_package[:name] == instance.name && catalog_package.original_parameters[:command] == command
34
34
  catalog_package.provider = instance
35
- self.debug "Prefetched instance: %{name} via command: %{command}" % { name: instance.name, cmd: (command || :default)}
35
+ self.debug "Prefetched instance: %{name} via command: %{cmd}" % { name: instance.name, cmd: (command || :default) }
36
36
  end
37
37
  end
38
38
  end
39
39
  end
40
+ package_commands
40
41
  end
41
42
 
42
43
  # Returns the resource command or provider command.
43
44
 
44
45
  def resource_or_provider_command
45
- resource::original_parameters[:command] || self.class.provider_command
46
+ resource.original_parameters[:command] || self.class.provider_command
46
47
  end
47
48
 
48
49
  # Targetable providers use has_command/is_optional to defer validation of provider suitability.
@@ -71,7 +71,7 @@ class Puppet::Provider::ParsedFile < Puppet::Provider
71
71
 
72
72
  flushed = []
73
73
  begin
74
- @modified.sort { |a,b| a.to_s <=> b.to_s }.uniq.each do |target|
74
+ @modified.sort_by(&:to_s).uniq.each do |target|
75
75
  Puppet.debug "Flushing #{@resource_type.name} provider target #{target}"
76
76
  flushed << target
77
77
  flush_target(target)
@@ -200,12 +200,12 @@ Puppet::Type.type(:scheduled_task).provide(:win32_taskscheduler) do
200
200
  def user=(value)
201
201
  self.fail("Invalid user: #{value}") unless Puppet::Util::Windows::SID.name_to_sid(value)
202
202
 
203
- if value.to_s.downcase != 'system'
204
- task.set_account_information(value, resource[:password])
205
- else
203
+ if value.to_s.casecmp('system').zero?
206
204
  # Win32::TaskScheduler treats a nil/empty username & password as
207
205
  # requesting the SYSTEM account.
208
206
  task.set_account_information(nil, nil)
207
+ else
208
+ task.set_account_information(value, resource[:password])
209
209
  end
210
210
  end
211
211
 
@@ -20,14 +20,7 @@ Puppet::Type.type(:selmodule).provide(:semodule) do
20
20
 
21
21
  def exists?
22
22
  self.debug "Checking for module #{@resource[:name]}"
23
- execpipe("#{command(:semodule)} --list") do |out|
24
- out.each_line do |line|
25
- if line =~ /^#{@resource[:name]}\b/
26
- return :true
27
- end
28
- end
29
- end
30
- nil
23
+ return selmodules_loaded.has_key?(@resource[:name])
31
24
  end
32
25
 
33
26
  def syncversion
@@ -35,7 +28,7 @@ Puppet::Type.type(:selmodule).provide(:semodule) do
35
28
 
36
29
  loadver = selmodversion_loaded
37
30
 
38
- if(loadver) then
31
+ if (loadver) then
39
32
  filever = selmodversion_file
40
33
  if (filever == loadver)
41
34
  return :true
@@ -44,7 +37,7 @@ Puppet::Type.type(:selmodule).provide(:semodule) do
44
37
  :false
45
38
  end
46
39
 
47
- def syncversion= (dosync)
40
+ def syncversion=(dosync)
48
41
  execoutput("#{command(:semodule)} --upgrade #{selmod_name_to_filename}")
49
42
  rescue Puppet::ExecutionFailure => detail
50
43
  raise Puppet::Error, "Could not upgrade policy module: #{detail}", detail.backtrace
@@ -52,7 +45,7 @@ Puppet::Type.type(:selmodule).provide(:semodule) do
52
45
 
53
46
  # Helper functions
54
47
 
55
- def execoutput (cmd)
48
+ def execoutput(cmd)
56
49
  output = ''
57
50
  begin
58
51
  execpipe(cmd) do |out|
@@ -72,7 +65,7 @@ Puppet::Type.type(:selmodule).provide(:semodule) do
72
65
  end
73
66
  end
74
67
 
75
- def selmod_readnext (handle)
68
+ def selmod_readnext(handle)
76
69
  len = handle.read(4).unpack('V')[0]
77
70
  handle.read(len)
78
71
  end
@@ -118,23 +111,47 @@ Puppet::Type.type(:selmodule).provide(:semodule) do
118
111
  end
119
112
 
120
113
  def selmodversion_loaded
121
- selmod_output = []
122
- selmodule_cmd = "#{command(:semodule)} --list"
123
- begin
124
- execpipe(selmodule_cmd) do |output|
125
- output.each_line do |line|
126
- line.chomp!
127
- selmod_output << line
128
- bits = line.split
129
- if bits[0] == @resource[:name]
130
- self.debug "load version #{bits[1]}"
131
- return bits[1]
114
+ selmodules_loaded[@resource[:name]]
115
+ end
116
+
117
+ def selmodules_loaded
118
+ self.class.selmodules_loaded
119
+ end
120
+
121
+ # Extend Class
122
+
123
+ class << self
124
+ attr_accessor :loaded_modules
125
+ end
126
+
127
+ # Prefetch loaded selinux modules.
128
+ def self.prefetch(resources)
129
+ selmodules_loaded
130
+ end
131
+
132
+ def self.selmodules_loaded
133
+ if self.loaded_modules.nil?
134
+ self.debug "Fetching loaded selinux modules"
135
+ modules = {}
136
+ selmodule_cmd = "#{command(:semodule)} --list"
137
+ output = []
138
+ begin
139
+ execpipe(selmodule_cmd) do |pipe|
140
+ pipe.each_line do |line|
141
+ line.chomp!
142
+ output << line
143
+ name, version = line.split
144
+ modules[name] = version
132
145
  end
133
146
  end
147
+ self.loaded_modules = modules
148
+ rescue Puppet::ExecutionFailure
149
+ raise Puppet::Error,
150
+ _('Could not list policy modules: "%{selmodule_command}" failed with "%{selmod_output}"') %
151
+ { selmodule_command: selmodule_cmd, selmod_output: output.join(' ') },
152
+ $ERROR_INFO.backtrace
134
153
  end
135
- rescue Puppet::ExecutionFailure
136
- raise Puppet::ExecutionFailure, _("Could not list policy modules: \"%{selmodule_command}\" failed with \"%{selmod_output}\"") % { selmodule_command: selmodule_cmd, selmod_output: selmod_output.join(' ') }
137
154
  end
138
- nil
155
+ self.loaded_modules
139
156
  end
140
157
  end