puppet 6.12.0 → 6.17.0

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 (412) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +4 -2
  5. data/Gemfile.lock +39 -36
  6. data/README.md +18 -25
  7. data/ext/project_data.yaml +1 -1
  8. data/ext/windows/service/daemon.rb +3 -3
  9. data/lib/puppet.rb +52 -13
  10. data/lib/puppet/agent.rb +20 -14
  11. data/lib/puppet/application/agent.rb +26 -17
  12. data/lib/puppet/application/describe.rb +7 -5
  13. data/lib/puppet/application/device.rb +2 -2
  14. data/lib/puppet/application/filebucket.rb +19 -15
  15. data/lib/puppet/application/plugin.rb +1 -0
  16. data/lib/puppet/application/resource.rb +1 -1
  17. data/lib/puppet/application/ssl.rb +4 -4
  18. data/lib/puppet/configurer.rb +65 -69
  19. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  20. data/lib/puppet/confine.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 +154 -58
  24. data/lib/puppet/environments.rb +27 -20
  25. data/lib/puppet/face/facts.rb +8 -5
  26. data/lib/puppet/face/help.rb +29 -3
  27. data/lib/puppet/face/module/search.rb +5 -0
  28. data/lib/puppet/face/plugin.rb +2 -2
  29. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  30. data/lib/puppet/file_serving/metadata.rb +4 -1
  31. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  32. data/lib/puppet/file_system/file_impl.rb +14 -10
  33. data/lib/puppet/file_system/memory_file.rb +6 -0
  34. data/lib/puppet/file_system/memory_impl.rb +13 -0
  35. data/lib/puppet/file_system/uniquefile.rb +12 -16
  36. data/lib/puppet/file_system/windows.rb +7 -10
  37. data/lib/puppet/forge.rb +1 -1
  38. data/lib/puppet/forge/cache.rb +1 -1
  39. data/lib/puppet/forge/repository.rb +4 -7
  40. data/lib/puppet/functions/call.rb +1 -1
  41. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  42. data/lib/puppet/functions/filter.rb +1 -0
  43. data/lib/puppet/functions/reduce.rb +2 -4
  44. data/lib/puppet/http.rb +5 -0
  45. data/lib/puppet/http/client.rb +293 -73
  46. data/lib/puppet/http/errors.rb +2 -0
  47. data/lib/puppet/http/external_client.rb +90 -0
  48. data/lib/puppet/http/redirector.rb +43 -7
  49. data/lib/puppet/http/resolver.rb +46 -3
  50. data/lib/puppet/http/resolver/server_list.rb +76 -16
  51. data/lib/puppet/http/resolver/settings.rb +23 -3
  52. data/lib/puppet/http/resolver/srv.rb +29 -3
  53. data/lib/puppet/http/response.rb +87 -1
  54. data/lib/puppet/http/retry_after_handler.rb +39 -0
  55. data/lib/puppet/http/service.rb +151 -7
  56. data/lib/puppet/http/service/ca.rb +76 -14
  57. data/lib/puppet/http/service/compiler.rb +319 -0
  58. data/lib/puppet/http/service/file_server.rb +206 -0
  59. data/lib/puppet/http/service/report.rb +49 -23
  60. data/lib/puppet/http/session.rb +103 -7
  61. data/lib/puppet/indirector.rb +1 -1
  62. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  63. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  64. data/lib/puppet/indirector/facts/rest.rb +42 -0
  65. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  66. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  67. data/lib/puppet/indirector/file_content/http.rb +5 -0
  68. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  69. data/lib/puppet/indirector/file_metadata/http.rb +27 -8
  70. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  71. data/lib/puppet/indirector/json.rb +1 -1
  72. data/lib/puppet/indirector/msgpack.rb +1 -1
  73. data/lib/puppet/indirector/node/rest.rb +24 -0
  74. data/lib/puppet/indirector/report/rest.rb +19 -0
  75. data/lib/puppet/indirector/report/yaml.rb +23 -0
  76. data/lib/puppet/indirector/request.rb +1 -1
  77. data/lib/puppet/indirector/rest.rb +12 -0
  78. data/lib/puppet/indirector/status/rest.rb +18 -0
  79. data/lib/puppet/loaders.rb +6 -0
  80. data/lib/puppet/metatype/manager.rb +80 -80
  81. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  82. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  83. data/lib/puppet/network/http/base_pool.rb +7 -2
  84. data/lib/puppet/network/http/compression.rb +7 -0
  85. data/lib/puppet/network/http/connection.rb +6 -0
  86. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  87. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  88. data/lib/puppet/network/http/pool.rb +13 -6
  89. data/lib/puppet/network/http_pool.rb +2 -1
  90. data/lib/puppet/node/environment.rb +11 -1
  91. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  92. data/lib/puppet/pal/pal_impl.rb +4 -29
  93. data/lib/puppet/parser/ast/leaf.rb +5 -5
  94. data/lib/puppet/parser/ast/pops_bridge.rb +6 -15
  95. data/lib/puppet/parser/compiler.rb +43 -33
  96. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  97. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  98. data/lib/puppet/parser/environment_compiler.rb +4 -1
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/filter.rb +1 -0
  101. data/lib/puppet/parser/resource.rb +3 -2
  102. data/lib/puppet/parser/resource/param.rb +6 -0
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +6 -6
  105. data/lib/puppet/pops/issues.rb +5 -0
  106. data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +12 -3
  107. data/lib/puppet/pops/loaders.rb +7 -5
  108. data/lib/puppet/pops/parser/evaluating_parser.rb +5 -7
  109. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  110. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  111. data/lib/puppet/pops/types/type_calculator.rb +24 -0
  112. data/lib/puppet/pops/validation/checker4_0.rb +11 -1
  113. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  114. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  115. data/lib/puppet/provider/aix_object.rb +4 -2
  116. data/lib/puppet/provider/group/aix.rb +1 -0
  117. data/lib/puppet/provider/group/groupadd.rb +57 -24
  118. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  119. data/lib/puppet/provider/package/aix.rb +17 -2
  120. data/lib/puppet/provider/package/apt.rb +78 -4
  121. data/lib/puppet/provider/package/aptitude.rb +1 -1
  122. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  123. data/lib/puppet/provider/package/dpkg.rb +14 -7
  124. data/lib/puppet/provider/package/fink.rb +20 -3
  125. data/lib/puppet/provider/package/gem.rb +41 -7
  126. data/lib/puppet/provider/package/openbsd.rb +13 -1
  127. data/lib/puppet/provider/package/pacman.rb +2 -5
  128. data/lib/puppet/provider/package/pip.rb +143 -48
  129. data/lib/puppet/provider/package/pip3.rb +0 -2
  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 +2 -2
  134. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  135. data/lib/puppet/provider/package/rpm.rb +6 -213
  136. data/lib/puppet/provider/package/yum.rb +109 -25
  137. data/lib/puppet/provider/package/zypper.rb +59 -1
  138. data/lib/puppet/provider/service/systemd.rb +22 -4
  139. data/lib/puppet/provider/service/windows.rb +23 -7
  140. data/lib/puppet/provider/user/aix.rb +1 -0
  141. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  142. data/lib/puppet/provider/user/useradd.rb +22 -12
  143. data/lib/puppet/reports/http.rb +15 -9
  144. data/lib/puppet/reports/store.rb +1 -1
  145. data/lib/puppet/resource.rb +2 -1
  146. data/lib/puppet/resource/type.rb +8 -0
  147. data/lib/puppet/resource/type_collection.rb +20 -16
  148. data/lib/puppet/runtime.rb +31 -1
  149. data/lib/puppet/settings.rb +4 -0
  150. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  151. data/lib/puppet/ssl.rb +1 -0
  152. data/lib/puppet/ssl/certificate.rb +2 -1
  153. data/lib/puppet/ssl/host.rb +4 -4
  154. data/lib/puppet/ssl/oids.rb +1 -0
  155. data/lib/puppet/ssl/ssl_context.rb +2 -2
  156. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  157. data/lib/puppet/ssl/state_machine.rb +81 -35
  158. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  159. data/lib/puppet/test/test_helper.rb +15 -11
  160. data/lib/puppet/transaction/report.rb +2 -2
  161. data/lib/puppet/transaction/resource_harness.rb +1 -1
  162. data/lib/puppet/trusted_external.rb +29 -1
  163. data/lib/puppet/type.rb +18 -6
  164. data/lib/puppet/type/file.rb +51 -13
  165. data/lib/puppet/type/file/checksum.rb +4 -4
  166. data/lib/puppet/type/file/source.rb +51 -60
  167. data/lib/puppet/type/group.rb +2 -2
  168. data/lib/puppet/type/package.rb +102 -10
  169. data/lib/puppet/type/service.rb +55 -8
  170. data/lib/puppet/type/user.rb +3 -28
  171. data/lib/puppet/util.rb +39 -15
  172. data/lib/puppet/util/at_fork.rb +1 -1
  173. data/lib/puppet/util/autoload.rb +4 -18
  174. data/lib/puppet/util/checksums.rb +19 -4
  175. data/lib/puppet/util/fileparsing.rb +2 -2
  176. data/lib/puppet/util/instance_loader.rb +14 -10
  177. data/lib/puppet/util/log/destinations.rb +2 -11
  178. data/lib/puppet/util/package/version/debian.rb +175 -0
  179. data/lib/puppet/util/package/version/gem.rb +15 -0
  180. data/lib/puppet/util/package/version/pip.rb +167 -0
  181. data/lib/puppet/util/package/version/range.rb +53 -0
  182. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  183. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  185. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  187. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  188. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  189. data/lib/puppet/util/package/version/rpm.rb +73 -0
  190. data/lib/puppet/util/pidlock.rb +36 -10
  191. data/lib/puppet/util/platform.rb +5 -0
  192. data/lib/puppet/util/plist.rb +6 -0
  193. data/lib/puppet/util/provider_features.rb +1 -1
  194. data/lib/puppet/util/reference.rb +1 -1
  195. data/lib/puppet/util/rpm_compare.rb +193 -0
  196. data/lib/puppet/util/storage.rb +0 -1
  197. data/lib/puppet/util/windows/adsi.rb +2 -2
  198. data/lib/puppet/util/windows/api_types.rb +45 -32
  199. data/lib/puppet/util/windows/eventlog.rb +1 -6
  200. data/lib/puppet/util/windows/principal.rb +8 -6
  201. data/lib/puppet/util/windows/process.rb +15 -14
  202. data/lib/puppet/util/windows/registry.rb +11 -11
  203. data/lib/puppet/util/windows/security.rb +1 -0
  204. data/lib/puppet/util/windows/service.rb +43 -26
  205. data/lib/puppet/util/windows/sid.rb +3 -3
  206. data/lib/puppet/util/windows/user.rb +23 -8
  207. data/lib/puppet/util/yaml.rb +1 -1
  208. data/lib/puppet/version.rb +1 -1
  209. data/locales/puppet.pot +707 -574
  210. data/man/man5/puppet.conf.5 +74 -14
  211. data/man/man8/puppet-agent.8 +7 -7
  212. data/man/man8/puppet-apply.8 +1 -1
  213. data/man/man8/puppet-catalog.8 +1 -1
  214. data/man/man8/puppet-config.8 +1 -1
  215. data/man/man8/puppet-describe.8 +1 -1
  216. data/man/man8/puppet-device.8 +2 -2
  217. data/man/man8/puppet-doc.8 +1 -1
  218. data/man/man8/puppet-epp.8 +1 -1
  219. data/man/man8/puppet-facts.8 +1 -1
  220. data/man/man8/puppet-filebucket.8 +17 -2
  221. data/man/man8/puppet-generate.8 +1 -1
  222. data/man/man8/puppet-help.8 +6 -3
  223. data/man/man8/puppet-key.8 +1 -1
  224. data/man/man8/puppet-lookup.8 +1 -1
  225. data/man/man8/puppet-man.8 +1 -1
  226. data/man/man8/puppet-module.8 +4 -1
  227. data/man/man8/puppet-node.8 +1 -1
  228. data/man/man8/puppet-parser.8 +1 -1
  229. data/man/man8/puppet-plugin.8 +1 -1
  230. data/man/man8/puppet-report.8 +1 -1
  231. data/man/man8/puppet-resource.8 +1 -1
  232. data/man/man8/puppet-script.8 +1 -1
  233. data/man/man8/puppet-ssl.8 +2 -2
  234. data/man/man8/puppet-status.8 +1 -1
  235. data/man/man8/puppet.8 +2 -2
  236. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  237. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  238. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  239. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  240. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  241. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  242. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  243. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  244. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  245. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -102
  246. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -106
  247. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  248. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -102
  249. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  250. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -102
  251. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -102
  252. data/spec/integration/application/agent_spec.rb +483 -0
  253. data/spec/integration/application/apply_spec.rb +132 -3
  254. data/spec/integration/application/filebucket_spec.rb +190 -0
  255. data/spec/integration/application/plugin_spec.rb +73 -0
  256. data/spec/integration/configurer_spec.rb +26 -7
  257. data/spec/integration/defaults_spec.rb +1 -2
  258. data/spec/integration/http/client_spec.rb +47 -37
  259. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  260. data/spec/integration/indirector/report/yaml.rb +83 -0
  261. data/spec/integration/module_tool/forge_spec.rb +2 -15
  262. data/spec/integration/network/http_pool_spec.rb +93 -20
  263. data/spec/integration/node/environment_spec.rb +15 -0
  264. data/spec/integration/parser/compiler_spec.rb +11 -0
  265. data/spec/integration/type/file_spec.rb +1 -1
  266. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  267. data/spec/integration/util/windows/registry_spec.rb +7 -7
  268. data/spec/integration/util/windows/user_spec.rb +40 -5
  269. data/spec/lib/puppet/test_ca.rb +2 -2
  270. data/spec/lib/puppet_spec/https.rb +16 -7
  271. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  272. data/spec/shared_contexts/https.rb +29 -0
  273. data/spec/unit/agent_spec.rb +80 -26
  274. data/spec/unit/application/agent_spec.rb +9 -5
  275. data/spec/unit/application/apply_spec.rb +2 -12
  276. data/spec/unit/application/describe_spec.rb +88 -50
  277. data/spec/unit/application/device_spec.rb +2 -2
  278. data/spec/unit/application/filebucket_spec.rb +22 -2
  279. data/spec/unit/application/resource_spec.rb +2 -2
  280. data/spec/unit/configurer/fact_handler_spec.rb +4 -8
  281. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  282. data/spec/unit/configurer_spec.rb +17 -18
  283. data/spec/unit/context/trusted_information_spec.rb +25 -2
  284. data/spec/unit/daemon_spec.rb +5 -64
  285. data/spec/unit/defaults_spec.rb +25 -2
  286. data/spec/unit/environments_spec.rb +65 -28
  287. data/spec/unit/face/facts_spec.rb +24 -20
  288. data/spec/unit/face/module/search_spec.rb +17 -0
  289. data/spec/unit/face/plugin_spec.rb +12 -10
  290. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  291. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  292. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  293. data/spec/unit/file_system_spec.rb +26 -2
  294. data/spec/unit/functions/lookup_spec.rb +13 -0
  295. data/spec/unit/http/client_spec.rb +327 -35
  296. data/spec/unit/http/external_client_spec.rb +201 -0
  297. data/spec/unit/http/resolver_spec.rb +34 -2
  298. data/spec/unit/http/response_spec.rb +75 -0
  299. data/spec/unit/http/service/ca_spec.rb +53 -11
  300. data/spec/unit/http/service/compiler_spec.rb +627 -0
  301. data/spec/unit/http/service/file_server_spec.rb +308 -0
  302. data/spec/unit/http/service/report_spec.rb +27 -9
  303. data/spec/unit/http/service_spec.rb +98 -5
  304. data/spec/unit/http/session_spec.rb +190 -7
  305. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  306. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  307. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  308. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  309. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  310. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  311. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  312. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  313. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  314. data/spec/unit/indirector/request_spec.rb +1 -1
  315. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  316. data/spec/unit/indirector/rest_spec.rb +13 -0
  317. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  318. data/spec/unit/interface_spec.rb +3 -3
  319. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  320. data/spec/unit/network/http/connection_spec.rb +559 -175
  321. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  322. data/spec/unit/network/http/pool_spec.rb +89 -11
  323. data/spec/unit/network/http_pool_spec.rb +63 -57
  324. data/spec/unit/network/http_spec.rb +1 -1
  325. data/spec/unit/node/environment_spec.rb +16 -0
  326. data/spec/unit/node/facts_spec.rb +2 -1
  327. data/spec/unit/node_spec.rb +7 -4
  328. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  329. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  330. data/spec/unit/parser/scope_spec.rb +1 -1
  331. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  332. data/spec/unit/pops/loaders/loaders_spec.rb +1 -1
  333. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  334. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  335. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  336. data/spec/unit/provider/aix_object_spec.rb +16 -2
  337. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  338. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  339. data/spec/unit/provider/package/aix_spec.rb +29 -0
  340. data/spec/unit/provider/package/apt_spec.rb +43 -2
  341. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  342. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  343. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  344. data/spec/unit/provider/package/gem_spec.rb +40 -0
  345. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  346. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  347. data/spec/unit/provider/package/pip_spec.rb +68 -19
  348. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  349. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  350. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  351. data/spec/unit/provider/package/portage_spec.rb +5 -0
  352. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  353. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  354. data/spec/unit/provider/package/yum_spec.rb +292 -0
  355. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  356. data/spec/unit/provider/service/init_spec.rb +1 -0
  357. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  358. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  359. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  360. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  361. data/spec/unit/provider/service/windows_spec.rb +22 -14
  362. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  363. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  364. data/spec/unit/provider/user/useradd_spec.rb +43 -24
  365. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  366. data/spec/unit/puppet_pal_2pec.rb +0 -26
  367. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  368. data/spec/unit/puppet_spec.rb +47 -0
  369. data/spec/unit/reports/http_spec.rb +70 -52
  370. data/spec/unit/resource_spec.rb +3 -3
  371. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  372. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  373. data/spec/unit/ssl/certificate_spec.rb +7 -0
  374. data/spec/unit/ssl/host_spec.rb +4 -2
  375. data/spec/unit/ssl/oids_spec.rb +1 -0
  376. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  377. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  378. data/spec/unit/test/test_helper_spec.rb +17 -0
  379. data/spec/unit/transaction/persistence_spec.rb +1 -10
  380. data/spec/unit/transaction/report_spec.rb +5 -1
  381. data/spec/unit/transaction_spec.rb +0 -2
  382. data/spec/unit/type/file/ensure_spec.rb +1 -2
  383. data/spec/unit/type/file/source_spec.rb +89 -38
  384. data/spec/unit/type/file_spec.rb +122 -96
  385. data/spec/unit/type/package_spec.rb +8 -0
  386. data/spec/unit/type/service_spec.rb +185 -8
  387. data/spec/unit/type/user_spec.rb +1 -2
  388. data/spec/unit/type_spec.rb +50 -0
  389. data/spec/unit/util/at_fork_spec.rb +3 -2
  390. data/spec/unit/util/autoload_spec.rb +2 -1
  391. data/spec/unit/util/checksums_spec.rb +16 -0
  392. data/spec/unit/util/log/destinations_spec.rb +1 -29
  393. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  394. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  395. data/spec/unit/util/package/version/range_spec.rb +175 -0
  396. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  397. data/spec/unit/util/pidlock_spec.rb +112 -42
  398. data/spec/unit/util/plist_spec.rb +20 -0
  399. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  400. data/spec/unit/util/storage_spec.rb +1 -8
  401. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  402. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  403. data/spec/unit/util/windows/service_spec.rb +4 -4
  404. data/spec/unit/util/windows/sid_spec.rb +2 -2
  405. data/spec/unit/util_spec.rb +3 -3
  406. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  407. data/tasks/generate_cert_fixtures.rake +15 -1
  408. data/tasks/manpages.rake +5 -35
  409. metadata +73 -12
  410. data/COMMITTERS.md +0 -244
  411. data/spec/integration/faces/plugin_spec.rb +0 -61
  412. data/spec/integration/test/test_helper_spec.rb +0 -31
