puppet 6.15.0-x64-mingw32 → 6.19.1-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 (418) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/Gemfile +4 -2
  4. data/Gemfile.lock +29 -27
  5. data/README.md +3 -4
  6. data/Rakefile +4 -12
  7. data/lib/puppet.rb +32 -8
  8. data/lib/puppet/agent.rb +18 -4
  9. data/lib/puppet/agent/locker.rb +0 -7
  10. data/lib/puppet/application/agent.rb +23 -8
  11. data/lib/puppet/application/apply.rb +18 -20
  12. data/lib/puppet/application/device.rb +1 -1
  13. data/lib/puppet/application/doc.rb +1 -1
  14. data/lib/puppet/application/lookup.rb +16 -4
  15. data/lib/puppet/application/plugin.rb +1 -0
  16. data/lib/puppet/application/ssl.rb +1 -1
  17. data/lib/puppet/configurer.rb +61 -21
  18. data/lib/puppet/configurer/downloader.rb +31 -10
  19. data/lib/puppet/confine.rb +2 -2
  20. data/lib/puppet/confine/any.rb +1 -1
  21. data/lib/puppet/context/trusted_information.rb +14 -8
  22. data/lib/puppet/daemon.rb +13 -27
  23. data/lib/puppet/defaults.rb +119 -39
  24. data/lib/puppet/environments.rb +51 -10
  25. data/lib/puppet/face/catalog.rb +1 -1
  26. data/lib/puppet/face/config.rb +46 -16
  27. data/lib/puppet/face/facts.rb +1 -1
  28. data/lib/puppet/face/help.rb +29 -3
  29. data/lib/puppet/face/module/search.rb +5 -0
  30. data/lib/puppet/face/node.rb +3 -3
  31. data/lib/puppet/face/node/clean.rb +2 -2
  32. data/lib/puppet/face/plugin.rb +1 -1
  33. data/lib/puppet/face/status.rb +1 -1
  34. data/lib/puppet/feature/base.rb +1 -1
  35. data/lib/puppet/file_bucket/dipper.rb +1 -1
  36. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  37. data/lib/puppet/file_serving/metadata.rb +4 -1
  38. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  39. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  40. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  41. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  42. data/lib/puppet/file_system/file_impl.rb +4 -4
  43. data/lib/puppet/file_system/uniquefile.rb +12 -16
  44. data/lib/puppet/forge.rb +1 -1
  45. data/lib/puppet/forge/cache.rb +1 -1
  46. data/lib/puppet/forge/repository.rb +4 -7
  47. data/lib/puppet/functions/filter.rb +1 -0
  48. data/lib/puppet/functions/lstrip.rb +4 -4
  49. data/lib/puppet/functions/new.rb +8 -3
  50. data/lib/puppet/functions/reverse_each.rb +1 -1
  51. data/lib/puppet/functions/rstrip.rb +4 -4
  52. data/lib/puppet/functions/step.rb +1 -1
  53. data/lib/puppet/functions/strip.rb +4 -4
  54. data/lib/puppet/gettext/config.rb +5 -5
  55. data/lib/puppet/gettext/module_translations.rb +4 -4
  56. data/lib/puppet/http.rb +1 -0
  57. data/lib/puppet/http/client.rb +28 -12
  58. data/lib/puppet/http/external_client.rb +0 -6
  59. data/lib/puppet/http/redirector.rb +9 -7
  60. data/lib/puppet/http/resolver.rb +5 -8
  61. data/lib/puppet/http/resolver/server_list.rb +18 -36
  62. data/lib/puppet/http/resolver/settings.rb +4 -4
  63. data/lib/puppet/http/resolver/srv.rb +5 -5
  64. data/lib/puppet/http/response.rb +19 -0
  65. data/lib/puppet/http/service.rb +3 -1
  66. data/lib/puppet/http/service/compiler.rb +1 -1
  67. data/lib/puppet/http/service/file_server.rb +1 -1
  68. data/lib/puppet/http/service/puppetserver.rb +39 -0
  69. data/lib/puppet/http/session.rb +5 -4
  70. data/lib/puppet/indirector.rb +1 -1
  71. data/lib/puppet/indirector/catalog/compiler.rb +1 -1
  72. data/lib/puppet/indirector/exec.rb +1 -1
  73. data/lib/puppet/indirector/facts/facter.rb +3 -3
  74. data/lib/puppet/indirector/facts/yaml.rb +1 -1
  75. data/lib/puppet/indirector/file_content/http.rb +5 -0
  76. data/lib/puppet/indirector/file_content/rest.rb +1 -1
  77. data/lib/puppet/indirector/file_metadata/http.rb +28 -8
  78. data/lib/puppet/indirector/file_metadata/rest.rb +2 -2
  79. data/lib/puppet/indirector/hiera.rb +4 -0
  80. data/lib/puppet/indirector/indirection.rb +1 -1
  81. data/lib/puppet/indirector/json.rb +1 -1
  82. data/lib/puppet/indirector/msgpack.rb +1 -1
  83. data/lib/puppet/indirector/report/processor.rb +2 -2
  84. data/lib/puppet/indirector/request.rb +5 -5
  85. data/lib/puppet/indirector/rest.rb +7 -1
  86. data/lib/puppet/indirector/yaml.rb +1 -1
  87. data/lib/puppet/module.rb +1 -2
  88. data/lib/puppet/network/format_support.rb +2 -2
  89. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  90. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  91. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  92. data/lib/puppet/network/http/compression.rb +7 -0
  93. data/lib/puppet/network/http/connection.rb +2 -0
  94. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  95. data/lib/puppet/network/http/nocache_pool.rb +1 -0
  96. data/lib/puppet/network/http/route.rb +2 -2
  97. data/lib/puppet/network/http_pool.rb +2 -2
  98. data/lib/puppet/node/environment.rb +12 -5
  99. data/lib/puppet/node/facts.rb +17 -0
  100. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  101. data/lib/puppet/pal/pal_impl.rb +31 -4
  102. data/lib/puppet/parameter.rb +1 -1
  103. data/lib/puppet/parser/ast/leaf.rb +5 -5
  104. data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
  105. data/lib/puppet/parser/compiler.rb +29 -26
  106. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  107. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  108. data/lib/puppet/parser/environment_compiler.rb +4 -1
  109. data/lib/puppet/parser/functions.rb +21 -17
  110. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  111. data/lib/puppet/parser/functions/filter.rb +1 -0
  112. data/lib/puppet/parser/resource.rb +3 -2
  113. data/lib/puppet/parser/resource/param.rb +6 -0
  114. data/lib/puppet/parser/type_loader.rb +2 -2
  115. data/lib/puppet/pops/adaptable.rb +7 -13
  116. data/lib/puppet/pops/adapters.rb +8 -4
  117. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  118. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  119. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  120. data/lib/puppet/pops/issues.rb +5 -0
  121. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  122. data/lib/puppet/pops/loaders.rb +18 -11
  123. data/lib/puppet/pops/lookup/context.rb +1 -1
  124. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  125. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  126. data/lib/puppet/pops/types/iterable.rb +34 -8
  127. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  128. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  129. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  130. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  131. data/lib/puppet/provider/file/windows.rb +1 -1
  132. data/lib/puppet/provider/package/aix.rb +17 -2
  133. data/lib/puppet/provider/package/apt.rb +38 -1
  134. data/lib/puppet/provider/package/aptitude.rb +1 -1
  135. data/lib/puppet/provider/package/dnfmodule.rb +24 -4
  136. data/lib/puppet/provider/package/dpkg.rb +1 -1
  137. data/lib/puppet/provider/package/gem.rb +4 -2
  138. data/lib/puppet/provider/package/pip.rb +60 -37
  139. data/lib/puppet/provider/package/pip2.rb +17 -0
  140. data/lib/puppet/provider/package/portage.rb +2 -2
  141. data/lib/puppet/provider/package/puppet_gem.rb +5 -0
  142. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  143. data/lib/puppet/provider/package/yum.rb +9 -1
  144. data/lib/puppet/provider/package/zypper.rb +62 -1
  145. data/lib/puppet/provider/service/systemd.rb +21 -4
  146. data/lib/puppet/provider/service/windows.rb +23 -7
  147. data/lib/puppet/provider/user/aix.rb +1 -1
  148. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  149. data/lib/puppet/provider/user/useradd.rb +16 -5
  150. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  151. data/lib/puppet/reports/http.rb +7 -3
  152. data/lib/puppet/resource.rb +2 -1
  153. data/lib/puppet/resource/type.rb +10 -1
  154. data/lib/puppet/rest/route.rb +2 -2
  155. data/lib/puppet/runtime.rb +25 -2
  156. data/lib/puppet/settings.rb +43 -6
  157. data/lib/puppet/ssl/ssl_context.rb +2 -2
  158. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  159. data/lib/puppet/ssl/state_machine.rb +33 -8
  160. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  161. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  162. data/lib/puppet/test/test_helper.rb +19 -14
  163. data/lib/puppet/transaction.rb +2 -2
  164. data/lib/puppet/transaction/persistence.rb +1 -1
  165. data/lib/puppet/transaction/report.rb +12 -8
  166. data/lib/puppet/trusted_external.rb +29 -1
  167. data/lib/puppet/type.rb +15 -7
  168. data/lib/puppet/type/file.rb +40 -15
  169. data/lib/puppet/type/file/checksum.rb +4 -4
  170. data/lib/puppet/type/file/source.rb +33 -13
  171. data/lib/puppet/type/filebucket.rb +1 -1
  172. data/lib/puppet/type/notify.rb +2 -2
  173. data/lib/puppet/type/package.rb +16 -1
  174. data/lib/puppet/type/service.rb +59 -8
  175. data/lib/puppet/type/user.rb +19 -10
  176. data/lib/puppet/util.rb +41 -3
  177. data/lib/puppet/util/autoload.rb +10 -25
  178. data/lib/puppet/util/character_encoding.rb +9 -5
  179. data/lib/puppet/util/checksums.rb +19 -4
  180. data/lib/puppet/util/connection.rb +8 -8
  181. data/lib/puppet/util/execution.rb +2 -2
  182. data/lib/puppet/util/fileparsing.rb +2 -2
  183. data/lib/puppet/util/log/destinations.rb +1 -10
  184. data/lib/puppet/util/package/version/range.rb +4 -1
  185. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  186. data/lib/puppet/util/provider_features.rb +1 -1
  187. data/lib/puppet/util/reference.rb +1 -1
  188. data/lib/puppet/util/run_mode.rb +5 -1
  189. data/lib/puppet/util/windows.rb +1 -0
  190. data/lib/puppet/util/windows/api_types.rb +60 -33
  191. data/lib/puppet/util/windows/eventlog.rb +1 -6
  192. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  193. data/lib/puppet/util/windows/principal.rb +8 -6
  194. data/lib/puppet/util/windows/registry.rb +11 -11
  195. data/lib/puppet/util/windows/security.rb +4 -4
  196. data/lib/puppet/util/windows/service.rb +43 -26
  197. data/lib/puppet/util/windows/user.rb +242 -8
  198. data/lib/puppet/version.rb +1 -1
  199. data/locales/puppet.pot +541 -427
  200. data/man/man5/puppet.conf.5 +84 -19
  201. data/man/man8/puppet-agent.8 +7 -4
  202. data/man/man8/puppet-apply.8 +1 -1
  203. data/man/man8/puppet-catalog.8 +1 -1
  204. data/man/man8/puppet-config.8 +6 -6
  205. data/man/man8/puppet-describe.8 +1 -1
  206. data/man/man8/puppet-device.8 +1 -1
  207. data/man/man8/puppet-doc.8 +1 -1
  208. data/man/man8/puppet-epp.8 +1 -1
  209. data/man/man8/puppet-facts.8 +1 -1
  210. data/man/man8/puppet-filebucket.8 +1 -1
  211. data/man/man8/puppet-generate.8 +1 -1
  212. data/man/man8/puppet-help.8 +6 -3
  213. data/man/man8/puppet-key.8 +1 -1
  214. data/man/man8/puppet-lookup.8 +2 -2
  215. data/man/man8/puppet-man.8 +1 -1
  216. data/man/man8/puppet-module.8 +4 -1
  217. data/man/man8/puppet-node.8 +4 -4
  218. data/man/man8/puppet-parser.8 +1 -1
  219. data/man/man8/puppet-plugin.8 +1 -1
  220. data/man/man8/puppet-report.8 +1 -1
  221. data/man/man8/puppet-resource.8 +1 -1
  222. data/man/man8/puppet-script.8 +1 -1
  223. data/man/man8/puppet-ssl.8 +1 -1
  224. data/man/man8/puppet-status.8 +2 -2
  225. data/man/man8/puppet.8 +2 -2
  226. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  227. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  228. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  229. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  230. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-enabled.txt → dnf-module-list.txt} +6 -0
  231. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  232. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  233. data/spec/integration/application/agent_spec.rb +202 -52
  234. data/spec/integration/application/apply_spec.rb +149 -149
  235. data/spec/integration/application/config_spec.rb +74 -0
  236. data/spec/integration/application/doc_spec.rb +16 -6
  237. data/spec/integration/application/filebucket_spec.rb +70 -21
  238. data/spec/integration/application/help_spec.rb +42 -0
  239. data/spec/integration/application/lookup_spec.rb +13 -0
  240. data/spec/integration/application/module_spec.rb +68 -0
  241. data/spec/integration/application/plugin_spec.rb +75 -2
  242. data/spec/integration/configurer_spec.rb +14 -0
  243. data/spec/integration/data_binding_spec.rb +82 -0
  244. data/spec/integration/defaults_spec.rb +27 -3
  245. data/spec/integration/directory_environments_spec.rb +17 -17
  246. data/spec/integration/http/client_spec.rb +6 -1
  247. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  248. data/spec/integration/network/http_pool_spec.rb +73 -0
  249. data/spec/integration/node/environment_spec.rb +1 -1
  250. data/spec/integration/parser/compiler_spec.rb +11 -0
  251. data/spec/integration/type/file_spec.rb +1 -1
  252. data/spec/integration/util/execution_spec.rb +22 -0
  253. data/spec/integration/util/windows/adsi_spec.rb +7 -2
  254. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  255. data/spec/integration/util/windows/process_spec.rb +26 -32
  256. data/spec/integration/util/windows/registry_spec.rb +7 -7
  257. data/spec/integration/util/windows/user_spec.rb +47 -5
  258. data/spec/integration/util_spec.rb +7 -33
  259. data/spec/lib/puppet_spec/https.rb +6 -0
  260. data/spec/lib/puppet_spec/matchers.rb +0 -80
  261. data/spec/lib/puppet_spec/puppetserver.rb +8 -0
  262. data/spec/shared_contexts/types_setup.rb +2 -0
  263. data/spec/unit/agent_spec.rb +47 -1
  264. data/spec/unit/application/agent_spec.rb +7 -8
  265. data/spec/unit/application/doc_spec.rb +2 -2
  266. data/spec/unit/application/face_base_spec.rb +6 -4
  267. data/spec/unit/application/facts_spec.rb +41 -10
  268. data/spec/unit/application/man_spec.rb +52 -0
  269. data/spec/unit/application/resource_spec.rb +3 -1
  270. data/spec/unit/application/ssl_spec.rb +15 -2
  271. data/spec/unit/application_spec.rb +9 -4
  272. data/spec/unit/configurer/downloader_spec.rb +10 -0
  273. data/spec/unit/configurer/fact_handler_spec.rb +4 -4
  274. data/spec/unit/configurer_spec.rb +86 -37
  275. data/spec/unit/confine_spec.rb +2 -1
  276. data/spec/unit/context/trusted_information_spec.rb +25 -2
  277. data/spec/unit/daemon_spec.rb +5 -64
  278. data/spec/unit/environments_spec.rb +99 -32
  279. data/spec/unit/face/config_spec.rb +59 -1
  280. data/spec/unit/face/module/search_spec.rb +17 -0
  281. data/spec/unit/face/node_spec.rb +2 -2
  282. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  283. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  284. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  285. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  286. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  287. data/spec/unit/file_system/uniquefile_spec.rb +29 -0
  288. data/spec/unit/file_system_spec.rb +1 -2
  289. data/spec/unit/http/client_spec.rb +74 -19
  290. data/spec/unit/http/external_client_spec.rb +9 -9
  291. data/spec/unit/http/resolver_spec.rb +24 -5
  292. data/spec/unit/http/response_spec.rb +6 -0
  293. data/spec/unit/http/service/ca_spec.rb +2 -3
  294. data/spec/unit/http/service/compiler_spec.rb +2 -3
  295. data/spec/unit/http/service/file_server_spec.rb +2 -3
  296. data/spec/unit/http/service/puppetserver_spec.rb +82 -0
  297. data/spec/unit/http/service/report_spec.rb +2 -3
  298. data/spec/unit/http/service_spec.rb +0 -1
  299. data/spec/unit/http/session_spec.rb +8 -21
  300. data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
  301. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  302. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  303. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  304. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  305. data/spec/unit/indirector/file_metadata/rest_spec.rb +15 -14
  306. data/spec/unit/indirector/json_spec.rb +8 -8
  307. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  308. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  309. data/spec/unit/indirector/request_spec.rb +5 -5
  310. data/spec/unit/indirector/rest_spec.rb +14 -1
  311. data/spec/unit/indirector/status/rest_spec.rb +1 -1
  312. data/spec/unit/indirector/yaml_spec.rb +7 -7
  313. data/spec/unit/interface_spec.rb +3 -3
  314. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  315. data/spec/unit/network/format_support_spec.rb +3 -2
  316. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  317. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  318. data/spec/unit/network/http/connection_spec.rb +552 -190
  319. data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
  320. data/spec/unit/network/http_pool_spec.rb +63 -57
  321. data/spec/unit/network/http_spec.rb +1 -1
  322. data/spec/unit/node/environment_spec.rb +18 -1
  323. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  324. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  325. data/spec/unit/parser/scope_spec.rb +1 -1
  326. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  327. data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
  328. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  329. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  330. data/spec/unit/provider/exec_spec.rb +4 -3
  331. data/spec/unit/provider/package/aix_spec.rb +29 -0
  332. data/spec/unit/provider/package/apt_spec.rb +77 -0
  333. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  334. data/spec/unit/provider/package/dnfmodule_spec.rb +25 -5
  335. data/spec/unit/provider/package/dpkg_spec.rb +22 -7
  336. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  337. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  338. data/spec/unit/provider/package/pip_spec.rb +42 -16
  339. data/spec/unit/provider/package/portage_spec.rb +5 -0
  340. data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
  341. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  342. data/spec/unit/provider/package/yum_spec.rb +47 -8
  343. data/spec/unit/provider/package/zypper_spec.rb +98 -0
  344. data/spec/unit/provider/service/base_spec.rb +2 -4
  345. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  346. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  347. data/spec/unit/provider/service/debian_spec.rb +3 -5
  348. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  349. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  350. data/spec/unit/provider/service/init_spec.rb +46 -5
  351. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  352. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  353. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  354. data/spec/unit/provider/service/openwrt_spec.rb +2 -1
  355. data/spec/unit/provider/service/redhat_spec.rb +10 -1
  356. data/spec/unit/provider/service/runit_spec.rb +2 -1
  357. data/spec/unit/provider/service/smf_spec.rb +1 -1
  358. data/spec/unit/provider/service/src_spec.rb +3 -5
  359. data/spec/unit/provider/service/systemd_spec.rb +87 -19
  360. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  361. data/spec/unit/provider/service/windows_spec.rb +50 -14
  362. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  363. data/spec/unit/provider/user/useradd_spec.rb +30 -16
  364. data/spec/unit/provider/user/windows_adsi_spec.rb +82 -0
  365. data/spec/unit/puppet_pal_2pec.rb +40 -0
  366. data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
  367. data/spec/unit/puppet_spec.rb +33 -0
  368. data/spec/unit/reports/http_spec.rb +1 -1
  369. data/spec/unit/reports/store_spec.rb +17 -13
  370. data/spec/unit/resource_spec.rb +3 -3
  371. data/spec/unit/rest/route_spec.rb +4 -4
  372. data/spec/unit/settings_spec.rb +182 -22
  373. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  374. data/spec/unit/ssl/state_machine_spec.rb +52 -8
  375. data/spec/unit/test/test_helper_spec.rb +17 -0
  376. data/spec/unit/transaction/persistence_spec.rb +15 -0
  377. data/spec/unit/transaction/report_spec.rb +3 -1
  378. data/spec/unit/type/file/source_spec.rb +4 -4
  379. data/spec/unit/type/file_spec.rb +122 -96
  380. data/spec/unit/type/filebucket_spec.rb +1 -1
  381. data/spec/unit/type/service_spec.rb +218 -8
  382. data/spec/unit/type/user_spec.rb +32 -3
  383. data/spec/unit/type_spec.rb +50 -0
  384. data/spec/unit/util/autoload_spec.rb +2 -1
  385. data/spec/unit/util/character_encoding_spec.rb +4 -4
  386. data/spec/unit/util/checksums_spec.rb +16 -0
  387. data/spec/unit/util/command_line_spec.rb +11 -6
  388. data/spec/unit/util/log/destinations_spec.rb +1 -29
  389. data/spec/unit/util/package/version/range_spec.rb +22 -1
  390. data/spec/unit/util/run_mode_spec.rb +6 -6
  391. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  392. data/spec/unit/util/windows/service_spec.rb +4 -4
  393. data/spec/unit/util_spec.rb +3 -3
  394. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  395. data/tasks/manpages.rake +5 -35
  396. metadata +43 -49
  397. data/spec/integration/faces/config_spec.rb +0 -91
  398. data/spec/integration/faces/documentation_spec.rb +0 -57
  399. data/spec/integration/file_bucket/file_spec.rb +0 -50
  400. data/spec/integration/file_serving/content_spec.rb +0 -7
  401. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  402. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  403. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  404. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  405. data/spec/integration/module_tool/forge_spec.rb +0 -51
  406. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  407. data/spec/integration/provider/service/init_spec.rb +0 -48
  408. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  409. data/spec/integration/provider/service/windows_spec.rb +0 -50
  410. data/spec/integration/reference/providers_spec.rb +0 -21
  411. data/spec/integration/reports_spec.rb +0 -13
  412. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  413. data/spec/integration/ssl/host_spec.rb +0 -72
  414. data/spec/integration/ssl/key_spec.rb +0 -99
  415. data/spec/integration/test/test_helper_spec.rb +0 -31
  416. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  417. data/spec/unit/face/man_spec.rb +0 -25
  418. data/spec/unit/man_spec.rb +0 -31
