puppet 6.12.0-x64-mingw32 → 6.17.0-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (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
@@ -0,0 +1,53 @@
1
+ require 'puppet/util/package/version/range/lt'
2
+ require 'puppet/util/package/version/range/lt_eq'
3
+ require 'puppet/util/package/version/range/gt'
4
+ require 'puppet/util/package/version/range/gt_eq'
5
+ require 'puppet/util/package/version/range/eq'
6
+ require 'puppet/util/package/version/range/min_max'
7
+
8
+ module Puppet::Util::Package::Version
9
+ class Range
10
+ class ValidationFailure < ArgumentError; end
11
+ # Parses a version range string into a comparable {Range} instance.
12
+ #
13
+ # Currently parsed version range string may take any of the following
14
+ # forms:
15
+ #
16
+ # * Regular Version strings
17
+ # * ex. `"1.0.0"`, `"1.2.3-pre"`
18
+ # * Inequalities
19
+ # * ex. `">1.0.0"`, `"<3.2.0"`, `">=4.0.0"`
20
+ # * Range Intersections (min is always first)
21
+ # * ex. `">1.0.0 <=2.3.0"`
22
+ #
23
+ RANGE_SPLIT = /\s+/
24
+ FULL_REGEX = /\A((?:[<>=])*)(.+)\Z/
25
+
26
+ # @param range_string [String] the version range string to parse
27
+ # @param version_class [Version] a version class implementing comparison operators and parse method
28
+ # @return [Range] a new {Range} instance
29
+ # @api public
30
+ def self.parse(range_string, version_class)
31
+ raise ValidationFailure, "Unable to parse '#{range_string}' as a string" unless range_string.is_a?(String)
32
+ simples = range_string.split(RANGE_SPLIT).map do |simple|
33
+ match, operator, version = *simple.match(FULL_REGEX)
34
+ raise ValidationFailure, "Unable to parse '#{simple}' as a version range identifier" unless match
35
+ case operator
36
+ when '>'
37
+ Gt.new(version_class::parse(version))
38
+ when '>='
39
+ GtEq.new(version_class::parse(version))
40
+ when '<'
41
+ Lt.new(version_class::parse(version))
42
+ when '<='
43
+ LtEq.new(version_class::parse(version))
44
+ when ''
45
+ Eq.new(version_class::parse(version))
46
+ else
47
+ raise ValidationFailure, "Operator '#{operator}' is not implemented"
48
+ end
49
+ end
50
+ simples.size == 1 ? simples[0] : MinMax.new(simples[0], simples[1])
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,14 @@
1
+ require 'puppet/util/package/version/range/simple'
2
+
3
+ module Puppet::Util::Package::Version
4
+ class Range
5
+ class Eq < Simple
6
+ def to_s
7
+ "#{@version}"
8
+ end
9
+ def include?(version)
10
+ version == @version
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require 'puppet/util/package/version/range/simple'
2
+
3
+ module Puppet::Util::Package::Version
4
+ class Range
5
+ class Gt < Simple
6
+ def to_s
7
+ ">#{@version}"
8
+ end
9
+ def include?(version)
10
+ version > @version
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require 'puppet/util/package/version/range/simple'
2
+
3
+ module Puppet::Util::Package::Version
4
+ class Range
5
+ class GtEq < Simple
6
+ def to_s
7
+ ">=#{@version}"
8
+ end
9
+ def include?(version)
10
+ version >= @version
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require 'puppet/util/package/version/range/simple'
2
+
3
+ module Puppet::Util::Package::Version
4
+ class Range
5
+ class Lt< Simple
6
+ def to_s
7
+ "<#{@version}"
8
+ end
9
+ def include?(version)
10
+ version < @version
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require 'puppet/util/package/version/range/simple'
2
+
3
+ module Puppet::Util::Package::Version
4
+ class Range
5
+ class LtEq < Simple
6
+ def to_s
7
+ "<=#{@version}"
8
+ end
9
+ def include?(version)
10
+ version <= @version
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ require 'puppet/util/package/version/range'
2
+
3
+ module Puppet::Util::Package::Version
4
+ class Range
5
+ class MinMax
6
+ def initialize(min, max)
7
+ @min = min
8
+ @max = max
9
+ end
10
+ def to_s
11
+ "#{@min} #{@max}"
12
+ end
13
+ def to_gem_version
14
+ "#{@min}, #{@max}"
15
+ end
16
+ def include?(version)
17
+ @min.include?(version) && @max.include?(version)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,11 @@
1
+ require 'puppet/util/package/version/range'
2
+
3
+ module Puppet::Util::Package::Version
4
+ class Range
5
+ class Simple
6
+ def initialize(version)
7
+ @version = version
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+ require 'puppet/util/rpm_compare'
3
+
4
+ module Puppet::Util::Package::Version
5
+ class Rpm < Numeric
6
+ # provides Rpm parsing and comparison
7
+ extend Puppet::Util::RpmCompare
8
+ include Puppet::Util::RpmCompare
9
+ include Comparable
10
+
11
+ class ValidationFailure < ArgumentError; end
12
+
13
+ attr_reader :epoch, :version, :release, :arch
14
+
15
+ def self.parse(ver)
16
+ raise ValidationFailure unless ver.is_a?(String)
17
+ version = rpm_parse_evr(ver)
18
+ new(version[:epoch], version[:version], version[:release], version[:arch]).freeze
19
+ end
20
+
21
+ def to_s
22
+ version_found = ''
23
+ version_found += "#{@epoch}:" if @epoch
24
+ version_found += @version
25
+ version_found += "-#{@release}" if @release
26
+ version_found
27
+ end
28
+ alias inspect to_s
29
+
30
+ def eql?(other)
31
+ other.is_a?(self.class) &&
32
+ @epoch.eql?(other.epoch) &&
33
+ @version.eql?(other.version) &&
34
+ @release.eql?(other.release) &&
35
+ @arch.eql?(other.arch)
36
+ end
37
+ alias == eql?
38
+
39
+ def <=>(other)
40
+ raise ArgumentError, _("Cannot compare, as %{other} is not a Rpm Version") % { other: other } unless other.is_a?(self.class)
41
+
42
+ rpm_compareEVR(self.to_s, other.to_s)
43
+ end
44
+
45
+ private
46
+
47
+ # overwrite rpm_compareEVR to treat no epoch as zero epoch
48
+ # in order to compare version correctly
49
+ #
50
+ # returns 1 if a is newer than b,
51
+ # 0 if they are identical
52
+ # -1 if a is older than b
53
+ def rpm_compareEVR(a, b)
54
+ a_hash = rpm_parse_evr(a)
55
+ b_hash = rpm_parse_evr(b)
56
+
57
+ a_hash[:epoch] ||= '0'
58
+ b_hash[:epoch] ||= '0'
59
+
60
+ rc = compare_values(a_hash[:epoch], b_hash[:epoch])
61
+ return rc unless rc == 0
62
+
63
+ super(a, b)
64
+ end
65
+
66
+ def initialize(epoch, version, release, arch)
67
+ @epoch = epoch
68
+ @version = version
69
+ @release = release
70
+ @arch = arch
71
+ end
72
+ end
73
+ end
@@ -43,8 +43,23 @@ class Puppet::Util::Pidlock
43
43
  @lockfile.file_path
44
44
  end
45
45
 
46
+ private
47
+
48
+ def ps_argument_for_current_kernel
49
+ case Facter.value(:kernel)
50
+ when "Linux"
51
+ "-eq"
52
+ when "AIX"
53
+ "-T"
54
+ else
55
+ "-p"
56
+ end
57
+ end
58
+
46
59
  def clear_if_stale
47
- return @lockfile.unlock if lock_pid.nil?
60
+ pid = lock_pid
61
+ return @lockfile.unlock if pid == nil
62
+ return if Process.pid == pid
48
63
 
49
64
  errors = [Errno::ESRCH]
50
65
  # Win32::Process now throws SystemCallError. Since this could be
@@ -52,25 +67,36 @@ class Puppet::Util::Pidlock
52
67
  errors << SystemCallError if Puppet::Util::Platform.windows?
53
68
 
54
69
  begin
55
- Process.kill(0, lock_pid)
70
+ Process.kill(0, pid)
56
71
  rescue *errors
57
72
  return @lockfile.unlock
58
73
  end
59
74
 
60
75
  # Ensure the process associated with this pid is our process. If
61
- # not, we can unlock the lockfile. For now this is only done on
62
- # POSIX and Windows platforms (PUP-9247).
76
+ # not, we can unlock the lockfile. CLI arguments used for identifying
77
+ # on POSIX depend on the os and sometimes even version.
63
78
  if Puppet.features.posix?
64
- procname = Puppet::Util::Execution.execute(["ps", "-p", lock_pid, "-o", "comm="]).strip
65
- args = Puppet::Util::Execution.execute(["ps", "-p", lock_pid, "-o", "args="]).strip
79
+ ps_argument = ps_argument_for_current_kernel
80
+
81
+ # Check, obtain and use the right ps argument
82
+ begin
83
+ procname = Puppet::Util::Execution.execute(["ps", ps_argument, pid, "-o", "comm="]).strip
84
+ rescue Puppet::ExecutionFailure
85
+ ps_argument = "-p"
86
+ procname = Puppet::Util::Execution.execute(["ps", ps_argument, pid, "-o", "comm="]).strip
87
+ end
88
+
89
+ args = Puppet::Util::Execution.execute(["ps", ps_argument, pid, "-o", "args="]).strip
66
90
  @lockfile.unlock unless procname =~ /ruby/ && args =~ /puppet/ || procname =~ /puppet(-.*)?$/
67
91
  elsif Puppet.features.microsoft_windows?
68
92
  # On Windows, we're checking if the filesystem path name of the running
69
93
  # process is our vendored ruby:
70
- exe_path = Puppet::Util::Windows::Process::get_process_image_name_by_pid(lock_pid)
71
- @lockfile.unlock unless exe_path =~ /\\bin\\ruby.exe$/
94
+ begin
95
+ exe_path = Puppet::Util::Windows::Process::get_process_image_name_by_pid(pid)
96
+ @lockfile.unlock unless exe_path =~ /\\bin\\ruby.exe$/
97
+ rescue Puppet::Util::Windows::Error => e
98
+ Puppet.debug("Failed to read pidfile #{file_path}: #{e.message}")
99
+ end
72
100
  end
73
101
  end
74
- private :clear_if_stale
75
-
76
102
  end
@@ -14,6 +14,11 @@ module Puppet
14
14
  end
15
15
  module_function :windows?
16
16
 
17
+ def solaris?
18
+ RUBY_PLATFORM.include?('solaris')
19
+ end
20
+ module_function :solaris?
21
+
17
22
  def default_paths
18
23
  return [] if windows?
19
24
 
@@ -56,6 +56,12 @@ module Puppet::Util::Plist
56
56
  # Read plist text using the CFPropertyList gem.
57
57
  def parse_plist(plist_data, file_path = '')
58
58
  bad_xml_doctype = /^.*<!DOCTYPE plist PUBLIC -\/\/Apple Computer.*$/
59
+ # Depending on where parse_plist is called from, plist_data can be either XML or binary.
60
+ # If we get XML, make sure ruby knows it's UTF-8 so we avoid invalid byte sequence errors.
61
+ if plist_data.include?('encoding="UTF-8"') && plist_data.encoding != Encoding::UTF_8
62
+ plist_data.force_encoding(Encoding::UTF_8)
63
+ end
64
+
59
65
  begin
60
66
  if plist_data =~ bad_xml_doctype
61
67
  plist_data.gsub!( bad_xml_doctype, plist_xml_doctype )
@@ -62,7 +62,7 @@ module Puppet::Util::ProviderFeatures
62
62
  @features ||= {}
63
63
  raise Puppet::DevError, _("Feature %{name} is already defined") % { name: name } if @features.include?(name)
64
64
  begin
65
- obj = ProviderFeature.new(name, docs, hash)
65
+ obj = ProviderFeature.new(name, docs, **hash)
66
66
  @features[obj.name] = obj
67
67
  rescue ArgumentError => detail
68
68
  error = ArgumentError.new(
@@ -15,7 +15,7 @@ class Puppet::Util::Reference
15
15
  end
16
16
 
17
17
  def self.newreference(name, options = {}, &block)
18
- ref = self.new(name, options, &block)
18
+ ref = self.new(name, **options, &block)
19
19
  instance_hash(:reference)[name.intern] = ref
20
20
 
21
21
  ref
@@ -0,0 +1,193 @@
1
+ module Puppet::Util::RpmCompare
2
+
3
+ ARCH_LIST = %w(
4
+ noarch i386 i686 ppc ppc64 armv3l armv4b armv4l armv4tl armv5tel
5
+ armv5tejl armv6l armv7l m68kmint s390 s390x ia64 x86_64 sh3 sh4
6
+ ).freeze
7
+
8
+ ARCH_REGEX = Regexp.new(ARCH_LIST.join('|\.'))
9
+
10
+ # This is an attempt at implementing RPM's
11
+ # lib/rpmvercmp.c rpmvercmp(a, b) in Ruby.
12
+ #
13
+ # Some of the things in here look REALLY
14
+ # UGLY and/or arbitrary. Our goal is to
15
+ # match how RPM compares versions, quirks
16
+ # and all.
17
+ #
18
+ # I've kept a lot of C-like string processing
19
+ # in an effort to keep this as identical to RPM
20
+ # as possible.
21
+ #
22
+ # returns 1 if str1 is newer than str2,
23
+ # 0 if they are identical
24
+ # -1 if str1 is older than str2
25
+ def rpmvercmp(str1, str2)
26
+ return 0 if str1 == str2
27
+
28
+ front_strip_re = /^[^A-Za-z0-9~]+/
29
+
30
+ while str1.length > 0 or str2.length > 0
31
+ # trim anything that's in front_strip_re and != '~' off the beginning of each string
32
+ str1 = str1.gsub(front_strip_re, '')
33
+ str2 = str2.gsub(front_strip_re, '')
34
+
35
+ # "handle the tilde separator, it sorts before everything else"
36
+ if str1 =~ /^~/ && str2 =~ /^~/
37
+ # if they both have ~, strip it
38
+ str1 = str1[1..-1]
39
+ str2 = str2[1..-1]
40
+ next
41
+ elsif str1 =~ /^~/
42
+ return -1
43
+ elsif str2 =~ /^~/
44
+ return 1
45
+ end
46
+
47
+ break if str1.length == 0 or str2.length == 0
48
+
49
+ # "grab first completely alpha or completely numeric segment"
50
+ isnum = false
51
+ # if the first char of str1 is a digit, grab the chunk of continuous digits from each string
52
+ if str1 =~ /^[0-9]+/
53
+ if str1 =~ /^[0-9]+/
54
+ segment1 = $~.to_s
55
+ str1 = $~.post_match
56
+ else
57
+ segment1 = ''
58
+ end
59
+ if str2 =~ /^[0-9]+/
60
+ segment2 = $~.to_s
61
+ str2 = $~.post_match
62
+ else
63
+ segment2 = ''
64
+ end
65
+ isnum = true
66
+ # else grab the chunk of continuous alphas from each string (which may be '')
67
+ else
68
+ if str1 =~ /^[A-Za-z]+/
69
+ segment1 = $~.to_s
70
+ str1 = $~.post_match
71
+ else
72
+ segment1 = ''
73
+ end
74
+ if str2 =~ /^[A-Za-z]+/
75
+ segment2 = $~.to_s
76
+ str2 = $~.post_match
77
+ else
78
+ segment2 = ''
79
+ end
80
+ end
81
+
82
+ # if the segments we just grabbed from the strings are different types (i.e. one numeric one alpha),
83
+ # where alpha also includes ''; "numeric segments are always newer than alpha segments"
84
+ if segment2.length == 0
85
+ return 1 if isnum
86
+ return -1
87
+ end
88
+
89
+ if isnum
90
+ # "throw away any leading zeros - it's a number, right?"
91
+ segment1 = segment1.gsub(/^0+/, '')
92
+ segment2 = segment2.gsub(/^0+/, '')
93
+ # "whichever number has more digits wins"
94
+ return 1 if segment1.length > segment2.length
95
+ return -1 if segment1.length < segment2.length
96
+ end
97
+
98
+ # "strcmp will return which one is greater - even if the two segments are alpha
99
+ # or if they are numeric. don't return if they are equal because there might
100
+ # be more segments to compare"
101
+ rc = segment1 <=> segment2
102
+ return rc if rc != 0
103
+ end #end while loop
104
+
105
+ # if we haven't returned anything yet, "whichever version still has characters left over wins"
106
+ return 1 if str1.length > str2.length
107
+ return -1 if str1.length < str2.length
108
+ 0
109
+ end
110
+
111
+ # parse a rpm "version" specification
112
+ # this re-implements rpm's
113
+ # rpmUtils.miscutils.stringToVersion() in ruby
114
+ def rpm_parse_evr(full_version)
115
+ epoch_index = full_version.index(':')
116
+ if epoch_index
117
+ epoch = full_version[0,epoch_index]
118
+ full_version = full_version[epoch_index+1,full_version.length]
119
+ else
120
+ epoch = nil
121
+ end
122
+ begin
123
+ epoch = String(Integer(epoch))
124
+ rescue
125
+ # If there are non-digits in the epoch field, default to nil
126
+ epoch = nil
127
+ end
128
+ release_index = full_version.index('-')
129
+ if release_index
130
+ version = full_version[0,release_index]
131
+ release = full_version[release_index+1,full_version.length]
132
+ arch = release.scan(ARCH_REGEX)[0]
133
+ if arch
134
+ architecture = arch.delete('.')
135
+ release.gsub!(ARCH_REGEX, '')
136
+ end
137
+ else
138
+ version = full_version
139
+ release = nil
140
+ end
141
+ return { :epoch => epoch, :version => version, :release => release, :arch => architecture }
142
+ end
143
+
144
+ # this method is a native implementation of the
145
+ # compare_values function in rpm's python bindings,
146
+ # found in python/header-py.c, as used by rpm.
147
+ def compare_values(s1, s2)
148
+ return 0 if s1.nil? && s2.nil?
149
+ return 1 if ( not s1.nil? ) && s2.nil?
150
+ return -1 if s1.nil? && (not s2.nil?)
151
+ return rpmvercmp(s1, s2)
152
+ end
153
+
154
+ # how rpm compares two package versions:
155
+ # rpmUtils.miscutils.compareEVR(), which massages data types and then calls
156
+ # rpm.labelCompare(), found in rpm.git/python/header-py.c, which
157
+ # sets epoch to 0 if null, then compares epoch, then ver, then rel
158
+ # using compare_values() and returns the first non-0 result, else 0.
159
+ # This function combines the logic of compareEVR() and labelCompare().
160
+ #
161
+ # "version_should" can be v, v-r, or e:v-r.
162
+ # "version_is" will always be at least v-r, can be e:v-r
163
+ #
164
+ # return 1: a is newer than b
165
+ # 0: a and b are the same version
166
+ # -1: b is newer than a
167
+ def rpm_compareEVR(should, is)
168
+ # pass on to rpm labelCompare
169
+ should_hash = rpm_parse_evr(should)
170
+ is_hash = rpm_parse_evr(is)
171
+
172
+ if !should_hash[:epoch].nil?
173
+ rc = compare_values(should_hash[:epoch], is_hash[:epoch])
174
+ return rc unless rc == 0
175
+ end
176
+
177
+ rc = compare_values(should_hash[:version], is_hash[:version])
178
+ return rc unless rc == 0
179
+
180
+ # here is our special case, PUP-1244.
181
+ # if should_hash[:release] is nil (not specified by the user),
182
+ # and comparisons up to here are equal, return equal. We need to
183
+ # evaluate to whatever level of detail the user specified, so we
184
+ # don't end up upgrading or *downgrading* when not intended.
185
+ #
186
+ # This should NOT be triggered if we're trying to ensure latest.
187
+ return 0 if should_hash[:release].nil?
188
+
189
+ rc = compare_values(should_hash[:release], is_hash[:release])
190
+
191
+ return rc
192
+ end
193
+ end