@@ -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
 
@@ -245,4 +246,15 @@ Puppet::Type.type(:package).provide :openbsd, :parent => Puppet::Provider::Packa
245
246
  def purge
246
247
  pkgdelete "-c", "-q", @resource[:name]
247
248
  end
249
+
250
+ def flavor
251
+ @property_hash[:flavor]
252
+ end
253
+
254
+ def flavor=(value)
255
+ if flavor != @resource.should(:flavor)
256
+ uninstall
257
+ install
258
+ end
259
+ end
248
260
  end
@@ -132,9 +132,6 @@ Puppet::Type.type(:package).provide :pacman, :parent => Puppet::Provider::Packag
132
132
 
133
133
  # We rescue the main check from Pacman with a check on the AUR using yaourt, if installed
134
134
  def latest
135
- # Synchronize the database
136
- pacman "-Sy"
137
-
138
135
  resource_name = @resource[:name]
139
136
 
140
137
  # If target is a group, construct the group version
@@ -243,7 +240,7 @@ Puppet::Type.type(:package).provide :pacman, :parent => Puppet::Provider::Packag
243
240
  else
244
241
  fail _("Source %{source} is not supported by pacman") % { source: source }
245
242
  end
246
- pacman "--noconfirm", "--noprogressbar", "-Sy"
243
+ pacman "--noconfirm", "--noprogressbar", "-S"
247
244
  pacman "--noconfirm", "--noprogressbar", "-U", source