@@ -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
@@ -53,11 +53,13 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package::
53
53
  #
54
54
  # In this case, causing the puppet_gem provider to inherit the parent gem provider's convenience gemcmd() methods, with the wrong path.
55
55
 
56
- def self.execute_gem_command(command, command_options)
56
+ def self.execute_gem_command(command, command_options, custom_environment = {})
57
57
  validate_command(command)
58
58
  cmd = [command] << command_options
59
59
 
60
- 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})
61
63
  end
62
64
 
63
65
  def self.instances(target_command = nil)
@@ -79,7 +79,7 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
79
79
  command_options << '--all'
80
80
  end
81
81
 
82
- execpipe [command, command_options] do |process|
82
+ execpipe [quote(command), command_options] do |process|
83
83
  process.collect do |line|
84
84
  pkg = parse(line)
85
85
  next unless pkg
@@ -158,7 +158,7 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
158
158
  command = resource_or_provider_command
159
159
  self.class.validate_command(command)
160
160
 
161
- command_and_options = [command, 'install', "#{@resource[:name]}==versionplease"]
161
+ command_and_options = [self.class.quote(command), 'install', "#{@resource[:name]}==versionplease"]
162
162
  command_and_options << install_options if @resource[:install_options]
163
163
  execpipe command_and_options do |process|
