From 103de787e3ea5871115d7449c2860c2aa40127e8 Mon Sep 17 00:00:00 2001 From: Tu2607 Date: Thu, 19 Feb 2026 17:09:44 -0800 Subject: [PATCH] (MAINT) Allow the use of external facts with FacterDB in the tool This commit updates the fact parser code to leverage facterdb's ability to accept external fact. This will allow the use of external fact submitted to this gem for future OSes without the need to update FacterDB. --- .github/workflows/ci.yaml | 4 +- Gemfile.lock | 9 +- abide_dev_utils.gemspec | 3 +- files/fact_sets/windows-2025-x86_64.facts | 169 ++++++++++++++++++++++ lib/abide_dev_utils/ppt/facter_utils.rb | 10 +- lib/abide_dev_utils/ppt/score_module.rb | 19 ++- lib/abide_dev_utils/version.rb | 2 +- 7 files changed, 200 insertions(+), 16 deletions(-) create mode 100644 files/fact_sets/windows-2025-x86_64.facts diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index bbb023d..dcab248 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -25,7 +25,7 @@ jobs: fail-fast: false matrix: ruby_version: - - '2.7' + # - '2.7' - '3.2' steps: - name: Checkout @@ -54,4 +54,4 @@ jobs: run: bundle exec rake 'sce:fixtures' - name: Run RSpec - run: bundle exec rake spec + run: bundle exec rspec spec/abide_dev_utils_spec.rb spec/abide_dev_utils/**/*_spec.rb diff --git a/Gemfile.lock b/Gemfile.lock index ffb93c5..f23eb8d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,14 +1,15 @@ PATH remote: . specs: - abide_dev_utils (0.18.4) + abide_dev_utils (0.18.5) cmdparse (~> 3.0) - facterdb (~> 2.1.0) + facterdb (~> 4.1.0) google-cloud-storage (~> 1.34) hashdiff (~> 1.0) jira-ruby (~> 2.2) metadata-json-lint (~> 4.0) nokogiri (~> 1.13) + puppet-lint (~> 4.0) puppet-strings (>= 2.7) ruby-progressbar (~> 1.11) selenium-webdriver (~> 4.0.0.beta4) @@ -107,8 +108,7 @@ GEM digest-crc (0.7.0) rake (>= 12.0.0, < 14.0.0) drb (2.2.1) - facterdb (2.1.0) - facter (< 5.0.0) + facterdb (4.1.0) jgrep (~> 1.5, >= 1.5.4) faraday (2.12.2) faraday-net_http (>= 2.0, < 3.5) @@ -255,6 +255,7 @@ GEM coderay (~> 1.1) method_source (~> 1.0) public_suffix (6.0.1) + puppet-lint (4.3.0) puppet-resource_api (1.9.0) hocon (>= 1.0) puppet-strings (4.1.3) diff --git a/abide_dev_utils.gemspec b/abide_dev_utils.gemspec index 6a8bc51..48946b4 100644 --- a/abide_dev_utils.gemspec +++ b/abide_dev_utils.gemspec @@ -41,7 +41,8 @@ Gem::Specification.new do |spec| spec.add_dependency 'selenium-webdriver', '~> 4.0.0.beta4' spec.add_dependency 'google-cloud-storage', '~> 1.34' spec.add_dependency 'hashdiff', '~> 1.0' - spec.add_dependency 'facterdb', '~> 2.1.0' + spec.add_dependency 'puppet-lint', '~> 4.0' + spec.add_dependency 'facterdb', '~> 4.1.0' spec.add_dependency 'metadata-json-lint', '~> 4.0' # Dev dependencies diff --git a/files/fact_sets/windows-2025-x86_64.facts b/files/fact_sets/windows-2025-x86_64.facts new file mode 100644 index 0000000..d041f20 --- /dev/null +++ b/files/fact_sets/windows-2025-x86_64.facts @@ -0,0 +1,169 @@ + +{ + "aio_agent_version": "8.10.0", + "dmi": { + "manufacturer": "innotek GmbH", + "product": { + "name": "VirtualBox", + "serial_number": "VirtualBox-8afd7ad4-bfe9-4f5a-8d30-93c42b25907d", + "uuid": "8AFD7AD4-BFE9-4F5A-8D30-93C42B25907D" + } + }, + "env_windows_installdir": "C:\\Program Files\\Puppet Labs\\Puppet", + "facterversion": "4.10.0", + "fips_enabled": false, + "hypervisors": { + "virtualbox": { + "revision": "167084", + "version": "7.1.6" + } + }, + "identity": { + "privileged": true, + "user": "FOO\\vagrant" + }, + "is_virtual": true, + "kernel": "windows", + "kernelmajversion": "10.0", + "kernelrelease": "10.0.20348", + "kernelversion": "10.0.20348", + "memory": { + "system": { + "available": "671.45 MiB", + "available_bytes": 704065536, + "capacity": "66.92%", + "total": "1.98 GiB", + "total_bytes": 2128289792, + "used": "1.33 GiB", + "used_bytes": 1424224256 + } + }, + "networking": { + "dhcp": "10.0.2.2", + "domain": "example.com", + "fqdn": "foo.example.com", + "hostname": "foo", + "interfaces": { + "Ethernet": { + "bindings": [ + { + "address": "10.0.2.15", + "netmask": "255.255.255.0", + "network": "10.0.2.0" + } + ], + "bindings6": [ + { + "address": "fd00::46ab:507:687:5b80", + "netmask": "ffff:ffff:ffff:ffff::", + "network": "fd00::", + "scope6": "global" + }, + { + "address": "fe80::aff:b25e:a03e:f84f", + "netmask": "ffff:ffff:ffff:ffff::", + "network": "fe80::", + "scope6": "link" + } + ], + "dhcp": "10.0.2.2", + "ip": "10.0.2.15", + "ip6": "fd00::46ab:507:687:5b80", + "mac": "08:00:27:07:2A:6E", + "mtu": 1500, + "netmask": "255.255.255.0", + "netmask6": "ffff:ffff:ffff:ffff::", + "network": "10.0.2.0", + "network6": "fd00::", + "scope6": "global" + } + }, + "ip": "10.0.2.15", + "ip6": "fd00::46ab:507:687:5b80", + "mac": "08:00:27:07:2A:6E", + "mtu": 1500, + "netmask": "255.255.255.0", + "netmask6": "ffff:ffff:ffff:ffff::", + "network": "10.0.2.0", + "network6": "fd00::", + "primary": "Ethernet", + "scope6": "global" + }, + "os": { + "architecture": "x64", + "family": "windows", + "hardware": "x86_64", + "name": "windows", + "release": { + "full": "2025", + "major": "2025" + }, + "windows": { + "display_version": "24H2", + "edition_id": "ServerStandardEval", + "installation_type": "Server Core", + "product_name": "Windows Server 2025 Standard Evaluation", + "release_id": "24H2", + "system32": "C:\\Windows\\system32" + } + }, + "path": "C:\\Program Files\\Puppet Labs\\Puppet\\puppet\\bin;C:\\Program Files\\Puppet Labs\\Puppet\\bin;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Windows\\System32\\OpenSSH\\;C:\\Program Files\\OpenSSH-Win64;C:\\Users\\vagrant\\AppData\\Local\\Microsoft\\WindowsApps", + "processors": { + "cores": 2, + "count": 2, + "isa": "x64", + "models": [ + "12th Gen Intel(R) Core(TM) i9-12900K" + ], + "physicalcount": 1, + "threads": 1 + }, + "puppetversion": "8.10.0", + "ruby": { + "platform": "x64-mingw32", + "sitedir": "C:/Program Files/Puppet Labs/Puppet/puppet/lib/ruby/site_ruby/3.2.0", + "version": "3.2.5" + }, + "ssh": { + "dsa": { + "fingerprints": { + "sha1": "SSHFP 2 1 a8d082d65ba073f4b588ca1532b2afff564655a5", + "sha256": "SSHFP 2 2 d58da160af2402446a90fefa3406636720cd41086332826939d95c9e3093b052" + }, + "key": "AAAAB3NzaC1kc3MAAACBAKKFEAtK0bNFrprCzPCwDTRR9kTrsuVgGhfWHH/z6cDb2MW3MiZR7FwPAMjyF8uDkOmujzx4v+T6OzqgjEm3d/AIbaBY7Ngk19RMGd6DcP6jj6356p1yQmZP/YRinSfYM6I6sYmjPopjREh7oCSw+mAtbpa6o0GZcwf8xyGU2CGvAAAAFQDSzyN8rO7yngMTJnsc5judSNv6nQAAAIAH7xfPEkE7jMV/BuVdmCsMfmHpI+KiKnyp+JjRBgz13FxfvWUu+tbCP6xJ2yeECKjk1oFfT/bsrKm0ChkZ7HssYRKcQW9CvcH6Z5ttRx9Oqm8PCM0kJpSxWm5a5dFPiHMdBCRIvJNksW7BPLCkuj/D+XzHCaDCDECzXELksPpspQAAAIBsV6OxseQ22u+48sDJJj1Jwl72cFtcxoZ7dFs/q78/xxeKHIRjNzTiaMqhBPY4V+2Sm6Zzgu2wJOQXYkEkq5F8X3BeTB0+xFkGPUXa/VexXJD71/Mc2uq0b24Z4ZqyqJfigp3PM6GzWuOUC14aS56t++ddGG690sPW1PhebPdgrw==", + "type": "ssh-dss" + }, + "ecdsa": { + "fingerprints": { + "sha1": "SSHFP 3 1 92c1a6d77ee3c13a54441b60a59a646f505f1309", + "sha256": "SSHFP 3 2 6630092ecc8589ad778944e3d203de842348b151e0dd3a0457533701a7fbb383" + }, + "key": "AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJuKojHoqRInzDL4edrdYI7gbbBrhj/oSptoChw4Y62/9id2Li73+6MEPc5RjnY+d5bBu0zUBUN5bSIEa0EaRI4=", + "type": "ecdsa-sha2-nistp256" + }, + "ed25519": { + "fingerprints": { + "sha1": "SSHFP 4 1 baaf376fcd4d0e07122280476eb61443fd17ab7f", + "sha256": "SSHFP 4 2 435cfd5fe8021a37548cc0e595c56c72de2c705f84992413f686c97de282d844" + }, + "key": "AAAAC3NzaC1lZDI1NTE5AAAAIKRQrcC/RFnVsJO8EI0Y0okEa6cfasfwaDYNXsRKlmb6", + "type": "ssh-ed25519" + }, + "rsa": { + "fingerprints": { + "sha1": "SSHFP 1 1 959d4674df454c8659a7da15a806b1892c784ce5", + "sha256": "SSHFP 1 2 95c4ce016dae223545270157b40fdb6e1d3b854464460637ba3e707316ec3c33" + }, + "key": "AAAAB3NzaC1yc2EAAAADAQABAAABgQC/gpkm190gP0gU8pD15mzIRdZl22QzkOUMnODF53qcYOgprQG4xni+1IGXZUrt2JoTbFG5yj0IVz6lZ+BOuk55vZ+WStIHMvVgAwxahelwaEHbbC0F7hAqfuPtUaqGSrjvGjRlGUEMZD/TTI/3jcvhb6ps31YsWHdhqRwo7nUPAWLVwpmX9EI1XENnwj38BD9jdLbhiXqJZMNyGmbivLwoQYUPZrtNGmO44Hfxx0rZqoXk5uexp/XR7r3qM3M4aa62zQKsDLDnfjwidkIbkUNTZgc1zC4tDQfd0zfa2LDiiawKCXBs18MhzcZJ581VCgs/D8Oa+PPOs3f4Ecl93HKd8bHiJ16ZBdBvcDFa9nZTQgQqyGZa72TyxXjwsyHHIOQ8wsAScjAufnBNoVFUugjgIhF9cuo/AfcMPGhUAgw2tlD6jT5QJyYOg7YG87qGKzU4XYeVQMnLgE1esoDkSA+IWmIX0rbDFoOi7ex8qComb7Z+HCldm7uIu5lgWE3zxwE=", + "type": "ssh-rsa" + } + }, + "system_uptime": { + "days": 0, + "hours": 0, + "seconds": 60, + "uptime": "0:01 hours" + }, + "timezone": "Coordinated Universal Time", + "virtual": "virtualbox" +} diff --git a/lib/abide_dev_utils/ppt/facter_utils.rb b/lib/abide_dev_utils/ppt/facter_utils.rb index eb2e9a7..efbe138 100644 --- a/lib/abide_dev_utils/ppt/facter_utils.rb +++ b/lib/abide_dev_utils/ppt/facter_utils.rb @@ -65,7 +65,9 @@ def initialize end def fact_sets - @fact_sets ||= FacterDB.facterdb_fact_files.each_with_object({}) do |f, h| + external_fact_path = File.expand_path(File.join(__dir__, '../../../files/fact_sets')) + all_facts = (FacterDB.default_fact_files + FacterDB.external_fact_files(external_fact_path)).uniq + @fact_sets ||= all_facts.each_with_object({}) do |f, h| facter_version = File.basename(File.dirname(f)) fact_set = h[facter_version] || FactSet.new(facter_version) fact_set.load_facts(f) @@ -229,7 +231,9 @@ class << self # end def fact_sets - @fact_sets ||= FacterDB.facterdb_fact_files.each_with_object([]) do |f, ary| + external_fact_path = File.expand_path(File.join(__dir__, '../../../files/fact_sets')) + all_facts = (FacterDB.default_fact_files + FacterDB.external_fact_files(external_fact_path)).uniq + @fact_sets ||= all_facts.each_with_object([]) do |f, ary| facter_version = File.basename(File.dirname(f)) fact_set = ary.find { |fs| fs.facter_version == facter_version } fact_set ||= FactSet.new(facter_version) @@ -283,7 +287,7 @@ def recurse_versions(version = latest_version, &block) rescue SystemStackError locals = { prev_ver_map: @previous_major_version_map, - current_version: current_version, + current_version: current_version } raise "Failed to find output while recursing versions. Locals: #{locals}" end diff --git a/lib/abide_dev_utils/ppt/score_module.rb b/lib/abide_dev_utils/ppt/score_module.rb index 14155c1..fbb3fbf 100644 --- a/lib/abide_dev_utils/ppt/score_module.rb +++ b/lib/abide_dev_utils/ppt/score_module.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'pathname' -require 'metadata-json-lint' +require 'metadata_json_lint' require 'puppet-lint' require 'json' @@ -118,14 +118,22 @@ def metadata_dep_version_requirement(dependency) end ver_req = MetadataJsonLint::VersionRequirement.new(dependency['version_requirement']) - return [nil, metadata_dep_open_ended(dependency['name'], dependency['version_requirement'])] if ver_req.open_ended? - return [nil, metadata_dep_mixed_syntax(dependency['name'], dependency['version_requirement'])] if ver_req.mixed_syntax? + if ver_req.open_ended? + return [nil, + metadata_dep_open_ended(dependency['name'], dependency['version_requirement'])] + end + if ver_req.mixed_syntax? + return [nil, + metadata_dep_mixed_syntax(dependency['name'], + dependency['version_requirement'])] + end [nil, nil] end def metadata_dep_open_ended(name, version_req) - metadata_err(:dependencies, "Dependency #{name} has an open ended dependency version requirement #{version_req}") + metadata_err(:dependencies, + "Dependency #{name} has an open ended dependency version requirement #{version_req}") end def metadata_dep_mixed_syntax(name, version_req) @@ -135,7 +143,8 @@ def metadata_dep_mixed_syntax(name, version_req) end def metadata_dep_version_range(name) - metadata_err(:dependencies, "Dependency #{name} has a 'version_range' attribute which is no longer used by the forge.") + metadata_err(:dependencies, + "Dependency #{name} has a 'version_range' attribute which is no longer used by the forge.") end def metadata_err(check, msg) diff --git a/lib/abide_dev_utils/version.rb b/lib/abide_dev_utils/version.rb index 37e4e6b..42e7719 100644 --- a/lib/abide_dev_utils/version.rb +++ b/lib/abide_dev_utils/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module AbideDevUtils - VERSION = "0.18.4" + VERSION = "0.18.5" end