248
245
  end
249
246
 
@@ -255,7 +252,7 @@ Puppet::Type.type(:package).provide :pacman, :parent => Puppet::Provider::Packag
255
252
 
256
253
  cmd = %w{--noconfirm --needed --noprogressbar}
257
254
  cmd += install_options if @resource[:install_options]
258
- cmd << "-Sy" << resource_name
255
+ cmd << "-S" << resource_name
259
256
 
260
257
  if self.class.yaourt?
261
258
  yaourt(*cmd)
@@ -1,6 +1,8 @@
1
1
  # Puppet package provider for Python's `pip` package management frontend.
2
2
  # <http://pip.pypa.io/>
3
3
 
4
+ require 'puppet/util/package/version/pip'
5
+ require 'puppet/util/package/version/range'
4
6
  require 'puppet/provider/package_targetable'
5
7
  require 'puppet/util/http_proxy'
6
8
 
@@ -11,7 +13,10 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
11
13
  This provider supports the `install_options` attribute, which allows command-line flags to be passed to pip.
12
14
  These options should be specified as an array where each element is either a string or a hash."
13
15
 
14
- has_feature :installable, :uninstallable, :upgradeable, :versionable, :install_options, :targetable
16
+ has_feature :installable, :uninstallable, :upgradeable, :versionable, :version_ranges, :install_options, :targetable
17
+
18
+ PIP_VERSION = Puppet::Util::Package::Version::Pip
19
+ PIP_VERSION_RANGE = Puppet::Util::Package::Version::Range
15
20
 