164
164
  process.collect do |line|
@@ -179,7 +179,7 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
179
179
  self.class.validate_command(command)
180
180
 
181
181
  Dir.mktmpdir("puppet_pip") do |dir|
182
- command_and_options = [command, 'install', "#{@resource[:name]}", '-d', "#{dir}", '-v']
182
+ command_and_options = [self.class.quote(command), 'install', "#{@resource[:name]}", '-d', "#{dir}", '-v']
183
183
  command_and_options << install_options if @resource[:install_options]
184
184
  execpipe command_and_options do |process|
185
185
  process.collect do |line|
@@ -211,51 +211,73 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
211
211
  should_range
212
212
  end
213
213
 
214
- # Install a package. The ensure parameter may specify installed,
215
- # latest, a version number, or, in conjunction with the source
216
- # parameter, an SCM revision. In that case, the source parameter
217
- # gives the fully-qualified URL to the repository.
218
- def install
219
- command = resource_or_provider_command
220
- self.class.validate_command(command)
221
-
214
+ def get_install_command_options()
222
215
  should = @resource[:ensure]
223
216
  command_options = %w{install -q}
224
- command_options += install_options if @resource[:install_options]
217
+ command_options += install_options if @resource[:install_options]
218
+
225
219
  if @resource[:source]
226
220
  if String === should
227
221
  command_options << "#{@resource[:source]}@#{should}#egg=#{@resource[:name]}"
228
222
  else
229
223
  command_options << "#{@resource[:source]}#egg=#{@resource[:name]}"
230
224
  end
231
- else
232
- case should
233
- when :latest
234
- command_options << "--upgrade" << @resource[:name]
235
- when String
236
- begin
237
- should_range = PIP_VERSION_RANGE.parse(should, PIP_VERSION)
238
- should = best_version(should_range)
239
-
240
- unless should == should_range
241
- command_options << "#{@resource[:name]}==#{should}"
242
- else
243
- # when no suitable version for the given range was found, let pip handle
244
- if should.is_a?(PIP_VERSION_RANGE::MinMax)
245
- command_options << "#{@resource[:name]} #{should.split.join(',')}"
246
- else
247
- command_options << "#{@resource[:name]} #{should}"
248
- end
249
- end
250
- rescue PIP_VERSION_RANGE::ValidationFailure, PIP_VERSION::ValidationFailure
251
- Puppet.debug("Cannot parse #{should} as a pip version range, falling through.")
252
- command_options << "#{@resource[:name]}==#{should}"
253
- end
225
+
226
+ return command_options
227
+ end
228
+
229
+ if should == :latest
230
+ command_options << "--upgrade" << @resource[:name]
231
+
232
+ return command_options
233
+ end
234
+
235
+ unless String === should
236
+ command_options << @resource[:name]
237
+
238
+ return command_options
239
+ end
240
+
241
+ begin
242
+ should_range = PIP_VERSION_RANGE.parse(should, PIP_VERSION)
243
+ rescue PIP_VERSION_RANGE::ValidationFailure, PIP_VERSION::ValidationFailure
244
+ Puppet.debug("Cannot parse #{should} as a pip version range, falling through.")
245
+ command_options << "#{@resource[:name]}==#{should}"
246
+
247
+ return command_options
248
+ end
249
+
250
+ if should_range.is_a?(PIP_VERSION_RANGE::Eq)
251
+ command_options << "#{@resource[:name]}==#{should}"
252
+
253
+ return command_options
254
+ end
255
+
256
+ should = best_version(should_range)
257
+
258
+ if should == should_range
259
+ # when no suitable version for the given range was found, let pip handle
260
+ if should.is_a?(PIP_VERSION_RANGE::MinMax)
261
+ command_options << "#{@resource[:name]} #{should.split.join(',')}"
254
262
  else