16
21
  # Override the specificity method to return 1 if pip is not set as default provider
17
22
  def self.specificity
@@ -25,7 +30,6 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
25
30
 
26
31
  # Define the default provider package command name when the provider is targetable.
27
32
  # Required by Puppet::Provider::Package::Targetable::resource_or_provider_command
28
-
29
33
  def self.provider_command
30
34
  # Ensure pip can upgrade pip, which usually puts pip into a new path /usr/local/bin/pip (compared to /usr/bin/pip)
31
35
  self.cmd.map { |c| which(c) }.find { |c| c != nil }
@@ -58,7 +62,6 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
58
62
 
59
63
  # Return an array of structured information about every installed package
60
64
  # that's managed by `pip` or an empty array if `pip` is not available.
61
-
62
65
  def self.instances(target_command = nil)
63
66
  if target_command
64
67
  command = target_command
@@ -72,11 +75,11 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
72
75
 
73
76
  command_options = ['freeze']
74
77
  command_version = self.pip_version(command)
75
- if Puppet::Util::Package.versioncmp(command_version, '8.1.0') >= 0
78
+ if compare_pip_versions(command_version, '8.1.0') >= 0
76
79
  command_options << '--all'
77
80
  end
78
81
 
79
- execpipe [command, command_options] do |process|
82
+ execpipe [quote(command), command_options] do |process|
80
83
  process.collect do |line|