255
- command_options << @resource[:name]
263
+ command_options << "#{@resource[:name]} #{should}"
256
264
  end
265
+ else
266
+ command_options << "#{@resource[:name]}==#{should}"
257
267
  end
258
268
 
269
+ command_options
270
+ end
271
+
272
+ # Install a package. The ensure parameter may specify installed,
273
+ # latest, a version number, or, in conjunction with the source
274
+ # parameter, an SCM revision. In that case, the source parameter
275
+ # gives the fully-qualified URL to the repository.
276
+ def install
277
+ command = resource_or_provider_command
278
+ self.class.validate_command(command)
279
+
280
+ command_options = get_install_command_options
259
281
  execute([command, command_options])
260
282
  end
261
283
 
@@ -298,6 +320,8 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
298
320
  should_range.include?(is_version)
299
321
  end
300
322
 
323
+ # Quoting is required if the path to the pip command contains spaces.
324
+ # Required for execpipe() but not execute(), as execute() already does this.
301
325
  def self.quote(path)
302
326
  if path.include?(" ")
303
327
  "\"#{path}\""
@@ -305,5 +329,4 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
305
329
  path
306
330
  end
307
331
  end
308
- private_class_method :quote
309
332
  end
@@ -0,0 +1,17 @@
1
+ # Puppet package provider for Python's `pip2` package management frontend.
2
+ # <http://pip.pypa.io/>
3
+
4
+ Puppet::Type.type(:package).provide :pip2,
5
+ :parent => :pip do
6
+
7
+ desc "Python packages via `pip2`.
8
+
9
+ This provider supports the `install_options` attribute, which allows command-line flags to be passed to pip2.
10
+ These options should be specified as an array where each element is either a string or a hash."
11
+
12
+ has_feature :installable, :uninstallable, :upgradeable, :versionable, :install_options, :targetable
13
+
14
+ def self.cmd
15
+ ["pip2"]
16
+ end
17
+ end
@@ -20,9 +20,9 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
20
20
  end
21
21
  end
22
22
 
23
- confine :operatingsystem => :gentoo
23
+ confine :osfamily => :gentoo
24
24
 
25
- defaultfor :operatingsystem => :gentoo
25
+ defaultfor :osfamily => :gentoo
26
26
 
27
27
  def self.instances
28
28
  result_format = self.eix_result_format
@@ -18,4 +18,9 @@ Puppet::Type.type(:package).provide :puppet_gem, :parent => :gem do
18
18
  Puppet.debug("Invalidating rubygems cache after uninstalling gem '#{resource[:name]}'")
19
19
  Puppet::Util::Autoload.gem_source.clear_paths
20
20
  end
21
+
22
+ def self.execute_gem_command(command, command_options, custom_environment = {})
23
+ custom_environment['PKG_CONFIG_PATH'] = '/opt/puppetlabs/puppet/lib/pkgconfig' unless Puppet::Util::Platform.windows?
24
+ super(command, command_options, custom_environment)
25
+ end
21
26
  end
@@ -0,0 +1,180 @@
1
+ unless Puppet::Util::Platform.jruby_fips?
2
+ require 'rubygems/commands/list_command'
3
+ end
4
+ require 'stringio'
5
+ require 'uri'
6
+
7
+ # Ruby gems support.
8
+ Puppet::Type.type(:package).provide :puppetserver_gem, :parent => :gem do
9
+ desc "Puppet Server Ruby Gem support. If a URL is passed via `source`, then
10
+ that URL is appended to the list of remote gem repositories which by default
11
+ contains rubygems.org; To ensure that only the specified source is used also
12
+ pass `--clear-sources` in via `install_options`; if a source is present but
13
+ is not a valid URL, it will be interpreted as the path to a local gem file.
14
+ If source is not present at all, the gem will be installed from the default
15
+ gem repositories."
16
+
17
+ has_feature :versionable, :install_options, :uninstall_options
18
+
19
+ confine :feature => :hocon
20
+ # see SERVER-2578
21
+ confine :fips_enabled => false
22
+
23
+ # Define the default provider package command name, as the parent 'gem' provider is targetable.
24
+ # Required by Puppet::Provider::Package::Targetable::resource_or_provider_command
25
+
26
+ def self.provider_command
27
+ command(:puppetservercmd)
28
+ end
29
+
30
+ # The gem command uses HOME to locate a gemrc file.
31
+ # CommandDefiner in provider.rb will set failonfail, combine, and environment.
32
+
33
+ has_command(:puppetservercmd, '/opt/puppetlabs/bin/puppetserver') do
34
+ environment(HOME: ENV['HOME'])
35
+ end
36
+
37
+ def self.gemlist(options)
38
+ command_options = ['gem', 'list']
39
+
40
+ if options[:local]
41
+ command_options << '--local'
42
+ else
43
+ command_options << '--remote'
44
+ end
45
+
46
+ if options[:source]
47
+ command_options << '--source' << options[:source]
48
+ end
49
+
50
+ if options[:justme]
51
+ gem_regex = '\A' + options[:justme] + '\z'
52
+ command_options << gem_regex
53
+ end
54
+
55
+ if options[:local]
56
+ list = execute_rubygems_list_command(gem_regex)
57
+ else
58
+ begin
59
+ list = puppetservercmd(command_options)
60
+ rescue Puppet::ExecutionFailure => detail
61
+ raise Puppet::Error, _("Could not list gems: %{detail}") % { detail: detail }, detail.backtrace
62
+ end
63
+ end
64
+
65
+ # When `/tmp` is mounted `noexec`, `puppetserver gem list` will output:
66
+ # *** LOCAL GEMS ***
67
+ # causing gemsplit to output:
68
+ # Warning: Could not match *** LOCAL GEMS ***
69
+ gem_list = list
70
+ .lines
71
+ .select { |x| x =~ /^(\S+)\s+\((.+)\)/ }
72
+ .map { |set| gemsplit(set) }
73
+
74
+ if options[:justme]
75
+ return gem_list.shift
76
+ else
77
+ return gem_list
78
+ end
79
+ end
80
+
81
+ def install(useversion = true)
82
+ command_options = ['gem', 'install']
83
+ command_options += install_options if resource[:install_options]
84
+
85
+ command_options << '-v' << resource[:ensure] if (!resource[:ensure].is_a? Symbol) && useversion
86
+
87
+ command_options << '--no-document'
88
+
89
+ if resource[:source]
90
+ begin
91
+ uri = URI.parse(resource[:source])
92
+ rescue => detail
93
+ self.fail Puppet::Error, _("Invalid source '%{uri}': %{detail}") % { uri: uri, detail: detail }, detail
94
+ end
95
+
96
+ case uri.scheme
97
+ when nil
98
+ # no URI scheme => interpret the source as a local file
99
+ command_options << resource[:source]
100
+ when /file/i
101
+ command_options << uri.path
102
+ when 'puppet'
103
+ # we don't support puppet:// URLs (yet)
104
+ raise Puppet::Error.new(_('puppet:// URLs are not supported as gem sources'))
105
+ else
106
+ # interpret it as a gem repository
107
+ command_options << '--source' << "#{resource[:source]}" << resource[:name]
108
+ end
109
+ else
110
+ command_options << resource[:name]
111
+ end
112
+
113
+ output = puppetservercmd(command_options)
114
+ # Apparently, some gem versions don't exit non-0 on failure.
115
+ self.fail _("Could not install: %{output}") % { output: output.chomp } if output.include?('ERROR')
116
+ end
117
+
118
+ def uninstall
119
+ command_options = ['gem', 'uninstall']
120
+ command_options << '--executables' << '--all' << resource[:name]
121
+ command_options += uninstall_options if resource[:uninstall_options]
122
+
123
+ output = puppetservercmd(command_options)
124
+ # Apparently, some gem versions don't exit non-0 on failure.
125
+ self.fail _("Could not uninstall: %{output}") % { output: output.chomp } if output.include?('ERROR')
126
+ end
127
+
128
+ private
129
+
130
+ # The puppetserver gem cli command is very slow, since it starts a JVM.
131
+ #
132
+ # Instead, for the list subcommand (which is executed with every puppet run),
133
+ # use the rubygems library from puppet ruby: setting GEM_HOME and GEM_PATH
134
+ # to the default values, or the values in the puppetserver configuration file.
135
+ #
136
+ # The rubygems library cannot access java platform gems,
137
+ # for example: json (1.8.3 java)
138
+ # but java platform gems should not be managed by this (or any) provider.
139
+
140
+ def self.execute_rubygems_list_command(gem_regex)
141
+ puppetserver_default_gem_home = '/opt/puppetlabs/server/data/puppetserver/jruby-gems'
142
+ puppetserver_default_vendored_jruby_gems = '/opt/puppetlabs/server/data/puppetserver/vendored-jruby-gems'
143
+ puppet_default_vendor_gems = '/opt/puppetlabs/puppet/lib/ruby/vendor_gems'
144
+ puppetserver_default_gem_path = [puppetserver_default_gem_home, puppetserver_default_vendored_jruby_gems, puppet_default_vendor_gems].join(':')
145
+
146
+ pe_puppetserver_conf_file = '/etc/puppetlabs/puppetserver/conf.d/pe-puppet-server.conf'
147
+ os_puppetserver_conf_file = '/etc/puppetlabs/puppetserver/puppetserver.conf'
148
+ puppetserver_conf_file = Facter.value(:pe_server_version) ? pe_puppetserver_conf_file : os_puppetserver_conf_file
149
+ puppetserver_conf = Hocon.load(puppetserver_conf_file)
150
+
151
+ gem_env = {}
152
+ if puppetserver_conf.empty? || puppetserver_conf.key?('jruby-puppet') == false
153
+ gem_env['GEM_HOME'] = puppetserver_default_gem_home
154
+ gem_env['GEM_PATH'] = puppetserver_default_gem_path
155
+ else
156
+ gem_env['GEM_HOME'] = puppetserver_conf['jruby-puppet'].key?('gem-home') ? puppetserver_conf['jruby-puppet']['gem-home'] : puppetserver_default_gem_home
157
+ gem_env['GEM_PATH'] = puppetserver_conf['jruby-puppet'].key?('gem-path') ? puppetserver_conf['jruby-puppet']['gem-path'].join(':') : puppetserver_default_gem_path
158
+ end
159
+ gem_env['GEM_SPEC_CACHE'] = "/tmp/#{$$}"
160
+ Gem.paths = gem_env
161
+
162
+ sio_inn = StringIO.new
163
+ sio_out = StringIO.new
164
+ sio_err = StringIO.new
165
+ stream_ui = Gem::StreamUI.new(sio_inn, sio_out, sio_err, false)
166
+ gem_list_cmd = Gem::Commands::ListCommand.new
167
+ gem_list_cmd.options[:domain] = :local
168
+ gem_list_cmd.options[:args] = [gem_regex] if gem_regex
169
+ gem_list_cmd.ui = stream_ui
170
+ gem_list_cmd.execute
171
+
172
+ # There is no method exclude default gems from the local gem list,
173
+ # for example: psych (default: 2.2.2)
174
+ # but default gems should not be managed by this (or any) provider.
175
+ gem_list = sio_out.string.lines.reject { |gem| gem =~ / \(default\: / }
176
+ gem_list.join("\n")
177
+ ensure
178
+ Gem.clear_paths
179
+ end
180
+ end
@@ -43,6 +43,10 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
43
43
  if should.is_a?(String)
44
44
  begin
45
45
  should_version = RPM_VERSION_RANGE.parse(should, RPM_VERSION)
46
+
47
+ if should_version.is_a?(RPM_VERSION_RANGE::Eq)
48
+ return super
49
+ end
46
50
  rescue RPM_VERSION_RANGE::ValidationFailure, RPM_VERSION::ValidationFailure
47
51
  Puppet.debug("Cannot parse #{should} as a RPM version range")
48
52
  return super
@@ -192,6 +196,9 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
192
196
  if should.is_a?(String)
193
197
  begin
194
198
  should_range = RPM_VERSION_RANGE.parse(should, RPM_VERSION)
199
+ if should_range.is_a?(RPM_VERSION_RANGE::Eq)
200
+ return should
201
+ end
195
202
  rescue RPM_VERSION_RANGE::ValidationFailure, RPM_VERSION::ValidationFailure
196
203
  Puppet.debug("Cannot parse #{should} as a RPM version range")
197
204
  return should
@@ -295,7 +302,7 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
295
302
  command = [command(:cmd)] + no_debug + ["-e", error_level, "-y", install_options, operation, wanted].compact
296
303
  output = execute(command)
297
304
 
298
- if output =~ /^No package #{wanted} available\.$/
305
+ if output.to_s =~ /^No package #{wanted} available\.$/
299
306
  raise Puppet::Error, _("Could not find package %{wanted}") % { wanted: wanted }
300
307
  end
301
308
 
@@ -321,6 +328,7 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
321
328
  return "#{upd[:epoch]}:#{upd[:version]}-#{upd[:release]}"
322
329
  else
323
330
  # Yum didn't find updates, pretend the current version is the latest
331
+ self.debug "Yum didn't find updates, current version (#{properties[:ensure]}) is the latest"
324
332
  version = properties[:ensure]
325
333
  raise Puppet::DevError, _("Tried to get latest on a missing package") if version == :absent || version == :purged
326
334
  return version
@@ -2,7 +2,7 @@ Puppet::Type.type(:package).provide :zypper, :parent => :rpm, :source => :rpm do
2
2
  desc "Support for SuSE `zypper` package manager. Found in SLES10sp2+ and SLES11.
3
3
 
4
4
  This provider supports the `install_options` attribute, which allows command-line flags to be passed to zypper.
5
- These options should be specified as an array where each element is either a
5
+ These options should be specified as an array where each element is either a
6
6
  string or a hash."
7
7
 
8
8
  has_feature :versionable, :install_options, :virtual_packages
@@ -50,6 +50,41 @@ Puppet::Type.type(:package).provide :zypper, :parent => :rpm, :source => :rpm do
50
50
  execute(cmd, { :failonfail => false, :combine => true})
51
51
  end
52
52
 
53
+ def best_version(should)
54
+ if should.is_a?(String)
55
+ begin
56
+ should_range = Puppet::Util::Package::Version::Range.parse(should, Puppet::Util::Package::Version::Rpm)
57
+ rescue Puppet::Util::Package::Version::Range::ValidationFailure, Puppet::Util::Package::Version::Rpm::ValidationFailure
58
+ Puppet.debug("Cannot parse #{should} as a RPM version range")
59
+ return should
60
+ end
61
+
62
+ if should_range.is_a?(Puppet::Util::Package::Version::Range::Eq)
63
+ return should
64
+ end
65
+
66
+ sorted_versions = SortedSet.new
67
+
68
+ output = zypper('search', '--match-exact', '--type', 'package', '--uninstalled-only', '-s', @resource[:name])
69
+ output.lines.each do |line|
70
+ pkg_ver = line.split(/\s*\|\s*/)
71
+ next unless pkg_ver[1] == @resource[:name]
72
+ begin
73
+ rpm_version = Puppet::Util::Package::Version::Rpm.parse(pkg_ver[3])
74
+
75
+ sorted_versions << rpm_version if should_range.include?(rpm_version)
76
+ rescue Puppet::Util::Package::Version::Rpm::ValidationFailure
77
+ Puppet.debug("Cannot parse #{pkg_ver[3]} as a RPM version")
78
+ end
79
+ end
80
+
81
+ return sorted_versions.entries.last if sorted_versions.any?
82
+
83
+ Puppet.debug("No available version for package #{@resource[:name]} is included in range #{should_range}")
84
+ should
85
+ end
86
+ end
87
+
53
88
  # Install a package using 'zypper'.
54
89
  def install
55
90
  should = @resource.should(:ensure)
@@ -62,6 +97,7 @@ Puppet::Type.type(:package).provide :zypper, :parent => :rpm, :source => :rpm do
62
97
  should = nil
63
98
  else
64
99
  # Add the package version
100
+ should = best_version(should)
65
101
  wanted = "#{wanted}-#{should}"
66
102
  end
67
103
 
@@ -89,6 +125,7 @@ Puppet::Type.type(:package).provide :zypper, :parent => :rpm, :source => :rpm do
89
125
  options = []
90
126
  options << quiet
91
127
  options << '--no-gpg-check' unless inst_opts.delete('--no-gpg-check').nil?
128
+ options << '--no-gpg-checks' unless inst_opts.delete('--no-gpg-checks').nil?
92
129
  options << :install
93
130
 
94
131
  #zypper 0.6.13 (OpenSuSE 10.2) does not support auto agree with licenses
@@ -142,4 +179,28 @@ Puppet::Type.type(:package).provide :zypper, :parent => :rpm, :source => :rpm do
142
179
  end
143
180
 
144
181
  end
182
+
183
+ def insync?(is)
184
+ return false if [:purged, :absent].include?(is)
185
+
186
+ should = @resource[:ensure]
187
+ if should.is_a?(String)
188
+ begin
189
+ should_version = Puppet::Util::Package::Version::Range.parse(should, Puppet::Util::Package::Version::Rpm)
190
+ if should_version.is_a?(RPM_VERSION_RANGE::Eq)
191
+ return super
192
+ end
193
+ rescue Puppet::Util::Package::Version::Range::ValidationFailure, Puppet::Util::Package::Version::Rpm::ValidationFailure
194
+ Puppet.debug("Cannot parse #{should} as a RPM version range")
195
+ return super
196
+ end
197
+
198
+ begin
199
+ is_version = Puppet::Util::Package::Version::Rpm.parse(is)
200
+ should_version.include?(is_version)
201
+ rescue Puppet::Util::Package::Version::Rpm::ValidationFailure
202
+ Puppet.debug("Cannot parse #{is} as a RPM version")
203
+ end
204
+ end
205
+ end
145
206
  end