81
84
  pkg = parse(line)
82
85
  next unless pkg
@@ -88,7 +91,7 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
88
91
  # Pip can also upgrade pip, but it's not listed in freeze so need to special case it
89
92
  # Pip list would also show pip installed version, but "pip list" doesn't exist for older versions of pip (E.G v1.0)
90
93
  # Not needed when "pip freeze --all" is available.
91
- if Puppet::Util::Package.versioncmp(command_version, '8.1.0') == -1
94
+ if compare_pip_versions(command_version, '8.1.0') == -1
92
95
  packages << new({:ensure => command_version, :name => File.basename(command), :provider => name, :command => command})
93
96
  end
94
97
 
@@ -105,7 +108,6 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
105
108
 
106
109
  # Return structured information about a particular package or `nil`
107
110
  # if the package is not installed or `pip` itself is not available.
108
-
109
111
  def query
110
112
  command = resource_or_provider_command
111
113
  self.class.validate_command(command)
@@ -116,99 +118,171 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
116
118
  return nil
117
119
  end
118
120
 
119
- # Use pip CLI to look up versions from PyPI repositories,
120
- # honoring local pip config such as custom repositories.
121
-
121
+ # Return latest version available for current package
122
122
  def latest
123
123
  command = resource_or_provider_command
124
124
  self.class.validate_command(command)
125
125
 
126
126
  command_version = self.class.pip_version(command)
127
- if Puppet::Util::Package.versioncmp(command_version, '1.5.4') == -1
128
- latest_with_old_pip
127
+ if self.class.compare_pip_versions(command_version, '1.5.4') == -1
128
+ available_versions_with_old_pip.last
129
129
  else
130
- latest_with_new_pip
130
+ available_versions_with_new_pip.last
131
131
  end
132
132
  end
133
133
 
134
- # Less resource-intensive approach for pip version 1.5.4 and newer.
134
+ def self.compare_pip_versions(x, y)
135
+ begin
136
+ Puppet::Util::Package::Version::Pip.compare(x, y)
137
+ rescue PIP_VERSION::ValidationFailure => ex
138
+ Puppet.debug("Cannot compare #{x} and #{y}. #{ex.message} Falling through default comparison mechanism.")
139
+ Puppet::Util::Package.versioncmp(x, y)
140
+ end
141
+ end
135
142
 
136
- def latest_with_new_pip
143
+ # Use pip CLI to look up versions from PyPI repositories,
144
+ # honoring local pip config such as custom repositories.
145
+ def available_versions
137
146
  command = resource_or_provider_command
138
147
  self.class.validate_command(command)
139
148
 
140
- command_and_options = [command, 'install', "#{@resource[:name]}==versionplease"]
149
+ command_version = self.class.pip_version(command)
150
+ if self.class.compare_pip_versions(command_version, '1.5.4') == -1
151
+ available_versions_with_old_pip
152
+ else
153
+ available_versions_with_new_pip
154
+ end
155
+ end
156
+
157
+ def available_versions_with_new_pip
158
+ command = resource_or_provider_command
159
+ self.class.validate_command(command)
160
+
161
+ command_and_options = [self.class.quote(command), 'install', "#{@resource[:name]}==versionplease"]
141
162
  command_and_options << install_options if @resource[:install_options]
142
163
  execpipe command_and_options do |process|
143
164
  process.collect do |line|
144
165
  # PIP OUTPUT: Could not find a version that satisfies the requirement example==versionplease (from versions: 1.2.3, 4.5.6)
145
- if line =~ /from versions: /
146
- textAfterLastMatch = $'.chomp(")\n")
147
- versionList = textAfterLastMatch.split(', ').sort do |x,y|
148
- Puppet::Util::Package.versioncmp(x, y)
166
+ if line =~ /from versions: (.+)\)/
167
+ versionList = $1.split(', ').sort do |x,y|
168
+ self.class.compare_pip_versions(x, y)
149
169
  end
150
- return versionList.last
170
+ return versionList
151
171
  end
152
172
  end
153
- return nil
154
173
  end
174
+ []
155
175
  end
156
176
 
157
- # More resource-intensive approach for pip version 1.5.3 and older.
158
-
159
- def latest_with_old_pip
177
+ def available_versions_with_old_pip
160
178
  command = resource_or_provider_command
161
179
  self.class.validate_command(command)
162
180
 
163
181
  Dir.mktmpdir("puppet_pip") do |dir|
164
- command_and_options = [command, 'install', "#{@resource[:name]}", '-d', "#{dir}", '-v']
182
+ command_and_options = [self.class.quote(command), 'install', "#{@resource[:name]}", '-d', "#{dir}", '-v']
165
183
  command_and_options << install_options if @resource[:install_options]
166
184
  execpipe command_and_options do |process|
167
185
  process.collect do |line|
168
186
  # PIP OUTPUT: Using version 0.10.1 (newest of versions: 1.2.3, 4.5.6)
169
- if line =~ /Using version (.+?) \(newest of versions/
170
- return $1
187
+ if line =~ /Using version .+? \(newest of versions: (.+?)\)/
188
+ versionList = $1.split(', ').sort do |x,y|
189
+ self.class.compare_pip_versions(x, y)
190
+ end
191
+ return versionList
171
192
  end
172
193
  end
173
- return nil
174
194
  end
195
+ return []
175
196
  end
176
197
  end
177
198
 
178
- # Install a package. The ensure parameter may specify installed,
179
- # latest, a version number, or, in conjunction with the source
180
- # parameter, an SCM revision. In that case, the source parameter
181
- # gives the fully-qualified URL to the repository.
199
+ # Finds the most suitable version available in a given range
200
+ def best_version(should_range)
201
+ included_available_versions = []
202
+ available_versions.each do |version|
203
+ version = PIP_VERSION.parse(version)
204
+ included_available_versions.push(version) if should_range.include?(version)
205
+ end
182
206
 
183
- def install
184
- command = resource_or_provider_command
185
- self.class.validate_command(command)
207
+ included_available_versions.sort!
208
+ return included_available_versions.last unless included_available_versions.empty?
209
+
210
+ Puppet.debug("No available version for package #{@resource[:name]} is included in range #{should_range}")
211
+ should_range
212
+ end
186
213
 
214
+ def get_install_command_options()
215
+ should = @resource[:ensure]
187
216
  command_options = %w{install -q}
188
- command_options += install_options if @resource[:install_options]
217
+ command_options += install_options if @resource[:install_options]
218
+
189
219
  if @resource[:source]
190
- if String === @resource[:ensure]
191
- command_options << "#{@resource[:source]}@#{@resource[:ensure]}#egg=#{@resource[:name]}"
220
+ if String === should
221
+ command_options << "#{@resource[:source]}@#{should}#egg=#{@resource[:name]}"
192
222
  else
193
223
  command_options << "#{@resource[:source]}#egg=#{@resource[:name]}"
194
224
  end
195
- else
196
- case @resource[:ensure]
197
- when String
198
- command_options << "#{@resource[:name]}==#{@resource[:ensure]}"
199
- when :latest
200
- command_options << "--upgrade" << @resource[:name]
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(',')}"
201
262
  else
202
- command_options << @resource[:name]
263
+ command_options << "#{@resource[:name]} #{should}"
203
264
  end
265
+ else
266
+ command_options << "#{@resource[:name]}==#{should}"
204
267
  end
205
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
206
281
  execute([command, command_options])
207
282
  end
208
283
 
209
284
  # Uninstall a package. Uninstall won't work reliably on Debian/Ubuntu unless this issue gets fixed.
210
285
  # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=562544
211
-
212
286
  def uninstall
213
287
  command = resource_or_provider_command
214
288
  self.class.validate_command(command)
@@ -226,6 +300,28 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
226
300
  join_options(@resource[:install_options])
227
301
  end
228
302
 
303
+ def insync?(is)
304
+ return false unless is && is != :absent
305
+ begin
306
+ should = @resource[:ensure]
307
+ should_range = PIP_VERSION_RANGE.parse(should, PIP_VERSION)
308
+ rescue PIP_VERSION_RANGE::ValidationFailure, PIP_VERSION::ValidationFailure
309
+ Puppet.debug("Cannot parse #{should} as a pip version range")
310
+ return false
311
+ end
312
+
313
+ begin
314
+ is_version = PIP_VERSION.parse(is)
315
+ rescue PIP_VERSION::ValidationFailure
316
+ Puppet.debug("Cannot parse #{is} as a pip version")
317
+ return false
318
+ end
319
+
320
+ should_range.include?(is_version)
321
+ end
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.
229
325
  def self.quote(path)
230
326
  if path.include?(" ")
231
327
  "\"#{path}\""
@@ -233,5 +329,4 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
233
329
  path
234
330
  end
235
331
  end
236
- private_class_method :quote
237
332
  end
@@ -1,8 +1,6 @@
1
1
  # Puppet package provider for Python's `pip3` package management frontend.
2
2
  # <http://pip.pypa.io/>
3
3
 
4
- require 'puppet/provider/package/pip'
5
-
6
4
  Puppet::Type.type(:package).provide :pip3,
7
5
  :parent => :pip do
8
6
 
@@ -56,7 +56,7 @@ Puppet::Type.type(:package).provide :pkg, :parent => Puppet::Provider::Package d
56
56
  ).merge(
57
57
  case flags[1..1]
58
58
  when 'f'
59
- {:ensure => 'held'}
59
+ {:mark => :hold}
60
60
  when '-'
61
61
  {}
62
62
  else
@@ -114,6 +114,10 @@ Puppet::Type.type(:package).provide :pkg, :parent => Puppet::Provider::Package d
114
114
  end).merge({:provider => self.name})
115
115
  end
116
116
 
117
+ def deprecated_hold
118
+ hold
119
+ end
120
+
117
121
  def hold
118
122
  pkg(:freeze, @resource[:name])
119
123
  end
@@ -214,8 +218,6 @@ Puppet::Type.type(:package).provide :pkg, :parent => Puppet::Provider::Package d
214
218
  def install(nofail = false)
215
219
  name = @resource[:name]
216
220
  should = @resource[:ensure]
217
- # always unhold if explicitly told to install/update
218
- self.unhold
219
221
  is = self.query
220
222
  if is[:ensure].to_sym == :absent
221
223
  command = 'install'
@@ -230,7 +232,12 @@ Puppet::Type.type(:package).provide :pkg, :parent => Puppet::Provider::Package d
230
232
  unless should.is_a? Symbol
231
233
  name += "@#{should}"
232
234
  end
233
- r = exec_cmd(command(:pkg), command, *args, name)
235
+ self.unhold if self.properties[:mark] == :hold
236
+ begin
237
+ r = exec_cmd(command(:pkg), command, *args, name)
238
+ ensure
239
+ self.hold if @resource[:mark] == :hold
240
+ end
234
241
  return r if nofail
235
242
  raise Puppet::Error, _("Unable to update %{package}") % { package: r[:out] } if r[:exit] != 0
236
243
  end
@@ -244,7 +251,13 @@ Puppet::Type.type(:package).provide :pkg, :parent => Puppet::Provider::Package d
244
251
  cmd << '-r'
245
252
  end
246
253
  cmd << @resource[:name]
247
- pkg cmd
254
+ self.unhold if self.properties[:mark] == :hold
255
+ begin
256
+ pkg cmd
257
+ rescue StandardError, LoadError => e
258
+ self.hold if self.properties[:mark] == :hold
259
+ raise e
260
+ end
248
261
  end
249
262
 
250
263
  # update the package to the latest version available
@@ -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'])
@@ -31,7 +32,11 @@ Puppet::Type.type(:package).provide :pkgng, :parent => Puppet::Provider::Package
31
32
  def self.get_latest_version(origin)
32
33
  latest_version = cached_version_list.lines.find { |l| l =~ /^#{origin} / }
33
34
  if latest_version
34
- latest_version = latest_version.split(' ').last.split(')').first
35
+ _name, compare, status = latest_version.chomp.split(' ', 3)
36
+ if ['!', '?'].include?(compare)
37
+ return nil
38
+ end
39
+ latest_version = status.split(' ').last.split(')').first
35
40
  return latest_version
36
41
  end
37
42
  nil
@@ -110,13 +115,16 @@ Puppet::Type.type(:package).provide :pkgng, :parent => Puppet::Provider::Package
110
115
  end
111
116
 
112
117
  if not source # install using default repo logic
113
- args = ['install', '-qy', installname]
118
+ args = ['install', '-qy']
114
119
  elsif source.scheme == 'urn' # install from repo named in URN
115
120
  tag = repo_tag_from_urn(source.to_s)
116
- args = ['install', '-qy', '-r', tag, installname]
121
+ args = ['install', '-qy', '-r', tag]
117
122
  else # add package located at URL
118
- args = ['add', '-q', source.to_s]
123
+ args = ['add', '-q']
124
+ installname = source.to_s
119
125
  end
126
+ args += install_options if @resource[:install_options]
127
+ args << installname
120
128
 
121
129
  pkg(args)
122
130
  end
@@ -158,4 +166,8 @@ Puppet::Type.type(:package).provide :pkgng, :parent => Puppet::Provider::Package
158
166
  @property_hash[:origin]
159
167
  end
160
168
 
169
+ def install_options
170
+ join_options(@resource[:install_options])
171
+ end
172
+
161
173
  end