pax_global_header00006660000000000000000000000064147020476440014522gustar00rootroot0000000000000052 comment=543b962a8173eddc41e3d7a54515e4562f86a0a1 puppetlabs-facter-dfe6df4/000077500000000000000000000000001470204764400157275ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/.github/000077500000000000000000000000001470204764400172675ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/.github/actions/000077500000000000000000000000001470204764400207275ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/.github/actions/presuite.rb000066400000000000000000000103341470204764400231150ustar00rootroot00000000000000# frozen_string_literal: true require 'open3' require 'fileutils' def if_no_env_vars_set_defaults ENV['FACTER_ROOT'] = __dir__.gsub('/.github/actions', '') unless ENV['FACTER_ROOT'] ENV['SHA'] = 'latest' unless ENV['SHA'] ENV['RELEASE_STREAM'] = 'puppet7' unless ENV['RELEASE_STREAM'] end def install_bundler message('INSTALL BUNDLER') run('gem install bundler') end def install_facter_acceptance_dependencies message('INSTALL FACTER ACCEPTANCE DEPENDENCIES') run('bundle install') end def initialize_beaker beaker_platform_with_options = platform_with_options(beaker_platform) message('BEAKER INITIALIZE') run("beaker init -h #{beaker_platform_with_options} -o #{File.join('config', 'aio', 'options.rb')}") message('BEAKER PROVISION') run('beaker provision') end def beaker_platform { 'ubuntu-20.04' => 'ubuntu2004-64a', 'macos-12' => 'osx12-64a', 'windows-2016' => 'windows2016-64a', 'windows-2019' => 'windows2019-64a' }[HOST_PLATFORM] end def platform_with_options(platform) return "\"#{platform}{hypervisor=none,hostname=localhost,is_cygwin=false}\"" if platform.include? 'windows' "#{platform}{hypervisor=none\\,hostname=localhost}" end def install_puppet_agent message('INSTALL PUPPET AGENT') beaker_puppet_root = run('bundle info beaker-puppet --path') # Bundler/Rubygems can sometimes give output other than the filepath (deprecation warnings, etc.) begin if File.exist?(beaker_puppet_root.chomp) presuite_file_path = File.join(beaker_puppet_root.chomp, 'setup', 'aio', '010_Install_Puppet_Agent.rb') run("beaker exec pre-suite --pre-suite #{presuite_file_path} --preserve-state", './', env_path_var) else exit end rescue SystemExit puts "`bundle info beaker-puppet --path` produced unexpected output, please address this." end end def puppet_puppet_bin_dir return '/opt/puppetlabs/puppet/bin' unless HOST_PLATFORM.include? 'windows' 'C:\\Program Files\\Puppet Labs\\Puppet\\puppet\\bin' end def puppet_bin_dir return '/opt/puppetlabs/puppet/bin' unless HOST_PLATFORM.include? 'windows' 'C:\\Program Files\\Puppet Labs\\Puppet\\bin' end def puppet_ruby return '/opt/puppetlabs/puppet/bin/ruby' unless HOST_PLATFORM.include? 'windows' 'C:\\Program Files\\Puppet Labs\\Puppet\\puppet\\bin\\ruby.exe' end def facter_lib_path return '/opt/puppetlabs/puppet/lib/ruby/vendor_ruby/facter' unless HOST_PLATFORM.include? 'windows' 'C:\\Program Files\\Puppet Labs\\Puppet\\puppet\\lib\\ruby\\vendor_ruby\\facter' end def env_path_var HOST_PLATFORM.include?('windows') ? { 'PATH' => "#{puppet_bin_dir};#{ENV['PATH']}" } : {} end def install_facter message('OVERWRITE FACTER FROM PUPPET AGENT') # clean facter directory FileUtils.rm_r(facter_lib_path) FileUtils.mkdir(facter_lib_path) Dir.chdir('../') do run("\'#{puppet_ruby}\' install.rb --bindir=\'#{puppet_puppet_bin_dir}\' " \ "--sitelibdir=\'#{facter_lib_path.gsub('facter', '')}\'") end end def run_acceptance_tests message('RUN ACCEPTANCE TESTS') run('beaker exec tests --test-tag-exclude=server,facter_3 --test-tag-or=risk:high,audit:high', './', env_path_var) end def message(message) message_length = message.length total_length = 130 lines_length = (total_length - message_length) / 2 result = ('-' * lines_length + ' ' + message + ' ' + '-' * lines_length)[0, total_length] puts "\n\n#{result}\n\n" end def run(command, dir = './', env = {}) puts command output = '' Open3.popen2e(env, command, chdir: dir) do |_stdin, stdout_and_err, wait_thr| stdout_and_err.each do |line| puts line output += line end exit_status = wait_thr.value.exitstatus exit(exit_status) if exit_status != 0 end output end def verify_facter_standalone_exits_0 Dir.chdir(ENV['FACTER_ROOT']) do run('bundle install --without development') run('bundle exec facter') end end ENV['DEBIAN_DISABLE_RUBYGEMS_INTEGRATION'] = 'no_warnings' if_no_env_vars_set_defaults ACCEPTANCE_PATH = File.join(ENV['FACTER_ROOT'], 'acceptance') HOST_PLATFORM = ARGV[0] install_bundler verify_facter_standalone_exits_0 Dir.chdir(ACCEPTANCE_PATH) do install_facter_acceptance_dependencies initialize_beaker install_puppet_agent install_facter run_acceptance_tests end puppetlabs-facter-dfe6df4/.github/dependabot.yml000066400000000000000000000005751470204764400221260ustar00rootroot00000000000000version: 2 updates: # raise PRs for gem updates - package-ecosystem: bundler directory: "/" schedule: interval: daily time: "13:00" open-pull-requests-limit: 10 # Maintain dependencies for GitHub Actions - package-ecosystem: github-actions directory: "/" schedule: interval: daily time: "13:00" open-pull-requests-limit: 10 puppetlabs-facter-dfe6df4/.github/release.yml000066400000000000000000000002251470204764400214310ustar00rootroot00000000000000changelog: categories: - title: Features & Enhancements labels: - enhancement - title: Bug Fixes labels: - bug puppetlabs-facter-dfe6df4/.github/workflows/000077500000000000000000000000001470204764400213245ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/.github/workflows/acceptance_tests.yml000066400000000000000000000034741470204764400253670ustar00rootroot00000000000000--- name: Acceptance tests on: push: branches: - main pull_request: branches: - main jobs: acceptance_tests: name: Platform strategy: matrix: os: [ windows-2019, ubuntu-20.04, macos-12 ] runs-on: ${{ matrix.os }} env: BEAKER_debug: true FACTER_ROOT: facter SHA: latest RELEASE_STREAM: puppet7 steps: - name: Checkout current PR uses: actions/checkout@v4 with: path: facter - name: Install Ruby 2.7 uses: ruby/setup-ruby@v1 with: ruby-version: '2.7' rubygems: '3.3.26' - name: Fix common Linux and macOS permissions if: runner.os != 'Windows' run: sudo chmod a-w /opt - name: Fix Linux permissions if: runner.os == 'Linux' run: | sudo chmod a-w /home/runner /usr/share && sudo chmod -R a-w /home/runner/.config /home/linuxbrew - name: Install dhclient for Linux if: runner.os == 'Linux' run: | sudo apt install dhcpcd5 sudo dhclient # IPv6 is missing on the GitHub macOS image and we need it for the networking facts tests # https://github.com/actions/runner-images/issues/668 - name: Add IPv6 on macOS if: runner.os == 'macOS' run: | primary_interface=`route -n get default | awk '/interface: */{print $NF}'` sudo ifconfig $primary_interface inet6 add ::1/64 - name: Run acceptance tests on Linux-like platform if: runner.os != 'Windows' run: sudo -E "PATH=$PATH" ruby $FACTER_ROOT/.github/actions/presuite.rb ${{ matrix.os }} - name: Run acceptance tests on Windows-like platform if: runner.os == 'Windows' run: ruby $Env:FACTER_ROOT/.github/actions/presuite.rb ${{ matrix.os }} puppetlabs-facter-dfe6df4/.github/workflows/checks.yaml000066400000000000000000000006561470204764400234570ustar00rootroot00000000000000--- name: Checks on: push: branches: - main pull_request: branches: - main jobs: rubocop_checks: runs-on: ubuntu-20.04 name: RuboCop steps: - name: Checkout current PR uses: actions/checkout@v4 - name: Rubocop checks uses: ruby/setup-ruby@v1 with: ruby-version: '2.7' bundler-cache: true - run: bundle exec rubocop --parallel puppetlabs-facter-dfe6df4/.github/workflows/coverage.yaml000066400000000000000000000015031470204764400240020ustar00rootroot00000000000000--- name: Coverage on: push: branches: - main jobs: coverage_checks: runs-on: ubuntu-20.04 name: coverage steps: - name: Checkout current PR uses: actions/checkout@v4 - name: Setup Code Climate test-reporter run: | curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter chmod +x ./cc-test-reporter ./cc-test-reporter before-build - name: Generate coverage uses: ruby/setup-ruby@v1 with: ruby-version: '2.7' bundler-cache: true - run: bundle exec rake spec - name: Publish code coverage run: | export GIT_BRANCH="${GITHUB_REF/refs\/heads\//}" ./cc-test-reporter after-build -r ${{secrets.CC_TEST_REPORTER_ID}} puppetlabs-facter-dfe6df4/.github/workflows/integration_tests.yaml000066400000000000000000000015761470204764400257660ustar00rootroot00000000000000--- name: Integration tests on: push: branches: - main pull_request: branches: - main env: CI: true jobs: integration_tests: name: integration ${{ matrix.cfg.os }} (ruby ${{ matrix.cfg.ruby }}) strategy: matrix: cfg: - {os: ubuntu-latest, ruby: '2.7'} - {os: ubuntu-22.04, ruby: '3.2'} # with openssl 3 - {os: ubuntu-22.04, ruby: 'jruby-9.3.14.0'} - {os: windows-2019, ruby: '2.7'} - {os: windows-2019, ruby: '3.2'} # with openssl 3 runs-on: ${{ matrix.cfg.os }} env: BUNDLE_SET: 'with integration' steps: - name: Checkout current PR uses: actions/checkout@v4 - name: Rspec checks uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.cfg.ruby }} bundler-cache: true - run: bundle exec rake spec_integration puppetlabs-facter-dfe6df4/.github/workflows/jira.yml000066400000000000000000000006121470204764400227730ustar00rootroot00000000000000--- name: Export issue to Jira on: issues: types: [labeled] permissions: issues: write jobs: export: uses: "puppetlabs/phoenix-github-actions/.github/workflows/jira.yml@main" with: jira-project: FACT jira-base-url: ${{ vars.jira_base_url }} jira-user-email: ${{ vars.jira_user_email }} secrets: jira-api-token: ${{ secrets.JIRA_ISSUES_ACTION }} puppetlabs-facter-dfe6df4/.github/workflows/mend.yaml000066400000000000000000000017631470204764400231420ustar00rootroot00000000000000--- name: Mend Monitor on: push: branches: - main jobs: mend_monitor: if: ${{ github.repository_owner == 'puppetlabs' }} runs-on: ubuntu-latest name: Mend Monitor steps: - name: Checkout current PR uses: actions/checkout@v4 - name: Setup Ruby uses: ruby/setup-ruby@v1 with: ruby-version: 2.7 - name: Create lock run: bundle lock - uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: '17' - name: Download Mend run: curl -o wss-unified-agent.jar https://unified-agent.s3.amazonaws.com/wss-unified-agent.jar - name: Run Mend run: java -jar wss-unified-agent.jar env: WS_APIKEY: ${{ secrets.MEND_API_KEY }} WS_WSS_URL: https://saas-eu.whitesourcesoftware.com/agent WS_USERKEY: ${{ secrets.MEND_TOKEN }} WS_PRODUCTNAME: Puppet Agent WS_PROJECTNAME: ${{ github.event.repository.name }} puppetlabs-facter-dfe6df4/.github/workflows/unit_tests.yaml000066400000000000000000000020761470204764400244160ustar00rootroot00000000000000--- name: Unit tests on: push: branches: - main pull_request: branches: - main env: CI: true jobs: linux_unit_tests: name: Ruby version strategy: matrix: ruby: - '2.5' - '2.7' - '3.0' - '3.2' - 'jruby-9.3.14.0' - 'jruby-9.4.8.0' runs-on: ubuntu-20.04 steps: - name: Checkout current PR uses: actions/checkout@v4 - name: Rspec checks uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.ruby }} bundler-cache: true - run: bundle exec rake spec_random windows_unit_tests: name: Windows tests with Ruby ${{ matrix.ruby }} strategy: matrix: ruby: - '2.7' - '3.2' runs-on: windows-2019 steps: - name: Checkout current PR uses: actions/checkout@v4 - name: Rspec checks uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.ruby }} bundler-cache: true - run: bundle exec rake spec_random puppetlabs-facter-dfe6df4/.gitignore000066400000000000000000000021551470204764400177220ustar00rootroot00000000000000*.gem *.rbc /.config /coverage/ /InstalledFiles /pkg/ /spec/reports/ /spec/examples.txt /test/tmp/ /test/version_tmp/ /tmp/ # Used by dotenv library to load environment variables. # .env ## Specific to RubyMotion: .dat* .repl_history build/ *.bridgesupport build-iPhoneOS/ build-iPhoneSimulator/ ## Specific to RubyMotion (use of CocoaPods): # # We recommend against adding the Pods directory to your .gitignore. However # you should judge for yourself, the pros and cons are mentioned at: # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control # # vendor/Pods/ ## Documentation cache and generated files: /.yardoc/ /_yardoc/ /doc/ /rdoc/ ## Environment normalization: /.bundle/ /vendor/bundle /lib/bundler/man/ ## Logs *.log # for a library or gem, you might want to ignore these files since the code is # intended to run in multiple environments; otherwise, check them in: # Gemfile.lock # .ruby-version # .ruby-gemset # unless supporting rvm < 1.11.0 or doing something fancy, ignore this: .rvmrc .rspec_status Gemfile.lock Gemfile.local acceptance/vendor .beaker puppetlabs-facter-dfe6df4/.jrubyrc000066400000000000000000000000431470204764400174050ustar00rootroot00000000000000cli.debug=true debug.fullTrace=truepuppetlabs-facter-dfe6df4/.rspec000066400000000000000000000000361470204764400170430ustar00rootroot00000000000000--color --require spec_helper puppetlabs-facter-dfe6df4/.rubocop.yml000066400000000000000000000050361470204764400202050ustar00rootroot00000000000000--- inherit_from: .rubocop_todo.yml AllCops: TargetRubyVersion: 2.5 Exclude: - acceptance/**/* - vendor/**/* require: - rubocop-performance - rubocop-rspec Layout/LineLength: Enabled: false Metrics/AbcSize: Enabled: false Metrics/BlockLength: Enabled: false Metrics/ClassLength: Enabled: false Metrics/CyclomaticComplexity: Enabled: false Metrics/MethodLength: Enabled: false Metrics/ModuleLength: Enabled: false Metrics/PerceivedComplexity: Enabled: false Naming/ClassAndModuleCamelCase: Exclude: - 'spec/mocks/win32.rb' Naming/MethodName: Exclude: - 'spec/mocks/win32ole.rb' - 'spec/mocks/ffi.rb' Naming/PredicateName: Exclude: - 'spec/**/*' Naming/VariableNumber: Exclude: - 'lib/facter/resolvers/windows/ffi/networking_ffi.rb' - 'lib/facter/util/facts/windows_release_finder.rb' RSpec/DescribedClass: EnforcedStyle: explicit RSpec/ExampleLength: Enabled: false # It is sometimes better to expect().to receive().and_return # or to receive different messages. RSpec/MessageSpies: Enabled: false RSpec/MultipleExpectations: Max: 3 RSpec/MultipleMemoizedHelpers: Enabled: false RSpec/NestedGroups: Enabled: 6 RSpec/StubbedMock: Enabled: false RSpec/SubjectStub: Exclude: - 'spec/custom_facts/core/aggregate_spec.rb' - 'spec/custom_facts/core/resolvable_spec.rb' - 'spec/custom_facts/util/fact_spec.rb' - 'spec/custom_facts/util/resolution_spec.rb' # Prefer instance_double/instance_spy over double/spy because only methods # defined on the underlying object can be stubbed. FFI and some Windows # code can't be verified because of the way we fake out those classes. RSpec/VerifiedDoubles: Enabled: true Exclude: - 'spec/custom_facts/**/*' - 'spec/facter/resolvers/aix/hardware_spec.rb' - 'spec/facter/resolvers/*/ffi_helper_spec.rb' - 'spec/facter/resolvers/windows/*' - 'spec/facter/util/windows/network_utils_spec.rb' - 'spec/facter/util/windows/win32ole_spec.rb' # $stdout is preferred because it refers to the *current* stdout stream, while # STDOUT refers to the original stream. However, we can't just switch to using # $stdout, because it may have been assigned to a different object than STDOUT, # such as a IO to a file. Style/GlobalStdStream: Exclude: - 'lib/facter.rb' - 'lib/facter/framework/cli/cli_launcher.rb' - 'lib/facter/framework/logging/logger.rb' - 'spec/framework/core/fact/internal/internal_fact_manager_spec.rb' - 'spec/framework/logging/logger_spec.rb' Style/IfUnlessModifier: Enabled: false puppetlabs-facter-dfe6df4/.rubocop_todo.yml000066400000000000000000000037621470204764400212360ustar00rootroot00000000000000# This configuration was generated by # `rubocop --auto-gen-config` # on 2024-01-08 20:12:30 UTC using RuboCop version 1.59.0. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new # versions of RuboCop, may require this file to be generated again. # Offense count: 3 # This cop supports safe autocorrection (--autocorrect). Performance/RegexpMatch: Exclude: - 'install.rb' # Offense count: 70 # Configuration parameters: Include, CustomTransform, IgnoreMethods, SpecSuffixOnly. # Include: **/*_spec*rb*, **/spec/**/* RSpec/FilePath: Enabled: false # Need to remove logger class variables Style/ClassVars: Exclude: - 'lib/facter/framework/logging/logger.rb' - 'spec/custom_facts/puppetlabs_spec/files.rb' - 'spec/facter/util/file_helper_spec.rb' - 'spec/framework/core/fact/internal/internal_fact_manager_spec.rb' - 'spec/framework/logging/logger_spec.rb' Style/Documentation: Exclude: - 'lib/facter.rb' # should be documented - 'lib/facter/config.rb' # should be documented - 'lib/facter/custom_facts/**/*' # should be documented - 'lib/facter/facts/**/*' # don't care - 'lib/facter/framework/**/*' # should be documented - 'lib/facter/models/**/*' # should be documented - 'lib/facter/resolvers/**/*' # don't care - 'lib/facter/util/**/*' - 'lib/facter/version.rb' # auto updated - 'spec/**/*' - 'spec_integration/**/*' - 'scripts/*' - 'install.rb' # While it would be preferable to use a keyword argument for the proxy setting in #get_request and #put_request, if we # add keyword arguments to those methods Ruby < 3 misinterprets earlier positional arguments as a keyword arguments. # This is because those positional arguments are hashes that use symbols as keys. # TODO: revisit this after we drop Ruby < 3 support. Style/OptionalBooleanParameter: Exclude: - 'lib/facter/util/resolvers/http.rb'puppetlabs-facter-dfe6df4/.rubycritic.yml000066400000000000000000000000731470204764400207070ustar00rootroot00000000000000paths: # Files to analyse. - 'lib' - 'bin' - 'config'puppetlabs-facter-dfe6df4/CHANGELOG.md000066400000000000000000001056041470204764400175460ustar00rootroot00000000000000## Facter release notes are now provided as part of the [official Puppet documentation](https://puppet.com/docs/puppet/7/release_notes_facter.html) and are no longer tracked in this file. # Previous versions ## [4.0.44](https://github.com/puppetlabs/facter/tree/4.0.44) (2020-10-21) [Full Changelog](https://github.com/puppetlabs/facter/compare/4.0.43...4.0.44) ### Added - Added disk_type field to disk fact [#2145](https://github.com/puppetlabs/facter/pull/2145) ([kozl](https://github.com/kozl)) ### Fixed - (FACT-2806) Fix os.release.minor on amazon 6 [#2133](https://github.com/puppetlabs/facter/pull/2133) ([florindragos](https://github.com/florindragos)) - (FACT-2832) Use full path for augparse command [#2135](https://github.com/puppetlabs/facter/pull/2135) ([oanatmaria](https://github.com/oanatmaria)) - (FACT-2815) Added timing for cached facts [#2134](https://github.com/puppetlabs/facter/pull/2134) ([sebastian-miclea](https://github.com/sebastian-miclea)) - (FACT-2834) Dinamically get AIX proc number [#2147](https://github.com/puppetlabs/facter/pull/2147) ([sebastian-miclea](https://github.com/sebastian-miclea)) - (FACT-2829) Fixed partitions and mount points facts [#2146](https://github.com/puppetlabs/facter/pull/2146) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) - (maint) Use strings instead of symbols for os names. [#2149](https://github.com/puppetlabs/facter/pull/2149) ([IrimieBogdan](https://github.com/IrimieBogdan)) ## [4.0.43](https://github.com/puppetlabs/facter/tree/4.0.43) (2020-10-12) [Full Changelog](https://github.com/puppetlabs/facter/compare/4.0.42...4.0.43) ### Fixed - (FACT-2810) Fix dmi.board_asset_tag and dhcp [#2125](https://github.com/puppetlabs/facter/pull/2125) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) - (FACT-2817) Only invalidate session cache on clear and reset. [#2121](https://github.com/puppetlabs/facter/pull/2121) ([IrimieBogdan](https://github.com/IrimieBogdan)) - (maint) Fix virtual_detector [#2128](https://github.com/puppetlabs/facter/pull/2128) ([IrimieBogdan](https://github.com/IrimieBogdan)) - (FACT-2806) Fix physicalprocessorcount [#2127](https://github.com/puppetlabs/facter/pull/2127) ([florindragos](https://github.com/florindragos)) - (FACT-2809) Fixed output differences on solaris [#2116](https://github.com/puppetlabs/facter/pull/2116) ([sebastian-miclea](https://github.com/sebastian-miclea)) ## [4.0.42](https://github.com/puppetlabs/facter/tree/4.0.42) (2020-10-07) [Full Changelog](https://github.com/puppetlabs/facter/compare/4.0.41...4.0.42) ### Added - (FACT-2792) Show not supported message for facter -p [#2119](https://github.com/puppetlabs/facter/pull/2119) ([IrimieBogdan](https://github.com/IrimieBogdan)) ### Fixed - (FACT-2805) Read available memory from MemAvailable [#2109](https://github.com/puppetlabs/facter/pull/2109) ([florindragos](https://github.com/florindragos)) - (maint) Avoid deadlock of Facter::Core::Execution.execute [#2114](https://github.com/puppetlabs/facter/pull/2114) ([oanatmaria](https://github.com/oanatmaria)) - (maint) Fix external fact cache [#2123](https://github.com/puppetlabs/facter/pull/2123) ([florindragos](https://github.com/florindragos)) ## [4.0.41](https://github.com/puppetlabs/facter/tree/4.0.41) (2020-10-01) [Full Changelog](https://github.com/puppetlabs/facter/compare/4.0.40...4.0.41) ### Fixed - (FACT-2824) Facter make ec2 metadata requests when on gce [#2113](https://github.com/puppetlabs/facter/pull/2113) ([IrimieBogdan](https://github.com/IrimieBogdan)) ## [4.0.40](https://github.com/puppetlabs/facter/tree/4.0.40) (2020-09-30) [Full Changelog](https://github.com/puppetlabs/facter/compare/4.0.39...4.0.40) ### Added - (FACT-2774) Extend facter API with resolve. [#2054](https://github.com/puppetlabs/facter/pull/2054) ([IrimieBogdan](https://github.com/IrimieBogdan)) ### Fixed - (FACT-2798) Set color to true, fix Facter.log_exception [#2105](https://github.com/puppetlabs/facter/pull/2105) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) - (FACT-2816) - Fix ec2 fact issues when on non ec2 systems [#2106](https://github.com/puppetlabs/facter/pull/2106) ([logicminds](https://github.com/logicminds)) - (FACT-2799) Fix fact loading for nested fact calls [#2108](https://github.com/puppetlabs/facter/pull/2108) ([IrimieBogdan](https://github.com/IrimieBogdan)) - (FACT-2786) Fix fact caching if fact is defined in multiple groups [#2089](https://github.com/puppetlabs/facter/pull/2089) ([florindragos](https://github.com/florindragos)) - (maint) Fix for blockdevice_*_size legacy fact on Aix and Solaris [#2111](https://github.com/puppetlabs/facter/pull/2111) ([sebastian-miclea](https://github.com/sebastian-miclea)) ## [4.0.39](https://github.com/puppetlabs/facter/tree/4.0.39) (2020-09-23) [Full Changelog](https://github.com/puppetlabs/facter/compare/4.0.38...4.0.39) ### Added - (FACT-2746) Added cloud resolver [#2082](https://github.com/puppetlabs/facter/pull/2082) ([sebastian-miclea](https://github.com/sebastian-miclea)) - (FACT-2317) Add Facter.define_fact method [#2102](https://github.com/puppetlabs/facter/pull/2102) ([oanatmaria](https://github.com/oanatmaria)) - FACT(2326) Add Facter.each method [#2100](https://github.com/puppetlabs/facter/pull/2100) ([florindragos](https://github.com/florindragos)) - (FACT-2324) Add loadfacts API method [#2103](https://github.com/puppetlabs/facter/pull/2103) ([sebastian-miclea](https://github.com/sebastian-miclea)) ### Fixed - (FACT-2802) Fix Cloud resolver [#2093](https://github.com/puppetlabs/facter/pull/2093) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) - (FACT-2803) Detect hypervisors as amazon if virtwhat detects aws. [#2095](https://github.com/puppetlabs/facter/pull/2095) ([IrimieBogdan](https://github.com/IrimieBogdan)) - (FACT-2748) Fixed type for blockdevice_*_size [#2098](https://github.com/puppetlabs/facter/pull/2098) ([sebastian-miclea](https://github.com/sebastian-miclea)) - (FACT-2793) Time limit for Facter::Core::Execute [#2080](https://github.com/puppetlabs/facter/pull/2080) ([oanatmaria](https://github.com/oanatmaria)) ## [4.0.38](https://github.com/puppetlabs/facter/tree/4.0.38) (2020-09-16) [Full Changelog](https://github.com/puppetlabs/facter/compare/4.0.37...4.0.38) ### Added - (FACT-2319) Added debugonce method [#2085](https://github.com/puppetlabs/facter/pull/2085) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) - (FACT-2327) added list method [#2088](https://github.com/puppetlabs/facter/pull/2088) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) - (FACT-2320) Added warnonce method [#2084](https://github.com/puppetlabs/facter/pull/2084) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) - (FACT-2315) Added warn method to facter api [#2083](https://github.com/puppetlabs/facter/pull/2083) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) ### Fixed - (FACT-2784) Fixed rhel os release fact [#2086](https://github.com/puppetlabs/facter/pull/2086) ([sebastian-miclea](https://github.com/sebastian-miclea)) ## [4.0.37](https://github.com/puppetlabs/facter/tree/4.0.37) (2020-09-09) [Full Changelog](https://github.com/puppetlabs/facter/compare/4.0.36-fixed...4.0.37) ### Added - (FACT-1380) Restore --timing option to native facter [#2061](https://github.com/puppetlabs/facter/pull/2061) ([IrimieBogdan](https://github.com/IrimieBogdan)) ### Fixed - (FACT-2781) Fix filesystems on osx [#2065](https://github.com/puppetlabs/facter/pull/2065) ([florindragos](https://github.com/florindragos)) - (FACT-2777) Fix lsbdist facts on ubuntu [#2063](https://github.com/puppetlabs/facter/pull/2063) ([florindragos](https://github.com/florindragos)) - (FACT-2783) Updated how osx mountpoints are calculated [#2072](https://github.com/puppetlabs/facter/pull/2072) ([sebastian-miclea](https://github.com/sebastian-miclea)) - (FACT-2776) Fix Linux partitions fact [#2076](https://github.com/puppetlabs/facter/pull/2076) ([oanatmaria](https://github.com/oanatmaria)) - (FACT-2785) partitions..mount has wrong value on sles15-64 [#2077](https://github.com/puppetlabs/facter/pull/2077) ([IrimieBogdan](https://github.com/IrimieBogdan)) ## [4.0.36](https://github.com/puppetlabs/facter/tree/4.0.36) (2020-09-02) [Full Changelog](https://github.com/puppetlabs/facter/compare/4.0.35...4.0.36-fixed) ### Added - (FACT-2747) Add missing legacy facts on all platforms [#2034](https://github.com/puppetlabs/facter/pull/2034) ([IrimieBogdan](https://github.com/IrimieBogdan)) - (FACT-2721) Added Solaris virtual fact [#2033](https://github.com/puppetlabs/facter/pull/2033) ([sebastian-miclea](https://github.com/sebastian-miclea)) - (FACT-2745) Add Linux xen fact [#2040](https://github.com/puppetlabs/facter/pull/2040) ([oanatmaria](https://github.com/oanatmaria)) - (FACT-2740) Add Gce fact [#2035](https://github.com/puppetlabs/facter/pull/2035) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) - (FACT-2743) Added LDom fact for solaris [#2041](https://github.com/puppetlabs/facter/pull/2041) ([sebastian-miclea](https://github.com/sebastian-miclea)) - (FACT-2296) Added fact group for legacy facts [#2047](https://github.com/puppetlabs/facter/pull/2047) ([sebastian-miclea](https://github.com/sebastian-miclea)) - (FACT-2753) Resolve facts sequentially. [#2050](https://github.com/puppetlabs/facter/pull/2050) ([IrimieBogdan](https://github.com/IrimieBogdan)) - (FACT-2728) Added hypervisors fact for Solaris [#2045](https://github.com/puppetlabs/facter/pull/2045) ([sebastian-miclea](https://github.com/sebastian-miclea)) - (FACT-2752) Added serialnumber fact for AIX [#2052](https://github.com/puppetlabs/facter/pull/2052) ([sebastian-miclea](https://github.com/sebastian-miclea)) - (FACT-2729) Add Solaris is_virtual fact [#2056](https://github.com/puppetlabs/facter/pull/2056) ([oanatmaria](https://github.com/oanatmaria)) - (FACT-2773) Added board_asset_tag fact for linux [#2059](https://github.com/puppetlabs/facter/pull/2059) ([sebastian-miclea](https://github.com/sebastian-miclea)) ### Fixed - (FACT-2454) fix how used memory is calculated [#2038](https://github.com/puppetlabs/facter/pull/2038) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) - (FACT-2747-scope6) Allow scope6 to be blocked on all platforms [#2037](https://github.com/puppetlabs/facter/pull/2037) ([IrimieBogdan](https://github.com/IrimieBogdan)) - (maint) Add nil check for ec2 facts. [#2042](https://github.com/puppetlabs/facter/pull/2042) ([IrimieBogdan](https://github.com/IrimieBogdan)) - (maint) Correctly initialise logger. [#2043](https://github.com/puppetlabs/facter/pull/2043) ([IrimieBogdan](https://github.com/IrimieBogdan)) - (FACT-2747) Add ssh legacy facts. [#2044](https://github.com/puppetlabs/facter/pull/2044) ([IrimieBogdan](https://github.com/IrimieBogdan)) - (FACT-2561) Fix blocking mechanism [#2046](https://github.com/puppetlabs/facter/pull/2046) ([oanatmaria](https://github.com/oanatmaria)) - (FACT-2741) Fix double quotes for numbers in yaml formatter [#2053](https://github.com/puppetlabs/facter/pull/2053) ([florindragos](https://github.com/florindragos)) - (FACT-2754) Add os.distro release legacy facts [#2055](https://github.com/puppetlabs/facter/pull/2055) ([oanatmaria](https://github.com/oanatmaria)) - (FACT-2771) Fix Solaris kernelmajversion fact [#2057](https://github.com/puppetlabs/facter/pull/2057) ([oanatmaria](https://github.com/oanatmaria)) - (FACT-2457) Display newlines in values [#2058](https://github.com/puppetlabs/facter/pull/2058) ([florindragos](https://github.com/florindragos)) ## [4.0.35](https://github.com/puppetlabs/facter/tree/4.0.35) (2020-08-19) [Full Changelog](https://github.com/puppetlabs/facter/compare/4.0.34...4.0.35) ### Added - (FACT-2726) Add solaris dmi facts [#2025](https://github.com/puppetlabs/facter/pull/2025) ([florindragos](https://github.com/florindragos)) - (FACT-2722) Add disks fact for Solaris [#2027](https://github.com/puppetlabs/facter/pull/2027) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) ### Fixed - (FACT-2723) --list-*-groups also displays external facts [#2024](https://github.com/puppetlabs/facter/pull/2024) ([sebastian-miclea](https://github.com/sebastian-miclea)) - (FACT-2742) Exclude net/https when running on jruby FIPS [#2030](https://github.com/puppetlabs/facter/pull/2030) ([IrimieBogdan](https://github.com/IrimieBogdan)) - (FACT-2737) facter uptime shows host uptime inside docker container [#2031](https://github.com/puppetlabs/facter/pull/2031) ([IrimieBogdan](https://github.com/IrimieBogdan)) - (FACT-2672) Fix ssh fact output [#2029](https://github.com/puppetlabs/facter/pull/2029) ([oanatmaria](https://github.com/oanatmaria)) - (FACT-2402) Exclude fuseblk from filesystems [#2032](https://github.com/puppetlabs/facter/pull/2032) ([oanatmaria](https://github.com/oanatmaria)) ## [4.0.34](https://github.com/puppetlabs/facter/tree/4.0.34) (2020-08-12) [Full Changelog](https://github.com/puppetlabs/facter/compare/4.0.33...4.0.34) ### Added - (FACT-2739) Extend os hierarchy to consider multiple os families [#2016](https://github.com/puppetlabs/facter/pull/2016) ([IrimieBogdan](https://github.com/IrimieBogdan)) - Add FreeBSD memory facts [#2020](https://github.com/puppetlabs/facter/pull/2020) ([smortex](https://github.com/smortex)) - Add FreeBSD dmi facts [#2021](https://github.com/puppetlabs/facter/pull/2021) ([smortex](https://github.com/smortex)) - (FACT-2727) add load averages for Solaris [#2023](https://github.com/puppetlabs/facter/pull/2023) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) ### Fixed - (FACT-2714) Fix dhcp on solaris 10 [#2013](https://github.com/puppetlabs/facter/pull/2013) ([IrimieBogdan](https://github.com/IrimieBogdan)) - (FACT-2732) OracleLinux 7 and Scientific Linux 7 OS facts incorrect in Facter 4.0.30 [#2014](https://github.com/puppetlabs/facter/pull/2014) ([IrimieBogdan](https://github.com/IrimieBogdan)) ## [4.0.33](https://github.com/puppetlabs/facter/tree/4.0.33) (2020-08-05) [Full Changelog](https://github.com/puppetlabs/facter/compare/4.0.32...4.0.33) ### Added - \(FACT-2040\) Added solaris memory resolver [\#1999](https://github.com/puppetlabs/facter/pull/1999) ([sebastian-miclea](https://github.com/sebastian-miclea)) ### Fixed - \(FACT-2735\) virtual not working on EXADATA baremetal [\#2004](https://github.com/puppetlabs/facter/pull/2004) ([IrimieBogdan](https://github.com/IrimieBogdan)) - \(FACT-2736\) networking facts don't work on EXADATA baremetal [\#2008](https://github.com/puppetlabs/facter/pull/2008) ([IrimieBogdan](https://github.com/IrimieBogdan)) - \(FACT-2724\) Confine blocks behave differently with Facter 4, causing spec tests to suddenly fail [\#2010](https://github.com/puppetlabs/facter/pull/2010) ([IrimieBogdan](https://github.com/IrimieBogdan)) ## [4.0.32](https://github.com/puppetlabs/facter/tree/4.0.32) (2020-07-30) [Full Changelog](https://github.com/puppetlabs/facter/compare/4.0.31...4.0.32) ### Added - \(FACT-2717\) Block external facts [\#1998](https://github.com/puppetlabs/facter/pull/1998) ([florindragos](https://github.com/florindragos)) ### Fixed - \(FACT-2733\) Fix networking on Fedora 32 [\#2002](https://github.com/puppetlabs/facter/pull/2002) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2734\) Return nil codename if we cannot determine it from /etc/redhat-release [\#2003](https://github.com/puppetlabs/facter/pull/2003) ([IrimieBogdan](https://github.com/IrimieBogdan)) - \(FACT-2699\) Detect augeas from gem if augparse is not available. [\#1993](https://github.com/puppetlabs/facter/pull/1993) ([IrimieBogdan](https://github.com/IrimieBogdan)) ## [4.0.31](https://github.com/puppetlabs/facter/tree/4.0.31) (2020-07-29) [Full Changelog](https://github.com/puppetlabs/facter/compare/4.0.30...4.0.31) ### Added - \(FACT-2718\) Block custom facts [\#1996](https://github.com/puppetlabs/facter/pull/1996) ([IrimieBogdan](https://github.com/IrimieBogdan)) - \(FACT-2230\) Add Aix memory facts [\#1994](https://github.com/puppetlabs/facter/pull/1994) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2220\) Add Aix disks fact [\#1987](https://github.com/puppetlabs/facter/pull/1987) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2708\) Add man pages [\#1984 ](https://github.com/puppetlabs/facter/pull/1984) ([florindragos](https://github.com/florindragos)) ### Fixed - \(FACT-2710\) Correctly display vmware info [\#1988](https://github.com/puppetlabs/facter/pull/1987) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2702\) Fix system_profiler legacy facts [\#1982](https://github.com/puppetlabs/facter/pull/1982) ([oanatmaria](https://github.com/oanatmaria)) - Handle Time and Symbol in executable facts [\#1977](https://github.com/puppetlabs/facter/pull/1977) ([gimmyxd](https://github.com/gimmyxd)) ## [4.0.30](https://github.com/puppetlabs/facter/tree/4.0.30) (2020-07-15) [Full Changelog](https://github.com/puppetlabs/facter/compare/4.0.29...4.0.30) ### Added - \(FACT-2690\) Added Hyper-V fact for Linux [\#1968](https://github.com/puppetlabs/facter/pull/1968) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) - \(FACT-2694\) Add linux openvz fact [\#1970](https://github.com/puppetlabs/facter/pull/1970) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2656\) Add solaris networking facts [\#1947](https://github.com/puppetlabs/facter/pull/1947) ([sebastian-miclea](https://github.com/sebastian-miclea)) - \(FACT-2689\) Add hypervisors docker fact [\#1950](https://github.com/puppetlabs/facter/pull/1950) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2683\) Added remaining legacy networking facts for OSX [\#1952](https://github.com/puppetlabs/facter/pull/1952) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) - \(FACT-2692\) Add hypervisors lxc fact [\#1953](https://github.com/puppetlabs/facter/pull/1953) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2691\) Add kvm fact on linux [\#1955](https://github.com/puppetlabs/facter/pull/1955) ([IrimieBogdan](https://github.com/IrimieBogdan)) - \(FACT-2697\) Add Xen fact [\#1957](https://github.com/puppetlabs/facter/pull/1957) ([IrimieBogdan](https://github.com/IrimieBogdan)) - \(FACT-2695\) implementation for virtualbox hypervisor fact [\#1956](https://github.com/puppetlabs/facter/pull/1956) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) - \(FACT-2693\) Add systemd_nspawn fact [\#1958](https://github.com/puppetlabs/facter/pull/1958) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2696\) Add vmware fact [\#1963](https://github.com/puppetlabs/facter/pull/1963) ([IrimieBogdan](https://github.com/IrimieBogdan)) ### Fixed - \(FACT-2673\) Fix mountpoints logic for osx [\#1971](https://github.com/puppetlabs/facter/pull/1971) ([oanatmaria](https://github.com/oanatmaria)) - \(maint\) Silent solaris_zones facts on FreeBSD [\#1954](https://github.com/puppetlabs/facter/pull/1954) ([smortex](https://github.com/smortex)) ## [4.0.29](https://github.com/puppetlabs/facter/tree/4.0.29) (2020-07-01) [Full Changelog](https://github.com/puppetlabs/facter/compare/4.0.28...4.0.29) ### Added - \(FACT-2218\) virtual fact for OSX [\#1945](https://github.com/puppetlabs/facter/pull/1945) ([IrimieBogdan](https://github.com/IrimieBogdan)) - \(FACT-2232\) Add Aix networking facts [\#1937](https://github.com/puppetlabs/facter/pull/1937) ([oanatmaria](https://github.com/oanatmaria)) ### Fixed - \(FACT-2676\) fix os identifier for opensuse-leap [\#1944](https://github.com/puppetlabs/facter/pull/1944) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) - FACT-2679 Get DHCP for all interfaces on OSX [\#1940](https://github.com/puppetlabs/facter/pull/1940) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) ## [4.0.28](https://github.com/puppetlabs/facter/tree/4.0.28) (2020-06-25) [Full Changelog](https://github.com/puppetlabs/facter/compare/4.0.27...4.0.28) ### Fixed - \(maint\) Fix aio_agent_version on non AIO node [\#1938](https://github.com/puppetlabs/facter/pull/1938) ([smortex](https://github.com/smortex)) ## [4.0.27](https://github.com/puppetlabs/facter/tree/4.0.27) (2020-06-24) [Full Changelog](https://github.com/puppetlabs/facter/compare/4.0.26...4.0.27) ### Added - \(FACT-2212\) Networking facts for OSX [\#1929](https://github.com/puppetlabs/facter/pull/1929) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) - \(maint\) Add FreeBSD disks and partitions facts [\#553](https://github.com/puppetlabs/facter-ng/pull/553) ([smortex](https://github.com/smortex)) - \(FACT-2638\) Use puppet AIO VERSION file to specify AIO version [\#549](https://github.com/puppetlabs/facter-ng/pull/549) ([IrimieBogdan](https://github.com/IrimieBogdan)) - \(FACT-2654\) Add ec2 facts for Windows [\#546](https://github.com/puppetlabs/facter-ng/pull/546) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2620\) Add EC2 facts for linux [\#544](https://github.com/puppetlabs/facter-ng/pull/544) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2619\) External facts cache [\#541](https://github.com/puppetlabs/facter-ng/pull/541) ([florindragos](https://github.com/florindragos)) - Add support for processors facts on \*BSD [\#489](https://github.com/puppetlabs/facter-ng/pull/489) ([smortex](https://github.com/smortex)) ### Fixed - \(FACT-2668\) Networking fact on linux should have logic for selecting IPs [\#1928](https://github.com/puppetlabs/facter/pull/1928) ([IrimieBogdan](https://github.com/IrimieBogdan)) - \(FACT-2678\) Facter sometimes pollutes the calling processes environment (race condition) [\#1932](https://github.com/puppetlabs/facter/pull/1932) ([IrimieBogdan](https://github.com/IrimieBogdan)) ## [4.0.26](https://github.com/puppetlabs/facter-ng/tree/4.0.26) (2020-06-11) [Full Changelog](https://github.com/puppetlabs/facter-ng/compare/4.0.25...4.0.26) ### Added - \(FACT-2608\) Add is\_virtual fact [\#535](https://github.com/puppetlabs/facter-ng/pull/535) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2609\) Add lspci resolver [\#534](https://github.com/puppetlabs/facter-ng/pull/534) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2245\) Add xen resolver [\#532](https://github.com/puppetlabs/facter-ng/pull/532) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2607\) Add Openvz detector [\#531](https://github.com/puppetlabs/facter-ng/pull/531) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2600\) Run acceptance tests on Windows [\#519](https://github.com/puppetlabs/facter-ng/pull/519) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) ### Fixed - \(FACT-2651\) Fix --list-cache-groups when there are multiple arguments before it [\#545](https://github.com/puppetlabs/facter-ng/pull/545) ([IrimieBogdan](https://github.com/IrimieBogdan)) - FACT-2650 Fix bug when loading external facts [\#543](https://github.com/puppetlabs/facter-ng/pull/543) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) - Use proper encoding [\#539](https://github.com/puppetlabs/facter-ng/pull/539) ([faucct](https://github.com/faucct)) - \(FACT-2635\) Incorrect output for non existing fact [\#536](https://github.com/puppetlabs/facter-ng/pull/536) ([IrimieBogdan](https://github.com/IrimieBogdan)) ## [4.0.25](https://github.com/puppetlabs/facter-ng/tree/4.0.25) (2020-05-29) [Full Changelog](https://github.com/puppetlabs/facter-ng/compare/4.0.24...4.0.25) ### Fixed - \(FACT-2636\) Set external as fact\_type for environment variable facts. [\#537](https://github.com/puppetlabs/facter-ng/pull/537) ([IrimieBogdan](https://github.com/IrimieBogdan)) ## [4.0.24](https://github.com/puppetlabs/facter-ng/tree/4.0.24) (2020-05-26) [Full Changelog](https://github.com/puppetlabs/facter-ng/compare/4.0.23...4.0.24) ### Added - \(FACT-2605\) Add vmware resolver [\#525](https://github.com/puppetlabs/facter-ng/pull/525) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2604\) Add virt-what resolver [\#523](https://github.com/puppetlabs/facter-ng/pull/523) ([oanatmaria](https://github.com/oanatmaria)) ## [4.0.23](https://github.com/puppetlabs/facter-ng/tree/4.0.23) (2020-05-22) [Full Changelog](https://github.com/puppetlabs/facter-ng/compare/4.0.22...4.0.23) ### Fixed - \(FACT-2632\) Log error message if we encounter exceptions while loading custom facts files [\#528](https://github.com/puppetlabs/facter-ng/pull/528) ([IrimieBogdan](https://github.com/IrimieBogdan)) - \(FACT-2631\) Trace is not working as expected [\#527](https://github.com/puppetlabs/facter-ng/pull/527) ([IrimieBogdan](https://github.com/IrimieBogdan)) ## [4.0.22](https://github.com/puppetlabs/facter-ng/tree/4.0.22) (2020-05-20) [Full Changelog](https://github.com/puppetlabs/facter-ng/compare/4.0.21...4.0.22) ### Added - \(FACT-2603\) Detect virtual on GCE vms [\#521](https://github.com/puppetlabs/facter-ng/pull/521) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2602\) Add docker/Lxc resolver for Linux [\#520](https://github.com/puppetlabs/facter-ng/pull/520) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2615\) Add Solaris mountpoints fact [\#515](https://github.com/puppetlabs/facter-ng/pull/515) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2532\) Add Aix nim\_type fact [\#513](https://github.com/puppetlabs/facter-ng/pull/513) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2183\) Add Solaris's uptime legacy facts [\#511](https://github.com/puppetlabs/facter-ng/pull/511) ([oanatmaria](https://github.com/oanatmaria)) ### Fixed - \(FACT-2617\) Fix for tests/external\_facts/external\_fact\_stderr\_messages\_output\_to\_stderr.rb [\#522](https://github.com/puppetlabs/facter-ng/pull/522) ([IrimieBogdan](https://github.com/IrimieBogdan)) - \(FACT-2523\) Fix for tests/external\_facts/non\_root\_users\_default\_external\_fact\_directory.rb [\#518](https://github.com/puppetlabs/facter-ng/pull/518) ([IrimieBogdan](https://github.com/IrimieBogdan)) - \(FACT-2522\) Fix for tests/external\_facts/fact\_directory\_precedence.rb [\#517](https://github.com/puppetlabs/facter-ng/pull/517) ([IrimieBogdan](https://github.com/IrimieBogdan)) - \(FACT-2521\) Fix for tests/external\_facts/external\_fact\_overrides\_custom\_fact\_with\_10000\_weight\_or\_less.rb [\#514](https://github.com/puppetlabs/facter-ng/pull/514) ([IrimieBogdan](https://github.com/IrimieBogdan)) - \(FACT-2525\) Fix for tests/options/color.rb [\#512](https://github.com/puppetlabs/facter-ng/pull/512) ([IrimieBogdan](https://github.com/IrimieBogdan)) ## [4.0.21](https://github.com/puppetlabs/facter-ng/tree/4.0.21) (2020-05-13) [Full Changelog](https://github.com/puppetlabs/facter-ng/compare/4.0.20...4.0.21) ### Added - \(FACT-2599\) Run GitHub Actions on Ubuntu 16 and Osx 10 [\#497](https://github.com/puppetlabs/facter-ng/pull/497) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) - \(FACT-2247\) Add networking fact for linux [\#496](https://github.com/puppetlabs/facter-ng/pull/496) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2515\) Define custom fact groups in facter.conf [\#491](https://github.com/puppetlabs/facter-ng/pull/491) ([florindragos](https://github.com/florindragos)) - \(FACT-2557\) Add rake task for generating list of facts for specified OS [\#488](https://github.com/puppetlabs/facter-ng/pull/488) ([IrimieBogdan](https://github.com/IrimieBogdan)) - Add os.release facts on FreeBSD [\#485](https://github.com/puppetlabs/facter-ng/pull/485) ([smortex](https://github.com/smortex)) - \(FACT-2235\) Add Aix processors fact [\#483](https://github.com/puppetlabs/facter-ng/pull/483) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2569\) Run acceptance tests on Ubuntu GitHub actions [\#477](https://github.com/puppetlabs/facter-ng/pull/477) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) - \(FACT-2553\) Quote special string in YAML format [\#471](https://github.com/puppetlabs/facter-ng/pull/471) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2517\) Open3 wrapper for executing system calls [\#469](https://github.com/puppetlabs/facter-ng/pull/469) ([oanatmaria](https://github.com/oanatmaria)) ### Fixed - \(FACT-2533\) Fix for tests/facts/partitions.rb [\#507](https://github.com/puppetlabs/facter-ng/pull/507) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2531\) Fix for tests/facts/validate\_file\_system\_size\_bytes.rb [\#500](https://github.com/puppetlabs/facter-ng/pull/500) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2582\) Date and Time in external YAML fact is not loaded [\#499](https://github.com/puppetlabs/facter-ng/pull/499) ([IrimieBogdan](https://github.com/IrimieBogdan)) - \(FACT-2556\) Refactor existing facts to use the new OS hierarchy [\#486](https://github.com/puppetlabs/facter-ng/pull/486) ([IrimieBogdan](https://github.com/IrimieBogdan)) ## [4.0.20](https://github.com/puppetlabs/facter-ng/tree/4.0.20) (2020-05-06) [Full Changelog](https://github.com/puppetlabs/facter-ng/compare/4.0.19...4.0.20) ### Added - Add \*BSD kernelversion and kernelmajversion facts [\#462](https://github.com/puppetlabs/facter-ng/pull/462) ([smortex](https://github.com/smortex)) - Fix os.family fact on \*BSD [\#461](https://github.com/puppetlabs/facter-ng/pull/461) ([smortex](https://github.com/smortex)) - Add support for \*BSD load averages [\#460](https://github.com/puppetlabs/facter-ng/pull/460) ([smortex](https://github.com/smortex)) ### Fixed - \(FACT-2590\) No facts are displayed on Redhat 5 and Centos6 [\#484](https://github.com/puppetlabs/facter-ng/pull/484) ([IrimieBogdan](https://github.com/IrimieBogdan)) - \(FACT-2530\) Fix for tests/facts/os\_processors\_and\_kernel.rb [\#449](https://github.com/puppetlabs/facter-ng/pull/449) ([oanatmaria](https://github.com/oanatmaria)) ## [4.0.19](https://github.com/puppetlabs/facter-ng/tree/4.0.19) (2020-04-29) [Full Changelog](https://github.com/puppetlabs/facter-ng/compare/4.0.18...4.0.19) ### Added - \(FACT-2555\)Create OS hierarchy and mechanism for loading it [\#470](https://github.com/puppetlabs/facter-ng/pull/470) ([IrimieBogdan](https://github.com/IrimieBogdan)) - \(FACT-2552\) Add Solaris processors facts [\#451](https://github.com/puppetlabs/facter-ng/pull/451) ([oanatmaria](https://github.com/oanatmaria)) - \(Fact 2486\) Add facts cache [\#430](https://github.com/puppetlabs/facter-ng/pull/430) ([florindragos](https://github.com/florindragos)) ### Fixed - \(FACT-2585\) Mountpoints fact returns ASCI-8BIT instead of UTF-8 in some cases [\#472](https://github.com/puppetlabs/facter-ng/pull/472) ([IrimieBogdan](https://github.com/IrimieBogdan)) - \(FACT-2570\) Use Facter options to store custom and external facts [\#467](https://github.com/puppetlabs/facter-ng/pull/467) ([IrimieBogdan](https://github.com/IrimieBogdan)) - \(FACT-2565\) Debian development versions causes fatal error when resolving os.release [\#466](https://github.com/puppetlabs/facter-ng/pull/466) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) ## [4.0.18](https://github.com/puppetlabs/facter-ng/tree/4.0.18) (2020-04-24) [Full Changelog](https://github.com/puppetlabs/facter-ng/compare/4.0.17...4.0.18) ### Added - \(FACT-2564\) Add support for zpool\_featureflags and fix zpool\_version [\#443](https://github.com/puppetlabs/facter-ng/pull/443) ([smortex](https://github.com/smortex)) ### Fixed - \(FACT-2553\) remove double backslashes from windows path [\#456](https://github.com/puppetlabs/facter-ng/pull/456) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2559\) Fix Facter.debugging? call when Facter not fully loaded [\#455](https://github.com/puppetlabs/facter-ng/pull/455) ([Filipovici-Andrei](https://github.com/Filipovici-Andrei)) ## [4.0.17](https://github.com/puppetlabs/facter-ng/tree/4.0.17) (2020-04-21) [Full Changelog](https://github.com/puppetlabs/facter-ng/compare/4.0.16...4.0.17) ### Fixed - \(FACT-2562\) Correctly load custom and external fact directories [\#458](https://github.com/puppetlabs/facter-ng/pull/458) ([IrimieBogdan](https://github.com/IrimieBogdan)) ## [4.0.16](https://github.com/puppetlabs/facter-ng/tree/4.0.16) (2020-04-15) [Full Changelog](https://github.com/puppetlabs/facter-ng/compare/4.0.15...4.0.16) ### Added - \(FACT-2233\) Add AIX partitons fact [\#433](https://github.com/puppetlabs/facter-ng/pull/433) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2330\) Add ssh fact for Windows OpenSSH feature [\#424](https://github.com/puppetlabs/facter-ng/pull/424) ([oanatmaria](https://github.com/oanatmaria)) ### Fixed - \(FACT-2528\) Fix for tests/facts/ssh\_key.rb [\#442](https://github.com/puppetlabs/facter-ng/pull/442) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2538\) Don't save core and legacy facts in collection if they have no value [\#441](https://github.com/puppetlabs/facter-ng/pull/441) ([IrimieBogdan](https://github.com/IrimieBogdan)) ## [4.0.15](https://github.com/puppetlabs/facter-ng/tree/4.0.15) (2020-04-08) [Full Changelog](https://github.com/puppetlabs/facter-ng/compare/4.0.14...4.0.15) ### Added - \(FACT-2541\) Add TYPE for legacy facts [\#439](https://github.com/puppetlabs/facter-ng/pull/439) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2535\) Allow interpolation of Facter.fact\('fact\_name'\) [\#435](https://github.com/puppetlabs/facter-ng/pull/435) ([sebastian-miclea](https://github.com/sebastian-miclea)) - \(FACT-2477\) Collect facts from alternative sources [\#422](https://github.com/puppetlabs/facter-ng/pull/422) ([oanatmaria](https://github.com/oanatmaria)) ### Fixed - \(FACT-2513\) Updated how option aliases are displayed [\#434](https://github.com/puppetlabs/facter-ng/pull/434) ([sebastian-miclea](https://github.com/sebastian-miclea)) - \(FACT-2499\) Facts with aliases are resolved only once [\#429](https://github.com/puppetlabs/facter-ng/pull/429) ([IrimieBogdan](https://github.com/IrimieBogdan)) ## [4.0.14](https://github.com/puppetlabs/facter-ng/tree/4.0.14) (2020-04-01) [Full Changelog](https://github.com/puppetlabs/facter-ng/compare/4.0.13...4.0.14) ### Added - \(FACT-2512\) Handle Raspbian as Debian [\#421](https://github.com/puppetlabs/facter-ng/pull/421) ([mlove-au](https://github.com/mlove-au)) - \(FACT-2231\) Add AIX mountpoints fact [\#398](https://github.com/puppetlabs/facter-ng/pull/398) ([oanatmaria](https://github.com/oanatmaria)) - \(FACT-2471\) Add Linux partitions fact [\#393](https://github.com/puppetlabs/facter-ng/pull/393) ([oanatmaria](https://github.com/oanatmaria)) - Debugger tool [\#391](https://github.com/puppetlabs/facter-ng/pull/391) ([sebastian-miclea](https://github.com/sebastian-miclea)) - \(FACT-2435\) Expose :expand as an option to execute command [\#342](https://github.com/puppetlabs/facter-ng/pull/342) ([florindragos](https://github.com/florindragos)) ### Fixed - \(FACT-2511\) Remove file logger [\#425](https://github.com/puppetlabs/facter-ng/pull/425) ([IrimieBogdan](https://github.com/IrimieBogdan)) - \(FACT-2498\) Internal fact loader should only load facts once [\#420](https://github.com/puppetlabs/facter-ng/pull/420) ([IrimieBogdan](https://github.com/IrimieBogdan)) - Avoid exceptions for zone facts on FreeBSD [\#412](https://github.com/puppetlabs/facter-ng/pull/412) ([smortex](https://github.com/smortex)) - \(FACT-2475\) Fix os.release on Debian [\#410](https://github.com/puppetlabs/facter-ng/pull/410) ([oanatmaria](https://github.com/oanatmaria)) \* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)* puppetlabs-facter-dfe6df4/CODEOWNERS000066400000000000000000000000561470204764400173230ustar00rootroot00000000000000# Default to Ghost team * @puppetlabs/phoenix puppetlabs-facter-dfe6df4/CONTRIBUTING.md000066400000000000000000000013561470204764400201650ustar00rootroot00000000000000# How to contribute # Third-party patches are essential for keeping Puppet great. We simply can't access the huge number of platforms and myriad configurations for running Puppet. We want to keep it as easy as possible to contribute changes that get things working in your environment. There are a few guidelines that we need contributors to follow so that we can have a chance of keeping on top of things. ## Adding New Facts ## When adding new facts, they need to be added to the [schema](lib/schema/facter.yaml). The fact name, description, and type must be specified in the [schema](lib/schema/facter.yaml). Learn more about how to contribute in our [Contribution Guidelines](https://github.com/puppetlabs/.github/blob/main/CONTRIBUTING.md). puppetlabs-facter-dfe6df4/Extensibility.md000066400000000000000000000047511470204764400211140ustar00rootroot00000000000000Extensibility ============= Facter 4 has the following extensibility goals: * Compatibility with 100% of existing Facter custom facts * Compatibility with 100% of existing Facter external facts The following sections discuss those goals in more depth. Note that this doc is work-in-progress and should be updated as extensibility features are implemented, refined or ruled out. Custom Facts Compatibility -------------------------- Facter 4 will load custom facts from the following locations: * Any Ruby source file in a `facter` subdirectory on the Ruby load path. * Any Ruby source file in a directory specified by the `FACTERLIB` environment variable (delimited by the platform PATH separator). * Any Ruby source file in a directory specified by the `--custom-dir` option to facter. The following methods from the Facter API are currently supported by Facter 4: From the `Facter` module: * [] * add * clear * debug * debugonce * define_fact * each * fact * flush * list * loadfacts * log_exception * reset * resolve * search * search_path * search_external * search_external_path * to_hash * value * version * warn * warnonce From the `Facter::Core::Execution` module: * which * exec * execute * ExecutionFailure From the `Facter::Util::Fact` class: * define_resolution * flush * name * resolution * value From the `Facter::Util::Resolution` module: * confine * exec * has_weight * name * on_flush * setcode * which From the `Facter::Core::Aggregate` module: * aggregate * chunk * confine * has_weight * name * on_flush Please see the [Facter Custom Facts Walkthrough](https://puppet.com/docs/puppet/latest/custom_facts.html) for more information on using the Facter API. External Facts Compatiblity --------------------------- Facter 4 supports all 4 forms of "external facts" which Facter 3 supports: * JSON files with the .json extension whose key-value pairs will be mapped to fact-value pairs. * YAML files with the .yaml extension whose key-value pairs will be mapped to fact-value pairs. * Text files with the .txt extension containing `fact=some_value` strings * Executable files returning `fact=some_value` strings Enable conversion of dotted facts to structured --------------------------- By default Facter 4 treats the `.` in custom or external fact names as part of the fact name and not a delimiter for structured facts. If you want to enable the new behaviour, that converts dotted facts to structured you need to set the following config: ``` global : { force-dot-resolution : true } ``` puppetlabs-facter-dfe6df4/Gemfile000066400000000000000000000011231470204764400172170ustar00rootroot00000000000000# frozen_string_literal: true source ENV['GEM_SOURCE'] || 'https://rubygems.org' gemspec name: 'facter' group(:release, optional: true) do gem 'octokit', '~> 4.18.0' end gem 'packaging', require: false local_gemfile = File.expand_path('Gemfile.local', __dir__) eval_gemfile(local_gemfile) if File.exist?(local_gemfile) group(:integration, optional: true) do # 1.16.0 - 1.16.2 are broken on Windows gem 'ffi', '>= 1.15.5', '< 1.17.0', '!= 1.16.0', '!= 1.16.1', '!= 1.16.2', require: false end group(:documentation) do gem 'ronn', '~> 0.7.3', require: false, platforms: [:ruby] end puppetlabs-facter-dfe6df4/LICENSE000066400000000000000000000261361470204764400167440ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright {yyyy} {name of copyright owner} Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. puppetlabs-facter-dfe6df4/README.md000066400000000000000000000067441470204764400172210ustar00rootroot00000000000000# facter [![Gem Version](https://badge.fury.io/rb/facter.svg)](https://badge.fury.io/rb/facter) [](https://puppetcommunity.slack.com/messages/C0W1X7ZAL) [![Modules Status](https://github.com/puppetlabs/facter/workflows/Acceptance%20tests/badge.svg?branch=main)](https://github.com/puppetlabs/facter/actions) [![Modules Status](https://github.com/puppetlabs/facter/workflows/Unit%20tests/badge.svg?branch=main)](https://github.com/puppetlabs/facter/actions) [![Modules Status](https://github.com/puppetlabs/facter/workflows/Checks/badge.svg?branch=main)](https://github.com/puppetlabs/facter/actions) [![Test Coverage](https://api.codeclimate.com/v1/badges/3bd4be86f4b0b49bc0ca/test_coverage)](https://codeclimate.com/github/puppetlabs/facter/test_coverage) [![Maintainability](https://api.codeclimate.com/v1/badges/3bd4be86f4b0b49bc0ca/maintainability)](https://codeclimate.com/github/puppetlabs/facter/maintainability) Facter is a command-line tool that gathers basic facts about nodes (systems) such as hardware details, network settings, OS type and version, and more. These facts are made available as variables in your Puppet manifests and can be used to inform conditional expressions in Puppet. ## Documentation Documentation for the Facter project can be found on the [Puppet Docs site](https://puppet.com/docs/puppet/latest/facter.html). ## Supported platforms * Linux * macOS * Windows * Solaris * AIX ## Requirements * Ruby 2.5+ * FFI (for facts like `mountpoints` which are resolved using C API calls) ## Basic concepts The project has three main parts, the framework, facts and resolvers. In the framework we implement functionality that is agnostic of specific facts like parsing user input, formatting output, etc. Facts are the nuggets of information that will be provided by facter e.g. `os.name`, `networking.interfaces`, etc. Resolvers have the role of gathering data from the system. For example a resolver can execute a command on the system, can read a file or any operation that retrieves some data from a single source on the system. ```mermaid sequenceDiagram participant user participant framework participant fact participant resolver user->>framework: user query framework->>fact: create fact->>resolver: resolve resolver->>fact: system information fact->>framework: fact value framework->>user: formatted user output ```` ## Getting started After cloning the project, run `bundle install` to install all dependencies. You can run facter by executing `./bin/facter`. The command will output all the facts that facter detected for the current OS. The implementation can be validated locally by running `bundle exec rake check`. ## Goals - fast, easy, compatible * Gain performance similar to the C++ version of Facter. We plan to achieve this goal by gathering multiple facts with only one call and by using the faster Win32 API rather than WMI for the Windows implementation. * Facilitate community contribution. At the moment, C++ presents a possible impediment for community contributions. * Enable native integration with other Ruby-based projects such as Bolt and puppet. * Enable native integration for custom facts. * Provide 100% compatibility with C++ Facter (drop-in replacement). ## Licensing See [LICENSE](https://github.com/puppetlabs/facter/blob/main/LICENSE) file. Puppet is licensed by Puppet, Inc. under the Apache license. Puppet, Inc. can be contacted at: info@puppet.com puppetlabs-facter-dfe6df4/Rakefile000066400000000000000000000033551470204764400174020ustar00rootroot00000000000000# frozen_string_literal: true require 'bundler/gem_tasks' require 'open3' require 'rspec/core/rake_task' require 'facter/version' Dir.glob(File.join('tasks/**/*.rake')).each { |file| load file } task default: :spec desc 'Generate changelog' task :changelog, [:version] do |_t, args| sh "./scripts/generate_changelog.rb #{args[:version]}" end namespace :pl_ci do desc 'build the gem and place it at the directory root' task :gem_build, [:gemspec] do |_t, args| args.with_defaults(gemspec: 'facter.gemspec') stdout, stderr, status = Open3.capture3("gem build #{args.gemspec}") if !status.exitstatus.zero? puts "Error building facter.gemspec \n#{stdout} \n#{stderr}" exit(1) else puts stdout end end desc 'build the nightly gem and place it at the directory root' task :nightly_gem_build do # this is taken from `rake package:nightly_gem` extended_dot_version = `git describe --tags --dirty --abbrev=7`.chomp.tr('-', '.') # we must create tempfile in the same directory as facter.gemspec, since # it uses __dir__ to determine which files to include require 'tempfile' Tempfile.create('gemspec', __dir__) do |dst| File.open('facter.gemspec', 'r') do |src| src.readlines.each do |line| if line.match?(/spec\.version\s*=\s*'[0-9.]+'/) line = "spec.version = '#{extended_dot_version}'" end dst.puts line end end dst.flush Rake::Task['pl_ci:gem_build'].invoke(dst.path) end end end if Rake.application.top_level_tasks.grep(/^(pl:|package:)/).any? begin require 'packaging' Pkg::Util::RakeUtils.load_packaging_tasks rescue LoadError => e puts "Error loading packaging rake tasks: #{e}" end end puppetlabs-facter-dfe6df4/acceptance/000077500000000000000000000000001470204764400200155ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/.beaker.yml000066400000000000000000000006331470204764400220510ustar00rootroot00000000000000--- ssh: keys: - id_rsa_acceptance - ~/.ssh/id_rsa-acceptance xml: true timesync: false repo_proxy: true add_el_extras: false 'master-start-curl-retries': 30 log_level: debug preserve_hosts: onfail helper: ./lib/helper.rb options_file: ./config/aio/options.rb puppetlabs-facter-dfe6df4/acceptance/.gitignore000066400000000000000000000002271470204764400220060ustar00rootroot00000000000000.vagrant local_options.rb repos.tar repo-configs log id_rsa-acceptance id_rsa-acceptance.pub preserved_config.yaml merged_options.rb junit tmp .bundle puppetlabs-facter-dfe6df4/acceptance/Gemfile000066400000000000000000000017041470204764400213120ustar00rootroot00000000000000source ENV['GEM_SOURCE'] || "https://rubygems.org" def location_for(place, fake_version = nil) if place =~ /^((?:git[:@]|https:)[^#]*)#(.*)/ [fake_version, { :git => $1, :branch => $2, :require => false }].compact elsif place =~ /^file:\/\/(.*)/ ['>= 0', { :path => File.expand_path($1), :require => false }] else [place, { :require => false }] end end gem "beaker", *location_for(ENV['BEAKER_VERSION'] || "~> 6") gem 'beaker-puppet', *location_for(ENV['BEAKER_PUPPET_VERSION'] || "~> 4") gem "beaker-hostgenerator", *location_for(ENV['BEAKER_HOSTGENERATOR_VERSION'] || "~> 2") gem "beaker-abs", *location_for(ENV['BEAKER_ABS_VERSION'] || "~> 1") gem "beaker-vagrant", *location_for(ENV['BEAKER_VAGRANT_VERSION'] || "~> 0") gem "beaker-vmpooler", *location_for(ENV['BEAKER_VMPOOLER_VERSION'] || "~> 1") gem "rake", ">= 12.3.3" gem "multi_json", "~> 1.8" if File.exist? "#{__FILE__}.local" eval(File.read("#{__FILE__}.local"), binding) end puppetlabs-facter-dfe6df4/acceptance/Rakefile000066400000000000000000000001051470204764400214560ustar00rootroot00000000000000require 'beaker-puppet' Beaker::DSL::Helpers::RakeHelpers.load_tasks puppetlabs-facter-dfe6df4/acceptance/bin/000077500000000000000000000000001470204764400205655ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/bin/ci-bootstrap-from-artifacts.sh000077500000000000000000000026731470204764400264610ustar00rootroot00000000000000#! /usr/bin/env bash ############################################################################### # Initial preparation for a ci acceptance job in Jenkins. Crucially, it # handles the untarring of the build artifact and bundle install, getting us to # a state where we can then bundle exec rake the particular ci:test we want to # run. # # Having this checked in in a script makes it much easier to have multiple # acceptance jobs. It must be kept agnostic between Linux/Solaris/Windows # builds, however. set -x # If $GEM_SOURCE is not set, fall back to rubygems.org if [ -z $GEM_SOURCE ]; then export GEM_SOURCE='https://rubygems.org' fi echo "SHA: ${SHA}" echo "FORK: ${FORK}" echo "BUILD_SELECTOR: ${BUILD_SELECTOR}" echo "PACKAGE_BUILD_STATUS: ${PACKAGE_BUILD_STATUS}" rm -rf acceptance tar -xzf acceptance-artifacts.tar.gz cd acceptance mkdir -p log/latest echo "===== This artifact is from =====" cat creator.txt bundle install --without=development --path=.bundle/gems if [[ "${platform}" =~ 'solaris' ]]; then repo_proxy=" :repo_proxy => false," fi # If the platform is Windows, append $ruby_arch if [[ "${platform}" =~ 'win' ]]; then platform="${platform}-${ruby_arch}" fi cat > local_options.rb <<-EOF { :hosts_file => 'config/nodes/${platform}.yaml', :ssh => { :keys => ["${HOME}/.ssh/id_rsa-acceptance"], }, ${repo_proxy} } EOF [[ (-z "${PACKAGE_BUILD_STATUS}") || ("${PACKAGE_BUILD_STATUS}" = "success") ]] || exit 1 puppetlabs-facter-dfe6df4/acceptance/config/000077500000000000000000000000001470204764400212625ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/config/aio/000077500000000000000000000000001470204764400220325ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/config/aio/options.rb000066400000000000000000000001311470204764400240450ustar00rootroot00000000000000{ :type => 'aio', :post_suite => [ 'teardown/common/099_Archive_Logs.rb', ], } puppetlabs-facter-dfe6df4/acceptance/config/git/000077500000000000000000000000001470204764400220455ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/config/git/options.rb000066400000000000000000000000251470204764400240620ustar00rootroot00000000000000{ :type => :git, } puppetlabs-facter-dfe6df4/acceptance/config/nodes/000077500000000000000000000000001470204764400223725ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/config/nodes/aix-53-power.yaml000066400000000000000000000001551470204764400254170ustar00rootroot00000000000000--- HOSTS: pe-aix-53-acceptance: roles: - agent platform: aix-5.3-power hypervisor: none puppetlabs-facter-dfe6df4/acceptance/config/nodes/aix-61-power.yaml000066400000000000000000000001551470204764400254160ustar00rootroot00000000000000--- HOSTS: pe-aix-61-acceptance: roles: - agent platform: aix-6.1-power hypervisor: none puppetlabs-facter-dfe6df4/acceptance/config/nodes/aix-71-power.yaml000066400000000000000000000001551470204764400254170ustar00rootroot00000000000000--- HOSTS: pe-aix-71-acceptance: roles: - agent platform: aix-7.1-power hypervisor: none puppetlabs-facter-dfe6df4/acceptance/config/nodes/huaweios-6-powerpc.yaml000066400000000000000000000002171470204764400267220ustar00rootroot00000000000000--- HOSTS: huawei-ce6850-2-debian-vm-eth0.ops.puppetlabs.net: roles: - agent platform: huaweios-6-powerpc hypervisor: none puppetlabs-facter-dfe6df4/acceptance/config/nodes/solaris-10-sparc.yaml000066400000000000000000000002621470204764400262560ustar00rootroot00000000000000--- HOSTS: solaris-10-sparc: roles: - agent platform: solaris-10-sparc hypervisor: none ip: 10.32.121.124 vmhostname: sol10-1.delivery.puppetlabs.net puppetlabs-facter-dfe6df4/acceptance/config/nodes/solaris-11-sparc.yaml000066400000000000000000000002621470204764400262570ustar00rootroot00000000000000--- HOSTS: solaris-11-sparc: roles: - agent platform: solaris-11-sparc hypervisor: none ip: 10.32.114.245 vmhostname: sol11-1.delivery.puppetlabs.net puppetlabs-facter-dfe6df4/acceptance/lib/000077500000000000000000000000001470204764400205635ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/lib/facter/000077500000000000000000000000001470204764400220275ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/lib/facter/acceptance/000077500000000000000000000000001470204764400241155ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/lib/facter/acceptance/api_utils.rb000066400000000000000000000016101470204764400264310ustar00rootroot00000000000000module Facter module Acceptance module ApiUtils # create a facter_run.rb file that loads facter, # register a teardown that will clear the executable dir # set different config options(debug, custom/external dir) # print the result of Facter.value def facter_value_rb(agent, fact_name, options = {}) dir = agent.tmpdir('executables') teardown do agent.rm_rf(dir) end rb_file = File.join(dir, 'facter_run.rb') file_content = <<-RUBY require 'facter' Facter.debugging(#{options.fetch(:debug, false)}) Facter.search('#{options.fetch(:custom_dir, '')}') Facter.search_external(['#{options.fetch(:external_dir, '')}']) puts Facter.value('#{fact_name}') RUBY create_remote_file(agent, rb_file, file_content) rb_file end end end end puppetlabs-facter-dfe6df4/acceptance/lib/facter/acceptance/base_fact_utils.rb000066400000000000000000000435041470204764400275770ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Acceptance module BaseFactUtils # return a hash of expected facts for os, processors, and kernel facts # def os_processors_and_kernel_expected_facts(agent) if agent['platform'] =~ /aix-/ aix_expected_facts(agent) elsif agent['platform'] =~ /debian-/ debian_expected_facts(agent) elsif agent['platform'] =~ /amazon-|el-|centos-/ el_expected_facts(agent) elsif agent['platform'] =~ /fedora-/ fedora_expected_facts(agent) elsif agent['platform'] =~ /osx-/ osx_expected_facts(agent) elsif agent['platform'] =~ /sles-/ sles_expected_facts(agent) elsif agent['platform'] =~ /solaris-/ solaris_expected_facts(agent) elsif agent['platform'] =~ /ubuntu-/ ubuntu_expected_facts(agent) elsif agent['platform'] =~ /windows-/ windows_expected_facts(agent) else fail_test("unknown agent type being tested #{agent['platform']}") end end # return the value from the facter json parsed set of results using the fact path separated using '.'s # def json_result_fact_by_key_path(results, fact) fact.split('.').each do |key| results = results[key] end results end # AIX def aix_expected_facts(agent) version = agent['platform'].match(/aix-(\d)\.(\d)/) kernel_major_version = if version.nil? /\d\d00/ else /#{version[1]}#{version[2]}00/ end kernel_release = /^#{kernel_major_version}-\d+-\d+-\d+/ os_arch = /[Pp]ower[Pp][Cc]/ os_hardware = /IBM/ expected_facts = { 'os.architecture' => os_arch, 'os.family' => 'AIX', 'os.hardware' => os_hardware, 'os.name' => 'AIX', 'os.release.full' => kernel_release, 'os.release.major' => kernel_major_version, 'processors.count' => /[1-9]+/, 'processors.isa' => os_arch, 'processors.models' => os_arch, 'kernel' => 'AIX', 'kernelrelease' => kernel_release, 'kernelversion' => kernel_major_version, 'kernelmajversion' => kernel_major_version } expected_facts end # Debian def debian_expected_facts(agent) version = agent['platform'].match(/debian-(\d{1,2})/) os_version = if version.nil? /\d+/ else /#{version[1]}/ end if agent['platform'] =~ /amd64/ os_arch = 'amd64' os_hardware = 'x86_64' processor_model_pattern = /(Intel\(R\).*)|(AMD.*)/ elsif agent['platform'] =~ /aarch64/ os_arch = 'aarch64' os_hardware = 'aarch64' processor_model_pattern = // # FACT-3439 - facter doesn't figure out the processor type on these machines else os_arch = 'i386' os_hardware = 'i686' processor_model_pattern = /(Intel\(R\).*)|(AMD.*)/ end expected_facts = { 'os.architecture' => os_arch, 'os.distro.codename' => /\w+/, 'os.distro.description' => %r{Debian GNU/Linux #{os_version}(\.\d)?}, 'os.distro.id' => 'Debian', 'os.distro.release.full' => /#{os_version}\.\d+/, 'os.distro.release.major' => os_version, 'os.distro.release.minor' => /\d/, 'os.family' => 'Debian', 'os.hardware' => os_hardware, 'os.name' => 'Debian', 'os.release.full' => /#{os_version}\.\d+/, 'os.release.major' => os_version, 'os.release.minor' => /\d/, 'processors.count' => /[1-9]/, 'processors.physicalcount' => /[1-9]/, 'processors.isa' => /unknown|#{os_hardware}/, 'processors.models' => processor_model_pattern, 'kernel' => 'Linux', 'kernelrelease' => /\d+\.\d+\.\d+/, 'kernelversion' => /\d+\.\d+/, 'kernelmajversion' => /\d+\.\d+/ } expected_facts end # el (RedHat, Centos) def el_expected_facts(agent) version = agent['platform'].match(/(el|centos)-(\d)/) os_version = if version.nil? /\d+/ else /#{version[2]}/ end release_string = on(agent, 'cat /etc/*-release').stdout.downcase case release_string when /almalinux/ os_name = 'AlmaLinux' os_distro_description = /AlmaLinux release #{os_version}\.\d+ \(.+\)/ os_distro_id = 'AlmaLinux' os_distro_release_full = /#{os_version}\.\d+/ when /amazon/ os_name = 'Amazon' # This parses: VERSION_ID="2017.09" os_version = on(agent, 'grep VERSION_ID /etc/os-release | cut --delimiter=\" --fields=2 | cut --delimiter=. --fields=1').stdout.chomp os_distro_description = /Amazon Linux( AMI)? release (\d )?(\()?#{os_version}(\))?/ os_distro_id = /^Amazon(AMI)?$/ os_distro_release_full = /#{os_version}(\.\d+)?/ when /rocky/ os_name = 'Rocky' os_distro_description = /Rocky Linux release #{os_version}\.\d+ \(.+\)/ os_distro_id = 'Rocky' os_distro_release_full = /#{os_version}\.\d+/ when /centos/ os_name = 'CentOS' os_distro_description = /CentOS( Linux)? release #{os_version}\.\d+(\.\d+)? \(\w+\)/ os_distro_id = 'CentOS' os_distro_release_full = /#{os_version}\.\d+/ else os_name = 'RedHat' os_distro_description = /Red Hat Enterprise Linux( Server)? release #{os_version}\.\d+( Beta)? \(\w+\)/ os_distro_id = /^RedHatEnterprise(Server)?$/ os_distro_release_full = /#{os_version}\.\d+/ end if agent['platform'] =~ /x86_64/ os_arch = 'x86_64' os_hardware = 'x86_64' processor_model_pattern = /(Intel\(R\).*)|(AMD.*)/ elsif agent['platform'] =~ /aarch64/ os_arch = 'aarch64' os_hardware = 'aarch64' processor_model_pattern = // # aarch64 does not populate a model value in /proc/cpuinfo elsif agent['platform'] =~ /ppc64le/ os_arch = 'ppc64le' os_hardware = 'ppc64le' processor_model_pattern = /(POWER.*)/ else os_arch = 'i386' os_hardware = 'i686' processor_model_pattern = /(Intel\(R\).*)|(AMD.*)/ end {}.tap do |expected_facts| expected_facts['os.architecture'] = os_arch expected_facts['os.distro.codename'] = /\w+/ expected_facts['os.distro.description'] = os_distro_description expected_facts['os.distro.id'] = os_distro_id expected_facts['os.distro.release.full'] = os_distro_release_full expected_facts['os.distro.release.major'] = os_version # Minor versions are not available in Amazon Linux < 2023 and has not # yet been implemented in Facter for >= 2023 expected_facts['os.distro.release.minor'] = /\d/ unless os_name == 'Amazon' expected_facts['os.family'] = 'RedHat' expected_facts['os.hardware'] = os_hardware expected_facts['os.name'] = os_name expected_facts['os.release.full'] = /#{os_version}(\.\d+)?(\.\d+)?/ expected_facts['os.release.major'] = os_version expected_facts['os.release.minor'] = /(\d+)?/ expected_facts['processors.count'] = /[1-9]/ expected_facts['processors.physicalcount'] = /[1-9]/ expected_facts['processors.isa'] = os_hardware expected_facts['processors.models'] = processor_model_pattern expected_facts['kernel'] = 'Linux' expected_facts['kernelrelease'] = /\d+\.\d+\.\d+/ expected_facts['kernelversion'] = /\d+\.\d+/ expected_facts['kernelmajversion'] = /\d+\.\d+/ end end # fedora def fedora_expected_facts(agent) version = agent['platform'].match(/fedora-(\d\d)-/) os_version = if version.nil? /\d+/ else /#{version[1]}/ end if agent['platform'] =~ /x86_64/ os_arch = 'x86_64' os_hardware = 'x86_64' else os_arch = 'i386' os_hardware = 'i686' end expected_facts = { 'os.architecture' => os_arch, 'os.distro.codename' => /\w+/, 'os.distro.description' => /Fedora release #{os_version} \(\w+( \w+)?\)/, 'os.distro.id' => 'Fedora', 'os.distro.release.full' => os_version, 'os.distro.release.major' => os_version, 'os.family' => 'RedHat', 'os.hardware' => os_hardware, 'os.name' => 'Fedora', 'os.release.full' => os_version, 'os.release.major' => os_version, 'processors.count' => /[1-9]/, 'processors.physicalcount' => /[1-9]/, 'processors.isa' => /unknown|#{os_hardware}/, 'processors.models' => /(Intel\(R\).*)|(AMD.*)/, 'kernel' => 'Linux', 'kernelrelease' => /\d+\.\d+\.\d+/, 'kernelversion' => /\d+\.\d+\.\d+/, 'kernelmajversion' => /\d+\.\d+/ } expected_facts end # osx def osx_expected_facts(agent) version = agent['platform'].match(/osx-(\d+)\.?(\d+)?/) major_version = /#{Regexp.escape(version.captures.compact.join('.'))}/ if agent['platform'] =~ /x86_64/ os_arch = 'x86_64' os_hardware = 'x86_64' processors_isa = 'i386' processors_models = /"Intel\(R\).*"/ elsif agent['platform'] =~ /arm64/ os_arch = 'arm64' os_hardware = 'arm64' processors_isa = 'arm' processors_models = /"Apple.*"/ end expected_facts = { 'os.architecture' => os_arch, 'os.family' => 'Darwin', 'os.hardware' => os_hardware, 'os.name' => 'Darwin', 'os.macosx.build' => /\d+[A-Z]\d{1,4}\w?/, 'os.macosx.product' => 'macOS', 'os.macosx.version.major' => major_version, 'os.macosx.version.minor' => /\d+/, 'os.macosx.version.patch' => /\d+/, # If "patch" is 0, then the third component will be omitted 'os.macosx.version.full' => /^#{major_version}\.\d+(\.\d+)?$/, 'os.release.full' => /\d+\.\d+\.\d+/, 'os.release.major' => /\d+/, 'os.release.minor' => /\d+/, 'processors.count' => /[1-9]/, 'processors.physicalcount' => /[1-9]/, 'processors.isa' => processors_isa, 'processors.models' => processors_models, 'kernel' => 'Darwin', 'kernelrelease' => /\d+\.\d+\.\d+/, 'kernelversion' => /\d+\.\d+\.\d+/, 'kernelmajversion' => /\d+\.\d+/ } expected_facts end # SLES def sles_expected_facts(agent) version = agent['platform'].match(/sles-(\d\d)/) os_version = if version.nil? /\d+/ else /#{version[1]}/ end if agent['platform'] =~ /x86_64/ os_arch = 'x86_64' os_hardware = 'x86_64' processor_model_pattern = /(Intel\(R\).*)|(AMD.*)/ else os_arch = 'i386' os_hardware = 'i686' processor_model_pattern = /(Intel\(R\).*)|(AMD.*)/ end expected_facts = { 'os.architecture' => os_arch, 'os.distro.codename' => /\w+/, 'os.distro.description' => /SUSE Linux Enterprise Server/, 'os.distro.id' => /^SUSE( LINUX)?$/, 'os.distro.release.full' => /#{os_version}\.\d+/, 'os.distro.release.major' => os_version, 'os.distro.release.minor' => /\d/, 'os.family' => 'Suse', 'os.hardware' => os_hardware, 'os.name' => 'SLES', 'os.release.full' => /#{os_version}\.\d+(\.\d+)?/, 'os.release.major' => os_version, 'os.release.minor' => /\d+/, 'processors.count' => /[1-9]/, 'processors.physicalcount' => /[1-9]/, 'processors.isa' => os_hardware, 'processors.models' => processor_model_pattern, 'kernel' => 'Linux', 'kernelrelease' => /\d+\.\d+\.\d+/, 'kernelversion' => /\d+\.\d+\.\d+/, 'kernelmajversion' => /\d+\.\d+/ } expected_facts end # Solaris def solaris_expected_facts(agent) version = agent['platform'].match(/solaris-(\d\d)/) os_version = if version.nil? /\d+/ else /#{version[1]}/ end case agent[:platform] when /solaris-10/ os_release_full = /#{os_version}_u\d+/ os_kernel = /Generic_\d+-\d+/ os_kernel_major = os_kernel when /solaris-11/ os_release_full = /#{os_version}\.\d+/ os_kernel = os_release_full os_kernel_major = os_version else fail_test("Unknown Solaris version #{agent['platform']}") end case agent[:platform] when /sparc/ os_architecture = 'sun4v' proc_models = /.*SPARC.*/ proc_isa = /sparc/ else os_architecture = 'i86pc' proc_models = /(Intel.*)|(AMD.*)/ proc_isa = /i386/ end expected_facts = { 'os.architecture' => os_architecture, 'os.family' => 'Solaris', 'os.hardware' => os_architecture, 'os.name' => 'Solaris', 'os.release.full' => os_release_full, 'os.release.major' => os_version, 'os.release.minor' => /\d+/, 'processors.count' => /[1-9]/, 'processors.physicalcount' => /[1-9]/, 'processors.isa' => proc_isa, 'processors.models' => proc_models, 'kernel' => 'SunOS', 'kernelrelease' => /5\.#{os_version}/, 'kernelversion' => os_kernel, 'kernelmajversion' => os_kernel_major } expected_facts end # Ubuntu def ubuntu_expected_facts(agent) version = agent['platform'].match(/ubuntu-(\d\d\.\d\d)/) os_version = if version.nil? /\d+\.\d+/ else /#{version[1]}/ end if agent['platform'] =~ /x86_64|amd64/ os_arch = 'amd64' os_hardware = 'x86_64' processor_model_pattern = /(Intel\(R\).*)|(AMD.*)/ elsif agent['platform'] =~ /aarch64/ os_arch = 'aarch64' os_hardware = 'aarch64' processor_model_pattern = // # facter doesn't figure out the processor type on these machines else os_arch = 'i386' os_hardware = 'i686' processor_model_pattern = /(Intel\(R\).*)|(AMD.*)/ end expected_facts = { 'os.architecture' => os_arch, 'os.distro.codename' => /\w+/, 'os.distro.description' => /Ubuntu #{os_version}/, 'os.distro.id' => 'Ubuntu', 'os.distro.release.full' => os_version, 'os.distro.release.major' => os_version, 'os.family' => 'Debian', 'os.hardware' => os_hardware, 'os.name' => 'Ubuntu', 'os.release.full' => os_version, 'os.release.major' => os_version, 'processors.count' => /[1-9]/, 'processors.physicalcount' => /[1-9]/, 'processors.isa' => os_hardware, 'processors.models' => processor_model_pattern, 'kernel' => 'Linux', 'kernelrelease' => /\d+\.\d+\.\d+/, 'kernelversion' => /\d+\.\d+\.\d+/, 'kernelmajversion' => /\d+\.\d+/ } expected_facts end # Windows def windows_expected_facts(agent) # Get expected values based on platform name if agent['platform'] =~ /2012/ os_version = agent['platform'] =~ /R2/ ? '2012 R2' : '2012' elsif agent['platform'] =~ /-10/ os_version = '10' elsif agent['platform'] =~ /-11/ os_version = '11' elsif agent['platform'] =~ /2016/ os_version = '2016' elsif agent['platform'] =~ /2019/ os_version = '2019' elsif agent['platform'] =~ /2022/ os_version = '2022' else fail_test "Unknown Windows version #{agent['platform']}" end if agent['platform'] =~ /64/ os_arch = 'x64' os_hardware = 'x86_64' else os_arch = 'x86' os_hardware = 'i686' end expected_facts = { 'os.architecture' => os_arch, 'os.family' => 'windows', 'os.hardware' => os_hardware, 'os.name' => 'windows', 'os.release.full' => os_version, 'os.release.major' => os_version, 'os.windows.system32' => /C:\\(WINDOWS|[Ww]indows)\\(system32|sysnative)/, 'processors.count' => /[1-9]/, 'processors.physicalcount' => /[1-9]/, 'processors.isa' => /x86|x64/, 'processors.models' => /(Intel\(R\).*)|(AMD.*)/, 'kernel' => 'windows', 'kernelrelease' => /\d+\.\d+/, 'kernelversion' => /\d+\.\d+/, 'kernelmajversion' => /\d+\.\d+/ } expected_facts end end end end puppetlabs-facter-dfe6df4/acceptance/lib/facter/acceptance/user_fact_utils.rb000066400000000000000000000100731470204764400276360ustar00rootroot00000000000000module Facter module Acceptance module UserFactUtils # Determine paths for testing custom and external facts. # Paths vary by platform. # Retrieve the path of a non-standard directory for custom or external facts. # def get_user_fact_dir(platform, version) if platform =~ /windows/ if version < 6.0 File.join('C:', 'Documents and Settings', 'All Users', 'Application Data', 'PuppetLabs', 'facter', 'custom') else File.join('C:', 'ProgramData', 'PuppetLabs', 'facter', 'custom') end else File.join('/', 'opt', 'puppetlabs', 'facter', 'custom') end end # Retrieve the path of the standard facts.d directory. # def get_factsd_dir(platform, version) if platform =~ /windows/ if version < 6.0 File.join('C:', 'Documents and Settings', 'All Users', 'Application Data', 'PuppetLabs', 'facter', 'facts.d') else File.join('C:', 'ProgramData', 'PuppetLabs', 'facter', 'facts.d') end else File.join('/', 'opt', 'puppetlabs', 'facter', 'facts.d') end end # Retrieve the path of the standard cached facts directory. # def get_cached_facts_dir(platform, version) if platform =~ /windows/ if version < 6.0 File.join('C:', 'Documents and Settings', 'All Users', 'Application Data', 'PuppetLabs', 'facter', 'cache', 'cached_facts') else File.join('C:', 'ProgramData', 'PuppetLabs', 'facter', 'cache', 'cached_facts') end else File.join('/', 'opt', 'puppetlabs', 'facter', 'cache', 'cached_facts') end end # Retrieve the path of the facts.d directory in /etc/facter on Unix systems # def get_etc_factsd_dir(platform) if platform =~ /windows/ File.join('C:', 'ProgramData', 'PuppetLabs', 'facter', 'facts.d') else File.join('/', 'etc', 'facter', 'facts.d') end end # Retrieve the path of the facts.d diretory in /etc/puppetlabs/facter on Unix systems # def get_etc_puppetlabs_factsd_dir(platform) if platform =~ /windows/ raise "get_etc_puppetlabs_factsd_dir: not a supported directory on Windows" else File.join('/', 'etc', 'puppetlabs', 'facter', 'facts.d') end end # Retrieve the extension to use for an external fact script. # Windows uses '.bat' and everything else uses '.sh' def get_external_fact_script_extension(platform) if platform =~ /windows/ '.bat' else '.sh' end end # Retrieve the path to default location of facter.conf file. # def get_default_fact_dir(platform, version) if platform =~ /windows/ File.join('C:', 'ProgramData', 'PuppetLabs', 'facter', 'etc') else File.join('/', 'etc', 'puppetlabs', 'facter') end end # Return the content for an external fact based on the platform supplied # def external_fact_content(platform, key='external_fact', value='test_value') unix_content = < /fedora|el-|centos/, :debian => /debian|ubuntu/, :debian_ruby18 => /debian|ubuntu-lucid|ubuntu-precise/, :solaris => /solaris/, :windows => /windows/, }.freeze # Installs packages on the hosts. # # @param hosts [Array] Array of hosts to install packages to. # @param package_hash [Hash{Symbol=>Array>}] # Keys should be a symbol for a platform in PLATFORM_PATTERNS. Values # should be an array of package names to install, or of two element # arrays where a[0] is the command we expect to find on the platform # and a[1] is the package name (when they are different). # @param options [Hash{Symbol=>Boolean}] # @option options [Boolean] :check_if_exists First check to see if # command is present before installing package. (Default false) # @return true def install_packages_on(hosts, package_hash, options = {}) check_if_exists = options[:check_if_exists] hosts = [hosts] unless hosts.kind_of?(Array) hosts.each do |host| package_hash.each do |platform_key,package_list| if pattern = PLATFORM_PATTERNS[platform_key] if pattern.match(host['platform']) package_list.each do |cmd_pkg| if cmd_pkg.kind_of?(Array) command, package = cmd_pkg else command = package = cmd_pkg end if !check_if_exists || !host.check_for_package(command) host.logger.notify("Installing #{package}") additional_switches = '--allow-unauthenticated' if platform_key == :debian host.install_package(package, additional_switches) end end end else raise("Unknown platform '#{platform_key}' in package_hash") end end end return true end end end end puppetlabs-facter-dfe6df4/acceptance/teardown/000077500000000000000000000000001470204764400216405ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/teardown/common/000077500000000000000000000000001470204764400231305ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/teardown/common/099_Archive_Logs.rb000066400000000000000000000114101470204764400264200ustar00rootroot00000000000000require 'date' def file_glob(host, path) result = on(host, "ls #{path}", :acceptable_exit_codes => [0, 2]) return [] if result.exit_code != 0 return result.stdout.strip.split("\n") end # This test is prefixed with zzz so it will hopefully run last. test_name 'Backup puppet logs and app data on all hosts' do today = Date.today().to_s # truncate the job name so it only has the name-y part and no parameters job_name = (ENV['JOB_NAME'] || 'unknown_jenkins_job') .sub(/[A-Z0-9_]+=.*$/, '') .gsub(/[\/,.]/, '_')[0..200] archive_name = "#{job_name}__#{ENV['BUILD_ID']}__#{today}__sut-files.tgz" archive_root = "SUT_#{today}" hosts.each do |host| step("Capturing log errors for #{host}") do case host[:platform] when /windows/ # on Windows, all of the desired data (including logs) is in the data dir puppetlabs_data = 'C:/ProgramData/PuppetLabs' archive_file_from(host, puppetlabs_data, {}, archive_root, archive_name) # Note: Windows `ls` uses absolute paths for all matches when an absolute path is supplied. tempdir = 'C:/Windows/TEMP' file_glob(host, File.join(tempdir, 'install-puppet-*.log')).each do |install_log| archive_file_from(host, install_log, {}, archive_root, archive_name) end file_glob(host, File.join(tempdir, 'puppet-*-installer.log')).each do |install_log| archive_file_from(host, install_log, {}, archive_root, archive_name) end else puppetlabs_logdir = '/var/log/puppetlabs' grep_for_alerts = if host[:platform] =~ /solaris/ "egrep -i 'warn|error|fatal'" elsif host[:platform] =~ /aix/ "grep -iE -B5 -A10 'warn|error|fatal'" else "grep -i -B5 -A10 'warn\\|error\\|fatal'" end ## If there are any PL logs, try to echo all warning, error, and fatal ## messages from all PL logs to the job's output on(host, <<-GREP_FOR_ALERTS, :accept_all_exit_codes => true ) if [ -d #{puppetlabs_logdir} ] && [ -n "$(find #{puppetlabs_logdir} -name '*.log*')" ]; then for log in $(find #{puppetlabs_logdir} -name '*.log*'); do # grep /dev/null only to get grep to print filenames, since -H is not in POSIX spec for grep #{grep_for_alerts} $log /dev/null; echo "" done fi GREP_FOR_ALERTS step("Archiving logs for #{host} into #{archive_name} (muzzling everything but :warn or higher beaker logs...)") do ## turn the logger off to avoid getting hundreds of lines of scp progress output previous_level = @logger.log_level @logger.log_level = :warn pxp_cache = '/opt/puppetlabs/pxp-agent/spool' puppetlabs_data = '/etc/puppetlabs' version_lookup_result = on(host, "cat /opt/puppetlabs/puppet/VERSION", :accept_all_exit_codes => true) # If we can't find a VERSION file, chances are puppet wasn't # installed and these paths aren't present. Beaker's # archive_file_from() will fail if it can't find the file, and we # want to proceed... if version_lookup_result.exit_code == 0 agent_version = version_lookup_result.output.strip archive_file_from(host, pxp_cache, {}, archive_root, archive_name) unless version_is_less(agent_version, "1.3.2") archive_file_from(host, puppetlabs_data, {}, archive_root, archive_name) archive_file_from(host, puppetlabs_logdir, {}, archive_root, archive_name) end syslog_dir = '/var/log' syslog_name = 'messages' if host[:platform] =~ /ubuntu|debian/ syslog_name = 'syslog' elsif host[:platform] =~ /solaris/ syslog_dir = '/var/adm' # Next few lines are for debugging POOLER-200, once that is resolved this can be removed @logger.log_level = previous_level on(host, 'egrep -i \'reboot after panic\' /var/adm/messages', :acceptable_exit_codes => [0,1,2]) @logger.log_level = :warn elsif host[:platform] =~ /osx/ syslog_name = "system.log" elsif host[:platform] =~ /fedora/ on(host, "journalctl --no-pager > /var/log/messages") elsif host[:platform] =~ /aix/ on(host, "alog -o -t console > /var/log/messages") end syslog_path = File.join(syslog_dir, syslog_name) if host.file_exist?(syslog_path) archive_file_from(host, syslog_path, {}, archive_root, archive_name) end ## turn the logger back on in case someone else wants to log things @logger.log_level = previous_level end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/000077500000000000000000000000001470204764400211575ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/api/000077500000000000000000000000001470204764400217305ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/api/value/000077500000000000000000000000001470204764400230445ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/api/value/core_and_custom.rb000066400000000000000000000022361470204764400265400ustar00rootroot00000000000000# frozen_string_literal: true test_name 'Facter.value(core_fact) when custom fact is defined' do confine :to, platform: 'ubuntu' tag 'audit:high' require 'facter/acceptance/base_fact_utils' require 'facter/acceptance/api_utils' extend Facter::Acceptance::BaseFactUtils extend Facter::Acceptance::ApiUtils agents.each do |agent| fact_name = 'os.name' core_fact_value = os_processors_and_kernel_expected_facts(agent)[fact_name] step 'in different file than fact name' do facts_dir = agent.tmpdir('facts') teardown do agent.rm_rf(facts_dir) end fact_file = File.join(facts_dir, 'test_fact.rb') fact_content = <<-RUBY Facter.add('#{fact_name}') do has_weight(100) setcode { 'custom_fact' } end RUBY create_remote_file(agent, fact_file, fact_content) step 'returns core fact value' do facter_rb = facter_value_rb(agent, fact_name, custom_dir: facts_dir) fact_value = on(agent, "#{ruby_command(agent)} #{facter_rb}").stdout&.strip assert_match(fact_value, core_fact_value, 'Incorrect fact value for os.name') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/api/value/core_and_custom_overwrite.rb000066400000000000000000000021351470204764400306440ustar00rootroot00000000000000# frozen_string_literal: true test_name 'Facter.value(core_fact) when custom fact is defined and overwrites core' do confine :to, platform: 'ubuntu' tag 'audit:high' require 'facter/acceptance/base_fact_utils' require 'facter/acceptance/api_utils' extend Facter::Acceptance::BaseFactUtils extend Facter::Acceptance::ApiUtils agents.each do |agent| fact_name = 'os.name' step 'in the same file as fact name' do facts_dir = agent.tmpdir('facts') teardown do agent.rm_rf(facts_dir) end fact_file = File.join(facts_dir, 'os.name.rb') fact_content = <<-RUBY Facter.add('#{fact_name}') do has_weight(100) setcode { 'custom_fact' } end RUBY create_remote_file(agent, fact_file, fact_content) step 'returns custom fact value' do facter_rb = facter_value_rb(agent, fact_name, custom_dir: facts_dir) fact_value = on(agent, "#{ruby_command(agent)} #{facter_rb}").stdout&.strip assert_match(fact_value, 'custom_fact', 'Incorrect fact value for os.name') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/api/value/core_fact.rb000066400000000000000000000012731470204764400253210ustar00rootroot00000000000000# frozen_string_literal: true test_name 'Facter.value(core_fact)' do confine :to, platform: 'ubuntu' tag 'audit:high' require 'facter/acceptance/base_fact_utils' require 'facter/acceptance/api_utils' extend Facter::Acceptance::BaseFactUtils extend Facter::Acceptance::ApiUtils agents.each do |agent| fact_name = 'os.name' core_fact_value = os_processors_and_kernel_expected_facts(agent)[fact_name] step 'returns core fact value' do facter_rb = facter_value_rb(agent, fact_name) fact_value = on(agent, "#{ruby_command(agent)} #{facter_rb}").stdout&.strip assert_match(fact_value, core_fact_value, 'Incorrect fact value for os.name') end end end puppetlabs-facter-dfe6df4/acceptance/tests/api/value/custom_fact_in_different_file.rb000066400000000000000000000022771470204764400314230ustar00rootroot00000000000000# frozen_string_literal: true test_name 'Facter.value(custom_fact) in different file' do confine :to, platform: 'ubuntu' tag 'audit:high' require 'facter/acceptance/base_fact_utils' require 'facter/acceptance/api_utils' extend Facter::Acceptance::BaseFactUtils extend Facter::Acceptance::ApiUtils agents.each do |agent| facts_dir = agent.tmpdir('facts') fact_name = 'single_custom_fact' teardown do agent.rm_rf(facts_dir) end fact_file = File.join(facts_dir, 'another_fact.rb') fact_content = <<-RUBY Facter.add('#{fact_name}') do setcode { 'single_custom_fact' } end RUBY create_remote_file(agent, fact_file, fact_content) step 'returns custom_fact fact value after loading all custom facts' do facter_rb = facter_value_rb(agent, fact_name, custom_dir: facts_dir, debug: true) on(agent, "#{ruby_command(agent)} #{facter_rb}") do |result| output = result.stdout.strip assert_match(/has resolved to: #{fact_name}/, output, 'Incorrect fact value for custom fact') assert_match(/Searching fact: #{fact_name} in all custom facts/, output, 'Loaded all custom facts') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/api/value/custom_fact_in_same_file_as_fact_name.rb000066400000000000000000000023151470204764400330530ustar00rootroot00000000000000# frozen_string_literal: true test_name 'Facter.value(custom_fact) in the same file as fact name' do confine :to, platform: 'ubuntu' tag 'audit:high' require 'facter/acceptance/base_fact_utils' require 'facter/acceptance/api_utils' extend Facter::Acceptance::BaseFactUtils extend Facter::Acceptance::ApiUtils agents.each do |agent| facts_dir = agent.tmpdir('facts') fact_name = 'single_custom_fact' teardown do agent.rm_rf(facts_dir) end fact_file = File.join(facts_dir, "#{fact_name}.rb") fact_content = <<-RUBY Facter.add('#{fact_name}') do setcode { 'single_custom_fact' } end RUBY create_remote_file(agent, fact_file, fact_content) step 'returns custom_fact fact value without loading all custom facts' do facter_rb = facter_value_rb(agent, fact_name, custom_dir: facts_dir, debug: true) on(agent, "#{ruby_command(agent)} #{facter_rb}") do |result| output = result.stdout.strip assert_match(/has resolved to: #{fact_name}/, output, 'Incorrect fact value for custom fact') refute_match(/Searching fact: #{fact_name} in all custom facts/, output, 'Loaded all custom facts') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/api/value/env_fact.rb000066400000000000000000000021501470204764400251540ustar00rootroot00000000000000# frozen_string_literal: true test_name 'Facter.value(env_fact)' do confine :to, platform: 'ubuntu' tag 'audit:high' require 'facter/acceptance/base_fact_utils' require 'facter/acceptance/api_utils' extend Facter::Acceptance::BaseFactUtils extend Facter::Acceptance::ApiUtils agents.each do |agent| fact_name = 'env_fact' fact_value = 'env_value' step 'resolves the fact with the correct value' do facter_rb = facter_value_rb(agent, fact_name) env = { "FACTER_#{fact_name}" => fact_value } on(agent, "#{ruby_command(agent)} #{facter_rb}", environment: env) do |result| assert_match(fact_value, result.stdout.chomp, 'Incorrect fact value for env fact') end end step 'resolves the fact with the correct value if the env fact is upcased' do facter_rb = facter_value_rb(agent, fact_name) env = { "FACTER_#{fact_name.upcase}" => fact_value } on(agent, "#{ruby_command(agent)} #{facter_rb}", environment: env) do |result| assert_match(fact_value, result.stdout.chomp, 'Incorrect fact value for env fact') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/api/value/external_fact.rb000066400000000000000000000020461470204764400262120ustar00rootroot00000000000000# frozen_string_literal: true test_name 'Facter.value(external_fact)' do confine :to, platform: 'ubuntu' tag 'audit:high' require 'facter/acceptance/base_fact_utils' require 'facter/acceptance/api_utils' extend Facter::Acceptance::BaseFactUtils extend Facter::Acceptance::ApiUtils agents.each do |agent| facts_dir = agent.tmpdir('facts') fact_name = 'my_external_fact' teardown do agent.rm_rf(facts_dir) end fact_file = File.join(facts_dir, 'external.txt') fact_content = 'my_external_fact=123' create_remote_file(agent, fact_file, fact_content) step 'returns external fact without loading custom facts' do facter_rb = facter_value_rb(agent, fact_name, external_dir: facts_dir, debug: true) on(agent, "#{ruby_command(agent)} #{facter_rb}") do |result| output = result.stdout.strip assert_match(/has resolved to: 123/, output, 'Incorrect fact value for external fact') refute_match(/in all custom facts/, output, 'Loaded all custom facts') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/api/value/non_existent_fact.rb000066400000000000000000000024601470204764400271050ustar00rootroot00000000000000# frozen_string_literal: true test_name 'Facter.value(not_existent)' do confine :to, platform: 'ubuntu' tag 'audit:high' require 'facter/acceptance/base_fact_utils' require 'facter/acceptance/api_utils' extend Facter::Acceptance::BaseFactUtils extend Facter::Acceptance::ApiUtils agents.each do |agent| fact_name = 'non_existent' facts_dir = agent.tmpdir('facts') teardown do agent.rm_rf(facts_dir) end step 'it loads facts in the correct order' do facter_rb = facter_value_rb( agent, fact_name, external_dir: facts_dir, custom_dir: facts_dir, debug: true ) on(agent, "#{ruby_command(agent)} #{facter_rb}") do |result| output = result.stdout.strip refute_match(/has resolved to: /, output, 'Fact was found') assert_match( /Searching fact: #{fact_name} in file: #{fact_name}.rb/, output, 'Did not load fact name file' ) assert_match( /Searching fact: #{fact_name} in core facts and external facts/, output, 'Did not load core and external' ) assert_match( /Searching fact: #{fact_name} in all custom facts/, output, ' Did not load all custom facts' ) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/000077500000000000000000000000001470204764400236515ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/block_custom_fact.rb000066400000000000000000000024441470204764400276630ustar00rootroot00000000000000test_name 'custom facts included in blocklist will not be displayed' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils custom_fact_file = 'custom_facts.rb' custom_fact_name = "my_custom_fact" custom_fact_value = "custom_fact_value" fact_content = <<-CUSTOM_FACT Facter.add(:#{custom_fact_name}) do setcode do "#{custom_fact_value}" end end CUSTOM_FACT config_data = <<~FACTER_CONF facts : { blocklist : [ "#{custom_fact_name}" ], } FACTER_CONF agents.each do |agent| fact_dir = agent.tmpdir('custom_facts') fact_file = File.join(fact_dir, custom_fact_file) config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') agent.mkdir_p(config_dir) create_remote_file(agent, fact_file, fact_content) create_remote_file(agent, config_file, config_data) teardown do agent.rm_rf(fact_dir) agent.rm_rf(config_dir) end step "Facter: Verify that the blocked custom fact is not displayed" do on(agent, facter("--custom-dir=#{fact_dir} my_custom_fact")) do |facter_output| assert_equal("", facter_output.stdout.chomp) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/cached_custom_fact.rb000066400000000000000000000061571470204764400300050ustar00rootroot00000000000000test_name 'ttls configured custom facts files creates cache file and reads cache file' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils custom_fact_file = 'custom_facts.rb' custom_fact_name = 'random_custom_fact' custom_fact_value = 'custom fact value' fact_content = <<-CUSTOM_FACT Facter.add(:#{custom_fact_name}) do setcode do "#{custom_fact_value}" end end CUSTOM_FACT cached_file_content = <<~CACHED_FILE { "#{custom_fact_name}": "#{custom_fact_value}", "cache_format_version": 1 } CACHED_FILE config_data = <<~FACTER_CONF facts : { ttls : [ { "cached-custom-facts" : 3 days } ] } fact-groups : { cached-custom-facts : ["#{custom_fact_name}"], } FACTER_CONF agents.each do |agent| cache_folder = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) fact_dir = agent.tmpdir('facter') env = { 'FACTERLIB' => fact_dir } config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') step "Agent #{agent}: create config file" do agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) fact_file = File.join(fact_dir, custom_fact_file) create_remote_file(agent, fact_file, fact_content) end teardown do agent.rm_rf(fact_dir) agent.rm_rf("#{cache_folder}/*") agent.rm_rf(config_file) end step "should log that it creates cache file and it caches custom facts found in facter.conf" do on(agent, facter("#{custom_fact_name} --debug", environment: env)) do |facter_result| assert_equal(custom_fact_value, facter_result.stdout.chomp, "#{custom_fact_name} value changed") assert_match(/facts cache file expired, missing or is corrupt/, facter_result.stderr, 'Expected debug message to state that custom facts cache file is missing or expired') assert_match(/Saving cached custom facts to ".+"|caching values for cached-custom-facts facts/, facter_result.stderr, 'Expected debug message to state that custom facts will be cached') end end step "should create a cached-custom-facts cache file that containt fact information" do result = agent.file_exist?("#{cache_folder}/cached-custom-facts") assert_equal(true, result) cat_output = agent.cat("#{cache_folder}/cached-custom-facts") assert_match(cached_file_content.chomp, cat_output.strip, 'Expected cached custom fact file to contain fact information') end step 'should read from the cached file for a custom fact that has been cached' do on(agent, facter("#{custom_fact_name} --debug", environment: env)) do |facter_result| assert_match(/Loading cached custom facts from file ".+"|loading cached values for random_custom_fact facts/, facter_result.stderr, 'Expected debug message to state that cached custom facts are read from file') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/cached_dependant_custom_facts.rb000066400000000000000000000071061470204764400322050ustar00rootroot00000000000000test_name 'dependant custom facts are cached correctly' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils custom_fact_file = 'dependant_custom_facts.rb' depending_fact_name = 'depending_fact_name' simple_fact_name = 'simple_fact_name' simple_fact_value = '["a","b","c","d"]' fact_content = <<-CUSTOM_FACT Facter.add(:#{simple_fact_name}) do confine osfamily: Facter.value('osfamily').downcase setcode do array_value = #{simple_fact_value} array_value end end Facter.add(:#{depending_fact_name}) do confine osfamily: Facter.value('osfamily').downcase setcode do Facter.value(:#{simple_fact_name}).length end end CUSTOM_FACT cached_file_content = <<~CACHED_FILE { "#{depending_fact_name}": 4, "cache_format_version": 1 } CACHED_FILE config_data = <<~FACTER_CONF facts : { ttls : [ { "cached-dependant-custom-facts" : 3 days } ] } fact-groups : { cached-dependant-custom-facts : ["#{depending_fact_name}","#{simple_fact_name}"], } FACTER_CONF agents.each do |agent| facter_version = fact_on(agent, 'facterversion') if facter_version.start_with?("3") skip_test 'Test only viable on Facter 4' end cache_folder = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) fact_dir = agent.tmpdir('facter') env = { 'FACTERLIB' => fact_dir } config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') step "Agent #{agent}: create config file" do agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) fact_file = File.join(fact_dir, custom_fact_file) create_remote_file(agent, fact_file, fact_content) end teardown do agent.rm_rf(fact_dir) agent.rm_rf("#{cache_folder}/*") agent.rm_rf(config_file) end step "should log that it creates cache file and it caches custom facts found in facter.conf" do on(agent, facter("#{depending_fact_name} --debug", environment: env)) do |facter_result| assert_equal("4", facter_result.stdout.chomp, "#{depending_fact_name} value changed") assert_match(/facts cache file expired, missing or is corrupt/, facter_result.stderr, 'Expected debug message to state that depending custom facts cache file is missing or expired') assert_match(/caching values for cached-dependant-custom-facts facts/, facter_result.stderr, 'Expected debug message to state that depending custom facts will be cached') end end step "should create a cached-dependant-custom-facts cache file that containt fact information" do result = agent.file_exist?("#{cache_folder}/cached-dependant-custom-facts") assert_equal(true, result) cat_output = agent.cat("#{cache_folder}/cached-dependant-custom-facts") assert_match(cached_file_content.chomp, cat_output.strip, 'Expected cached dependant custom fact file to contain fact information') end step 'should read from the cached file for a custom fact that has been cached' do on(agent, facter("#{depending_fact_name} --debug", environment: env)) do |facter_result| assert_match(/loading cached values for #{depending_fact_name} facts/, facter_result.stderr, 'Expected debug message to state that cached custom facts are read from file') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/conflicts_with_builtin_fact.rb000066400000000000000000000070221470204764400317410ustar00rootroot00000000000000test_name 'Facter should appropriately resolve a custom fact when it conflicts with a builtin fact' do tag 'risk:high' def create_custom_fact_on(host, custom_fact_dir, fact_file_name, fact) fact_file_contents = <<-CUSTOM_FACT Facter.add(:#{fact[:name]}) do has_weight #{fact[:weight]} setcode do #{fact[:value]} end end CUSTOM_FACT fact_file_path = File.join(custom_fact_dir, fact_file_name) create_remote_file(host, fact_file_path, fact_file_contents) end def clear_custom_facts_on(host, custom_fact_dir) step "Clean-up the previous test's custom facts" do host.rm_rf("#{custom_fact_dir}/*") end end agents.each do |agent| custom_fact_dir = agent.tmpdir('facter') teardown do agent.rm_rf(custom_fact_dir) end fact_name = 'timezone' builtin_value = on(agent, facter('timezone')).stdout.chomp step "Verify that Facter uses the custom fact's value when its weight is > 0" do custom_fact_value = "custom_timezone" create_custom_fact_on( agent, custom_fact_dir, 'custom_timezone.rb', name: fact_name, weight: 10, value: "'#{custom_fact_value}'" ) on(agent, facter("--custom-dir \"#{custom_fact_dir}\" timezone")) do |result| assert_match(/#{custom_fact_value}/, result.stdout.chomp, "Facter does not use the custom fact's value when its weight is > 0") end end clear_custom_facts_on(agent, custom_fact_dir) step "Verify that Facter uses the builtin fact's value when all conflicting custom facts fail to resolve" do [ 'timezone_one.rb', 'timezone_two.rb'].each do |fact_file| create_custom_fact_on( agent, custom_fact_dir, fact_file, { name: fact_name, weight: 10, value: nil } ) end on(agent, facter("--custom-dir \"#{custom_fact_dir}\" timezone")) do |result| assert_match(/#{builtin_value}/, result.stdout.chomp, "Facter does not use the builtin fact's value when all conflicting custom facts fail to resolve") end end step "Verify that Facter gives precedence to the builtin fact over zero weight custom facts" do step "when all custom facts have zero weight" do { 'timezone_one.rb' => "'timezone_one'", 'timezone_two.rb' => "'timezone_two'" }.each do |fact_file, fact_value| create_custom_fact_on( agent, custom_fact_dir, fact_file, { name: fact_name, weight: 0, value: fact_value } ) end on(agent, facter("--custom-dir \"#{custom_fact_dir}\" timezone")) do |result| assert_match(/#{builtin_value}/, result.stdout.chomp, "Facter does not give precedence to the builtin fact when all custom facts have zero weight") end end clear_custom_facts_on(agent, custom_fact_dir) step "when some custom facts have zero weight" do { 'timezone_one.rb' => { weight: 10, value: nil }, 'timezone_two.rb' => { weight: 0, value: "'timezone_two'" } }.each do |fact_file, fact| create_custom_fact_on( agent, custom_fact_dir, fact_file, fact.merge(name: fact_name) ) end on(agent, facter("--custom-dir \"#{custom_fact_dir}\" timezone")) do |result| assert_match(/#{builtin_value}/, result.stdout.chomp, "Facter does not give precedence to the builtin fact when only some custom facts have zero weight") end end end end end custom_fact_with_10001_weight_overrides_external_fact.rb000066400000000000000000000020101470204764400365230ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/custom_factstest_name "C100153: custom fact with weight of >= 10001 overrides an external fact" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils fact_name = 'test' # Use a static external fact ext_fact = "#{fact_name}: 'EXTERNAL'" agents.each do |agent| facts_dir = agent.tmpdir('facts.d') ext_fact_path = "#{facts_dir}/test.yaml" cust_fact_path = "#{facts_dir}/test.rb" create_remote_file(agent, ext_fact_path, ext_fact) create_remote_file(agent, cust_fact_path, custom_fact_content(fact_name, 'CUSTOM', "has_weight 10001")) teardown do agent.rm_rf(facts_dir) end # Custom fact with weight >= 10001 should override an external fact step "Agent #{agent}: resolve a custom fact with weight of 10001 overriding the external fact" do on(agent, facter("--external-dir \"#{facts_dir}\" --custom-dir=#{facts_dir} test")) do |facter_output| assert_equal("CUSTOM", facter_output.stdout.chomp) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/custom_fact_with_legacy_fact.rb000066400000000000000000000015751470204764400320710ustar00rootroot00000000000000test_name "Can resolve custom facts that call legacy facts" do tag 'risk:high' fact_content = <<-RUBY Facter.add(:test_fact_with_legacy) do setcode do Facter.value('osfamily').downcase 'resolved' end end RUBY agents.each do |agent| fact_dir = agent.tmpdir('fact') fact_file = File.join(fact_dir, 'test_fact.rb') create_remote_file(agent, fact_file, fact_content) teardown do agent.rm_rf(fact_dir) end step 'it resolves the fact without errors' do on(agent, facter("--custom-dir #{fact_dir} --json")) do |facter_result| assert_equal( 'resolved', JSON.parse(facter_result.stdout.chomp)['test_fact_with_legacy'], 'test_fact_with_legacy value is wrong' ) assert_empty(facter_result.stderr.chomp, "Expected no errors from facter") end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/custom_facts_aggregate_resolutions.rb000066400000000000000000000072111470204764400333450ustar00rootroot00000000000000# frozen_string_literal: true test_name 'Facter should handle aggregated custom facts' do tag 'risk:high' fact_content1 = <<-RUBY Facter.add(:test_fact) do has_weight 100000 setcode do "test fact" end end Facter.add(:test_fact, :type => :aggregate) do has_weight 10000 chunk(:one) do 'aggregate' end chunk(:two) do 'fact' end aggregate do |chunks| result = '' chunks.each_value do |str| result += str end result end end RUBY fact_content2 = <<-RUBY Facter.add(:test_fact) do has_weight 10000 setcode do "test fact" end end Facter.add(:test_fact, :type => :aggregate) do has_weight 100000 chunk(:one) do 'aggregate' end chunk(:two) do 'fact' end aggregate do |chunks| result = '' chunks.each_value do |str| result += str end result end end RUBY fact_content3 = <<-RUBY Facter.add(:test_array_fact, :type => :aggregate) do has_weight 100000 chunk(:one) do ['foo'] end chunk(:two) do ['bar'] end end Facter.add(:test_hash_fact, :type => :aggregate) do chunk :first do { foo: 'aggregate' } end chunk :second do { bar: 'fact' } end end RUBY agents.each do |agent| fact_dir1 = agent.tmpdir('fact1') fact_file1 = File.join(fact_dir1, 'test_facts.rb') create_remote_file(agent, fact_file1, fact_content1) fact_dir2 = agent.tmpdir('fact2') fact_file2 = File.join(fact_dir2, 'test_facts.rb') create_remote_file(agent, fact_file2, fact_content2) fact_dir3 = agent.tmpdir('fact3') fact_file3 = File.join(fact_dir3, 'no_aggregate_block.rb') create_remote_file(agent, fact_file3, fact_content3) teardown do agent.rm_rf(fact_dir1) agent.rm_rf(fact_dir2) agent.rm_rf(fact_dir3) end step "Agent: Verify test_fact from #{fact_file1}" do on(agent, facter("--custom-dir #{fact_dir1} test_fact")) do |facter_result| assert_equal('test fact', facter_result.stdout.chomp, 'test_fact value is wrong') end end step "Agent: Verify test_fact from #{fact_file2} with aggregate fact overwriting the custom one" do on(agent, facter("--custom-dir #{fact_dir2} test_fact")) do |facter_result| assert_equal('aggregatefact', facter_result.stdout.chomp, 'test_fact value is wrong') end end step "Agent: Verify aggregate facts with no aggregate block from #{fact_file3}" do on(agent, facter("--custom-dir #{fact_dir3} test_array_fact --debug --json")) do |facter_result| assert_equal( { 'test_array_fact' => %w[foo bar] }, JSON.parse(facter_result.stdout.chomp), ' test_array_fact value is wrong' ) assert_match( /custom fact test_array_fact was resolved from.*no_aggregate_block\.rb:1/, facter_result.stderr.chomp, 'resolution location not found on debug' ) end on(agent, facter("--custom-dir #{fact_dir3} test_hash_fact --debug --json")) do |facter_result| assert_equal( { 'test_hash_fact' => { 'bar' => 'fact', 'foo' => 'aggregate' } }, JSON.parse(facter_result.stdout.chomp), 'test_hash_fact value is wrong' ) assert_match( /custom fact test_hash_fact was resolved from.*no_aggregate_block\.rb:12/, facter_result.stderr.chomp, 'resolution location not found on debug' ) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/error_in_custom_file_does_not_affect_api.rb000066400000000000000000000100711470204764400344400ustar00rootroot00000000000000test_name 'Facter api works when there is an error inside a custom fact file' do tag 'risk:high' first_file_content = <<-EOM Facter.add(:custom_fact_1) do setcode do 'custom_fact_1_value' end end # some error nill.size Facter.add(:custom_fact_2) do setcode do 'custom_fact_2_value' end end Facter.add(:custom_fact_3) do setcode do 'custom_fact_3_value' end end EOM second_file_content = <<~EOM Facter.add(:custom_fact_4) do setcode do 'custom_fact_4_value' end end EOM def create_custom_fact_file(file_name, file_content, agent, folder) fact_file = File.join(folder, file_name) create_remote_file(agent, fact_file, file_content) end def create_api_call_file(test_vars, facter_querry) file_content = <<-EOM require 'facter' Facter.search(\'#{test_vars[:facts_dir]}\') #{facter_querry} EOM create_custom_fact_file(test_vars[:test_script_name], file_content, test_vars[:agent], test_vars[:script_dir]) end agents.each do |agent| test_vars = {} test_vars[:facts_dir] = agent.tmpdir('facts_dir') test_vars[:script_dir] = agent.tmpdir('script_dir') test_vars[:agent] = agent test_vars[:test_script_name] = 'test_custom_facts.rb' test_vars[:test_script_path] = File.join(test_vars[:script_dir], test_vars[:test_script_name]) create_custom_fact_file('file1.rb', first_file_content, test_vars[:agent], test_vars[:facts_dir]) create_custom_fact_file('file2.rb', second_file_content, test_vars[:agent], test_vars[:facts_dir]) teardown do agent.rm_rf(test_vars[:facts_dir]) agent.rm_rf(test_vars[:script_dir]) end step "Agent #{agent}: Verify that custom fact 1 is available" do create_api_call_file(test_vars, "puts Facter.value('custom_fact_1')") on(agent, "#{ruby_command(agent)} #{test_vars[:test_script_path]}") do |ruby_result| assert_match(/custom_fact_1_value/, ruby_result.stdout.chomp) end end step "Agent #{agent}: Verify that custom fact 2 is missing" do create_api_call_file(test_vars, "puts Facter.value('custom_fact_2')") on(agent, "#{ruby_command(agent)} #{test_vars[:test_script_path]}") do |ruby_result| refute_match(/custom_fact_2_value/, ruby_result.stdout.chomp) end end step "Agent #{agent}: Verify that custom fact 3 is missing" do create_api_call_file(test_vars, "puts Facter.value('custom_fact_3')") on(agent, "#{ruby_command(agent)} #{test_vars[:test_script_path]}") do |ruby_result| refute_match(/custom_fact_3_value/, ruby_result.stdout.chomp) end end step "Agent #{agent}: Verify that custom fact 4 is available" do create_api_call_file(test_vars, "puts Facter.value('custom_fact_4')") on(agent, "#{ruby_command(agent)} #{test_vars[:test_script_path]}") do |ruby_result| assert_match(/custom_fact_4_value/, ruby_result.stdout.chomp) end end step "Agent #{agent}: Verify that a core fact is still available" do os_name = on(agent, facter('os.name')).stdout.chomp create_api_call_file(test_vars, "puts Facter.value('os.name')") on(agent, "#{ruby_command(agent)} #{test_vars[:test_script_path]}") do |ruby_result| assert_match(/#{os_name}/, ruby_result.stdout) end end step "Agent #{agent}: Verify that an error is outputted when custom fact file has an error" do create_api_call_file(test_vars, "Facter.value('custom_fact_1')") on(agent, "#{ruby_command(agent)} #{test_vars[:test_script_path]}") do |ruby_result| assert_match(/Facter.*error while resolving custom facts in .*file1.rb undefined local variable or method `nill'/, ruby_result.stdout) end end step "Agent #{agent}: Verify that Fact.to_hash still works" do create_api_call_file(test_vars, "puts Facter.to_hash") on(agent, "#{ruby_command(agent)} #{test_vars[:test_script_path]}") do |ruby_result| assert_match(/os.name/, ruby_result.stdout) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/error_in_custom_file_does_not_affect_cli.rb000066400000000000000000000062501470204764400344420ustar00rootroot00000000000000test_name 'Facter cli works when there is an error inside a custom fact file' do tag 'risk:high' first_file_content = <<-EOM Facter.add(:custom_fact_1) do setcode do 'custom_fact_1_value' end end # some error nill.size Facter.add(:custom_fact_2) do setcode do 'custom_fact_2_value' end end Facter.add(:custom_fact_3) do setcode do 'custom_fact_3_value' end end EOM second_file_content = <<~EOM Facter.add(:custom_fact_4) do setcode do 'custom_fact_4_value' end end EOM def create_custom_fact_file(file_name, file_content, fact_dir, agent) fact_file = File.join(fact_dir, file_name) create_remote_file(agent, fact_file, file_content) end agents.each do |agent| custom_facts = agent.tmpdir('custom_facts_dir') os_name = on(agent, facter('os.name')).stdout.chomp create_custom_fact_file('file1.rb', first_file_content, custom_facts, agent) create_custom_fact_file('file2.rb', second_file_content, custom_facts, agent) env = {'FACTERLIB' => custom_facts} teardown do agent.rm_rf(custom_facts) end step "Agent #{agent}: Verify that custom fact 1 is available" do on(agent, facter('custom_fact_1', environment: env), acceptable_exit_codes: [1]) do |facter_output| assert_equal('custom_fact_1_value', facter_output.stdout.chomp) end end step "Agent #{agent}: Verify that custom fact 2 is not available" do on(agent, facter('custom_fact_2', environment: env), acceptable_exit_codes: [1]) do |facter_output| assert_equal('', facter_output.stdout.chomp) end end step "Agent #{agent}: Verify that custom fact 3 is not available" do on(agent, facter('custom_fact_3', environment: env), acceptable_exit_codes: [1]) do |facter_output| assert_equal('', facter_output.stdout.chomp) end end step "Agent #{agent}: Verify that custom fact 4 is available" do on(agent, facter('custom_fact_4', environment: env), acceptable_exit_codes: [1]) do |facter_output| assert_equal('custom_fact_4_value', facter_output.stdout.chomp) end end step "Agent #{agent}: Verify that a core fact is still available" do on(agent, facter('os.name', environment: env), acceptable_exit_codes: [1]) do |facter_output| assert_equal(os_name, facter_output.stdout.chomp) end end step "Agent #{agent}: Verify that an error is outputted when custom fact file has an error" do on(agent, facter('custom_fact_4', environment: env), acceptable_exit_codes: [1]) do |facter_output| assert_match(/ERROR Facter.*error while resolving custom facts in .*file1.rb undefined local variable or method `nill'/, facter_output.stderr.chomp) end end step "Agent #{agent}: Verify that most core facts are available" do on(agent, facter('--json')) do |facter_output| expected_keys = %w[identity memory os ruby networking system_uptime processors] actual_keys = JSON.parse(facter_output.stdout).keys assert_equal(true, (expected_keys - actual_keys).empty?) end end end end execution_execute_sets_status_env_variable.rb000066400000000000000000000020121470204764400350150ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/custom_factstest_name "(FACT-2934) Facter::Core::Execution sets $?" do tag 'risk:high' agents.each do |agent| command = if agent['platform'] =~ /windows/ 'cmd /c exit 1' elsif agent['platform'] =~ /solaris/ || agent['platform'] =~ /osx/ `which bash`.chomp + " -c 'exit 1'" else `which false`.chomp end content = <<-EOM Facter.add(:foo) do setcode do Facter::Util::Resolution.exec("#{command}") "#{command} exited with code: %{status}" % {status: $?.exitstatus} end end EOM fact_dir = agent.tmpdir('facter') fact_file = File.join(fact_dir, 'test_facts.rb') create_remote_file(agent, fact_file, content) teardown do agent.rm_rf(fact_dir) end step "Facter: should resolve the custom fact" do on(agent, facter('--custom-dir', fact_dir, 'foo')) do |facter_output| assert_match(/exited with code: 1/, facter_output.stdout.chomp) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/expand_command.rb000066400000000000000000000014361470204764400271570ustar00rootroot00000000000000test_name 'FACT-2054: Custom facts that execute a shell command should expand it' do tag 'risk:high' confine :to, :platform => /el-7/ content = <<-EOM Facter.add(:foo) do setcode do Facter::Core::Execution.execute("cd /opt/puppetlabs && pwd") end end EOM agents.each do |agent| fact_dir = agent.tmpdir('facter') fact_file = File.join(fact_dir, 'test_facts.rb') create_remote_file(agent, fact_file, content) env = {'FACTERLIB' => fact_dir} teardown do agent.rm_rf(fact_dir) end step "Agent: Verify that command is expanded" do on(agent, facter('foo', :environment => env)) do |facter_result| refute_equal('/opt/puppetlabs', facter_result.stdout.chomp, 'command was not expanded') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/having_multiple_facts_in_one_file.rb000066400000000000000000000020771470204764400331010ustar00rootroot00000000000000test_name 'C14893: Facter should handle multiple facts in a single file' do tag 'risk:high' fact_content = <<-EOM Facter.add(:test_fact1) do setcode do "test fact 1" end end Facter.add(:test_fact2) do setcode do "test fact 2" end end EOM agents.each do |agent| fact_dir = agent.tmpdir('facter') fact_file = File.join(fact_dir, 'test_facts.rb') create_remote_file(agent, fact_file, fact_content) env = {'FACTERLIB' => fact_dir} teardown do agent.rm_rf(fact_dir) end step "Agent: Verify test_fact1 from #{fact_file}" do on(agent, facter('test_fact1', :environment => env)) do |facter_result| assert_equal('test fact 1', facter_result.stdout.chomp, 'test_fact1 is not the correct value') end end step "Agent: Verify test_fact2 from #{fact_file}" do on(agent, facter('test_fact2', :environment => env)) do |facter_result| assert_equal('test fact 2', facter_result.stdout.chomp, 'test_fact2 is not the correct value') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/load_custom_fact_from_lib_facter.rb000066400000000000000000000033051470204764400327020ustar00rootroot00000000000000test_name 'Facter should load facts that are placed in facter directory from all load path locations ' do tag 'risk:high' content = <<-EOM Facter.add(:my_custom_fact) do setcode do 'before_update' end end EOM script_content = <<-EOM #!/usr/bin/env ruby require 'facter' file_name = 'custom_fact.rb' path = ARGV[0] $LOAD_PATH.unshift(path) puts Facter.value('my_custom_fact') # change custom fact value text = File.read(path + '/facter/' + file_name) new_contents = text.gsub(/before_update/, "after_update") # Write changes to the file File.open(path + '/facter/' + file_name, "w") {|file| file.puts new_contents } # if we don't reset, the fact is cached and the old value is displayed Facter.clear puts Facter.value('my_custom_fact') EOM agents.each do |agent| fact_temp_dir = agent.tmpdir('custom_facts') test_script_dir = agent.tmpdir('test_script') fact_dir = Pathname.new("#{fact_temp_dir}/lib/facter") agent.mkdir_p(fact_dir.to_s) fact_file = File.join(fact_dir, 'custom_fact.rb') test_script_file = File.join(test_script_dir, 'test_script.rb') create_remote_file(agent, fact_file, content) create_remote_file(agent, test_script_file, script_content) teardown do agent.rm_rf(fact_temp_dir) agent.rm_rf(test_script_dir) end step "Facter: Verify that custom fact updates it's value after updating the fact and reseting facter" do # use ruby provided by puppet on(agent, "#{ruby_command(agent)} #{test_script_file} #{fact_temp_dir}/lib") do |script_output| assert_match(/before_update\nafter_update/, script_output.stdout, 'Expected custom facts value before and after fact value update') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/long_stderr_with_time_limit.rb000066400000000000000000000020051470204764400317640ustar00rootroot00000000000000test_name "Facter::Core::Execution doesn't kill process with long stderr message" do tag 'risk:high' confine :except, :platform => /windows/ long_output = "This is a very long error message. " * 4096 file_content = <<-EOM #!/bin/sh echo 'newfact=value_of_fact' 1>&2 echo #{long_output} exit 1 EOM agents.each do |agent| external_dir = agent.tmpdir('external_dir') fact_file = File.join(external_dir, 'test.sh') create_remote_file(agent, fact_file, file_content) agent.chmod('+x', fact_file) teardown do agent.rm_rf(external_dir) end step "Facter: should resolve the external fact and print as warning script's stderr message" do on agent, facter('--external-dir', external_dir, 'newfact') do |facter_output| assert_match(/value_of_fact/, facter_output.stdout.chomp) assert_match(/WARN test.sh .*test.sh completed with the following stderr message: This is a very long error message./, facter_output.stderr.chomp) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/not_expand_command.rb000066400000000000000000000014641470204764400300400ustar00rootroot00000000000000test_name 'FACT-2054: Custom facts that execute a shell command should not expand it' do tag 'risk:high' confine :to, :platform => /el-7/ content = <<-EOM Facter.add(:foo) do setcode do Facter::Core::Execution.execute("cd /opt/puppetlabs && pwd", {:expand => false}) end end EOM agents.each do |agent| fact_dir = agent.tmpdir('facter') fact_file = File.join(fact_dir, 'test_facts.rb') create_remote_file(agent, fact_file, content) env = {'FACTERLIB' => fact_dir} teardown do agent.rm_rf(fact_dir) end step "Agent: Verify that command is not expanded" do on(agent, facter('foo', :environment => env)) do |facter_result| assert_equal('/opt/puppetlabs', facter_result.stdout.chomp, 'command was expanded') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/resolution_timeout_option.rb000066400000000000000000000014551470204764400315440ustar00rootroot00000000000000test_name "Facter::Util::Resolution accepts timeout option" do tag 'risk:high' file_content = <<-EOM Facter.add(:foo, {timeout: 0.2}) do setcode do Facter::Core::Execution.execute("sleep 1") end end EOM agents.each do |agent| custom_dir = agent.tmpdir('arbitrary_dir') fact_file = File.join(custom_dir, 'fact.rb') create_remote_file(agent, fact_file, file_content) teardown do agent.rm_rf(custom_dir) end step "Facter: Errors that the custom fact reached the timeout" do on(agent, facter('--custom-dir', custom_dir, 'foo'), acceptable_exit_codes: 1) do |output| assert_match(/ERROR .*Timed out after 0.2 seconds while resolving fact='foo', resolution=.*/, output.stderr.chomp) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/structured/000077500000000000000000000000001470204764400260555ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/structured/block_structured_custom_fact.rb000066400000000000000000000031551470204764400343530ustar00rootroot00000000000000# frozen_string_literal: true test_name 'strucutured custom facts can be blocked' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils fact_file = 'custom_fact.rb' fact_1_name = 'key1.key2' fact_2_name = 'key1.key3' fact_1_value = 'test1' fact_2_value = 'test2' fact_content = <<-RUBY Facter.add('#{fact_1_name}') do setcode do "#{fact_1_value}" end end Facter.add('#{fact_2_name}') do setcode do "#{fact_2_value}" end end RUBY config_data = <<~HOCON facts : { blocklist : [ "#{fact_1_name}" ], } global : { force-dot-resolution : true } HOCON agents.each do |agent| config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) fact_dir = agent.tmpdir('custom_facts') fact_file = File.join(fact_dir, fact_file) create_remote_file(agent, fact_file, fact_content) teardown do agent.rm_rf(fact_dir) agent.rm_rf(config_dir) end step 'blocked structured custom fact is not displayed' do on(agent, facter("--custom-dir=#{fact_dir} key1.key2")) do |facter_output| assert_equal('', facter_output.stdout.chomp) end end step 'the remaining structured fact is displayed' do on(agent, facter("--custom-dir=#{fact_dir} key1.key3")) do |facter_output| assert_equal(fact_2_value, facter_output.stdout.chomp) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/structured/cached_structured_custom_fact.rb000066400000000000000000000057001470204764400344660ustar00rootroot00000000000000# frozen_string_literal: true test_name 'structured custom facts can be cached' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils fact_file = 'custom_fact.rb' fact_1_name = 'key1.key2' fact_2_name = 'key1.key3' fact_1_value = 'test1' fact_2_value = 'test2' fact_content = <<-RUBY Facter.add('#{fact_1_name}') do setcode do "#{fact_1_value}" end end Facter.add('#{fact_2_name}') do setcode do "#{fact_2_value}" end end RUBY cached_file_content = <<~RUBY { "#{fact_1_name}": "#{fact_1_value}", "#{fact_2_name}": "#{fact_2_value}", "cache_format_version": 1 } RUBY partial_file_content = <<~RUBY { "#{fact_2_name}": "#{fact_2_value}", "cache_format_version": 1 } RUBY config_data = <<~HOCON facts : { ttls : [ { "cached-custom-facts" : 3 days } ] } fact-groups : { cached-custom-facts : ["key1"], } global : { force-dot-resolution : true } HOCON agents.each do |agent| cache_folder = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) fact_dir = agent.tmpdir('custom_facts') fact_file = File.join(fact_dir, fact_file) create_remote_file(agent, fact_file, fact_content) teardown do agent.rm_rf(fact_dir) agent.rm_rf(config_dir) agent.rm_rf(cache_folder) end step 'creates the cache for part of the fact' do on(agent, facter("--custom-dir=#{fact_dir} key1.key3")) result = agent.file_exist?("#{cache_folder}/cached-custom-facts") assert_equal(true, result) cat_output = agent.cat("#{cache_folder}/cached-custom-facts") assert_match( partial_file_content.chomp, cat_output.strip, 'Expected cached custom fact file to contain fact information' ) end step 'creates the cache for full fact' do on(agent, facter("--custom-dir=#{fact_dir} key1")) result = agent.file_exist?("#{cache_folder}/cached-custom-facts") assert_equal(true, result) cat_output = agent.cat("#{cache_folder}/cached-custom-facts") assert_match( cached_file_content.chomp, cat_output.strip, 'Expected cached custom fact file to contain fact information' ) end step 'resolves the fact' do on(agent, facter("--custom-dir=#{fact_dir} key1 --json")) do |facter_output| assert_equal( { 'key1' => { 'key2' => fact_1_value, 'key3' => fact_2_value } }, JSON.parse(facter_output.stdout.chomp) ) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/structured/define_structured_custom_fact.rb000066400000000000000000000026141470204764400345120ustar00rootroot00000000000000# frozen_string_literal: true test_name 'custom facts can be defined structured' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils fact_file = 'custom_fact.rb' fact_name = 'key1.key2' fact_value = 'test' fact_content = <<-RUBY Facter.add('#{fact_name}') do setcode do "#{fact_value}" end end RUBY config_data = <<~HOCON global : { force-dot-resolution : true } HOCON agents.each do |agent| config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) fact_dir = agent.tmpdir('custom_facts') fact_file = File.join(fact_dir, fact_file) create_remote_file(agent, fact_file, fact_content) teardown do agent.rm_rf(fact_dir) agent.rm_rf(config_dir) end step 'access fact with dot' do on(agent, facter("--custom-dir=#{fact_dir} key1.key2")) do |facter_output| assert_equal(fact_value, facter_output.stdout.chomp) end on(agent, facter("--custom-dir=#{fact_dir} key1 --json")) do |facter_output| assert_equal( { 'key1' => { 'key2' => fact_value } }, JSON.parse(facter_output.stdout.chomp) ) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/structured/extend_structured_core_fact.rb000066400000000000000000000026551470204764400341720ustar00rootroot00000000000000# frozen_string_literal: true test_name 'custom structured facts can extend core facts' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils core_fact = 'os' fact_file = 'custom_fact.rb' fact_name = 'extension' fact_value = 'test' fact_content = <<-RUBY Facter.add('#{core_fact}.#{fact_name}') do setcode do "#{fact_value}" end end RUBY config_data = <<~HOCON global : { force-dot-resolution : true } HOCON agents.each do |agent| config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) builtin_value = JSON.parse(on(agent, facter('os --json')).stdout.chomp) builtin_value['os'][fact_name] = fact_value expected_value = builtin_value fact_dir = agent.tmpdir('custom_facts') fact_file = File.join(fact_dir, fact_file) create_remote_file(agent, fact_file, fact_content) teardown do agent.rm_rf(fact_dir) agent.rm_rf(config_dir) end step 'check that core fact is extended' do on(agent, facter("os --custom-dir=#{fact_dir} --json")) do |facter_output| assert_equal( expected_value, JSON.parse(facter_output.stdout.chomp) ) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/structured/override_structured_core_fact.rb000066400000000000000000000031651470204764400345170ustar00rootroot00000000000000# frozen_string_literal: true test_name 'custom structured facts can override parts of core facts' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils core_fact = 'os' fact_file = 'custom_fact.rb' fact_name = 'name' fact_value = 'test' fact_content = <<-RUBY Facter.add('#{core_fact}.#{fact_name}', weight: 999) do setcode do "#{fact_value}" end end RUBY config_data = <<~HOCON global : { force-dot-resolution : true } HOCON agents.each do |agent| config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) builtin_value = JSON.parse(on(agent, facter('os --json')).stdout.chomp) builtin_value['os'][fact_name] = fact_value expected_value = builtin_value fact_dir = agent.tmpdir('custom_facts') fact_file = File.join(fact_dir, fact_file) create_remote_file(agent, fact_file, fact_content) teardown do agent.rm_rf(fact_dir) agent.rm_rf(config_dir) end step 'check that core fact is extended' do on(agent, facter("os --custom-dir=#{fact_dir} --json")) do |facter_output| assert_equal( expected_value, JSON.parse(facter_output.stdout.chomp) ) end on(agent, facter("os.name --custom-dir=#{fact_dir}")) do |facter_output| assert_equal( fact_value, facter_output.stdout.chomp ) end end end end partial_cached_structured_custom_fact.rb000066400000000000000000000052071470204764400361250ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/structured# frozen_string_literal: true test_name 'structured custom facts can be granually cached' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils fact_file = 'custom_fact.rb' fact_1_name = 'key1.key2' fact_2_name = 'key1.key3' fact_1_value = 'test1' fact_2_value = 'test2' fact_content = <<-RUBY Facter.add('#{fact_1_name}') do setcode do "#{fact_1_value}" end end Facter.add('#{fact_2_name}') do setcode do "#{fact_2_value}" end end RUBY cached_file_content = <<~RUBY { "#{fact_1_name}": "#{fact_1_value}", "cache_format_version": 1 } RUBY config_data = <<~HOCON facts : { ttls : [ { "cached-custom-facts" : 3 days } ] } fact-groups : { cached-custom-facts : ["#{fact_1_name}"], } global : { force-dot-resolution : true } HOCON agents.each do |agent| cache_folder = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) fact_dir = agent.tmpdir('custom_facts') fact_file = File.join(fact_dir, fact_file) create_remote_file(agent, fact_file, fact_content) teardown do agent.rm_rf(fact_dir) agent.rm_rf(config_dir) agent.rm_rf(cache_folder) end step 'does not create cache of part of the fact that is not in ttls' do on(agent, facter("--custom-dir=#{fact_dir} key1.key3")) result = agent.file_exist?("#{cache_folder}/cached-custom-facts") assert_equal(false, result) end step 'creates a cached-custom-facts cache file that contains fact information' do on(agent, facter("--custom-dir=#{fact_dir} key1.key2")) result = agent.file_exist?("#{cache_folder}/cached-custom-facts") assert_equal(true, result) cat_output = agent.cat("#{cache_folder}/cached-custom-facts") assert_match( cached_file_content.chomp, cat_output.strip, 'Expected cached custom fact file to contain fact information' ) end step 'resolves the fact' do on(agent, facter("--custom-dir=#{fact_dir} key1 --json")) do |facter_output| assert_equal( { 'key1' => { 'key2' => fact_1_value, 'key3' => fact_2_value } }, JSON.parse(facter_output.stdout.chomp) ) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/time_limit_for_execute_command.rb000066400000000000000000000030451470204764400324220ustar00rootroot00000000000000test_name 'Facter::Core::Execution accepts and correctly sets a time limit option' do tag 'risk:high' first_file_content = <<-EOM Facter.add(:foo) do setcode do Facter::Core::Execution.execute("sleep 3", {:timeout => 2, :on_fail => :not_raise}) end end EOM second_file_content = <<-EOM Facter.add(:custom_fact) do setcode do Facter::Core::Execution.execute("sleep 2", {:timeout => 1}) end end EOM agents.each do |agent| custom_dir = agent.tmpdir('arbitrary_dir') fact_file1 = File.join(custom_dir, 'file1.rb') fact_file2 = File.join(custom_dir, 'file2.rb') create_remote_file(agent, fact_file1, first_file_content) create_remote_file(agent, fact_file2, second_file_content) teardown do agent.rm_rf(custom_dir) end step "Facter: Logs that command of the first custom fact had timeout after setted time limit" do on(agent, facter('--custom-dir', custom_dir, 'foo --debug')) do |output| assert_match(/DEBUG Facter::Core::Execution.*Timeout encounter after 2s, killing process with pid:/, output.stderr.chomp) end end step "Facter: Logs an error stating that the command of the second custom fact had timeout" do on(agent, facter('--custom-dir', custom_dir, 'custom_fact --debug'), acceptable_exit_codes: [1]) do |output| assert_match(/ERROR\s+.*Failed while executing '.*sleep.*2': Timeout encounter after 1s, killing process/, output.stderr.chomp) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/using_win32ole_should_not_hang.rb000066400000000000000000000017561470204764400323110ustar00rootroot00000000000000test_name 'C92060: Custom facts should not hang Facter when using win32ole' do tag 'risk:high' confine :to, :platform => /windows/ require 'timeout' content = <<-EOM Facter.add('custom_fact_ole') do setcode do require 'win32ole' locator = WIN32OLE.new('WbemScripting.SWbemLocator') locator.ConnectServer('', "root/CIMV2", '', '', nil, nil, nil, nil).to_s end end EOM agents.each do |agent| custom_dir = agent.tmpdir('arbitrary_dir') custom_fact = File.join(custom_dir, 'custom_fact.rb') create_remote_file(agent, custom_fact, content) teardown do agent.rm_rf(custom_dir) end # Test is assumed to have hung if it takes longer than 5 seconds. Timeout::timeout(5) do on agent, facter('--custom-dir', custom_dir, 'custom_fact_ole') do |facter_result| assert_match(/#/, facter_result.stdout.chomp, 'Custom fact output does not match expected output') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/weighted_cached_custom_facts.rb000066400000000000000000000072031470204764400320410ustar00rootroot00000000000000test_name 'ttls configured weighted custom facts files creates cache file and reads cache file depending on weight' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils custom_fact_file = 'custom_facts.rb' duplicate_custom_fact_name = 'random_custom_fact' custom_fact_value = 'custom fact value with weight:' fact_content = <<-CUSTOM_FACT Facter.add(:#{duplicate_custom_fact_name}) do has_weight 90 setcode do "#{custom_fact_value} 90" end end Facter.add(:#{duplicate_custom_fact_name}) do has_weight 100 setcode do "#{custom_fact_value} 100" end end Facter.add(:#{duplicate_custom_fact_name}) do has_weight 110 setcode do "#{custom_fact_value} 110" end end CUSTOM_FACT cached_file_content_highest_weight = <<~CACHED_FILE { "#{duplicate_custom_fact_name}": "#{custom_fact_value} 110", "cache_format_version": 1 } CACHED_FILE config_data = <<~FACTER_CONF facts : { ttls : [ { "cached-custom-facts" : 3 days } ] } fact-groups : { cached-custom-facts : [ "#{duplicate_custom_fact_name}" ] } FACTER_CONF agents.each do |agent| cache_folder = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) fact_dir = agent.tmpdir('facter') env = { 'FACTERLIB' => fact_dir } config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') step "Agent #{agent}: create config file" do agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) fact_file = File.join(fact_dir, custom_fact_file) create_remote_file(agent, fact_file, fact_content) end teardown do agent.rm_rf(fact_dir) agent.rm_rf("#{cache_folder}/*") agent.rm_rf("#{config_dir}/facter.conf") end step "should log that it creates cache file and it caches custom facts found in facter.conf with the highest weight" do on(agent, facter("#{duplicate_custom_fact_name} --debug", environment: env)) do |facter_result| assert_equal(custom_fact_value + " 110", facter_result.stdout.chomp, "#{duplicate_custom_fact_name} value changed") assert_match(/facts cache file expired, missing or is corrupt/, facter_result.stderr, 'Expected debug message to state that custom facts cache file is missing or expired') assert_match(/Saving cached custom facts to ".+"|caching values for cached-custom-facts facts/, facter_result.stderr, 'Expected debug message to state that custom facts will be cached') end end step "should create a cached-custom-facts cache file that containt fact information from the highest weight fact" do result = agent.file_exist?("#{cache_folder}/cached-custom-facts") assert_equal(true, result) cat_output = agent.cat("#{cache_folder}/cached-custom-facts") assert_match(cached_file_content_highest_weight.chomp, cat_output.strip, 'Expected cached custom fact file to contain fact information from the highest weight fact') end step 'should read from the cached file for a custom fact that has been cached' do on(agent, facter("#{duplicate_custom_fact_name} --debug", environment: env)) do |facter_result| assert_match(/Loading cached custom facts from file ".+"|loading cached values for random_custom_fact facts/, facter_result.stderr, 'Expected debug message to state that cached custom facts are read from file') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/custom_facts/windows_not_expand_command.rb000066400000000000000000000015301470204764400316040ustar00rootroot00000000000000test_name 'FACT-2054: Execute on Windows with expand => false should raise an error' do tag 'risk:high' confine :to, :platform => /windows/ content = <<-EOM Facter.add(:foo) do setcode do Facter::Core::Execution.execute("cmd", {:expand => false}) end end EOM agents.each do |agent| fact_dir = agent.tmpdir('facter') fact_file = File.join(fact_dir, 'test_facts.rb') create_remote_file(agent, fact_file, content) env = {'FACTERLIB' => fact_dir} teardown do agent.rm_rf(fact_dir) end step "Agent: Verify that exception is raised" do on(agent, facter('foo', :environment => env), :acceptable_exit_codes => [0, 1]) do |output| assert_match(/Unsupported argument on Windows/, output.stderr, '{:expand => false} on Windows should raise error') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/env_fact.rb000066400000000000000000000015341470204764400232740ustar00rootroot00000000000000# frozen_string_literal: true test_name 'Can use environment facts' do step 'FACTER_ env fact is correctly resolved' do fact_name = 'env_name' fact_value = 'env_value' on(agent, facter(fact_name, environment: { "FACTER_#{fact_name}" => fact_value })) do |facter_output| assert_equal( fact_value, facter_output.stdout.chomp, 'Expected `FACTER_` to be resolved from environment' ) end end step 'FACTER_ env fact is correctly resolved when the fact name is upcased' do fact_name = 'env_name' fact_value = 'env_value' on(agent, facter(fact_name, environment: { "FACTER_#{fact_name.upcase}" => fact_value })) do |facter_output| assert_equal( fact_value, facter_output.stdout.chomp, 'Expected `FACTER_` to be resolved from environment' ) end end end puppetlabs-facter-dfe6df4/acceptance/tests/external_facts/000077500000000000000000000000001470204764400241615ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/external_facts/block_external_facts.rb000066400000000000000000000025641470204764400306710ustar00rootroot00000000000000test_name 'custom facts included in blocklist will not be displayed' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils agents.each do |agent| ext = get_external_fact_script_extension(agent['platform']) facts_dir = agent.tmpdir('facts.d') fact_file = File.join(facts_dir, "external_fact_1#{ext}") content = external_fact_content(agent['platform'], 'external_fact', 'external_value') config_dir = agent.tmpdir("config_dir") config_file = File.join(config_dir, "facter.conf") teardown do agent.rm_rf(facts_dir) end create_remote_file(agent, config_file, <<-FILE) facts : { blocklist : [ "external_fact_1#{ext}" ] } FILE step "Agent #{agent}: setup default external facts directory and fact" do agent.mkdir_p(facts_dir) create_remote_file(agent, fact_file, content) agent.chmod('+x', fact_file) end step "agent #{agent}: resolve the external fact" do on(agent, facter("--debug --external-dir \"#{facts_dir}\" --config \"#{config_file}\"")) do |facter_output| assert_match(/External fact file external_fact_1#{ext} blocked./, facter_output.stderr.chomp, 'Expected to block the external_fact') refute_match(/external_fact => external_value/, facter_output.stdout, 'Expected fact not to match fact') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/external_facts/env_var_overrides_external_fact.rb000066400000000000000000000032131470204764400331260ustar00rootroot00000000000000test_name 'C100537: FACTER_ env var should override external fact' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils agents.each do |agent| fact_name = 'external_fact' fact_value = 'from_script' override_value = 'override_fact' external_dir = agent.tmpdir('facts.d') fact_file = File.join(external_dir, "#{fact_name}#{get_external_fact_script_extension(agent['platform'])}") teardown do agent.rm_rf(external_dir) end step "Agent #{agent}: setup external fact" do agent.mkdir_p(external_dir) create_remote_file(agent, fact_file, external_fact_content(agent['platform'], fact_name, fact_value)) agent.chmod('+x', fact_file) end step "Agent: #{agent}: ensure external fact resolves correctly" do on(agent, facter("--external-dir \"#{external_dir}\" #{fact_name}")) do |facter_output| assert_equal(fact_value, facter_output.stdout.chomp, 'Expected external fact to resolve as defined in script') end end step "Agent #{agent}: the fact value from FACTER_ env var should override the external fact value" do on(agent, facter("--external-dir \"#{external_dir}\" #{fact_name}", :environment => { "FACTER_#{fact_name}" => override_value })) do |facter_output| assert_equal(override_value, facter_output.stdout.chomp, 'Expected `FACTER_` fact value to override external fact') end end end end external_dir_overrides_default_external_fact.rb000066400000000000000000000030141470204764400355720ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/external_factstest_name "C100154: --external-dir fact overrides fact in default facts.d directory" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils agents.each do |agent| os_version = on(agent, facter('kernelmajversion')).stdout.chomp.to_f ext = get_external_fact_script_extension(agent['platform']) factsd = get_factsd_dir(agent['platform'], os_version) external_dir = agent.tmpdir('facts.d') fact_file = File.join(factsd, "external_fact#{ext}") content = external_fact_content(agent['platform'], 'external_fact', 'value') override_fact_file = File.join(external_dir, "external_fact#{ext}") override_content = external_fact_content(agent['platform'], 'external_fact', 'OVERRIDE_value') teardown do agent.rm_rf(fact_file) agent.rm_rf(override_fact_file) end step "Agent #{agent}: setup default external facts directories and the test facts" do agent.mkdir_p(factsd) create_remote_file(agent, fact_file, content) create_remote_file(agent, override_fact_file, override_content) agent.chmod('+x', fact_file) agent.chmod('+x', override_fact_file) end step "Agent #{agent}: the fact value from the custom external dir should override that of facts.d" do on(agent, facter("--external-dir \"#{external_dir}\" external_fact")) do |facter_output| assert_equal('OVERRIDE_value', facter_output.stdout.chomp, 'Expected to resolve override version of the external_fact') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/external_facts/external_fact_overrides_custom_fact.rb000066400000000000000000000016201470204764400337750ustar00rootroot00000000000000test_name "C100150: external fact overrides custom fact without a weight" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils fact_name = 'test' # Use a static external fact ext_fact = "#{fact_name}: 'EXTERNAL'" agents.each do |agent| facts_dir = agent.tmpdir('facts.d') ext_fact_path = "#{facts_dir}/test.yaml" cust_fact_path = "#{facts_dir}/test.rb" create_remote_file(agent, cust_fact_path, custom_fact_content(fact_name, 'CUSTOM')) create_remote_file(agent, ext_fact_path, ext_fact) teardown do agent.rm_rf(facts_dir) end step "Agent #{agent}: resolve an external fact over a custom fact" do on(agent, facter("--external-dir \"#{facts_dir}\" --custom-dir=#{facts_dir} #{fact_name}")) do |facter_output| assert_equal("EXTERNAL", facter_output.stdout.chomp) end end end end external_fact_overrides_custom_fact_with_10000_weight_or_less.rb000066400000000000000000000020351470204764400405670ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/external_factstest_name "C100151: external fact overrides a custom fact of weight 10000 or less" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils fact_name = 'test' # Use a static external fact ext_fact = "#{fact_name}: 'EXTERNAL'" agents.each do |agent| facts_dir = agent.tmpdir('facts.d') ext_fact_path = "#{facts_dir}/test.yaml" cust_fact_path = "#{facts_dir}/test.rb" create_remote_file(agent, ext_fact_path, ext_fact) create_remote_file(agent, cust_fact_path, custom_fact_content(fact_name, 'CUSTOM', "has_weight 10000")) teardown do agent.rm_rf(facts_dir) end # Custom fact with weight <= 10000 should give precedence to the EXTERNAL fact step "Agent #{agent}: resolve an external fact over the custom fact with a weight of 10000" do on(agent, facter("--external-dir \"#{facts_dir}\" --custom-dir \"#{facts_dir}\" #{fact_name}")) do |facter_output| assert_equal("EXTERNAL", facter_output.stdout.chomp) end end end end external_fact_overrides_custom_fact_with_confine.rb000066400000000000000000000022531470204764400364550ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/external_factstest_name "C100152: external fact overrides a custom fact with a confine" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils fact_name = "test" # Use a static external fact ext_fact = "#{fact_name}: 'EXTERNAL'" agents.each do |agent| # Shared directory for external and custom facts facts_dir = agent.tmpdir('facts.d') ext_fact_path = "#{facts_dir}/test.yaml" cust_fact_path = "#{facts_dir}/test.rb" create_remote_file(agent, ext_fact_path, ext_fact) agent_kernel = on(agent, facter('kernel')).stdout.chomp create_remote_file(agent, cust_fact_path, custom_fact_content(fact_name, 'CUSTOM', "confine :kernel=>'#{agent_kernel}'")) teardown do agent.rm_rf(facts_dir) end # External fact should take precedence over a custom fact with a confine # (from FACT-1413) step "Agent #{agent}: resolve external fact over a custom fact with a confine" do on(agent, facter("--external-dir \"#{facts_dir}\" --custom-dir \"#{facts_dir}\" test")) do |facter_output| assert_equal("EXTERNAL", facter_output.stdout.chomp) end end end end external_fact_stderr_messages_output_to_stderr.rb000066400000000000000000000031041470204764400362230ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/external_factstest_name "C64315: external facts that print messages to stderr should be seen on stderr" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils agents.each do |agent| factsd = get_factsd_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) ext = get_external_fact_script_extension(agent['platform']) ext_fact = File.join(factsd, "external_fact#{ext}") if agent['platform'] =~ /windows/ content = <&2 echo "test=value" EOM else content = <&2 echo "test=value" EOM end teardown do agent.rm_rf(ext_fact) end step "Agent #{agent}: create facts.d directory and fact" do agent.mkdir_p(factsd) create_remote_file(agent, ext_fact, content) agent.chmod('+x', ext_fact) end step "Agent #{agent}: external fact stderr messages should appear on stderr from facter" do on(agent, facter) do |facter_output| assert_match(/WARN.*SCRIPT STDERR/, facter_output.stderr, "Expected facter to output a warning message with the stderr string from the external fact") end end step "Agent #{agent}: external fact stderr messages should appear on stderr from puppet facts" do on(agent, puppet("facts")) do |puppet_output| assert_match(/Warning.*SCRIPT STDERR/, puppet_output.stderr, "Expected puppet facts to output a warning message with the stderr string from the external fact") end end end end puppetlabs-facter-dfe6df4/acceptance/tests/external_facts/external_facts_only_run_once.rb000066400000000000000000000022751470204764400324470ustar00rootroot00000000000000test_name "C14892: external facts should only be run once" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils agents.each do |agent| factsd = get_factsd_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) ext = get_external_fact_script_extension(agent['platform']) ext_fact = File.join(factsd, "external_fact#{ext}") if agent['platform'] =~ /windows/ content = <&2 echo "test=value" EOM else content = <&2 echo "test=value" EOM end teardown do agent.rm_rf(ext_fact) end step "Agent #{agent}: create facts.d directory and fact" do agent.mkdir_p(factsd) create_remote_file(agent, ext_fact, content) agent.chmod('+x', ext_fact) end step "Agent #{agent}: ensure the fact is only executed once" do on(agent, facter) do |facter_output| lines = facter_output.stderr.split('\n') times = lines.count { |line| line =~ /SCRIPT CALLED/ } assert_equal(1, times, "External fact should only execute once: #{facter_output.stderr}") end end end end puppetlabs-facter-dfe6df4/acceptance/tests/external_facts/fact_directory_precedence.rb000066400000000000000000000113051470204764400316640ustar00rootroot00000000000000# Verify that facter uses the new AIO default paths for external facts # # On Unix/Linux/OS X, there are three directories: # /opt/puppetlabs/facter/facts.d/ # /etc/puppetlabs/facter/facts.d/ # /etc/facter/facts.d/ test_name "C59201: Fact directory precedence and resolution order for facts" do tag 'risk:high' confine :except, :platform => 'windows' # windows only supports 1 directory instead of 3 on unix require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils # Generate an external fact dynamically def ext_fact(value='BASIC') "test: '#{value}'" end agents.each do |agent| # The directories that facter processes facts os_version = on(agent, facter('kernelmajversion')).stdout.chomp.to_f factsd_dir = get_factsd_dir(agent['platform'], os_version) etc_factsd_dir = get_etc_factsd_dir(agent['platform']) etc_puppetlabs_factsd_dir = get_etc_puppetlabs_factsd_dir(agent['platform']) factsd_path = "#{factsd_dir}/test.yaml" etc_factsd_path = "#{etc_factsd_dir}/test.yaml" etc_puppetlabs_factsd_path = "#{etc_puppetlabs_factsd_dir}/test.yaml" teardown do agent.rm_rf(factsd_dir) agent.rm_rf(etc_factsd_dir) agent.rm_rf(etc_puppetlabs_factsd_dir) end # ensure the fact directory we want to use exists step "Agent #{agent}: create facts directory (#{etc_puppetlabs_factsd_dir})" do agent.rm_rf(etc_puppetlabs_factsd_dir) agent.mkdir_p(etc_puppetlabs_factsd_dir) end # A fact in the etc_puppetlabs_factsd_dir directory should resolve to the fact step "Agent #{agent}: create and resolve a custom fact in #{etc_puppetlabs_factsd_dir}" do create_remote_file(agent, etc_puppetlabs_factsd_path, ext_fact('etc_puppetlabs_path')) on(agent, facter("test")) do |facter_output| assert_match(/etc_puppetlabs_path/, facter_output.stdout, "Fact from #{etc_puppetlabs_factsd_dir} did not resolve correctly") end end # remove the fact step "Agent #{agent}: remove the fact in #{etc_puppetlabs_factsd_dir}" do agent.rm_rf(etc_puppetlabs_factsd_path) end # ensure the fact directory we want to use exists step "Agent #{agent}: create facts directory (#{etc_factsd_dir})" do agent.rm_rf(etc_factsd_dir) agent.mkdir_p(etc_factsd_dir) end # A fact in the etc_factsd_dir directory should resolve to the fact step "Agent #{agent}: create and resolve a custom fact in #{etc_factsd_dir}" do create_remote_file(agent, etc_factsd_path, ext_fact('etc_path')) on(agent, facter("test")) do |facter_output| assert_match(/etc_path/, facter_output.stdout, "Fact from #{etc_factsd_dir} did not resolve correctly") end end # remove the fact step "Agent #{agent}: remove the fact in #{etc_factsd_dir}" do agent.rm_rf(etc_factsd_path) end # ensure the fact directory we want to use exists step "Agent #{agent}: create facts directory (#{factsd_dir})" do agent.rm_rf(factsd_dir) agent.mkdir_p(factsd_dir) end # A fact in the factsd_dir directory should resolve to the fact step "Agent #{agent}: create and resolve a custom fact in #{factsd_dir}" do create_remote_file(agent, factsd_path, ext_fact('default_factsd')) on(agent, facter("test")) do |facter_output| assert_match(/default_factsd/, facter_output.stdout, "Fact from #{factsd_dir} did not resolve correctly") end end # remove the fact step "Agent #{agent}: remove the fact in #{factsd_dir}" do agent.rm_rf(factsd_path) end # A fact in the etc_factsd_dir directory should take precedence over the same fact in factsd_dir step "Agent #{agent}: create and resolve 2 facts of the same name between #{factsd_dir} and #{etc_factsd_dir}" do create_remote_file(agent, factsd_path, ext_fact('BASE')) create_remote_file(agent, etc_factsd_path, ext_fact('ETC_FACTS')) on(agent, facter("test")) do |facter_output| assert_match(/ETC_FACTS/, facter_output.stdout, "Fact from #{etc_factsd_dir} should take precedence over #{factsd_dir}") end end # A fact in the etc_puppetlabs_factsd_dir should take precedence over the same fact in etc_factsd_dir step "Agent #{agent}: create and resolve 2 facts of the same name between #{etc_factsd_dir} and #{etc_puppetlabs_factsd_dir}" do create_remote_file(agent, etc_factsd_path, ext_fact('ETC_FACTS')) create_remote_file(agent, etc_puppetlabs_factsd_path, ext_fact('ETC_PUPPETLABS_FACTS')) on(agent, facter("test")) do |facter_output| assert_match(/ETC_PUPPETLABS_FACTS/, facter_output.stdout, "Fact from #{etc_puppetlabs_factsd_dir} should take precedence over #{etc_factsd_dir}") end end end end files_containing_external_facts_are_loaded_in_lexicographical_order.rb000066400000000000000000000016531470204764400422670ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/external_factstest_name "FACT-2874: file containing external facts are loaded in lexicographical order" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils fact_name = 'test' # Use a static external fact ext_fact1 = "#{fact_name}: 'EXTERNAL1'" ext_fact2 = "#{fact_name}: 'EXTERNAL2'" agents.each do |agent| facts_dir = agent.tmpdir('facts.d') ext_fact_path1 = "#{facts_dir}/a_test.yaml" ext_fact_path2 = "#{facts_dir}/b_test.yaml" create_remote_file(agent, ext_fact_path1, ext_fact1) create_remote_file(agent, ext_fact_path2, ext_fact2) teardown do agent.rm_rf(facts_dir) end step "Agent #{agent}: resolve external fact with the last value it resolves to" do on(agent, facter("--external-dir \"#{facts_dir}\" #{fact_name}")) do |facter_output| assert_equal("EXTERNAL2", facter_output.stdout.chomp) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/external_facts/handle_same_filename_in_different_dirs.rb000066400000000000000000000050451470204764400343470ustar00rootroot00000000000000# Verify how facter handles same external facts filename in different directories: # # - in case ttl not enabled, will accept same filename in two external directories # - in case ttl enabled on filename, will throw error and exit 1 # test_name 'Should handle same filename in two external directories only if ttl is not enabled' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils agents.each do |agent| fact1 = 'fact1' fact2 = 'fact2' fact1_value = 'fact1_value' fact2_value = 'fact2_value' external_filename = 'text.yaml' external_dir1 = agent.tmpdir('external_dir1') external_fact_file1 = File.join(external_dir1, external_filename) external_dir2 = agent.tmpdir('external_dir2') external_fact_file2 = File.join(external_dir2, external_filename) create_remote_file(agent, external_fact_file1, "#{fact1}: #{fact1_value}") create_remote_file(agent, external_fact_file2, "#{fact2}: #{fact2_value}") config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') teardown do agent.rm_rf(external_dir1) agent.rm_rf(external_dir2) agent.rm_rf(config_file) end step 'works if ttl is not enabled' do on(agent, facter("--external-dir \"#{external_dir1}\" --external-dir \"#{external_dir2}\" --debug #{fact1} #{fact2}")) do |facter_output| assert_match(/#{fact1} => #{fact1_value}/, facter_output.stdout, 'Expected fact to match first fact') assert_match(/#{fact2} => #{fact2_value}/, facter_output.stdout, 'Expected fact to match second fact') end end step 'does not work if ttl is enabled' do config = < 1) do |facter_output| assert_match(/ERROR.*Caching is enabled for group "#{external_filename}" while there are at least two external facts files with the same filename/, facter_output.stderr, 'Expected error message') assert_match(/#{fact1} => #{fact1_value}/, facter_output.stdout, 'Expected fact to match first fact') refute_match(/#{fact2} => #{fact2_value}/, facter_output.stdout, 'Expected fact not to match second fact') end end end end non_root_users_default_external_fact_directory.rb000066400000000000000000000134401470204764400361760ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/external_facts# verify that facter run as a non-root user honor facts in the users home directory: # ~/.facter/facts.d # ~/.puppetlabs/opt/facter/facts.d test_name "C64580: Non-root default user external facts directory is searched for facts" do tag 'risk:high' confine :except, :platform => 'aix' # bug FACT-1586 confine :except, :platform => 'windows' # this test currently only supported on unix systems FACT-1647 confine :except, :platform => 'osx' # does not support managehome confine :except, :platform => 'solaris' # does not work with managehome on solaris boxes confine :except, :platform => 'eos-' # does not support user creation ARISTA-37 require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils # Generate an external fact dynamically def ext_user_fact(value='BASIC') "test: '#{value}'" end # Retrieve a specific user's home directory $HOME/.facter # def get_user_facter_dir(user_home, platform) File.join(user_home, '.facter') end # Retrieve a specific user's home facts directory $HOME/.facter/facts.d # def get_user_facts_dir(user_home, platform) File.join(get_user_facter_dir(user_home, platform), 'facts.d') end # Retreive a specific user's home puppetlabs directory $HOME/.puppetlabs # def get_user_puppetlabs_dir(user_home, platform) File.join(user_home, '.puppetlabs') end # Retreive a specific user's home puppetlabs facts directory $HOME/.puppetlabs/opt/facter/facts.d # def get_user_puppetlabs_facts_dir(user_home, platform) File.join(get_user_puppetlabs_dir(user_home, platform), 'opt', 'facter', 'facts.d') end # retrieve the user's home directory for a host and user # def get_home_dir(host, user_name) home_dir = nil on host, puppet_resource('user', user_name) do |result| home_dir = result.stdout.match(/home\s*=>\s*'([^']+)'/m)[1] end home_dir end agents.each do |agent| non_root_user = "nonroot" step "Agent #{agent}: create a #{non_root_user} to run facter with" do on(agent, "puppet resource user #{non_root_user} ensure=present managehome=true shell='#{user_shell(agent)}'") end user_home = get_home_dir(agent, non_root_user) # The directories that facter processes facts for a user from user_base_facts_dir = get_user_facter_dir(user_home, agent['platform']) user_facts_dir = get_user_facts_dir(user_home, agent['platform']) user_facts_path = "#{user_facts_dir}/test.yaml" user_base_puppetlabs_dir = get_user_puppetlabs_dir(user_home, agent['platform']) user_puppetlabs_facts_dir = get_user_puppetlabs_facts_dir(user_home, agent['platform']) user_puppetlabs_facts_path = "#{user_puppetlabs_facts_dir}/test.yaml" step "Agent #{agent}: figure out facter program location" facter_path = agent.which('facter').chomp teardown do agent.rm_rf(user_base_facts_dir) agent.rm_rf(user_base_puppetlabs_dir) on(agent, puppet("resource user #{non_root_user} ensure=absent managehome=true")) end step "Agent #{agent}: create facts directory (#{user_facts_dir})" do agent.rm_rf(user_facts_dir) agent.mkdir_p(user_facts_dir) end step "Agent #{agent}: create and resolve a custom fact in #{user_facts_dir}" do create_remote_file(agent, user_facts_path, ext_user_fact('USER_TEST_FACTER')) end step "Agent #{agent}: chown and chmod the facts to the user #{non_root_user}" do agent.chown(non_root_user, user_base_facts_dir, true) agent.chmod('a+rx', user_base_facts_dir, true) end step "Agent #{agent}: run facter as #{non_root_user} and make sure we get the fact" do on(agent, %Q[su #{non_root_user} -c "'#{facter_path}' test"]) do |facter_result| assert_match(/USER_TEST_FACTER/, facter_result.stdout, "Fact from #{user_facts_dir} did not resolve correctly") end end step "Agent #{agent}: remove #{user_facts_path}" do agent.rm_rf(user_facts_path) end step "Agent #{agent}: create facts directory (#{user_puppetlabs_facts_dir})" do agent.rm_rf(user_puppetlabs_facts_dir) agent.mkdir_p(user_puppetlabs_facts_dir) end step "Agent #{agent}: create and resolve a custom fact in #{user_puppetlabs_facts_dir}" do create_remote_file(agent, user_puppetlabs_facts_path, ext_user_fact('USER_TEST_PUPPETLABS')) end step "Agent #{agent}: chown and chmod the facts to the user #{non_root_user}" do agent.chown(non_root_user, user_base_puppetlabs_dir, true) agent.chmod('a+rx', user_base_puppetlabs_dir, true) end step "Agent #{agent}: run facter as #{non_root_user} and make sure we get the fact" do on(agent, %Q[su #{non_root_user} -c "'#{facter_path}' test"]) do |facter_result| assert_match(/USER_TEST_PUPPETLABS/, facter_result.stdout, "Fact from #{user_puppetlabs_facts_dir} did not resolve correctly") end end step "Agent #{agent}: create and resolve a custom fact in #{user_puppetlabs_facts_dir}" do create_remote_file(agent, user_facts_path, ext_user_fact('USER_PRECEDENCE_FACTER')) create_remote_file(agent, user_puppetlabs_facts_path, ext_user_fact('USER_PRECEDENCE_PUPPETLABS')) end step "Agent #{agent}: chown and chmod the facts to the user #{non_root_user}" do agent.chown(non_root_user, user_base_facts_dir, true) agent.chown(non_root_user, user_base_puppetlabs_dir, true) agent.chmod('a+rx', user_base_facts_dir, true) agent.chmod('a+rx', user_base_puppetlabs_dir, true) end step "Agent #{agent}: run facter as #{non_root_user} and .facter will take precedence over .puppetlabs" do on(agent, %Q[su #{non_root_user} -c "'#{facter_path}' test"]) do |facter_result| assert_match(/USER_PRECEDENCE_FACTER/, facter_result.stdout, "Fact from #{user_puppetlabs_facts_dir} did not resolve correctly") end end end end puppetlabs-facter-dfe6df4/acceptance/tests/external_facts/root_uses_default_external_fact_dir.rb000066400000000000000000000024131470204764400337710ustar00rootroot00000000000000# facter resolves facts from the default facts.d directory # on Unix this can be 3 directories (See fact_directory_precedence.rb) # Unix - /opt/puppetlabs/facter/facts.d/ # Windows - C:\ProgramData\PuppetLabs\facter\facts.d\ test_name "C87571: facter resolves facts in the default facts.d directory" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils agents.each do |agent| os_version = on(agent, facter('kernelmajversion')).stdout.chomp.to_f ext = get_external_fact_script_extension(agent['platform']) factsd = get_factsd_dir(agent['platform'], os_version) fact_file = File.join(factsd, "external_fact_1#{ext}") content = external_fact_content(agent['platform'], 'external_fact', 'external_value') teardown do agent.rm_rf(fact_file) end step "Agent #{agent}: setup default external facts directory and fact" do agent.mkdir_p(factsd) create_remote_file(agent, fact_file, content) agent.chmod('+x', fact_file) end step "agent #{agent}: resolve the external fact" do on(agent, facter('external_fact')) do |facter_output| assert_equal('external_value', facter_output.stdout.chomp, 'Expected to resolve the external_fact') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/external_facts/structured/000077500000000000000000000000001470204764400263655ustar00rootroot00000000000000block_structured_external_fact.rb000066400000000000000000000031461470204764400351140ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/external_facts/structured# frozen_string_literal: true test_name 'strucutured external facts can be blocked' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils fact_1_name = 'key1.key2' fact_2_name = 'key1.key3' fact_1_value = 'test1' fact_2_value = 'test2' fact_1_content = "#{fact_1_name}=#{fact_1_value}" fact_2_content = "#{fact_2_name}=#{fact_2_value}" config_data = <<~HOCON facts : { blocklist : [ "#{fact_1_name}" ], } global : { force-dot-resolution : true } HOCON agents.each do |agent| config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) external_dir = agent.tmpdir('facts.d') agent.mkdir_p(external_dir) create_remote_file(agent, File.join(external_dir, 'fact_1.txt'), fact_1_content) create_remote_file(agent, File.join(external_dir, 'fact_2.txt'), fact_2_content) teardown do agent.rm_rf(external_dir) agent.rm_rf(config_dir) end step 'blocked structured external fact is not displayed' do on(agent, facter("--external-dir \"#{external_dir}\" key1.key2")) do |facter_output| assert_equal('', facter_output.stdout.chomp) end end step 'the remaining structured fact is displayed' do on(agent, facter("--external-dir \"#{external_dir}\" key1.key3")) do |facter_output| assert_equal(fact_2_value, facter_output.stdout.chomp) end end end end cached_structured_external_facts.rb000066400000000000000000000051001470204764400354040ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/external_facts/structured# frozen_string_literal: true test_name 'strucutured external facts can be cached' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils fact_1_name = 'key1.key2' fact_2_name = 'key1.key3' fact_1_value = 'test1' fact_2_value = 'test2' fact_1_content = "#{fact_1_name}=#{fact_1_value}" fact_2_content = "#{fact_2_name}=#{fact_2_value}" cached_file_1_content = <<~RUBY { "#{fact_1_name}": "#{fact_1_value}", "cache_format_version": 1 } RUBY cached_file_2_content = <<~RUBY { "#{fact_2_name}": "#{fact_2_value}", "cache_format_version": 1 } RUBY config_data = <<~HOCON facts : { ttls : [ { "fact_1.txt" : 3 days }, { "fact_2.txt" : 3 days } ] } global : { force-dot-resolution : true } HOCON agents.each do |agent| cache_folder = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) external_dir = agent.tmpdir('facts.d') agent.mkdir_p(external_dir) create_remote_file(agent, File.join(external_dir, 'fact_1.txt'), fact_1_content) create_remote_file(agent, File.join(external_dir, 'fact_2.txt'), fact_2_content) teardown do agent.rm_rf(external_dir) agent.rm_rf(config_dir) agent.rm_rf(cache_folder) end step 'creates a fact_1.txt and fact_2.txt cache file that contains fact information' do on(agent, facter("--external-dir \"#{external_dir}\" key1 --json")) do |facter_output| assert_equal( { 'key1' => { 'key2' => fact_1_value, 'key3' => fact_2_value } }, JSON.parse(facter_output.stdout.chomp) ) end assert_equal(true, agent.file_exist?("#{cache_folder}/fact_1.txt")) assert_equal(true, agent.file_exist?("#{cache_folder}/fact_2.txt")) assert_match( cached_file_1_content.chomp, agent.cat("#{cache_folder}/fact_1.txt").strip, 'Expected cached external fact file to contain fact information for fact_1' ) assert_match( cached_file_2_content.chomp, agent.cat("#{cache_folder}/fact_2.txt").strip, 'Expected cached external fact file to contain fact information for fact_2' ) end end end define_structured_external_fact.rb000066400000000000000000000026231470204764400352530ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/external_facts/structured# frozen_string_literal: true test_name 'external facts can be defined as structured' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils fact_name = 'key1.key2' fact_value = 'EXTERNAL' ext_fact_content = "#{fact_name}: '#{fact_value}'" config_data = <<~HOCON global : { force-dot-resolution : true } HOCON agents.each do |agent| config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) external_dir = agent.tmpdir('facts.d') agent.mkdir_p(external_dir) ext_fact_path = File.join(external_dir, 'test.yaml') create_remote_file(agent, ext_fact_path, ext_fact_content) teardown do agent.rm_rf(external_dir) agent.rm_rf(config_dir) end step 'resolve an external structured fact' do on(agent, facter("--external-dir \"#{external_dir}\" #{fact_name}")) do |facter_output| assert_equal(fact_value, facter_output.stdout.chomp) end on(agent, facter("--external-dir \"#{external_dir}\" key1 --json")) do |facter_output| assert_equal( { 'key1' => { 'key2' => fact_value } }, JSON.parse(facter_output.stdout.chomp) ) end end end end partial_cached_structured_external_facts.rb000066400000000000000000000047701470204764400371340ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/external_facts/structured# frozen_string_literal: true test_name 'strucutured external facts can be cached' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils fact_1_name = 'key1.key2' fact_2_name = 'key1.key3' fact_1_value = 'test1' fact_2_value = 'test2' fact_1_content = "#{fact_1_name}=#{fact_1_value}" fact_2_content = "#{fact_2_name}=#{fact_2_value}" cached_file_content = <<~RUBY { "#{fact_1_name}": "#{fact_1_value}", "cache_format_version": 1 } RUBY config_data = <<~HOCON facts : { ttls : [ { "fact_1.txt" : 3 days } ] } global : { force-dot-resolution : true } HOCON agents.each do |agent| cache_folder = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) external_dir = agent.tmpdir('facts.d') agent.mkdir_p(external_dir) create_remote_file(agent, File.join(external_dir, 'fact_1.txt'), fact_1_content) create_remote_file(agent, File.join(external_dir, 'fact_2.txt'), fact_2_content) teardown do agent.rm_rf(external_dir) agent.rm_rf(config_dir) agent.rm_rf(cache_folder) end step 'does not create cache for part of the fact that is not in ttls' do on(agent, facter("--external-dir \"#{external_dir}\" key1.key3")) assert_equal(false, agent.file_exist?("#{cache_folder}/fact_2.txt")) end step 'creates a fact_1.txt cache file that contains fact information' do on(agent, facter("--external-dir \"#{external_dir}\" key1.key2")) result = agent.file_exist?("#{cache_folder}/fact_1.txt") assert_equal(true, result) cat_output = agent.cat("#{cache_folder}/fact_1.txt") assert_match( cached_file_content.chomp, cat_output.strip, 'Expected cached custom fact file to contain fact information' ) end step 'resolves the entire fact' do on(agent, facter("--external-dir \"#{external_dir}\" key1 --json")) do |facter_output| assert_equal( { 'key1' => { 'key2' => fact_1_value, 'key3' => fact_2_value } }, JSON.parse(facter_output.stdout.chomp) ) end end end end structured_external_fact_override_part_structured_custom_fact.rb000066400000000000000000000034771470204764400435510ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/external_facts/structured# frozen_string_literal: true test_name 'external facts override parts of custom_facts' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils ext_fact_name = 'key1.key2' ext_fact_value = 'EXTERNAL' ext_fact_content = "#{ext_fact_name}: '#{ext_fact_value}'" custom_fact_file = 'custom_fact.rb' fact_content = <<-RUBY Facter.add('ke1.key12') do setcode do "custom1" end end Facter.add('key1.key3') do setcode do "custom2" end end RUBY config_data = <<~HOCON global : { force-dot-resolution : true } HOCON agents.each do |agent| config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) external_dir = agent.tmpdir('facts.d') agent.mkdir_p(external_dir) ext_fact_path = File.join(external_dir, 'test.yaml') create_remote_file(agent, ext_fact_path, ext_fact_content) custom_facts_dir = agent.tmpdir('custom_facts') custom_fact_file = File.join(custom_facts_dir, custom_fact_file) create_remote_file(agent, custom_fact_file, fact_content) teardown do agent.rm_rf(external_dir) agent.rm_rf(config_dir) agent.rm_rf(custom_facts_dir) end step 'overwtites part of the custom fact' do on( agent, facter("--external-dir \"#{external_dir}\" --custom-dir \"#{custom_facts_dir}\" key1 --json") ) do |facter_output| assert_equal( { 'key1' => { 'key2' => ext_fact_value, 'key3' => 'custom2' } }, JSON.parse(facter_output.stdout.chomp) ) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/external_facts/structured_executable_facts.rb000066400000000000000000000074411470204764400323010ustar00rootroot00000000000000# This test is intended to demonstrate that executable external facts can return # YAML or JSON data, in addition to plain key-value pairs. If the output cannot be # parsed as YAML, it will fall back to key-value pair parsing, and only fail if # this is also invalid. test_name "executable external facts can return structured data" do require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils unix_fact_yaml = < 1 } EOM kv_output = 'one' agents.each do |agent| os_version = on(agent, facter('kernelmajversion')).stdout.chomp.to_f factsd = get_factsd_dir(agent['platform'], os_version) ext = get_external_fact_script_extension(agent['platform']) if agent['platform'] =~ /windows/ yaml_content = win_fact_yaml json_content = win_fact_json kv_content = win_fact_kv bad_fact_content = win_fact_bad else yaml_content = unix_fact_yaml json_content = unix_fact_json kv_content = unix_fact_kv bad_fact_content = unix_fact_bad end step "Agent #{agent}: setup default external facts directory (facts.d)" do agent.mkdir_p(factsd) end teardown do agent.rm_rf(factsd) end step "Agent #{agent}: create an executable yaml fact in default facts.d" do yaml_fact = File.join(factsd, "yaml_fact#{ext}") create_remote_file(agent, yaml_fact, yaml_content) agent.chmod('+x', yaml_fact) step "YAML output should produce a structured fact" do on(agent, facter("yaml_fact")) do |facter_output| assert_match(/#{yaml_structured_output}/, facter_output.stdout, "Expected properly structured fact") end end end step "Agent #{agent}: create an executable json fact in default facts.d" do json_fact = File.join(factsd, "json_fact#{ext}") create_remote_file(agent, json_fact, json_content) agent.chmod('+x', json_fact) step "JSON output should produce a structured fact" do on(agent, facter("json_fact")) do |facter_output| assert_match(/#{json_structured_output}/, facter_output.stdout, "Expected properly structured fact") end end end step "Agent #{agent}: create an executable key-value fact in default facts.d" do kv_fact = File.join(factsd, "kv_fact#{ext}") create_remote_file(agent, kv_fact, kv_content) agent.chmod('+x', kv_fact) step "output that is neither yaml nor json should not produce a structured fact" do on(agent, facter("kv_fact")) do |facter_output| assert_match(/#{kv_output}/, facter_output.stdout, "Expected a simple key-value fact") end end end step "Agent #{agent}: create a malformed executable fact in default facts.d" do bad_fact = File.join(factsd, "bad_fact#{ext}") create_remote_file(agent, bad_fact, bad_fact_content) agent.chmod('+x', bad_fact) step "should error when output is not in a supported format" do on(agent, facter("bad_fact --debug")) do |facter_output| assert_match(/Could not parse executable fact/, facter_output.stderr, "Expected parsing the malformed fact to fail") end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/facter_flush.rb000066400000000000000000000022721470204764400241540ustar00rootroot00000000000000test_name 'facter should flush fact values' do tag 'risk:high' fact_content1 = <<-EOM require 'facter' Facter.add(:fact1) do 'this should be flushed' end Facter.flush puts "Fact1: \#\{Facter.value(:fact1)\}" EOM fact_content2 = <<-EOM require 'facter' Facter.add(:fact2) do on_flush do puts 'before flush' end end Facter.flush EOM agents.each do |agent| fact_dir = agent.tmpdir('test_scripts') script_path1 = File.join(fact_dir, 'flush_test1.rb') script_path2 = File.join(fact_dir, 'flush_test2.rb') create_remote_file(agent, script_path1, fact_content1) create_remote_file(agent, script_path2, fact_content2) teardown do agent.rm_rf(script_path1) agent.rm_rf(script_path2) end step 'fact value has been flushed' do on(agent, "#{ruby_command(agent)} #{script_path1}") do |ruby_result| assert_equal('Fact1: ', ruby_result.stdout.chomp) end end step 'prints on_flush block gets called' do on(agent, "#{ruby_command(agent)} #{script_path2}") do |ruby_result| assert_equal('before flush', ruby_result.stdout.chomp) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/facter_load_external.rb000066400000000000000000000037311470204764400256550ustar00rootroot00000000000000test_name "Facter should not display external facts when 'load_external' method is called with false" do tag 'risk:high' confine :except, :platform => 'windows' require 'facter/acceptance/user_fact_utils' require "puppet/acceptance/common_utils" extend Facter::Acceptance::UserFactUtils script_contents1 = <<-NO_EXTERNAL require 'facter' Facter.load_external(false) output = Facter.to_hash exit output["my_external_fact"] == nil NO_EXTERNAL script_contents2 = <<-WITH_EXTERNAL require 'facter' output = Facter.to_hash exit output["my_external_fact"] == nil WITH_EXTERNAL agents.each do |agent| factsd = get_factsd_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) ext = get_external_fact_script_extension(agent['platform']) ext_fact = File.join(factsd, "external_fact#{ext}") if agent['platform'] =~ /windows/ content = < 1) end step "Agent #{agent}: ensure that external fact is not displayed when load_external method was called with false" do on(agent, "#{ruby_command(agent)} #{script_name1}", :acceptable_exit_codes => 0) end end end puppetlabs-facter-dfe6df4/acceptance/tests/facter_returns_success_on_non_existent_fact.rb000066400000000000000000000005011470204764400325440ustar00rootroot00000000000000test_name 'C100160: facter exits with success when asked for a non-existent fact' do tag 'risk:high' agents.each do |agent| step 'facter should return exit code 0 for querying non-existing-fact without --strict flag' do on(agent, facter('non-existing-fact'), :acceptable_exit_codes => 0) end end end puppetlabs-facter-dfe6df4/acceptance/tests/facts/000077500000000000000000000000001470204764400222575ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/facts/dmi.rb000066400000000000000000000042171470204764400233610ustar00rootroot00000000000000test_name "C96148: verify dmi facts" do tag 'risk:high' confine :except, :platform => 'aix' # no dmi support confine :except, :platform => 'huawei' # no dmi support confine :except, :platform => 'osx' # no dmi support confine :except, :platform => 'sparc' # no dmi support confine :except, :platform => 'ppc64' # no dmi support on linux on powerpc require 'json' require 'facter/acceptance/base_fact_utils' extend Facter::Acceptance::BaseFactUtils agents.each do |agent| expected_facts = { 'dmi.manufacturer' => /\w+/, 'dmi.product.name' => /\w+/, 'dmi.product.uuid' => /[-0-9A-Fa-f]+/, } unless agent['platform'] =~ /windows/ expected_facts.merge!({'dmi.bios.release_date' => /\d+\/\d+\/\d+/, 'dmi.bios.vendor' => /\w+/, 'dmi.bios.version' => /(\d+|Google)/, 'dmi.chassis.type' => /\w+/, }) end ## gce does not set the dmi.chassis.asset_flag unless agent['platform'] =~ /windows|cisco|aarch64|el-|amazon-2023-x86_64/ || on(agent, facter('virtual')).stdout.chomp =~ /gce/ expected_facts.merge!({'dmi.chassis.asset_tag' => /\w+/}) end unless agent['platform'] =~ /cisco|aarch64|el-/ expected_facts.merge!({'dmi.product.serial_number' => /\w+/}) end unless agent['platform'] =~ /windows|cisco|solaris|aarch64|el-|amazon-2023-x86_64/ expected_facts.merge!({'dmi.board.asset_tag' => /\w+|/, 'dmi.board.manufacturer' => /\w+/, 'dmi.board.product' => /\w+/, 'dmi.board.serial_number' => /None|\w+/ }) end step("verify that dmi structured fact contains facts") do on(agent, facter("--json dmi")) do |facter_results| json_facts = JSON.parse(facter_results.stdout) expected_facts.each do |fact, value| actual_fact = json_result_fact_by_key_path(json_facts, fact) assert_match(value, actual_fact.to_s, "Incorrect fact pattern for '#{fact}'") end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/facts/facterversion.rb000066400000000000000000000005611470204764400254600ustar00rootroot00000000000000test_name "C15286: verify facterversion fact" do tag 'risk:high' agents.each do |agent| step("verify that fact facterversion is a version string") do on(agent, facter("facterversion")) do |facter_result| assert_match(/\d+\.\d+\.\d+/, facter_result.stdout.chomp, "Expected 'facterversion' fact to be a version string") end end end end puppetlabs-facter-dfe6df4/acceptance/tests/facts/identity.rb000066400000000000000000000034631470204764400244430ustar00rootroot00000000000000test_name 'C100202: Facter identity facts resolve on all platforms' do tag 'risk:high' require 'json' agents.each do |agent| step 'Ensure the identity fact resolves as expected' do if agent['platform'] =~ /windows/ # Regular expression to validate the username from facter in the form of '\' # Reference - https://msdn.microsoft.com/en-us/library/bb726984.aspx # - The domain name can be any character or empty # - Must contain a backslash between the domain and username # - Username must be at least one character and not contain the following charaters; " / \ [ ] : ; | = , + * ? < > expected_identity = { 'user' => /.*\\[^\\\/\"\[\]:|<>+=;,?*@]+$/, 'privileged' => 'true' } elsif agent['platform'] =~ /aix-/ expected_identity = { 'gid' => '0', 'group' => 'system', 'uid' => '0', 'user' => 'root', 'privileged' => 'true' } elsif agent['platform'] =~ /osx-/ expected_identity = { 'gid' => '0', 'group' => 'wheel', 'uid' => '0', 'user' => 'root', 'privileged' => 'true' } else expected_identity = { 'gid' => '0', 'group' => 'root', 'uid' => '0', 'user' => 'root', 'privileged' => 'true' } end on(agent, facter('--json')) do |facter_result| results = JSON.parse(facter_result.stdout) expected_identity.each do |fact, value| assert_match(value, results['identity'][fact].to_s, "Incorrect fact value for identity.#{fact}") end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/facts/mountpoints_fact.rb000066400000000000000000000006761470204764400262110ustar00rootroot00000000000000test_name '(FACT-1964) Facter mountpoints does not show rootfs as type for root directory' do confine :to, :platform => /el/ agents.each do |agent| step 'Ensure that mountpoints does not contain rootfs as type for root directory' do on(agent, facter("mountpoints")) do |facter_result| refute_match(/rootfs/, facter_result.stdout.chomp, "Expected mountpoint with rootfs type to not be present") end end end end puppetlabs-facter-dfe6df4/acceptance/tests/facts/networking_facts.rb000066400000000000000000000112221470204764400261510ustar00rootroot00000000000000test_name 'C59029: networking facts should be fully populated' do tag 'risk:high' # # This test is intended to ensure that networking facts resolve # as expected across supported platforms. # @ip_regex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ @netmask_regex = /^(((128|192|224|240|248|252|254)\.0\.0\.0)|(255\.(0|128|192|224|240|248|252|254)\.0\.0)|(255\.255\.(0|128|192|224|240|248|252|254)\.0)|(255\.255\.255\.(0|128|192|224|240|248|252|254|255)))$/ agents.each do |agent| expected_networking = { %w[networking dhcp] => agent['platform'] =~ /fedora-|el-8-|el-9-/ ? '' : @ip_regex, # https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/426 %w[networking ip] => @ip_regex, %w[networking ip6] => /[a-f0-9]+:+/, %w[networking mac] => /[a-f0-9]{2}:/, %w[networking mtu] => /\d+/, %w[networking netmask] => @netmask_regex, %w[networking netmask6] => /[a-f0-9]+:/, %w[networking network] => @ip_regex, %w[networking network6] => /([a-f0-9]+)?:([a-f0-9]+)?/, %w[networking scope6] => /link|host|site|global|compat/ } primary_interface = fact_on(agent, 'networking.primary') refute_empty(primary_interface) expected_bindings = { ['networking', 'interfaces', primary_interface, 'bindings', 0, 'address'] => @ip_regex, ['networking', 'interfaces', primary_interface, 'bindings', 0, 'netmask'] => @netmask_regex, ['networking', 'interfaces', primary_interface, 'bindings', 0, 'network'] => @ip_regex, ['networking', 'interfaces', primary_interface, 'bindings6', 0, 'address'] => /[a-f0-9:]+/, ['networking', 'interfaces', primary_interface, 'bindings6', 0, 'netmask'] => /[a-f0-9:]+/, ['networking', 'interfaces', primary_interface, 'bindings6', 0, 'network'] => /[a-f0-9:]+/, ['networking', 'interfaces', primary_interface, 'bindings6', 0, 'scope6'] => /link|host|site|global|compat/ } if agent['platform'] =~ /eos|solaris|aix|cisco/ #remove the invalid networking facts on eccentric platforms expected_networking.delete(%w[networking ip6]) expected_networking.delete(%w[networking netmask6]) expected_networking.delete(%w[networking network6]) expected_networking.delete(%w[networking scope6]) #remove invalid bindings for the primary networking interface eccentric platforms expected_bindings.delete(['networking', 'interfaces', primary_interface, 'bindings6', 0, 'address']) expected_bindings.delete(['networking', 'interfaces', primary_interface, 'bindings6', 0, 'netmask']) expected_bindings.delete(['networking', 'interfaces', primary_interface, 'bindings6', 0, 'network']) expected_bindings.delete(['networking', 'interfaces', primary_interface, 'bindings6', 0, 'scope6']) end if agent['platform'] =~ /aix|sparc|cisco|huawei|sles|s390x/ # some of our testing platforms do not use DHCP expected_networking.delete(%w[networking dhcp]) end if agent['platform'] =~ /cisco/ # Cisco main interface does not define netmask or network expected_networking.delete(%w[networking network]) expected_networking.delete(%w[networking netmask]) #remove invalid bindings for Cisco's primary networking interface expected_bindings.delete(['networking', 'interfaces', primary_interface, 'bindings', 0, 'netmask']) expected_bindings.delete(['networking', 'interfaces', primary_interface, 'bindings', 0, 'network']) end networking_facts = JSON.parse(on(agent, facter('networking --json')).stdout) step "Ensure the Networking fact resolves with reasonable values for at least one interface" do expected_networking.each do |fact_tokens, regex| assert_match(regex, networking_facts.dig(*fact_tokens).to_s) end end step "Ensure bindings for the primary networking interface are present" do expected_bindings.each do |fact_tokens, regex| assert_match(regex, networking_facts.dig(*fact_tokens).to_s) end end end # Verify that IP Address v6 and network v6 is retrieved correctly and does not contain the interface identifier agents.each do |agent| if agent['platform'] =~ /windows/ step "verify that ipaddress6 is retrieved correctly" do on(agent, facter('ipaddress6')) do |facter_result| assert_match(/^[a-fA-F0-9:]+$/, facter_result.stdout.chomp) end end step "verify that network6 is retrieved correctly" do on(agent, facter('network6')) do |facter_result| assert_match(/([a-fA-F0-9:]+)?:([a-fA-F0-9:]+)?$/, facter_result.stdout.chomp) end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/facts/networking_facts_with_secondary_ips.rb000066400000000000000000000063061470204764400321350ustar00rootroot00000000000000test_name 'networking facts with secondary ip' do tag 'risk:high' confine :except, :platform => 'windows' confine :except, :platform => 'aix' confine :except, :platform => 'osx' confine :except, :platform => 'solaris' # # This test is intended to ensure that networking facts resolve secondary ips # as expected across supported platforms. # @ip_regex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ @netmask_regex = /^(((128|192|224|240|248|252|254)\.0\.0\.0)|(255\.(0|128|192|224|240|248|252|254)\.0\.0)|(255\.255\.(0|128|192|224|240|248|252|254)\.0)|(255\.255\.255\.(0|128|192|224|240|248|252|254|255)))$/ def expected_interfaces(interface, count) expected_interfaces = {} (1..count).each do |index| expected_interfaces.merge!(expected_bindings(ip_name(interface, index), 1)) expected_interfaces.merge!( { ['networking', 'interfaces', "#{ip_name(interface, index)}", 'ip'] => @ip_regex, ['networking', 'interfaces', "#{ip_name(interface, index)}", 'netmask'] => @netmask_regex, ['networking', 'interfaces', "#{ip_name(interface, index)}", 'network'] => @ip_regex } ) end expected_interfaces end def expected_bindings(interface, count) expected_bindings = {} (1..count).each do |index| expected_bindings.merge!( { ['networking', 'interfaces', "#{interface}", 'bindings', index - 1, 'address'] => @ip_regex, ['networking', 'interfaces', "#{interface}", 'bindings', index - 1, 'netmask'] => @netmask_regex, ['networking', 'interfaces', "#{interface}", 'bindings', index - 1, 'network'] => @ip_regex } ) end expected_bindings end def ip_name(interface, index) "#{interface}:#{index}" end agents.each do |agent| interface = fact_on(agent, 'networking.primary') step "Add secondary ip without labels" do on(agent, "ip addr add 11.0.0.0/24 dev #{interface}") end step "Add two secondary ips with label" do on(agent, "ip addr add 11.0.0.1/24 dev #{interface} label #{ip_name(interface, 1)}") on(agent, "ip addr add 11.0.0.2/24 dev #{interface} label #{ip_name(interface, 2)}") end networking_facts = JSON.parse(on(agent, facter('networking --json')).stdout) step "Check labeled secondary interfaces are found" do expected_interfaces(interface, 2).each do |fact_tokens, regex| assert_match(regex, networking_facts.dig(*fact_tokens).to_s) end end step "Check unlabeled secondary interface is inside the bindings of the primary interface" do expected_bindings(interface, 2).each do |fact_tokens, regex| assert_match(regex, networking_facts.dig(*fact_tokens).to_s) end end teardown do on(agent, "ip addr del 11.0.0.0/24 dev #{interface}") # On Ubuntu 16, deleting the first secondary ip, deletes all of them. # Next commands may fail, because the ips they attempt to delete, no longer exist. on(agent, "ip addr del 11.0.0.1/24 dev #{interface}", :acceptable_exit_codes => [0, 2]) on(agent, "ip addr del 11.0.0.2/24 dev #{interface}", :acceptable_exit_codes => [0, 2]) end end end puppetlabs-facter-dfe6df4/acceptance/tests/facts/networking_facts_with_vlans.rb000066400000000000000000000070071470204764400304150ustar00rootroot00000000000000test_name 'networking facts with vlans' do tag 'risk:high' confine :except, :platform => 'windows' confine :except, :platform => 'aix' confine :except, :platform => 'osx' confine :except, :platform => 'solaris' skip_test "FACT-3482 skip test due to issue with ubuntu 2204 image" if hosts.any? { |host| host['platform'] =~ /ubuntu-22\.04/ } # # This test is intended to ensure that networking facts resolve vlans # as expected across supported platforms. # teardown do agents.each do |agent| interface = fact_on(agent, 'networking.primary') on(agent, "ip link delete #{vlan(interface, 1)}", accept_all_exit_codes: true) on(agent, "ip link delete #{vlan(interface, 2)}", accept_all_exit_codes: true) end end @ip_regex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ @netmask_regex = /^(((128|192|224|240|248|252|254)\.0\.0\.0)|(255\.(0|128|192|224|240|248|252|254)\.0\.0)|(255\.255\.(0|128|192|224|240|248|252|254)\.0)|(255\.255\.255\.(0|128|192|224|240|248|252|254)))$/ def vlan(interface, index) "#{interface}.#{index}" end def expected_bindings(interface, count) expected_bindings = {} (1..count).each do |index| expected_bindings.merge!( { ['networking', 'interfaces', vlan(interface, index).to_s, 'bindings', 0, 'address'] => @ip_regex, ['networking', 'interfaces', vlan(interface, index).to_s, 'bindings', 0, 'netmask'] => @netmask_regex, ['networking', 'interfaces', vlan(interface, index).to_s, 'bindings', 0, 'network'] => @ip_regex, %W[networking interfaces #{vlan(interface, index)} ip] => @ip_regex, %W[networking interfaces #{vlan(interface, index)} mac] => /[a-f0-9]{2}:/, %W[networking interfaces #{vlan(interface, index)} mtu] => /\d+/, %W[networking interfaces #{vlan(interface, index)} netmask] => @netmask_regex, %W[networking interfaces #{vlan(interface, index)} network] => @ip_regex } ) end expected_bindings end agents.each do |agent| operating_system = fact_on(agent, 'operatingsystem') release = fact_on(agent, 'operatingsystemrelease') if operating_system == 'Amazon' && release == '2017.03' skip_test 'Not able to create VLANs on Amazon 6' end interface = fact_on(agent, 'networking.primary') step "Add two vlans" do on(agent, "ip link add link #{interface} name #{vlan(interface, 1)} type vlan id 1") on(agent, "ip addr add 11.0.0.1/24 dev #{vlan(interface, 1)}") if on(agent, "ip address show #{vlan(interface, 1)} | grep inet[[:space:]]", acceptable_exit_codes: [0,1]).stdout.empty? @logger.warn("Attempted to update #{vlan(interface, 1)} but ipv4 address not found, outputting recent syslog and retrying.") on(agent, 'tail /var/log/syslog') on(agent, "ip addr add 11.0.0.1/24 dev #{vlan(interface, 1)}") fail_test("Unable to update ip address for #{vlan(interface, 1)}") if on(agent, "ip address show #{vlan(interface, 1)} | grep inet[[:space:]]").stdout.empty? end on(agent, "ip link add link #{interface} name #{vlan(interface, 2)} type vlan id 2") on(agent, "ip addr add 11.0.0.2/24 dev #{vlan(interface, 2)}") end step "Check vlans are found" do networking_facts = JSON.parse(on(agent, facter('networking --json')).stdout) expected_bindings(interface, 2).each do |fact_tokens, regex| assert_match(regex, networking_facts.dig(*fact_tokens).to_s) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/facts/nim_type.rb000066400000000000000000000004541470204764400244330ustar00rootroot00000000000000test_name "Test nim_type fact" do confine :to, :platform => /aix/ agents.each do |agent| step("verify that nim_type is retrieved correctly") do on(agent, facter("nim_type")) do |facter_result| assert_equal("standalone", facter_result.stdout.chomp) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/facts/non_root_users_without_errors.rb000066400000000000000000000030131470204764400310360ustar00rootroot00000000000000test_name "C59196: running facter as a non-root user should not produce permission errors" do tag 'risk:high' confine :except, :platform => 'windows' # this test currently only supported on unix systems FACT-1647 confine :except, :platform => 'aix' # system su(1) command prints errors cannot access parent directories and ticket FACT-1586 confine :except, :platform => 'cisco' # system su(1) command prints errors cannot access parent directories confine :except, :platform => 'osx' # system su(1) command prints errors cannot access parent directories confine :except, :platform => 'solaris' # system su(1) command prints errors cannot access parent directories confine :except, :platform => 'eos-' # does not support user creation ARISTA-37 require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils agents.each do |agent| non_root_user = "nonroot" facter_path = agent.which('facter').chomp step "Agent #{agent}: create a #{non_root_user} user to run facter with" do on(agent, "puppet resource user #{non_root_user} ensure=present shell='#{user_shell(agent)}'") end teardown do on(agent, puppet("resource user #{non_root_user} ensure=absent")) end step "Agent #{agent}: run facter as #{non_root_user} and get no errors" do on(agent, %Q[su #{non_root_user} -c "'#{facter_path}'"]) do |facter_results| assert_empty(facter_results.stderr.chomp, "Expected no errors from facter when run as user #{non_root_user}") end end end end puppetlabs-facter-dfe6df4/acceptance/tests/facts/operatingsystem_detection_after_clear_on_ubuntu.rb000066400000000000000000000013461470204764400345300ustar00rootroot00000000000000test_name 'C14891: Facter should properly detect operatingsystem on Ubuntu after a Facter.clear' do tag 'risk:high' confine :to, :platform => /ubuntu/ require "puppet/acceptance/common_utils" script_contents = <<-OS_DETECT require 'facter' Facter['operatingsystem'].value Facter.clear exit Facter['operatingsystem'].value == 'Ubuntu' OS_DETECT agents.each do |agent| script_dir = agent.tmpdir('ubuntu') script_name = File.join(script_dir, "facter_os_detection_test") create_remote_file(agent, script_name, script_contents) teardown do agent.rm_rf(script_dir) end on(agent, "#{Puppet::Acceptance::CommandUtils.ruby_command(agent)} #{script_name}", :acceptable_exit_codes => 0) end end puppetlabs-facter-dfe6df4/acceptance/tests/facts/os_processors_and_kernel.rb000066400000000000000000000013311470204764400276670ustar00rootroot00000000000000test_name 'C100193: Facter os, processors, and kernel facts resolve on all platforms' do tag 'risk:high' require 'json' require 'facter/acceptance/base_fact_utils' extend Facter::Acceptance::BaseFactUtils agents.each do |agent| step 'Ensure the os, processors, and kernel fact resolves as expected' do expected_facts = os_processors_and_kernel_expected_facts(agent) on(agent, facter('--json')) do |facter_result| results = JSON.parse(facter_result.stdout) expected_facts.each do |fact, value| actual_fact = json_result_fact_by_key_path(results, fact) assert_match(value, actual_fact.to_s, "Incorrect fact value for #{fact}") end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/facts/osx_numeric_hostname.rb000066400000000000000000000012421470204764400270340ustar00rootroot00000000000000test_name 'Querying the fqdn with a numeric hostname should not fail' do # calling getaddrinfo with a numeric value on OS X does not fill the # ai_canonname field of the addrinfo structure confine :to, :platform => /^osx-/ agents.each do |agent| original_hostname = agent.hostname.split('.').first numeric_hostname = 42 teardown do on(agent, "scutil --set HostName #{original_hostname}") end step "Change hostname from '#{original_hostname}' to '#{numeric_hostname}'" do on(agent, "scutil --set HostName #{numeric_hostname}") end step 'Verify fqdn fact does not fail' do on(agent, facter('fqdn')) end end end puppetlabs-facter-dfe6df4/acceptance/tests/facts/partitions.rb000066400000000000000000000026331470204764400250040ustar00rootroot00000000000000test_name "C96148: verify partitions facts" do tag 'risk:high' confine :except, :platform => 'osx' # no partitions on osx confine :except, :platform => 'windows' # no partitions on windows confine :except, :platform => 'solaris' # no partitions on solaris require 'json' possible_facts = [ ['backing_file', /^\/.*/], ['filesystem', /\w/], ['uuid', /^[-a-zA-Z0-9]+$/], ['partuuid', /^[-a-f0-9]+$/], ['mount', /^\/.*/], ['label', /.*/], ['partlabel', /\w+/], ] agents.each do |agent| step("verify that partitions contain facts") do on(agent, facter("--json partitions")) do |facter_output| facter_results = JSON.parse(facter_output.stdout) facter_results['partitions'].each_key do |partition_name| partition_facts = facter_results['partitions'][partition_name] assert_match(/\d+\.\d+ [TGMK]iB/, partition_facts['size'], "Expected partition '#{partition_name}' fact 'size' to match expression") assert(partition_facts['size_bytes'] >= 0, "Expected partition '#{partition_name}' fact 'size_bytes' to be positive") possible_facts.each do |fact, expression| unless partition_facts[fact].nil? assert_match(expression, partition_facts[fact], "Expected partition '#{partition_name}' fact '#{fact}' to match expression") end end end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/facts/productname.rb000066400000000000000000000007771470204764400251400ustar00rootroot00000000000000test_name "C89604: verify productname fact" do tag 'risk:high' confine :except, :platform => 'aix' # not supported on confine :except, :platform => 'huawei' # not supported on confine :except, :platform => 'ppc64' # not supported on linux on powerpc agents.each do |agent| step("verify the fact productname") do on(agent, facter("productname")) do |facter_result| assert_match(/\w+/, facter_result.stdout.chomp, "Expected fact 'productname' to be set") end end end end puppetlabs-facter-dfe6df4/acceptance/tests/facts/ruby.rb000066400000000000000000000051601470204764400235670ustar00rootroot00000000000000test_name "C100305: The Ruby fact should resolve as expected in AIO" do tag 'risk:high' # # This test is intended to ensure that the the ruby fact resolves # as expected in AIO across supported platforms. # skip_test "Ruby fact test is confined to AIO" if @options[:type] != 'aio' require 'json' require 'facter/acceptance/base_fact_utils' extend Facter::Acceptance::BaseFactUtils agents.each do |agent| step "Ensure the Ruby fact resolves as expected" do puppet_version = on(agent, puppet("--version")).stdout.chomp ruby_version = if puppet_version =~ /^7\./ /2\.\d+\.\d+/ else /3\.\d+\.\d+/ end case agent['platform'] when /windows/ ruby_platform = agent['ruby_arch'] == 'x64' ? 'x64-mingw32' : 'i386-mingw32' when /osx/ if agent['platform'] =~ /arm64/ if puppet_version =~ /^7\./ && agent['platform'].split('-')[1].to_i < 13 ruby_platform = /aarch64-darwin/ else ruby_platform = /arm64-darwin/ end else ruby_platform = /x86_64-darwin[\d.]+/ end when /aix/ ruby_platform = /powerpc-aix[\d.]+/ when /solaris/ if agent['platform'] =~ /sparc/ ruby_platform = /sparc-solaris[\d.]+/ else ruby_platform = /i386-solaris[\d.]+/ end when /cisco_ios_xr/ ruby_platform = /x86_64-linux/ when /huaweios/ ruby_platform = /powerpc-linux/ else if agent['ruby_arch'] ruby_platform = agent['ruby_arch'] == 'x64' ? /(x86_64|powerpc64le|aarch64)-linux/ : /(i486|i686|s390x)-linux/ else ruby_platform = agent['platform'] =~ /64/ ? /(x86_64|powerpc64le|aarch64)-linux/ : /(i486|i686|s390x)-linux/ end end has_sitedir = !on(agent, 'ruby -e"puts RbConfig::CONFIG[\'sitedir\']"').output.chomp.empty? expected_facts = { 'ruby.platform' => ruby_platform, 'ruby.version' => ruby_version } expected_facts['ruby.sitedir'] = /\/site_ruby/ if has_sitedir step("verify that ruby structured fact contains facts") do on(agent, facter("--json ruby")) do |facter_results| json_facts = JSON.parse(facter_results.stdout) expected_facts.each do |fact, value| actual_fact = json_result_fact_by_key_path(json_facts, fact) assert_match(value, actual_fact.to_s, "Incorrect fact pattern for '#{fact}'") end end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/facts/schema.rb000066400000000000000000000114151470204764400240460ustar00rootroot00000000000000test_name "Validate facter output conforms to schema" do tag 'risk:high' confine :except, :platform => 'windows' # See FACT-3479, once resolved this line can be removed confine :except, :platform => 'aix-7.3' # FACT-3481 for fixing these confine :except, :platform => 'ubuntu-22.04' # FACT-3481 confine :except, :platform => 'fedora-36' # FACT-3481 confine :except, :platform => 'el-8-ppc64le' # FACT-3481 require 'yaml' require 'ipaddr' # Validates passed in output facts correctly conform to the facter schema, facter.yaml. # @param schema_fact The schema fact that matches/corresponds with output_fact # @param schema_fact_value The fact value for the schema fact # @param output_fact The fact that is being validated # @param output_fact The fact value of the output_fact def validate_fact(schema_fact, schema_fact_value, output_fact, output_fact_value) schema_fact_type = schema_fact ? schema_fact_value["type"] : nil fail_test("Fact: #{output_fact} does not exist in schema") unless schema_fact_type # For each fact, it is validated by verifying that output_fact_value can # successfully parse to fact_type and the output fact has a matching schema # fact where both their types and name or regex match. case output_fact_value when Hash fact_type = "map" when Array fact_type = "array" when TrueClass, FalseClass fact_type = "boolean" when Float fact_type = "double" when Integer fact_type = "integer" when String if schema_fact_type == "ip" begin IPAddr.new(output_fact_value).ipv4? rescue IPAddr::Error fail_test("Invalid ipv4 value given for #{output_fact} with value #{output_fact_value}") else fact_type = "ip" end elsif schema_fact_type == "ip6" begin IPAddr.new(output_fact_value).ipv6? rescue IPAddr::Error fail_test("Invalid ipv6 value given for #{output_fact} with value #{output_fact_value}") else fact_type = "ip6" end elsif schema_fact_type == "mac" mac_regex = Regexp.new('^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$') fail_test("Invalid mac value given for #{output_fact} with value #{output_fact_value}") unless mac_regex.match?(output_fact_value) fact_type = "mac" else fact_type = "string" end else fail_test("Invalid fact type given: #{output_fact}") end # Recurse over facts that have more nested facts within it if fact_type == "map" if output_fact_value.is_a?(Hash) schema_elements = schema_fact_value["elements"] output_fact_value.each do |fact, value| if value.nil? || !schema_elements next # Sometimes facts with map as their type aren't nested facts, like # hypervisors and simply just a fact with a hash value. For these # cases, they don't need to be iterated over. end schema_fact, schema_fact_value = get_fact(schema_elements, fact) validate_fact(schema_fact, schema_fact_value, fact, value) end end end assert_match(fact_type, schema_fact_type, "#{output_fact} has value: #{output_fact_value} and type: #{fact_type} does not conform to schema fact value type: #{schema_fact_type}") end # @param fact_hash The hash being searched for the passed in fact_name # @param fact_name The fact that is being searched for # @return The fact that has the same name as fact_name, if found. If not found, nil is returned. def get_fact(fact_hash, fact_name) fact_hash.each_key do |fact| # Some facts, like disks., will have different names depending # on the machine its running on. For these facts, a pattern AKA a regex is # provided in the facter schema. fact_pattern = fact_hash[fact]["pattern"] fact_regex = fact_pattern ? Regexp.new(fact_pattern) : nil if (fact_pattern && fact_regex.match?(fact_name)) || fact_name == fact return fact, fact_hash[fact] end end return nil end step 'Validate fact collection conforms to schema' do agents.each do |agent| # Load schema to compare to output_facts schema_file = File.join(File.dirname(__FILE__), '../../../lib/schema/facter.yaml') schema = YAML.load_file(schema_file) on(agent, facter('--yaml --no-custom-facts --no-external-facts')) do |facter_output| #get facter output for each platform output_facts = YAML.load(facter_output.stdout) # validate facter output facts match facter schema output_facts.each do |fact, value| schema_fact, schema_fact_value = get_fact(schema, fact) validate_fact(schema_fact, schema_fact_value, fact, value) end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/facts/ssh_key.rb000066400000000000000000000041141470204764400242510ustar00rootroot00000000000000test_name 'SSH publick key' do confine :except, :platform => 'windows' confine :except, :platform => /solaris/ agents.each do |agent| ssh_host_rsa_key_file = '/etc/ssh/ssh_host_rsa_key.pub' ssh_tmp_host_rsa_key_file = '/tmp/ssh_host_rsa_key.pub' # The 'cp' might fail because the source file doesn't exist on( agent, "cp -fv #{ssh_host_rsa_key_file} #{ssh_tmp_host_rsa_key_file}", acceptable_exit_codes: [0, 1] ) key = 'AAAAB3NzaC1yc2EAAAADAQABAAABAQDi8n9KzzF4tPIZsohBuyxFrLnkT5YbahpIjHvQZbQ9OwG3pOxTcQJjtS/gGMKJeRE2uaHaWb700rGlfGzhit7198FmjCeYdYLZvTH0q76mN9Ew1a8aesE46JMAmZijfehxzmlbyyQDamB0wSv3CbcpGccQ3cp/jBnnj54q9EJuEN+YU/uWVHK9IgNOAj9n7l7ZKKiDAFYlhg22sWIwX+8EyoAp+ewItLpO1BJe+NcnLzMoh71Qfb2Gm/yDPbKt/3N6CHp6JeHNbbPCL0hPkcbMdc/1+3ZuzM0yqt/Sq+6lz1tQBOeDp7UqZNT0t2I5bu0NNMphpBIAELpb4f6uuZ25' rsa_pub_host_key_without_comment = 'ssh-rsa ' + key rsa_pub_host_key_with_comment = rsa_pub_host_key_without_comment + ' root@ciprian.badescu-pf1s74sr\n' teardown do # Is it present? rc = on( agent, "[ -e #{ssh_tmp_host_rsa_key_file} ]", accept_all_exit_codes: true, ) if rc.exit_code == 0 # It's present, so restore the original agent.mv(ssh_tmp_host_rsa_key_file, ssh_host_rsa_key_file) else # It's missing, which means there wasn't one to backup; just # delete the one we laid down agent.rm_rf(ssh_host_rsa_key_file) end end step 'SSH publick key with comment is printed' do on(agent, "echo '#{rsa_pub_host_key_with_comment}' > #{ssh_host_rsa_key_file}") on(agent, facter('ssh.rsa.key')) do |facter_output| assert_equal(key, facter_output.stdout.chomp, 'Expected debug to contain key only') end end step 'SSH publick key without comment is printed' do on(agent, "echo '#{rsa_pub_host_key_without_comment}' > #{ssh_host_rsa_key_file}") on(agent, facter('ssh.rsa.key')) do |facter_output| assert_equal(key, facter_output.stdout.chomp, 'Expected debug to contain key only') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/facts/validate_file_system_size_bytes.rb000066400000000000000000000030711470204764400312410ustar00rootroot00000000000000# This test verifies that the numbers for file systems sizes are positive from "facter" and "puppet facts" # This is a regression test for FACT-1578 test_name "C100110: verify that file system sizes are positive" do tag 'risk:high' confine :except, :platform => 'windows' # Windows does not list mount points as facts like Unix confine :to, :platform => /skip/ require 'json' agents.each do |agent| step("verify that facter returns positive numbers for the mount points byte fields") do on(agent, facter("--json")) do |facter_output| facter_results = JSON.parse(facter_output.stdout) facter_results['mountpoints'].each_key do |mount_key| ['available_bytes', 'size_bytes', 'used_bytes'].each do |sub_key| assert_operator(facter_results['mountpoints'][mount_key][sub_key], :>=, 0, "Expected the #{sub_key} from facter to be positive for #{mount_key}") end end end end step("verify that puppet facts returns positive numbers for the mount points byte fields") do on(agent, puppet("facts --render-as json")) do |puppet_facts| puppet_results = JSON.parse(puppet_facts.stdout) puppet_results['mountpoints'].each_key do |mount_key| ['available_bytes', 'size_bytes', 'used_bytes'].each do |sub_key| assert_operator(puppet_results['mountpoints'][mount_key][sub_key], :>=, 0, "Expected the #{sub_key} from puppet facts to be positive for #{mount_key}") end end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/facts/verify_tmpfs_file_system.rb000066400000000000000000000041621470204764400277270ustar00rootroot00000000000000# This test is intended to demonstrate that mount resource can mount tmpfs file systems # and the mount facter mountpoints should show the mount as tmpfs test_name 'C98163: mountpoints fact should show mounts on tmpfs' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils confine :except, :platform => 'windows' confine :except, :platform => /osx/ # See PUP-4823 confine :except, :platform => /solaris/ # See PUP-5201 confine :except, :platform => /aix/ # See PUP-6845 confine :except, :platform => /^eos-/ # Mount provider not supported on Arista EOS switches confine :except, :platform => /^cisco_/ # See PUP-5826 confine :except, :platform => /^huawei/ # See PUP-6126 agents.each do |agent| mount_point = '/tmp/mountdir' manifest_dir = agent.tmpdir('tmpfs') manifest = File.join(manifest_dir, 'mount_manifest.pp') manifest_content = <<-FILE mount {"#{mount_point}": ensure => mounted, options => 'noexec', fstype => 'tmpfs', device => 'tmpfs', atboot => true, } FILE agent.mkdir_p(mount_point) create_remote_file(agent, manifest, manifest_content) teardown do on(agent, "umount #{mount_point}") agent.rm_rf(mount_point) agent.rm_rf(manifest_dir) end step "Apply the manifest to mount directory '#{mount_point}'" do on(agent, puppet("apply #{manifest}"), :acceptable_exit_codes => [0,2]) do |puppet_apply| refute_match(/Error/, puppet_apply.stdout, 'Unexpected error on stdout was detected!') refute_match(/ERROR/, puppet_apply.stderr, 'Unexpected error on stderr was detected!') end end step 'verify tmpfs mount point seen by facter' do on(agent, facter("mountpoints.#{mount_point}")) do |facter_output| assert_match(/filesystem\s+=>\s+\"tmpfs\"/, facter_output.stdout, 'filesystem is the wrong type') assert_match(/device\s+=>\s+\"tmpfs\"/, facter_output.stdout, 'device is not a tmpfs') assert_match(/noexec/, facter_output.stdout, 'expected to see noexec option') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/facts/windows_os.rb000066400000000000000000000060741470204764400250060ustar00rootroot00000000000000test_name "Test facter os reports correct os.windows.system32" do # disable this test until changes in beaker # https://tickets.puppetlabs.com/browse/BKR-1627 # will allow this test to run in timely manner confine :to, :platform => /no-platform/ # confine :to, :platform => /windows/ # confine :except, :platform => /2008/ agents.each do |agent| os_type = on(agent, powershell("facter os.windows.installation_type")).stdout.chomp domain_firewall_state = on(agent, powershell("'(Get-NetFirewallProfile -Profile Domain).Enabled'")).stdout.chomp public_firewall_state = on(agent, powershell("'(Get-NetFirewallProfile -Profile Public).Enabled'")).stdout.chomp private_firewall_state = on(agent, powershell("'(Get-NetFirewallProfile -Profile Private).Enabled'")).stdout.chomp on(agent, powershell("'Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False'")) teardown do if os_type == "Server" && on(agent, powershell("'Import-module servermanager ; (Get-WindowsFeature -name RDS-RD-Server).Installed'")).stdout.chomp == "True" on(agent, powershell("'Import-module servermanager ; Remove-WindowsFeature –Name RDS-RD-Server'")) agent.reboot begin agent.down? rescue #TODO: Handle restart pending puts 'Assuming that restart was not caught' end agent.wait_for_port(3389) agent.wait_for_port(22) on(agent, powershell("Set-NetFirewallProfile -Profile Domain -Enabled #{domain_firewall_state}")) on(agent, powershell("Set-NetFirewallProfile -Profile Public -Enabled #{public_firewall_state}")) on(agent, powershell("Set-NetFirewallProfile -Profile Private -Enabled #{private_firewall_state}")) end end step "Install Windows remote desktop feature" do if os_type == "Server" on(agent, powershell("facter os.windows.system32")) do |facter_before_output| assert_equal("C:\\Windows\\system32", facter_before_output.stdout.chomp, 'Before windows feature installation, should be C:\\Windows\\system32') end on(agent, powershell("Add-WindowsFeature –Name RDS-RD-Server –IncludeAllSubFeature")) on(agent, powershell("'Import-module servermanager ; (Get-WindowsFeature -name RDS-RD-Server).Installed'")) do |installed_feature| assert_equal("True", installed_feature.stdout.chomp, 'Result should be true for installed RDS-RD-Server feature') end agent.reboot #assert_equal(true, agent.down?, 'Cound install RDS-RD-Server, failed to bring the host down') begin agent.down? rescue #TODO: Handle restart pending puts 'Assuming that restart was not caught' end agent.wait_for_port(3389) agent.wait_for_port(22) end end step "Verify facter os reports correct system32 variable" do on(agent, powershell("facter os.windows.system32")) do |facter_output| assert_equal("C:\\Windows\\system32", facter_output.stdout.chomp, 'Result should be C:\\Windows\\system32') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/load_libfacter.rb000066400000000000000000000047111470204764400244410ustar00rootroot00000000000000# Verify that we can load the facter the way that mco does based on the platform test_name 'C100161: Ruby can load libfacter without raising an error' do tag 'risk:high' require 'puppet/acceptance/common_utils' extend Puppet::Acceptance::CommandUtils def puppet_ruby_path_to_puppet_install_dir(puppet_ruby_path) # find the "puppet" directory which should be the root of the install puppet_dir = puppet_ruby_path while File.basename(puppet_dir).downcase != 'puppet' new_puppet_dir = File.dirname(puppet_dir) if new_puppet_dir == puppet_dir break else puppet_dir = new_puppet_dir end end puppet_dir end agents.each do |agent| # create a ruby program that will add a fact through Facter fact_content = <<-EOM require 'facter' Facter.add('facter_loaded') do setcode do 'FACTER_LOADED' end end # print a value so that we know that facter loaded and is working puts Facter.value('facter_loaded') exit 0 EOM fact_dir = agent.tmpdir('mco_test') fact_program = File.join(fact_dir, 'loading_facter.rb') create_remote_file(agent, fact_program, fact_content) teardown do agent.rm_rf(fact_dir) end if agent['platform'] =~ /windows/ && agent.is_cygwin? # on Windows we have to figure out where facter.rb is so we can include the path # figure out the root of the Puppet installation puppet_ruby_path = on(agent, "env PATH=\"#{agent['privatebindir']}:${PATH}\" which ruby").stdout.chomp cygwin_puppet_root = puppet_ruby_path_to_puppet_install_dir(puppet_ruby_path) puppet_root = on(agent, "cygpath -w '#{cygwin_puppet_root}'").stdout.chomp # on Windows mco uses -I to include the path to the facter.rb as its not in the # default $LOAD_PATH for Puppets Ruby include_facter_lib = "-I '#{puppet_root}/facter/lib'" else # On Unix systems facter.rb is already in the $LOAD_PATH for Puppets Ruby for mco include_facter_lib = '' end # Run Puppet's ruby and load facter.rb # if we fail to load the .jar or .so, ruby will raise an error for us to detect on(agent, "#{ruby_command(agent)} #{include_facter_lib} #{fact_program}") do |ruby_result| assert_equal('FACTER_LOADED', ruby_result.stdout.chomp, 'Expected the output to be only the value the added fact') assert_empty(ruby_result.stderr, 'Expected libfacter to load without any output on stderr') end end end puppetlabs-facter-dfe6df4/acceptance/tests/no_errors_on_stderr.rb000066400000000000000000000005431470204764400255750ustar00rootroot00000000000000test_name 'C14514: Running facter should not output anything to stderr' do tag 'risk:high' agents.each do |agent| on(agent, facter) do |facter_output| assert_match(/hostname\s*=>\s*\S*/, facter_output.stdout, 'Hostname fact is missing') assert_empty(facter_output.stderr, 'Facter should not have written to stderr') end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/000077500000000000000000000000001470204764400226525ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/options/blocklist_no_regex.rb000066400000000000000000000026621470204764400270610ustar00rootroot00000000000000test_name 'blocking os fact does not block oss fact' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils custom_fact_file = 'custom_facts.rb' custom_fact_name = "oss" custom_fact_value = "custom_fact_value" fact_content = <<-CUSTOM_FACT Facter.add(:#{custom_fact_name}) do setcode do "#{custom_fact_value}" end end CUSTOM_FACT config_data = <<~FACTER_CONF facts : { blocklist : [ "os" ], } FACTER_CONF agents.each do |agent| fact_dir = agent.tmpdir('custom_facts') fact_file = File.join(fact_dir, custom_fact_file) config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') agent.mkdir_p(config_dir) create_remote_file(agent, fact_file, fact_content) create_remote_file(agent, config_file, config_data) teardown do agent.rm_rf(fact_dir) agent.rm_rf(config_dir) end step "Facter: Verify that the blocked fact is not displayed" do on(agent, facter("os")) do |facter_output| assert_equal("", facter_output.stdout.chomp) end end step "Facter: Verify that the custom fact is displayed" do on(agent, facter("--custom-dir=#{fact_dir} oss")) do |facter_output| assert_match(/#{custom_fact_value}/, facter_output.stdout.chomp) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/blocklist_with_regex.rb000066400000000000000000000026361470204764400274210ustar00rootroot00000000000000test_name 'blocking facts using regex' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils custom_fact_file = 'custom_facts.rb' custom_fact_name = "oss" custom_fact_value = "custom_fact_value" fact_content = <<-CUSTOM_FACT Facter.add(:#{custom_fact_name}) do setcode do "#{custom_fact_value}" end end CUSTOM_FACT config_data = <<~FACTER_CONF facts : { blocklist : [ "os.*" ], } FACTER_CONF agents.each do |agent| fact_dir = agent.tmpdir('custom_facts') fact_file = File.join(fact_dir, custom_fact_file) config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') agent.mkdir_p(config_dir) create_remote_file(agent, fact_file, fact_content) create_remote_file(agent, config_file, config_data) teardown do agent.rm_rf(fact_dir) agent.rm_rf(config_dir) end step "Facter: Verify that the blocked fact is not displayed" do on(agent, facter("os")) do |facter_output| assert_equal("", facter_output.stdout.chomp) end end step "Facter: Verify that the blocked custom fact is not displayed" do on(agent, facter("--custom-dir=#{fact_dir} oss")) do |facter_output| assert_equal("", facter_output.stdout.chomp) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/color.rb000066400000000000000000000017511470204764400243210ustar00rootroot00000000000000# This test is intended to ensure with --debug and --color, facter sends escape sequences to colorize the output test_name "C86545: --debug and --color command-line options should print DEBUG messages with color escape sequences" do tag 'risk:high' confine :except, :platform => 'windows' # On windows we don't get an escape sequence to detect to color change agents.each do |agent| step "Agent #{agent}: retrieve debug info from stderr using --debug and --color option" do # set the TERM type to be a color xterm to help ensure we emit the escape sequence to change the color on(agent, facter('--debug --color'), :environment => { 'TERM' => 'xterm-256color' }) do |facter_output| assert_match(/DEBUG/, facter_output.stderr, "Expected DEBUG information in stderr") assert_match( /\e\[(\d{2,3})?;?(\d{1})?;?(\d{2,3})?m/, facter_output.stderr, "Expected to see an escape sequence in the output" ) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/config.rb000066400000000000000000000016041470204764400244450ustar00rootroot00000000000000# This test is intended to verify that the config file location can be specified # via the `--config` flag on the command line. test_name "C100014: --config command-line option designates the location of the config file" do tag 'risk:high' agents.each do |agent| step "Agent #{agent}: create config file" do config_dir = agent.tmpdir("config_dir") config_file = File.join(config_dir, "facter.conf") create_remote_file(agent, config_file, <<-FILE) cli : { debug : true } FILE teardown do agent.rm_rf(config_dir) end step "setting --config should cause the config file to be loaded from the specified location" do on(agent, facter("--config \"#{config_file}\"")) do |facter_output| assert_match(/DEBUG/, facter_output.stderr, "Expected debug output on stderr") end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/config_file/000077500000000000000000000000001470204764400251165ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/options/config_file/blocklist.rb000066400000000000000000000027611470204764400274370ustar00rootroot00000000000000# This test verifies that when a fact group is blocked in the config file # the corresponding facts do not resolve. test_name "C99972: facts can be blocked via a blocklist in the config file" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils agents.each do |agent| step "Agent #{agent}: create config file" do custom_conf_dir = agent.tmpdir("config_dir") config_file = File.join(custom_conf_dir, "facter.conf") create_remote_file(agent, config_file, <<-FILE) cli : { debug : true } facts : { blocklist : [ "file system", "EC2" ] } FILE teardown do agent.rm_rf(custom_conf_dir) end step "blocked facts should not be resolved" do on(agent, facter("--config \"#{config_file}\"")) do |facter_output| # every platform attempts to resolve at least EC2 facts assert_match(/blocking collection of .+ facts/, facter_output.stderr, "Expected stderr to contain statement about blocking fact collection") # on some platforms, file system facts are never resolved, so this will also be true in those cases refute_match(/filesystems/, facter_output.stdout, "filesystems fact should have been blocked") refute_match(/mountpoints/, facter_output.stdout, "mountpoints fact should have been blocked") refute_match(/partitions/, facter_output.stdout, "partitions fact should have been blocked") end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/config_file/blocklist_from_puppet_facts.rb000066400000000000000000000036051470204764400332350ustar00rootroot00000000000000# This test verifies that when a fact group is blocked in the config file the # corresponding facts do not resolve when being run from the puppet facts command. test_name "C100036: when run from puppet facts, facts can be blocked via a list in the config file" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils agents.each do |agent| step "facts should be blocked when Facter is run from Puppet with a configured blocklist" do # default facter.conf facter_conf_default_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) facter_conf_default_path = File.join(facter_conf_default_dir, "facter.conf") teardown do agent.rm_rf(facter_conf_default_dir) end step "Agent #{agent}: create default config file" do # create the directories agent.mkdir_p(facter_conf_default_dir) create_remote_file(agent, facter_conf_default_path, <<-FILE) facts : { blocklist : [ "file system", "EC2" ] } FILE end step "blocked facts should not be resolved" do on(agent, puppet("facts --debug")) do |puppet_facts_output| # every platform attempts to resolve at least EC2 facts assert_match(/blocking collection of .+ facts/, puppet_facts_output.stdout, "Expected stderr to contain statement about blocking fact collection") # on some platforms, file system facts are never resolved, so this will also be true in those cases refute_match(/filesystems/, puppet_facts_output.stdout, "filesystems fact should have been blocked") refute_match(/mountpoints/, puppet_facts_output.stdout, "mountpoints fact should have been blocked") refute_match(/partitions/, puppet_facts_output.stdout, "partitions fact should have been blocked") end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/config_file/cache_migrate_from_facter_3.rb000066400000000000000000000047561470204764400330230ustar00rootroot00000000000000test_name 'migrating from facter 3 to facter 4 having cache enabled' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils fact_group_name = 'uptime' config_data = <<~FACTER_CONF facts : { ttls : [ { "#{fact_group_name}" : 3 days } ] } FACTER_CONF f3_cache = "{ \"system_uptime\": { \"days\": 1, \"hours\": 1, \"seconds\": 1, \"uptime\": \"1 day\" }, \"uptime\": \"1 days\", \"uptime_days\": 1, \"uptime_hours\": 1, \"uptime_seconds\": 1 }" agents.each do |agent| cache_dir = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) f3_cache_file = File.join(cache_dir, fact_group_name) config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') step 'create cache file' do agent.mkdir_p(cache_dir) create_remote_file(agent, f3_cache_file, f3_cache) end teardown do agent.rm_rf("#{cache_dir}/*") agent.rm_rf(config_file) end step 'calling facter 4 without config won\'t modify the cache file' do _output = on(agent, facter) stdout = agent.cat("#{cache_dir}/#{fact_group_name}") assert_equal(stdout.strip, f3_cache.strip) end step "Agent #{agent}: create config file" do agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) end step 'calling facter will invalidate old f3 cache and will overwrite' do output = on(agent, facter('--json')) step 'output should be different from f3 cache' do parsed_output = JSON.parse(output.stdout) cache_value_changed = f3_cache['system_uptime']['seconds'] != parsed_output['system_uptime']['seconds'] assert_equal(true, cache_value_changed, 'Cache value did not change') end step 'cache file should contain cache_format_version' do stdout = agent.cat("#{cache_dir}/#{fact_group_name}") cache_content = JSON.parse(stdout) assert_equal(cache_content['cache_format_version'], 1) step 'values should be read from cache' do cached_value = cache_content['system_uptime.seconds'] sleep 1 output = on(agent, facter('system_uptime.seconds')) assert_equal(cached_value.to_s, output.stdout.strip) end end end end end custom_dir_overridden_by_cli_custom_dir.rb000066400000000000000000000037621470204764400355360ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/options/config_file# This test verifies that the custom-dir specified in the configuration file can be overridden by using # --custom-dir on the command line test_name "C100015: config custom-dir overridden by command line --custom-dir" do tag 'risk:high' require 'json' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils config_fact_content = < [1]) do |facter_output| assert_match(/no-external-facts and external-dir options conflict/, facter_output.stderr, "Facter should have warned about conflicting settings") end end end end external_dir_overridden_by_cli_external_dir.rb000066400000000000000000000035271470204764400363550ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/options/config_file# This test verifies that the external-dir specified in the configuration file can be overridden by using # --external-dir on the command line test_name "C100016: config external-dir overridden by command line --external-dir" do tag 'risk:high' require 'json' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils agents.each do |agent| step "Agent #{agent}: create 2 custom fact directories with facts and a config file pointing at 1 directory" do external_config_dir = agent.tmpdir('external_dir') external_cli_dir = agent.tmpdir('cli_external_dir') external_config_fact = File.join(external_config_dir, 'external.txt') external_cli_fact = File.join(external_cli_dir, 'external.txt') create_remote_file(agent, external_config_fact, "config_fact=config_value") create_remote_file(agent, external_cli_fact, "cli_fact=cli_value") config_dir = agent.tmpdir("config_dir") config_file = File.join(config_dir, "facter.conf") config_content = < 1) do |facter_output| assert_match(/options conflict/, facter_output.stderr, "Output does not contain error string") end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/config_file/no_custom_facts_and_facterlib.rb000066400000000000000000000026211470204764400334670ustar00rootroot00000000000000# This test verifies that setting no-custom-facts in the config file disables # finding facts under the environment variable FACTERLIB test_name "C99997: config option no-custom-facts : true does not load facts from FACTERLIB" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils content = < {'FACTERLIB' => facterlib_dir})) do |facter_output| assert_equal("", facter_output.stdout.chomp, "Custom fact in FACTERLIB should not have resolved") end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/config_file/no_custom_facts_and_load_path.rb000066400000000000000000000035201470204764400334660ustar00rootroot00000000000000# This test verifies that setting no-custom-facts in the config file disables the # the loading of custom facts in facter directories under the $LOAD_PATH test_name "C100004: config file option no-custom-facts : true does not load $LOAD_PATH facter directories" do confine :except, :platform => 'cisco_nexus' # see BKR-749 tag 'risk:high' require 'puppet/acceptance/common_utils' extend Puppet::Acceptance::CommandUtils require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils content = < 1) do |facter_output| assert_match(/options conflict/, facter_output.stderr, "Output does not contain error string") end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/config_file/no_ruby_disables_custom_facts.rb000066400000000000000000000031321470204764400335370ustar00rootroot00000000000000# This test is intended to demonstrate that the global.no-ruby config file field # disables custom fact lookup. test_name "C100045: config no-ruby to true should disable custom facts" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils config = < { 'FACTERLIB' => custom_dir })) do |facter_output| assert_equal("", facter_output.stdout.chomp, "Expected custom fact to be disabled when no-ruby is true") end end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/config_file/no_ruby_disables_ruby_facts.rb000066400000000000000000000020751470204764400332130ustar00rootroot00000000000000# This test verifies that the global.no-ruby config file field disables # ruby facts test_name "C99964: no-ruby config field flag disables requiring Ruby" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils config = < [1]) do |facter_output| assert_match(/backtrace:\s+#{custom_fact}/, facter_output.stderr, "Expected a backtrace for erroneous custom fact") end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/config_file/ttls/000077500000000000000000000000001470204764400261045ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/options/config_file/ttls/cached_all_types_of_facts.rb000066400000000000000000000106631470204764400335660ustar00rootroot00000000000000test_name 'ttls configured with all types of facts' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils custom_fact_file = 'custom_facts.rb' custom_fact_name = 'random_custom_fact' custom_fact_value = 'custom fact value' custom_fact_content = <<-CUSTOM_FACT Facter.add(:#{custom_fact_name}) do setcode do "#{custom_fact_value}" end end CUSTOM_FACT external_fact_name = 'external_fact' external_fact_value = 'external_value' external_fact_content = <<-EXTERNAL_FACT #{external_fact_name}=#{external_fact_value} EXTERNAL_FACT cached_file_content = <<~CACHED_FILE { "#{custom_fact_name}": "#{custom_fact_value}", "#{external_fact_name}": "#{external_fact_name}", "cache_format_version": 1 } CACHED_FILE config_data = <<~FACTER_CONF facts : { ttls : [ { "cached-custom-facts" : 3 days }, { "#{external_fact_name}.txt": 3 days} ] } fact-groups : { cached-custom-facts : ["#{custom_fact_name}", "uptime"], } FACTER_CONF agents.each do |agent| cache_folder = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) fact_dir = agent.tmpdir('facter') env = { 'FACTERLIB' => fact_dir } config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') step "Agent #{agent}: create config file" do agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) fact_file = File.join(fact_dir, custom_fact_file) create_remote_file(agent, fact_file, custom_fact_content) external_dir = agent.tmpdir('external_dir') external_fact = File.join(external_dir, "#{external_fact_name}.txt") create_remote_file(agent, external_fact, external_fact_content) teardown do agent.rm_rf(fact_dir) agent.rm_rf("#{cache_folder}/*") agent.rm_rf(config_file) agent.rm_rf(external_dir) end step "should log that it creates cache file and it caches custom facts found in facter.conf" do on(agent, facter("--external-dir \"#{external_dir}\" --debug", environment: env)) do |facter_result| assert_match(/#{custom_fact_value}/, facter_result.stdout.chomp, "#{custom_fact_name} value changed") assert_match(/#{external_fact_value}/, facter_result.stdout.chomp, "#{external_fact_name} value changed") assert_match(/caching values for cached-custom-facts facts/, facter_result.stderr, 'Expected debug message to state that custom facts will be cached') assert_match(/caching values for #{external_fact_name}.txt facts/, facter_result.stderr, 'Expected debug message to state that custom facts will be cached') end end step "should create a cached-custom-facts cache file that containt fact information" do result = agent.file_exist?("#{cache_folder}/cached-custom-facts") assert_equal(true, result) cat_output = agent.cat("#{cache_folder}/cached-custom-facts") cat_external = agent.cat("#{cache_folder}/#{external_fact_name}.txt") assert_match(/#{custom_fact_value}/, cat_output.strip, 'Expected cached custom fact file to contain fact information') assert_match(/uptime/, cat_output.strip, 'Expected cached custom fact file to contain fact information') assert_match(/#{external_fact_value}/, cat_external.strip, 'Expected cached custom fact file to contain fact information') end step 'should read from the cached file for a custom fact that has been cached' do on(agent, facter("--external-dir \"#{external_dir}\" --debug", environment: env)) do |facter_result| assert_match(/loading cached values for #{custom_fact_name} facts/, facter_result.stderr, 'Expected debug message to state that cached custom facts are read from file') assert_match(/loading cached values for #{external_fact_name}.txt facts/, facter_result.stderr, 'Expected debug message to state that cached custom facts are read from file') assert_match(/loading cached values for uptime facts/, facter_result.stderr, 'Expected debug message to state that cached custom facts are read from file') end end end end endcached_custom_group_core_custom_facts.rb000066400000000000000000000073651470204764400361640ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/options/config_file/ttlstest_name 'ttls configured with custom group containing core and custom facts' do tag 'risk:high' skip_test "Known issue. Scenario does not work." require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils custom_fact_file = 'custom_facts.rb' custom_fact_name = 'random_custom_fact' uptime_seconds_value = '' custom_fact_content = <<-CUSTOM_FACT Facter.add(:#{custom_fact_name}) do setcode do Facter.value('system_uptime.seconds') end end CUSTOM_FACT config_data = <<~FACTER_CONF facts : { ttls : [ { "cached-custom-facts" : 3 days }, ] } fact-groups : { cached-custom-facts : ["#{custom_fact_name}", "system_uptime"], } FACTER_CONF agents.each do |agent| cache_folder = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) fact_dir = agent.tmpdir('facter') env = { 'FACTERLIB' => fact_dir } config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') step "Agent #{agent}: create config file" do agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) fact_file = File.join(fact_dir, custom_fact_file) create_remote_file(agent, fact_file, custom_fact_content) teardown do agent.rm_rf(fact_dir) agent.rm_rf("#{cache_folder}/*") agent.rm_rf(config_file) end step "should log that it creates cache file and it caches custom facts found in facter.conf" do on(agent, facter("--debug --json", environment: env)) do |facter_result| output_json = JSON.parse(facter_result.stdout.chomp) uptime_seconds_value = output_json['system_uptime']['seconds'] assert_match(/caching values for cached-custom-facts facts/, facter_result.stderr, 'Expected debug message to state that custom facts will be cached') end end step "should create a cached-custom-facts cache file that contains fact information" do result = agent.file_exist?("#{cache_folder}/cached-custom-facts") assert_equal(true, result) cat_output = agent.cat("#{cache_folder}/cached-custom-facts") output_json = JSON.parse(cat_output.chomp) assert_match(output_json[custom_fact_name], uptime_seconds_value, 'Expected cached custom fact file to contain fact information') assert_match(output_json['system_uptime.seconds'], uptime_seconds_value, 'Expected cached file to contain system_uptime information') end step 'should read from the cached file for a custom fact that has been cached' do on(agent, facter("--debug", environment: env)) do |facter_result| output_json = JSON.parse(facter_result.stdout.chomp) assert_match(output_json[custom_fact_name], uptime_seconds_value, 'Expected cached custom fact file to contain fact information') assert_match(output_json['system_uptime.seconds'], uptime_seconds_value, 'Expected cached file to contain system_uptime information') assert_match(/caching values for cached-custom-facts facts/, facter_result.stderr, 'Expected debug message to state that custom facts will be cached') assert_match(/loading cached values for #{custom_fact_name} facts/, facter_result.stderr, 'Expected debug message to state that cached custom facts are read from file') assert_match(/loading cached values for system_uptime.seconds facts/, facter_result.stderr, 'Expected debug message to state that system_uptime facts are read from file') end end end end endpuppetlabs-facter-dfe6df4/acceptance/tests/options/config_file/ttls/cached_nested_custom_facts.rb000066400000000000000000000061701470204764400337600ustar00rootroot00000000000000test_name 'ttls configured nested custom facts files creates cache file and reads cache file' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils custom_fact_file = 'custom_facts.rb' custom_fact_name = 'random_custom.fact' custom_fact_value = 'custom fact value' fact_content = <<-CUSTOM_FACT Facter.add('#{custom_fact_name}') do setcode do "#{custom_fact_value}" end end CUSTOM_FACT cached_file_content = <<~CACHED_FILE { "#{custom_fact_name}": "#{custom_fact_value}", "cache_format_version": 1 } CACHED_FILE config_data = <<~FACTER_CONF facts : { ttls : [ { "cached-custom-facts" : 3 days } ] } fact-groups : { cached-custom-facts : ["#{custom_fact_name}"], } FACTER_CONF agents.each do |agent| cache_folder = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) fact_dir = agent.tmpdir('facter') env = { 'FACTERLIB' => fact_dir } config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') step "Agent #{agent}: create config file" do agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) fact_file = File.join(fact_dir, custom_fact_file) create_remote_file(agent, fact_file, fact_content) end teardown do agent.rm_rf(fact_dir) agent.rm_rf("#{cache_folder}/*") agent.rm_rf(config_file) end step "should log that it creates cache file and it caches custom facts found in facter.conf" do on(agent, facter("#{custom_fact_name} --debug", environment: env)) do |facter_result| assert_equal(custom_fact_value, facter_result.stdout.chomp, "#{custom_fact_name} value changed") assert_match(/facts cache file expired, missing or is corrupt/, facter_result.stderr, 'Expected debug message to state that custom facts cache file is missing or expired') assert_match(/Saving cached custom facts to ".+"|caching values for cached-custom-facts facts/, facter_result.stderr, 'Expected debug message to state that custom facts will be cached') end end step "should create a cached-custom-facts cache file that containt fact information" do result = agent.file_exist?("#{cache_folder}/cached-custom-facts") assert_equal(true, result) cat_output = agent.cat("#{cache_folder}/cached-custom-facts") assert_match(cached_file_content.chomp, cat_output.strip, 'Expected cached custom fact file to contain fact information') end step 'should read from the cached file for a custom fact that has been cached' do on(agent, facter("#{custom_fact_name} --debug", environment: env)) do |facter_result| assert_match(/Loading cached custom facts from file ".+"|loading cached values for #{custom_fact_name} facts/, facter_result.stderr, 'Expected debug message to state that cached custom facts are read from file') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/config_file/ttls/cached_nested_external_facts.rb000066400000000000000000000061151470204764400342670ustar00rootroot00000000000000test_name "ttls configured cached nested external facts" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils # This fact must be resolvable on ALL platforms # Do NOT use the 'kernel' fact as it is used to configure the tests external_cachegroup = 'external_fact' first_fact_name = 'fact.first' second_fact_name = 'fact.second' first_fact_value = 'value.first' second_fact_value = 'value.second' cached_fact_value = 'cached_external_value' external_fact_content = < fact_dir } # Setup facter conf agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config) fact_file = File.join(fact_dir, custom_fact_file) create_remote_file(agent, fact_file, custom_fact_content) external_dir = agent.tmpdir('external_dir') external_fact = File.join(external_dir, "#{external_fact_name}.txt") create_remote_file(agent, external_fact, external_fact_content) teardown do agent.rm_rf(fact_dir) agent.rm_rf("#{cached_facts_dir}/*") agent.rm_rf(config_file) agent.rm_rf(external_dir) end step "Agent #{agent}: run facter with cached facts" do # Set up a known cached fact agent.rm_rf(cached_facts_dir) on(agent, facter("--external-dir \"#{external_dir}\"", environment: env)) assert_equal(true, agent.file_exist?("#{cached_facts_dir}/cached-custom-facts")) assert_equal(true, agent.file_exist?("#{cached_facts_dir}/#{cached_fact_name}")) assert_equal(true, agent.file_exist?("#{cached_facts_dir}/#{external_fact_name}.txt")) create_remote_file(agent, cached_fact_file, cached_fact_content) end step "Agent #{agent}: resolves fact after ttls was removed" do # Create config file with no caching no_cache_config_file = File.join(config_dir, "no-cache.conf") create_remote_file(agent, no_cache_config_file, config_no_cache) on(agent, facter("--config \"#{no_cache_config_file}\" --external-dir \"#{external_dir}\"", environment: env)) do |facter_output| assert_match(/#{cached_fact_name}/, facter_output.stdout, "Expected to see the fact in output") refute_match(/#{cached_fact_value}/, facter_output.stdout, "Expected to not see the cached fact value") end assert_equal(true, agent.file_exist?("#{cached_facts_dir}/cached-custom-facts")) assert_equal(true, agent.file_exist?("#{cached_facts_dir}/#{cached_fact_name}")) assert_equal(true, agent.file_exist?("#{cached_facts_dir}/#{external_fact_name}.txt")) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/config_file/ttls_cache_missing_facts.rb000066400000000000000000000032201470204764400324620ustar00rootroot00000000000000test_name 'missing facts should not invalidate cache' do tag 'risk:high' confine :except, :platform => 'aix-7.2-power' # FACT-3209 confine :except, :platform => /^solaris-10-/ # FACT-3209 require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils custom_fact_file = 'custom_facts.rb' fact_content = <<-CUSTOM_FACT Facter.add("networking.custom_fact") do setcode do '' end end CUSTOM_FACT agents.each do |agent| cache_folder = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) fact_dir = agent.tmpdir('facter') env = { 'FACTERLIB' => fact_dir } config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') config_data = <<~FACTER_CONF facts : { ttls : [ { "networking" : 3 days } ] } FACTER_CONF step "Agent #{agent}: create config file" do agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) fact_file = File.join(fact_dir, custom_fact_file) create_remote_file(agent, fact_file, fact_content) end teardown do agent.rm_rf(fact_dir) agent.rm_rf("#{cache_folder}/*") agent.rm_rf(config_file) end step "should create cache file once" do on(agent, facter('', environment: env)) ls1 = agent.ls_ld("#{cache_folder}/networking") sleep 1 on(agent, facter('', environment: env)) ls2 = agent.ls_ld("#{cache_folder}/networking") assert_equal(ls1, ls2) end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/config_file/ttls_cache_system_uptime.rb000066400000000000000000000062631470204764400325520ustar00rootroot00000000000000# frozen_string_literal: true test_name 'ttls configured custom facts files creates cache file and reads cache file' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils config_data = <<~FACTER_CONF facts : { ttls : [ { "uptime" : 3 days } ] } FACTER_CONF agents.each do |agent| cache_folder = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') step "Agent #{agent}: create config file" do agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) end teardown do agent.rm_rf("#{cache_folder}/*") agent.rm_rf(config_file) end step 'calling one fact from the cached group will cache only that fact' do output = on(agent, facter('system_uptime.seconds')) seconds = output.stdout.strip.to_i expected = { 'system_uptime.seconds' => seconds, 'cache_format_version' => 1 } stdout = agent.cat("#{cache_folder}/uptime") cache_content = JSON.parse(stdout) assert_equal(expected, cache_content) end step 'calling a different fact from the cached group will cache only that fact' do output = on(agent, facter('system_uptime.days')) days = output.stdout.strip.to_i expected = { 'system_uptime.days' => days, 'cache_format_version' => 1 } stdout = agent.cat("#{cache_folder}/uptime") cache_content = JSON.parse(stdout) assert_equal(expected, cache_content) end # TODO: This is a knoew issue and needs to be fixed # Added this step just to have quick validation # # step "calling a fact with the same name as the group should work" do # output = on(agent, "facter uptime") # uptime = output.stdout.strip # stdout = agent.cat("#{cache_folder}/uptime") # cache_content = JSON.parse(stdout) # expected = { "uptime" => uptime, "cache_format_version" => 1 } # assert_equal(expected, cache_content) # end step 'calling facter without a query will cache the entire group' do _output = on(agent, facter) stdout = agent.cat("#{cache_folder}/uptime") cache_content = JSON.parse(stdout) ['system_uptime.days', 'uptime_days', 'system_uptime.hours', 'uptime_hours', 'system_uptime.seconds', 'uptime_seconds', 'system_uptime.uptime', 'uptime', 'cache_format_version'].each do |key| assert_equal(true, cache_content.key?(key)) end end operating_system = fact_on(agent, 'operatingsystem') # rubocop:disable Style/Next if operating_system == 'Ubuntu' step 'check file info to verify that it did not change' do output1 = on(agent, "stat -c %Y #{cache_folder}/uptime") on(agent, facter) on(agent, facter('system_uptime')) output2 = on(agent, "stat -c %Y #{cache_folder}/uptime") assert_equal(output1.stdout, output2.stdout) end end # rubocop:enable Style/Next end end puppetlabs-facter-dfe6df4/acceptance/tests/options/config_file/ttls_cached_custom_and_core_fact.rb000066400000000000000000000113231470204764400341410ustar00rootroot00000000000000test_name 'missing facts should not invalidate cache' do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils custom_fact_file = 'custom_fact.rb' custom_fact_name = 'my_custom_fact' custom_cache_group = 'my_custom_group' custom_fact_value = 'banana' core_fact_name = 'system_uptime.seconds' fact_content = <<-CUSTOM_FACT Facter.add('#{custom_fact_name}') do setcode do "#{custom_fact_value}" end end CUSTOM_FACT agents.each do |agent| cache_folder = get_cached_facts_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) fact_dir = agent.tmpdir('facter') env = { 'FACTERLIB' => fact_dir } config_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) config_file = File.join(config_dir, 'facter.conf') config_data = <<~FACTER_CONF facts : { ttls : [ { "#{custom_cache_group}" : 3 days } ] } fact-groups : { "#{custom_cache_group}" : ["#{custom_fact_name}", "#{core_fact_name}"], } FACTER_CONF step "Agent #{agent}: create config file" do agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config_data) fact_file = File.join(fact_dir, custom_fact_file) create_remote_file(agent, fact_file, fact_content) end teardown do agent.rm_rf(fact_dir) agent.rm_rf("#{cache_folder}/*") agent.rm_rf(config_file) end step 'request the core fact' do @core_value = on(agent, facter(core_fact_name, environment: env)).stdout.strip.to_i cat_output = agent.cat("#{cache_folder}/#{custom_cache_group}") cache = JSON.parse(cat_output) step 'check if it is the only fact on cache' do cached = { core_fact_name => @core_value, 'cache_format_version' => 1 } assert_equal(cached, cache) end step 'check that it cached the value it printed' do assert_equal(@core_value, cache[core_fact_name]) end end step 'request the core fact again' do core_value = on(agent, facter(core_fact_name, environment: env)).stdout.strip.to_i cat_output = agent.cat("#{cache_folder}/#{custom_cache_group}") cache = JSON.parse(cat_output) step 'check that it cached the value it printed' do assert_equal(core_value, cache[core_fact_name]) end step 'check that core value did not change' do assert_equal(@core_value, core_value) end end step 'request the custom fact' do @custom_fact_value = on(agent, facter(custom_fact_name, environment: env)).stdout.strip cat_output = agent.cat("#{cache_folder}/#{custom_cache_group}") cache = JSON.parse(cat_output) step 'check if it is the only fact on cache' do cached = { custom_fact_name => @custom_fact_value, 'cache_format_version' => 1 } assert_equal(cached, cache) end step 'check that it cached the value it printed' do assert_equal(@custom_fact_value, cache[custom_fact_name].to_s) end end step 'request the custom fact again' do custom_fact_value = on(agent, facter(custom_fact_name, environment: env)).stdout.strip cat_output = agent.cat("#{cache_folder}/#{custom_cache_group}") cache = JSON.parse(cat_output) step 'check that it cached the value it printed' do assert_equal(custom_fact_value, cache[custom_fact_name].to_s) end step 'check that the value did not change' do assert_equal(@custom_fact_value, custom_fact_value) end end step "updates cache file with full group contents" do on(agent, facter('', environment: env)) cat_output = agent.cat("#{cache_folder}/#{custom_cache_group}") cache = JSON.parse(cat_output) step 'cache contains core and custom fact' do cache_keys = cache.keys - ['cache_format_version'] assert_equal([custom_fact_name, core_fact_name].sort, cache_keys.sort) end step 'reads the cache file' do cache_hash = { custom_fact_name => "pine apple", "system_uptime.seconds" => 2, "cache_format_version" => 1 } create_remote_file(agent, "#{cache_folder}/#{custom_cache_group}", cache_hash.to_json) step 'custom fact is read correctly' do output = on(agent, facter(custom_fact_name, environment: env)) assert_equal(cache_hash[custom_fact_name], output.stdout.strip ) end step 'core fact is read correctly' do output = on(agent, facter(core_fact_name, environment: env)) assert_equal(cache_hash[core_fact_name].to_s, output.stdout.strip ) end end end end end ttls_cached_external_execution_resolver_with_json_output.rb000066400000000000000000000065421470204764400412620ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/acceptance/tests/options/config_file# This test verifies that a ttls configured cached facts when initially called # create a json cache file test_name "ttls configured cached external execution resolver with json output creates and read json cache files" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils # This fact must be resolvable on ALL platforms # Do NOT use the 'kernel' fact as it is used to configure the tests external_cachegroup = 'external_fact' cached_fact_name = 'single_fact' initial_fact_value = 'external_value' cached_fact_value = 'cached_external_value' agents.each do |agent| step "Agent #{agent}: create config file" do external_dir = agent.tmpdir('external_dir') ext = get_external_fact_script_extension(agent['platform']) external_fact = File.join(external_dir, "#{external_cachegroup}#{ext}") if agent['platform'] =~ /windows/ external_fact_content = < 'windows' # this test currently only supported on unix systems FACT-1647 confine :except, :platform => 'aix' # system su(1) command prints errors cannot access parent directories and ticket FACT-1586 confine :except, :platform => 'osx' # system su(1) command prints errors cannot access parent directories confine :except, :platform => 'solaris' # system su(1) command prints errors cannot access parent directories require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils fact_group_name = 'uptime' config_data = <<~HOCON facts : { ttls : [ { "#{fact_group_name}" : 3 days } ] } HOCON f3_cache = <<~JSON { "system_uptime": { "days": 1, "hours": 1, "seconds": 1, "uptime": "1 day" }, "uptime": "1 days", "uptime_days": 1, "uptime_hours": 1, "uptime_seconds": 1 } JSON # since facter is using beaker on localhost, stdin is not connected # and the only way to execute a manifest with puppet is by using # `-e ""` argument in command line, needing extra-escape # for quotes in manifests containing quotes config_data.gsub!('"','\"') f3_cache.gsub!('"','\"') agents.each do |agent| kernelmajversion = on(agent, facter('kernelmajversion')).stdout.chomp.to_f cache_dir = get_cached_facts_dir(agent['platform'], kernelmajversion) f3_cache_file = File.join(cache_dir, fact_group_name) f3_cache_file_manifest = <<-MANIFEST file { '#{cache_dir}': ensure => 'directory', mode => '755' } file { '#{f3_cache_file}': content => '#{f3_cache}' } MANIFEST config_dir = get_default_fact_dir(agent['platform'], kernelmajversion) config_file = File.join(config_dir, 'facter.conf') config_file_manifest = <<-MANIFEST file { '#{config_file}': content => '#{config_data}' } MANIFEST non_root_user = "nonroot" facter_path = agent.which('facter').chomp teardown do agent.rm_rf(cache_dir) agent.rm_rf(config_dir) on(agent, puppet("resource user #{non_root_user} ensure=absent")) end step 'create cache file and the non-root account' do agent.mkdir_p(cache_dir) on(agent, puppet('apply', '--debug', "-e \" #{f3_cache_file_manifest} \"")) on(agent, "puppet resource user #{non_root_user} ensure=present shell='#{user_shell(agent)}'") end step 'calling facter 4 as non-root user without config will show no error' do on(agent, %Q[su #{non_root_user} -c "'#{facter_path}' uptime"]) do |facter_results| assert_empty(facter_results.stderr.chomp, "Expected no errors from facter when run as user #{non_root_user}") end end step "Agent #{agent}: create config file to enable cache" do agent.mkdir_p(config_dir) on(agent, puppet('apply', '--debug', "-e \" #{config_file_manifest} \"")) end step 'calling facter 4 as non-root user with config will print warning that cannot update cache file' do on(agent, %Q[su #{non_root_user} -c "'#{facter_path}' uptime"]) do |facter_results| assert_match(/WARN.*Could not delete cache: Permission denied/, facter_results.stderr, "Expected cache related permission denied warning #{non_root_user}") end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/config_file/verbose.rb000066400000000000000000000020231470204764400271050ustar00rootroot00000000000000# This test is intended to demonstrate that setting cli.verbose to true in the # config file causes INFO level logging to output to stderr. test_name "C99989: verbose config field prints verbose information to stderr" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils config = < { 'FACTERLIB' => custom_dir })) do |facter_output| assert_equal("facterlib", facter_output.stdout.chomp, "Incorrect custom fact value for fact in FACTERLIB") end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/custom_facts_list.rb000066400000000000000000000031121470204764400267210ustar00rootroot00000000000000# facter should be able to be called with multiple --custom-dir's and find a fact in each # directory specified test_name "C99999: custom fact commandline option --custom-dir can be specified multiple times" do tag 'risk:high' require 'json' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils content_1 = < 'cisco_nexus' # see BKR-749 tag 'risk:high' require 'puppet/acceptance/common_utils' extend Puppet::Acceptance::CommandUtils require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils content = < {"nested" => "value1"}, "bar" => "value2", "baz" => "value3", "true" => true, "false" => false } end end EOM agents.each do |agent| step "Agent #{agent}: create a structured custom fact" do custom_dir = get_user_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) custom_fact = File.join(custom_dir, 'custom_fact.rb') agent.mkdir_p(custom_dir) create_remote_file(agent, custom_fact, content) agent.chmod('+x', custom_fact) teardown do agent.rm_rf(custom_fact) end step "Agent #{agent}: retrieve output using the --json option" do on(agent, facter("--custom-dir \"#{custom_dir}\" --json structured_fact")) do |facter_output| begin expected = {"structured_fact" => {"foo" => {"nested" => "value1"}, "bar" => "value2", "baz" => "value3", "true" => true, "false" => false}} assert_equal(expected, JSON.parse(facter_output.stdout.chomp), "JSON output does not match expected output") rescue fail_test "Couldn't parse output as JSON" end end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/list_block_groups.rb000066400000000000000000000012761470204764400267310ustar00rootroot00000000000000# This tests is intended to verify that passing the `--list-block-groups` flag # will cause the names of blockable resolvers to be printed to stdout. It should not list # any resolver name that is not blockable. test_name "C99969: the `--list-block-groups` command line flag prints available block groups to stdout" do tag 'risk:high' agents.each do |agent| step "the EC2 blockgroup should be listed" do on(agent, facter("--list-block-groups")) do |facter_output| assert_match(/EC2/, facter_output.stdout, "Expected the EC2 group to be listed") assert_match(/ec2_metadata/, facter_output.stdout, "Expected the EC2 group's facts to be listed") end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/list_cache_groups.rb000066400000000000000000000066231470204764400267030ustar00rootroot00000000000000# This tests is intended to verify that passing the `--list-cache-groups` flag # will cause the names of cacheable resolvers to be printed to stdout. test_name "C99970: the `--list-cache-groups` command line flag prints available cache groups to stdout" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils agents.each do |agent| external_dir = agent.tmpdir('external_dir') etc_factsd_dir = get_etc_factsd_dir(agent['platform']) filename = "test.yaml" etc_factsd_path = "#{etc_factsd_dir}/#{filename}" teardown do agent.rm_rf(external_dir) agent.rm_rf(etc_factsd_path) end step "the various cache groups should be listed" do on(agent, facter("--list-cache-groups")) do |facter_output| assert_match(/EC2/, facter_output.stdout, "EC2 group should be listed as cacheable") assert_match(/ec2_metadata/, facter_output.stdout, "EC2 group's facts should be listed") assert_match(/kernel/, facter_output.stdout, "kernel group should be listed as cacheable") assert_match(/kernelversion/, facter_output.stdout, "kernel group's facts should be listed as cacheable") end end step "the various external facts file should be visible as caching groups" do external_filename = "external_facts_filename" ext = get_external_fact_script_extension(agent['platform']) external_fact_script = File.join(external_dir, "#{external_filename}#{ext}") create_remote_file(agent, external_fact_script, external_fact_content(agent['platform'], "a", "b")) agent.chmod('+x', external_fact_script) external_fact_script_txt = File.join(external_dir, "#{external_filename}.txt") create_remote_file(agent, external_fact_script_txt, '') external_fact_script_json = File.join(external_dir, "#{external_filename}.json") create_remote_file(agent, external_fact_script_json, '') external_fact_script_yaml = File.join(external_dir, "#{external_filename}.yaml") create_remote_file(agent, external_fact_script_yaml, '') on(agent, facter("--external-dir \"#{external_dir}\" --list-cache-groups")) do |facter_output| assert_match(/#{external_filename}#{ext}/, facter_output.stdout, "external facts script files should be listed as cacheable") assert_match(/#{external_filename}.txt/, facter_output.stdout, "external facts txt files should be listed as cacheable") assert_match(/#{external_filename}.json/, facter_output.stdout, "external facts json files should be listed as cacheable") assert_match(/#{external_filename}.yaml/, facter_output.stdout, "external facts yaml files should be listed as cacheable") end agent.rm_rf(external_dir) end step "external facts groups should be listed only without --no-external-facts" do agent.mkdir_p(etc_factsd_dir) create_remote_file(agent, etc_factsd_path, 'test_fact: test_value') on(agent, facter("--list-cache-groups")) do |facter_output| assert_match(/#{filename}/, facter_output.stdout, "external facts script files should be listed as cacheable") end on(agent, facter("--list-cache-groups --no-external-facts")) do |facter_output| refute_match(/#{filename}/, facter_output.stdout, "external facts script files should now be listed as cacheable when --no-external-facts is used") end agent.rm_rf(etc_factsd_path) end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/log_level.rb000066400000000000000000000011341470204764400251460ustar00rootroot00000000000000# This test is intended to ensure that the --log-level command-line option works # properly. This option can be used with an argument to specify the level of logging # which will present in Facter's output. test_name "C99985: --log-level command-line option can be used to specify logging level" do agents.each do |agent| step "Agent #{agent}: retrieve debug info from stderr using `--log-level debug` option" do on(agent, facter('--log-level debug')) do |facter_output| assert_match(/DEBUG/, facter_output.stderr, "Expected DEBUG information in stderr") end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/no_block.rb000066400000000000000000000023361470204764400247710ustar00rootroot00000000000000# This tests is intended to verify that passing the `--no-block` command to facter will prevent # fact blocking, despite a blocklist being specified in the config file. test_name "C99971: the `--no-block` command line flag prevents facts from being blocked" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils agents.each do |agent| # default facter.conf facter_conf_default_dir = get_default_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) facter_conf_default_path = File.join(facter_conf_default_dir, "facter.conf") teardown do agent.rm_rf(facter_conf_default_dir) end # create the directories agent.mkdir_p(facter_conf_default_dir) step "Agent #{agent}: create config file" do create_remote_file(agent, facter_conf_default_path, <<-FILE) cli : { debug : true } facts : { blocklist : [ "EC2" ] } FILE end step "no facts should be blocked when `--no-block` is specified" do on(agent, facter("--no-block")) do |facter_output| refute_match(/blocking collection of .+ facts/, facter_output.stderr, "Expected no facts to be blocked") end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/no_cache_should_not_cache_facts.rb000066400000000000000000000030051470204764400314750ustar00rootroot00000000000000# This test is intended to verify that the `--no-cache` command line flag will # cause facter to not do any caching of facts test_name "C99968: --no-cache command-line option causes facter to not cache facts" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils # the uptime fact should be resolvable on ALL systems # Note: do NOT use the kernel fact, as it is used to configure the tests cached_fact_name = "uptime" config = <<-FILE cli : { debug : true } facts : { ttls : [ { "#{cached_fact_name}" : 30 minutes } ] } FILE agents.each do |agent| kernel_version = on(agent, facter('kernelmajversion')).stdout.chomp.to_f config_dir = get_default_fact_dir(agent['platform'], kernel_version) config_file = File.join(config_dir, "facter.conf") cached_facts_dir = get_cached_facts_dir(agent['platform'], kernel_version) cached_fact_file = File.join(cached_facts_dir, cached_fact_name) agent.rm_rf(cached_fact_file) teardown do agent.rm_rf(config_dir) agent.rm_rf(cached_facts_dir) end step "Agent #{agent}: create config file in default location" do agent.mkdir_p(config_dir) create_remote_file(agent, config_file, config) end step "facter should not cache facts when --no-cache is specified" do on(agent, facter("--no-cache")) do |facter_output| refute_match(/caching values for/, facter_output.stderr, "facter should not have tried to cache any facts") end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/no_cache_should_not_load_cached_facts.rb000066400000000000000000000040241470204764400326420ustar00rootroot00000000000000# This test is intended to verify that the `--no-cache` command line flag will # cause facter to not load already cached facts test_name "C100123: --no-cache command-line option does not load facts from the cache" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils # the uptime fact should be resolvable on ALL systems # Note: do NOT use the kernel fact, as it is used to configure the tests cached_fact_name = "uptime" bad_cached_fact_value = "CACHED_FACT_VALUE" bad_cached_content = < 'windows' # On windows we don't get an escape sequence so we can't detect a color change agents.each do |agent| step "Agent #{agent}: retrieve debug info from stderr using --debug anod --no-color options" do on(agent, facter('--debug --no-color')) do |facter_output| assert_match(/DEBUG/, facter_output.stderr, "Expected DEBUG information in stderr") refute_match(/\e\[0;/, facter_output.stderr, "Expected to output to not contain an escape sequence") end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/no_custom_facts.rb000066400000000000000000000021031470204764400263610ustar00rootroot00000000000000# This test verifies that --no-custom-facts does not load custom facts test_name "C64171: custom fact command line option --no-custom-facts does not load custom facts" do tag 'risk:med' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils content = < 1) do |facter_output| assert_match(/options conflict/, facter_output.stderr.chomp, "Output does not contain error string") end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/no_custom_facts_and_facterlib.rb000066400000000000000000000021411470204764400312200ustar00rootroot00000000000000# This test verifies that --no-custom-facts keeps facter from loading facts from the environment # variable FACTERLIB test_name "C100000: custom fact commandline options --no-custom-facts does not load from FACTERLIB" do tag 'risk:high' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils content = < { 'FACTERLIB' => facterlib_dir })) do |facter_output| assert_equal("", facter_output.stdout.chomp, "Custom fact in FACTERLIB should not have resolved") end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/no_custom_facts_and_load_path.rb000066400000000000000000000032421470204764400312230ustar00rootroot00000000000000# This tests verifies that when --no-custom-facts is used we do not look for # 'facter' subdirectories in the $LOAD_PATH # # Facter searches all directories in the Ruby $LOAD_PATH variable for subdirectories # named ‘facter’, and loads all Ruby files in those directories. test_name "C100003: custom fact commandline options --no-custom-facts does not load $LOAD_PATH facter directories" do confine :except, :platform => 'cisco_nexus' # see BKR-749 tag 'risk:high' require 'puppet/acceptance/common_utils' extend Puppet::Acceptance::CommandUtils require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils content = < 1) do |facter_output| assert_match(/options conflict/, facter_output.stderr.chomp, "Output does not contain error string") end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/no_ruby.rb000066400000000000000000000035371470204764400246640ustar00rootroot00000000000000# These tests are intended to ensure that the --no-ruby command-line option # works properly. The first ensures that the built in Ruby fact does not resolve # when using the --no-ruby fact, and also checks that the 'No Ruby' warning does # not appear in stderr. The second test ensures that custom facts are not resolved # when the --no-ruby option is present. test_name "C99987: --no-ruby commandline option" do require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils content = < { 'FACTERLIB' => custom_dir })) do |facter_output| assert_equal("", facter_output.stdout.chomp, "Expected custom fact to be disabled while using --no-ruby option, but it resolved as #{facter_output.stdout.chomp}") end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/puppet_facts.rb000066400000000000000000000022451470204764400256770ustar00rootroot00000000000000# Verify that -p loads external and custom facts from puppet locations test_name "C14783: facter -p loads facts from puppet" do tag 'risk:high' confine :to, :platform => /Skipped/ agents.each do |agent| external_dir = agent.puppet['pluginfactdest'] external_file = File.join(external_dir, "external.txt") custom_dir = File.join(agent.puppet['plugindest'], "facter") custom_file = File.join(custom_dir, 'custom.rb') teardown do agent.rm_rf(external_file) agent.rm_rf(custom_dir) end step "Agent #{agent}: create external fact" do agent.mkdir_p(external_dir) create_remote_file(agent, external_file, "external=external") end step "Agent #{agent}: create custom fact" do agent.mkdir_p(custom_dir) create_remote_file(agent, custom_file, "Facter.add(:custom) { setcode { 'custom' } }") end step "Agent #{agent}: verify facts" do on(agent, facter("-p external")) do |facter_output| assert_equal("external", facter_output.stdout.chomp) end on(agent, facter("-p custom")) do |facter_output| assert_equal("custom", facter_output.stdout.chomp) end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/sequential.rb000066400000000000000000000006121470204764400253500ustar00rootroot00000000000000test_name "--sequential argument does not generate any errors" do tag 'risk:high' agents.each do |agent| step "--sequential should generate no errors" do on(agent, facter("--sequential --debug"), :acceptable_exit_codes => 0) do |facter_output| assert_match(/Resolving facts sequentially/, facter_output.stderr, "Resolving facts sequentially") end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/show_legacy.rb000066400000000000000000000016021470204764400255020ustar00rootroot00000000000000# This test is intended to demonstrate that the `--show-legacy` command line option # causes hidden old facts to appear in the fact list. test_name "C87580: --show-legacy command-line option results in output with legacy (hidden) facts" do agents.each do |agent| step "Agent #{agent}: retrieve legacy output using a hash" do on(agent, facter("--show-legacy")) do |facter_output| assert_match(/^rubyversion => [0-9]+\.[0-9]+\.[0-9]+$/, facter_output.stdout.chomp, 'hash legacy output does not contain legacy fact rubyversion') end end step "Agent #{agent}: retrieve legacy output using the --json option" do on(agent, facter("--show-legacy --json")) do |facter_output| assert_match(/^ "rubyversion": "[0-9]+\.[0-9]+\.[0-9]+",$/, facter_output.stdout.chomp, 'json legacy output does not contain legacy fact rubyversion') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/strict.rb000066400000000000000000000007401470204764400245100ustar00rootroot00000000000000test_name 'C98098: --strict flag returns errors on non-existent facts' do tag 'risk:high' agents.each do |agent| step 'facter should return exit code 1 for querying non-existing-fact with --strict flag' do on(agent, facter('non-existing-fact --strict'), :acceptable_exit_codes => 1) do |facter_output| assert_match(/ERROR\s+.* - .*fact "non-existing-fact" does not exist/, facter_output.stderr, 'Unexpected error was detected!') end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/trace.rb000066400000000000000000000025361470204764400243030ustar00rootroot00000000000000# This test is intended to ensure that the --trace command-line option works # properly. This option provides backtraces for erroring custom Ruby facts. # To test, we try to resolve an erroneous custom fact and catch the backtrace. test_name "C99982: --trace command-line option enables backtraces for custom facts" do require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils content = < [1]) do |facter_output| assert_match(/backtrace:\s+#{custom_fact}/, facter_output.stderr, "Expected a backtrace for erroneous custom fact") end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/verbose.rb000066400000000000000000000011031470204764400246370ustar00rootroot00000000000000# This test is intended to ensure that the --verbose command-line option # works properly. This option provides verbose (INFO) output to stderr. test_name "C99986: --verbose command-line option prints verbose information to stderr" do agents.each do |agent| step "Agent #{agent}: retrieve verbose info from stderr using --verbose option" do on(agent, facter('--verbose')) do |facter_output| assert_match(/INFO .*executed with command line: --verbose/, facter_output.stderr, "Expected stderr to contain verbose (INFO) statements") end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/version.rb000066400000000000000000000010311470204764400246570ustar00rootroot00000000000000# This test is intended to ensure that the --version command-line option works # properly. This option outputs the current Facter version. test_name "C99983: --version command-line option returns the version string" do agents.each do |agent| step "Agent #{agent}: retrieve version info using the --version option" do on(agent, facter('--version')) do |facter_output| assert_match(/\d+\.\d+\.\d+/, facter_output.stdout, "Output #{facter_output.stdout} is not a recognized version string") end end end end puppetlabs-facter-dfe6df4/acceptance/tests/options/yaml.rb000066400000000000000000000030571470204764400241460ustar00rootroot00000000000000# This test is intended to ensure that the --yaml command-line option works # properly. This option causes Facter to output facts in YAML format. # A custom fact is used to test for parity between Facter's output and # the expected YAML output. test_name "C99967: --yaml command-line option results in valid YAML output" do require 'yaml' require 'facter/acceptance/user_fact_utils' extend Facter::Acceptance::UserFactUtils content = < {"nested" => "value1"}, "bar" => "value2", "baz" => "value3" } end end EOM agents.each do |agent| step "Agent #{agent}: create a structured custom fact" do custom_dir = get_user_fact_dir(agent['platform'], on(agent, facter('kernelmajversion')).stdout.chomp.to_f) custom_fact = File.join(custom_dir, 'custom_fact.rb') agent.mkdir_p(custom_dir) create_remote_file(agent, custom_fact, content) agent.chmod('+x', custom_fact) teardown do agent.rm_rf(custom_fact) end step "Agent #{agent}: retrieve output using the --yaml option" do on(agent, facter("--custom-dir \"#{custom_dir}\" --yaml structured_fact")) do |facter_output| begin expected = {"structured_fact" => {"foo" => {"nested" => "value1"}, "bar" => "value2", "baz" => "value3" }} assert_equal(expected, YAML.load(facter_output.stdout), "YAML output does not match expected output") rescue fail_test "Couldn't parse output as YAML" end end end end end end puppetlabs-facter-dfe6df4/acceptance/tests/session_cached_is_not_refershed_in_session.rb000066400000000000000000000013771470204764400323210ustar00rootroot00000000000000test_name 'facter should not update it`s session cache in same session' do tag 'risk:high' fact_content = <<-EOM require 'facter' seconds_before = Facter.value('system_uptime.seconds') sleep(3) seconds_after = Facter.value('system_uptime.seconds') puts seconds_before == seconds_after EOM agents.each do |agent| fact_dir = agent.tmpdir('test_scripts') script_path = File.join(fact_dir, 'session_test.rb') create_remote_file(agent, script_path, fact_content) teardown do agent.rm_rf(script_path) end on(agent, "#{ruby_command(agent)} #{script_path}") do |ruby_result| assert_equal('true', ruby_result.stdout.chomp, 'Expect the session cache is not reset in same session') end end end puppetlabs-facter-dfe6df4/acceptance/tests/ticket_1238_hostname_fqdn.rb000066400000000000000000000035211470204764400263530ustar00rootroot00000000000000test_name 'C93827: facter fqdn should return the hostname when its a fully qualified domain name' do tag 'risk:high' require 'timeout' confine :except, :platform => 'windows' fqdn = 'foo.bar.example.org' fqdn_long = 'a23456789.b23456789.c23456789.d23456789.e23456789.f23456789.wxyz' agents.each do |agent| orig_hostname = on(agent, 'hostname').stdout.chomp teardown do step 'restore original hostname' do on(agent, "hostname #{orig_hostname}") end end step "set hostname as #{fqdn}" do on(agent, "hostname #{fqdn}") begin Timeout.timeout(20) do until on(agent, 'hostname').stdout =~ /#{fqdn}/ sleep(0.25) # on Solaris 11 hostname returns before the hostname is updated end end rescue Timeout::Error raise "Failed to reset the hostname of the test machine to #{fqdn}" end end step 'validate facter uses hostname as the fqdn if its a fully qualified domain name' do on(agent, 'facter fqdn') do |facter_output| assert_equal(fqdn, facter_output.stdout.chomp, 'facter did not return the hostname set by the test') end end end step "long hostname as #{fqdn_long}" do on(agent, "hostname #{fqdn_long}") begin Timeout.timeout(20) do until on(agent, 'hostname').stdout =~ /#{fqdn_long}/ sleep(0.25) # on Solaris 11 hostname returns before the hostname is updated end end rescue Timeout::Error raise "Failed to reset the hostname of the test machine to #{fqdn_long}" end end step 'validate facter uses hostname as the LONG fqdn if its a fully qualified domain name' do on(agent, 'facter fqdn') do |facter_output| assert_equal(fqdn_long, facter_output.stdout.chomp, 'facter did not return the hostname set by the test') end end end puppetlabs-facter-dfe6df4/bin/000077500000000000000000000000001470204764400164775ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/bin/facter000077500000000000000000000003751470204764400176760ustar00rootroot00000000000000#!/usr/bin/env ruby # frozen_string_literal: true require 'pathname' require 'facter/framework/cli/cli_launcher' Facter::OptionsValidator.validate(ARGV) processed_arguments = CliLauncher.prepare_arguments(ARGV) CliLauncher.start(processed_arguments) puppetlabs-facter-dfe6df4/custom_facts/000077500000000000000000000000001470204764400204215ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/custom_facts/my_custom_fact.rb000077500000000000000000000002011470204764400237560ustar00rootroot00000000000000# frozen_string_literal: true Facter.add(:my_custom_fact) do has_weight(10_000) setcode do Facter.value('os') end end puppetlabs-facter-dfe6df4/custom_facts/my_custom_os_fact.rb000066400000000000000000000001621470204764400244620ustar00rootroot00000000000000# frozen_string_literal: true Facter.add(:oss) do has_weight(10_000) setcode do 'my_custom_os' end end puppetlabs-facter-dfe6df4/docs/000077500000000000000000000000001470204764400166575ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/docs/data-flow.md000066400000000000000000000052371470204764400210660ustar00rootroot00000000000000## Data Flow This shows the general data flow when a user runs facter on the command to lookup facts `a.b` and `c`. Generally, facter loads fact definitions (`LoadedFact`) to determine all of the things it could collect, including internal (aka core) facts, custom facts (implemented using the `Facter.add` API) and external facts (json, yaml, bash, etc). Each `LoadedFact` specifies a name like `os.family` and a class that can be called later to collect the values, e.g. `Facts::Linux::Os::Release`. The `QueryParser` parse both user queries `a.b` and `c` and matches each query against all LoadedFacts, returning an array of `SearchedFacts`. These are more like SearchableFacts, since they haven't been searched yet. Facter attempts to lookup the facts from the cache, otherwise it calls the `InternalFactManager` and `ExternalFactManager` to resolve facts. For internal facts, facter wraps each `SearchedFact` with a `CoreFact`. The `CoreFact` calls the `call_the_resolver` method on the class that the `SearchedFact` references. The `call_the_resolver` method then typically delegates to a resolver and returns the fact value which may be scalar or structured data. For example, `os.family` returns a string, but `gce` returns a Hash. ```mermaid flowchart TD CLI[facter a.b c] --> Facter[Facter.to_user_output] Facter --> FactManager[FactManager#resolve_facts] FactManager --> FactLoader[FactLoader.load] FactLoader -->|internal| InternalFactLoader[InternalLoader.core_facts] FactLoader -->|custom| CustomFactLoader[ExternalFactLoader.custom_facts] FactLoader -->|external| ExternalFactLoader[ExternalFactLoader.external_facts] InternalFactLoader --> QueryParser[QueryParser.parse] CustomFactLoader --> QueryParser ExternalFactLoader --> QueryParser QueryParser -->|empty query| AllSearchable[All loaded facts are searchable] QueryParser -->|not empty| SomeSearchable[Match query tokens to loaded facts] AllSearchable --> SearchedFacts[Array of SearchedFacts] SomeSearchable --> SearchedFacts SearchedFacts --> CacheManager[CacheManager.resolve_facts] CacheManager -->|internal| InternalFactManager[InternalFactManager.resolve_facts] InternalFactManager --> CoreFact[CoreFact#create] CoreFact --> SearchedFact[SearchedFact -> call_the_resolver] SearchedFact --> Resolvers[Facter::Resolvers::*.resolve] CacheManager -->|external| ExternalFactManager[ExternalFactManager.resolve_facts] Resolvers --> ResolvedFacts[Array of ResolvedFacts] ExternalFactManager --> ResolvedFacts ResolvedFacts --> CacheFacts[CacheManager.cache_facts] CacheFacts --> FilterFacts[FactFilter#filter_facts!] FilterFacts --> Formatter ``` puppetlabs-facter-dfe6df4/ext/000077500000000000000000000000001470204764400165275ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/ext/build_defaults.yaml000066400000000000000000000001611470204764400223770ustar00rootroot00000000000000--- build_gem: TRUE project: facter nonfinal_gem_path: '/opt/repository-nightlies/downloads/gems/facter-nightly' puppetlabs-facter-dfe6df4/ext/project_data.yaml000066400000000000000000000011011470204764400220430ustar00rootroot00000000000000--- project: 'facter' author: 'Puppet Labs' email: 'team-nw@puppet.com' homepage: 'https://github.com/puppetlabs/facter' summary: 'Facter, a system inventory tool' description: 'You can prove anything with facts!' version_file: 'lib/facter/version.rb' files: 'bin/facter lib/facter.rb lib/**/*.rb' gem_files: 'bin/facter lib/facter.rb lib/**/*.rb' gem_require_path: 'lib' gem_executables: 'facter' gem_license: 'Apache-2.0' gem_default_executables: 'facter' gem_required_ruby_version: ['>= 2.5', '< 4.0'] gem_runtime_dependencies: hocon: ~> 1.3 thor: ['>= 1.0.1', '< 1.3'] puppetlabs-facter-dfe6df4/external_facts/000077500000000000000000000000001470204764400207315ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/external_facts/my_external_fact.txt000066400000000000000000000000241470204764400250120ustar00rootroot00000000000000my_external_fact=123puppetlabs-facter-dfe6df4/facter.conf000066400000000000000000000002151470204764400200400ustar00rootroot00000000000000facts : { blocklist : [ ], ttls : [ { "uptime": 30 days } ] } fact-groups : { cached-custom-facts : ["os.name", "os.family"], } puppetlabs-facter-dfe6df4/facter.gemspec000066400000000000000000000044001470204764400205360ustar00rootroot00000000000000# frozen_string_literal: true lib = File.expand_path('lib', __dir__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) Gem::Specification.new do |spec| spec.name = 'facter' spec.version = '4.10.0' spec.authors = ['Puppet'] spec.email = ['team-nw@puppet.com'] spec.homepage = 'https://github.com/puppetlabs/facter' spec.summary = 'Facter, a system inventory tool' spec.description = 'You can prove anything with facts!' spec.license = 'Apache-2.0' dirs = Dir[File.join(__dir__, 'bin/facter')] + Dir[File.join(__dir__, 'LICENSE')] + Dir[File.join(__dir__, 'lib/**/*.rb')] + Dir[File.join(__dir__, 'lib/**/*.json')] + Dir[File.join(__dir__, 'lib/**/*.conf')] + Dir[File.join(__dir__, 'lib/**/*.erb')] base = "#{__dir__}#{File::SEPARATOR}" spec.files = dirs.map { |path| path.sub(base, '') } spec.required_ruby_version = '>= 2.5', '< 4.0' spec.bindir = 'bin' spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.require_paths = ['lib'] # While we require both ffi and sys-filesystem in parts of Facter, we specify # them as development, not runtime, dependencies. Both gems either directly # or indirectly contain native extensions. The intent behind excluding these # gems from runtime dependencies is to allow users to be able to install # Facter without a compiler. # ffi 1.16.0 - 1.16.2 are broken on Windows spec.add_development_dependency 'ffi', '>= 1.15.5', '< 1.17.0', '!= 1.16.0', '!= 1.16.1', '!= 1.16.2' spec.add_development_dependency 'rake', '~> 13.0', '>= 13.0.6' spec.add_development_dependency 'rspec', '~> 3.0' spec.add_development_dependency 'rubocop', '~> 1.28' # last version to support 2.5 spec.add_development_dependency 'rubocop-performance', '~> 1.5.2' spec.add_development_dependency 'rubocop-rspec', '~> 2.10' # last version to support 2.5 spec.add_development_dependency 'simplecov', '~> 0.17.1' spec.add_development_dependency 'sys-filesystem', '~> 1.4' spec.add_development_dependency 'webmock', '~> 3.12' spec.add_development_dependency 'yard', '~> 0.9' spec.add_runtime_dependency 'hocon', '~> 1.3' spec.add_runtime_dependency 'thor', ['>= 1.0.1', '< 1.3'] # Thor 1.3.0 drops support for Ruby 2.5 end puppetlabs-facter-dfe6df4/install.rb000077500000000000000000000230011470204764400177210ustar00rootroot00000000000000#! /usr/bin/env ruby # frozen_string_literal: true #-- # Copyright 2004 Austin Ziegler # Install utility. Based on the original installation script for rdoc by the # Pragmatic Programmers. # # This program is free software. It may be redistributed and/or modified under # the terms of the GPL version 2 (or later) or the Ruby licence. # # Usage # ----- # In most cases, if you have a typical project layout, you will need to do # absolutely nothing to make this work for you. This layout is: # # bin/ # executable files -- "commands" # lib/ # the source of the library # # The default behaviour: # 1) Install commands from bin/ into the Ruby bin directory. On Windows, if a # if a corresponding batch file (.bat or .cmd) exists in the bin directory, # it will be copied over as well. Otherwise, a batch file (always .bat) will # be created to run the specified command. # 2) Install all library files ending in .rb from lib/ into Ruby's # site_lib/version directory. # #++ require 'rbconfig' require 'find' require 'fileutils' require 'tempfile' require 'optparse' require 'ostruct' class Installer include FileUtils InstallOptions = OpenStruct.new # Returns true if OS is windows (copied from facter/util/config.rb) def windows? (defined?(RbConfig) ? RbConfig : Config)::CONFIG['host_os'] =~ /mswin|win32|dos|mingw|cygwin/i end def glob(list) g = list.map { |i| Dir.glob(i) } g.flatten! g.compact! g end def do_configs(configs, target, strip = 'ext/') Dir.mkdir(target) unless File.directory? target configs.each do |cf| ocf = File.join(InstallOptions.config_dir, cf.gsub(/#{strip}/, '')) install(cf, ocf, mode: 0o644, preserve: true, verbose: true) end end def do_bins(bins, target, strip = 's?bin/') Dir.mkdir(target) unless File.directory? target bins.each do |bf| obf = bf.gsub(/#{strip}/, '') install_binfile(bf, obf, target) end end def do_libs(libs, strip = 'lib/') libs.each do |lf| olf = File.join(InstallOptions.site_dir, lf.gsub(/#{strip}/, '')) op = File.dirname(olf) makedirs(op, mode: 0o755, verbose: true) chmod(0o755, op) install(lf, olf, mode: 0o644, preserve: true, verbose: true) end end def do_man(man, strip = 'man/') man.each do |mf| omf = File.join(InstallOptions.man_dir, mf.gsub(/#{strip}/, '')) om = File.dirname(omf) makedirs(om, mode: 0o755, verbose: true) chmod(0o755, om) install(mf, omf, mode: 0o644, preserve: true, verbose: true) gzip = `which gzip` gzip.chomp! `#{gzip} -f #{omf}` end end ## # Prepare the file installation. # def prepare_installation InstallOptions.configs = true InstallOptions.batch_files = true ARGV.options do |opts| opts.banner = "Usage: #{File.basename($PROGRAM_NAME)} [options]" opts.separator '' opts.on('--[no-]configs', 'Prevents the installation of config files', 'Default off.') do |onconfigs| InstallOptions.configs = onconfigs end opts.on('--destdir[=OPTIONAL]', 'Installation prefix for all targets', 'Default essentially /') do |destdir| InstallOptions.destdir = destdir end # opts.on('--configdir[=OPTIONAL]', 'Installation directory for config files', 'Default /etc') do |configdir| # InstallOptions.configdir = configdir # end opts.on('--bindir[=OPTIONAL]', 'Installation directory for binaries', 'overrides RbConfig::CONFIG["bindir"]') do |bindir| InstallOptions.bindir = bindir end opts.on('--ruby[=OPTIONAL]', 'Ruby interpreter to use with installation', 'overrides ruby used to call install.rb') do |ruby| InstallOptions.ruby = ruby end opts.on('--sitelibdir[=OPTIONAL]', 'Installation directory for libraries', 'overrides RbConfig::CONFIG["sitelibdir"]') do |sitelibdir| InstallOptions.sitelibdir = sitelibdir end opts.on('--mandir[=OPTIONAL]', 'Installation directory for man pages', 'overrides RbConfig::CONFIG["mandir"]') do |mandir| InstallOptions.mandir = mandir end opts.on('--full', 'Performs a full installation. All', 'optional installation steps are run.') do |_full| InstallOptions.configs = true end opts.on('--no-batch-files', 'Prevents installation of batch files for windows', 'Default off') do |_batch_files| InstallOptions.batch_files = false end opts.separator('') opts.on_tail('--help', 'Shows this help text.') do warn opts exit end opts.parse! end version = [RbConfig::CONFIG['MAJOR'], RbConfig::CONFIG['MINOR']].join('.') libdir = File.join(RbConfig::CONFIG['libdir'], 'ruby', version) # Mac OS X 10.5 and higher declare bindir # /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin # which is not generally where people expect executables to be installed # These settings are appropriate defaults for all OS X versions. RbConfig::CONFIG['bindir'] = '/usr/bin' if RUBY_PLATFORM =~ /^universal-darwin[\d.]+$/ # if InstallOptions.configdir # configdir = InstallOptions.configdir # elsif windows? # path = File.join(File.dirname(__FILE__), "lib", "custom_facts", "util", "config.rb") # require_relative(path) # configdir = File.join(LegacyFacter::Util::Config.windows_data_dir, "PuppetLabs", "facter", "etc") # else # configdir = File.join('/', 'etc', 'puppetlabs', 'facter') # end bindir = InstallOptions.bindir || RbConfig::CONFIG['bindir'] if InstallOptions.sitelibdir sitelibdir = InstallOptions.sitelibdir else sitelibdir = RbConfig::CONFIG['sitelibdir'] if sitelibdir.nil? sitelibdir = $LOAD_PATH.find { |x| x =~ /site_ruby/ } if sitelibdir.nil? sitelibdir = File.join(libdir, 'site_ruby') elsif sitelibdir !~ Regexp.quote(version) sitelibdir = File.join(sitelibdir, version) end end end mandir = InstallOptions.mandir || RbConfig::CONFIG['mandir'] # This is the new way forward destdir = InstallOptions.destdir || '' # configdir = join(destdir, configdir) bindir = join(destdir, bindir) mandir = join(destdir, mandir) sitelibdir = join(destdir, sitelibdir) # makedirs(configdir) if InstallOptions.configs makedirs(bindir) makedirs(mandir) makedirs(sitelibdir) InstallOptions.site_dir = sitelibdir # InstallOptions.config_dir = configdir InstallOptions.bin_dir = bindir InstallOptions.lib_dir = libdir InstallOptions.man_dir = mandir end ## # Join two paths. On Windows, dir must be converted to a relative path, # by stripping the drive letter, but only if the basedir is not empty. # def join(basedir, dir) return "#{basedir}#{dir[2..-1]}" if windows? && !basedir.empty? && (dir.length > 2) "#{basedir}#{dir}" end ## # Install file(s) from ./bin to RbConfig::CONFIG['bindir']. Patch it on the way # to insert a #! line; on a Unix install, the command is named as expected # (e.g., bin/rdoc becomes rdoc); the shebang line handles running it. Under # windows, we add an '.rb' extension and let file associations do their stuff. def install_binfile(from, op_file, target) tmp_file = Tempfile.new('facter-binfile') ruby = if !InstallOptions.ruby.nil? InstallOptions.ruby else File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name']) end File.open(from) do |ip| File.open(tmp_file.path, 'w') do |op| op.puts "#!#{ruby}" contents = ip.readlines contents.shift if contents[0] =~ /^#!/ op.write contents.join end end if windows? && InstallOptions.batch_files installed_wrapper = false if File.exist?("#{from}.bat") install("#{from}.bat", File.join(target, "#{op_file}.bat"), mode: 0o755, preserve: true, verbose: true) installed_wrapper = true end if File.exist?("#{from}.cmd") install("#{from}.cmd", File.join(target, "#{op_file}.cmd"), mode: 0o755, preserve: true, verbose: true) installed_wrapper = true end unless installed_wrapper tmp_file2 = Tempfile.new('facter-wrapper') cwv = <<-SCRIPT @echo off SETLOCAL if exist "%~dp0environment.bat" ( call "%~dp0environment.bat" %0 %* ) else ( SET "PATH=%~dp0;%PATH%" ) ruby.exe -S -- facter %* SCRIPT File.open(tmp_file2.path, 'w') { |cw| cw.puts cwv } install(tmp_file2.path, File.join(target, "#{op_file}.bat"), mode: 0o755, preserve: true, verbose: true) tmp_file2.unlink end end install(tmp_file.path, File.join(target, op_file), mode: 0o755, preserve: true, verbose: true) tmp_file.unlink end # Change directory into the facter root so we don't get the wrong files for install. def run cd File.dirname(__FILE__) do # Set these values to what you want installed. bins = glob(%w[bin/facter]) libs = glob(%w[lib/**/*.rb lib/facter/fixtures/* lib/facter/os_hierarchy.json lib/facter/fact_groups.conf lib/facter/templates/*]) man = glob(%w{man/man[0-9]/*}) prepare_installation do_bins(bins, InstallOptions.bin_dir) do_libs(libs) do_man(man) unless windows? end end end Installer.new.run puppetlabs-facter-dfe6df4/lib/000077500000000000000000000000001470204764400164755ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/docs/000077500000000000000000000000001470204764400174255ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/docs/generate.rb000077500000000000000000000017701470204764400215540ustar00rootroot00000000000000#!/usr/bin/env ruby # frozen_string_literal: true # Generates a markdown file containing fact documentation. # usage: ruby generate.rb > facts.md require 'yaml' require 'erb' require 'ostruct' PATH_TO_SCHEMA = File.join(File.dirname(__FILE__), '../schema/facter.yaml') PATH_TO_TEMPLATE = File.join(File.dirname(__FILE__), 'template.erb') schema = YAML.load_file(PATH_TO_SCHEMA) def format_facts(fact_hash) scope = OpenStruct.new({ facts: fact_hash }) erb = if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+ ERB.new(File.read(PATH_TO_TEMPLATE), trim_mode: '-') else ERB.new(File.read(PATH_TO_TEMPLATE), nil, '-') end erb.result(scope.instance_eval { binding }) end print "## Modern Facts\n\n" print format_facts(schema.reject { |_name, info| info['hidden'] == true }) print "## Legacy Facts\n\n" print format_facts(schema.reject { |_name, info| info['hidden'].nil? || info['hidden'] == false }) puppetlabs-facter-dfe6df4/lib/docs/generate_cli.rb000066400000000000000000000002001470204764400223630ustar00rootroot00000000000000# frozen_string_literal: true require_relative '../facter/framework/cli/cli_launcher' cli = Facter::Cli.new([]) puts cli.man puppetlabs-facter-dfe6df4/lib/docs/namespaces.dox000066400000000000000000000042371470204764400222660ustar00rootroot00000000000000/** * The root namespace for facter. */ namespace facter { /** * The namespace for executing commands. */ namespace execution { } /** * The namespace for fact-related types. */ namespace facts { /** * The namespace for BSD-related types and fact resolvers. */ namespace bsd { } /** * The namespace for external types and fact resolvers. */ namespace external { } /** * The namespace for Linux-related types and fact resolvers. */ namespace linux { } /** * The namespace for OSX-related types and fact resolvers. */ namespace osx { } /** * The namespace for POSIX-related types and fact resolvers. */ namespace posix { } /** * The namespace for base resolvers. */ namespace resolvers { } /** * The namespace for Solaris-related types and fact resolvers. */ namespace solaris { } /** * The namespace for Windows-related types and fact resolvers. */ namespace windows { } /** * The namespace for ZFS fact resolvers. */ namespace zfs { } } /** * The namespace for logging functions and macros. */ namespace logging { } /** * The namespace for the Ruby compatibility layer. */ namespace ruby { } /** * The namespace for utilty functions and types. */ namespace util { /** * The namespace for utility types that are BSD-specific. */ namespace bsd { } /** * The namespace for utility types that are POSIX-specific. */ namespace posix { } /** * The namespace for utility types that are Solaris-specific. */ namespace solaris { } /** * The namespace for utility types that are Windows-specific. */ namespace windows { } } } puppetlabs-facter-dfe6df4/lib/docs/template.erb000066400000000000000000000015621470204764400217360ustar00rootroot00000000000000<%# This template is used to generate a markdown file documenting facts. -%> <%# Run 'ruby generate.rb > facts.md' to generate the markdown file. -%> <% def format_fact_element(name, info, indent = '') subelements = (info['elements'] || {}).map{|n, i| format_fact_element(n, i, "#{indent} ")}.join('') "#{indent}* `#{name}` (#{info['type']}) --- #{info['description']}\n#{subelements}" end -%> <% facts.each do |name, schema| -%> ### `<%= name %>` <% if schema['hidden'] -%> This legacy fact is hidden by default in Facter's command-line output. <% end -%> **Type:** <%= schema['type'] %> **Purpose:** <%= schema['description'] %> <% if schema['elements'] -%> **Elements:** <%= schema['elements'].map{|name, info| format_fact_element(name, info)}.join('') %> <% end -%> <% if schema['details'] -%> **Details:** <%= schema['details'] %> <% end -%> <% end -%> puppetlabs-facter-dfe6df4/lib/facter.rb000066400000000000000000000434661470204764400203030ustar00rootroot00000000000000# frozen_string_literal: true require 'pathname' require_relative 'util/api_debugger' if ENV['API_DEBUG'] require_relative 'facter/version' require_relative 'facter/framework/core/file_loader' require_relative 'facter/framework/core/options/options_validator' module Facter class ResolveCustomFactError < StandardError; end Options.init Log.output(STDOUT) @already_searched = {} class << self # Method used by puppet-agent to retrieve facts # @param args_as_string [string] facter cli arguments # # @return [Hash] # # @api private def resolve(args_as_string) require_relative 'facter/framework/cli/cli_launcher' args = args_as_string.split(' ') Facter::OptionsValidator.validate(args) processed_arguments = CliLauncher.prepare_arguments(args, nil) cli = Facter::Cli.new([], processed_arguments) cli_options = cli.options.dup # config file options config_file = cli_options.delete(:config) if config_file Facter::OptionStore.set(:config, config_file) Facter::ConfigFileOptions.init(config_file) Facter::Options.store(ConfigFileOptions.get) end # user provided options cli_options[:show_legacy] ||= false Facter::Options.store(cli_options) Hash[queried_facts(cli.args)] end # Method used by cli to set puppet paths # in order to retrieve puppet custom and external facts # # @return nil # # @api private def puppet_facts require 'puppet' # don't allow puppet logger to be injected in Facter Options[:allow_external_loggers] = false Puppet.initialize_settings $LOAD_PATH << Puppet[:libdir] unless $LOAD_PATH.include?(Puppet[:libdir]) Facter.reset Facter.search_external([Puppet[:pluginfactdest]]) if Puppet.respond_to? :initialize_facts Puppet.initialize_facts else Facter.add(:puppetversion) do setcode { Puppet.version.to_s } end end rescue LoadError => e logger.error("Could not load puppet gem, got #{e}") end # Alias method for Facter.fact() # @param name [string] fact name # # @return [Facter::Util::Fact, nil] The fact object, or nil if no fact # is found. # # @api public def [](name) fact(name) end # Add custom facts to fact collection # @param name [String] Custom fact name # @param options = {} [Hash] optional parameters for the fact - attributes # of {Facter::Util::Fact} and {Facter::Util::Resolution} can be # supplied here # @param block [Proc] a block defining a fact resolution # # @return [Facter::Util::Fact] the fact object, which includes any previously # defined resolutions # # @api public def add(name, options = {}, &block) options[:fact_type] = :custom LegacyFacter.add(name, options, &block) LegacyFacter.collection.invalidate_custom_facts end # Clears all cached values and removes all facts from memory. # # @return [nil] # # @api public def clear @already_searched = {} Facter.clear_messages LegacyFacter.clear Options[:custom_dir] = [] LegacyFacter.collection.invalidate_custom_facts LegacyFacter.collection.reload_custom_facts SessionCache.invalidate_all_caches nil end # Clears the seen state of debug and warning messages. # # @return [nil] def clear_messages Facter::Log.clear_messages end # Retrieves the value of a core fact. External or custom facts are # not returned with this call. Returns `nil` if no such fact exists. # # @return [FactCollection] A hash with fact names and values # # @api private def core_value(user_query) user_query = user_query.to_s resolved_facts = Facter::FactManager.instance.resolve_core([user_query]) fact_collection = FactCollection.new.build_fact_collection!(resolved_facts) splitted_user_query = Facter::Utils.split_user_query(user_query) fact_collection.dig(*splitted_user_query) end # Logs debug message when debug option is set to true # @param message [Object] Message object to be logged # # @return [nil] # # @api public def debug(message) return unless debugging? logger.debug(message.to_s) nil end # Logs the same debug message only once when debug option is set to true # @param message [Object] Message object to be logged # # @return [nil] # # @api public def debugonce(message) logger.debugonce(message) nil end # Define a new fact or extend an existing fact. # # @param name [Symbol] The name of the fact to define # @param options [Hash] A hash of options to set on the fact # # @return [Facter::Util::Fact] The fact that was defined # # @api public def define_fact(name, options = {}, &block) options[:fact_type] = :custom LegacyFacter.define_fact(name, options, &block) end # Stores a proc that will be used to output custom messages. # The proc must receive one parameter that will be the message to log. # @param block [Proc] a block defining messages handler # # @return [nil] # # @api public def on_message(&block) Facter::Log.on_message(&block) nil end # Check whether debugging is enabled # # @return [bool] # # @api public def debugging? Options[:debug] end # Enable or disable debugging # @param debug_bool [bool] State which debugging should have # # @return [type] [description] # # @api public def debugging(debug_bool) Facter::Options[:debug] = debug_bool end # Check whether http debugging is enabled # # @return [bool] # # @api public def http_debug? Options[:http_debug] end # Enable or disable http debugging # @param debug_bool [bool] State which http debugging should have # # @return [type] [description] # # @api public def http_debug(http_debug_bool) Facter::Options[:http_debug] = http_debug_bool end # Enable sequential resolving of facts # # @return [bool] # # @api public def enable_sequential Facter::Options[:sequential] = true end # Disable sequential resolving of facts # # @return [bool] # # @api public def disable_sequential Facter::Options[:sequential] = false end # Check if facts are resolved sequentially or not # # @return [bool] # # @api public def sequential? Facter::Options[:sequential] end # Iterates over fact names and values # # @yieldparam [String] name the fact name # @yieldparam [String] value the current value of the fact # # @return [Facter] # # @api public def each log_blocked_facts resolved_facts = Facter::FactManager.instance.resolve_facts resolved_facts.each do |fact| yield(fact.name, fact.value) end self end # Reset search paths for custom and external facts # If config file is set custom and external facts will be reloaded # # @return [nil] # # @api public def reset LegacyFacter.reset Options[:custom_dir] = [] Options[:external_dir] = [] SessionCache.invalidate_all_caches nil end # Flushes cached values for all facts. This does not cause code to be # reloaded; it only clears the cached results. # # @return [void] # # @api public def flush LegacyFacter.flush SessionCache.invalidate_all_caches nil end # Loads all facts # # @return [nil] # # @api public def loadfacts LegacyFacter.loadfacts nil end # Enables/Disables external facts. # @param enable_external [boolean] # # @return nil # # @api public def load_external(enable_external) # enable_external param needs negation because behind the scene # no_external_facts= method is negating the parameter again. Options[:no_external_facts] = !enable_external if enable_external logger.debug('Facter.load_external(true) called. External facts will be loaded') else logger.debug('Facter.load_external(false) called. External facts will NOT be loaded') end nil end # Register directories to be searched for custom facts. The registered directories # must be absolute paths or they will be ignored. # @param dirs [Array] An array of searched directories # # @return [nil] # # @api public def search(*dirs) Options[:custom_dir] += dirs nil end # Registers directories to be searched for external facts. # @param dirs [Array] An array of searched directories # # @return [nil] # # @api public def search_external(dirs) Options[:external_dir] += dirs nil end # Returns the registered search directories.for external facts. # # @return [Array] An array of searched directories # # @api public def search_external_path Options.external_dir end # Returns the registered search directories for custom facts. # # @return [Array] An array of the directories searched # # @api public def search_path Options.custom_dir end # Retrieves a fact's value. Returns `nil` if no such fact exists. # # @param user_query [String] the fact name # @return [Hash] # # @api public def to_hash log_blocked_facts logger.debug("Facter version: #{Facter::VERSION}") resolved_facts = Facter::FactManager.instance.resolve_facts resolved_facts.reject! { |fact| fact.type == :custom && fact.value.nil? } collection = Facter::FactCollection.new.build_fact_collection!(resolved_facts) # Ensures order of keys in hash returned from Facter.to_hash() and # Facter.resolve() is always stable if collection.empty? Hash[collection] else Hash[Facter::Utils.sort_hash_by_key(collection)] end end # Check whether printing stack trace is enabled # # @return [bool] # # @api public def trace? Options[:trace] end # Enable or disable trace # @param bool [bool] Set trace on debug state # # @return [bool] Value of trace debug state # # @api public def trace(bool) Options[:trace] = bool end # Gets the value for a fact. Returns `nil` if no such fact exists. # # @param user_query [String] the fact name # @return [String] the value of the fact, or nil if no fact is found # # @api public def value(user_query) user_query = user_query.to_s.downcase resolve_fact(user_query) unless @already_searched.include?(user_query) @already_searched[user_query]&.value end # Returns a fact object by name. If you use this, you still have to # call {Facter::Util::Fact#value `value`} on it to retrieve the actual # value. # # @param user_query [String] the name of the fact # # @return [Facter::Util::Fact, nil] The fact object, or nil if no fact # is found. # # @api public def fact(user_query) user_query = user_query.to_s.downcase resolve_fact(user_query) unless @already_searched.include?(user_query) @already_searched[user_query] end # Returns Facter version # # @return [String] Current version # # @api public def version Facter::VERSION end # Gets a hash mapping fact names to their values # # @return [Array] the hash of fact names and values # # @api private def to_user_output(cli_options, *args) init_cli_options(cli_options) logger.info("executed with command line: #{ARGV.drop(1).join(' ')}") logger.debug("Facter version: #{Facter::VERSION}") log_blocked_facts resolved_facts = resolve_facts_for_user_query(args) fact_formatter = Facter::FormatterFactory.build(Facter::Options.get) status = error_check(resolved_facts) [fact_formatter.format(resolved_facts), status] end # Logs an exception and an optional message # # @return [nil] # # @api public def log_exception(exception, message = nil) error_message = [] error_message << message.to_s unless message.nil? || (message.is_a?(String) && message.empty?) parse_exception(exception, error_message) logger.error(error_message.flatten.join("\n")) nil end # Returns a list with the names of all resolved facts # @return [Array] the list with all the fact names # # @api public def list to_hash.keys.sort end # Logs the message parameter as a warning. # @param message [Object] the warning object to be displayed # # @return [nil] # # @api public def warn(message) logger.warn(message.to_s) nil end # Logs only once the same warning message. # @param message [Object] the warning message object # # @return [nil] # # @api public def warnonce(message) logger.warnonce(message) nil end private def queried_facts(user_query) log_blocked_facts resolved_facts = Facter::FactManager.instance.resolve_facts(user_query) resolved_facts.reject! { |fact| fact.type == :custom && fact.value.nil? } # Ensures order of keys in hash returned from Facter.to_hash() and # Facter.resolve() is always stable if user_query.count.zero? Facter::Utils.sort_hash_by_key(Facter::FactCollection.new.build_fact_collection!(resolved_facts)) else FormatterHelper.retrieve_facts_to_display_for_user_query(user_query, resolved_facts) end end def resolve_facts_for_user_query(user_query) resolved_facts = Facter::FactManager.instance.resolve_facts(user_query) user_querie = resolved_facts.uniq(&:user_query).map(&:user_query).first resolved_facts.reject! { |fact| fact.type == :custom && fact.value.nil? } if user_querie&.empty? resolved_facts end def parse_exception(exception, error_message) if exception.is_a?(Exception) error_message << exception.message if error_message.empty? if Options[:trace] && !exception.backtrace.nil? error_message << 'backtrace:' error_message.concat(exception.backtrace) end elsif error_message.empty? error_message << exception.to_s end end def logger @logger ||= Log.new(self) end def init_cli_options(options) options = options.map { |(k, v)| [k.to_sym, v] }.to_h Facter::Options.init_from_cli(options) end def add_fact_to_searched_facts(user_query, value) @already_searched[user_query] ||= ResolvedFact.new(user_query, value) @already_searched[user_query].value = value end # Returns a ResolvedFact and saves the result in @already_searched array that is used as a global collection. # @param user_query [String] Fact that needs resolution # # @return [ResolvedFact] def resolve_fact(user_query) user_query = user_query.to_s resolved_facts = Facter::FactManager.instance.resolve_fact(user_query) # we must make a distinction between custom facts that return nil and nil facts # Nil facts should not be packaged as ResolvedFacts! (add_fact_to_searched_facts packages facts) resolved_facts = resolved_facts.reject { |fact| fact.type == :nil } fact_collection = FactCollection.new.build_fact_collection!(resolved_facts) begin value = fact_collection.value(user_query) add_fact_to_searched_facts(user_query, value) rescue KeyError, TypeError nil end end # Returns exit status when user query contains facts that do # not exist # # @param resolved_facts [Array] List of resolved facts # # @return [1/nil] Will return status 1 if user query contains # facts that are not found or resolved, otherwise it will return nil # # @api private def error_check(resolved_facts) status = 0 if Options[:strict] missing_names = resolved_facts.select { |fact| fact.type == :nil }.map(&:user_query) if missing_names.count.positive? status = 1 log_errors(missing_names) end end status end # Prints out blocked facts before to_hash or to_user_output is called # # @return [nil] # # @api private def log_blocked_facts block_list = Options[:block_list] return unless block_list.any? && Facter::Options[:block] logger.debug("blocking collection of #{block_list.join("\s")} facts") end # Used for printing errors regarding CLI user input validation # # @param missing_names [Array] List of facts that were requested # but not found # # @return [nil] # # @api private def log_errors(missing_names) missing_names.each do |missing_name| logger.error("fact \"#{missing_name}\" does not exist.", true) end end # Proxy method that catches not yet implemented method calls # # @param name [type] [description] # @param *args [type] [description] # @param &block [type] [description] # # @return [type] [description] # # @api private def method_missing(name, *args, &block) logger.error( "--#{name}-- not implemented but required \n" \ 'with params: ' \ "#{args.inspect} \n" \ 'with block: ' \ "#{block.inspect} \n" \ "called by: \n" \ "#{caller} \n" ) nil end # We don't respond to any missing methods # # @api private def respond_to_missing?(_method, *) false end prepend ApiDebugger if ENV['API_DEBUG'] end end puppetlabs-facter-dfe6df4/lib/facter/000077500000000000000000000000001470204764400177415ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/config.rb000066400000000000000000000223541470204764400215410ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Config unless defined?(OS_HIERARCHY) OS_HIERARCHY = [ { 'Linux' => [ { 'Debian' => [ 'Elementary', { 'Ubuntu' => [ 'Linuxmint' ] }, 'Raspbian', 'Devuan' ] }, { 'Rhel' => %w[ Fedora Amzn Centos Ol Scientific Meego Oel Ovs Mariner Azurelinux ] }, { 'Sles' => %w[ Opensuse Sled ] }, 'Archlinux', 'Gentoo', 'Alpine', 'Photon', 'Slackware', 'Mageia', 'Openwrt' ] }, { 'Bsd' => %w[ Freebsd Openbsd ] }, 'Solaris', 'Macosx', 'Windows', 'Aix' ].freeze end unless defined? FACT_GROUPS FACT_GROUPS = { 'AIX NIM type' => [ 'nim_type' ], 'EC2' => %w[ ec2_metadata ec2_userdata ], 'GCE' => [ 'gce' ], 'Xen' => %w[ xen xendomains ], 'augeas' => %w[ augeas augeasversion ], 'desktop management interface' => %w[ dmi bios_vendor bios_version bios_release_date boardassettag boardmanufacturer boardproductname boardserialnumber chassisassettag manufacturer productname serialnumber uuid chassistype ], 'disks' => %w[ blockdevices disks ], 'file system' => %w[ mountpoints filesystems partitions ], 'fips' => [ 'fips_enabled' ], 'hypervisors' => [ 'hypervisors' ], 'id' => %w[ id gid identity ], 'kernel' => %w[ kernel kernelversion kernelrelease kernelmajversion ], 'load_average' => [ 'load_averages' ], 'memory' => %w[ memory memoryfree memoryfree_mb memorysize memorysize_mb swapfree swapfree_mb swapsize swapsize_mb swapencrypted ], 'networking' => %w[ networking hostname ipaddress ipaddress6 netmask netmask6 network network6 scope6 macaddress interfaces domain fqdn dhcp_servers ], 'operating system' => %w[ os operatingsystem osfamily operatingsystemrelease operatingsystemmajrelease hardwaremodel architecture lsbdistid lsbdistrelease lsbdistcodename lsbdistdescription lsbmajdistrelease lsbminordistrelease lsbrelease macosx_buildversion macosx_productname macosx_productversion macosx_productversion_major macosx_productversion_minor macosx_productversion_patch windows_display_version windows_edition_id windows_installation_type windows_product_name windows_release_id system32 selinux selinux_enforced selinux_policyversion selinux_current_mode selinux_config_mode selinux_config_policy ], 'path' => [ 'path' ], 'processor' => %w[ processors processorcount physicalprocessorcount hardwareisa ], 'ssh' => %w[ ssh sshdsakey sshrsakey sshecdsakey sshed25519key sshfp_dsa sshfp_rsa sshfp_ecdsa sshfp_ed25519 ], 'system profiler' => %w[ system_profiler sp_boot_mode sp_boot_rom_version sp_boot_volume sp_cpu_type sp_current_processor_speed sp_kernel_version sp_l2_cache_core sp_l3_cache sp_local_host_name sp_machine_model sp_machine_name sp_number_processors sp_os_version sp_packages sp_physical_memory sp_platform_uuid sp_secure_vm sp_serial_number sp_smc_version_system sp_uptime sp_user_name ], 'timezone' => [ 'timezone' ], 'uptime' => %w[ system_uptime uptime uptime_days uptime_hours uptime_seconds ], 'virtualization' => %w[ virtual is_virtual cloud ], 'ldom' => [ 'ldom' ], 'Solaris zone' => %w[ zones zonename solaris_zones ], 'ZFS' => %w[ zfs_version zfs_featurenumbers ], 'ZFS storage pool' => %w[ zpool_version zpool_featureflags zpool_featurenumbers ], 'legacy' => [ 'architecture', 'augeasversion', 'bios_release_date', 'bios_vendor', 'bios_version', 'blockdevice_*_model', 'blockdevice_*_size', 'blockdevice_*_vendor', 'blockdevices', 'boardassettag', 'boardmanufacturer', 'boardproductname', 'boardserialnumber', 'chassisassettag', 'chassistype', 'dhcp_servers', 'domain', 'fqdn', 'gid', 'hardwareisa', 'hardwaremodel', 'hostname', 'id', 'interfaces', 'ipaddress', 'ipaddress_.*', 'ipaddress_*', 'ipaddress6', 'ipaddress6_.*', 'ipaddress6_*', 'ldom_*', 'lsbdistcodename', 'lsbdistdescription', 'lsbdistid', 'lsbdistrelease', 'lsbmajdistrelease', 'lsbminordistrelease', 'lsbrelease', 'macaddress', 'macaddress_.*', 'macaddress_*', 'macosx_buildversion', 'macosx_productname', 'macosx_productversion', 'macosx_productversion_major', 'macosx_productversion_minor', 'macosx_productversion_patch', 'manufacturer', 'memoryfree', 'memoryfree_mb', 'memorysize', 'memorysize_mb', 'mtu_.*', 'mtu_*', 'netmask', 'netmask_.*', 'netmask_*', 'netmask6', 'netmask6_.*', 'netmask6_*', 'network', 'network_.*', 'network_*', 'network6', 'network6_.*', 'network6_*', 'operatingsystem', 'operatingsystemmajrelease', 'operatingsystemrelease', 'osfamily', 'physicalprocessorcount', 'processor[0-9]+.*', 'processorcount', 'productname', 'rubyplatform', 'rubysitedir', 'rubyversion', 'scope6', 'scope6_.*', 'selinux', 'selinux_config_mode', 'selinux_config_policy', 'selinux_current_mode', 'selinux_enforced', 'selinux_policyversion', 'serialnumber', 'sp_*', 'sp_boot_mode', 'sp_boot_rom_version', 'sp_boot_volume', 'sp_cpu_type', 'sp_current_processor_speed', 'sp_kernel_version', 'sp_l2_cache_core', 'sp_l3_cache', 'sp_local_host_name', 'sp_machine_model', 'sp_machine_name', 'sp_number_processors', 'sp_os_version', 'sp_packages', 'sp_physical_memory', 'sp_platform_uuid', 'sp_secure_vm', 'sp_serial_number', 'sp_smc_version_system', 'sp_uptime', 'sp_user_name', 'ssh.*key', 'ssh*key', 'sshfp_.*', 'sshfp_*', 'swapencrypted', 'swapfree', 'swapfree_mb', 'swapsize', 'swapsize_mb', 'system32', 'uptime', 'uptime_days', 'uptime_hours', 'uptime_seconds', 'uuid', 'windows_edition_id', 'windows_installation_type', 'windows_product_name', 'windows_release_id', 'xendomains', 'zone_*_brand', 'zone_*_id', 'zone_*_iptype', 'zone_*_name', 'zone_*_path', 'zone_*_status', 'zone_*_uuid', 'zonename', 'zones' ] }.freeze end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/000077500000000000000000000000001470204764400224335ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/custom_facts/core/000077500000000000000000000000001470204764400233635ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/custom_facts/core/aggregate.rb000066400000000000000000000200461470204764400256400ustar00rootroot00000000000000# frozen_string_literal: true # Aggregates provide a mechanism for facts to be resolved in multiple steps. # # Aggregates are evaluated in two parts: generating individual chunks and then # aggregating all chunks together. Each chunk is a block of code that generates # a value, and may depend on other chunks when it runs. After all chunks have # been evaluated they are passed to the aggregate block as Hash. # The aggregate block converts the individual chunks into a single value that is # returned as the final value of the aggregate. # # @api public # @since 2.0.0 module Facter module Core class Aggregate include LegacyFacter::Core::Suitable include LegacyFacter::Core::Resolvable # @!attribute [r] name # # @return [Symbol] The name of the aggregate resolution # # @api public attr_reader :name # @!attribute [r] fact_type # # @return [Symbol] The fact type of the aggregate resolution # # @api private attr_reader :fact_type # @!attribute [r] deps # # @return [LegacyFacter::Core::DirectedGraph] # # @api private attr_reader :deps # @!attribute [r] confines # # @return [Array] An array of confines restricting # this to a specific platform # # @api private attr_reader :confines # @!attribute [r] fact # # @return [Facter::Util::Fact] # # @api private attr_reader :fact # @!attribute [r] last_evaluated # # @return [String] # # @api public attr_reader :last_evaluated # Create a new aggregated resolution mechanism. # # @param name [String] The name of the resolution. # @param fact [Facter::Fact] The fact to which this # resolution will be added. # # @return [Facter::Util::Resolution] The created resolution # # @api private def initialize(name, fact) @name = name @fact = fact @confines = [] @chunks = {} @aggregate = nil @deps = LegacyFacter::Core::DirectedGraph.new end # Compares the weight of two aggregate facts # # @return [bool] Weight comparison result # # @api private def <=>(other) weight <=> other.weight end # Sets options for the aggregate fact # # @return [nil] # # @api private def options(options) accepted_options = %i[name timeout weight fact_type] accepted_options.each do |option_name| instance_variable_set("@#{option_name}", options.delete(option_name)) if options.key?(option_name) end raise ArgumentError, "Invalid aggregate options #{options.keys.inspect}" unless options.keys.empty? end # Evaluates the given block # # @return [String] Result of the block's evaluation # # @api private def evaluate(&block) if @last_evaluated msg = +"Already evaluated #{@name}" msg << " at #{@last_evaluated}" if msg.is_a? String msg << ', reevaluating anyways' log.warn msg end instance_eval(&block) @last_evaluated = block.source_location.join(':') end # Define a new chunk for the given aggregate # # @example Defining a chunk with no dependencies # aggregate.chunk(:mountpoints) do # # generate mountpoint information # end # # @example Defining an chunk to add mount options # aggregate.chunk(:mount_options, :require => [:mountpoints]) do |mountpoints| # # `mountpoints` is the result of the previous chunk # # generate mount option information based on the mountpoints # end # # @param name [Symbol] A name unique to this aggregate describing the chunk # # @param opts [Hash] Hash with options for the aggregate fact # # @return [Facter::Core::Aggregate] The aggregate object # # @api public def chunk(name, opts = {}, &block) evaluate_params(name, &block) deps = Array(opts.delete(:require)) unless opts.empty? raise ArgumentError, "Unexpected options passed to #{self.class.name}#chunk: #{opts.keys.inspect}" end @deps[name] = deps @chunks[name] = block self end # Define how all chunks should be combined # # @example Merge all chunks # aggregate.aggregate do |chunks| # final_result = {} # chunks.each_value do |chunk| # final_result.deep_merge(chunk) # end # final_result # end # # @example Sum all chunks # aggregate.aggregate do |chunks| # total = 0 # chunks.each_value do |chunk| # total += chunk # end # total # end # # @yield [Hash] A hash containing chunk names and # chunk values # # @return [Facter::Core::Aggregate] The aggregate fact # # @api public def aggregate(&block) raise ArgumentError, "#{self.class.name}#aggregate requires a block" unless block_given? @aggregate = block self end # Returns the fact's resolution type # # @return [Symbol] The fact's type # # @api private def resolution_type :aggregate end private def log @log ||= Facter::Log.new(self) end def evaluate_params(name) raise ArgumentError, "#{self.class.name}#chunk requires a block" unless block_given? raise ArgumentError, "#{self.class.name}#expected chunk name to be a Symbol" unless name.is_a? Symbol end # Evaluate the results of this aggregate. # # @see Facter::Core::Resolvable#value # @return [Object] def resolve_value chunk_results = run_chunks aggregate_results(chunk_results) end # Order all chunks based on their dependencies and evaluate each one, passing # dependent chunks as needed. # # @return [Hash] A hash containing the chunk that # generated value and the related value. def run_chunks results = {} order_chunks.each do |(name, block)| input = @deps[name].map { |dep_name| results[dep_name] } output = block.call(*input) results[name] = LegacyFacter::Util::Values.deep_freeze(output) end results end # Process the results of all chunks with the aggregate block and return the # results. If no aggregate block has been specified, fall back to deep # merging the given data structure # # @param results [Hash] A hash of chunk names and the output # of that chunk. # @return [Object] def aggregate_results(results) if @aggregate @aggregate.call(results) else default_aggregate(results) end end def default_aggregate(results) results.values.inject do |result, current| LegacyFacter::Util::Values.deep_merge(result, current) end rescue LegacyFacter::Util::Values::DeepMergeError => e raise ArgumentError, 'Could not deep merge all chunks (Original error: ' \ "#{e.message}), ensure that chunks return either an Array or Hash or " \ 'override the aggregate block', e.backtrace end # Order chunks based on their dependencies # # @return [Array] A list of chunk names and blocks in evaluation order. def order_chunks unless @deps.acyclic? raise DependencyError, "Could not order chunks; found the following dependency cycles: #{@deps.cycles.inspect}" end sorted_names = @deps.tsort sorted_names.map do |name| [name, @chunks[name]] end end class DependencyError < StandardError; end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/core/directed_graph.rb000066400000000000000000000017371470204764400266640ustar00rootroot00000000000000# frozen_string_literal: true require 'set' require 'tsort' module LegacyFacter module Core class DirectedGraph < Hash include TSort def acyclic? cycles.empty? end def cycles cycles = [] each_strongly_connected_component do |component| cycles << component if component.size > 1 end cycles end alias tsort_each_node each_key def tsort_each_child(node, &block) fetch(node, []).each(&block) end def tsort missing = Set.new(values.flatten) - Set.new(keys) unless missing.empty? raise MissingVertex, "Cannot sort elements; cannot depend on missing elements #{missing.to_a}" end super rescue TSort::Cyclic raise CycleError, "Cannot sort elements; found the following cycles: #{cycles.inspect}" end class CycleError < StandardError; end class MissingVertex < StandardError; end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/core/execution.rb000066400000000000000000000126261470204764400257220ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Core module Execution @@impl = if LegacyFacter::Util::Config.windows? # rubocop:disable Style/ClassVars Facter::Core::Execution::Windows.new else Facter::Core::Execution::Posix.new end def self.impl @@impl end module_function # Returns the locations to be searched when looking for a binary. This is # currently determined by the +PATH+ environment variable plus `/sbin` # and `/usr/sbin` when run on unix # # @return [Array] The paths to be searched for binaries # # @api private def search_paths @@impl.search_paths end # Determines the full path to a binary. If the supplied filename does not # already describe an absolute path then different locations (determined # by {search_paths}) will be searched for a match. # # @param bin [String] The executable to locate # # @return [String/nil] The full path to the executable or nil if not # found # # @api public def which(bin) @@impl.which(bin) end # Determine in a platform-specific way whether a path is absolute. This # defaults to the local platform if none is specified. # # @param path [String] The path to check # @param platform [:posix/:windows/nil] The platform logic to use # # @api private def absolute_path?(path, platform = nil) case platform when :posix Facter::Core::Execution::Posix.new.absolute_path?(path) when :windows Facter::Core::Execution::Windows.new.absolute_path?(path) else @@impl.absolute_path?(path) end end # Given a command line, this returns the command line with the # executable written as an absolute path. If the executable contains # spaces, it has to be put in double quotes to be properly recognized. # # @param command [String] the command line # # @return [String/nil] The command line with the executable's path # expanded, or nil if the executable cannot be found. # # @api private def expand_command(command) @@impl.expand_command(command) end # Overrides environment variables within a block of code. The # specified values will be set for the duration of the block, after # which the original values (if any) will be restored. # # @param values [HashString>] A hash of the environment # variables to override # # @return [String] The block's return string # # @api private def with_env(values, &block) @@impl.with_env(values, &block) end # Try to execute a command and return the output. # # @param command [String] Command to run # # @return [String/nil] Output of the program, or nil if the command does # not exist or could not be executed. # # @deprecated Use #{execute} instead # @api public def exec(command) @@impl.execute(command, on_fail: nil) end # Execute a command and return the output of that program. # # @param command [String] Command to run # # @param options [Hash] Hash with options for the command # # @option options [Object] :on_fail How to behave when the command could # not be run. Specifying :raise will raise an error, anything else will # return that object on failure. Default is :raise. # @option options [Object] :logger Optional logger used to log the # command's stderr. # @option options :timeout Optional time out for the specified # command. If no timeout is passed, a default of 300 seconds is used. # # @raise [Facter::Core::Execution::ExecutionFailure] If the command does # not exist or could not be executed and :on_fail is set to :raise # # @return [String] the output of the program, or the value of :on_fail (if it's different than :raise) if # command execution failed and :on_fail was specified. # # @api public def execute(command, options = {}) @@impl.execute(command, options) end # Execute a command and return the stdout and stderr of that program. # # @param command [String] Command to run # # @param on_fail[Object] How to behave when the command could # not be run. Specifying :raise will raise an error, anything else will # return that object on failure. Default is to not raise. # @param logger Optional logger used to log the command's stderr. # @param timeout Optional time out for the specified command. If no timeout is passed, # a default of 300 seconds is used. # # @raise [Facter::Core::Execution::ExecutionFailure] If the command does # not exist or could not be executed and :on_fail is set to :raise # # @return [String, String] the stdout and stderr of the program, or the value of # :on_fail if command execution failed and :on_fail was specified. # # @api private def execute_command(command, on_fail = nil, logger = nil, timeout = nil) @@impl.execute_command(command, on_fail, logger, timeout) end class ExecutionFailure < StandardError; end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/core/execution/000077500000000000000000000000001470204764400253665ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/custom_facts/core/execution/base.rb000066400000000000000000000121041470204764400266230ustar00rootroot00000000000000# frozen_string_literal: true require_relative 'popen3' module Facter module Core module Execution class Base STDERR_MESSAGE = 'Command %s completed with the following stderr message: %s' VALID_OPTIONS = %i[on_fail expand logger timeout].freeze DEFAULT_EXECUTION_TIMEOUT = 300 def initialize @log = Log.new(self) end # This is part of the public API. No race condition can happen # here because custom facts are executed sequentially def with_env(values) old = {} values.each do |var, value| # save the old value if it exists if (old_val = ENV[var]) old[var] = old_val end # set the new (temporary) value for the environment variable ENV[var] = value end # execute the caller's block, returning its value yield # use an ensure block to make absolutely sure we restore the variables ensure # restore the old values values.each_key do |var| if old.include?(var) ENV[var] = old[var] else # if there was no old value, delete the key from the current environment variables hash ENV.delete(var) end end end def execute(command, options = {}) on_fail, expand, logger, timeout = extract_options(options) expanded_command = if !expand && builtin_command?(command) || logger command else expand_command(command) end if expanded_command.nil? if on_fail == :raise raise Facter::Core::Execution::ExecutionFailure.new, "Could not execute '#{command}': command not found" end return on_fail end out, = execute_command(expanded_command, on_fail, logger, timeout) out end def execute_command(command, on_fail = nil, logger = nil, timeout = nil) timeout ||= DEFAULT_EXECUTION_TIMEOUT begin # Set LC_ALL and LANG to force i18n to C for the duration of this exec; # this ensures that any code that parses the # output of the command can expect it to be in a consistent / predictable format / locale opts = { 'LC_ALL' => 'C', 'LANG' => 'C' } require 'timeout' @log.debug("Executing command: #{command}") out, stderr = Popen3.popen3e(opts, command.to_s) do |_, stdout, stderr, pid| stdout_messages = +'' stderr_messages = +'' out_reader = Thread.new { stdout.read } err_reader = Thread.new { stderr.read } begin Timeout.timeout(timeout) do stdout_messages << out_reader.value stderr_messages << err_reader.value end rescue Timeout::Error message = "Timeout encounter after #{timeout}s, killing process with pid: #{pid}" Process.kill('KILL', pid) on_fail == :raise ? (raise StandardError, message) : @log.debug(message) ensure out_reader.kill err_reader.kill end [stdout_messages, stderr_messages] end log_stderr(stderr, command, logger) rescue StandardError => e message = "Failed while executing '#{command}': #{e.message}" if logger @log.debug(message) return +'' end return on_fail unless on_fail == :raise raise Facter::Core::Execution::ExecutionFailure.new, message end out.force_encoding(Encoding.default_external) unless out.valid_encoding? [out.strip, stderr] end private def extract_options(options) on_fail = options.fetch(:on_fail, :raise) expand = options.fetch(:expand, true) logger = options[:logger] timeout = (options[:timeout] || options[:time_limit] || options[:limit]).to_i timeout = timeout.positive? ? timeout : nil extra_keys = options.keys - VALID_OPTIONS unless extra_keys.empty? @log.warn("Unexpected key passed to Facter::Core::Execution.execute option: #{extra_keys.join(',')}" \ " - valid keys: #{VALID_OPTIONS.join(',')}") end [on_fail, expand, logger, timeout] end def log_stderr(msg, command, logger) return if !msg || msg.empty? unless logger file_name = command.split('/').last logger = Facter::Log.new(file_name) end logger.debug(format(STDERR_MESSAGE, command, msg.strip)) end def builtin_command?(command) output, _status = Open3.capture2("type #{command}") /builtin/.match?(output.chomp) ? true : false end end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/core/execution/popen3.rb000066400000000000000000000033641470204764400271250ustar00rootroot00000000000000# frozen_string_literal: true # # Because Open3 uses Process.detach the env $? is not set so # this class reimplements Open3.popen3 with Process.wait instead. # [FACT-2934] When calling Facter::Core::Execution, $? and $CHILD_STATUS # ruby env variables should be set. # module Facter module Core module Execution class Popen3 @log ||= Log.new(self) def self.popen_rune(cmd, opts, child_io, parent_io) # :nodoc: pid = spawn(*cmd, opts) child_io.each(&:close) result = [*parent_io, pid] if defined? yield begin return yield(*result) ensure parent_io.each(&:close) begin Process.wait(pid) rescue Errno::ENOENT # For some reason, the first Process.wait executed in JRuby # always fails with ENOENT. However, the command output is # filled in so we just need to silently continue. # https://github.com/jruby/jruby/issues/5971 raise unless RUBY_PLATFORM == 'java' @log.debug('Caught ENOENT during Process.wait on JRuby, continuing...') end end end result end def self.popen3e(*cmd, &block) opts = if cmd.last.is_a? Hash cmd.pop.dup else {} end in_r, in_w = IO.pipe opts[:in] = in_r in_w.sync = true out_r, out_w = IO.pipe opts[:out] = out_w err_r, err_w = IO.pipe opts[:err] = err_w popen_rune(cmd, opts, [in_r, out_w, err_w], [in_w, out_r, err_r], &block) end end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/core/execution/posix.rb000066400000000000000000000032751470204764400270640ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Core module Execution class Posix < Facter::Core::Execution::Base DEFAULT_SEARCH_PATHS = ['/sbin', '/usr/sbin'].freeze def search_paths # Make sure custom_facts is usable even for non-root users. Most commands # in /sbin (like ifconfig) can be run as non privileged users as # long as they do not modify anything - which we do not do with custom_facts ENV['PATH'].split(File::PATH_SEPARATOR) + DEFAULT_SEARCH_PATHS end def which(bin) if absolute_path?(bin) return bin if File.executable?(bin) && FileTest.file?(bin) else search_paths.each do |dir| dest = File.join(dir, bin) return dest if File.executable?(dest) && FileTest.file?(dest) end end nil end ABSOLUTE_PATH_REGEX = %r{^/}.freeze def absolute_path?(path) !!(path =~ ABSOLUTE_PATH_REGEX) end DOUBLE_QUOTED_COMMAND = /\A"(.+?)"(?:\s+(.*))?/.freeze SINGLE_QUOTED_COMMAND = /\A'(.+?)'(?:\s+(.*))?/.freeze def expand_command(command) exe = nil args = nil match = command.match(DOUBLE_QUOTED_COMMAND) || command.match(SINGLE_QUOTED_COMMAND) if match exe, args = match.captures else exe, args = command.split(/ /, 2) end return unless exe && (expanded = which(exe)) expanded = expanded.dup expanded = +"'#{expanded}'" if /\s/.match?(expanded) expanded << " #{args}" if args expanded end end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/core/execution/windows.rb000066400000000000000000000043711470204764400274120ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Core module Execution class Windows < Facter::Core::Execution::Base def search_paths ENV['PATH'].split(File::PATH_SEPARATOR) end DEFAULT_COMMAND_EXTENSIONS = %w[.COM .EXE .BAT .CMD].freeze def which(bin) # `echo` is allowed for facter 3.x compatibility, otherwise # all commands much be found on the PATH or absolute. return bin if /^echo$/i.match?(bin) if absolute_path?(bin) return bin if File.executable?(bin) else search_paths.each do |dir| dest = File.join(dir, bin) dest.gsub!(File::SEPARATOR, File::ALT_SEPARATOR) if File.extname(dest).empty? exts = ENV['PATHEXT'] exts = exts ? exts.split(File::PATH_SEPARATOR) : DEFAULT_COMMAND_EXTENSIONS exts.each do |ext| destext = dest + ext return destext if File.executable?(destext) end end return dest if File.executable?(dest) end end nil end slash = '[\\\\/]' name = '[^\\\\/]+' ABSOLUTE_PATH_REGEX = /^(([A-Z]:#{slash})|(#{slash}#{slash}#{name}#{slash}#{name})|(#{slash}#{slash}\?#{slash}#{name}))/i.freeze def absolute_path?(path) !!(path =~ ABSOLUTE_PATH_REGEX) end DOUBLE_QUOTED_COMMAND = /\A"(.+?)"(?:\s+(.*))?/.freeze def expand_command(command) exe = nil args = nil if (match = command.match(DOUBLE_QUOTED_COMMAND)) exe, args = match.captures else exe, args = command.split(/ /, 2) end return unless exe && (expanded = which(exe)) expanded = expanded.dup expanded = +"\"#{expanded}\"" if /\s+/.match?(expanded) expanded << " #{args}" if args expanded end def execute(command, options = {}) expand = options.fetch(:expand, true) raise ArgumentError.new, 'Unsupported argument on Windows expand with value false' unless expand super(command, options) end end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/core/file_loader.rb000066400000000000000000000024521470204764400261600ustar00rootroot00000000000000# frozen_string_literal: true require_relative '../../../facter/custom_facts/util/fact' require_relative '../../../facter/custom_facts/util/collection' require_relative '../../../facter/custom_facts/util/loader' require_relative '../../../facter/custom_facts/core/execution/base' require_relative '../../../facter/custom_facts/core/execution/windows' require_relative '../../../facter/custom_facts/core/execution/posix' require_relative '../../../facter/custom_facts/util/values' require_relative '../../../facter/custom_facts/util/confine' require_relative '../../../facter/custom_facts/util/config' require_relative '../../../facter/custom_facts/util/normalization' require_relative '../../../facter/custom_facts/core/execution' require_relative '../../../facter/custom_facts/core/resolvable' require_relative '../../../facter/custom_facts/core/suitable' require_relative '../../../facter/custom_facts/util/resolution' require_relative '../../../facter/custom_facts/core/directed_graph' require_relative '../../../facter/custom_facts/core/aggregate' require_relative '../../../facter/custom_facts/util/composite_loader' require_relative '../../../facter/custom_facts/util/parser' require_relative '../../../facter/custom_facts/util/directory_loader' require_relative '../../../facter/custom_facts/util/nothing_loader' puppetlabs-facter-dfe6df4/lib/facter/custom_facts/core/legacy_facter.rb000066400000000000000000000120501470204764400264760ustar00rootroot00000000000000# frozen_string_literal: true # Facter - Host Fact Detection and Reporting # # Copyright 2011 Puppet Labs Inc # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. require 'pathname' require_relative '../../../facter/custom_facts/core/file_loader' # Functions as a hash of 'facts' about your system system, such as MAC # address, IP address, architecture, etc. # # @example Retrieve a fact # puts Facter['operatingsystem'].value # # @example Retrieve all facts # Facter.to_hash # => { "kernel"=>"Linux", "uptime_days"=>0, "ipaddress"=>"10.0.0.1" } # # @api public module LegacyFacter # Most core functionality of custom_facts is implemented in `Facter::Util`. # @api public include Comparable include Enumerable # module methods # Accessor for the collection object which holds all the facts # @return [LegacyFacter::Util::Collection] the collection of facts # # @api private def self.collection unless defined?(@collection) && @collection @collection = LegacyFacter::Util::Collection.new( LegacyFacter::Util::Loader.new, LegacyFacter::Util::Config.ext_fact_loader ) end @collection end # Returns whether the JSON "feature" is available. # # @api private def self.json? require 'json' true rescue LoadError false end # Returns a fact object by name. If you use this, you still have to # call {Facter::Util::Fact#value `value`} on it to retrieve the actual # value. # # @param name [String] the name of the fact # # @return [Facter::Util::Fact, nil] The fact object, or nil if no fact # is found. # # @api public def self.[](name) collection.fact(name) end # (see []) def self.fact(name) collection.fact(name) end # Flushes cached values for all facts. This does not cause code to be # reloaded; it only clears the cached results. # # @return [void] # # @api public def self.flush collection.flush end # Lists all fact names # # @return [Array] array of fact names # # @api public def self.list collection.list end # Gets the value for a fact. Returns `nil` if no such fact exists. # # @param name [String] the fact name # @return [Object, nil] the value of the fact, or nil if no fact is # found # # @api public def self.value(name) collection.value(name) end # Gets a hash mapping fact names to their values # # @return [Hash{String => Object}] the hash of fact names and values # # @api public def self.to_hash collection.load_all collection.to_hash end # Define a new fact or extend an existing fact. # # @param name [Symbol] The name of the fact to define # @param options [Hash] A hash of options to set on the fact # # @return [Facter::Util::Fact] The fact that was defined # # @api public # @see {Facter::Util::Collection#define_fact} def self.define_fact(name, options = {}, &block) collection.define_fact(name, options, &block) end # Adds a {Facter::Util::Resolution resolution} mechanism for a named # fact. This does not distinguish between adding a new fact and adding # a new way to resolve a fact. # # @overload add(name, options = {}, { || ... }) # @param name [String] the fact name # @param options [Hash] optional parameters for the fact - attributes # of {Facter::Util::Fact} and {Facter::Util::Resolution} can be # supplied here # @option options [Integer] :timeout set the # {Facter::Util::Resolution#timeout timeout} for this resolution # @param block [Proc] a block defining a fact resolution # # @return [Facter::Util::Fact] the fact object, which includes any previously # defined resolutions # # @api public def self.add(name, options = {}, &block) collection.add(name, options, &block) end # Iterates over fact names and values # # @yieldparam [String] name the fact name # @yieldparam [String] value the current value of the fact # # @return [void] # # @api public def self.each # Make sure all facts are loaded. collection.load_all collection.each do |*args| yield(*args) end end # Clears all cached values and removes all facts from memory. # # @return [void] # # @api public def self.clear LegacyFacter.flush LegacyFacter.reset end # Removes all facts from memory. Use this when the fact code has # changed on disk and needs to be reloaded. # # @return [void] # # @api public def self.reset @collection = nil end # Loads all facts. # # @return [void] # # @api public def self.loadfacts collection.load_all end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/core/resolvable.rb000066400000000000000000000070601470204764400260510ustar00rootroot00000000000000# frozen_string_literal: true require 'timeout' # The resolvable mixin defines behavior for evaluating and returning fact # resolutions. # # Classes including this mixin should implement a #name method describing # the value being resolved and a #resolve_value that actually executes the code # to resolve the value. module LegacyFacter module Core module Resolvable # The timeout, in seconds, for evaluating this resolution. # @return [Integer] # @api public attr_accessor :timeout attr_reader :logger # Return the timeout period for resolving a value. # (see #timeout) # @return [Numeric] # @comment requiring 'timeout' stdlib class causes Object#timeout to be # defined which delegates to Timeout.timeout. This method may potentially # overwrite the #timeout attr_reader on this class, so we define #limit to # avoid conflicts. def limit @timeout || 0 end ## # on_flush accepts a block and executes the block when the resolution's value # is flushed. This makes it possible to model a single, expensive system # call inside of a Ruby object and then define multiple dynamic facts which # resolve by sending messages to the model instance. If one of the dynamic # facts is flushed then it can, in turn, flush the data stored in the model # instance to keep all of the dynamic facts in sync without making multiple, # expensive, system calls. # # Please see the Solaris zones fact for an example of how this feature may be # used. # # @see Facter::Util::Fact#flush # @see Facter::Util::Resolution#flush # # @api public def on_flush(&block) @on_flush_block = block end ## # flush executes the block, if any, stored by the {on_flush} method # # @see Facter::Util::Fact#flush # @see Facter::Util::Resolution#on_flush # # @api private def flush @on_flush_block&.call end # Resolves the fact's value or loggs an error if the value # couldn't be resolved. # # @raise Facter::ResolveCustomFactError if an error was raised # (except Timeout::Error or Narmalization::NarmalizationError # in which case an error message is logged and the execution # isn't suspended). # # @return value (hash, string, int, array, etc) or nil # # @api private def value result = nil with_timing do Timeout.timeout(limit) do result = resolve_value end end LegacyFacter::Util::Normalization.normalize(result) rescue Timeout::Error => e Facter.log_exception(e, "Timed out after #{limit} seconds while resolving #{qualified_name}") nil rescue LegacyFacter::Util::Normalization::NormalizationError => e Facter.log_exception(e, "Fact resolution #{qualified_name} resolved to an invalid value: #{e.message}") nil rescue StandardError => e Facter.log_exception(e, "Error while resolving custom fact #{qualified_name}: #{e.message}") raise Facter::ResolveCustomFactError end private def with_timing starttime = Time.now.to_f yield finishtime = Time.now.to_f ms = (finishtime - starttime) * 1000 Facter::Log.show_time format('%s: %.2fms', qn: qualified_name, ms: ms) end def qualified_name "fact='#{@fact.name}', resolution='#{@name || ''}'" end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/core/suitable.rb000066400000000000000000000103451470204764400255230ustar00rootroot00000000000000# frozen_string_literal: true # The Suitable mixin provides mechanisms for confining objects to run on # certain platforms and determining the run precedence of these objects. # # Classes that include the Suitable mixin should define a `#confines` method # that returns an Array of zero or more Facter::Util::Confine objects. module LegacyFacter module Core module Suitable # Sets the weight of this resolution. If multiple suitable resolutions # are found, the one with the highest weight will be used. If weight # is not given, the number of confines set on a resolution will be # used as its weight (so that the most specific resolution is used). # # @param weight [Integer] the weight of this resolution # # @return [void] # # @api public def has_weight(weight) # rubocop:disable Naming/PredicateName @weight = weight self end # Sets the conditions for this resolution to be used. This method accepts # multiple forms of arguments to determine suitability. # # @return [void] # # @api public # # @overload confine(confines) # Confine a fact to a specific fact value or values. This form takes a # hash of fact names and values. Every fact must match the values given for # that fact, otherwise this resolution will not be considered suitable. The # values given for a fact can be an array, in which case the value of the # fact must be in the array for it to match. # @param [Hash{String,Symbol=>String,Array}] confines set of facts identified by the hash keys whose # fact value must match the argument value. # @example Confining to Linux # Facter.add(:powerstates) do # # This resolution only makes sense on linux systems # confine :kernel => "Linux" # setcode do # File.read('/sys/power/states') # end # end # # @overload confine(confines, &block) # Confine a fact to a block with the value of a specified fact yielded to # the block. # @param [String,Symbol] confines the fact name whose value should be # yielded to the block # @param [Proc] block determines the suitability of the fact. If the block # evaluates to `false` or `nil` then the confined fact will not be # evaluated. # @yield [value] the value of the fact identified by {confines} # @example Confine the fact to a host with an ipaddress in a specific # subnet # confine :ipaddress do |addr| # require 'ipaddr' # IPAddr.new('192.168.0.0/16').include? addr # end # # @overload confine(&block) # Confine a fact to a block. The fact will be evaluated only if the block # evaluates to something other than `false` or `nil`. # @param [Proc] block determines the suitability of the fact. If the block # evaluates to `false` or `nil` then the confined fact will not be # evaluated. # @example Confine the fact to systems with a specific file. # confine { File.readable? '/bin/foo' } def confine(confines = nil, &block) case confines when Hash confines.each do |fact, values| @confines.push LegacyFacter::Util::Confine.new(fact, *values) end else if block if confines @confines.push LegacyFacter::Util::Confine.new(confines, &block) else @confines.push LegacyFacter::Util::Confine.new(&block) end end end end # Returns the importance of this resolution. If the weight was not # given, the number of confines is used instead (so that a more # specific resolution wins over a less specific one). # # @return [Integer] the weight of this resolution # # @api private def weight @weight || @confines.length end # Is this resolution mechanism suitable on the system in question? # # @api private def suitable? @confines.all?(&:true?) end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/util/000077500000000000000000000000001470204764400234105ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/custom_facts/util/collection.rb000066400000000000000000000110411470204764400260650ustar00rootroot00000000000000# frozen_string_literal: true # Manage which facts exist and how we access them. Largely just a wrapper # around a hash of facts. # # @api private module LegacyFacter module Util class Collection def initialize(internal_loader, external_loader) @facts = {} @internal_loader = internal_loader @external_loader = external_loader @loaded = false end # Return a fact object by name. def [](name) value(name) end # Define a new fact or extend an existing fact. # # @param name [Symbol] The name of the fact to define # @param options [Hash] A hash of options to set on the fact # # @return [Facter::Util::Fact] The fact that was defined def define_fact(name, options = {}, &block) fact = create_or_return_fact(name, options) fact.instance_eval(&block) if block_given? fact rescue StandardError => e log.log_exception(e) end # Add a resolution mechanism for a named fact. This does not distinguish # between adding a new fact and adding a new way to resolve a fact. # # @param name [Symbol] The name of the fact to define # @param options [Hash] A hash of options to set on the fact and resolution # # @return [Facter::Util::Fact] The fact that was defined def add(name, options = {}, &block) fact = create_or_return_fact(name, options) fact.add(options, &block) fact rescue StandardError => e log.log_exception(e) end include Enumerable # Iterate across all of the facts. def each load_all @facts.each do |name, fact| value = fact.value yield name.to_s, value unless value.nil? end end # Return a fact by name. def fact(name) name = canonicalize(name) # Try to load the fact if necessary load(name) unless @facts[name] # Try HARDER internal_loader.load_all unless @facts[name] log.warnonce("No facts loaded from #{internal_loader.search_path.join(File::PATH_SEPARATOR)}") if @facts.empty? @facts[name] end # Flush all cached values. def flush @facts.each_value(&:flush) @external_facts_loaded = nil end # Return a list of all of the facts. def list load_all @facts.keys end # Build a hash of external facts def external_facts return @external_facts unless @external_facts.nil? load_external_facts @external_facts = @facts.select { |_k, v| v.options[:fact_type] == :external } end def invalidate_custom_facts @valid_custom_facts = false end def reload_custom_facts @loaded = false end def custom_fact(fact_name) internal_loader.load(fact_name) @custom_facts = @facts.select { |_k, v| v.options[:fact_type] == :custom } end # Builds a hash of custom facts def custom_facts return @custom_facts if @valid_custom_facts @valid_custom_facts = true internal_loader.load_all unless @loaded @loaded = true @custom_facts = @facts.select { |_k, v| v.options[:fact_type] == :custom } end def load(name) internal_loader.load(name) load_external_facts end # Load all known facts. def load_all internal_loader.load_all load_external_facts end attr_reader :internal_loader, :external_loader # Return a hash of all of our facts. def to_hash @facts.each_with_object({}) do |ary, h| value = ary[1].value unless value.nil? # For backwards compatibility, convert the fact name to a string. h[ary[0].to_s] = value end end end def value(name) fact = fact(name) fact&.value end private def create_or_return_fact(name, options) name = canonicalize(name) fact = @facts[name] if fact.nil? fact = Facter::Util::Fact.new(name, options) @facts[name] = fact else fact.extract_ldapname_option!(options) end fact end def canonicalize(name) name.to_s.downcase.to_sym end def load_external_facts return if @external_facts_loaded @external_facts_loaded = true external_loader.load(self) end def log @log ||= Facter::Log.new(self) end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/util/composite_loader.rb000066400000000000000000000005401470204764400272640ustar00rootroot00000000000000# frozen_string_literal: true # A composite loader that allows for more than one # default directory loader module LegacyFacter module Util class CompositeLoader def initialize(loaders) @loaders = loaders end def load(collection) @loaders.each { |loader| loader.load(collection) } end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/util/config.rb000066400000000000000000000057231470204764400252110ustar00rootroot00000000000000# frozen_string_literal: true require 'rbconfig' # A module to return config related data # module LegacyFacter module Util module Config def self.ext_fact_loader @ext_fact_loader || LegacyFacter::Util::DirectoryLoader.new end def self.ext_fact_loader=(loader) @ext_fact_loader = loader end def self.mac? RbConfig::CONFIG['host_os'] =~ /darwin/i end # Returns true if OS is windows def self.windows? RbConfig::CONFIG['host_os'] =~ /mswin|win32|dos|mingw|cygwin/i end def self.windows_data_dir ENV['ProgramData'] || ENV['APPDATA'] if LegacyFacter::Util::Config.windows? end def self.external_facts_dirs Facter::Options.external_dir end def self.facts_cache_dir @facts_cache_dir ||= setup_default_cache_dir end def self.setup_default_ext_facts_dirs if LegacyFacter::Util::Root.root? windows_dir = windows_data_dir Facter::Options[:default_external_dir] = if windows_dir [File.join(windows_dir, 'PuppetLabs', 'facter', 'facts.d')] else [ '/etc/puppetlabs/facter/facts.d', '/etc/facter/facts.d/', '/opt/puppetlabs/facter/facts.d' ] end elsif ENV['HOME'] Facter::Options[:default_external_dir] = [File.join(ENV['HOME'], '.facter', 'facts.d'), File.join(ENV['HOME'], '.puppetlabs', 'opt', 'facter', 'facts.d')] else Facter::Options[:default_external_dir] = [] end end if LegacyFacter::Util::Config.windows? require_relative 'windows_root' else require_relative 'unix_root' end setup_default_ext_facts_dirs def self.override_binary_dir=(dir) @override_binary_dir = dir end def self.override_binary_dir @override_binary_dir end def self.setup_default_cache_dir windows_dir = windows_data_dir @facts_cache_dir = if windows_dir File.join(windows_dir, 'PuppetLabs', 'facter', 'cache', 'cached_facts') else '/opt/puppetlabs/facter/cache/cached_facts' end end def self.setup_default_override_binary_dir @override_binary_dir = if LegacyFacter::Util::Config.windows? nil else '/opt/puppetlabs/puppet/bin' end end setup_default_override_binary_dir end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/util/confine.rb000066400000000000000000000051301470204764400253550ustar00rootroot00000000000000# frozen_string_literal: true # A restricting tag for fact resolution mechanisms. The tag must be true # for the resolution mechanism to be suitable. module LegacyFacter module Util class Confine attr_accessor :fact, :values include LegacyFacter::Util::Values # Add the restriction. Requires the fact name, an operator, and the value # we're comparing to. # # @param fact [Symbol] Name of the fact # @param values [Array] One or more values to match against. # They can be any type that provides a === method. # @param block [Proc] Alternatively a block can be supplied as a check. The fact # value will be passed as the argument to the block. If the block returns # true then the fact will be enabled, otherwise it will be disabled. def initialize(fact = nil, *values, &block) raise ArgumentError, 'The fact name must be provided' unless fact || block_given? raise ArgumentError, 'One or more values or a block must be provided' if values.empty? && !block_given? @fact = fact @values = values @block = block end def to_s return @block.to_s if @block format("'%s' '%s'", fact: @fact, values: @values.join(',')) end # Evaluate the fact, returning true or false. # if we have a block parameter then we only evaluate that instead def true? if @block && !@fact begin return !!@block.call rescue StandardError => e log.debug "Confine raised #{e.class} #{e}" return false end end unless (fact = Facter[@fact]) log.debug format('No fact for %s', fact: @fact) return false end value = convert(fact.value) return false if value.nil? # We call the block with both the downcased and raw fact value for # backwards-compatibility. if @block begin return !!@block.call(value) || !!@block.call(fact.value) # rubocop:disable Style/DoubleNegation rescue StandardError => e log.debug "Confine raised #{e.class} #{e}" return false end end # we're intentionally using case equality (triple equals) because we # support matching against anything that supports === such as ranges, # regular expressions, etc @values.any? { |v| convert(v) === value } # rubocop:disable Style/CaseEquality end private def log @log ||= Facter::Log.new(self) end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/util/directory_loader.rb000066400000000000000000000111601470204764400272660ustar00rootroot00000000000000# frozen_string_literal: true # A Facter plugin that loads external facts. # # Default Unix Directories: # /opt/puppetlabs/custom_facts/facts.d, /etc/custom_facts/facts.d, /etc/puppetlabs/custom_facts/facts.d # # Beginning with Facter 3, only /opt/puppetlabs/custom_facts/facts.d will be a default external fact # directory in Unix. # # Default Windows Direcotires: # C:\ProgramData\Puppetlabs\custom_facts\facts.d (2008) # C:\Documents and Settings\All Users\Application Data\Puppetlabs\custom_facts\facts.d (2003) # # Can also load from command-line specified directory # # Facts can be in the form of JSON, YAML or Text files # and any executable that returns key=value pairs. require 'yaml' module LegacyFacter module Util class DirectoryLoader class NoSuchDirectoryError < RuntimeError end # This value makes it highly likely that external facts will take # precedence over all other facts EXTERNAL_FACT_WEIGHT = 10_000 # Directory for fact loading attr_reader :directories def initialize(dir = LegacyFacter::Util::Config.external_facts_dirs, weight = EXTERNAL_FACT_WEIGHT) @directories = [dir].flatten @weight = weight @log ||= Facter::Log.new(self) end # Load facts from files in fact directory using the relevant parser classes to # parse them. def load(collection) weight = @weight searched_facts, cached_facts = load_directory_entries(collection) load_cached_facts(collection, cached_facts, weight) load_searched_facts(collection, searched_facts, weight) end private def log @log ||= Facter::Log.new(self) end def load_directory_entries(_collection) cm = Facter::CacheManager.new facts = [] entries.each do |file| basename = File.basename(file) next if file_blocked?(basename) if facts.find { |f| f.name == basename } && cm.fact_cache_enabled?(basename) Facter.log_exception(Exception.new("Caching is enabled for group \"#{basename}\" while "\ 'there are at least two external facts files with the same filename')) else searched_fact = Facter::SearchedFact.new(basename, nil, nil, :file) searched_fact.file = file facts << searched_fact end end cm.resolve_facts(facts) end def load_cached_facts(collection, cached_facts, weight) cached_facts.each do |cached_fact| collection.add(cached_fact.name, value: cached_fact.value, fact_type: :external, file: cached_fact.file) { has_weight(weight) } end end def load_searched_facts(collection, searched_facts, weight) searched_facts.each do |fact| parser = LegacyFacter::Util::Parser.parser_for(fact.file) next if parser.nil? data = resolve_fact(fact, parser) if data == false log.warn "Could not interpret fact file #{fact.file}" elsif (data == {}) || data.nil? log.debug( "Structured data fact file #{fact.file} was parsed but was either empty or an invalid filetype "\ '(valid filetypes are .yaml, .json, and .txt).' ) elsif !data.is_a?(Hash) log.error("Structured data fact file #{fact.file} was parsed but no key=>value data was returned.") else add_data(data, collection, fact, weight) end end end def add_data(data, collection, fact, weight) data.each do |key, value| collection.add( key, value: value, fact_type: :external, file: fact.file ) { has_weight(weight) } end end def resolve_fact(fact, parser) data = nil fact_name = File.basename(fact.file) Facter::Framework::Benchmarking::Timer.measure(fact_name) { data = parser.results } data end def entries dirs = @directories.select { |directory| File.directory?(directory) }.map do |directory| Dir.entries(directory).map { |directory_entry| File.join(directory, directory_entry) }.sort.reverse! end dirs.flatten.select { |f| should_parse?(f) } rescue Errno::ENOENT [] end def should_parse?(file) File.basename(file) !~ /^\./ end def file_blocked?(file) if Facter::Options[:blocked_facts].include? file Facter.debug("External fact file #{file} blocked.") return true end false end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/util/fact.rb000066400000000000000000000175321470204764400246620ustar00rootroot00000000000000# frozen_string_literal: true # This class represents a fact. Each fact has a name and multiple # {Facter::Util::Resolution resolutions}. # # Create facts using {Facter.add} # # @api public module Facter module Util class Fact # The location from where fact is resolved # @return [String] attr_reader :location # The name of the fact # @return [String] attr_reader :name # @return [String] # @deprecated attr_accessor :ldapname # Fact options e.g. fact_type attr_accessor :options # Weight of the resolution that was used to obtain the fact value attr_accessor :used_resolution_weight # Creates a new fact, with no resolution mechanisms. See {Facter.add} # for the public API for creating facts. # @param name [String] the fact name # @param options [Hash] optional parameters # @option options [String] :ldapname set the ldapname property on the fact # # @api private def initialize(name, options = {}) @name = LegacyFacter::Util::Normalization.normalize(name.to_s.downcase).intern @options = options.dup extract_ldapname_option!(options) @ldapname ||= @name.to_s @resolves = [] @searching = false @used_resolution_weight = 0 @value = nil end # Adds a new {Facter::Util::Resolution resolution}. This requires a # block, which will then be evaluated in the context of the new # resolution. # # @param options [Hash] A hash of options to set on the resolution # # @return [Facter::Util::Resolution] # # @api private def add(options = {}, &block) @options = @options.merge(options) @location = options[:file] @location ||= block.source_location if block_given? define_resolution(nil, options, &block) end # Define a new named resolution or return an existing resolution with # the given name. # # @param resolution_name [String] The name of the resolve to define or look up # @param options [Hash] A hash of options to set on the resolution # @return [Facter::Util::Resolution] # # @api public def define_resolution(resolution_name, options = {}, &block) resolution_type = options.delete(:type) || :simple resolve = create_or_return_resolution(resolution_name, resolution_type) resolve.options(options) unless options.empty? resolve.evaluate(&block) if block resolve rescue StandardError => e msg = "Unable to add resolve #{resolution_name.inspect} for fact '#{@name}': #{e.message}" msg += "\n#{e.backtrace.join("\n")}" if Options[:trace] log.error(msg, true) nil end # Retrieve an existing resolution by name # # @param name [String] # # @return [Facter::Util::Resolution, nil] The resolution if exists, nil if # it doesn't exist or name is nil def resolution(name) return nil if name.nil? @resolves.find { |resolve| resolve.name == name } end # Flushes any cached values. # # @return [void] # # @api private def flush @resolves.each(&:flush) @value = nil end # Returns the value for this fact. This searches all resolutions by # suitability and weight (see {Facter::Util::Resolution}). If no # suitable resolution is found, it returns nil. # # @api public def value return @value unless @value.nil? if @resolves.empty? log.debug format('No resolves for %s', name: @name) return nil end searching do suitable_resolutions = sort_by_weight(find_suitable_resolutions(@resolves)) Facter::Framework::Benchmarking::Timer.measure(@name) do @value = find_first_real_value(suitable_resolutions) end announce_when_no_suitable_resolution(suitable_resolutions) announce_when_no_value_found(@value) @value = resolve_value end @value end # @api private # @deprecated def extract_ldapname_option!(options) return unless options[:ldapname] log.warnonce('ldapname is deprecated and will be removed in a future version') self.ldapname = options.delete(:ldapname) end private def log @log ||= Facter::Log.new(self) end def resolve_value return Facter.core_value(name) if @value.nil? core_value = Facter.core_value(name) if @used_resolution_weight <= 0 core_value.nil? ? @value : core_value end # Are we in the midst of a search? def searching? @searching end # Lock our searching process, so we never get stuck in recursion. def searching raise "Caught recursion on #{@name}" if searching? # If we've gotten this far, we're not already searching, so go ahead and do so. @searching = true begin yield ensure @searching = false end end def find_suitable_resolutions(resolutions) resolutions.find_all(&:suitable?) end def sort_by_weight(resolutions) # sort resolutions: # - descending by weight # - multiple facts have the same weight but different types, the :external fact take precedence # - multiple facts with the same weight and type, the order is preserved. # note: sort_by with index is slower than .sort # we cannot use .sort because it is not stable: https://bugs.ruby-lang.org/issues/1089 # solution from: https://bugs.ruby-lang.org/issues/1089#note-10 # rubocop:disable Style/NestedTernaryOperator idx = 0 resolutions.sort_by do |x| [ -x.weight, x.respond_to?(:fact_type) ? x.fact_type == :external ? 0 : 1 : 1, idx += 1 ] end # rubocop:enable Style/NestedTernaryOperator end def find_first_real_value(resolutions) resolutions.each do |resolve| begin value = resolve.value rescue Facter::ResolveCustomFactError break end @used_resolution_weight = resolve.weight next if value.nil? log_fact_path(resolve) return value end nil end def log_fact_path(resolve) log.debug("#{resolve.fact_type} fact #{resolve.fact.name} was resolved from: #{resolve.last_evaluated}") end def announce_when_no_suitable_resolution(resolutions) return unless resolutions.empty? log.debug format('Found no suitable resolves of % for %s', resolver_length: @resolves.length, name: @name) end def announce_when_no_value_found(value) log.debug(format('value for %s is still nil', name: @name)) if value.nil? end def create_or_return_resolution(resolution_name, resolution_type) resolve = resolution(resolution_name) if resolve if resolution_type != resolve.resolution_type raise ArgumentError, "Cannot return resolution #{resolution_name} with type" \ " #{resolution_type}; already defined as #{resolve.resolution_type}" end else case resolution_type when :simple resolve = Facter::Util::Resolution.new(resolution_name, self) when :aggregate resolve = Facter::Core::Aggregate.new(resolution_name, self) else raise ArgumentError, "Expected resolution type to be one of (:simple, :aggregate) but was #{resolution_type}" end @resolves << resolve end resolve end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/util/loader.rb000066400000000000000000000077611470204764400252160ustar00rootroot00000000000000# frozen_string_literal: true # Load facts on demand. module LegacyFacter module Util class Loader def initialize(environment_vars = ENV) @loaded = [] @environment_vars = environment_vars end # Load all resolutions for a single fact. # # @api public # @param name [Symbol] def load(fact) # Now load from the search path shortname = fact.to_s.downcase load_env(shortname) filename = "#{shortname}.rb" paths = search_path paths&.each do |dir| # Load individual files file = File.join(dir, filename) load_file(file) if FileTest.file?(file) end end # Load all facts from all directories. # # @api public def load_all return if defined?(@loaded_all) load_env paths = search_path paths&.each do |dir| # clean the search path of wrong slashes and backslashes dir = dir.gsub(%r{[/\\]+}, File::SEPARATOR) # dir is already an absolute path Dir.glob(File.join(dir, '*.rb')).each do |path| # exclude dirs that end with .rb load_file(path) if FileTest.file?(path) end end @loaded_all = true end # List directories to search for fact files. # # Search paths are gathered from the following sources: # # 1. $LOAD_PATH entries are expanded to absolute paths # 2. ENV['FACTERLIB'] is split and used verbatim # 3. Entries from Facter.search_path are used verbatim # # @api public # @return [Array] def search_path search_paths = [] search_paths += $LOAD_PATH.map { |path| File.expand_path('facter', path) } if @environment_vars.include?('FACTERLIB') search_paths += @environment_vars['FACTERLIB'].split(File::PATH_SEPARATOR) end Facter::Options.custom_dir.each do |path| search_paths << path end search_paths.delete_if { |path| !File.directory?(path) } search_paths.uniq end private def log @log ||= Facter::Log.new(self) end # Load a file and record is paths to prevent duplicate loads. # # @api private # @params file [String] The *absolute path* to the file to load def load_file(file) return if @loaded.include? file # We have to specify Kernel.load, because we have a load method. begin # Store the file path so we don't try to reload it @loaded << file kernel_load(file) rescue ScriptError => e # Don't store the path if the file can't be loaded # in case it's loadable later on. @loaded.delete(file) Facter.log_exception(e, "Error loading fact #{file}: #{e.message}") rescue StandardError => e Facter.log_exception(e, "error while resolving custom facts in #{file} #{e.message}") end end # Load and execute the Ruby program specified in the file. This exists # for testing purposes. # # @api private # @return [Boolean] def kernel_load(file) Kernel.load(file) end # Load facts from the environment. If no name is provided, # all will be loaded. def load_env(fact = nil) # Load from the environment, if possible @environment_vars.each do |name, value| # Skip anything that doesn't match our regex. next unless name =~ /^facter_?(\w+)$/i env_name = Regexp.last_match(1).downcase # If a fact name was specified, skip anything that doesn't # match it. next if fact && (env_name != fact) LegacyFacter.add(env_name, fact_type: :external, is_env: true) do has_weight 1_000_000 setcode { value } end # Short-cut, if we are only looking for one value. break if fact end end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/util/normalization.rb000066400000000000000000000053561470204764400266340ustar00rootroot00000000000000# frozen_string_literal: true module LegacyFacter module Util module Normalization class NormalizationError < StandardError; end # load Date and Time classes require 'time' VALID_TYPES = [Integer, Float, TrueClass, FalseClass, NilClass, Symbol, String, Array, Hash, Date, Time].freeze module_function # Recursively normalize the given data structure # # @api public # @raise [NormalizationError] If the data structure contained an invalid element. # @return [void] def normalize(value) case value when Integer, Float, TrueClass, FalseClass, NilClass, Symbol value when Date, Time value.iso8601 when String normalize_string(value) when Array normalize_array(value) when Hash normalize_hash(value) else raise NormalizationError, "Expected #{value} to be one of #{VALID_TYPES.inspect}, but was #{value.class}" end end # @!method normalize_string(value) # # Attempt to normalize and validate the given string. # # The string is validated by checking that the string encoding # is UTF-8 and that the string content matches the encoding. If the string # is not an expected encoding then it is converted to UTF-8. # # @api public # @raise [NormalizationError] If the string used an unsupported encoding or did not match its encoding # @param value [String] # @return [void] def normalize_string(value) value = value.encode(Encoding::UTF_8) unless value.valid_encoding? raise NormalizationError, "String #{value.inspect} doesn't match the reported encoding #{value.encoding}" end if value.codepoints.include?(0) raise NormalizationError, "String #{value.inspect} contains a null byte reference; unsupported for all facts." end value rescue EncodingError raise NormalizationError, "String encoding #{value.encoding} is not UTF-8 and could not be converted to UTF-8" end # Validate all elements of the array. # # @api public # @raise [NormalizationError] If one of the elements failed validation # @param value [Array] # @return [void] def normalize_array(value) value.collect do |elem| normalize(elem) end end # Validate all keys and values of the hash. # # @api public # @raise [NormalizationError] If one of the keys or values failed normalization # @param value [Hash] # @return [void] def normalize_hash(value) Hash[value.collect { |k, v| [normalize(k), normalize(v)] }] end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/util/nothing_loader.rb000066400000000000000000000004141470204764400267300ustar00rootroot00000000000000# frozen_string_literal: true module LegacyFacter module Util # An external fact loader that doesn't load anything # This makes it possible to disable loading # of external facts class NothingLoader def load(collection); end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/util/parser.rb000066400000000000000000000156001470204764400252330ustar00rootroot00000000000000# frozen_string_literal: true # This class acts as the factory and parent class for parsed # facts such as scripts, text, json and yaml files. # # Parsers must subclass this class and provide their own #results method. module LegacyFacter module Util module Parser STDERR_MESSAGE = 'Command %s completed with the following stderr message: %s' @parsers = [] # For support mutliple extensions you can pass an array of extensions as # +ext+. def self.extension_matches?(filename, ext) extension = case ext when String ext.downcase when Enumerable ext.collect(&:downcase) end [extension].flatten.to_a.include?(file_extension(filename).downcase) end def self.file_extension(filename) File.extname(filename).sub('.', '') end def self.register(klass, &suitable) @parsers << [klass, suitable] end def self.parser_for(filename) registration = @parsers.detect { |k| k[1].call(filename) } if registration.nil? NothingParser.new else registration[0].new(filename) end end class Base attr_reader :filename def initialize(filename, content = nil) @filename = filename @content = content end def content @content ||= Facter::Util::FileHelper.safe_read(filename, nil) end # results on the base class is really meant to be just an exception handler # wrapper. def results parse_results rescue StandardError => e Facter.log_exception(e, "Failed to handle #{filename} as #{self.class} facts: #{e.message}") nil end def parse_results raise ArgumentError, 'Subclasses must respond to parse_results' end def parse_executable_output(output) res = nil begin res = if Gem::Version.new(Psych::VERSION) >= Gem::Version.new('3.1.0') # Ruby 2.6+ YAML.safe_load(output, permitted_classes: [Symbol, Time]) else YAML.safe_load(output, [Symbol, Time]) end rescue StandardError => e Facter.debug("Could not parse executable fact output as YAML or JSON (#{e.message})") end res = KeyValuePairOutputFormat.parse output unless res.is_a?(Hash) res end def log_stderr(msg, command, file) return if !msg || msg.empty? file_name = file.split('/').last logger = Facter::Log.new(file_name) logger.warn(format(STDERR_MESSAGE, command, msg.strip)) end end module KeyValuePairOutputFormat def self.parse(output) return {} if output.nil? result = {} re = /^(.+?)=(.+)$/ output.each_line do |line| if (match_data = re.match(line.chomp)) result[match_data[1]] = match_data[2] end end result end end # This regex was taken from Psych and adapted # https://github.com/ruby/psych/blob/d2deaa9adfc88fc0b870df022a434d6431277d08/lib/psych/scalar_scanner.rb#L9 # It is used to detect Time in YAML, but we use it to wrap time objects in quotes to be treated as strings. TIME = /(\d{4}-\d{1,2}-\d{1,2}(?:[Tt]|\s+)\d{1,2}:\d\d:\d\d(?:\.\d*)?(?:\s*(?:Z|[-+]\d{1,2}:?(?:\d\d)?))?\s*$)/.freeze class YamlParser < Base def parse_results # Add quotes to Yaml time cont = content.gsub(TIME, '"\1"') if Gem::Version.new(Psych::VERSION) >= Gem::Version.new('3.1.0') # Ruby 2.6+ YAML.safe_load(cont, permitted_classes: [Date], aliases: true) else YAML.safe_load(cont, [Date], [], [], true) end end end register(YamlParser) do |filename| extension_matches?(filename, 'yaml') end class TextParser < Base def parse_results KeyValuePairOutputFormat.parse content end end register(TextParser) do |filename| extension_matches?(filename, 'txt') end class JsonParser < Base def parse_results if LegacyFacter.json? JSON.parse(content) else log.warnonce "Cannot parse JSON data file #{filename} without the json library." log.warnonce 'Suggested next step is `gem install json` to install the json library.' nil end end private def log @log ||= Facter::Log.new(self) end end register(JsonParser) do |filename| extension_matches?(filename, 'json') end class ScriptParser < Base def parse_results stdout, stderr = Facter::Core::Execution.execute_command(quote(filename)) log_stderr(stderr, filename, filename) parse_executable_output(stdout) end private def quote(filename) filename.index(' ') ? "\"#{filename}\"" : filename end end register(ScriptParser) do |filename| if LegacyFacter::Util::Config.windows? extension_matches?(filename, %w[bat cmd com exe]) && FileTest.file?(filename) else File.executable?(filename) && FileTest.file?(filename) && !extension_matches?(filename, %w[bat cmd com exe]) end end # Executes and parses the key value output of Powershell scripts class PowershellParser < Base # Returns a hash of facts from powershell output def parse_results powershell = if File.readable?("#{ENV['SYSTEMROOT']}\\sysnative\\WindowsPowershell\\v1.0\\powershell.exe") "#{ENV['SYSTEMROOT']}\\sysnative\\WindowsPowershell\\v1.0\\powershell.exe" elsif File.readable?("#{ENV['SYSTEMROOT']}\\system32\\WindowsPowershell\\v1.0\\powershell.exe") "#{ENV['SYSTEMROOT']}\\system32\\WindowsPowershell\\v1.0\\powershell.exe" else 'powershell.exe' end shell_command = "\"#{powershell}\" -NoProfile -NonInteractive -NoLogo -ExecutionPolicy Bypass -File \"#{filename}\"" stdout, stderr = Facter::Core::Execution.execute_command(shell_command) log_stderr(stderr, shell_command, filename) parse_executable_output(stdout) end end register(PowershellParser) do |filename| LegacyFacter::Util::Config.windows? && extension_matches?(filename, 'ps1') && FileTest.file?(filename) end # A parser that is used when there is no other parser that can handle the file # The return from results indicates to the caller the file was not parsed correctly. class NothingParser def results nil end end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/util/resolution.rb000066400000000000000000000133551470204764400261470ustar00rootroot00000000000000# frozen_string_literal: true # This represents a fact resolution. A resolution is a concrete # implementation of a fact. A single fact can have many resolutions and # the correct resolution will be chosen at runtime. Each time # {Facter.add} is called, a new resolution is created and added to the # set of resolutions for the fact named in the call. Each resolution # has a {#has_weight weight}, which defines its priority over other # resolutions, and a set of {#confine _confinements_}, which defines the # conditions under which it will be chosen. All confinements must be # satisfied for a fact to be considered _suitable_. # # @api public module Facter module Util class Resolution # @api private attr_accessor :code, :fact_type # @api private attr_writer :value extend Facter::Core::Execution class << self # Expose command execution methods that were extracted into # Facter::Core::Execution from Facter::Util::Resolution in Facter 2.0.0 for # compatibility. # # @deprecated # # @api public public :which, :exec # @api private public :with_env end include LegacyFacter::Core::Resolvable include LegacyFacter::Core::Suitable # @!attribute [rw] name # The name of this resolution. The resolution name should be unique with # respect to the given fact. # # @return [String] # # @api public attr_accessor :name # @!attribute [r] fact # # @return [Facter::Util::Fact] Associated fact with this resolution. # # @api private attr_reader :fact, :last_evaluated, :file # Create a new resolution mechanism. # # @param name [String] The name of the resolution. # @param fact [Facter::Fact] The fact to which this # resolution will be added. # # @return [Facter::Util::Resolution] The created resolution # # @api public def initialize(name, fact) @name = name @fact = fact @confines = [] @value = nil @timeout = 0 @weight = nil end # Returns the fact's resolution type # # @return [Symbol] The fact's type # # @api private def resolution_type :simple end # Evaluate the given block in the context of this resolution. If a block has # already been evaluated emit a warning to that effect. # # @return [String] Result of the block's evaluation # # @api private def evaluate(&block) if @last_evaluated msg = +"Already evaluated #{@name}" msg << " at #{@last_evaluated}" if msg.is_a? String msg << ', reevaluating anyways' log.warn msg end instance_eval(&block) @last_evaluated = block.source_location.join(':') end # Sets options for the aggregate fact # # @return [nil] # # @api private def options(options) accepted_options = %i[name value timeout weight fact_type file is_env] accepted_options.each do |option_name| instance_variable_set("@#{option_name}", options.delete(option_name)) if options.key?(option_name) end raise ArgumentError, "Invalid resolution options #{options.keys.inspect}" unless options.keys.empty? end # Sets the code block or external program that will be evaluated to # get the value of the fact. # # @overload setcode(string) # Sets an external program to call to get the value of the resolution # @param [String] string the external program to run to get the # value # # @overload setcode(&block) # Sets the resolution's value by evaluating a block at runtime # @param [Proc] block The block to determine the resolution's value. # This block is run when the fact is evaluated. Errors raised from # inside the block are rescued and printed to stderr. # # @return [Facter::Util::Resolution] Returns itself # # @api public def setcode(string = nil, &block) if string @code = proc do output = Facter::Core::Execution.execute(string, on_fail: nil) if output.nil? || output.empty? nil else output end end elsif block_given? @code = block else raise ArgumentError, 'You must pass either code or a block' end self end # Comparison is done based on weight and fact type. # The greater the weight, the higher the priority. # If weights are equal, we consider external facts greater than custom facts. # # @return [bool] Weight comparison result # # @api private def <=>(other) if weight == other.weight compare_equal_weights(other) else weight <=> other.weight end end private def log @log ||= Facter::Log.new(self) end # If the weights are equal, we consider external facts greater tan custom facts def compare_equal_weights(other) # Other is considered greater because self is custom fact and other is external return -1 if fact_type == :custom && other.fact_type == :external # Self is considered greater, because it is external fact and other is custom return 1 if fact_type == :external && other.fact_type == :custom # They are considered equal 0 end def resolve_value if !@value.nil? @value elsif @code.nil? nil elsif @code @code.call end end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/util/unix_root.rb000066400000000000000000000002341470204764400257620ustar00rootroot00000000000000# frozen_string_literal: true module LegacyFacter module Util module Root def self.root? Process.uid.zero? end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/util/values.rb000066400000000000000000000064401470204764400252400ustar00rootroot00000000000000# frozen_string_literal: true module LegacyFacter module Util # A util module for custom_facts containing helper methods module Values module_function class DeepFreezeError < StandardError; end # Duplicate and deeply freeze a given data structure # # @param value [Object] The structure to freeze # @return [void] def deep_freeze(value) case value when Numeric, Symbol, TrueClass, FalseClass, NilClass # These are immutable values, we can safely ignore them value when String value.dup.freeze when Array value.map do |entry| deep_freeze(entry) end.freeze when Hash value.each_with_object({}) do |(key, val), hash| hash[deep_freeze(key)] = deep_freeze(val) end.freeze else raise DeepFreezeError, "Cannot deep freeze #{value}:#{value.class}" end end class DeepMergeError < StandardError; end # Perform a deep merge of two nested data structures. # # @param left [Object] # @param right [Object] # @param path [Array] The traversal path followed when merging nested hashes # # @return [Object] The merged data structure. def deep_merge(left, right, path = []) ret = nil if left.is_a?(Hash) && right.is_a?(Hash) ret = left.merge(right) do |key, left_val, right_val| path.push(key) merged = deep_merge(left_val, right_val, path) path.pop merged end elsif left.is_a?(Array) && right.is_a?(Array) ret = left.dup.concat(right) elsif right.nil? ret = left elsif left.nil? ret = right elsif left.nil? && right.nil? ret = nil else msg = "Cannot merge #{left.inspect}:#{left.class} and #{right.inspect}:#{right.class}" unless path.empty? msg << ' at root' msg << path.map { |part| "[#{part.inspect}]" }.join end raise DeepMergeError, msg end ret end def convert(value) value = value.to_s if value.is_a?(Symbol) value = value.downcase if value.is_a?(String) value end # Flatten the given data structure to something that's suitable to return # as flat facts. # # @param path [String] The fact path to be prefixed to the given value. # @param structure [Object] The data structure to flatten. Nested hashes # will be recursively flattened, everything else will be returned as-is. # # @return [Hash] The given data structure prefixed with the given path def flatten_structure(path, structure) results = {} if structure.is_a? Hash structure.each_pair do |name, value| new_path = "#{path}_#{name}".gsub(%r{-|/}, '_') results.merge! flatten_structure(new_path, value) end elsif structure.is_a? Array structure.each_with_index do |value, index| new_path = "#{path}_#{index}" results.merge! flatten_structure(new_path, value) end else results[path] = structure end results end end end end puppetlabs-facter-dfe6df4/lib/facter/custom_facts/util/windows_root.rb000066400000000000000000000005561470204764400265000ustar00rootroot00000000000000# frozen_string_literal: true module LegacyFacter module Util module Root def self.root? require_relative '../../../facter/resolvers/windows/ffi/identity_ffi' IdentityFFI.privileged? rescue LoadError => e log = Facter::Log.new(self) log.debug("The ffi gem has not been installed: #{e}") end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/000077500000000000000000000000001470204764400210415ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/aix/000077500000000000000000000000001470204764400216225ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/aix/aio_agent_version.rb000066400000000000000000000004761470204764400256510ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class AioAgentVersion FACT_NAME = 'aio_agent_version' def call_the_resolver fact_value = Facter::Resolvers::AioAgentVersion.resolve(:aio_agent_version) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/augeas/000077500000000000000000000000001470204764400230675ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/aix/augeas/version.rb000066400000000000000000000006671470204764400251120ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Augeas class Version FACT_NAME = 'augeas.version' ALIASES = 'augeasversion' def call_the_resolver fact_value = Facter::Resolvers::Augeas.resolve(:augeas_version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/disks.rb000066400000000000000000000015431470204764400232670ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class Disks FACT_NAME = 'disks' ALIASES = %w[blockdevices blockdevice_.*_size].freeze def call_the_resolver facts = [] disks = Facter::Resolvers::Aix::Disks.resolve(:disks) return Facter::ResolvedFact.new(FACT_NAME, nil) if disks.nil? || disks.empty? blockdevices = disks.keys.join(',') facts.push(Facter::ResolvedFact.new(FACT_NAME, disks)) facts.push(Facter::ResolvedFact.new('blockdevices', blockdevices, :legacy)) add_legacy_facts(disks, facts) facts end private def add_legacy_facts(disks, facts) disks.each do |disk_name, disk_info| facts.push(Facter::ResolvedFact.new("blockdevice_#{disk_name}_size", disk_info[:size_bytes], :legacy)) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/facterversion.rb000066400000000000000000000004631470204764400250240ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class Facterversion FACT_NAME = 'facterversion' def call_the_resolver fact_value = Facter::Resolvers::Facterversion.resolve(:facterversion) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/filesystems.rb000066400000000000000000000004571470204764400245240ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class Filesystems FACT_NAME = 'filesystems' def call_the_resolver fact_value = Facter::Resolvers::Aix::Filesystem.resolve(:file_systems) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/hypervisors/000077500000000000000000000000001470204764400242175ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/aix/hypervisors/lpar.rb000066400000000000000000000011601470204764400255000ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Hypervisors class Lpar FACT_NAME = 'hypervisors.lpar' def call_the_resolver lpar_partition_number = Facter::Resolvers::Lpar.resolve(:lpar_partition_number) return Facter::ResolvedFact.new(FACT_NAME, nil) unless lpar_partition_number&.positive? Facter::ResolvedFact.new(FACT_NAME, partition_number: lpar_partition_number, partition_name: Facter::Resolvers::Lpar.resolve(:lpar_partition_name)) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/hypervisors/wpar.rb000066400000000000000000000010251470204764400255130ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Hypervisors class Wpar FACT_NAME = 'hypervisors.wpar' def call_the_resolver wpar_key = Facter::Resolvers::Wpar.resolve(:wpar_key) return Facter::ResolvedFact.new(FACT_NAME, nil) unless wpar_key&.positive? Facter::ResolvedFact.new(FACT_NAME, key: wpar_key, configured_id: Facter::Resolvers::Wpar.resolve(:wpar_configured_id)) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/identity/000077500000000000000000000000001470204764400234535ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/aix/identity/gid.rb000066400000000000000000000005061470204764400245440ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Identity class Gid FACT_NAME = 'identity.gid' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:gid) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/identity/group.rb000066400000000000000000000006371470204764400251420ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Identity class Group FACT_NAME = 'identity.group' ALIASES = 'gid' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:group) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/identity/privileged.rb000066400000000000000000000005331470204764400261330ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Identity class Privileged FACT_NAME = 'identity.privileged' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:privileged) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/identity/uid.rb000066400000000000000000000005061470204764400245620ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Identity class Uid FACT_NAME = 'identity.uid' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:uid) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/identity/user.rb000066400000000000000000000006321470204764400247570ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Identity class User FACT_NAME = 'identity.user' ALIASES = 'id' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:user) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/interfaces.rb000066400000000000000000000006271470204764400242770ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class Interfaces FACT_NAME = 'interfaces' TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::Aix::Networking.resolve(:interfaces) fact_value = fact_value&.any? ? fact_value.keys.sort.join(',') : nil Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/ipaddress6_interfaces.rb000066400000000000000000000007371470204764400264250ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class Ipaddress6Interfaces FACT_NAME = 'ipaddress6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Aix::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("ipaddress6_#{interface_name}", info[:ip6], :legacy) if info[:ip6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/ipaddress_interfaces.rb000066400000000000000000000007321470204764400263320ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class IpaddressInterfaces FACT_NAME = 'ipaddress_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Aix::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("ipaddress_#{interface_name}", info[:ip], :legacy) if info[:ip] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/kernel.rb000066400000000000000000000004351470204764400234310ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class Kernel FACT_NAME = 'kernel' def call_the_resolver fact_value = Facter::Resolvers::Aix::OsLevel.resolve(:kernel) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/kernelmajversion.rb000066400000000000000000000005521470204764400255270ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class Kernelmajversion FACT_NAME = 'kernelmajversion' def call_the_resolver fact_value = Facter::Resolvers::Aix::OsLevel.resolve(:build) kernelmajversion = fact_value.split('-')[0] Facter::ResolvedFact.new(FACT_NAME, kernelmajversion) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/kernelrelease.rb000066400000000000000000000004601470204764400247700ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class Kernelrelease FACT_NAME = 'kernelrelease' def call_the_resolver fact_value = Facter::Resolvers::Aix::OsLevel.resolve(:build).strip Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/kernelversion.rb000066400000000000000000000005361470204764400250410ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class Kernelversion FACT_NAME = 'kernelversion' def call_the_resolver fact_value = Facter::Resolvers::Aix::OsLevel.resolve(:build) kernelversion = fact_value.split('-')[0] Facter::ResolvedFact.new(FACT_NAME, kernelversion) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/load_averages.rb000066400000000000000000000004651470204764400247500ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class LoadAverages FACT_NAME = 'load_averages' def call_the_resolver fact_value = Facter::Resolvers::Aix::LoadAverages.resolve(:load_averages) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/macaddress_interfaces.rb000066400000000000000000000007371470204764400264670ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class MacaddressInterfaces FACT_NAME = 'macaddress_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Aix::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("macaddress_#{interface_name}", info[:mac], :legacy) if info[:mac] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/memory/000077500000000000000000000000001470204764400231325ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/aix/memory/swap/000077500000000000000000000000001470204764400241045ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/aix/memory/swap/available.rb000066400000000000000000000011641470204764400263530ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Memory module Swap class Available FACT_NAME = 'memory.swap.available' ALIASES = 'swapfree' def call_the_resolver fact_value = Facter::Resolvers::Aix::Memory.resolve(:swap) if fact_value fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value[:available_bytes]) end [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/memory/swap/available_bytes.rb000066400000000000000000000011461470204764400275610ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Memory module Swap class AvailableBytes FACT_NAME = 'memory.swap.available_bytes' ALIASES = 'swapfree_mb' def call_the_resolver fact_value = Facter::Resolvers::Aix::Memory.resolve(:swap) fact_value = fact_value[:available_bytes] if fact_value [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/memory/swap/capacity.rb000066400000000000000000000006711470204764400262320ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Memory module Swap class Capacity FACT_NAME = 'memory.swap.capacity' def call_the_resolver fact_value = Facter::Resolvers::Aix::Memory.resolve(:swap) fact_value = fact_value[:capacity] if fact_value Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/memory/swap/total.rb000066400000000000000000000011501470204764400255510ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Memory module Swap class Total FACT_NAME = 'memory.swap.total' ALIASES = 'swapsize' def call_the_resolver fact_value = Facter::Resolvers::Aix::Memory.resolve(:swap) if fact_value fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value[:total_bytes]) end [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/memory/swap/total_bytes.rb000066400000000000000000000011321470204764400267570ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Memory module Swap class TotalBytes FACT_NAME = 'memory.swap.total_bytes' ALIASES = 'swapsize_mb' def call_the_resolver fact_value = Facter::Resolvers::Aix::Memory.resolve(:swap) fact_value = fact_value[:total_bytes] if fact_value [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/memory/swap/used.rb000066400000000000000000000010141470204764400253650ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Memory module Swap class Used FACT_NAME = 'memory.swap.used' def call_the_resolver fact_value = Facter::Resolvers::Aix::Memory.resolve(:swap) if fact_value fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value[:used_bytes]) end Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/memory/swap/used_bytes.rb000066400000000000000000000006751470204764400266070ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Memory module Swap class UsedBytes FACT_NAME = 'memory.swap.used_bytes' def call_the_resolver fact_value = Facter::Resolvers::Aix::Memory.resolve(:swap) fact_value = fact_value[:used_bytes] if fact_value Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/memory/system/000077500000000000000000000000001470204764400244565ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/aix/memory/system/available.rb000066400000000000000000000011741470204764400267260ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Memory module System class Available FACT_NAME = 'memory.system.available' ALIASES = 'memoryfree' def call_the_resolver fact_value = Facter::Resolvers::Aix::Memory.resolve(:system) if fact_value fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value[:available_bytes]) end [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/memory/system/available_bytes.rb000066400000000000000000000011561470204764400301340ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Memory module System class AvailableBytes FACT_NAME = 'memory.system.available_bytes' ALIASES = 'memoryfree_mb' def call_the_resolver fact_value = Facter::Resolvers::Aix::Memory.resolve(:system) fact_value = fact_value[:available_bytes] if fact_value [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/memory/system/capacity.rb000066400000000000000000000006771470204764400266120ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Memory module System class Capacity FACT_NAME = 'memory.system.capacity' def call_the_resolver fact_value = Facter::Resolvers::Aix::Memory.resolve(:system) fact_value = fact_value[:capacity] if fact_value Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/memory/system/total.rb000066400000000000000000000011601470204764400261240ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Memory module System class Total FACT_NAME = 'memory.system.total' ALIASES = 'memorysize' def call_the_resolver fact_value = Facter::Resolvers::Aix::Memory.resolve(:system) if fact_value fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value[:total_bytes]) end [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/memory/system/total_bytes.rb000066400000000000000000000011421470204764400273320ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Memory module System class TotalBytes FACT_NAME = 'memory.system.total_bytes' ALIASES = 'memorysize_mb' def call_the_resolver fact_value = Facter::Resolvers::Aix::Memory.resolve(:system) fact_value = fact_value[:total_bytes] if fact_value [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/memory/system/used.rb000066400000000000000000000010221470204764400257360ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Memory module System class Used FACT_NAME = 'memory.system.used' def call_the_resolver fact_value = Facter::Resolvers::Aix::Memory.resolve(:system) if fact_value fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value[:used_bytes]) end Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/memory/system/used_bytes.rb000066400000000000000000000007031470204764400271510ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Memory module System class UsedBytes FACT_NAME = 'memory.system.used_bytes' def call_the_resolver fact_value = Facter::Resolvers::Aix::Memory.resolve(:system) fact_value = fact_value[:used_bytes] if fact_value Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/mountpoints.rb000066400000000000000000000004621470204764400245500ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class Mountpoints FACT_NAME = 'mountpoints' def call_the_resolver mountpoints = Facter::Resolvers::Aix::Mountpoints.resolve(:mountpoints) Facter::ResolvedFact.new(FACT_NAME, mountpoints) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/mtu_interfaces.rb000066400000000000000000000007121470204764400251570ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class MtuInterfaces FACT_NAME = 'mtu_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Aix::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("mtu_#{interface_name}", info[:mtu], :legacy) if info[:mtu] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/netmask6_interfaces.rb000066400000000000000000000007431470204764400261060ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class Netmask6Interfaces FACT_NAME = 'netmask6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Aix::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("netmask6_#{interface_name}", info[:netmask6], :legacy) if info[:netmask6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/netmask_interfaces.rb000066400000000000000000000007361470204764400260220ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class NetmaskInterfaces FACT_NAME = 'netmask_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Aix::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("netmask_#{interface_name}", info[:netmask], :legacy) if info[:netmask] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/network6_interfaces.rb000066400000000000000000000007431470204764400261350ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class Network6Interfaces FACT_NAME = 'network6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Aix::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("network6_#{interface_name}", info[:network6], :legacy) if info[:network6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/network_interfaces.rb000066400000000000000000000007361470204764400260510ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class NetworkInterfaces FACT_NAME = 'network_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Aix::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("network_#{interface_name}", info[:network], :legacy) if info[:network] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/networking/000077500000000000000000000000001470204764400240115ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/aix/networking/domain.rb000066400000000000000000000006441470204764400256110ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Networking class Domain FACT_NAME = 'networking.domain' ALIASES = 'domain' def call_the_resolver fact_value = Facter::Resolvers::Hostname.resolve(:domain) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/networking/fqdn.rb000066400000000000000000000006341470204764400252710ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Networking class Fqdn FACT_NAME = 'networking.fqdn' ALIASES = 'fqdn' def call_the_resolver fact_value = Facter::Resolvers::Hostname.resolve(:fqdn) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/networking/hostname.rb000066400000000000000000000006541470204764400261610ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Networking class Hostname FACT_NAME = 'networking.hostname' ALIASES = 'hostname' def call_the_resolver fact_value = Facter::Resolvers::Hostname.resolve(:hostname) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/networking/interfaces.rb000066400000000000000000000006361470204764400264660ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Networking class Interfaces FACT_NAME = 'networking.interfaces' def call_the_resolver fact_value = Facter::Resolvers::Aix::Networking.resolve(:interfaces) fact_value = fact_value&.any? ? fact_value : nil Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/networking/ip.rb000066400000000000000000000006431470204764400247510ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Networking class Ip FACT_NAME = 'networking.ip' ALIASES = 'ipaddress' def call_the_resolver fact_value = Facter::Resolvers::Aix::Networking.resolve(:ip) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/networking/ip6.rb000066400000000000000000000006471470204764400250430ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Networking class Ip6 FACT_NAME = 'networking.ip6' ALIASES = 'ipaddress6' def call_the_resolver fact_value = Facter::Resolvers::Aix::Networking.resolve(:ip6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/networking/mac.rb000066400000000000000000000006471470204764400251050ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Networking class Mac FACT_NAME = 'networking.mac' ALIASES = 'macaddress' def call_the_resolver fact_value = Facter::Resolvers::Aix::Networking.resolve(:mac) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/networking/mtu.rb000066400000000000000000000005161470204764400251450ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Networking class Mtu FACT_NAME = 'networking.mtu' def call_the_resolver fact_value = Facter::Resolvers::Aix::Networking.resolve(:mtu) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/networking/netmask.rb000066400000000000000000000006601470204764400260020ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Networking class Netmask FACT_NAME = 'networking.netmask' ALIASES = 'netmask' def call_the_resolver fact_value = Facter::Resolvers::Aix::Networking.resolve(:netmask) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/networking/netmask6.rb000066400000000000000000000006641470204764400260740ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Networking class Netmask6 FACT_NAME = 'networking.netmask6' ALIASES = 'netmask6' def call_the_resolver fact_value = Facter::Resolvers::Aix::Networking.resolve(:netmask6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/networking/network.rb000066400000000000000000000006601470204764400260310ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Networking class Network FACT_NAME = 'networking.network' ALIASES = 'network' def call_the_resolver fact_value = Facter::Resolvers::Aix::Networking.resolve(:network) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/networking/network6.rb000066400000000000000000000006641470204764400261230ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Networking class Network6 FACT_NAME = 'networking.network6' ALIASES = 'network6' def call_the_resolver fact_value = Facter::Resolvers::Aix::Networking.resolve(:network6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/networking/primary.rb000066400000000000000000000005441470204764400260240ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Networking class Primary FACT_NAME = 'networking.primary' def call_the_resolver fact_value = Facter::Resolvers::Aix::Networking.resolve(:primary_interface) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/networking/scope6.rb000066400000000000000000000006701470204764400255400ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Networking class Scope6 FACT_NAME = 'networking.scope6' ALIASES = 'scope6' def call_the_resolver fact_value = Facter::Resolvers::Aix::Networking.resolve(:scope6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new('scope6', fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/nim_type.rb000066400000000000000000000004321470204764400237720ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class NimType FACT_NAME = 'nim_type' def call_the_resolver fact_value = Facter::Resolvers::Aix::Nim.resolve(:type) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/os/000077500000000000000000000000001470204764400222435ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/aix/os/architecture.rb000066400000000000000000000006611470204764400252550ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Os class Architecture FACT_NAME = 'os.architecture' ALIASES = 'architecture' def call_the_resolver fact_value = Facter::Resolvers::Architecture.resolve(:architecture) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/os/family.rb000066400000000000000000000006301470204764400240500ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Os class Family FACT_NAME = 'os.family' ALIASES = 'osfamily' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:kernelname) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/os/hardware.rb000066400000000000000000000006421470204764400243670ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Os class Hardware FACT_NAME = 'os.hardware' ALIASES = 'hardwaremodel' def call_the_resolver fact_value = Facter::Resolvers::Hardware.resolve(:hardware) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/os/name.rb000066400000000000000000000006331470204764400235120ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Os class Name FACT_NAME = 'os.name' ALIASES = 'operatingsystem' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:kernelname) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/os/release.rb000066400000000000000000000011541470204764400242110ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver fact_value = Facter::Resolvers::Aix::OsLevel.resolve(:build) major = fact_value.split('-')[0] [Facter::ResolvedFact.new(FACT_NAME, full: fact_value.strip, major: major), Facter::ResolvedFact.new(ALIASES.first, major, :legacy), Facter::ResolvedFact.new(ALIASES.last, fact_value.strip, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/partitions.rb000066400000000000000000000005061470204764400243440ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class Partitions FACT_NAME = 'partitions' def call_the_resolver partitions = Facter::Resolvers::Aix::Partitions.resolve(:partitions) Facter::ResolvedFact.new(FACT_NAME, partitions.empty? ? nil : partitions) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/path.rb000066400000000000000000000004161470204764400231040ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class Path FACT_NAME = 'path' def call_the_resolver fact_value = Facter::Resolvers::Path.resolve(:path) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/processor.rb000066400000000000000000000006741470204764400241750ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class Processor FACT_NAME = 'processor.*' TYPE = :legacy def call_the_resolver arr = [] processors = Facter::Resolvers::Aix::Processors.resolve(:models) processors.count.times do |iterator| arr << Facter::ResolvedFact.new("processor#{iterator}", processors[iterator], :legacy) end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/processors/000077500000000000000000000000001470204764400240245ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/aix/processors/cores.rb000066400000000000000000000005361470204764400254700ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Processors class Cores FACT_NAME = 'processors.cores' def call_the_resolver fact_value = Facter::Resolvers::Aix::Processors.resolve(:cores_per_socket) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/processors/count.rb000066400000000000000000000006701470204764400255040ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Processors class Count FACT_NAME = 'processors.count' ALIASES = 'processorcount' def call_the_resolver fact_value = Facter::Resolvers::Aix::Processors.resolve(:logical_count) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/processors/isa.rb000066400000000000000000000006441470204764400251310ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Processors class Isa FACT_NAME = 'processors.isa' ALIASES = 'hardwareisa' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:processor) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/processors/models.rb000066400000000000000000000005261470204764400256370ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Processors class Models FACT_NAME = 'processors.models' def call_the_resolver fact_value = Facter::Resolvers::Aix::Processors.resolve(:models) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/processors/speed.rb000066400000000000000000000006471470204764400254600ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Processors class Speed FACT_NAME = 'processors.speed' def call_the_resolver fact_value = Facter::Resolvers::Aix::Processors.resolve(:speed) speed = Facter::Util::Facts::UnitConverter.hertz_to_human_readable(fact_value) Facter::ResolvedFact.new(FACT_NAME, speed) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/processors/threads.rb000066400000000000000000000005421470204764400260040ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Processors class Threads FACT_NAME = 'processors.threads' def call_the_resolver fact_value = Facter::Resolvers::Aix::Processors.resolve(:threads_per_core) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/ruby/000077500000000000000000000000001470204764400226035ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/aix/ruby/platform.rb000066400000000000000000000006401470204764400247540ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Ruby class Platform FACT_NAME = 'ruby.platform' ALIASES = 'rubyplatform' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:platform) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/ruby/sitedir.rb000066400000000000000000000006341470204764400245760ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Ruby class Sitedir FACT_NAME = 'ruby.sitedir' ALIASES = 'rubysitedir' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:sitedir) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/ruby/version.rb000066400000000000000000000006341470204764400246200ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module Ruby class Version FACT_NAME = 'ruby.version' ALIASES = 'rubyversion' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/scope6_interfaces.rb000066400000000000000000000010251470204764400255470ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class Scope6Interfaces FACT_NAME = 'scope6_.*' TYPE = :legacy def call_the_resolver resolved_facts = [] interfaces = Facter::Resolvers::Aix::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| if info[:scope6] resolved_facts << Facter::ResolvedFact.new("scope6_#{interface_name}", info[:scope6], :legacy) end end resolved_facts end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/serialnumber.rb000066400000000000000000000005631470204764400246430ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class Serialnumber FACT_NAME = 'serialnumber' TYPE = :legacy def call_the_resolver Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy) end private def fact_value Facter::Resolvers::Aix::Serialnumber.resolve(:serialnumber) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/ssh.rb000066400000000000000000000012631470204764400227460ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class Ssh FACT_NAME = 'ssh' def call_the_resolver Facter::ResolvedFact.new(FACT_NAME, fact_value) end private def fact_value resolver_data.map { |el| create_ssh_fact(el) }.inject(:merge) end def resolver_data Facter::Resolvers::Ssh.resolve(:ssh) end def create_ssh_fact(ssh) return {} unless ssh { ssh.name.to_sym => { fingerprints: { sha1: ssh.fingerprint.sha1, sha256: ssh.fingerprint.sha256 }, key: ssh.key, type: ssh.type } } end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/sshalgorithmkey.rb000066400000000000000000000006031470204764400253630ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class Sshalgorithmkey FACT_NAME = 'ssh.*key' TYPE = :legacy def call_the_resolver facts = [] result = Facter::Resolvers::Ssh.resolve(:ssh) result.each { |ssh| facts << Facter::ResolvedFact.new("ssh#{ssh.name.to_sym}key", ssh.key, :legacy) } facts end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/sshfp_algorithm.rb000066400000000000000000000007601470204764400253430ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class SshfpAlgorithm FACT_NAME = 'sshfp_.*' TYPE = :legacy def call_the_resolver facts = [] result = Facter::Resolvers::Ssh.resolve(:ssh) result.each do |ssh| facts << Facter::ResolvedFact.new("sshfp_#{ssh.name.to_sym}", "#{ssh.fingerprint.sha1}\n#{ssh.fingerprint.sha256}", :legacy) end facts end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/system_uptime/000077500000000000000000000000001470204764400245315ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/aix/system_uptime/days.rb000066400000000000000000000006461470204764400260240ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module SystemUptime class Days FACT_NAME = 'system_uptime.days' ALIASES = 'uptime_days' def call_the_resolver fact_value = Facter::Resolvers::Uptime.resolve(:days) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/system_uptime/hours.rb000066400000000000000000000006521470204764400262210ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module SystemUptime class Hours FACT_NAME = 'system_uptime.hours' ALIASES = 'uptime_hours' def call_the_resolver fact_value = Facter::Resolvers::Uptime.resolve(:hours) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/system_uptime/seconds.rb000066400000000000000000000006621470204764400265200ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module SystemUptime class Seconds FACT_NAME = 'system_uptime.seconds' ALIASES = 'uptime_seconds' def call_the_resolver fact_value = Facter::Resolvers::Uptime.resolve(:seconds) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/system_uptime/uptime.rb000066400000000000000000000006471470204764400263700ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix module SystemUptime class Uptime FACT_NAME = 'system_uptime.uptime' ALIASES = 'uptime' def call_the_resolver fact_value = Facter::Resolvers::Uptime.resolve(:uptime) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/aix/timezone.rb000066400000000000000000000004361470204764400240040ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Aix class Timezone FACT_NAME = 'timezone' def call_the_resolver fact_value = Facter::Resolvers::Timezone.resolve(:timezone) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/alpine/000077500000000000000000000000001470204764400223115ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/alpine/os/000077500000000000000000000000001470204764400227325ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/alpine/os/release.rb000066400000000000000000000016201470204764400246760ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Alpine module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver version = determine_release_version return Facter::ResolvedFact.new(FACT_NAME, nil) unless version [Facter::ResolvedFact.new(FACT_NAME, version), Facter::ResolvedFact.new(ALIASES.first, version['major'], :legacy), Facter::ResolvedFact.new(ALIASES.last, version['full'], :legacy)] end def determine_release_version version = Facter::Resolvers::SpecificReleaseFile.resolve(:release, release_file: '/etc/alpine-release') version ||= Facter::Resolvers::OsRelease.resolve(:version_id) Facter::Util::Facts.release_hash_from_string(version) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/amzn/000077500000000000000000000000001470204764400220065ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/amzn/lsbdistcodename.rb000066400000000000000000000005161470204764400254750ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Amzn class Lsbdistcodename FACT_NAME = 'lsbdistcodename' TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:codename) Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/amzn/lsbdistdescription.rb000066400000000000000000000005271470204764400262470ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Amzn class Lsbdistdescription FACT_NAME = 'lsbdistdescription' TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:description) Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/amzn/lsbdistid.rb000066400000000000000000000005101470204764400243100ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Amzn class Lsbdistid FACT_NAME = 'lsbdistid' TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:distributor_id) Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/amzn/os/000077500000000000000000000000001470204764400224275ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/amzn/os/distro/000077500000000000000000000000001470204764400237335ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/amzn/os/distro/codename.rb000066400000000000000000000011151470204764400260310ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Amzn module Os module Distro class Codename FACT_NAME = 'os.distro.codename' def call_the_resolver fact_value = Facter::Resolvers::SpecificReleaseFile.resolve( :release, release_file: '/etc/system-release' ).match(/.*release.*(\(.*\)).*/) fact_value = fact_value[1].gsub(/\(|\)/, '') if fact_value fact_value ||= 'n/a' Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/amzn/os/distro/description.rb000066400000000000000000000007131470204764400266040ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Amzn module Os module Distro class Description FACT_NAME = 'os.distro.description' def call_the_resolver fact_value = Facter::Resolvers::SpecificReleaseFile.resolve( :release, release_file: '/etc/system-release' ) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/amzn/os/distro/id.rb000066400000000000000000000010021470204764400246450ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Amzn module Os module Distro class Id FACT_NAME = 'os.distro.id' def call_the_resolver fact_value = Facter::Resolvers::SpecificReleaseFile.resolve( :release, release_file: '/etc/system-release' ).split('release')[0].split.reject { |el| el.casecmp('linux').zero? }.join Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/amzn/os/distro/release.rb000066400000000000000000000025001470204764400256750ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Amzn module Os module Distro class Release FACT_NAME = 'os.distro.release' ALIASES = %w[lsbdistrelease lsbmajdistrelease lsbminordistrelease].freeze def call_the_resolver version = determine_release_version return Facter::ResolvedFact.new(FACT_NAME, nil) unless version [Facter::ResolvedFact.new(FACT_NAME, version), Facter::ResolvedFact.new(ALIASES[0], version['full'], :legacy), Facter::ResolvedFact.new(ALIASES[1], version['major'], :legacy), Facter::ResolvedFact.new(ALIASES[2], version['minor'], :legacy)] end def determine_release_version # For backwards compatibility, use system-release for AL1/AL2 version = Facter::Resolvers::ReleaseFromFirstLine.resolve(:release, release_file: '/etc/system-release') if !version.nil? && version != '2' # Use os-release for AL2023 and up version = Facter::Resolvers::Amzn::OsReleaseRpm.resolve(:version) end version ||= Facter::Resolvers::OsRelease.resolve(:version_id) Facter::Util::Facts.release_hash_from_string(version, include_patch: true) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/amzn/os/release.rb000066400000000000000000000022171470204764400243760ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Amzn module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver version = determine_release_version return Facter::ResolvedFact.new(FACT_NAME, nil) unless version [Facter::ResolvedFact.new(FACT_NAME, version), Facter::ResolvedFact.new(ALIASES.first, version['major'], :legacy), Facter::ResolvedFact.new(ALIASES.last, version['full'], :legacy)] end def determine_release_version # For backwards compatibility, use system-release for AL1/AL2 version = Facter::Resolvers::ReleaseFromFirstLine.resolve(:release, release_file: '/etc/system-release') if !version.nil? && version != '2' # Use os-release for AL2023 and up version = Facter::Resolvers::Amzn::OsReleaseRpm.resolve(:version) end version ||= Facter::Resolvers::OsRelease.resolve(:version_id) Facter::Util::Facts.release_hash_from_string(version) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/archlinux/000077500000000000000000000000001470204764400230365ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/archlinux/os/000077500000000000000000000000001470204764400234575ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/archlinux/os/release.rb000066400000000000000000000011531470204764400254240ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Archlinux module Os class Release FACT_NAME = 'os.release' def call_the_resolver # Arch Linux is rolling release and has no version numbers # For historical reasons facter used the kernel version as OS version on Arch Linux kernelrelease = Facter::Resolvers::Uname.resolve(:kernelrelease) versions = kernelrelease.split('.') hash = { full: kernelrelease, major: versions[0], minor: versions[1] } Facter::ResolvedFact.new(FACT_NAME, hash) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/azurelinux/000077500000000000000000000000001470204764400232475ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/azurelinux/os/000077500000000000000000000000001470204764400236705ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/azurelinux/os/release.rb000066400000000000000000000022771470204764400256450ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Azurelinux module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver version = from_specific_file || from_os_release return Facter::ResolvedFact.new(FACT_NAME, nil) unless version [Facter::ResolvedFact.new(FACT_NAME, version), Facter::ResolvedFact.new(ALIASES.first, version['major'], :legacy), Facter::ResolvedFact.new(ALIASES.last, version['full'], :legacy)] end def from_specific_file version = Facter::Resolvers::SpecificReleaseFile.resolve(:release, { release_file: '/etc/azurelinux-release', regex: /AZURELINUX_BUILD_NUMBER=([0-9.]+)/ }) Facter::Util::Facts.release_hash_from_matchdata(version) end def from_os_release version = Facter::Resolvers::OsRelease.resolve(:version_id) Facter::Util::Facts.release_hash_from_string(version) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/bsd/000077500000000000000000000000001470204764400216115ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/bsd/kernelmajversion.rb000066400000000000000000000006201470204764400255120ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Bsd class Kernelmajversion FACT_NAME = 'kernelmajversion' def call_the_resolver full_version = Facter::Resolvers::Uname.resolve(:kernelrelease) versions_split = full_version.split('.') major_version = versions_split[0] Facter::ResolvedFact.new(FACT_NAME, major_version) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/bsd/kernelversion.rb000066400000000000000000000005111470204764400250210ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Bsd class Kernelversion FACT_NAME = 'kernelversion' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:kernelrelease).sub(/\A(\d+(\.\d+)*).*/, '\1') Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/bsd/load_averages.rb000066400000000000000000000004601470204764400247320ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Bsd class LoadAverages FACT_NAME = 'load_averages' def call_the_resolver fact_value = Facter::Resolvers::LoadAverages.resolve(:load_averages) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/bsd/os/000077500000000000000000000000001470204764400222325ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/bsd/os/family.rb000066400000000000000000000006301470204764400240370ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Bsd module Os class Family FACT_NAME = 'os.family' ALIASES = 'osfamily' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:kernelname) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/bsd/processors/000077500000000000000000000000001470204764400240135ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/bsd/processors/count.rb000066400000000000000000000006701470204764400254730ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Bsd module Processors class Count FACT_NAME = 'processors.count' ALIASES = 'processorcount' def call_the_resolver fact_value = Facter::Resolvers::Bsd::Processors.resolve(:logical_count) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/bsd/processors/models.rb000066400000000000000000000011231470204764400256200ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Bsd module Processors class Models FACT_NAME = 'processors.models' ALIASES = 'processor.*' def call_the_resolver fact_value = Facter::Resolvers::Bsd::Processors.resolve(:models) return nil unless fact_value facts = [Facter::ResolvedFact.new(FACT_NAME, fact_value)] fact_value.each_with_index do |value, index| facts.push(Facter::ResolvedFact.new("processor#{index}", value, :legacy)) end facts end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/bsd/processors/speed.rb000066400000000000000000000006471470204764400254470ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Bsd module Processors class Speed FACT_NAME = 'processors.speed' def call_the_resolver fact_value = Facter::Resolvers::Bsd::Processors.resolve(:speed) speed = Facter::Util::Facts::UnitConverter.hertz_to_human_readable(fact_value) Facter::ResolvedFact.new(FACT_NAME, speed) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/debian/000077500000000000000000000000001470204764400222635ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/debian/architecture.rb000066400000000000000000000010511470204764400252670ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Debian module Os class Architecture FACT_NAME = 'os.architecture' ALIASES = 'architecture' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:machine) fact_value = 'amd64' if fact_value == 'x86_64' fact_value = 'i386' if /i[3456]86|pentium/.match?(fact_value) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/debian/lsbdistcodename.rb000066400000000000000000000005201470204764400257450ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Debian class Lsbdistcodename FACT_NAME = 'lsbdistcodename' TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:codename) Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/debian/lsbdistdescription.rb000066400000000000000000000005311470204764400265170ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Debian class Lsbdistdescription FACT_NAME = 'lsbdistdescription' TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:description) Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/debian/lsbdistid.rb000066400000000000000000000005121470204764400245670ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Debian class Lsbdistid FACT_NAME = 'lsbdistid' TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:distributor_id) Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/debian/os/000077500000000000000000000000001470204764400227045ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/debian/os/distro/000077500000000000000000000000001470204764400242105ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/debian/os/distro/codename.rb000066400000000000000000000014351470204764400263130ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Debian module Os module Distro class Codename FACT_NAME = 'os.distro.codename' def call_the_resolver fact_value = Facter::Resolvers::OsRelease.resolve(:version_codename) fact_value ||= retrieve_from_version Facter::ResolvedFact.new(FACT_NAME, fact_value) end def retrieve_from_version version = Facter::Resolvers::OsRelease.resolve(:version) return unless version codename = /\(.*\)$/.match(version).to_s.gsub(/\(|\)/, '') return codename unless codename.empty? /[A-Za-z]+\s[A-Za-z]+/.match(version).to_s.split(' ').first.downcase end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/debian/os/distro/description.rb000066400000000000000000000006061470204764400270620ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Debian module Os module Distro class Description FACT_NAME = 'os.distro.description' def call_the_resolver fact_value = Facter::Resolvers::OsRelease.resolve(:pretty_name) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/debian/os/distro/id.rb000066400000000000000000000005661470204764400251400ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Debian module Os module Distro class Id FACT_NAME = 'os.distro.id' def call_the_resolver fact_value = Facter::Resolvers::OsRelease.resolve(:id).capitalize Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/debian/os/distro/release.rb000066400000000000000000000022701470204764400261560ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Debian module Os module Distro class Release FACT_NAME = 'os.distro.release' ALIASES = %w[lsbdistrelease lsbmajdistrelease lsbminordistrelease].freeze def call_the_resolver fact_value = determine_release_for_os return Facter::ResolvedFact.new(FACT_NAME, nil) unless fact_value [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES[0], fact_value['full'], :legacy), Facter::ResolvedFact.new(ALIASES[1], fact_value['major'], :legacy), Facter::ResolvedFact.new(ALIASES[2], fact_value['minor'], :legacy)] end private def determine_release_for_os release = Facter::Resolvers::DebianVersion.resolve(:version) return unless release versions = release.split('.') fact_value = {} fact_value['full'] = release fact_value['major'] = versions[0] fact_value['minor'] = versions[1].gsub(/^0([1-9])/, '\1') if versions[1] fact_value end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/debian/os/release.rb000066400000000000000000000020371470204764400246530ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Debian module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver fact_value = determine_release_for_os return Facter::ResolvedFact.new(FACT_NAME, fact_value) unless fact_value [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES.first, fact_value['major'], :legacy), Facter::ResolvedFact.new(ALIASES.last, fact_value['full'], :legacy)] end private def determine_release_for_os release = Facter::Resolvers::DebianVersion.resolve(:version) return unless release versions = release.split('.') fact_value = {} fact_value['full'] = release fact_value['major'] = versions[0] fact_value['minor'] = versions[1].gsub(/^0([1-9])/, '\1') if versions[1] fact_value end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/devuan/000077500000000000000000000000001470204764400223235ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/devuan/os/000077500000000000000000000000001470204764400227445ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/devuan/os/distro/000077500000000000000000000000001470204764400242505ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/devuan/os/distro/release.rb000066400000000000000000000021311470204764400262120ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Devuan module Os module Distro class Release FACT_NAME = 'os.distro.release' ALIASES = %w[lsbdistrelease lsbmajdistrelease lsbminordistrelease].freeze def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:release) return Facter::ResolvedFact.new(FACT_NAME, nil) unless fact_value release = construct_release(fact_value) [Facter::ResolvedFact.new(FACT_NAME, release), Facter::ResolvedFact.new(ALIASES[0], fact_value, :legacy), Facter::ResolvedFact.new(ALIASES[1], release['major'], :legacy), Facter::ResolvedFact.new(ALIASES[2], release['minor'], :legacy)] end def construct_release(version) versions = version.split('.') {}.tap do |release| release['full'] = version release['major'] = versions[0] release['minor'] = versions[1] if versions[1] end end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/devuan/os/release.rb000066400000000000000000000016201470204764400247100ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Devuan module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver version = determine_release_version return Facter::ResolvedFact.new(FACT_NAME, nil) unless version [Facter::ResolvedFact.new(FACT_NAME, version), Facter::ResolvedFact.new(ALIASES.first, version['major'], :legacy), Facter::ResolvedFact.new(ALIASES.last, version['full'], :legacy)] end def determine_release_version version = Facter::Resolvers::SpecificReleaseFile.resolve(:release, release_file: '/etc/devuan_version') version ||= Facter::Resolvers::OsRelease.resolve(:version_id) Facter::Util::Facts.release_hash_from_string(version) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/000077500000000000000000000000001470204764400224535ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/augeas/000077500000000000000000000000001470204764400237205ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/augeas/version.rb000066400000000000000000000006731470204764400257400ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Augeas class Version FACT_NAME = 'augeas.version' ALIASES = 'augeasversion' def call_the_resolver fact_value = Facter::Resolvers::Augeas.resolve(:augeas_version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/disks.rb000066400000000000000000000004251470204764400241160ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class Disks FACT_NAME = 'disks' def call_the_resolver disks = Facter::Resolvers::Freebsd::Geom.resolve(:disks) Facter::ResolvedFact.new(FACT_NAME, disks) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/dmi/000077500000000000000000000000001470204764400232245ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/dmi/bios/000077500000000000000000000000001470204764400241605ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/dmi/bios/release_date.rb000066400000000000000000000007541470204764400271300ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Dmi module Bios class ReleaseDate FACT_NAME = 'dmi.bios.release_date' ALIASES = 'bios_release_date' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::DmiBios.resolve(:bios_date) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/dmi/bios/vendor.rb000066400000000000000000000007351470204764400260070ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Dmi module Bios class Vendor FACT_NAME = 'dmi.bios.vendor' ALIASES = 'bios_vendor' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::DmiBios.resolve(:bios_vendor) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/dmi/bios/version.rb000066400000000000000000000007411470204764400261740ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Dmi module Bios class Version FACT_NAME = 'dmi.bios.version' ALIASES = 'bios_version' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::DmiBios.resolve(:bios_version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/dmi/manufacturer.rb000066400000000000000000000006701470204764400262500ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Dmi class Manufacturer FACT_NAME = 'dmi.manufacturer' ALIASES = 'manufacturer' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::DmiBios.resolve(:sys_vendor) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/dmi/product/000077500000000000000000000000001470204764400247045ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/dmi/product/name.rb000066400000000000000000000007401470204764400261520ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Dmi module Product class Name FACT_NAME = 'dmi.product.name' ALIASES = 'productname' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::DmiBios.resolve(:product_name) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/dmi/product/serial_number.rb000066400000000000000000000007641470204764400300670ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Dmi module Product class SerialNumber FACT_NAME = 'dmi.product.serial_number' ALIASES = 'serialnumber' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::DmiBios.resolve(:product_serial) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/dmi/product/uuid.rb000066400000000000000000000007311470204764400262000ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Dmi module Product class Uuid FACT_NAME = 'dmi.product.uuid' ALIASES = 'uuid' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::DmiBios.resolve(:product_uuid) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/ec2_metadata.rb000066400000000000000000000010241470204764400253060ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class Ec2Metadata FACT_NAME = 'ec2_metadata' def call_the_resolver return Facter::ResolvedFact.new(FACT_NAME, nil) unless aws_hypervisors? fact_value = Facter::Resolvers::Ec2.resolve(:metadata) Facter::ResolvedFact.new(FACT_NAME, fact_value&.empty? ? nil : fact_value) end private def aws_hypervisors? Facter::Util::Facts::Posix::VirtualDetector.platform =~ /kvm|xen|aws/ end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/ec2_userdata.rb000066400000000000000000000010241470204764400253360ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class Ec2Userdata FACT_NAME = 'ec2_userdata' def call_the_resolver return Facter::ResolvedFact.new(FACT_NAME, nil) unless aws_hypervisors? fact_value = Facter::Resolvers::Ec2.resolve(:userdata) Facter::ResolvedFact.new(FACT_NAME, fact_value&.empty? ? nil : fact_value) end private def aws_hypervisors? Facter::Util::Facts::Posix::VirtualDetector.platform =~ /kvm|xen|aws/ end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/facterversion.rb000066400000000000000000000004661470204764400256600ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class Facterversion FACT_NAME = 'facterversion' def call_the_resolver fact_value = Facter::Resolvers::Facterversion.resolve(:facterversion) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/identity/000077500000000000000000000000001470204764400243045ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/identity/gid.rb000066400000000000000000000005121470204764400253720ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Identity class Gid FACT_NAME = 'identity.gid' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:gid) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/identity/group.rb000066400000000000000000000006431470204764400257700ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Identity class Group FACT_NAME = 'identity.group' ALIASES = 'gid' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:group) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/identity/privileged.rb000066400000000000000000000005371470204764400267700ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Identity class Privileged FACT_NAME = 'identity.privileged' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:privileged) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/identity/uid.rb000066400000000000000000000005121470204764400254100ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Identity class Uid FACT_NAME = 'identity.uid' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:uid) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/identity/user.rb000066400000000000000000000006361470204764400256140ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Identity class User FACT_NAME = 'identity.user' ALIASES = 'id' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:user) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/ipaddress6_interfaces.rb000066400000000000000000000007361470204764400272550ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class Ipaddress6Interfaces FACT_NAME = 'ipaddress6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("ipaddress6_#{interface_name}", info[:ip6], :legacy) if info[:ip6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/ipaddress_interfaces.rb000066400000000000000000000007311470204764400271620ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class IpaddressInterfaces FACT_NAME = 'ipaddress_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("ipaddress_#{interface_name}", info[:ip], :legacy) if info[:ip] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/is_virtual.rb000066400000000000000000000007051470204764400251630ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class IsVirtual FACT_NAME = 'is_virtual' def call_the_resolver fact_value = Facter::Util::Facts::Posix::VirtualDetector.platform Facter::ResolvedFact.new(FACT_NAME, check_if_virtual(fact_value)) end private def check_if_virtual(found_vm) Facter::Util::Facts::PHYSICAL_HYPERVISORS.count(found_vm).zero? end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/kernel.rb000066400000000000000000000004351470204764400242620ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class Kernel FACT_NAME = 'kernel' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:kernelname) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/kernelrelease.rb000066400000000000000000000004561470204764400256260ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class Kernelrelease FACT_NAME = 'kernelrelease' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:kernelrelease) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/memory/000077500000000000000000000000001470204764400237635ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/memory/swap/000077500000000000000000000000001470204764400247355ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/memory/swap/available.rb000066400000000000000000000011161470204764400272010ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Memory module Swap class Available FACT_NAME = 'memory.swap.available' ALIASES = 'swapfree' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::SwapMemory.resolve(:available_bytes) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/memory/swap/available_bytes.rb000066400000000000000000000010701470204764400304060ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Memory module Swap class AvailableBytes FACT_NAME = 'memory.swap.available_bytes' ALIASES = 'swapfree_mb' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::SwapMemory.resolve(:available_bytes) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/memory/swap/capacity.rb000066400000000000000000000006131470204764400270570ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Memory module Swap class Capacity FACT_NAME = 'memory.swap.capacity' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::SwapMemory.resolve(:capacity) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/memory/swap/encrypted.rb000066400000000000000000000007541470204764400272650ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Memory module Swap class Encrypted FACT_NAME = 'memory.swap.encrypted' ALIASES = 'swapencrypted' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::SwapMemory.resolve(:encrypted) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/memory/swap/total.rb000066400000000000000000000011021470204764400263770ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Memory module Swap class Total FACT_NAME = 'memory.swap.total' ALIASES = 'swapsize' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::SwapMemory.resolve(:total_bytes) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/memory/swap/total_bytes.rb000066400000000000000000000010541470204764400276130ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Memory module Swap class TotalBytes FACT_NAME = 'memory.swap.total_bytes' ALIASES = 'swapsize_mb' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::SwapMemory.resolve(:total_bytes) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/memory/swap/used.rb000066400000000000000000000007461470204764400262310ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Memory module Swap class Used FACT_NAME = 'memory.swap.used' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::SwapMemory.resolve(:used_bytes) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/memory/swap/used_bytes.rb000066400000000000000000000006201470204764400274260ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Memory module Swap class UsedBytes FACT_NAME = 'memory.swap.used_bytes' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::SwapMemory.resolve(:used_bytes) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/memory/system/000077500000000000000000000000001470204764400253075ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/memory/system/available.rb000066400000000000000000000011261470204764400275540ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Memory module System class Available FACT_NAME = 'memory.system.available' ALIASES = 'memoryfree' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::SystemMemory.resolve(:available_bytes) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/memory/system/available_bytes.rb000066400000000000000000000011001470204764400307520ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Memory module System class AvailableBytes FACT_NAME = 'memory.system.available_bytes' ALIASES = 'memoryfree_mb' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::SystemMemory.resolve(:available_bytes) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/memory/system/capacity.rb000066400000000000000000000006211470204764400274300ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Memory module System class Capacity FACT_NAME = 'memory.system.capacity' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::SystemMemory.resolve(:capacity) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/memory/system/total.rb000066400000000000000000000011121470204764400267520ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Memory module System class Total FACT_NAME = 'memory.system.total' ALIASES = 'memorysize' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::SystemMemory.resolve(:total_bytes) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/memory/system/total_bytes.rb000066400000000000000000000010641470204764400301660ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Memory module System class TotalBytes FACT_NAME = 'memory.system.total_bytes' ALIASES = 'memorysize_mb' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::SystemMemory.resolve(:total_bytes) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/memory/system/used.rb000066400000000000000000000007541470204764400266020ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Memory module System class Used FACT_NAME = 'memory.system.used' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::SystemMemory.resolve(:used_bytes) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/memory/system/used_bytes.rb000066400000000000000000000006261470204764400300060ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Memory module System class UsedBytes FACT_NAME = 'memory.system.used_bytes' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::SystemMemory.resolve(:used_bytes) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/mountpoints.rb000066400000000000000000000007741470204764400254070ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class Mountpoints FACT_NAME = 'mountpoints' def call_the_resolver mountpoints = Facter::Resolvers::Mountpoints.resolve(FACT_NAME.to_sym) return Facter::ResolvedFact.new(FACT_NAME, nil) unless mountpoints fact = {} mountpoints.each do |mnt| fact[mnt[:path].to_sym] = mnt.reject { |k| k == :path } end Facter::ResolvedFact.new(FACT_NAME, fact) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/netmask6_interfaces.rb000066400000000000000000000007421470204764400267360ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class Netmask6Interfaces FACT_NAME = 'netmask6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("netmask6_#{interface_name}", info[:netmask6], :legacy) if info[:netmask6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/netmask_interfaces.rb000066400000000000000000000007351470204764400266520ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class NetmaskInterfaces FACT_NAME = 'netmask_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("netmask_#{interface_name}", info[:netmask], :legacy) if info[:netmask] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/network6_interfaces.rb000066400000000000000000000007421470204764400267650ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class Network6Interfaces FACT_NAME = 'network6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("network6_#{interface_name}", info[:network6], :legacy) if info[:network6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/network_interfaces.rb000066400000000000000000000007351470204764400267010ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class NetworkInterfaces FACT_NAME = 'network_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("network_#{interface_name}", info[:network], :legacy) if info[:network] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/networking/000077500000000000000000000000001470204764400246425ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/networking/dhcp.rb000066400000000000000000000005201470204764400261020ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Networking class Dhcp FACT_NAME = 'networking.dhcp' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:dhcp) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/networking/domain.rb000066400000000000000000000006511470204764400264400ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Networking class Domain FACT_NAME = 'networking.domain' ALIASES = 'domain' def call_the_resolver fact_value = Facter::Resolvers::Hostname.resolve(:domain) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/networking/fqdn.rb000066400000000000000000000006411470204764400261200ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Networking class Fqdn FACT_NAME = 'networking.fqdn' ALIASES = 'fqdn' def call_the_resolver fact_value = Facter::Resolvers::Hostname.resolve(:fqdn) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/networking/hostname.rb000066400000000000000000000006611470204764400270100ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Networking class Hostname FACT_NAME = 'networking.hostname' ALIASES = 'hostname' def call_the_resolver fact_value = Facter::Resolvers::Hostname.resolve(:hostname) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/networking/interfaces.rb000066400000000000000000000005421470204764400273130ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Networking class Interfaces FACT_NAME = 'networking.interfaces' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:interfaces) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/networking/ip.rb000066400000000000000000000006421470204764400256010ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Networking class Ip FACT_NAME = 'networking.ip' ALIASES = 'ipaddress' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:ip) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/networking/ip6.rb000066400000000000000000000006461470204764400256730ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Networking class Ip6 FACT_NAME = 'networking.ip6' ALIASES = 'ipaddress6' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:ip6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/networking/mac.rb000066400000000000000000000006461470204764400257350ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Networking class Mac FACT_NAME = 'networking.mac' ALIASES = 'macaddress' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:mac) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/networking/mtu.rb000066400000000000000000000005151470204764400257750ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Networking class Mtu FACT_NAME = 'networking.mtu' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:mtu) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/networking/netmask.rb000066400000000000000000000006571470204764400266410ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Networking class Netmask FACT_NAME = 'networking.netmask' ALIASES = 'netmask' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:netmask) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/networking/netmask6.rb000066400000000000000000000006631470204764400267240ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Networking class Netmask6 FACT_NAME = 'networking.netmask6' ALIASES = 'netmask6' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:netmask6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/networking/network.rb000066400000000000000000000006571470204764400266700ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Networking class Network FACT_NAME = 'networking.network' ALIASES = 'network' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:network) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/networking/network6.rb000066400000000000000000000006631470204764400267530ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Networking class Network6 FACT_NAME = 'networking.network6' ALIASES = 'network6' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:network6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/networking/primary.rb000066400000000000000000000005431470204764400266540ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Networking class Primary FACT_NAME = 'networking.primary' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:primary_interface) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/networking/scope6.rb000066400000000000000000000005261470204764400263710ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Networking class Scope6 FACT_NAME = 'networking.scope6' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:scope6) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/os/000077500000000000000000000000001470204764400230745ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/os/architecture.rb000066400000000000000000000006511470204764400261050ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Os class Architecture FACT_NAME = 'os.architecture' ALIASES = 'architecture' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:machine) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/os/hardware.rb000066400000000000000000000006421470204764400252200ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Os class Hardware FACT_NAME = 'os.hardware' ALIASES = 'hardwaremodel' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:machine) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/os/name.rb000066400000000000000000000006371470204764400243470ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Os class Name FACT_NAME = 'os.name' ALIASES = 'operatingsystem' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:kernelname) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/os/release.rb000066400000000000000000000024371470204764400250470ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver installed_userland = Facter::Resolvers::Freebsd::FreebsdVersion.resolve(:installed_userland) return Facter::ResolvedFact.new(FACT_NAME, nil) if !installed_userland || installed_userland.empty? value = build_release_hash_from_version(installed_userland) [Facter::ResolvedFact.new(FACT_NAME, value), Facter::ResolvedFact.new(ALIASES.first, value[:major], :legacy), Facter::ResolvedFact.new(ALIASES.last, installed_userland, :legacy)] end private def build_release_hash_from_version(version_string) version, branch_value = version_string.split('-', 2) major_value, minor_value = version.split('.') patchlevel_value = branch_value.split('-p')[1] value = { full: version_string, major: major_value, branch: branch_value } value[:minor] = minor_value if minor_value value[:patchlevel] = patchlevel_value if patchlevel_value value end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/partitions.rb000066400000000000000000000004561470204764400252010ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class Partitions FACT_NAME = 'partitions' def call_the_resolver partitions = Facter::Resolvers::Freebsd::Geom.resolve(:partitions) Facter::ResolvedFact.new(FACT_NAME, partitions) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/path.rb000066400000000000000000000004231470204764400237330ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class Path FACT_NAME = 'path' def call_the_resolver fact_value = Facter::Resolvers::Path.resolve(:path) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/processors/000077500000000000000000000000001470204764400246555ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/processors/count.rb000066400000000000000000000007001470204764400263270ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Processors class Count FACT_NAME = 'processors.count' ALIASES = 'processorcount' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::Processors.resolve(:logical_count) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/processors/isa.rb000066400000000000000000000006471470204764400257650ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Processors class Isa FACT_NAME = 'processors.isa' ALIASES = 'hardwareisa' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:processor) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/processors/models.rb000066400000000000000000000011331470204764400264630ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Processors class Models FACT_NAME = 'processors.models' ALIASES = 'processor.*' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::Processors.resolve(:models) return nil unless fact_value facts = [Facter::ResolvedFact.new(FACT_NAME, fact_value)] fact_value.each_with_index do |value, index| facts.push(Facter::ResolvedFact.new("processor#{index}", value, :legacy)) end facts end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/processors/speed.rb000066400000000000000000000006571470204764400263120ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Processors class Speed FACT_NAME = 'processors.speed' def call_the_resolver fact_value = Facter::Resolvers::Freebsd::Processors.resolve(:speed) speed = Facter::Util::Facts::UnitConverter.hertz_to_human_readable(fact_value) Facter::ResolvedFact.new(FACT_NAME, speed) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/ruby/000077500000000000000000000000001470204764400234345ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/ruby/platform.rb000066400000000000000000000006451470204764400256120ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Ruby class Platform FACT_NAME = 'ruby.platform' ALIASES = 'rubyplatform' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:platform) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/ruby/sitedir.rb000066400000000000000000000006411470204764400254250ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Ruby class Sitedir FACT_NAME = 'ruby.sitedir' ALIASES = 'rubysitedir' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:sitedir) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/ruby/version.rb000066400000000000000000000006411470204764400254470ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module Ruby class Version FACT_NAME = 'ruby.version' ALIASES = 'rubyversion' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/ssh.rb000066400000000000000000000011721470204764400235760ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class Ssh FACT_NAME = 'ssh' def call_the_resolver result = Facter::Resolvers::Ssh.resolve(:ssh) ssh_facts = {} result.each { |ssh| ssh_facts.merge!(create_ssh_fact(ssh)) } Facter::ResolvedFact.new(FACT_NAME, ssh_facts) end private def create_ssh_fact(ssh) { ssh.name.to_sym => { fingerprints: { sha1: ssh.fingerprint.sha1, sha256: ssh.fingerprint.sha256 }, key: ssh.key, type: ssh.type } } end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/sshalgorithmkey.rb000066400000000000000000000006071470204764400262200ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class Sshalgorithmkey FACT_NAME = 'ssh.*key' TYPE = :legacy def call_the_resolver facts = [] result = Facter::Resolvers::Ssh.resolve(:ssh) result.each { |ssh| facts << Facter::ResolvedFact.new("ssh#{ssh.name.to_sym}key", ssh.key, :legacy) } facts end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/sshfp_algorithm.rb000066400000000000000000000007641470204764400262000ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class SshfpAlgorithm FACT_NAME = 'sshfp_.*' TYPE = :legacy def call_the_resolver facts = [] result = Facter::Resolvers::Ssh.resolve(:ssh) result.each do |ssh| facts << Facter::ResolvedFact.new("sshfp_#{ssh.name.to_sym}", "#{ssh.fingerprint.sha1}\n#{ssh.fingerprint.sha256}", :legacy) end facts end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/system_uptime/000077500000000000000000000000001470204764400253625ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/system_uptime/days.rb000066400000000000000000000006531470204764400266530ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module SystemUptime class Days FACT_NAME = 'system_uptime.days' ALIASES = 'uptime_days' def call_the_resolver fact_value = Facter::Resolvers::Uptime.resolve(:days) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/system_uptime/hours.rb000066400000000000000000000006571470204764400270570ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module SystemUptime class Hours FACT_NAME = 'system_uptime.hours' ALIASES = 'uptime_hours' def call_the_resolver fact_value = Facter::Resolvers::Uptime.resolve(:hours) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/system_uptime/seconds.rb000066400000000000000000000006671470204764400273560ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module SystemUptime class Seconds FACT_NAME = 'system_uptime.seconds' ALIASES = 'uptime_seconds' def call_the_resolver fact_value = Facter::Resolvers::Uptime.resolve(:seconds) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/system_uptime/uptime.rb000066400000000000000000000006541470204764400272170ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd module SystemUptime class Uptime FACT_NAME = 'system_uptime.uptime' ALIASES = 'uptime' def call_the_resolver fact_value = Facter::Resolvers::Uptime.resolve(:uptime) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/timezone.rb000066400000000000000000000004431470204764400246330ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class Timezone FACT_NAME = 'timezone' def call_the_resolver fact_value = Facter::Resolvers::Timezone.resolve(:timezone) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/virtual.rb000066400000000000000000000007161470204764400244720ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class Virtual FACT_NAME = 'virtual' def initialize @log = Facter::Log.new(self) end def call_the_resolver @log.debug('FreeBSD Virtual Resolver') fact_value = Facter::Util::Facts::Posix::VirtualDetector.platform @log.debug("Fact value is: #{fact_value}") Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/zfs_featurenumbers.rb000066400000000000000000000004721470204764400267140ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class ZfsFeaturenumbers FACT_NAME = 'zfs_featurenumbers' def call_the_resolver fact_value = Facter::Resolvers::ZFS.resolve(:zfs_featurenumbers) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/zfs_version.rb000066400000000000000000000004451470204764400253520ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class ZfsVersion FACT_NAME = 'zfs_version' def call_the_resolver fact_value = Facter::Resolvers::ZFS.resolve(:zfs_version) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/zpool_featureflags.rb000066400000000000000000000004741470204764400267000ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class ZpoolFeatureflags FACT_NAME = 'zpool_featureflags' def call_the_resolver fact_value = Facter::Resolvers::Zpool.resolve(:zpool_featureflags) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/zpool_featurenumbers.rb000066400000000000000000000005021470204764400272470ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class ZpoolFeaturenumbers FACT_NAME = 'zpool_featurenumbers' def call_the_resolver fact_value = Facter::Resolvers::Zpool.resolve(:zpool_featurenumbers) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/freebsd/zpool_version.rb000066400000000000000000000004551470204764400257140ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Freebsd class ZpoolVersion FACT_NAME = 'zpool_version' def call_the_resolver fact_value = Facter::Resolvers::Zpool.resolve(:zpool_version) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/gentoo/000077500000000000000000000000001470204764400223345ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/gentoo/os/000077500000000000000000000000001470204764400227555ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/gentoo/os/release.rb000066400000000000000000000016211470204764400247220ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Gentoo module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver version = determine_release_version return Facter::ResolvedFact.new(FACT_NAME, nil) unless version [Facter::ResolvedFact.new(FACT_NAME, version), Facter::ResolvedFact.new(ALIASES.first, version['major'], :legacy), Facter::ResolvedFact.new(ALIASES.last, version['full'], :legacy)] end def determine_release_version version = Facter::Resolvers::ReleaseFromFirstLine.resolve(:release, release_file: '/etc/gentoo-release') version ||= Facter::Resolvers::OsRelease.resolve(:version_id) Facter::Util::Facts.release_hash_from_string(version) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/000077500000000000000000000000001470204764400222005ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linux/aio_agent_version.rb000066400000000000000000000005001470204764400262130ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class AioAgentVersion FACT_NAME = 'aio_agent_version' def call_the_resolver fact_value = Facter::Resolvers::AioAgentVersion.resolve(:aio_agent_version) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/augeas/000077500000000000000000000000001470204764400234455ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linux/augeas/version.rb000066400000000000000000000006711470204764400254630ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Augeas class Version FACT_NAME = 'augeas.version' ALIASES = 'augeasversion' def call_the_resolver fact_value = Facter::Resolvers::Augeas.resolve(:augeas_version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/az_metadata.rb000066400000000000000000000010141470204764400247730ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class AzMetadata FACT_NAME = 'az_metadata' def call_the_resolver return Facter::ResolvedFact.new(FACT_NAME, nil) unless azure_hypervisor? fact_value = Facter::Resolvers::Az.resolve(:metadata) Facter::ResolvedFact.new(FACT_NAME, fact_value&.empty? ? nil : fact_value) end private def azure_hypervisor? Facter::Util::Facts::Posix::VirtualDetector.platform == 'hyperv' end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/cloud/000077500000000000000000000000001470204764400233065ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linux/cloud/provider.rb000066400000000000000000000016141470204764400254670ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Cloud class Provider FACT_NAME = 'cloud.provider' def call_the_resolver provider = case Facter::Util::Facts::Posix::VirtualDetector.platform when 'hyperv' metadata = Facter::Resolvers::Az.resolve(:metadata) 'azure' unless metadata.nil? || metadata.empty? when 'kvm', 'xen' metadata = Facter::Resolvers::Ec2.resolve(:metadata) 'aws' unless metadata.nil? || metadata.empty? when 'gce' metadata = Facter::Resolvers::Gce.resolve(:metadata) 'gce' unless metadata.nil? || metadata.empty? end Facter::ResolvedFact.new(FACT_NAME, provider) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/dhcp_servers.rb000066400000000000000000000014251470204764400252160ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class DhcpServers FACT_NAME = 'dhcp_servers' TYPE = :legacy def call_the_resolver fact_value = construct_addresses_hash fact_value = !fact_value || fact_value.empty? ? nil : fact_value Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy) end private def construct_addresses_hash primary_dhcp = Facter::Resolvers::Linux::Networking.resolve(:dhcp) interfaces = Facter::Resolvers::Linux::Networking.resolve(:interfaces) return unless interfaces servers = { system: primary_dhcp } interfaces&.each { |interface_name, info| servers[interface_name] = info[:dhcp] if info[:dhcp] } servers end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/disks.rb000066400000000000000000000021561470204764400236460ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Disks FACT_NAME = 'disks' ALIASES = %w[blockdevices blockdevice_.*_model blockdevice_.*_size blockdevice_.*_vendor].freeze def call_the_resolver facts = [] disks = Facter::Resolvers::Linux::Disks.resolve(:disks) return Facter::ResolvedFact.new(FACT_NAME, nil) if disks.nil? || disks.empty? blockdevices = disks.keys.join(',') facts.push(Facter::ResolvedFact.new(FACT_NAME, disks)) facts.push(Facter::ResolvedFact.new('blockdevices', blockdevices, :legacy)) add_legacy_facts(disks, facts) facts end private def add_legacy_facts(disks, facts) disks.each do |disk_name, disk_info| facts.push(Facter::ResolvedFact.new("blockdevice_#{disk_name}_model", disk_info[:model], :legacy)) facts.push(Facter::ResolvedFact.new("blockdevice_#{disk_name}_size", disk_info[:size_bytes], :legacy)) facts.push(Facter::ResolvedFact.new("blockdevice_#{disk_name}_vendor", disk_info[:vendor], :legacy)) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/dmi/000077500000000000000000000000001470204764400227515ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linux/dmi/bios/000077500000000000000000000000001470204764400237055ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linux/dmi/bios/release_date.rb000066400000000000000000000007501470204764400266510ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Dmi module Bios class ReleaseDate FACT_NAME = 'dmi.bios.release_date' ALIASES = 'bios_release_date' def call_the_resolver fact_value = Facter::Resolvers::Linux::DmiBios.resolve(:bios_date) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/dmi/bios/vendor.rb000066400000000000000000000007311470204764400255300ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Dmi module Bios class Vendor FACT_NAME = 'dmi.bios.vendor' ALIASES = 'bios_vendor' def call_the_resolver fact_value = Facter::Resolvers::Linux::DmiBios.resolve(:bios_vendor) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/dmi/bios/version.rb000066400000000000000000000007351470204764400257240ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Dmi module Bios class Version FACT_NAME = 'dmi.bios.version' ALIASES = 'bios_version' def call_the_resolver fact_value = Facter::Resolvers::Linux::DmiBios.resolve(:bios_version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/dmi/board/000077500000000000000000000000001470204764400240405ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linux/dmi/board/asset_tag.rb000066400000000000000000000007461470204764400263460ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Dmi module Board class AssetTag FACT_NAME = 'dmi.board.asset_tag' ALIASES = 'boardassettag' def call_the_resolver fact_value = Facter::Resolvers::Linux::DmiBios.resolve(:board_asset_tag) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/dmi/board/manufacturer.rb000066400000000000000000000007561470204764400270710ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Dmi module Board class Manufacturer FACT_NAME = 'dmi.board.manufacturer' ALIASES = 'boardmanufacturer' def call_the_resolver fact_value = Facter::Resolvers::Linux::DmiBios.resolve(:board_vendor) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/dmi/board/product.rb000066400000000000000000000007411470204764400260470ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Dmi module Board class Product FACT_NAME = 'dmi.board.product' ALIASES = 'boardproductname' def call_the_resolver fact_value = Facter::Resolvers::Linux::DmiBios.resolve(:board_name) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/dmi/board/serial_number.rb000066400000000000000000000007571470204764400272250ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Dmi module Board class SerialNumber FACT_NAME = 'dmi.board.serial_number' ALIASES = 'boardserialnumber' def call_the_resolver fact_value = Facter::Resolvers::Linux::DmiBios.resolve(:board_serial) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/dmi/chassis/000077500000000000000000000000001470204764400244065ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linux/dmi/chassis/asset_tag.rb000066400000000000000000000007561470204764400267150ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Dmi module Chassis class AssetTag FACT_NAME = 'dmi.chassis.asset_tag' ALIASES = 'chassisassettag' def call_the_resolver fact_value = Facter::Resolvers::Linux::DmiBios.resolve(:chassis_asset_tag) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/dmi/chassis/type.rb000066400000000000000000000007341470204764400257200ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Dmi module Chassis class Type FACT_NAME = 'dmi.chassis.type' ALIASES = 'chassistype' def call_the_resolver fact_value = Facter::Resolvers::Linux::DmiBios.resolve(:chassis_type) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/dmi/manufacturer.rb000066400000000000000000000006641470204764400260000ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Dmi class Manufacturer FACT_NAME = 'dmi.manufacturer' ALIASES = 'manufacturer' def call_the_resolver fact_value = Facter::Resolvers::Linux::DmiBios.resolve(:sys_vendor) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/dmi/product/000077500000000000000000000000001470204764400244315ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linux/dmi/product/name.rb000066400000000000000000000007341470204764400257020ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Dmi module Product class Name FACT_NAME = 'dmi.product.name' ALIASES = 'productname' def call_the_resolver fact_value = Facter::Resolvers::Linux::DmiBios.resolve(:product_name) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/dmi/product/serial_number.rb000066400000000000000000000007601470204764400276100ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Dmi module Product class SerialNumber FACT_NAME = 'dmi.product.serial_number' ALIASES = 'serialnumber' def call_the_resolver fact_value = Facter::Resolvers::Linux::DmiBios.resolve(:product_serial) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/dmi/product/uuid.rb000066400000000000000000000007251470204764400257300ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Dmi module Product class Uuid FACT_NAME = 'dmi.product.uuid' ALIASES = 'uuid' def call_the_resolver fact_value = Facter::Resolvers::Linux::DmiBios.resolve(:product_uuid) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/dmi/product/version.rb000066400000000000000000000007501470204764400264450ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Dmi module Product class Version FACT_NAME = 'dmi.product.version' ALIASES = 'productversion' def call_the_resolver fact_value = Facter::Resolvers::Linux::DmiBios.resolve(:product_version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/ec2_metadata.rb000066400000000000000000000010221470204764400250310ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Ec2Metadata FACT_NAME = 'ec2_metadata' def call_the_resolver return Facter::ResolvedFact.new(FACT_NAME, nil) unless aws_hypervisors? fact_value = Facter::Resolvers::Ec2.resolve(:metadata) Facter::ResolvedFact.new(FACT_NAME, fact_value&.empty? ? nil : fact_value) end private def aws_hypervisors? Facter::Util::Facts::Posix::VirtualDetector.platform =~ /kvm|xen|aws/ end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/ec2_userdata.rb000066400000000000000000000010221470204764400250610ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Ec2Userdata FACT_NAME = 'ec2_userdata' def call_the_resolver return Facter::ResolvedFact.new(FACT_NAME, nil) unless aws_hypervisors? fact_value = Facter::Resolvers::Ec2.resolve(:userdata) Facter::ResolvedFact.new(FACT_NAME, fact_value&.empty? ? nil : fact_value) end private def aws_hypervisors? Facter::Util::Facts::Posix::VirtualDetector.platform =~ /kvm|xen|aws/ end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/facterversion.rb000066400000000000000000000004651470204764400254040ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Facterversion FACT_NAME = 'facterversion' def call_the_resolver fact_value = Facter::Resolvers::Facterversion.resolve(:facterversion) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/filesystems.rb000066400000000000000000000004571470204764400251020ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Filesystems FACT_NAME = 'filesystems' def call_the_resolver fact_value = Facter::Resolvers::Linux::Filesystems.resolve(:systems) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/fips_enabled.rb000066400000000000000000000004651470204764400251450ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class FipsEnabled FACT_NAME = 'fips_enabled' def call_the_resolver fact_value = Facter::Resolvers::Linux::FipsEnabled.resolve(:fips_enabled) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/gce.rb000066400000000000000000000006101470204764400232600ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Gce FACT_NAME = 'gce' def call_the_resolver bios_vendor = Facter::Resolvers::Linux::DmiBios.resolve(:bios_vendor) fact_value = bios_vendor&.include?('Google') ? Facter::Resolvers::Gce.resolve(:metadata) : nil Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/hypervisors/000077500000000000000000000000001470204764400245755ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linux/hypervisors/docker.rb000066400000000000000000000006751470204764400264010ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Hypervisors class Docker FACT_NAME = 'hypervisors.docker' def call_the_resolver fact_value = check_docker Facter::ResolvedFact.new(FACT_NAME, fact_value) end def check_docker info = Facter::Resolvers::Containers.resolve(:hypervisor) info[:docker] if info end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/hypervisors/hyper_v.rb000066400000000000000000000011451470204764400265770ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Hypervisors class HyperV FACT_NAME = 'hypervisors.hyperv' def call_the_resolver fact_value = check_hyper_v Facter::ResolvedFact.new(FACT_NAME, fact_value) end def check_hyper_v manufacturer = Facter::Resolvers::Linux::DmiBios.resolve(:sys_vendor) product_name = Facter::Resolvers::Linux::DmiBios.resolve(:product_name) return {} if manufacturer =~ /Microsoft/ || product_name == 'Virtual Machine' nil end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/hypervisors/kvm.rb000066400000000000000000000035261470204764400257250ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Hypervisors class Kvm FACT_NAME = 'hypervisors.kvm' def initialize @log = Facter::Log.new(self) end def call_the_resolver hypervisor = discover_hypervisor @log.debug("Detected hypervisor #{hypervisor}") return Facter::ResolvedFact.new(FACT_NAME, nil) if %w[virtualbox parallels].include?(hypervisor) fact_value = discover_provider if kvm? Facter::ResolvedFact.new(FACT_NAME, fact_value) end private def discover_hypervisor product_name = Facter::Resolvers::Linux::DmiBios.resolve(:product_name) @log.debug("Detected product name: #{product_name}") return unless product_name Facter::Util::Facts::HYPERVISORS_HASH.each { |key, value| return value if product_name.include?(key) } product_name end def kvm? product_name = discover_hypervisor bios_vendor = Facter::Resolvers::Linux::DmiBios.resolve(:bios_vendor) @log.debug("Detected bios vendor: #{bios_vendor}") Facter::Resolvers::VirtWhat.resolve(:vm) == 'kvm' || Facter::Resolvers::Lspci.resolve(:vm) == 'kvm' || bios_vendor&.include?('Amazon EC2') || bios_vendor&.include?('Google') || product_name&.include?('OpenStack') end def discover_provider manufacturer = Facter::Resolvers::Linux::DmiBios.resolve(:sys_vendor) @log.debug("Detected manufacturer: #{manufacturer}") return { google: true } if manufacturer == 'Google' return { openstack: true } if /^OpenStack/.match?(manufacturer) return { amazon: true } if /^Amazon/.match?(manufacturer) {} end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/hypervisors/lxc.rb000066400000000000000000000006561470204764400257170ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Hypervisors class Lxc FACT_NAME = 'hypervisors.lxc' def call_the_resolver fact_value = check_lxc Facter::ResolvedFact.new(FACT_NAME, fact_value) end def check_lxc info = Facter::Resolvers::Containers.resolve(:hypervisor) info[:lxc] if info end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/hypervisors/openvz.rb000066400000000000000000000010401470204764400264360ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Hypervisors class Openvz FACT_NAME = 'hypervisors.openvz' def call_the_resolver fact_value = check_openvz Facter::ResolvedFact.new(FACT_NAME, fact_value) end def check_openvz openvz = Facter::Resolvers::OpenVz.resolve(:vm) return unless openvz id = Facter::Resolvers::OpenVz.resolve(:id) { id: id.to_i, host: openvz == 'openvzhn' } end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/hypervisors/systemd_nspawn.rb000066400000000000000000000007241470204764400302030ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Hypervisors class SystemdNspawn FACT_NAME = 'hypervisors.systemd_nspawn' def call_the_resolver fact_value = check_nspawn Facter::ResolvedFact.new(FACT_NAME, fact_value) end def check_nspawn info = Facter::Resolvers::Containers.resolve(:hypervisor) info[:systemd_nspawn] if info end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/hypervisors/virtualbox.rb000066400000000000000000000017461470204764400273310ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Hypervisors class VirtualBox FACT_NAME = 'hypervisors.virtualbox' def call_the_resolver fact_value = check_virtualbox Facter::ResolvedFact.new(FACT_NAME, fact_value) end def check_virtualbox virtualbox_details = nil if Facter::Resolvers::Linux::DmiBios.resolve(:product_name) == 'VirtualBox' || Facter::Resolvers::VirtWhat.resolve(:vm) =~ /virtualbox/ || Facter::Resolvers::Lspci.resolve(:vm) == 'virtualbox' virtualbox_details = {} version = Facter::Resolvers::DmiDecode.resolve(:virtualbox_version) revision = Facter::Resolvers::DmiDecode.resolve(:virtualbox_revision) virtualbox_details[:version] = version if version virtualbox_details[:revision] = revision if revision end virtualbox_details end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/hypervisors/vmware.rb000066400000000000000000000020211470204764400264160ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Hypervisors class Vmware FACT_NAME = 'hypervisors.vmware' def initialize @log = Facter::Log.new(self) end def call_the_resolver if vmware? @log.debug('Vmware hypervisor detected') fact_value = {} version = Facter::Resolvers::DmiDecode.resolve(:vmware_version) fact_value[:version] = version if version && !version.empty? return Facter::ResolvedFact.new(FACT_NAME, fact_value) end @log.debug('No Vmware hypervisor detected.') [] end private def vmware? Facter::Resolvers::VirtWhat.resolve(:vm) == 'vmware' || Facter::Resolvers::Linux::DmiBios.resolve(:product_name) == 'VMware' || Facter::Resolvers::Lspci.resolve(:vm) == 'vmware' || Facter::Resolvers::Linux::DmiBios.resolve(:sys_vendor) == 'VMware, Inc.' end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/hypervisors/xen.rb000066400000000000000000000022721470204764400257170ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Hypervisors class Xen FACT_NAME = 'hypervisors.xen' def initialize @log = Facter::Log.new(self) end def call_the_resolver if xen? @log.debug('Xen hypervisor detected') fact_value = {} fact_value[:context] = hvm? ? 'hvm' : 'pv' fact_value[:privileged] = Facter::Resolvers::Xen.resolve(:privileged) return Facter::ResolvedFact.new(FACT_NAME, fact_value) end @log.debug('No Xen hypervisor detected.') [] end private def xen? Facter::Util::Facts::Posix::VirtualDetector.platform =~ /xen/ end def hvm? discover_hypervisor == 'xenhvm' || Facter::Resolvers::Lspci.resolve(:vm) == 'xenhvm' end def discover_hypervisor product_name = Facter::Resolvers::Linux::DmiBios.resolve(:product_name) return unless product_name Facter::Util::Facts::HYPERVISORS_HASH.each { |key, value| return value if product_name.include?(key) } product_name end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/identity/000077500000000000000000000000001470204764400240315ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linux/identity/gid.rb000066400000000000000000000005101470204764400251150ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Identity class Gid FACT_NAME = 'identity.gid' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:gid) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/identity/group.rb000066400000000000000000000006411470204764400255130ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Identity class Group FACT_NAME = 'identity.group' ALIASES = 'gid' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:group) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/identity/privileged.rb000066400000000000000000000005351470204764400265130ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Identity class Privileged FACT_NAME = 'identity.privileged' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:privileged) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/identity/uid.rb000066400000000000000000000005101470204764400251330ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Identity class Uid FACT_NAME = 'identity.uid' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:uid) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/identity/user.rb000066400000000000000000000006341470204764400253370ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Identity class User FACT_NAME = 'identity.user' ALIASES = 'id' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:user) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/interfaces.rb000066400000000000000000000006541470204764400246550ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Interfaces FACT_NAME = 'interfaces' TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::Linux::Networking.resolve(:interfaces) Facter::ResolvedFact.new(FACT_NAME, fact_value && !fact_value.empty? ? fact_value.keys.sort.join(',') : nil, :legacy) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/ipaddress6_interfaces.rb000066400000000000000000000007431470204764400270000ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Ipaddress6Interfaces FACT_NAME = 'ipaddress6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Linux::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("ipaddress6_#{interface_name}", info[:ip6], :legacy) if info[:ip6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/ipaddress_interfaces.rb000066400000000000000000000007361470204764400267140ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class IpaddressInterfaces FACT_NAME = 'ipaddress_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Linux::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("ipaddress_#{interface_name}", info[:ip], :legacy) if info[:ip] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/is_virtual.rb000066400000000000000000000007031470204764400247060ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class IsVirtual FACT_NAME = 'is_virtual' def call_the_resolver fact_value = Facter::Util::Facts::Posix::VirtualDetector.platform Facter::ResolvedFact.new(FACT_NAME, check_if_virtual(fact_value)) end private def check_if_virtual(found_vm) Facter::Util::Facts::PHYSICAL_HYPERVISORS.count(found_vm).zero? end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/kernel.rb000066400000000000000000000004341470204764400240060ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Kernel FACT_NAME = 'kernel' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:kernelname) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/kernelmajversion.rb000066400000000000000000000010531470204764400261020ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Kernelmajversion FACT_NAME = 'kernelmajversion' def call_the_resolver full_version = Facter::Resolvers::Uname.resolve(:kernelrelease) Facter::ResolvedFact.new(FACT_NAME, major_version(full_version)) end private def major_version(full_version) versions_split = full_version.split('.') return versions_split[0] if versions_split.length <= 1 "#{versions_split[0]}.#{versions_split[1]}" end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/kernelrelease.rb000066400000000000000000000004541470204764400253510ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Kernelrelease FACT_NAME = 'kernelrelease' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:kernelrelease) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/kernelversion.rb000066400000000000000000000005621470204764400254160ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Kernelversion FACT_NAME = 'kernelversion' def call_the_resolver version_numbers = Facter::Resolvers::Uname.resolve(:kernelrelease).scan(/\d+/) fact_value = version_numbers[0..2].join('.') Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/load_averages.rb000066400000000000000000000004711470204764400253230ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class LoadAverages FACT_NAME = 'load_averages' def call_the_resolver fact_value = Facter::Resolvers::Linux::LoadAverages.resolve(:load_averages) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/lsbdistrelease.rb000066400000000000000000000012241470204764400255310ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Lsbdistrelease FACT_NAME = 'lsbdistrelease' ALIASES = %w[lsbmajdistrelease lsbminordistrelease].freeze TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:release) return Facter::ResolvedFact.new(FACT_NAME, nil, :legacy) unless fact_value version = fact_value.split('.') [Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy), Facter::ResolvedFact.new(ALIASES[0], version[0], :legacy), Facter::ResolvedFact.new(ALIASES[1], version[1], :legacy)] end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/macaddress_interfaces.rb000066400000000000000000000007431470204764400270420ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class MacaddressInterfaces FACT_NAME = 'macaddress_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Linux::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("macaddress_#{interface_name}", info[:mac], :legacy) if info[:mac] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/memory/000077500000000000000000000000001470204764400235105ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linux/memory/swap/000077500000000000000000000000001470204764400244625ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linux/memory/swap/available.rb000066400000000000000000000010771470204764400267340ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Memory module Swap class Available FACT_NAME = 'memory.swap.available' ALIASES = 'swapfree' def call_the_resolver fact_value = Facter::Resolvers::Linux::Memory.resolve(:swap_free) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/memory/swap/available_bytes.rb000066400000000000000000000010531470204764400301340ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Memory module Swap class AvailableBytes FACT_NAME = 'memory.swap.available_bytes' ALIASES = 'swapfree_mb' def call_the_resolver fact_value = Facter::Resolvers::Linux::Memory.resolve(:swap_free) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/memory/swap/capacity.rb000066400000000000000000000006101470204764400266010ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Memory module Swap class Capacity FACT_NAME = 'memory.swap.capacity' def call_the_resolver fact_value = Facter::Resolvers::Linux::Memory.resolve(:swap_capacity) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/memory/swap/total.rb000066400000000000000000000010701470204764400261300ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Memory module Swap class Total FACT_NAME = 'memory.swap.total' ALIASES = 'swapsize' def call_the_resolver fact_value = Facter::Resolvers::Linux::Memory.resolve(:swap_total) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/memory/swap/total_bytes.rb000066400000000000000000000010431470204764400273360ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Memory module Swap class TotalBytes FACT_NAME = 'memory.swap.total_bytes' ALIASES = 'swapsize_mb' def call_the_resolver fact_value = Facter::Resolvers::Linux::Memory.resolve(:swap_total) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/memory/swap/used.rb000066400000000000000000000007421470204764400257520ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Memory module Swap class Used FACT_NAME = 'memory.swap.used' def call_the_resolver fact_value = Facter::Resolvers::Linux::Memory.resolve(:swap_used_bytes) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/memory/swap/used_bytes.rb000066400000000000000000000006151470204764400271570ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Memory module Swap class UsedBytes FACT_NAME = 'memory.swap.used_bytes' def call_the_resolver fact_value = Facter::Resolvers::Linux::Memory.resolve(:swap_used_bytes) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/memory/system/000077500000000000000000000000001470204764400250345ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linux/memory/system/available.rb000066400000000000000000000011041470204764400272750ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Memory module System class Available FACT_NAME = 'memory.system.available' ALIASES = 'memoryfree' def call_the_resolver fact_value = Facter::Resolvers::Linux::Memory.resolve(:memfree) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/memory/system/available_bytes.rb000066400000000000000000000010571470204764400305120ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Memory module System class AvailableBytes FACT_NAME = 'memory.system.available_bytes' ALIASES = 'memoryfree_mb' def call_the_resolver fact_value = Facter::Resolvers::Linux::Memory.resolve(:memfree) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/memory/system/capacity.rb000066400000000000000000000006071470204764400271610ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Memory module System class Capacity FACT_NAME = 'memory.system.capacity' def call_the_resolver fact_value = Facter::Resolvers::Linux::Memory.resolve(:capacity) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/memory/system/total.rb000066400000000000000000000010711470204764400265030ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Memory module System class Total FACT_NAME = 'memory.system.total' ALIASES = 'memorysize' def call_the_resolver fact_value = Facter::Resolvers::Linux::Memory.resolve(:total) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/memory/system/total_bytes.rb000066400000000000000000000010441470204764400277110ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Memory module System class TotalBytes FACT_NAME = 'memory.system.total_bytes' ALIASES = 'memorysize_mb' def call_the_resolver fact_value = Facter::Resolvers::Linux::Memory.resolve(:total) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/memory/system/used.rb000066400000000000000000000007411470204764400263230ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Memory module System class Used FACT_NAME = 'memory.system.used' def call_the_resolver fact_value = Facter::Resolvers::Linux::Memory.resolve(:used_bytes) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/memory/system/used_bytes.rb000066400000000000000000000006141470204764400275300ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Memory module System class UsedBytes FACT_NAME = 'memory.system.used_bytes' def call_the_resolver fact_value = Facter::Resolvers::Linux::Memory.resolve(:used_bytes) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/mountpoints.rb000066400000000000000000000007721470204764400251320ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Mountpoints FACT_NAME = 'mountpoints' def call_the_resolver mountpoints = Facter::Resolvers::Mountpoints.resolve(FACT_NAME.to_sym) return Facter::ResolvedFact.new(FACT_NAME, nil) unless mountpoints fact = {} mountpoints.each do |mnt| fact[mnt[:path].to_sym] = mnt.reject { |k| k == :path } end Facter::ResolvedFact.new(FACT_NAME, fact) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/mtu_interfaces.rb000066400000000000000000000007161470204764400255410ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class MtuInterfaces FACT_NAME = 'mtu_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Linux::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("mtu_#{interface_name}", info[:mtu], :legacy) if info[:mtu] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/netmask6_interfaces.rb000066400000000000000000000007471470204764400264700ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Netmask6Interfaces FACT_NAME = 'netmask6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Linux::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("netmask6_#{interface_name}", info[:netmask6], :legacy) if info[:netmask6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/netmask_interfaces.rb000066400000000000000000000007421470204764400263750ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class NetmaskInterfaces FACT_NAME = 'netmask_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Linux::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("netmask_#{interface_name}", info[:netmask], :legacy) if info[:netmask] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/network6_interfaces.rb000066400000000000000000000007471470204764400265170ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Network6Interfaces FACT_NAME = 'network6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Linux::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("network6_#{interface_name}", info[:network6], :legacy) if info[:network6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/network_interfaces.rb000066400000000000000000000007421470204764400264240ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class NetworkInterfaces FACT_NAME = 'network_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Linux::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("network_#{interface_name}", info[:network], :legacy) if info[:network] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/networking/000077500000000000000000000000001470204764400243675ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linux/networking/dhcp.rb000066400000000000000000000005251470204764400256340ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Networking class Dhcp FACT_NAME = 'networking.dhcp' def call_the_resolver fact_value = Facter::Resolvers::Linux::Networking.resolve(:dhcp) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/networking/domain.rb000066400000000000000000000006561470204764400261720ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Networking class Domain FACT_NAME = 'networking.domain' ALIASES = 'domain' def call_the_resolver fact_value = Facter::Resolvers::Linux::Hostname.resolve(:domain) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/networking/fqdn.rb000066400000000000000000000006461470204764400256520ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Networking class Fqdn FACT_NAME = 'networking.fqdn' ALIASES = 'fqdn' def call_the_resolver fact_value = Facter::Resolvers::Linux::Hostname.resolve(:fqdn) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/networking/hostname.rb000066400000000000000000000006661470204764400265420ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Networking class Hostname FACT_NAME = 'networking.hostname' ALIASES = 'hostname' def call_the_resolver fact_value = Facter::Resolvers::Linux::Hostname.resolve(:hostname) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/networking/interfaces.rb000066400000000000000000000005471470204764400270450ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Networking class Interfaces FACT_NAME = 'networking.interfaces' def call_the_resolver fact_value = Facter::Resolvers::Linux::Networking.resolve(:interfaces) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/networking/ip.rb000066400000000000000000000006471470204764400253330ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Networking class Ip FACT_NAME = 'networking.ip' ALIASES = 'ipaddress' def call_the_resolver fact_value = Facter::Resolvers::Linux::Networking.resolve(:ip) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/networking/ip6.rb000066400000000000000000000006531470204764400254160ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Networking class Ip6 FACT_NAME = 'networking.ip6' ALIASES = 'ipaddress6' def call_the_resolver fact_value = Facter::Resolvers::Linux::Networking.resolve(:ip6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/networking/mac.rb000066400000000000000000000006531470204764400254600ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Networking class Mac FACT_NAME = 'networking.mac' ALIASES = 'macaddress' def call_the_resolver fact_value = Facter::Resolvers::Linux::Networking.resolve(:mac) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/networking/mtu.rb000066400000000000000000000005221470204764400255200ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Networking class Mtu FACT_NAME = 'networking.mtu' def call_the_resolver fact_value = Facter::Resolvers::Linux::Networking.resolve(:mtu) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/networking/netmask.rb000066400000000000000000000006641470204764400263640ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Networking class Netmask FACT_NAME = 'networking.netmask' ALIASES = 'netmask' def call_the_resolver fact_value = Facter::Resolvers::Linux::Networking.resolve(:netmask) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/networking/netmask6.rb000066400000000000000000000006701470204764400264470ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Networking class Netmask6 FACT_NAME = 'networking.netmask6' ALIASES = 'netmask6' def call_the_resolver fact_value = Facter::Resolvers::Linux::Networking.resolve(:netmask6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/networking/network.rb000066400000000000000000000006641470204764400264130ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Networking class Network FACT_NAME = 'networking.network' ALIASES = 'network' def call_the_resolver fact_value = Facter::Resolvers::Linux::Networking.resolve(:network) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/networking/network6.rb000066400000000000000000000006701470204764400264760ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Networking class Network6 FACT_NAME = 'networking.network6' ALIASES = 'network6' def call_the_resolver fact_value = Facter::Resolvers::Linux::Networking.resolve(:network6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/networking/primary.rb000066400000000000000000000005501470204764400263770ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Networking class Primary FACT_NAME = 'networking.primary' def call_the_resolver fact_value = Facter::Resolvers::Linux::Networking.resolve(:primary_interface) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/networking/scope6.rb000066400000000000000000000006741470204764400261220ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Networking class Scope6 FACT_NAME = 'networking.scope6' ALIASES = 'scope6' def call_the_resolver fact_value = Facter::Resolvers::Linux::Networking.resolve(:scope6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new('scope6', fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/os/000077500000000000000000000000001470204764400226215ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linux/os/architecture.rb000066400000000000000000000007601470204764400256330ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Os class Architecture FACT_NAME = 'os.architecture' ALIASES = 'architecture' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:machine) fact_value = 'i386' if /i[3456]86|pentium/.match?(fact_value) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/os/distro/000077500000000000000000000000001470204764400241255ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linux/os/distro/codename.rb000066400000000000000000000007521470204764400262310ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Os module Distro class Codename FACT_NAME = 'os.distro.codename' ALIASES = 'lsbdistcodename' def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:codename) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/os/distro/description.rb000066400000000000000000000007661470204764400270060ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Os module Distro class Description FACT_NAME = 'os.distro.description' ALIASES = 'lsbdistdescription' def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:description) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/os/distro/id.rb000066400000000000000000000007361470204764400250540ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Os module Distro class Id FACT_NAME = 'os.distro.id' ALIASES = 'lsbdistid' def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:distributor_id) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/os/distro/release.rb000066400000000000000000000016701470204764400260760ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Os module Distro class Release FACT_NAME = 'os.distro.release' ALIASES = %w[lsbdistrelease lsbmajdistrelease lsbminordistrelease].freeze def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:release) return Facter::ResolvedFact.new(FACT_NAME, nil) unless fact_value versions = fact_value.split('.') release = { 'full' => fact_value, 'major' => versions[0], 'minor' => versions[1] } [Facter::ResolvedFact.new(FACT_NAME, release), Facter::ResolvedFact.new(ALIASES[0], fact_value, :legacy), Facter::ResolvedFact.new(ALIASES[1], versions[0], :legacy), Facter::ResolvedFact.new(ALIASES[2], versions[1], :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/os/distro/specification.rb000066400000000000000000000007621470204764400272770ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Os module Distro class Specification FACT_NAME = 'os.distro.specification' ALIASES = 'lsbrelease' def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:lsb_version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/os/family.rb000066400000000000000000000010571470204764400244320ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Os class Family FACT_NAME = 'os.family' ALIASES = 'osfamily' def call_the_resolver id = Facter::Resolvers::OsRelease.resolve(:id_like) id ||= Facter::Resolvers::OsRelease.resolve(:id) fact_value = Facter::Util::Facts.discover_family(id) [Facter::ResolvedFact.new(FACT_NAME, fact_value.capitalize), Facter::ResolvedFact.new(ALIASES, fact_value.capitalize, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/os/hardware.rb000066400000000000000000000006401470204764400247430ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Os class Hardware FACT_NAME = 'os.hardware' ALIASES = 'hardwaremodel' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:machine) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/os/name.rb000066400000000000000000000006331470204764400240700ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Os class Name FACT_NAME = 'os.name' ALIASES = 'operatingsystem' def call_the_resolver fact_value = Facter::Resolvers::OsRelease.resolve(:name) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/os/release.rb000066400000000000000000000010641470204764400245670ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver version = Facter::Resolvers::OsRelease.resolve(:version_id) [Facter::ResolvedFact.new(FACT_NAME, full: version, major: version), Facter::ResolvedFact.new(ALIASES.first, version, :legacy), Facter::ResolvedFact.new(ALIASES.last, version, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/os/selinux/000077500000000000000000000000001470204764400243105ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linux/os/selinux/config_mode.rb000066400000000000000000000007651470204764400271160ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Os module Selinux class ConfigMode FACT_NAME = 'os.selinux.config_mode' ALIASES = 'selinux_config_mode' def call_the_resolver fact_value = Facter::Resolvers::SELinux.resolve(:config_mode) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/os/selinux/config_policy.rb000066400000000000000000000007751470204764400274720ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Os module Selinux class ConfigPolicy FACT_NAME = 'os.selinux.config_policy' ALIASES = 'selinux_config_policy' def call_the_resolver fact_value = Facter::Resolvers::SELinux.resolve(:config_policy) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/os/selinux/current_mode.rb000066400000000000000000000007711470204764400273300ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Os module Selinux class CurrentMode FACT_NAME = 'os.selinux.current_mode' ALIASES = 'selinux_current_mode' def call_the_resolver fact_value = Facter::Resolvers::SELinux.resolve(:current_mode) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/os/selinux/enabled.rb000066400000000000000000000007251470204764400262330ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Os module Selinux class Enabled FACT_NAME = 'os.selinux.enabled' ALIASES = 'selinux' def call_the_resolver selinux = Facter::Resolvers::SELinux.resolve(:enabled) [Facter::ResolvedFact.new(FACT_NAME, selinux), Facter::ResolvedFact.new(ALIASES, selinux, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/os/selinux/enforced.rb000066400000000000000000000007521470204764400264260ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Os module Selinux class Enforced FACT_NAME = 'os.selinux.enforced' ALIASES = 'selinux_enforced' def call_the_resolver fact_value = Facter::Resolvers::SELinux.resolve(:enforced) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/os/selinux/policy_version.rb000066400000000000000000000010001470204764400276700ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Os module Selinux class PolicyVersion FACT_NAME = 'os.selinux.policy_version' ALIASES = 'selinux_policyversion' def call_the_resolver fact_value = Facter::Resolvers::SELinux.resolve(:policy_version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/partitions.rb000066400000000000000000000014141470204764400247210ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Partitions FACT_NAME = 'partitions' def call_the_resolver Facter::ResolvedFact.new(FACT_NAME, partitions) end def partitions parts = Facter::Resolvers::Partitions.resolve(:partitions) # We should exit early if we are running on a node with no partitions # (e.g. a diskless, netbooted VM) return nil unless parts mountpoints = Facter::Resolvers::Mountpoints.resolve(:mountpoints) return parts unless mountpoints mountpoints.reverse_each do |mnt| next unless parts[mnt[:device]] parts[mnt[:device]].merge!(mount: mnt[:path]) end parts.empty? ? nil : parts end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/path.rb000066400000000000000000000004211470204764400234560ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Path FACT_NAME = 'path' def call_the_resolver fact_value = Facter::Resolvers::Path.resolve(:path) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/processor.rb000066400000000000000000000007051470204764400245460ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Processor FACT_NAME = 'processor.*' TYPE = :legacy def call_the_resolver arr = [] processors = Facter::Resolvers::Linux::Processors.resolve(:models) (0...processors.count).each do |iterator| arr << Facter::ResolvedFact.new("processor#{iterator}", processors[iterator], :legacy) end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/processors/000077500000000000000000000000001470204764400244025ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linux/processors/cores.rb000066400000000000000000000005351470204764400260450ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Processors class Cores FACT_NAME = 'processors.cores' def call_the_resolver fact_value = Facter::Resolvers::Linux::Lscpu.resolve(:cores_per_socket) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/processors/count.rb000066400000000000000000000006711470204764400260630ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Processors class Count FACT_NAME = 'processors.count' ALIASES = 'processorcount' def call_the_resolver fact_value = Facter::Resolvers::Linux::Processors.resolve(:processors) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/processors/extensions.rb000066400000000000000000000005461470204764400271330ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Processors class Extensions FACT_NAME = 'processors.extensions' def call_the_resolver fact_value = Facter::Resolvers::Linux::Processors.resolve(:extensions) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/processors/isa.rb000066400000000000000000000006451470204764400255100ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Processors class Isa FACT_NAME = 'processors.isa' ALIASES = 'hardwareisa' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:processor) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/processors/models.rb000066400000000000000000000005321470204764400262120ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Processors class Models FACT_NAME = 'processors.models' def call_the_resolver fact_value = Facter::Resolvers::Linux::Processors.resolve(:models) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/processors/physicalcount.rb000066400000000000000000000007251470204764400276200ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Processors class Physicalcount FACT_NAME = 'processors.physicalcount' ALIASES = 'physicalprocessorcount' def call_the_resolver fact_value = Facter::Resolvers::Linux::Processors.resolve(:physical_count) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/processors/speed.rb000066400000000000000000000006531470204764400260330ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Processors class Speed FACT_NAME = 'processors.speed' def call_the_resolver fact_value = Facter::Resolvers::Linux::Processors.resolve(:speed) speed = Facter::Util::Facts::UnitConverter.hertz_to_human_readable(fact_value) Facter::ResolvedFact.new(FACT_NAME, speed) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/processors/threads.rb000066400000000000000000000005411470204764400263610ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Processors class Threads FACT_NAME = 'processors.threads' def call_the_resolver fact_value = Facter::Resolvers::Linux::Lscpu.resolve(:threads_per_core) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/ruby/000077500000000000000000000000001470204764400231615ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linux/ruby/platform.rb000066400000000000000000000006431470204764400253350ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Ruby class Platform FACT_NAME = 'ruby.platform' ALIASES = 'rubyplatform' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:platform) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/ruby/sitedir.rb000066400000000000000000000006371470204764400251570ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Ruby class Sitedir FACT_NAME = 'ruby.sitedir' ALIASES = 'rubysitedir' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:sitedir) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/ruby/version.rb000066400000000000000000000006371470204764400252010ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module Ruby class Version FACT_NAME = 'ruby.version' ALIASES = 'rubyversion' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/scope6_interfaces.rb000066400000000000000000000010311470204764400261220ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Scope6Interfaces FACT_NAME = 'scope6_.*' TYPE = :legacy def call_the_resolver resolved_facts = [] interfaces = Facter::Resolvers::Linux::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| if info[:scope6] resolved_facts << Facter::ResolvedFact.new("scope6_#{interface_name}", info[:scope6], :legacy) end end resolved_facts end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/ssh.rb000066400000000000000000000012651470204764400233260ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Ssh FACT_NAME = 'ssh' def call_the_resolver Facter::ResolvedFact.new(FACT_NAME, fact_value) end private def fact_value resolver_data.map { |el| create_ssh_fact(el) }.inject(:merge) end def resolver_data Facter::Resolvers::Ssh.resolve(:ssh) end def create_ssh_fact(ssh) return {} unless ssh { ssh.name.to_sym => { fingerprints: { sha1: ssh.fingerprint.sha1, sha256: ssh.fingerprint.sha256 }, key: ssh.key, type: ssh.type } } end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/sshalgorithmkey.rb000066400000000000000000000006051470204764400257430ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Sshalgorithmkey FACT_NAME = 'ssh.*key' TYPE = :legacy def call_the_resolver facts = [] result = Facter::Resolvers::Ssh.resolve(:ssh) result.each { |ssh| facts << Facter::ResolvedFact.new("ssh#{ssh.name.to_sym}key", ssh.key, :legacy) } facts end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/sshfp_algorithm.rb000066400000000000000000000007621470204764400257230ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class SshfpAlgorithm FACT_NAME = 'sshfp_.*' TYPE = :legacy def call_the_resolver facts = [] result = Facter::Resolvers::Ssh.resolve(:ssh) result.each do |ssh| facts << Facter::ResolvedFact.new("sshfp_#{ssh.name.to_sym}", "#{ssh.fingerprint.sha1}\n#{ssh.fingerprint.sha256}", :legacy) end facts end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/system_uptime/000077500000000000000000000000001470204764400251075ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linux/system_uptime/days.rb000066400000000000000000000012731470204764400263770ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module SystemUptime class Days FACT_NAME = 'system_uptime.days' ALIASES = 'uptime_days' def call_the_resolver hypervisors = Facter::Resolvers::Containers.resolve(:hypervisor) fact_value = if hypervisors && hypervisors[:docker] Facter::Resolvers::Linux::DockerUptime.resolve(:days) else Facter::Resolvers::Uptime.resolve(:days) end [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/system_uptime/hours.rb000066400000000000000000000013001470204764400265660ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module SystemUptime class Hours FACT_NAME = 'system_uptime.hours' ALIASES = 'uptime_hours' def call_the_resolver hypervisors = Facter::Resolvers::Containers.resolve(:hypervisor) fact_value = if hypervisors && hypervisors[:docker] Facter::Resolvers::Linux::DockerUptime.resolve(:hours) else Facter::Resolvers::Uptime.resolve(:hours) end [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/system_uptime/seconds.rb000066400000000000000000000013121470204764400270670ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module SystemUptime class Seconds FACT_NAME = 'system_uptime.seconds' ALIASES = 'uptime_seconds' def call_the_resolver hypervisors = Facter::Resolvers::Containers.resolve(:hypervisor) fact_value = if hypervisors && hypervisors[:docker] Facter::Resolvers::Linux::DockerUptime.resolve(:seconds) else Facter::Resolvers::Uptime.resolve(:seconds) end [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/system_uptime/uptime.rb000066400000000000000000000012761470204764400267450ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux module SystemUptime class Uptime FACT_NAME = 'system_uptime.uptime' ALIASES = 'uptime' def call_the_resolver hypervisors = Facter::Resolvers::Containers.resolve(:hypervisor) fact_value = if hypervisors && hypervisors[:docker] Facter::Resolvers::Linux::DockerUptime.resolve(:uptime) else Facter::Resolvers::Uptime.resolve(:uptime) end [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/timezone.rb000066400000000000000000000004401470204764400243550ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Timezone FACT_NAME = 'timezone' def call_the_resolver fact_value = Facter::Resolvers::Timezone.resolve(:timezone) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/virtual.rb000066400000000000000000000007121470204764400242130ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Virtual FACT_NAME = 'virtual' def initialize @log = Facter::Log.new(self) end def call_the_resolver @log.debug('Linux Virtual Resolver') fact_value = Facter::Util::Facts::Posix::VirtualDetector.platform @log.debug("Fact value is: #{fact_value}") Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linux/xen.rb000066400000000000000000000012721470204764400233210ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linux class Xen FACT_NAME = 'xen' ALIASES = 'xendomains' def call_the_resolver xen_type = check_virt_what || check_xen return Facter::ResolvedFact.new(FACT_NAME, nil) if !xen_type || xen_type != 'xen0' domains = Facter::Resolvers::Xen.resolve(:domains) || [] [Facter::ResolvedFact.new(FACT_NAME, { domains: domains }), Facter::ResolvedFact.new(ALIASES, domains.entries.join(','), :legacy)] end def check_virt_what Facter::Resolvers::VirtWhat.resolve(:vm) end def check_xen Facter::Resolvers::Xen.resolve(:vm) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linuxmint/000077500000000000000000000000001470204764400230705ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linuxmint/os/000077500000000000000000000000001470204764400235115ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/linuxmint/os/name.rb000066400000000000000000000006511470204764400247600ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linuxmint module Os class Name FACT_NAME = 'os.name' ALIASES = 'operatingsystem' def call_the_resolver fact_value = Facter::Resolvers::OsRelease.resolve(:id)&.capitalize [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/linuxmint/os/release.rb000066400000000000000000000022471470204764400254630ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Linuxmint module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver version = from_specific_file || from_os_release return Facter::ResolvedFact.new(FACT_NAME, nil) unless version [Facter::ResolvedFact.new(FACT_NAME, version), Facter::ResolvedFact.new(ALIASES.first, version['major'], :legacy), Facter::ResolvedFact.new(ALIASES.last, version['full'], :legacy)] end def from_specific_file version = Facter::Resolvers::SpecificReleaseFile.resolve(:release, { release_file: '/etc/linuxmint/info', regex: /^RELEASE=(\d+)/ }) Facter::Util::Facts.release_hash_from_matchdata(version) end def from_os_release version = Facter::Resolvers::OsRelease.resolve(:version_id) Facter::Util::Facts.release_hash_from_string(version) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/000077500000000000000000000000001470204764400223335ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/aio_agent_version.rb000066400000000000000000000005011470204764400263470ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class AioAgentVersion FACT_NAME = 'aio_agent_version' def call_the_resolver fact_value = Facter::Resolvers::AioAgentVersion.resolve(:aio_agent_version) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/augeas/000077500000000000000000000000001470204764400236005ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/augeas/version.rb000066400000000000000000000006721470204764400256170ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Augeas class Version FACT_NAME = 'augeas.version' ALIASES = 'augeasversion' def call_the_resolver fact_value = Facter::Resolvers::Augeas.resolve(:augeas_version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/dhcp_servers.rb000066400000000000000000000014101470204764400253430ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class DhcpServers FACT_NAME = 'dhcp_servers' TYPE = :legacy def call_the_resolver fact_value = construct_addresses_hash fact_value = !fact_value || fact_value.empty? ? nil : fact_value Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy) end private def construct_addresses_hash primary_dhcp = Facter::Resolvers::Networking.resolve(:dhcp) interfaces = Facter::Resolvers::Networking.resolve(:interfaces) return unless interfaces servers = { system: primary_dhcp } interfaces&.each { |interface_name, info| servers[interface_name] = info[:dhcp] if info[:dhcp] } servers end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/dmi/000077500000000000000000000000001470204764400231045ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/dmi/product/000077500000000000000000000000001470204764400245645ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/dmi/product/name.rb000066400000000000000000000007361470204764400260370ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Dmi module Product class Name FACT_NAME = 'dmi.product.name' ALIASES = 'productname' def call_the_resolver fact_value = Facter::Resolvers::Macosx::DmiBios.resolve(:macosx_model) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/facterversion.rb000066400000000000000000000004661470204764400255400ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class Facterversion FACT_NAME = 'facterversion' def call_the_resolver fact_value = Facter::Resolvers::Facterversion.resolve(:facterversion) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/filesystems.rb000066400000000000000000000004741470204764400252340ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class Filesystems FACT_NAME = 'filesystems' def call_the_resolver fact_value = Facter::Resolvers::Macosx::Filesystems.resolve(:macosx_filesystems) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/identity/000077500000000000000000000000001470204764400241645ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/identity/gid.rb000066400000000000000000000005111470204764400252510ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Identity class Gid FACT_NAME = 'identity.gid' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:gid) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/identity/group.rb000066400000000000000000000006421470204764400256470ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Identity class Group FACT_NAME = 'identity.group' ALIASES = 'gid' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:group) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/identity/privileged.rb000066400000000000000000000005361470204764400266470ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Identity class Privileged FACT_NAME = 'identity.privileged' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:privileged) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/identity/uid.rb000066400000000000000000000005111470204764400252670ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Identity class Uid FACT_NAME = 'identity.uid' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:uid) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/identity/user.rb000066400000000000000000000006351470204764400254730ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Identity class User FACT_NAME = 'identity.user' ALIASES = 'id' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:user) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/interfaces.rb000066400000000000000000000005571470204764400250120ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class Interfaces FACT_NAME = 'interfaces' TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:interfaces) Facter::ResolvedFact.new(FACT_NAME, fact_value ? fact_value.keys.sort.join(',') : nil, :legacy) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/ipaddress6_interfaces.rb000066400000000000000000000007351470204764400271340ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class Ipaddress6Interfaces FACT_NAME = 'ipaddress6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("ipaddress6_#{interface_name}", info[:ip6], :legacy) if info[:ip6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/ipaddress_interfaces.rb000066400000000000000000000007301470204764400270410ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class IpaddressInterfaces FACT_NAME = 'ipaddress_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("ipaddress_#{interface_name}", info[:ip], :legacy) if info[:ip] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/is_virtual.rb000066400000000000000000000015071470204764400250440ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class IsVirtual FACT_NAME = 'is_virtual' def call_the_resolver Facter::ResolvedFact.new(FACT_NAME, virtual?) end private def virtual? hypervisor_name != nil end def hypervisor_name model_identifier = Facter::Resolvers::Macosx::SystemProfiler.resolve(:model_identifier) return 'vmware' if model_identifier&.start_with?('VMware') boot_rom_version = Facter::Resolvers::Macosx::SystemProfiler.resolve(:boot_rom_version) return 'virtualbox' if boot_rom_version&.start_with?('VirtualBox') subsystem_vendor_id = Facter::Resolvers::Macosx::SystemProfiler.resolve(:subsystem_vendor_id) 'parallels' if subsystem_vendor_id&.start_with?('0x1ab8') end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/kernel.rb000066400000000000000000000004341470204764400241410ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class Kernel FACT_NAME = 'kernel' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:kernelname) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/kernelmajversion.rb000066400000000000000000000005451470204764400262420ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class Kernelmajversion FACT_NAME = 'kernelmajversion' def call_the_resolver kernel_major_version = Facter::Resolvers::Uname.resolve(:kernelrelease).match(/[0-9]+\.[0-9]+/).to_s Facter::ResolvedFact.new(FACT_NAME, kernel_major_version) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/kernelrelease.rb000066400000000000000000000004551470204764400255050ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class Kernelrelease FACT_NAME = 'kernelrelease' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:kernelrelease) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/kernelversion.rb000066400000000000000000000004651470204764400255530ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class Kernelversion FACT_NAME = 'kernelversion' def call_the_resolver kernel_version = Facter::Resolvers::Uname.resolve(:kernelrelease) Facter::ResolvedFact.new(FACT_NAME, kernel_version) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/load_averages.rb000066400000000000000000000004731470204764400254600ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class LoadAverages FACT_NAME = 'load_averages' def call_the_resolver fact_value = Facter::Resolvers::Macosx::LoadAverages.resolve(:load_averages) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/macaddress_interfaces.rb000066400000000000000000000007351470204764400271760ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class MacaddressInterfaces FACT_NAME = 'macaddress_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("macaddress_#{interface_name}", info[:mac], :legacy) if info[:mac] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/memory/000077500000000000000000000000001470204764400236435ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/memory/swap/000077500000000000000000000000001470204764400246155ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/memory/swap/available.rb000066400000000000000000000011141470204764400270570ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Memory module Swap class Available FACT_NAME = 'memory.swap.available' ALIASES = 'swapfree' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SwapMemory.resolve(:available_bytes) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/memory/swap/available_bytes.rb000066400000000000000000000010661470204764400302730ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Memory module Swap class AvailableBytes FACT_NAME = 'memory.swap.available_bytes' ALIASES = 'swapfree_mb' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SwapMemory.resolve(:available_bytes) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/memory/swap/capacity.rb000066400000000000000000000006111470204764400267350ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Memory module Swap class Capacity FACT_NAME = 'memory.swap.capacity' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SwapMemory.resolve(:capacity) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/memory/swap/encrypted.rb000066400000000000000000000007521470204764400271430ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Memory module Swap class Encrypted FACT_NAME = 'memory.swap.encrypted' ALIASES = 'swapencrypted' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SwapMemory.resolve(:encrypted) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/memory/swap/total.rb000066400000000000000000000011001470204764400262550ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Memory module Swap class Total FACT_NAME = 'memory.swap.total' ALIASES = 'swapsize' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SwapMemory.resolve(:total_bytes) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/memory/swap/total_bytes.rb000066400000000000000000000010521470204764400274710ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Memory module Swap class TotalBytes FACT_NAME = 'memory.swap.total_bytes' ALIASES = 'swapsize_mb' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SwapMemory.resolve(:total_bytes) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/memory/swap/used.rb000066400000000000000000000007441470204764400261070ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Memory module Swap class Used FACT_NAME = 'memory.swap.used' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SwapMemory.resolve(:used_bytes) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/memory/swap/used_bytes.rb000066400000000000000000000006161470204764400273130ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Memory module Swap class UsedBytes FACT_NAME = 'memory.swap.used_bytes' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SwapMemory.resolve(:used_bytes) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/memory/system/000077500000000000000000000000001470204764400251675ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/memory/system/available.rb000066400000000000000000000011241470204764400274320ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Memory module System class Available FACT_NAME = 'memory.system.available' ALIASES = 'memoryfree' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemMemory.resolve(:available_bytes) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/memory/system/available_bytes.rb000066400000000000000000000010761470204764400306460ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Memory module System class AvailableBytes FACT_NAME = 'memory.system.available_bytes' ALIASES = 'memoryfree_mb' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemMemory.resolve(:available_bytes) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/memory/system/capacity.rb000066400000000000000000000006171470204764400273150ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Memory module System class Capacity FACT_NAME = 'memory.system.capacity' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemMemory.resolve(:capacity) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/memory/system/total.rb000066400000000000000000000011101470204764400266300ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Memory module System class Total FACT_NAME = 'memory.system.total' ALIASES = 'memorysize' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemMemory.resolve(:total_bytes) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/memory/system/total_bytes.rb000066400000000000000000000010621470204764400300440ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Memory module System class TotalBytes FACT_NAME = 'memory.system.total_bytes' ALIASES = 'memorysize_mb' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemMemory.resolve(:total_bytes) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/memory/system/used.rb000066400000000000000000000007521470204764400264600ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Memory module System class Used FACT_NAME = 'memory.system.used' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemMemory.resolve(:used_bytes) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/memory/system/used_bytes.rb000066400000000000000000000006241470204764400276640ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Memory module System class UsedBytes FACT_NAME = 'memory.system.used_bytes' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemMemory.resolve(:used_bytes) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/mountpoints.rb000066400000000000000000000006071470204764400252620ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class Mountpoints FACT_NAME = 'mountpoints' def call_the_resolver mountpoints = Facter::Resolvers::Macosx::Mountpoints.resolve(FACT_NAME.to_sym) return Facter::ResolvedFact.new(FACT_NAME, nil) unless mountpoints Facter::ResolvedFact.new(FACT_NAME, mountpoints) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/mtu_interfaces.rb000066400000000000000000000007101470204764400256660ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class MtuInterfaces FACT_NAME = 'mtu_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("mtu_#{interface_name}", info[:mtu], :legacy) if info[:mtu] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/netmask6_interfaces.rb000066400000000000000000000007411470204764400266150ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class Netmask6Interfaces FACT_NAME = 'netmask6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("netmask6_#{interface_name}", info[:netmask6], :legacy) if info[:netmask6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/netmask_interfaces.rb000066400000000000000000000007341470204764400265310ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class NetmaskInterfaces FACT_NAME = 'netmask_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("netmask_#{interface_name}", info[:netmask], :legacy) if info[:netmask] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/network6_interfaces.rb000066400000000000000000000007411470204764400266440ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class Network6Interfaces FACT_NAME = 'network6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("network6_#{interface_name}", info[:network6], :legacy) if info[:network6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/network_interfaces.rb000066400000000000000000000007341470204764400265600ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class NetworkInterfaces FACT_NAME = 'network_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("network_#{interface_name}", info[:network], :legacy) if info[:network] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/networking/000077500000000000000000000000001470204764400245225ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/networking/dhcp.rb000066400000000000000000000005171470204764400257700ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Networking class Dhcp FACT_NAME = 'networking.dhcp' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:dhcp) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/networking/domain.rb000066400000000000000000000006501470204764400263170ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Networking class Domain FACT_NAME = 'networking.domain' ALIASES = 'domain' def call_the_resolver fact_value = Facter::Resolvers::Hostname.resolve(:domain) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/networking/fqdn.rb000066400000000000000000000006401470204764400257770ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Networking class Fqdn FACT_NAME = 'networking.fqdn' ALIASES = 'fqdn' def call_the_resolver fact_value = Facter::Resolvers::Hostname.resolve(:fqdn) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/networking/hostname.rb000066400000000000000000000006601470204764400266670ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Networking class Hostname FACT_NAME = 'networking.hostname' ALIASES = 'hostname' def call_the_resolver fact_value = Facter::Resolvers::Hostname.resolve(:hostname) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/networking/interfaces.rb000066400000000000000000000005411470204764400271720ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Networking class Interfaces FACT_NAME = 'networking.interfaces' def call_the_resolver interfaces = Facter::Resolvers::Networking.resolve(:interfaces) Facter::ResolvedFact.new(FACT_NAME, interfaces) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/networking/ip.rb000066400000000000000000000006411470204764400254600ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Networking class Ip FACT_NAME = 'networking.ip' ALIASES = 'ipaddress' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:ip) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/networking/ip6.rb000066400000000000000000000006451470204764400255520ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Networking class Ip6 FACT_NAME = 'networking.ip6' ALIASES = 'ipaddress6' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:ip6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/networking/mac.rb000066400000000000000000000006451470204764400256140ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Networking class Mac FACT_NAME = 'networking.mac' ALIASES = 'macaddress' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:mac) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/networking/mtu.rb000066400000000000000000000005141470204764400256540ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Networking class Mtu FACT_NAME = 'networking.mtu' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:mtu) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/networking/netmask.rb000066400000000000000000000006561470204764400265200ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Networking class Netmask FACT_NAME = 'networking.netmask' ALIASES = 'netmask' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:netmask) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/networking/netmask6.rb000066400000000000000000000006621470204764400266030ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Networking class Netmask6 FACT_NAME = 'networking.netmask6' ALIASES = 'netmask6' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:netmask6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/networking/network.rb000066400000000000000000000006561470204764400265470ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Networking class Network FACT_NAME = 'networking.network' ALIASES = 'network' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:network) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/networking/network6.rb000066400000000000000000000006621470204764400266320ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Networking class Network6 FACT_NAME = 'networking.network6' ALIASES = 'network6' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:network6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/networking/primary.rb000066400000000000000000000005421470204764400265330ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Networking class Primary FACT_NAME = 'networking.primary' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:primary_interface) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/networking/scope6.rb000066400000000000000000000006661470204764400262560ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Networking class Scope6 FACT_NAME = 'networking.scope6' ALIASES = 'scope6' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:scope6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new('scope6', fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/os/000077500000000000000000000000001470204764400227545ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/os/architecture.rb000066400000000000000000000006471470204764400257720ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Os class Architecture FACT_NAME = 'os.architecture' ALIASES = 'architecture' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:machine) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/os/family.rb000066400000000000000000000006331470204764400245640ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Os class Family FACT_NAME = 'os.family' ALIASES = 'osfamily' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:kernelname) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/os/hardware.rb000066400000000000000000000006401470204764400250760ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Os class Hardware FACT_NAME = 'os.hardware' ALIASES = 'hardwaremodel' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:machine) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/os/macosx/000077500000000000000000000000001470204764400242465ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/os/macosx/build.rb000066400000000000000000000007331470204764400256750ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Os module Macosx class Build FACT_NAME = 'os.macosx.build' ALIASES = 'macosx_buildversion' def call_the_resolver fact_value = Facter::Resolvers::SwVers.resolve(:buildversion) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/os/macosx/product.rb000066400000000000000000000007351470204764400262600ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Os module Macosx class Product FACT_NAME = 'os.macosx.product' ALIASES = 'macosx_productname' def call_the_resolver fact_value = Facter::Resolvers::SwVers.resolve(:productname) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/os/macosx/version.rb000066400000000000000000000032051470204764400262600ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Os module Macosx class Version FACT_NAME = 'os.macosx.version' ALIASES = %w[macosx_productversion macosx_productversion_major macosx_productversion_minor macosx_productversion_patch].freeze def call_the_resolver version_value = Facter::Resolvers::SwVers.resolve(:productversion) extra_value = Facter::Resolvers::SwVers.resolve(:productversionextra) ver = version_hash(version_value, extra_value) [Facter::ResolvedFact.new(FACT_NAME, ver), Facter::ResolvedFact.new(ALIASES[0], version_value, :legacy), Facter::ResolvedFact.new(ALIASES[1], ver['major'], :legacy), Facter::ResolvedFact.new(ALIASES[2], ver['minor'], :legacy), Facter::ResolvedFact.new(ALIASES[3], ver['patch'], :legacy)] end def version_hash(version_value, extra_value) versions = version_value.split('.') if versions[0] == '10' { 'full' => version_value, 'major' => "#{versions[0]}.#{versions[1]}", 'minor' => versions[-1] } elsif /11|12/.match?(versions[0]) || extra_value.nil? { 'full' => version_value, 'major' => versions[0], 'minor' => versions.fetch(1, '0'), 'patch' => versions.fetch(2, '0') } else { 'full' => version_value, 'major' => versions[0], 'minor' => versions.fetch(1, '0'), 'patch' => versions.fetch(2, '0'), 'extra' => extra_value } end end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/os/name.rb000066400000000000000000000006361470204764400242260ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Os class Name FACT_NAME = 'os.name' ALIASES = 'operatingsystem' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:kernelname) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/os/release.rb000066400000000000000000000013361470204764400247240ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:kernelrelease) versions = fact_value.split('.') release = { 'full' => fact_value, 'major' => versions[0], 'minor' => versions[1] } [Facter::ResolvedFact.new(FACT_NAME, release), Facter::ResolvedFact.new(ALIASES.first, versions[0], :legacy), Facter::ResolvedFact.new(ALIASES.last, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/path.rb000066400000000000000000000004221470204764400236120ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class Path FACT_NAME = 'path' def call_the_resolver fact_value = Facter::Resolvers::Path.resolve(:path) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/processors/000077500000000000000000000000001470204764400245355ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/processors/cores.rb000066400000000000000000000005441470204764400262000ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Processors class Cores FACT_NAME = 'processors.cores' def call_the_resolver fact_value = Facter::Resolvers::Macosx::Processors.resolve(:cores_per_socket) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/processors/count.rb000066400000000000000000000006751470204764400262220ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Processors class Count FACT_NAME = 'processors.count' ALIASES = 'processorcount' def call_the_resolver fact_value = Facter::Resolvers::Macosx::Processors.resolve(:logicalcount) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/processors/isa.rb000066400000000000000000000006461470204764400256440ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Processors class Isa FACT_NAME = 'processors.isa' ALIASES = 'hardwareisa' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:processor) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/processors/models.rb000066400000000000000000000010611470204764400263430ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Processors class Models FACT_NAME = 'processors.models' ALIASES = 'processor.*' def call_the_resolver fact_value = Facter::Resolvers::Macosx::Processors.resolve(:models) facts = [Facter::ResolvedFact.new(FACT_NAME, fact_value)] fact_value.each_with_index do |value, index| facts.push(Facter::ResolvedFact.new("processor#{index}", value, :legacy)) end facts end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/processors/physicalcount.rb000066400000000000000000000007261470204764400277540ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Processors class Physicalcount FACT_NAME = 'processors.physicalcount' ALIASES = 'physicalprocessorcount' def call_the_resolver fact_value = Facter::Resolvers::Macosx::Processors.resolve(:physicalcount) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/processors/speed.rb000066400000000000000000000006551470204764400261700ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Processors class Speed FACT_NAME = 'processors.speed' def call_the_resolver fact_value = Facter::Resolvers::Macosx::Processors.resolve(:speed) speed = Facter::Util::Facts::UnitConverter.hertz_to_human_readable(fact_value) Facter::ResolvedFact.new(FACT_NAME, speed) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/processors/threads.rb000066400000000000000000000005501470204764400265140ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Processors class Threads FACT_NAME = 'processors.threads' def call_the_resolver fact_value = Facter::Resolvers::Macosx::Processors.resolve(:threads_per_core) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/ruby/000077500000000000000000000000001470204764400233145ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/ruby/platform.rb000066400000000000000000000006431470204764400254700ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Ruby class Platform FACT_NAME = 'ruby.platform' ALIASES = 'rubyplatform' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:platform) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/ruby/sitedir.rb000066400000000000000000000006371470204764400253120ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Ruby class Sitedir FACT_NAME = 'ruby.sitedir' ALIASES = 'rubysitedir' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:sitedir) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/ruby/version.rb000066400000000000000000000006401470204764400253260ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module Ruby class Version FACT_NAME = 'ruby.version' ALIASES = 'rubyversion' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/scope6_interfaces.rb000066400000000000000000000010221470204764400262550ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class Scope6Interfaces FACT_NAME = 'scope6_.*' TYPE = :legacy def call_the_resolver resolved_facts = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| if info[:scope6] resolved_facts << Facter::ResolvedFact.new("scope6_#{interface_name}", info[:scope6], :legacy) end end resolved_facts end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/ssh.rb000066400000000000000000000012661470204764400234620ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class Ssh FACT_NAME = 'ssh' def call_the_resolver Facter::ResolvedFact.new(FACT_NAME, fact_value) end private def fact_value resolver_data.map { |el| create_ssh_fact(el) }.inject(:merge) end def resolver_data Facter::Resolvers::Ssh.resolve(:ssh) end def create_ssh_fact(ssh) return {} unless ssh { ssh.name.to_sym => { fingerprints: { sha1: ssh.fingerprint.sha1, sha256: ssh.fingerprint.sha256 }, key: ssh.key, type: ssh.type } } end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/sshalgorithmkey.rb000066400000000000000000000006061470204764400260770ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class Sshalgorithmkey FACT_NAME = 'ssh.*key' TYPE = :legacy def call_the_resolver facts = [] result = Facter::Resolvers::Ssh.resolve(:ssh) result.each { |ssh| facts << Facter::ResolvedFact.new("ssh#{ssh.name.to_sym}key", ssh.key, :legacy) } facts end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/sshfp_algorithm.rb000066400000000000000000000007631470204764400260570ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class SshfpAlgorithm FACT_NAME = 'sshfp_.*' TYPE = :legacy def call_the_resolver facts = [] result = Facter::Resolvers::Ssh.resolve(:ssh) result.each do |ssh| facts << Facter::ResolvedFact.new("sshfp_#{ssh.name.to_sym}", "#{ssh.fingerprint.sha1}\n#{ssh.fingerprint.sha256}", :legacy) end facts end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/000077500000000000000000000000001470204764400255615ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/boot_mode.rb000066400000000000000000000007141470204764400300570ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class BootMode FACT_NAME = 'system_profiler.boot_mode' ALIASES = 'sp_boot_mode' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:boot_mode) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/boot_rom_version.rb000066400000000000000000000007471470204764400315030ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class BootRomVersion FACT_NAME = 'system_profiler.boot_rom_version' ALIASES = 'sp_boot_rom_version' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:boot_rom_version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/boot_volume.rb000066400000000000000000000007241470204764400304430ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class BootVolume FACT_NAME = 'system_profiler.boot_volume' ALIASES = 'sp_boot_volume' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:boot_volume) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/computer_name.rb000066400000000000000000000007361470204764400307520ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class ComputerName FACT_NAME = 'system_profiler.computer_name' ALIASES = 'sp_local_host_name' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:computer_name) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/cores.rb000066400000000000000000000007311470204764400272220ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class Cores FACT_NAME = 'system_profiler.cores' ALIASES = 'sp_number_processors' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:total_number_of_cores) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/hardware_uuid.rb000066400000000000000000000007341470204764400307350ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class HardwareUuid FACT_NAME = 'system_profiler.hardware_uuid' ALIASES = 'sp_platform_uuid' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:hardware_uuid) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/kernel_version.rb000066400000000000000000000007401470204764400311340ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class KernelVersion FACT_NAME = 'system_profiler.kernel_version' ALIASES = 'sp_kernel_version' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:kernel_version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/l2_cache_per_core.rb000066400000000000000000000007461470204764400314330ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class L2CachePerCore FACT_NAME = 'system_profiler.l2_cache_per_core' ALIASES = 'sp_l2_cache_core' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:l2_cache_per_core) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/l3_cache.rb000066400000000000000000000007101470204764400275450ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class L3Cache FACT_NAME = 'system_profiler.l3_cache' ALIASES = 'sp_l3_cache' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:l3_cache) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/memory.rb000066400000000000000000000007121470204764400274160ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class Memory FACT_NAME = 'system_profiler.memory' ALIASES = 'sp_physical_memory' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:memory) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/model_identifier.rb000066400000000000000000000007451470204764400314160ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class ModelIdentifier FACT_NAME = 'system_profiler.model_identifier' ALIASES = 'sp_machine_model' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:model_identifier) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/model_name.rb000066400000000000000000000007221470204764400302070ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class ModelName FACT_NAME = 'system_profiler.model_name' ALIASES = 'sp_machine_name' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:model_name) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/processor_name.rb000066400000000000000000000007321470204764400311270ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class ProcessorName FACT_NAME = 'system_profiler.processor_name' ALIASES = 'sp_cpu_type' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:processor_name) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/processor_speed.rb000066400000000000000000000007541470204764400313130ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class ProcessorSpeed FACT_NAME = 'system_profiler.processor_speed' ALIASES = 'sp_current_processor_speed' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:processor_speed) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/processors.rb000066400000000000000000000007311470204764400303110ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class Processors FACT_NAME = 'system_profiler.processors' ALIASES = 'sp_packages' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:number_of_processors) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/secure_virtual_memory.rb000066400000000000000000000007571470204764400325430ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class SecureVirtualMemory FACT_NAME = 'system_profiler.secure_virtual_memory' ALIASES = 'sp_secure_vm' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:secure_virtual_memory) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/serial_number.rb000066400000000000000000000007431470204764400307410ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class SerialNumber FACT_NAME = 'system_profiler.serial_number' ALIASES = 'sp_serial_number' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:serial_number_system) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/smc_version.rb000066400000000000000000000007421470204764400304400ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class SmcVersion FACT_NAME = 'system_profiler.smc_version' ALIASES = 'sp_smc_version_system' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:smc_version_system) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/system_version.rb000066400000000000000000000007341470204764400312030ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class SystemVersion FACT_NAME = 'system_profiler.system_version' ALIASES = 'sp_os_version' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:system_version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/uptime.rb000066400000000000000000000007121470204764400274110ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class Uptime FACT_NAME = 'system_profiler.uptime' ALIASES = 'sp_uptime' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:time_since_boot) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_profiler/username.rb000066400000000000000000000007131470204764400277260ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemProfiler class Username FACT_NAME = 'system_profiler.username' ALIASES = 'sp_user_name' def call_the_resolver fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:user_name) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_uptime/000077500000000000000000000000001470204764400252425ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_uptime/days.rb000066400000000000000000000006511470204764400265310ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemUptime class Days FACT_NAME = 'system_uptime.days' ALIASES = 'uptime_days' def call_the_resolver fact_value = Facter::Resolvers::Uptime.resolve(:days) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_uptime/hours.rb000066400000000000000000000006551470204764400267350ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemUptime class Hours FACT_NAME = 'system_uptime.hours' ALIASES = 'uptime_hours' def call_the_resolver fact_value = Facter::Resolvers::Uptime.resolve(:hours) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_uptime/seconds.rb000066400000000000000000000006651470204764400272340ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemUptime class Seconds FACT_NAME = 'system_uptime.seconds' ALIASES = 'uptime_seconds' def call_the_resolver fact_value = Facter::Resolvers::Uptime.resolve(:seconds) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/system_uptime/uptime.rb000066400000000000000000000006521470204764400270750ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx module SystemUptime class Uptime FACT_NAME = 'system_uptime.uptime' ALIASES = 'uptime' def call_the_resolver fact_value = Facter::Resolvers::Uptime.resolve(:uptime) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/timezone.rb000066400000000000000000000004411470204764400245110ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class Timezone FACT_NAME = 'timezone' def call_the_resolver fact_value = Facter::Resolvers::Timezone.resolve(:timezone) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/macosx/virtual.rb000066400000000000000000000016271470204764400243540ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Macosx class Virtual FACT_NAME = 'virtual' def call_the_resolver fact_value = check_vmware || check_virtualbox || check_parallels || 'physical' Facter::ResolvedFact.new(FACT_NAME, fact_value) end private def check_vmware model_identifier = Facter::Resolvers::Macosx::SystemProfiler.resolve(:model_identifier) 'vmware' if model_identifier&.start_with?('VMware') end def check_virtualbox boot_rom_version = Facter::Resolvers::Macosx::SystemProfiler.resolve(:boot_rom_version) 'virtualbox' if boot_rom_version&.start_with?('VirtualBox') end def check_parallels subsystem_vendor_id = Facter::Resolvers::Macosx::SystemProfiler.resolve(:subsystem_vendor_id) 'parallels' if subsystem_vendor_id&.start_with?('0x1ab8') end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/mageia/000077500000000000000000000000001470204764400222645ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/mageia/os/000077500000000000000000000000001470204764400227055ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/mageia/os/release.rb000066400000000000000000000022571470204764400246600ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Mageia module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver version = from_specific_file || from_os_release return Facter::ResolvedFact.new(FACT_NAME, nil) unless version [Facter::ResolvedFact.new(FACT_NAME, version), Facter::ResolvedFact.new(ALIASES.first, version['major'], :legacy), Facter::ResolvedFact.new(ALIASES.last, version['full'], :legacy)] end def from_specific_file version = Facter::Resolvers::SpecificReleaseFile.resolve(:release, { release_file: '/etc/mageia-release', regex: /Mageia release ([0-9.]+)/ }) Facter::Util::Facts.release_hash_from_matchdata(version) end def from_os_release version = Facter::Resolvers::OsRelease.resolve(:version_id) Facter::Util::Facts.release_hash_from_string(version) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/mariner/000077500000000000000000000000001470204764400224765ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/mariner/os/000077500000000000000000000000001470204764400231175ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/mariner/os/release.rb000066400000000000000000000022551470204764400250700ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Mariner module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver version = from_specific_file || from_os_release return Facter::ResolvedFact.new(FACT_NAME, nil) unless version [Facter::ResolvedFact.new(FACT_NAME, version), Facter::ResolvedFact.new(ALIASES.first, version['major'], :legacy), Facter::ResolvedFact.new(ALIASES.last, version['full'], :legacy)] end def from_specific_file version = Facter::Resolvers::SpecificReleaseFile.resolve(:release, { release_file: '/etc/mariner-release', regex: /CBL-Mariner ([0-9.]+)/ }) Facter::Util::Facts.release_hash_from_matchdata(version) end def from_os_release version = Facter::Resolvers::OsRelease.resolve(:version_id) Facter::Util::Facts.release_hash_from_string(version) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/meego/000077500000000000000000000000001470204764400221355ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/meego/os/000077500000000000000000000000001470204764400225565ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/meego/os/release.rb000066400000000000000000000016171470204764400245300ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Meego module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver version = determine_release_version return Facter::ResolvedFact.new(FACT_NAME, nil) unless version [Facter::ResolvedFact.new(FACT_NAME, version), Facter::ResolvedFact.new(ALIASES.first, version['major'], :legacy), Facter::ResolvedFact.new(ALIASES.last, version['full'], :legacy)] end def determine_release_version version = Facter::Resolvers::ReleaseFromFirstLine.resolve(:release, release_file: '/etc/meego-release') version ||= Facter::Resolvers::OsRelease.resolve(:version_id) Facter::Util::Facts.release_hash_from_string(version) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/oel/000077500000000000000000000000001470204764400216205ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/oel/os/000077500000000000000000000000001470204764400222415ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/oel/os/release.rb000066400000000000000000000016221470204764400242070ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Oel module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver version = determine_release_version return Facter::ResolvedFact.new(FACT_NAME, nil) unless version [Facter::ResolvedFact.new(FACT_NAME, version), Facter::ResolvedFact.new(ALIASES.first, version['major'], :legacy), Facter::ResolvedFact.new(ALIASES.last, version['full'], :legacy)] end def determine_release_version version = Facter::Resolvers::ReleaseFromFirstLine.resolve(:release, release_file: '/etc/enterprise-release') version ||= Facter::Resolvers::OsRelease.resolve(:version_id) Facter::Util::Facts.release_hash_from_string(version) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/ol/000077500000000000000000000000001470204764400214535ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/ol/lsbdistdescription.rb000066400000000000000000000005251470204764400257120ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Ol class Lsbdistdescription FACT_NAME = 'lsbdistdescription' TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:description) Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/ol/lsbdistid.rb000066400000000000000000000005061470204764400237620ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Ol class Lsbdistid FACT_NAME = 'lsbdistid' TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:distributor_id) Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/ol/os/000077500000000000000000000000001470204764400220745ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/ol/os/distro/000077500000000000000000000000001470204764400234005ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/ol/os/distro/description.rb000066400000000000000000000006021470204764400262460ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Ol module Os module Distro class Description FACT_NAME = 'os.distro.description' def call_the_resolver fact_value = Facter::Resolvers::OsRelease.resolve(:pretty_name) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/ol/os/distro/id.rb000066400000000000000000000005621470204764400243240ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Ol module Os module Distro class Id FACT_NAME = 'os.distro.id' def call_the_resolver fact_value = Facter::Resolvers::OsRelease.resolve(:id).capitalize Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/ol/os/release.rb000066400000000000000000000016151470204764400240440ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Ol module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver version = determine_release_version return Facter::ResolvedFact.new(FACT_NAME, nil) unless version [Facter::ResolvedFact.new(FACT_NAME, version), Facter::ResolvedFact.new(ALIASES.first, version['major'], :legacy), Facter::ResolvedFact.new(ALIASES.last, version['full'], :legacy)] end def determine_release_version version = Facter::Resolvers::ReleaseFromFirstLine.resolve(:release, release_file: '/etc/oracle-release') version ||= Facter::Resolvers::OsRelease.resolve(:version_id) Facter::Util::Facts.release_hash_from_string(version) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/000077500000000000000000000000001470204764400224735ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/augeas/000077500000000000000000000000001470204764400237405ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/augeas/version.rb000066400000000000000000000006731470204764400257600ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Augeas class Version FACT_NAME = 'augeas.version' ALIASES = 'augeasversion' def call_the_resolver fact_value = Facter::Resolvers::Augeas.resolve(:augeas_version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/dmi/000077500000000000000000000000001470204764400232445ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/dmi/bios/000077500000000000000000000000001470204764400242005ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/dmi/bios/vendor.rb000066400000000000000000000007351470204764400260270ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Dmi module Bios class Vendor FACT_NAME = 'dmi.bios.vendor' ALIASES = 'bios_vendor' def call_the_resolver fact_value = Facter::Resolvers::Openbsd::DmiBios.resolve(:bios_vendor) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/dmi/bios/version.rb000066400000000000000000000007411470204764400262140ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Dmi module Bios class Version FACT_NAME = 'dmi.bios.version' ALIASES = 'bios_version' def call_the_resolver fact_value = Facter::Resolvers::Openbsd::DmiBios.resolve(:bios_version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/dmi/manufacturer.rb000066400000000000000000000006701470204764400262700ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Dmi class Manufacturer FACT_NAME = 'dmi.manufacturer' ALIASES = 'manufacturer' def call_the_resolver fact_value = Facter::Resolvers::Openbsd::DmiBios.resolve(:sys_vendor) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/dmi/product/000077500000000000000000000000001470204764400247245ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/dmi/product/name.rb000066400000000000000000000007401470204764400261720ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Dmi module Product class Name FACT_NAME = 'dmi.product.name' ALIASES = 'productname' def call_the_resolver fact_value = Facter::Resolvers::Openbsd::DmiBios.resolve(:product_name) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/dmi/product/serial_number.rb000066400000000000000000000007641470204764400301070ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Dmi module Product class SerialNumber FACT_NAME = 'dmi.product.serial_number' ALIASES = 'serialnumber' def call_the_resolver fact_value = Facter::Resolvers::Openbsd::DmiBios.resolve(:product_serial) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/dmi/product/uuid.rb000066400000000000000000000007311470204764400262200ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Dmi module Product class Uuid FACT_NAME = 'dmi.product.uuid' ALIASES = 'uuid' def call_the_resolver fact_value = Facter::Resolvers::Openbsd::DmiBios.resolve(:product_uuid) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/ec2_metadata.rb000066400000000000000000000010241470204764400253260ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd class Ec2Metadata FACT_NAME = 'ec2_metadata' def call_the_resolver return Facter::ResolvedFact.new(FACT_NAME, nil) unless aws_hypervisors? fact_value = Facter::Resolvers::Ec2.resolve(:metadata) Facter::ResolvedFact.new(FACT_NAME, fact_value&.empty? ? nil : fact_value) end private def aws_hypervisors? Facter::Util::Facts::Posix::VirtualDetector.platform =~ /kvm|xen|aws/ end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/ec2_userdata.rb000066400000000000000000000010241470204764400253560ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd class Ec2Userdata FACT_NAME = 'ec2_userdata' def call_the_resolver return Facter::ResolvedFact.new(FACT_NAME, nil) unless aws_hypervisors? fact_value = Facter::Resolvers::Ec2.resolve(:userdata) Facter::ResolvedFact.new(FACT_NAME, fact_value&.empty? ? nil : fact_value) end private def aws_hypervisors? Facter::Util::Facts::Posix::VirtualDetector.platform =~ /kvm|xen|aws/ end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/facterversion.rb000066400000000000000000000004661470204764400257000ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd class Facterversion FACT_NAME = 'facterversion' def call_the_resolver fact_value = Facter::Resolvers::Facterversion.resolve(:facterversion) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/identity/000077500000000000000000000000001470204764400243245ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/identity/gid.rb000066400000000000000000000005121470204764400254120ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Identity class Gid FACT_NAME = 'identity.gid' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:gid) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/identity/group.rb000066400000000000000000000006431470204764400260100ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Identity class Group FACT_NAME = 'identity.group' ALIASES = 'gid' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:group) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/identity/privileged.rb000066400000000000000000000005371470204764400270100ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Identity class Privileged FACT_NAME = 'identity.privileged' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:privileged) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/identity/uid.rb000066400000000000000000000005121470204764400254300ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Identity class Uid FACT_NAME = 'identity.uid' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:uid) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/identity/user.rb000066400000000000000000000006361470204764400256340ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Identity class User FACT_NAME = 'identity.user' ALIASES = 'id' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:user) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/ipaddress6_interfaces.rb000066400000000000000000000007361470204764400272750ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd class Ipaddress6Interfaces FACT_NAME = 'ipaddress6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("ipaddress6_#{interface_name}", info[:ip6], :legacy) if info[:ip6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/ipaddress_interfaces.rb000066400000000000000000000007311470204764400272020ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd class IpaddressInterfaces FACT_NAME = 'ipaddress_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("ipaddress_#{interface_name}", info[:ip], :legacy) if info[:ip] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/is_virtual.rb000066400000000000000000000007051470204764400252030ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd class IsVirtual FACT_NAME = 'is_virtual' def call_the_resolver fact_value = Facter::Util::Facts::Posix::VirtualDetector.platform Facter::ResolvedFact.new(FACT_NAME, check_if_virtual(fact_value)) end private def check_if_virtual(found_vm) Facter::Util::Facts::PHYSICAL_HYPERVISORS.count(found_vm).zero? end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/kernel.rb000066400000000000000000000004351470204764400243020ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd class Kernel FACT_NAME = 'kernel' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:kernelname) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/kernelrelease.rb000066400000000000000000000004561470204764400256460ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd class Kernelrelease FACT_NAME = 'kernelrelease' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:kernelrelease) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/mountpoints.rb000066400000000000000000000010051470204764400254130ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd class Mountpoints FACT_NAME = 'mountpoints' def call_the_resolver mountpoints = Facter::Resolvers::Openbsd::Mountpoints.resolve(FACT_NAME.to_sym) return Facter::ResolvedFact.new(FACT_NAME, nil) unless mountpoints fact = {} mountpoints.each do |path, mnt| fact[path.to_sym] = mnt.reject { |k| k == :path } end Facter::ResolvedFact.new(FACT_NAME, fact) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/netmask6_interfaces.rb000066400000000000000000000007421470204764400267560ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd class Netmask6Interfaces FACT_NAME = 'netmask6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("netmask6_#{interface_name}", info[:netmask6], :legacy) if info[:netmask6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/netmask_interfaces.rb000066400000000000000000000007351470204764400266720ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd class NetmaskInterfaces FACT_NAME = 'netmask_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("netmask_#{interface_name}", info[:netmask], :legacy) if info[:netmask] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/network6_interfaces.rb000066400000000000000000000007421470204764400270050ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd class Network6Interfaces FACT_NAME = 'network6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("network6_#{interface_name}", info[:network6], :legacy) if info[:network6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/network_interfaces.rb000066400000000000000000000007351470204764400267210ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd class NetworkInterfaces FACT_NAME = 'network_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("network_#{interface_name}", info[:network], :legacy) if info[:network] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/networking/000077500000000000000000000000001470204764400246625ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/networking/dhcp.rb000066400000000000000000000005231470204764400261250ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Networking class Dhcp FACT_NAME = 'networking.dhcp' def call_the_resolver fact_value = Facter::Resolvers::Openbsd::Dhcp.resolve(:dhcp) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/networking/domain.rb000066400000000000000000000006511470204764400264600ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Networking class Domain FACT_NAME = 'networking.domain' ALIASES = 'domain' def call_the_resolver fact_value = Facter::Resolvers::Hostname.resolve(:domain) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/networking/fqdn.rb000066400000000000000000000006411470204764400261400ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Networking class Fqdn FACT_NAME = 'networking.fqdn' ALIASES = 'fqdn' def call_the_resolver fact_value = Facter::Resolvers::Hostname.resolve(:fqdn) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/networking/hostname.rb000066400000000000000000000006611470204764400270300ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Networking class Hostname FACT_NAME = 'networking.hostname' ALIASES = 'hostname' def call_the_resolver fact_value = Facter::Resolvers::Hostname.resolve(:hostname) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/networking/interfaces.rb000066400000000000000000000005421470204764400273330ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Networking class Interfaces FACT_NAME = 'networking.interfaces' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:interfaces) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/networking/ip.rb000066400000000000000000000006421470204764400256210ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Networking class Ip FACT_NAME = 'networking.ip' ALIASES = 'ipaddress' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:ip) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/networking/ip6.rb000066400000000000000000000006461470204764400257130ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Networking class Ip6 FACT_NAME = 'networking.ip6' ALIASES = 'ipaddress6' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:ip6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/networking/mac.rb000066400000000000000000000006461470204764400257550ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Networking class Mac FACT_NAME = 'networking.mac' ALIASES = 'macaddress' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:mac) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/networking/mtu.rb000066400000000000000000000005151470204764400260150ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Networking class Mtu FACT_NAME = 'networking.mtu' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:mtu) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/networking/netmask.rb000066400000000000000000000006571470204764400266610ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Networking class Netmask FACT_NAME = 'networking.netmask' ALIASES = 'netmask' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:netmask) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/networking/netmask6.rb000066400000000000000000000006631470204764400267440ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Networking class Netmask6 FACT_NAME = 'networking.netmask6' ALIASES = 'netmask6' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:netmask6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/networking/network.rb000066400000000000000000000006571470204764400267100ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Networking class Network FACT_NAME = 'networking.network' ALIASES = 'network' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:network) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/networking/network6.rb000066400000000000000000000006631470204764400267730ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Networking class Network6 FACT_NAME = 'networking.network6' ALIASES = 'network6' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:network6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/networking/primary.rb000066400000000000000000000005431470204764400266740ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Networking class Primary FACT_NAME = 'networking.primary' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:primary_interface) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/networking/scope6.rb000066400000000000000000000005261470204764400264110ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Networking class Scope6 FACT_NAME = 'networking.scope6' def call_the_resolver fact_value = Facter::Resolvers::Networking.resolve(:scope6) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/os/000077500000000000000000000000001470204764400231145ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/os/architecture.rb000066400000000000000000000006511470204764400261250ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Os class Architecture FACT_NAME = 'os.architecture' ALIASES = 'architecture' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:machine) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/os/hardware.rb000066400000000000000000000006421470204764400252400ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Os class Hardware FACT_NAME = 'os.hardware' ALIASES = 'hardwaremodel' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:machine) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/os/name.rb000066400000000000000000000006371470204764400243670ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Os class Name FACT_NAME = 'os.name' ALIASES = 'operatingsystem' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:kernelname) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/os/release.rb000066400000000000000000000013251470204764400250620ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver # From Freebsd # Facter::ResolvedFact.new(ALIASES.last, installed_userland, :legacy)] version = Facter::Resolvers::Uname.resolve(:kernelrelease) major, minor = version.split('.') [Facter::ResolvedFact.new(FACT_NAME, full: version, major: major, minor: minor), Facter::ResolvedFact.new(ALIASES.first, major, :legacy), Facter::ResolvedFact.new(ALIASES.last, version, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/path.rb000066400000000000000000000004231470204764400237530ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd class Path FACT_NAME = 'path' def call_the_resolver fact_value = Facter::Resolvers::Path.resolve(:path) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/processors/000077500000000000000000000000001470204764400246755ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/processors/isa.rb000066400000000000000000000006471470204764400260050ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Processors class Isa FACT_NAME = 'processors.isa' ALIASES = 'hardwareisa' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:processor) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/ruby/000077500000000000000000000000001470204764400234545ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/ruby/platform.rb000066400000000000000000000006451470204764400256320ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Ruby class Platform FACT_NAME = 'ruby.platform' ALIASES = 'rubyplatform' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:platform) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/ruby/sitedir.rb000066400000000000000000000006411470204764400254450ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Ruby class Sitedir FACT_NAME = 'ruby.sitedir' ALIASES = 'rubysitedir' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:sitedir) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/ruby/version.rb000066400000000000000000000006411470204764400254670ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module Ruby class Version FACT_NAME = 'ruby.version' ALIASES = 'rubyversion' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/ssh.rb000066400000000000000000000011721470204764400236160ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd class Ssh FACT_NAME = 'ssh' def call_the_resolver result = Facter::Resolvers::Ssh.resolve(:ssh) ssh_facts = {} result.each { |ssh| ssh_facts.merge!(create_ssh_fact(ssh)) } Facter::ResolvedFact.new(FACT_NAME, ssh_facts) end private def create_ssh_fact(ssh) { ssh.name.to_sym => { fingerprints: { sha1: ssh.fingerprint.sha1, sha256: ssh.fingerprint.sha256 }, key: ssh.key, type: ssh.type } } end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/sshalgorithmkey.rb000066400000000000000000000006071470204764400262400ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd class Sshalgorithmkey FACT_NAME = 'ssh.*key' TYPE = :legacy def call_the_resolver facts = [] result = Facter::Resolvers::Ssh.resolve(:ssh) result.each { |ssh| facts << Facter::ResolvedFact.new("ssh#{ssh.name.to_sym}key", ssh.key, :legacy) } facts end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/sshfp_algorithm.rb000066400000000000000000000007641470204764400262200ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd class SshfpAlgorithm FACT_NAME = 'sshfp_.*' TYPE = :legacy def call_the_resolver facts = [] result = Facter::Resolvers::Ssh.resolve(:ssh) result.each do |ssh| facts << Facter::ResolvedFact.new("sshfp_#{ssh.name.to_sym}", "#{ssh.fingerprint.sha1}\n#{ssh.fingerprint.sha256}", :legacy) end facts end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/system_uptime/000077500000000000000000000000001470204764400254025ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/system_uptime/days.rb000066400000000000000000000006531470204764400266730ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module SystemUptime class Days FACT_NAME = 'system_uptime.days' ALIASES = 'uptime_days' def call_the_resolver fact_value = Facter::Resolvers::Uptime.resolve(:days) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/system_uptime/hours.rb000066400000000000000000000006571470204764400270770ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module SystemUptime class Hours FACT_NAME = 'system_uptime.hours' ALIASES = 'uptime_hours' def call_the_resolver fact_value = Facter::Resolvers::Uptime.resolve(:hours) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/system_uptime/seconds.rb000066400000000000000000000006671470204764400273760ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module SystemUptime class Seconds FACT_NAME = 'system_uptime.seconds' ALIASES = 'uptime_seconds' def call_the_resolver fact_value = Facter::Resolvers::Uptime.resolve(:seconds) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/system_uptime/uptime.rb000066400000000000000000000006541470204764400272370ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd module SystemUptime class Uptime FACT_NAME = 'system_uptime.uptime' ALIASES = 'uptime' def call_the_resolver fact_value = Facter::Resolvers::Uptime.resolve(:uptime) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/timezone.rb000066400000000000000000000004431470204764400246530ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd class Timezone FACT_NAME = 'timezone' def call_the_resolver fact_value = Facter::Resolvers::Timezone.resolve(:timezone) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openbsd/virtual.rb000066400000000000000000000004471470204764400245130ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openbsd class Virtual FACT_NAME = 'virtual' def call_the_resolver fact_value = Facter::Util::Facts::Posix::VirtualDetector.platform Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/openwrt/000077500000000000000000000000001470204764400225375ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/openwrt/os/000077500000000000000000000000001470204764400231605ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/openwrt/os/release.rb000066400000000000000000000022441470204764400251270ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Openwrt module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver version = from_specific_file || from_os_release return Facter::ResolvedFact.new(FACT_NAME, nil) unless version [Facter::ResolvedFact.new(FACT_NAME, version), Facter::ResolvedFact.new(ALIASES.first, version['major'], :legacy), Facter::ResolvedFact.new(ALIASES.last, version['full'], :legacy)] end def from_specific_file version = Facter::Resolvers::SpecificReleaseFile.resolve(:release, { release_file: '/etc/openwrt_version', regex: /^(\d+.\d+.*)/ }) Facter::Util::Facts.release_hash_from_matchdata(version) end def from_os_release version = Facter::Resolvers::OsRelease.resolve(:version_id) Facter::Util::Facts.release_hash_from_string(version) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/ovs/000077500000000000000000000000001470204764400216505ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/ovs/os/000077500000000000000000000000001470204764400222715ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/ovs/os/release.rb000066400000000000000000000016131470204764400242370ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Ovs module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver version = determine_release_version return Facter::ResolvedFact.new(FACT_NAME, nil) unless version [Facter::ResolvedFact.new(FACT_NAME, version), Facter::ResolvedFact.new(ALIASES.first, version['major'], :legacy), Facter::ResolvedFact.new(ALIASES.last, version['full'], :legacy)] end def determine_release_version version = Facter::Resolvers::ReleaseFromFirstLine.resolve(:release, release_file: '/etc/ovs-release') version ||= Facter::Resolvers::OsRelease.resolve(:version_id) Facter::Util::Facts.release_hash_from_string(version) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/photon/000077500000000000000000000000001470204764400223505ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/photon/os/000077500000000000000000000000001470204764400227715ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/photon/os/release.rb000066400000000000000000000026361470204764400247450ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Photon module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver version = from_specific_file || from_os_release return Facter::ResolvedFact.new(FACT_NAME, nil) unless version [Facter::ResolvedFact.new(FACT_NAME, version), Facter::ResolvedFact.new(ALIASES.first, version['major'], :legacy), Facter::ResolvedFact.new(ALIASES.last, version['full'], :legacy)] end def from_specific_file version = Facter::Resolvers::SpecificReleaseFile.resolve(:release, { release_file: '/etc/lsb-release', regex: /DISTRIB_RELEASE="(\d+)\.(\d+)/ }) return if version.nil? || version[1].nil? || version[2].nil? major = version[1].to_s minor = version[2].to_s version_data = "#{major}.#{minor}" { 'full' => version_data, 'major' => major, 'minor' => minor } end def from_os_release version = Facter::Resolvers::OsRelease.resolve(:version_id) Facter::Util::Facts.release_hash_from_string(version) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/rhel/000077500000000000000000000000001470204764400217735ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/rhel/lsbdistcodename.rb000066400000000000000000000005161470204764400254620ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Rhel class Lsbdistcodename FACT_NAME = 'lsbdistcodename' TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:codename) Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/rhel/lsbdistdescription.rb000066400000000000000000000005271470204764400262340ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Rhel class Lsbdistdescription FACT_NAME = 'lsbdistdescription' TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:description) Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/rhel/lsbdistid.rb000066400000000000000000000005101470204764400242750ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Rhel class Lsbdistid FACT_NAME = 'lsbdistid' TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:distributor_id) Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/rhel/os/000077500000000000000000000000001470204764400224145ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/rhel/os/distro/000077500000000000000000000000001470204764400237205ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/rhel/os/distro/codename.rb000066400000000000000000000005771470204764400260310ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Rhel module Os module Distro class Codename FACT_NAME = 'os.distro.codename' def call_the_resolver fact_value = Facter::Resolvers::RedHatRelease.resolve(:codename) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/rhel/os/distro/description.rb000066400000000000000000000006101470204764400265650ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Rhel module Os module Distro class Description FACT_NAME = 'os.distro.description' def call_the_resolver fact_value = Facter::Resolvers::RedHatRelease.resolve(:description) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/rhel/os/distro/id.rb000066400000000000000000000005711470204764400246440ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Rhel module Os module Distro class Id FACT_NAME = 'os.distro.id' def call_the_resolver fact_value = Facter::Resolvers::RedHatRelease.resolve(:distributor_id) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/rhel/os/distro/release.rb000066400000000000000000000017651470204764400256760ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Rhel module Os module Distro class Release FACT_NAME = 'os.distro.release' ALIASES = %w[lsbdistrelease lsbmajdistrelease lsbminordistrelease].freeze def call_the_resolver version = determine_release_version return Facter::ResolvedFact.new(FACT_NAME, nil) unless version [Facter::ResolvedFact.new(FACT_NAME, version), Facter::ResolvedFact.new(ALIASES[0], version['full'], :legacy), Facter::ResolvedFact.new(ALIASES[1], version['major'], :legacy), Facter::ResolvedFact.new(ALIASES[2], version['minor'], :legacy)] end def determine_release_version version = Facter::Resolvers::RedHatRelease.resolve(:version) version ||= Facter::Resolvers::OsRelease.resolve(:version_id) Facter::Util::Facts.release_hash_from_string(version) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/rhel/os/family.rb000066400000000000000000000005171470204764400242250ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Rhel module Os class Family FACT_NAME = 'os.family' ALIASES = 'osfamily' def call_the_resolver [Facter::ResolvedFact.new(FACT_NAME, 'RedHat'), Facter::ResolvedFact.new(ALIASES, 'RedHat', :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/rhel/os/name.rb000066400000000000000000000007431470204764400236650ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Rhel module Os class Name FACT_NAME = 'os.name' ALIASES = 'operatingsystem' def call_the_resolver fact_value = Facter::Resolvers::OsRelease.resolve(:name) fact_value ||= Facter::Resolvers::RedHatRelease.resolve(:name) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/rhel/os/release.rb000066400000000000000000000015431470204764400243640ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Rhel module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver version = determine_release_version return Facter::ResolvedFact.new(FACT_NAME, nil) unless version [Facter::ResolvedFact.new(FACT_NAME, version), Facter::ResolvedFact.new(ALIASES.first, version['major'], :legacy), Facter::ResolvedFact.new(ALIASES.last, version['full'], :legacy)] end def determine_release_version version = Facter::Resolvers::RedHatRelease.resolve(:version) version ||= Facter::Resolvers::OsRelease.resolve(:version_id) Facter::Util::Facts.release_hash_from_string(version) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/slackware/000077500000000000000000000000001470204764400230155ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/slackware/os/000077500000000000000000000000001470204764400234365ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/slackware/os/release.rb000066400000000000000000000022571470204764400254110ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Slackware module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver version = from_specific_file || from_os_release return Facter::ResolvedFact.new(FACT_NAME, nil) unless version [Facter::ResolvedFact.new(FACT_NAME, version), Facter::ResolvedFact.new(ALIASES.first, version['major'], :legacy), Facter::ResolvedFact.new(ALIASES.last, version['full'], :legacy)] end def from_specific_file version = Facter::Resolvers::SpecificReleaseFile.resolve(:release, { release_file: '/etc/slackware-version', regex: /Slackware ([0-9.]+)/ }) Facter::Util::Facts.release_hash_from_matchdata(version) end def from_os_release version = Facter::Resolvers::OsRelease.resolve(:version_id) Facter::Util::Facts.release_hash_from_string(version) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/sles/000077500000000000000000000000001470204764400220075ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/sles/lsbdistcodename.rb000066400000000000000000000005161470204764400254760ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Sles class Lsbdistcodename FACT_NAME = 'lsbdistcodename' TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:codename) Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/sles/lsbdistdescription.rb000066400000000000000000000005271470204764400262500ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Sles class Lsbdistdescription FACT_NAME = 'lsbdistdescription' TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:description) Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/sles/lsbdistid.rb000066400000000000000000000005101470204764400243110ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Sles class Lsbdistid FACT_NAME = 'lsbdistid' TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:distributor_id) Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/sles/os/000077500000000000000000000000001470204764400224305ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/sles/os/distro/000077500000000000000000000000001470204764400237345ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/sles/os/distro/codename.rb000066400000000000000000000007061470204764400260370ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Sles module Os module Distro class Codename FACT_NAME = 'os.distro.codename' def call_the_resolver fact_value = Facter::Resolvers::OsRelease.resolve(:version_codename) fact_value = 'n/a' if !fact_value || fact_value.empty? Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/sles/os/distro/description.rb000066400000000000000000000006031470204764400266030ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Sles module Os module Distro class Description FACT_NAME = 'os.distro.description' def call_the_resolver fact_value = Facter::Resolvers::OsRelease.resolve(:pretty_name) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/sles/os/distro/id.rb000066400000000000000000000010121470204764400246470ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Sles module Os module Distro class Id FACT_NAME = 'os.distro.id' def call_the_resolver fact_value = if Facter::Resolvers::OsRelease.resolve(:version_id).start_with?('12') 'SUSE LINUX' else 'SUSE' end Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/sles/os/distro/release.rb000066400000000000000000000021061470204764400257000ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Sles module Os module Distro class Release FACT_NAME = 'os.distro.release' ALIASES = %w[lsbdistrelease lsbmajdistrelease lsbminordistrelease].freeze def call_the_resolver version = Facter::Resolvers::OsRelease.resolve(:version_id) fact_value = build_fact_list(version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES[0], fact_value[:full], :legacy), Facter::ResolvedFact.new(ALIASES[1], fact_value[:major], :legacy), Facter::ResolvedFact.new(ALIASES[2], fact_value[:minor], :legacy)] end def build_fact_list(version) if version.include?('.') { full: version, major: version.split('.').first, minor: version.split('.').last } else { full: version, major: version, minor: nil } end end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/sles/os/family.rb000066400000000000000000000005131470204764400242350ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Sles module Os class Family FACT_NAME = 'os.family' ALIASES = 'osfamily' def call_the_resolver [Facter::ResolvedFact.new(FACT_NAME, 'Suse'), Facter::ResolvedFact.new(ALIASES, 'Suse', :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/sles/os/release.rb000066400000000000000000000014421470204764400243760ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Sles module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver version = Facter::Resolvers::OsRelease.resolve(:version_id) fact_value = build_fact_list(version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES.first, fact_value[:major], :legacy), Facter::ResolvedFact.new(ALIASES.last, fact_value[:full], :legacy)] end def build_fact_list(version) { full: version, major: version.split('.').first, minor: version.split('.').last } end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/000077500000000000000000000000001470204764400225155ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/aio_agent_version.rb000066400000000000000000000005021470204764400265320ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class AioAgentVersion FACT_NAME = 'aio_agent_version' def call_the_resolver fact_value = Facter::Resolvers::AioAgentVersion.resolve(:aio_agent_version) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/augeas/000077500000000000000000000000001470204764400237625ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/augeas/version.rb000066400000000000000000000006731470204764400260020ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Augeas class Version FACT_NAME = 'augeas.version' ALIASES = 'augeasversion' def call_the_resolver fact_value = Facter::Resolvers::Augeas.resolve(:augeas_version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/current_zone.rb000066400000000000000000000006321470204764400255600ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class CurrentZone FACT_NAME = 'solaris_zones.current' ALIASES = 'zonename' def call_the_resolver fact_value = Facter::Resolvers::Solaris::ZoneName.resolve(:current_zone_name) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/dhcp_servers.rb000066400000000000000000000014331470204764400255320ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class DhcpServers FACT_NAME = 'dhcp_servers' TYPE = :legacy def call_the_resolver fact_value = construct_addresses_hash fact_value = !fact_value || fact_value.empty? ? nil : fact_value Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy) end private def construct_addresses_hash primary_dhcp = Facter::Resolvers::Solaris::Networking.resolve(:dhcp) interfaces = Facter::Resolvers::Solaris::Networking.resolve(:interfaces) return unless interfaces servers = { system: primary_dhcp } interfaces&.each { |interface_name, info| servers[interface_name] = info[:dhcp] if info[:dhcp] } servers end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/disks.rb000066400000000000000000000017601470204764400241630ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class Disks FACT_NAME = 'disks' ALIASES = %w[blockdevices blockdevice_.*_size blockdevice_.*_vendor].freeze def call_the_resolver facts = [] disks = Facter::Resolvers::Solaris::Disks.resolve(:disks) return Facter::ResolvedFact.new(FACT_NAME, nil) if disks.nil? || disks.empty? blockdevices = disks.keys.join(',') facts.push(Facter::ResolvedFact.new(FACT_NAME, disks)) facts.push(Facter::ResolvedFact.new('blockdevices', blockdevices, :legacy)) add_legacy_facts(disks, facts) facts end private def add_legacy_facts(disks, facts) disks.each do |disk_name, disk_info| facts.push(Facter::ResolvedFact.new("blockdevice_#{disk_name}_size", disk_info[:size_bytes], :legacy)) facts.push(Facter::ResolvedFact.new("blockdevice_#{disk_name}_vendor", disk_info[:vendor], :legacy)) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/dmi/000077500000000000000000000000001470204764400232665ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/dmi/bios/000077500000000000000000000000001470204764400242225ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/dmi/bios/release_date.rb000066400000000000000000000011701470204764400271630ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Dmi module Bios class ReleaseDate FACT_NAME = 'dmi.bios.release_date' ALIASES = 'bios_release_date' def call_the_resolver fact_value = nil fact_value = Facter::Resolvers::Solaris::Dmi.resolve(:bios_release_date) if isa == 'i386' [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end def isa Facter::Resolvers::Uname.resolve(:processor) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/dmi/bios/vendor.rb000066400000000000000000000011411470204764400260410ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Dmi module Bios class Vendor FACT_NAME = 'dmi.bios.vendor' ALIASES = 'bios_vendor' def call_the_resolver fact_value = nil fact_value = Facter::Resolvers::Solaris::Dmi.resolve(:bios_vendor) if isa == 'i386' [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end def isa Facter::Resolvers::Uname.resolve(:processor) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/dmi/bios/version.rb000066400000000000000000000011451470204764400262350ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Dmi module Bios class Version FACT_NAME = 'dmi.bios.version' ALIASES = 'bios_version' def call_the_resolver fact_value = nil fact_value = Facter::Resolvers::Solaris::Dmi.resolve(:bios_version) if isa == 'i386' [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end def isa Facter::Resolvers::Uname.resolve(:processor) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/dmi/chassis/000077500000000000000000000000001470204764400247235ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/dmi/chassis/asset_tag.rb000066400000000000000000000011661470204764400272260ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Dmi module Chassis class AssetTag FACT_NAME = 'dmi.chassis.asset_tag' ALIASES = 'chassisassettag' def call_the_resolver fact_value = nil fact_value = Facter::Resolvers::Solaris::Dmi.resolve(:chassis_asset_tag) if isa == 'i386' [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end def isa Facter::Resolvers::Uname.resolve(:processor) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/dmi/chassis/type.rb000066400000000000000000000011441470204764400262310ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Dmi module Chassis class Type FACT_NAME = 'dmi.chassis.type' ALIASES = 'chassistype' def call_the_resolver fact_value = nil fact_value = Facter::Resolvers::Solaris::Dmi.resolve(:chassis_type) if isa == 'i386' [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end def isa Facter::Resolvers::Uname.resolve(:processor) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/dmi/manufacturer.rb000066400000000000000000000013201470204764400263030ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Dmi class Manufacturer FACT_NAME = 'dmi.manufacturer' ALIASES = 'manufacturer' def call_the_resolver fact_value = if isa == 'i386' Facter::Resolvers::Solaris::Dmi.resolve(:manufacturer) elsif isa == 'sparc' Facter::Resolvers::Solaris::DmiSparc.resolve(:manufacturer) end [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end def isa Facter::Resolvers::Uname.resolve(:processor) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/dmi/product/000077500000000000000000000000001470204764400247465ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/dmi/product/name.rb000066400000000000000000000014041470204764400262120ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Dmi module Product class Name FACT_NAME = 'dmi.product.name' ALIASES = 'productname' def call_the_resolver fact_value = if isa == 'i386' Facter::Resolvers::Solaris::Dmi.resolve(:product_name) elsif isa == 'sparc' Facter::Resolvers::Solaris::DmiSparc.resolve(:product_name) end [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end def isa Facter::Resolvers::Uname.resolve(:processor) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/dmi/product/serial_number.rb000066400000000000000000000014301470204764400301200ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Dmi module Product class SerialNumber FACT_NAME = 'dmi.product.serial_number' ALIASES = 'serialnumber' def call_the_resolver fact_value = if isa == 'i386' Facter::Resolvers::Solaris::Dmi.resolve(:serial_number) elsif isa == 'sparc' Facter::Resolvers::Solaris::DmiSparc.resolve(:serial_number) end [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end def isa Facter::Resolvers::Uname.resolve(:processor) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/dmi/product/uuid.rb000066400000000000000000000011351470204764400262410ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Dmi module Product class Uuid FACT_NAME = 'dmi.product.uuid' ALIASES = 'uuid' def call_the_resolver fact_value = nil fact_value = Facter::Resolvers::Solaris::Dmi.resolve(:product_uuid) if isa == 'i386' [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end def isa Facter::Resolvers::Uname.resolve(:processor) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/facterversion.rb000066400000000000000000000004661470204764400257220ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class Facterversion FACT_NAME = 'facterversion' def call_the_resolver fact_value = Facter::Resolvers::Facterversion.resolve(:facterversion) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/filesystems.rb000066400000000000000000000004671470204764400254200ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class Filesystems FACT_NAME = 'filesystems' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Filesystem.resolve(:file_systems) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/hypervisors/000077500000000000000000000000001470204764400251125ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/hypervisors/ldom.rb000066400000000000000000000014321470204764400263720ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Hypervisors class Ldom FACT_NAME = 'hypervisors.ldom' def initialize @log = Facter::Log.new(self) end def call_the_resolver chassis_serial = Facter::Resolvers::Solaris::Ldom.resolve(:chassis_serial) return Facter::ResolvedFact.new(FACT_NAME, nil) if !chassis_serial || chassis_serial.empty? fact_value = %i[ chassis_serial control_domain domain_name domain_uuid role_control role_io role_root role_service ].map! { |key| [key, Facter::Utils.try_to_bool(Facter::Resolvers::Solaris::Ldom.resolve(key))] }.to_h Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/hypervisors/zone.rb000066400000000000000000000017241470204764400264160ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Hypervisors class Zone FACT_NAME = 'hypervisors.zone' def initialize @log = Facter::Log.new(self) end def call_the_resolver fact_value = current_zone Facter::ResolvedFact.new(FACT_NAME, fact_value) end def current_zone current_zone_name = Facter::Resolvers::Solaris::ZoneName.resolve(:current_zone_name) return unless current_zone_name zones = Facter::Resolvers::Solaris::Zone.resolve(:zone) return nil unless zones current_zone = zones.find { |r| r[:name] == current_zone_name } { brand: current_zone[:brand], id: Facter::Utils.try_to_int(current_zone[:id]), ip_type: current_zone[:iptype], name: current_zone[:name], uuid: current_zone[:uuid] } end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/identity/000077500000000000000000000000001470204764400243465ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/identity/gid.rb000066400000000000000000000005121470204764400254340ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Identity class Gid FACT_NAME = 'identity.gid' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:gid) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/identity/group.rb000066400000000000000000000006431470204764400260320ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Identity class Group FACT_NAME = 'identity.group' ALIASES = 'gid' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:group) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/identity/privileged.rb000066400000000000000000000005371470204764400270320ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Identity class Privileged FACT_NAME = 'identity.privileged' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:privileged) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/identity/uid.rb000066400000000000000000000005121470204764400254520ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Identity class Uid FACT_NAME = 'identity.uid' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:uid) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/identity/user.rb000066400000000000000000000006361470204764400256560ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Identity class User FACT_NAME = 'identity.user' ALIASES = 'id' def call_the_resolver fact_value = Facter::Resolvers::PosxIdentity.resolve(:user) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/interfaces.rb000066400000000000000000000006601470204764400251670ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class Interfaces FACT_NAME = 'interfaces' TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::Solaris::Networking.resolve(:interfaces) Facter::ResolvedFact.new(FACT_NAME, fact_value && !fact_value.empty? ? fact_value.keys.sort.join(',') : nil, :legacy) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/ipaddress6_interfaces.rb000066400000000000000000000007471470204764400273210ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class Ipaddress6Interfaces FACT_NAME = 'ipaddress6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Solaris::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("ipaddress6_#{interface_name}", info[:ip6], :legacy) if info[:ip6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/ipaddress_interfaces.rb000066400000000000000000000007421470204764400272260ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class IpaddressInterfaces FACT_NAME = 'ipaddress_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Solaris::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("ipaddress_#{interface_name}", info[:ip], :legacy) if info[:ip] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/is_virtual.rb000066400000000000000000000032671470204764400252330ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class IsVirtual FACT_NAME = 'is_virtual' def initialize @log = Facter::Log.new(self) end def call_the_resolver @log.debug('Solaris Virtual Resolver') fact_value = check_ldom || check_zone || check_xen || check_other_facts || 'physical' @log.debug("Fact value is: #{fact_value}") Facter::ResolvedFact.new(FACT_NAME, check_if_virtual(fact_value)) end def check_ldom @log.debug('Checking LDoms') return unless Facter::Resolvers::Solaris::Ldom.resolve(:role_control) == 'false' Facter::Resolvers::Solaris::Ldom.resolve(:role_impl) end def check_zone @log.debug('Checking LDoms') zone_name = Facter::Resolvers::Solaris::ZoneName.resolve(:current_zone_name) return if zone_name == 'global' 'zone' end def check_xen @log.debug('Checking XEN') Facter::Resolvers::Xen.resolve(:vm) end def check_other_facts isa = Facter::Resolvers::Uname.resolve(:processor) klass = isa == 'sparc' ? 'DmiSparc' : 'Dmi' product_name = Facter::Resolvers::Solaris.const_get(klass).resolve(:product_name) bios_vendor = Facter::Resolvers::Solaris.const_get(klass).resolve(:bios_vendor) return 'kvm' if bios_vendor&.include?('Amazon EC2') return unless product_name Facter::Util::Facts::HYPERVISORS_HASH.each { |key, value| return value if product_name.include?(key) } nil end def check_if_virtual(found_vm) Facter::Util::Facts::PHYSICAL_HYPERVISORS.count(found_vm).zero? end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/kernel.rb000066400000000000000000000004351470204764400243240ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class Kernel FACT_NAME = 'kernel' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:kernelname) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/kernelmajversion.rb000066400000000000000000000007361470204764400264260ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class Kernelmajversion FACT_NAME = 'kernelmajversion' def call_the_resolver full_version = Facter::Resolvers::Uname.resolve(:kernelversion) versions_split = full_version.split('.') major_version = versions_split.length > 2 ? "#{versions_split[0]}.#{versions_split[1]}" : versions_split[0] Facter::ResolvedFact.new(FACT_NAME, major_version) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/kernelrelease.rb000066400000000000000000000004561470204764400256700ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class Kernelrelease FACT_NAME = 'kernelrelease' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:kernelrelease) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/kernelversion.rb000066400000000000000000000004561470204764400257350ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class Kernelversion FACT_NAME = 'kernelversion' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:kernelversion) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/ldom.rb000066400000000000000000000033331470204764400237770ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class Ldom FACT_NAME = 'ldom' ALIASES = %w[ ldom_domainchassis ldom_domaincontrol ldom_domainname ldom_domainrole_control ldom_domainrole_impl ldom_domainrole_io ldom_domainrole_root ldom_domainrole_service ldom_domainuuid ].freeze def initialize @log = Facter::Log.new(self) end def call_the_resolver @log.debug('Solving the ldom fact.') fact_value = resolve_fact return Facter::ResolvedFact.new(FACT_NAME, nil) if fact_value.nil? create_resolved_facts_list(fact_value) end def resolve_fact chassis_serial = resolve(:chassis_serial) return nil if !chassis_serial || chassis_serial.empty? { domainchassis: chassis_serial, domaincontrol: resolve(:control_domain), domainname: resolve(:domain_name), domainrole: { control: resolve(:role_control), impl: resolve(:role_impl), io: resolve(:role_io), root: resolve(:role_root), service: resolve(:role_service) }, domainuuid: resolve(:domain_uuid) } end def resolve(key) Facter::Resolvers::Solaris::Ldom.resolve(key) end def create_resolved_facts_list(fact_value) resolved_facts = [Facter::ResolvedFact.new(FACT_NAME, fact_value)] ALIASES.each do |fact_alias| key = fact_alias.split('_')[1..-1].map!(&:to_sym) resolved_facts << Facter::ResolvedFact.new(fact_alias, fact_value.dig(*key), :legacy) end resolved_facts end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/load_averages.rb000066400000000000000000000004641470204764400256420ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class LoadAverages FACT_NAME = 'load_averages' def call_the_resolver fact_value = Facter::Resolvers::LoadAverages.resolve(:load_averages) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/macaddress_interfaces.rb000066400000000000000000000007471470204764400273630ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class MacaddressInterfaces FACT_NAME = 'macaddress_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Solaris::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("macaddress_#{interface_name}", info[:mac], :legacy) if info[:mac] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/memory/000077500000000000000000000000001470204764400240255ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/memory/swap/000077500000000000000000000000001470204764400247775ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/memory/swap/available.rb000066400000000000000000000011741470204764400272470ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Memory module Swap class Available FACT_NAME = 'memory.swap.available' ALIASES = 'swapfree' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Memory.resolve(:swap) if fact_value fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value[:available_bytes]) end [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/memory/swap/available_bytes.rb000066400000000000000000000011561470204764400304550ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Memory module Swap class AvailableBytes FACT_NAME = 'memory.swap.available_bytes' ALIASES = 'swapfree_mb' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Memory.resolve(:swap) fact_value = fact_value[:available_bytes] if fact_value [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/memory/swap/capacity.rb000066400000000000000000000007011470204764400271170ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Memory module Swap class Capacity FACT_NAME = 'memory.swap.capacity' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Memory.resolve(:swap) fact_value = fact_value[:capacity] if fact_value Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/memory/swap/total.rb000066400000000000000000000011601470204764400264450ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Memory module Swap class Total FACT_NAME = 'memory.swap.total' ALIASES = 'swapsize' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Memory.resolve(:swap) if fact_value fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value[:total_bytes]) end [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/memory/swap/total_bytes.rb000066400000000000000000000011421470204764400276530ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Memory module Swap class TotalBytes FACT_NAME = 'memory.swap.total_bytes' ALIASES = 'swapsize_mb' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Memory.resolve(:swap) fact_value = fact_value[:total_bytes] if fact_value [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/memory/swap/used.rb000066400000000000000000000010241470204764400262610ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Memory module Swap class Used FACT_NAME = 'memory.swap.used' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Memory.resolve(:swap) if fact_value fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value[:used_bytes]) end Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/memory/swap/used_bytes.rb000066400000000000000000000007051470204764400274740ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Memory module Swap class UsedBytes FACT_NAME = 'memory.swap.used_bytes' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Memory.resolve(:swap) fact_value = fact_value[:used_bytes] if fact_value Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/memory/system/000077500000000000000000000000001470204764400253515ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/memory/system/available.rb000066400000000000000000000012041470204764400276130ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Memory module System class Available FACT_NAME = 'memory.system.available' ALIASES = 'memoryfree' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Memory.resolve(:system) if fact_value fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value[:available_bytes]) end [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/memory/system/available_bytes.rb000066400000000000000000000011661470204764400310300ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Memory module System class AvailableBytes FACT_NAME = 'memory.system.available_bytes' ALIASES = 'memoryfree_mb' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Memory.resolve(:system) fact_value = fact_value[:available_bytes] if fact_value [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/memory/system/capacity.rb000066400000000000000000000007071470204764400274770ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Memory module System class Capacity FACT_NAME = 'memory.system.capacity' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Memory.resolve(:system) fact_value = fact_value[:capacity] if fact_value Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/memory/system/total.rb000066400000000000000000000011701470204764400270200ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Memory module System class Total FACT_NAME = 'memory.system.total' ALIASES = 'memorysize' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Memory.resolve(:system) if fact_value fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value[:total_bytes]) end [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/memory/system/total_bytes.rb000066400000000000000000000011521470204764400302260ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Memory module System class TotalBytes FACT_NAME = 'memory.system.total_bytes' ALIASES = 'memorysize_mb' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Memory.resolve(:system) fact_value = fact_value[:total_bytes] if fact_value [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/memory/system/used.rb000066400000000000000000000010321470204764400266320ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Memory module System class Used FACT_NAME = 'memory.system.used' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Memory.resolve(:system) if fact_value fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value[:used_bytes]) end Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/memory/system/used_bytes.rb000066400000000000000000000007131470204764400300450ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Memory module System class UsedBytes FACT_NAME = 'memory.system.used_bytes' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Memory.resolve(:system) fact_value = fact_value[:used_bytes] if fact_value Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/mountpoints.rb000066400000000000000000000010051470204764400254350ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class Mountpoints FACT_NAME = 'mountpoints' def call_the_resolver mountpoints = Facter::Resolvers::Solaris::Mountpoints.resolve(FACT_NAME.to_sym) return Facter::ResolvedFact.new(FACT_NAME, nil) unless mountpoints fact = {} mountpoints.each do |mnt| fact[mnt[:path].to_sym] = mnt.reject { |k| k == :path } end Facter::ResolvedFact.new(FACT_NAME, fact) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/mtu_interfaces.rb000066400000000000000000000007221470204764400260530ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class MtuInterfaces FACT_NAME = 'mtu_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Solaris::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("mtu_#{interface_name}", info[:mtu], :legacy) if info[:mtu] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/netmask6_interfaces.rb000066400000000000000000000007531470204764400270020ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class Netmask6Interfaces FACT_NAME = 'netmask6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Solaris::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("netmask6_#{interface_name}", info[:netmask6], :legacy) if info[:netmask6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/netmask_interfaces.rb000066400000000000000000000007461470204764400267160ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class NetmaskInterfaces FACT_NAME = 'netmask_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Solaris::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("netmask_#{interface_name}", info[:netmask], :legacy) if info[:netmask] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/network6_interfaces.rb000066400000000000000000000007531470204764400270310ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class Network6Interfaces FACT_NAME = 'network6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Solaris::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("network6_#{interface_name}", info[:network6], :legacy) if info[:network6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/network_interfaces.rb000066400000000000000000000007461470204764400267450ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class NetworkInterfaces FACT_NAME = 'network_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Solaris::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("network_#{interface_name}", info[:network], :legacy) if info[:network] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/networking/000077500000000000000000000000001470204764400247045ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/networking/dhcp.rb000066400000000000000000000005311470204764400261460ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Networking class Dhcp FACT_NAME = 'networking.dhcp' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Networking.resolve(:dhcp) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/networking/domain.rb000066400000000000000000000006501470204764400265010ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Networking class Domain FACT_NAME = 'networking.domain' ALIASES = 'domain' def call_the_resolver fact_value = Facter::Resolvers::Hostname.resolve(:domain) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/networking/fqdn.rb000066400000000000000000000006401470204764400261610ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Networking class Fqdn FACT_NAME = 'networking.fqdn' ALIASES = 'fqdn' def call_the_resolver fact_value = Facter::Resolvers::Hostname.resolve(:fqdn) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/networking/hostname.rb000066400000000000000000000006601470204764400270510ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Networking class Hostname FACT_NAME = 'networking.hostname' ALIASES = 'hostname' def call_the_resolver fact_value = Facter::Resolvers::Hostname.resolve(:hostname) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/networking/interfaces.rb000066400000000000000000000005521470204764400273560ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Networking class Interfaces FACT_NAME = 'networking.interfaces' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Networking.resolve(:interfaces) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/networking/ip.rb000066400000000000000000000006521470204764400256440ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Networking class Ip FACT_NAME = 'networking.ip' ALIASES = 'ipaddress' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Ipaddress.resolve(:ip) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/networking/ip6.rb000066400000000000000000000006571470204764400257370ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Networking class Ip6 FACT_NAME = 'networking.ip6' ALIASES = 'ipaddress6' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Networking.resolve(:ip6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/networking/mac.rb000066400000000000000000000006571470204764400260010ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Networking class Mac FACT_NAME = 'networking.mac' ALIASES = 'macaddress' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Networking.resolve(:mac) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/networking/mtu.rb000066400000000000000000000005261470204764400260410ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Networking class Mtu FACT_NAME = 'networking.mtu' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Networking.resolve(:mtu) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/networking/netmask.rb000066400000000000000000000006701470204764400266760ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Networking class Netmask FACT_NAME = 'networking.netmask' ALIASES = 'netmask' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Networking.resolve(:netmask) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/networking/netmask6.rb000066400000000000000000000006741470204764400267700ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Networking class Netmask6 FACT_NAME = 'networking.netmask6' ALIASES = 'netmask6' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Networking.resolve(:netmask6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/networking/network.rb000066400000000000000000000006701470204764400267250ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Networking class Network FACT_NAME = 'networking.network' ALIASES = 'network' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Networking.resolve(:network) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/networking/network6.rb000066400000000000000000000006741470204764400270170ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Networking class Network6 FACT_NAME = 'networking.network6' ALIASES = 'network6' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Networking.resolve(:network6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/networking/primary.rb000066400000000000000000000005541470204764400267200ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Networking class Primary FACT_NAME = 'networking.primary' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Networking.resolve(:primary_interface) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/os/000077500000000000000000000000001470204764400231365ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/os/architecture.rb000066400000000000000000000006511470204764400261470ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Os class Architecture FACT_NAME = 'os.architecture' ALIASES = 'architecture' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:machine) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/os/family.rb000066400000000000000000000005241470204764400247450ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Os class Family FACT_NAME = 'os.family' ALIASES = 'osfamily' def call_the_resolver [Facter::ResolvedFact.new(FACT_NAME, 'Solaris'), Facter::ResolvedFact.new(ALIASES, 'Solaris', :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/os/hardware.rb000066400000000000000000000006421470204764400252620ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Os class Hardware FACT_NAME = 'os.hardware' ALIASES = 'hardwaremodel' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:machine) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/os/name.rb000066400000000000000000000007261470204764400244100ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Os class Name FACT_NAME = 'os.name' ALIASES = 'operatingsystem' def call_the_resolver value = Facter::Resolvers::Uname.resolve(:kernelname) fact_value = value == 'SunOS' ? 'Solaris' : value [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/os/release.rb000066400000000000000000000013721470204764400251060ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver full_value = Facter::Resolvers::Solaris::OsRelease.resolve(:full) major_value = Facter::Resolvers::Solaris::OsRelease.resolve(:major) minor_value = Facter::Resolvers::Solaris::OsRelease.resolve(:minor) [Facter::ResolvedFact.new(FACT_NAME, full: full_value, major: major_value, minor: minor_value), Facter::ResolvedFact.new(ALIASES.first, major_value, :legacy), Facter::ResolvedFact.new(ALIASES.last, full_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/path.rb000066400000000000000000000004221470204764400237740ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class Path FACT_NAME = 'path' def call_the_resolver fact_value = Facter::Resolvers::Path.resolve(:path) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/processors/000077500000000000000000000000001470204764400247175ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/processors/cores.rb000066400000000000000000000005461470204764400263640ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Processors class Cores FACT_NAME = 'processors.cores' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Processors.resolve(:cores_per_socket) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/processors/count.rb000066400000000000000000000007001470204764400263710ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Processors class Count FACT_NAME = 'processors.count' ALIASES = 'processorcount' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Processors.resolve(:logical_count) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/processors/isa.rb000066400000000000000000000006471470204764400260270ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Processors class Isa FACT_NAME = 'processors.isa' ALIASES = 'hardwareisa' def call_the_resolver fact_value = Facter::Resolvers::Uname.resolve(:processor) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/processors/models.rb000066400000000000000000000010631470204764400265270ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Processors class Models FACT_NAME = 'processors.models' ALIASES = 'processor.*' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Processors.resolve(:models) facts = [Facter::ResolvedFact.new(FACT_NAME, fact_value)] fact_value.each_with_index do |value, index| facts.push(Facter::ResolvedFact.new("processor#{index}", value, :legacy)) end facts end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/processors/physicalcount.rb000066400000000000000000000007311470204764400301320ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Processors class Physicalcount FACT_NAME = 'processors.physicalcount' ALIASES = 'physicalprocessorcount' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Processors.resolve(:physical_count) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/processors/speed.rb000066400000000000000000000006571470204764400263540ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Processors class Speed FACT_NAME = 'processors.speed' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Processors.resolve(:speed) speed = Facter::Util::Facts::UnitConverter.hertz_to_human_readable(fact_value) Facter::ResolvedFact.new(FACT_NAME, speed) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/processors/threads.rb000066400000000000000000000005521470204764400267000ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Processors class Threads FACT_NAME = 'processors.threads' def call_the_resolver fact_value = Facter::Resolvers::Solaris::Processors.resolve(:threads_per_core) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/ruby/000077500000000000000000000000001470204764400234765ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/ruby/platform.rb000066400000000000000000000006451470204764400256540ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Ruby class Platform FACT_NAME = 'ruby.platform' ALIASES = 'rubyplatform' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:platform) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/ruby/sitedir.rb000066400000000000000000000006401470204764400254660ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Ruby class Sitedir FACT_NAME = 'ruby.sitedir' ALIASES = 'rubysitedir' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:sitedir) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/ruby/version.rb000066400000000000000000000006401470204764400255100ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module Ruby class Version FACT_NAME = 'ruby.version' ALIASES = 'rubyversion' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/ssh.rb000066400000000000000000000012671470204764400236450ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class Ssh FACT_NAME = 'ssh' def call_the_resolver Facter::ResolvedFact.new(FACT_NAME, fact_value) end private def fact_value resolver_data.map { |el| create_ssh_fact(el) }.inject(:merge) end def resolver_data Facter::Resolvers::Ssh.resolve(:ssh) end def create_ssh_fact(ssh) return {} unless ssh { ssh.name.to_sym => { fingerprints: { sha1: ssh.fingerprint.sha1, sha256: ssh.fingerprint.sha256 }, key: ssh.key, type: ssh.type } } end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/sshalgorithmkey.rb000066400000000000000000000006071470204764400262620ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class Sshalgorithmkey FACT_NAME = 'ssh.*key' TYPE = :legacy def call_the_resolver facts = [] result = Facter::Resolvers::Ssh.resolve(:ssh) result.each { |ssh| facts << Facter::ResolvedFact.new("ssh#{ssh.name.to_sym}key", ssh.key, :legacy) } facts end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/sshfp_algorithm.rb000066400000000000000000000007641470204764400262420ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class SshfpAlgorithm FACT_NAME = 'sshfp_.*' TYPE = :legacy def call_the_resolver facts = [] result = Facter::Resolvers::Ssh.resolve(:ssh) result.each do |ssh| facts << Facter::ResolvedFact.new("sshfp_#{ssh.name.to_sym}", "#{ssh.fingerprint.sha1}\n#{ssh.fingerprint.sha256}", :legacy) end facts end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/system_uptime/000077500000000000000000000000001470204764400254245ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/system_uptime/days.rb000066400000000000000000000006531470204764400267150ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module SystemUptime class Days FACT_NAME = 'system_uptime.days' ALIASES = 'uptime_days' def call_the_resolver fact_value = Facter::Resolvers::Uptime.resolve(:days) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/system_uptime/hours.rb000066400000000000000000000006571470204764400271210ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module SystemUptime class Hours FACT_NAME = 'system_uptime.hours' ALIASES = 'uptime_hours' def call_the_resolver fact_value = Facter::Resolvers::Uptime.resolve(:hours) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/system_uptime/seconds.rb000066400000000000000000000006671470204764400274200ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module SystemUptime class Seconds FACT_NAME = 'system_uptime.seconds' ALIASES = 'uptime_seconds' def call_the_resolver fact_value = Facter::Resolvers::Uptime.resolve(:seconds) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/system_uptime/uptime.rb000066400000000000000000000006541470204764400272610ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris module SystemUptime class Uptime FACT_NAME = 'system_uptime.uptime' ALIASES = 'uptime' def call_the_resolver fact_value = Facter::Resolvers::Uptime.resolve(:uptime) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/timezone.rb000066400000000000000000000004421470204764400246740ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class Timezone FACT_NAME = 'timezone' def call_the_resolver fact_value = Facter::Resolvers::Timezone.resolve(:timezone) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/virtual.rb000066400000000000000000000030501470204764400245260ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class Virtual FACT_NAME = 'virtual' def initialize @log = Facter::Log.new(self) end def call_the_resolver @log.debug('Solaris Virtual Resolver') fact_value = check_ldom || check_zone || check_xen || check_other_facts || 'physical' @log.debug("Fact value is: #{fact_value}") Facter::ResolvedFact.new(FACT_NAME, fact_value) end def check_ldom @log.debug('Checking LDoms') return unless Facter::Resolvers::Solaris::Ldom.resolve(:role_control) == 'false' Facter::Resolvers::Solaris::Ldom.resolve(:role_impl) end def check_zone @log.debug('Checking LDoms') zone_name = Facter::Resolvers::Solaris::ZoneName.resolve(:current_zone_name) return if zone_name == 'global' 'zone' end def check_xen @log.debug('Checking XEN') Facter::Resolvers::Xen.resolve(:vm) end def check_other_facts isa = Facter::Resolvers::Uname.resolve(:processor) klass = isa == 'sparc' ? 'DmiSparc' : 'Dmi' product_name = Facter::Resolvers::Solaris.const_get(klass).resolve(:product_name) bios_vendor = Facter::Resolvers::Solaris.const_get(klass).resolve(:bios_vendor) return 'kvm' if bios_vendor&.include?('Amazon EC2') return unless product_name Facter::Util::Facts::HYPERVISORS_HASH.each { |key, value| return value if product_name.include?(key) } nil end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/zfs_featurenumbers.rb000066400000000000000000000004721470204764400267560ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class ZfsFeaturenumbers FACT_NAME = 'zfs_featurenumbers' def call_the_resolver fact_value = Facter::Resolvers::ZFS.resolve(:zfs_featurenumbers) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/zfs_version.rb000066400000000000000000000004451470204764400254140ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class ZfsVersion FACT_NAME = 'zfs_version' def call_the_resolver fact_value = Facter::Resolvers::ZFS.resolve(:zfs_version) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/zones.rb000066400000000000000000000027211470204764400242020ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class Zones FACT_NAME = 'solaris_zones.zones' ALIASES = %w[ zone_.*_brand zone_.*_iptype zone_.*_name zone_.*_uuid zone_.*_id zone_.*_path zone_.*_status zones ].freeze def call_the_resolver resolved_facts = [] zones = {} results = Facter::Resolvers::Solaris::Zone.resolve(:zone) return Facter::ResolvedFact.new(FACT_NAME, nil) unless results results&.each do |result| zones.merge!(parse_result(result)) resolved_facts << create_legacy_zone_facts(result) end resolved_facts << Facter::ResolvedFact.new('solaris_zones.zones', zones) resolved_facts << Facter::ResolvedFact.new('zones', results.count, :legacy) resolved_facts.flatten end private def parse_result(result) { result[:name].to_sym => { brand: result[:brand], id: result[:id], ip_type: result[:iptype], path: result[:path], status: result[:status] } } end def create_legacy_zone_facts(zone) legacy_facts = [] %w[brand iptype name uuid id path status].each do |key| legacy_facts << Facter::ResolvedFact.new("zone_#{zone[:name]}_#{key}", zone[key.to_sym], :legacy) end legacy_facts end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/zpool_featureflags.rb000066400000000000000000000004741470204764400267420ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class ZpoolFeatureflags FACT_NAME = 'zpool_featureflags' def call_the_resolver fact_value = Facter::Resolvers::Zpool.resolve(:zpool_featureflags) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/zpool_featurenumbers.rb000066400000000000000000000005021470204764400273110ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class ZpoolFeaturenumbers FACT_NAME = 'zpool_featurenumbers' def call_the_resolver fact_value = Facter::Resolvers::Zpool.resolve(:zpool_featurenumbers) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/solaris/zpool_version.rb000066400000000000000000000004551470204764400257560ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Solaris class ZpoolVersion FACT_NAME = 'zpool_version' def call_the_resolver fact_value = Facter::Resolvers::Zpool.resolve(:zpool_version) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/ubuntu/000077500000000000000000000000001470204764400223635ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/ubuntu/lsbdistrelease.rb000066400000000000000000000012501470204764400257130ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Ubuntu class Lsbdistrelease FACT_NAME = 'lsbdistrelease' ALIASES = %w[lsbmajdistrelease lsbminordistrelease].freeze TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::LsbRelease.resolve(:release) return Facter::ResolvedFact.new(FACT_NAME, nil, :legacy) unless fact_value version = fact_value.split('.') [Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy), Facter::ResolvedFact.new(ALIASES[0], "#{version[0]}.#{version[1]}", :legacy), Facter::ResolvedFact.new(ALIASES[1], version[2], :legacy)] end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/ubuntu/os/000077500000000000000000000000001470204764400230045ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/ubuntu/os/distro/000077500000000000000000000000001470204764400243105ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/ubuntu/os/distro/release.rb000066400000000000000000000011661470204764400262610ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Ubuntu module Os module Distro class Release FACT_NAME = 'os.distro.release' def call_the_resolver fact_value = determine_release_for_os Facter::ResolvedFact.new(FACT_NAME, fact_value) end private def determine_release_for_os release = Facter::Resolvers::OsRelease.resolve(:version_id) return unless release { 'full' => release, 'major' => release } end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/ubuntu/os/release.rb000066400000000000000000000010651470204764400247530ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Ubuntu module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver version = Facter::Resolvers::OsRelease.resolve(:version_id) [Facter::ResolvedFact.new(FACT_NAME, full: version, major: version), Facter::ResolvedFact.new(ALIASES.first, version, :legacy), Facter::ResolvedFact.new(ALIASES.last, version, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/000077500000000000000000000000001470204764400225335ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/windows/aio_agent_version.rb000066400000000000000000000005131470204764400265520ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class AioAgentVersion FACT_NAME = 'aio_agent_version' def call_the_resolver fact_value = Facter::Resolvers::Windows::AioAgentVersion.resolve(:aio_agent_version) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/az_metadata.rb000066400000000000000000000010261470204764400253310ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class AzMetadata FACT_NAME = 'az_metadata' def call_the_resolver return Facter::ResolvedFact.new(FACT_NAME, nil) unless azure_hypervisor? fact_value = Facter::Resolvers::Az.resolve(:metadata) Facter::ResolvedFact.new(FACT_NAME, fact_value&.empty? ? nil : fact_value) end private def azure_hypervisor? Facter::Resolvers::Windows::Virtualization.resolve(:virtual) == 'hyperv' end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/cloud/000077500000000000000000000000001470204764400236415ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/windows/cloud/provider.rb000066400000000000000000000016621470204764400260250ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Cloud class Provider FACT_NAME = 'cloud.provider' def call_the_resolver virtual = Facter::Resolvers::Windows::Virtualization.resolve(:virtual) provider = case virtual when 'hyperv' metadata = Facter::Resolvers::Az.resolve(:metadata) 'azure' unless metadata.nil? || metadata.empty? when 'kvm', 'xen' metadata = Facter::Resolvers::Ec2.resolve(:metadata) 'aws' unless metadata.nil? || metadata.empty? when 'gce' metadata = Facter::Resolvers::Gce.resolve(:metadata) 'gce' unless metadata.nil? || metadata.empty? end Facter::ResolvedFact.new(FACT_NAME, provider) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/dhcp_servers.rb000066400000000000000000000013671470204764400255560ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class DhcpServers FACT_NAME = 'dhcp_servers' TYPE = :legacy def call_the_resolver fact_value = construct_addresses_hash fact_value = !fact_value || fact_value.empty? ? nil : fact_value Facter::ResolvedFact.new(FACT_NAME, fact_value, :legacy) end private def construct_addresses_hash interfaces = Facter::Resolvers::Windows::Networking.resolve(:interfaces) return unless interfaces servers = { system: Facter::Resolvers::Windows::Networking.resolve(:dhcp) } interfaces&.each { |interface_name, info| servers[interface_name] = info[:dhcp] if info[:dhcp] } servers end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/dmi/000077500000000000000000000000001470204764400233045ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/windows/dmi/manufacturer.rb000066400000000000000000000006621470204764400263310ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Dmi class Manufacturer FACT_NAME = 'dmi.manufacturer' ALIASES = 'manufacturer' def call_the_resolver fact_value = Facter::Resolvers::DMIBios.resolve(:manufacturer) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/dmi/product/000077500000000000000000000000001470204764400247645ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/windows/dmi/product/name.rb000066400000000000000000000007321470204764400262330ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Dmi module Product class Name FACT_NAME = 'dmi.product.name' ALIASES = 'productname' def call_the_resolver fact_value = Facter::Resolvers::DMIComputerSystem.resolve(:name) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/dmi/product/serial_number.rb000066400000000000000000000007531470204764400301450ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Dmi module Product class SerialNumber FACT_NAME = 'dmi.product.serial_number' ALIASES = 'serialnumber' def call_the_resolver fact_value = Facter::Resolvers::DMIBios.resolve(:serial_number) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/dmi/product/uuid.rb000066400000000000000000000007231470204764400262610ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Dmi module Product class Uuid FACT_NAME = 'dmi.product.uuid' ALIASES = 'uuid' def call_the_resolver fact_value = Facter::Resolvers::DMIComputerSystem.resolve(:uuid) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/ec2_metadata.rb000066400000000000000000000011031470204764400253640ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class Ec2Metadata FACT_NAME = 'ec2_metadata' def call_the_resolver return Facter::ResolvedFact.new(FACT_NAME, nil) unless aws_hypervisors? fact_value = Facter::Resolvers::Ec2.resolve(:metadata) Facter::ResolvedFact.new(FACT_NAME, fact_value&.empty? ? nil : fact_value) end private def aws_hypervisors? virtual = Facter::Resolvers::Windows::Virtualization.resolve(:virtual) virtual == 'kvm' || virtual =~ /xen/ end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/ec2_userdata.rb000066400000000000000000000011031470204764400254140ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class Ec2Userdata FACT_NAME = 'ec2_userdata' def call_the_resolver return Facter::ResolvedFact.new(FACT_NAME, nil) unless aws_hypervisors? fact_value = Facter::Resolvers::Ec2.resolve(:userdata) Facter::ResolvedFact.new(FACT_NAME, fact_value&.empty? ? nil : fact_value) end private def aws_hypervisors? virtual = Facter::Resolvers::Windows::Virtualization.resolve(:virtual) virtual == 'kvm' || virtual =~ /xen/ end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/facterversion.rb000066400000000000000000000004671470204764400257410ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class Facterversion FACT_NAME = 'facterversion' def call_the_resolver fact_value = Facter::Resolvers::Facterversion.resolve(:facterversion) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/fips_enabled.rb000066400000000000000000000004631470204764400254760ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class FipsEnabled FACT_NAME = 'fips_enabled' def call_the_resolver fact_value = Facter::Resolvers::Windows::Fips.resolve(:fips_enabled) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/gce.rb000066400000000000000000000006221470204764400236160ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class Gce FACT_NAME = 'gce' def call_the_resolver virtualization = Facter::Resolvers::Windows::Virtualization.resolve(:virtual) fact_value = virtualization&.include?('gce') ? Facter::Resolvers::Gce.resolve(:metadata) : nil Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/hypervisors/000077500000000000000000000000001470204764400251305ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/windows/hypervisors/hyperv.rb000066400000000000000000000010231470204764400267660ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Hypervisors class Hyperv FACT_NAME = 'hypervisors.hyperv' def call_the_resolver fact_value = {} if hyperv? Facter::ResolvedFact.new(FACT_NAME, fact_value) end private def hyperv? Facter::Resolvers::Windows::Virtualization.resolve(:virtual) == 'hyperv' || Facter::Resolvers::DMIBios.resolve(:manufacturer).include?('Microsoft') end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/hypervisors/kvm.rb000066400000000000000000000017761470204764400262650ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Hypervisors class Kvm FACT_NAME = 'hypervisors.kvm' def call_the_resolver fact_value = discover_provider || {} if kvm? Facter::ResolvedFact.new(FACT_NAME, fact_value) end private def kvm? product_name = Facter::Resolvers::DMIComputerSystem.resolve(:name) (Facter::Resolvers::Windows::Virtualization.resolve(:virtual) == 'kvm' || Facter::Resolvers::NetKVM.resolve(:kvm)) && product_name != 'VirtualBox' && !product_name.match(/^Parallels/) end def discover_provider manufacturer = Facter::Resolvers::DMIBios.resolve(:manufacturer) return { google: true } if manufacturer == 'Google' return { openstack: true } if /^OpenStack/.match?(Facter::Resolvers::DMIComputerSystem.resolve(:name)) { amazon: true } if /^Amazon/.match?(manufacturer) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/hypervisors/virtualbox.rb000066400000000000000000000021021470204764400276470ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Hypervisors class Virtualbox FACT_NAME = 'hypervisors.virtualbox' def call_the_resolver fact_value = populate_version_and_revision if virtualbox? Facter::ResolvedFact.new(FACT_NAME, fact_value) end private def virtualbox? Facter::Resolvers::Windows::Virtualization.resolve(:virtual) == 'virtualbox' || Facter::Resolvers::DMIComputerSystem.resolve(:name) == 'VirtualBox' end def populate_version_and_revision oem_strings = Facter::Resolvers::Windows::Virtualization.resolve(:oem_strings) return unless oem_strings version = revision = '' oem_strings.each do |string| version = string[8, string.size] if string.start_with?('vboxVer_') && version.empty? revision = string[8, string.size] if string.start_with?('vboxRev_') && revision.empty? end { version: version, revision: revision } end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/hypervisors/vmware.rb000066400000000000000000000010171470204764400267550ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Hypervisors class Vmware FACT_NAME = 'hypervisors.vmware' def call_the_resolver fact_value = {} if vmware? Facter::ResolvedFact.new(FACT_NAME, fact_value) end private def vmware? Facter::Resolvers::Windows::Virtualization.resolve(:virtual) == 'vmware' || Facter::Resolvers::DMIBios.resolve(:manufacturer) == 'VMware, Inc.' end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/hypervisors/xen.rb000066400000000000000000000010361470204764400262470ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Hypervisors class Xen FACT_NAME = 'hypervisors.xen' def call_the_resolver if Facter::Resolvers::Windows::Virtualization.resolve(:virtual) == 'xen' fact_value = { context: hvm? ? 'hvm' : 'pv' } end Facter::ResolvedFact.new(FACT_NAME, fact_value) end private def hvm? Facter::Resolvers::DMIComputerSystem.resolve(:name) =~ /^HVM/ end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/identity/000077500000000000000000000000001470204764400243645ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/windows/identity/privileged.rb000066400000000000000000000005341470204764400270450ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Identity class Privileged FACT_NAME = 'identity.privileged' def call_the_resolver fact_value = Facter::Resolvers::Identity.resolve(:privileged) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/identity/user.rb000066400000000000000000000006331470204764400256710ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Identity class User FACT_NAME = 'identity.user' ALIASES = 'id' def call_the_resolver fact_value = Facter::Resolvers::Identity.resolve(:user) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/interfaces.rb000066400000000000000000000005431470204764400252050ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class Interfaces FACT_NAME = 'interfaces' TYPE = :legacy def call_the_resolver fact_value = Facter::Resolvers::Windows::Networking.resolve(:interfaces) Facter::ResolvedFact.new(FACT_NAME, fact_value&.keys&.join(','), :legacy) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/ipaddress6_interfaces.rb000066400000000000000000000007471470204764400273370ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class Ipaddress6Interfaces FACT_NAME = 'ipaddress6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Windows::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("ipaddress6_#{interface_name}", info[:ip6], :legacy) if info[:ip6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/ipaddress_interfaces.rb000066400000000000000000000007421470204764400272440ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class IpaddressInterfaces FACT_NAME = 'ipaddress_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Windows::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("ipaddress_#{interface_name}", info[:ip], :legacy) if info[:ip] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/is_virtual.rb000066400000000000000000000004671470204764400252500ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class IsVirtual FACT_NAME = 'is_virtual' def call_the_resolver fact_value = Facter::Resolvers::Windows::Virtualization.resolve(:is_virtual) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/kernel.rb000066400000000000000000000004331470204764400243400ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class Kernel FACT_NAME = 'kernel' def call_the_resolver fact_value = Facter::Resolvers::Kernel.resolve(:kernel) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/kernelmajversion.rb000066400000000000000000000004731470204764400264420ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class Kernelmajversion FACT_NAME = 'kernelmajversion' def call_the_resolver fact_value = Facter::Resolvers::Kernel.resolve(:kernelmajorversion) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/kernelrelease.rb000066400000000000000000000004601470204764400257010ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class Kernelrelease FACT_NAME = 'kernelrelease' def call_the_resolver fact_value = Facter::Resolvers::Kernel.resolve(:kernelversion) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/kernelversion.rb000066400000000000000000000004601470204764400257460ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class Kernelversion FACT_NAME = 'kernelversion' def call_the_resolver fact_value = Facter::Resolvers::Kernel.resolve(:kernelversion) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/macaddress_interfaces.rb000066400000000000000000000007471470204764400274010ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class MacaddressInterfaces FACT_NAME = 'macaddress_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Windows::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("macaddress_#{interface_name}", info[:mac], :legacy) if info[:mac] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/memory/000077500000000000000000000000001470204764400240435ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/windows/memory/system/000077500000000000000000000000001470204764400253675ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/windows/memory/system/available.rb000066400000000000000000000011071470204764400276330ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Memory module System class Available FACT_NAME = 'memory.system.available' ALIASES = 'memoryfree' def call_the_resolver fact_value = Facter::Resolvers::Memory.resolve(:available_bytes) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/memory/system/available_bytes.rb000066400000000000000000000010621470204764400310410ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Memory module System class AvailableBytes FACT_NAME = 'memory.system.available_bytes' ALIASES = 'memoryfree_mb' def call_the_resolver fact_value = Facter::Resolvers::Memory.resolve(:available_bytes) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/memory/system/capacity.rb000066400000000000000000000006031470204764400275100ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Memory module System class Capacity FACT_NAME = 'memory.system.capacity' def call_the_resolver fact_value = Facter::Resolvers::Memory.resolve(:capacity) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/memory/system/total.rb000066400000000000000000000010731470204764400270400ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Memory module System class Total FACT_NAME = 'memory.system.total' ALIASES = 'memorysize' def call_the_resolver fact_value = Facter::Resolvers::Memory.resolve(:total_bytes) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/memory/system/total_bytes.rb000066400000000000000000000010461470204764400302460ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Memory module System class TotalBytes FACT_NAME = 'memory.system.total_bytes' ALIASES = 'memorysize_mb' def call_the_resolver fact_value = Facter::Resolvers::Memory.resolve(:total_bytes) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, Facter::Util::Facts::UnitConverter.bytes_to_mb(fact_value), :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/memory/system/used.rb000066400000000000000000000007351470204764400266610ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Memory module System class Used FACT_NAME = 'memory.system.used' def call_the_resolver fact_value = Facter::Resolvers::Memory.resolve(:used_bytes) fact_value = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(fact_value) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/memory/system/used_bytes.rb000066400000000000000000000006101470204764400300570ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Memory module System class UsedBytes FACT_NAME = 'memory.system.used_bytes' def call_the_resolver fact_value = Facter::Resolvers::Memory.resolve(:used_bytes) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/mtu_interfaces.rb000066400000000000000000000007221470204764400260710ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class MtuInterfaces FACT_NAME = 'mtu_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Windows::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("mtu_#{interface_name}", info[:mtu], :legacy) if info[:mtu] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/netmask6_interfaces.rb000066400000000000000000000007531470204764400270200ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class Netmask6Interfaces FACT_NAME = 'netmask6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Windows::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("netmask6_#{interface_name}", info[:netmask6], :legacy) if info[:netmask6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/netmask_interfaces.rb000066400000000000000000000007461470204764400267340ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class NetmaskInterfaces FACT_NAME = 'netmask_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Windows::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("netmask_#{interface_name}", info[:netmask], :legacy) if info[:netmask] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/network6_interfaces.rb000066400000000000000000000007531470204764400270470ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class Network6Interfaces FACT_NAME = 'network6_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Windows::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("network6_#{interface_name}", info[:network6], :legacy) if info[:network6] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/network_interfaces.rb000066400000000000000000000007461470204764400267630ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class NetworkInterfaces FACT_NAME = 'network_.*' TYPE = :legacy def call_the_resolver arr = [] interfaces = Facter::Resolvers::Windows::Networking.resolve(:interfaces) interfaces&.each do |interface_name, info| arr << Facter::ResolvedFact.new("network_#{interface_name}", info[:network], :legacy) if info[:network] end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/networking/000077500000000000000000000000001470204764400247225ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/windows/networking/dhcp.rb000066400000000000000000000005311470204764400261640ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Networking class Dhcp FACT_NAME = 'networking.dhcp' def call_the_resolver fact_value = Facter::Resolvers::Windows::Networking.resolve(:dhcp) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/networking/domain.rb000066400000000000000000000006641470204764400265240ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Networking class Domain FACT_NAME = 'networking.domain' ALIASES = 'domain' def call_the_resolver fact_value = Facter::Resolvers::Windows::Networking.resolve(:domain) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/networking/fqdn.rb000066400000000000000000000012531470204764400262000ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Networking class Fqdn FACT_NAME = 'networking.fqdn' ALIASES = 'fqdn' def call_the_resolver domain = Facter::Resolvers::Windows::Networking.resolve(:domain) hostname = Facter::Resolvers::Hostname.resolve(:hostname) return Facter::ResolvedFact.new(FACT_NAME, nil) if !hostname || hostname.empty? fact_value = domain && !domain.empty? ? [hostname, domain].compact.join('.') : hostname [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/networking/hostname.rb000066400000000000000000000006611470204764400270700ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Networking class Hostname FACT_NAME = 'networking.hostname' ALIASES = 'hostname' def call_the_resolver fact_value = Facter::Resolvers::Hostname.resolve(:hostname) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/networking/interfaces.rb000066400000000000000000000005531470204764400273750ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Networking class Interfaces FACT_NAME = 'networking.interfaces' def call_the_resolver fact_value = Facter::Resolvers::Windows::Networking.resolve(:interfaces) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/networking/ip.rb000066400000000000000000000006531470204764400256630ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Networking class Ip FACT_NAME = 'networking.ip' ALIASES = 'ipaddress' def call_the_resolver fact_value = Facter::Resolvers::Windows::Networking.resolve(:ip) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/networking/ip6.rb000066400000000000000000000006571470204764400257550ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Networking class Ip6 FACT_NAME = 'networking.ip6' ALIASES = 'ipaddress6' def call_the_resolver fact_value = Facter::Resolvers::Windows::Networking.resolve(:ip6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/networking/mac.rb000066400000000000000000000006571470204764400260170ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Networking class Mac FACT_NAME = 'networking.mac' ALIASES = 'macaddress' def call_the_resolver fact_value = Facter::Resolvers::Windows::Networking.resolve(:mac) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/networking/mtu.rb000066400000000000000000000005261470204764400260570ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Networking class Mtu FACT_NAME = 'networking.mtu' def call_the_resolver fact_value = Facter::Resolvers::Windows::Networking.resolve(:mtu) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/networking/netmask.rb000066400000000000000000000006701470204764400267140ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Networking class Netmask FACT_NAME = 'networking.netmask' ALIASES = 'netmask' def call_the_resolver fact_value = Facter::Resolvers::Windows::Networking.resolve(:netmask) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/networking/netmask6.rb000066400000000000000000000006741470204764400270060ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Networking class Netmask6 FACT_NAME = 'networking.netmask6' ALIASES = 'netmask6' def call_the_resolver fact_value = Facter::Resolvers::Windows::Networking.resolve(:netmask6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/networking/network.rb000066400000000000000000000006701470204764400267430ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Networking class Network FACT_NAME = 'networking.network' ALIASES = 'network' def call_the_resolver fact_value = Facter::Resolvers::Windows::Networking.resolve(:network) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/networking/network6.rb000066400000000000000000000006741470204764400270350ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Networking class Network6 FACT_NAME = 'networking.network6' ALIASES = 'network6' def call_the_resolver fact_value = Facter::Resolvers::Windows::Networking.resolve(:network6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/networking/primary.rb000066400000000000000000000005541470204764400267360ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Networking class Primary FACT_NAME = 'networking.primary' def call_the_resolver fact_value = Facter::Resolvers::Windows::Networking.resolve(:primary_interface) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/networking/scope6.rb000066400000000000000000000007001470204764400264430ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Networking class Scope6 FACT_NAME = 'networking.scope6' ALIASES = 'scope6' def call_the_resolver fact_value = Facter::Resolvers::Windows::Networking.resolve(:scope6) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new('scope6', fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/os/000077500000000000000000000000001470204764400231545ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/windows/os/architecture.rb000066400000000000000000000006751470204764400261730ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Os class Architecture FACT_NAME = 'os.architecture' ALIASES = 'architecture' def call_the_resolver fact_value = Facter::Resolvers::HardwareArchitecture.resolve(:architecture) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/os/family.rb000066400000000000000000000006311470204764400247620ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Os class Family FACT_NAME = 'os.family' ALIASES = 'osfamily' def call_the_resolver fact_value = Facter::Resolvers::Kernel.resolve(:kernel) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/os/hardware.rb000066400000000000000000000006621470204764400253020ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Os class Hardware FACT_NAME = 'os.hardware' ALIASES = 'hardwaremodel' def call_the_resolver fact_value = Facter::Resolvers::HardwareArchitecture.resolve(:hardware) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/os/name.rb000066400000000000000000000006341470204764400244240ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Os class Name FACT_NAME = 'os.name' ALIASES = 'operatingsystem' def call_the_resolver fact_value = Facter::Resolvers::Kernel.resolve(:kernel) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/os/release.rb000066400000000000000000000020711470204764400251210ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Os class Release FACT_NAME = 'os.release' ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver arr = [] input = { consumerrel: description_resolver(:consumerrel), description: description_resolver(:description), version: kernel_resolver(:kernelmajorversion), kernel_version: kernel_resolver(:kernelversion) } fact_value = Facter::Util::Facts::WindowsReleaseFinder.find_release(input) arr << Facter::ResolvedFact.new(FACT_NAME, ({ full: fact_value, major: fact_value } if fact_value)) ALIASES.each { |aliass| arr << Facter::ResolvedFact.new(aliass, fact_value, :legacy) } arr end def description_resolver(key) Facter::Resolvers::WinOsDescription.resolve(key) end def kernel_resolver(key) Facter::Resolvers::Kernel.resolve(key) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/os/windows/000077500000000000000000000000001470204764400246465ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/windows/os/windows/display_version.rb000066400000000000000000000010011470204764400303750ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Os module Windows class DisplayVersion FACT_NAME = 'os.windows.display_version' ALIASES = 'windows_display_version' def call_the_resolver fact_value = Facter::Resolvers::ProductRelease.resolve(:display_version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/os/windows/edition_id.rb000066400000000000000000000007551470204764400273110ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Os module Windows class EditionId FACT_NAME = 'os.windows.edition_id' ALIASES = 'windows_edition_id' def call_the_resolver fact_value = Facter::Resolvers::ProductRelease.resolve(:edition_id) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/os/windows/installation_type.rb000066400000000000000000000010111470204764400307260ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Os module Windows class InstallationType FACT_NAME = 'os.windows.installation_type' ALIASES = 'windows_installation_type' def call_the_resolver fact_value = Facter::Resolvers::ProductRelease.resolve(:installation_type) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/os/windows/product_name.rb000066400000000000000000000007651470204764400276630ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Os module Windows class ProductName FACT_NAME = 'os.windows.product_name' ALIASES = 'windows_product_name' def call_the_resolver fact_value = Facter::Resolvers::ProductRelease.resolve(:product_name) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/os/windows/release_id.rb000066400000000000000000000007551470204764400272760ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Os module Windows class ReleaseId FACT_NAME = 'os.windows.release_id' ALIASES = 'windows_release_id' def call_the_resolver fact_value = Facter::Resolvers::ProductRelease.resolve(:release_id) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/os/windows/system32.rb000066400000000000000000000007301470204764400266640ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Os module Windows class System32 FACT_NAME = 'os.windows.system32' ALIASES = 'system32' def call_the_resolver fact_value = Facter::Resolvers::System32.resolve(:system32) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/path.rb000066400000000000000000000004231470204764400240130ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class Path FACT_NAME = 'path' def call_the_resolver fact_value = Facter::Resolvers::Path.resolve(:path) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/processor.rb000066400000000000000000000007001470204764400250740ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class Processor FACT_NAME = 'processor.*' TYPE = :legacy def call_the_resolver arr = [] processors = Facter::Resolvers::Processors.resolve(:models) (0...processors.count).each do |iterator| arr << Facter::ResolvedFact.new("processor#{iterator}", processors[iterator], :legacy) end arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/processors/000077500000000000000000000000001470204764400247355ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/windows/processors/cores.rb000066400000000000000000000005361470204764400264010ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Processors class Cores FACT_NAME = 'processors.cores' def call_the_resolver fact_value = Facter::Resolvers::Processors.resolve(:cores_per_socket) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/processors/count.rb000066400000000000000000000006601470204764400264140ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Processors class Count FACT_NAME = 'processors.count' ALIASES = 'processorcount' def call_the_resolver fact_value = Facter::Resolvers::Processors.resolve(:count) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/processors/isa.rb000066400000000000000000000006471470204764400260450ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Processors class Isa FACT_NAME = 'processors.isa' ALIASES = 'hardwareisa' def call_the_resolver fact_value = Facter::Resolvers::Processors.resolve(:isa) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/processors/models.rb000066400000000000000000000005261470204764400265500ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Processors class Models FACT_NAME = 'processors.models' def call_the_resolver fact_value = Facter::Resolvers::Processors.resolve(:models) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/processors/physicalcount.rb000066400000000000000000000007201470204764400301460ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Processors class Physicalcount FACT_NAME = 'processors.physicalcount' ALIASES = 'physicalprocessorcount' def call_the_resolver fact_value = Facter::Resolvers::Processors.resolve(:physicalcount) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/processors/threads.rb000066400000000000000000000005421470204764400267150ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Processors class Threads FACT_NAME = 'processors.threads' def call_the_resolver fact_value = Facter::Resolvers::Processors.resolve(:threads_per_core) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/ruby/000077500000000000000000000000001470204764400235145ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/windows/ruby/platform.rb000066400000000000000000000006451470204764400256720ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Ruby class Platform FACT_NAME = 'ruby.platform' ALIASES = 'rubyplatform' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:platform) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/ruby/sitedir.rb000066400000000000000000000006411470204764400255050ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Ruby class Sitedir FACT_NAME = 'ruby.sitedir' ALIASES = 'rubysitedir' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:sitedir) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/ruby/version.rb000066400000000000000000000006411470204764400255270ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module Ruby class Version FACT_NAME = 'ruby.version' ALIASES = 'rubyversion' def call_the_resolver fact_value = Facter::Resolvers::Ruby.resolve(:version) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/scope6_interfaces.rb000066400000000000000000000010331470204764400264570ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class Scope6Interfaces FACT_NAME = 'scope6_.*' TYPE = :legacy def call_the_resolver arr = [] result = {} interfaces = Facter::Resolvers::Windows::Networking.resolve(:interfaces) interfaces&.each { |interface_name, info| result["scope6_#{interface_name}"] = info[:scope6] if info[:scope6] } result.each { |fact, value| arr << Facter::ResolvedFact.new(fact, value, :legacy) } arr end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/ssh.rb000066400000000000000000000013651470204764400236620ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class Ssh FACT_NAME = 'ssh' def call_the_resolver privileged = Facter::Resolvers::Identity.resolve(:privileged) ssh_info = Facter::Resolvers::Windows::Ssh.resolve(:ssh) if privileged ssh_facts = {} ssh_info&.each { |ssh| ssh_facts.merge!(create_ssh_fact(ssh)) } Facter::ResolvedFact.new(FACT_NAME, ssh_facts.empty? ? nil : ssh_facts) end private def create_ssh_fact(ssh) { ssh.name.to_sym => { fingerprints: { sha1: ssh.fingerprint.sha1, sha256: ssh.fingerprint.sha256 }, key: ssh.key, type: ssh.type } } end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/sshalgorithmkey.rb000066400000000000000000000010011470204764400262650ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class Sshalgorithmkey FACT_NAME = 'ssh.*key' TYPE = :legacy def call_the_resolver facts = [] privileged = Facter::Resolvers::Identity.resolve(:privileged) return facts unless privileged result = Facter::Resolvers::Windows::Ssh.resolve(:ssh) result&.each { |ssh| facts << Facter::ResolvedFact.new("ssh#{ssh.name.to_sym}key", ssh.key, :legacy) } facts end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/sshfp_algorithm.rb000066400000000000000000000011561470204764400262540ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class SshfpAlgorithm FACT_NAME = 'sshfp_.*' TYPE = :legacy def call_the_resolver facts = [] privileged = Facter::Resolvers::Identity.resolve(:privileged) return facts unless privileged result = Facter::Resolvers::Windows::Ssh.resolve(:ssh) result&.each do |ssh| facts << Facter::ResolvedFact.new("sshfp_#{ssh.name.to_sym}", "#{ssh.fingerprint.sha1}\n#{ssh.fingerprint.sha256}", :legacy) end facts end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/system_uptime/000077500000000000000000000000001470204764400254425ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/facts/windows/system_uptime/days.rb000066400000000000000000000006641470204764400267350ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module SystemUptime class Days FACT_NAME = 'system_uptime.days' ALIASES = 'uptime_days' def call_the_resolver fact_value = Facter::Resolvers::Windows::Uptime.resolve(:days) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/system_uptime/hours.rb000066400000000000000000000006701470204764400271320ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module SystemUptime class Hours FACT_NAME = 'system_uptime.hours' ALIASES = 'uptime_hours' def call_the_resolver fact_value = Facter::Resolvers::Windows::Uptime.resolve(:hours) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/system_uptime/seconds.rb000066400000000000000000000007001470204764400274220ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module SystemUptime class Seconds FACT_NAME = 'system_uptime.seconds' ALIASES = 'uptime_seconds' def call_the_resolver fact_value = Facter::Resolvers::Windows::Uptime.resolve(:seconds) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/system_uptime/uptime.rb000066400000000000000000000006651470204764400273010ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows module SystemUptime class Uptime FACT_NAME = 'system_uptime.uptime' ALIASES = 'uptime' def call_the_resolver fact_value = Facter::Resolvers::Windows::Uptime.resolve(:uptime) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/timezone.rb000066400000000000000000000004541470204764400247150ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class Timezone FACT_NAME = 'timezone' def call_the_resolver fact_value = Facter::Resolvers::Windows::Timezone.resolve(:timezone) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/facts/windows/virtual.rb000066400000000000000000000004571470204764400245540ustar00rootroot00000000000000# frozen_string_literal: true module Facts module Windows class Virtual FACT_NAME = 'virtual' def call_the_resolver fact_value = Facter::Resolvers::Windows::Virtualization.resolve(:virtual) Facter::ResolvedFact.new(FACT_NAME, fact_value) end end end end puppetlabs-facter-dfe6df4/lib/facter/fixtures/000077500000000000000000000000001470204764400216125ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/fixtures/facter_help_header000066400000000000000000000001071470204764400253170ustar00rootroot00000000000000Usage ===== facter [options] [query] [query] [...] Options ======= puppetlabs-facter-dfe6df4/lib/facter/framework/000077500000000000000000000000001470204764400217365ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/framework/benchmarking/000077500000000000000000000000001470204764400243665ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/framework/benchmarking/timer.rb000066400000000000000000000011321470204764400260300ustar00rootroot00000000000000# frozen_string_literal: true require 'benchmark' module Facter module Framework module Benchmarking class Timer class << self def measure(fact_name, prefix_message = '', &block) if Options[:timing] time = Benchmark.measure(&block) log = "fact '#{fact_name}', took: #{time.format('%r')} seconds" prefix_message = "#{prefix_message} " unless prefix_message.empty? puts "#{prefix_message}#{log}" else yield end end end end end end end puppetlabs-facter-dfe6df4/lib/facter/framework/cli/000077500000000000000000000000001470204764400225055ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/framework/cli/cli.rb000077500000000000000000000151601470204764400236070ustar00rootroot00000000000000#!/usr/bin/env ruby # frozen_string_literal: true require 'thor' module Facter class Cli < Thor class_option :color, type: :boolean, desc: 'Enable color output.' class_option :no_color, type: :boolean, desc: 'Disable color output.' class_option :config, aliases: '-c', type: :string, desc: 'The location of the config file.' class_option :custom_dir, type: :string, repeatable: true, desc: 'A directory to use for custom facts.' class_option :debug, aliases: '-d', type: :boolean, desc: 'Enable debug output.' class_option :external_dir, type: :string, repeatable: true, desc: 'A directory to use for external facts.' class_option :hocon, type: :boolean, desc: 'Output in Hocon format.' class_option :json, aliases: '-j', type: :boolean, desc: 'Output in JSON format.' class_option :log_level, aliases: '-l', type: :string, desc: 'Set logging level. Supported levels are: none, trace, debug, info, warn, error, and fatal.' class_option :no_block, type: :boolean, desc: 'Disable fact blocking.' class_option :no_cache, type: :boolean, desc: 'Disable loading and refreshing facts from the cache' class_option :no_custom_facts, type: :boolean, desc: 'Disable custom facts.' class_option :no_external_facts, type: :boolean, desc: 'Disable external facts.' class_option :no_ruby, type: :boolean, desc: 'Disable loading Ruby, facts requiring Ruby, and custom facts.' class_option :trace, type: :boolean, desc: 'Enable backtraces for custom facts.' class_option :verbose, type: :boolean, desc: 'Enable verbose (info) output.' class_option :show_legacy, type: :boolean, desc: 'Show legacy facts when querying all facts.' class_option :yaml, aliases: '-y', type: :boolean, desc: 'Output in YAML format.' class_option :strict, type: :boolean, desc: 'Enable more aggressive error reporting.' class_option :timing, type: :boolean, aliases: '-t', desc: 'Show how much time it took to resolve each fact' class_option :sequential, type: :boolean, desc: 'Resolve facts sequentially' class_option :http_debug, type: :boolean, desc: 'Whether to write HTTP request and responses to stderr. This should never be used in production.' class_option :puppet, type: :boolean, aliases: '-p', desc: 'Load the Puppet libraries, thus allowing Facter to load Puppet-specific facts.' desc '--man', 'Display manual.', hide: true map ['--man'] => :man def man(*args) require 'erb' negate_options = %w[block cache custom_facts external_facts] template = File.join(File.dirname(__FILE__), '..', '..', 'templates', 'man.erb') erb = ERB.new(File.read(template), nil, '-') erb.filename = template puts erb.result(binding) end desc 'query', 'Default method', hide: true def query(*args) Facter.puppet_facts if options[:puppet] output, status = Facter.to_user_output(@options, *args) puts output status = 1 if Facter::Log.errors? exit status end desc 'arg_parser', 'Parse arguments', hide: true def arg_parser(*args) # ignore unknown options args.reject! { |arg| arg.start_with?('-') } Facter.values(@options, args) end desc '--version, -v', 'Print the version' map ['--version', '-v'] => :version def version(*_args) puts Facter::VERSION end desc '--list-block-groups', 'List block groups' map ['--list-block-groups'] => :list_block_groups def list_block_groups options = @options.map { |(k, v)| [k.to_sym, v] }.to_h Facter::Options.init_from_cli(options) block_groups = Facter::FactGroups.new.groups.to_yaml.lines[1..-1].join block_groups.gsub!(/:\s*\n/, "\n") puts block_groups end desc '--list-cache-groups', 'List cache groups' map ['--list-cache-groups'] => :list_cache_groups def list_cache_groups options = @options.map { |(k, v)| [k.to_sym, v] }.to_h Facter::Options.init_from_cli(options) cache_groups = Facter::FactGroups.new.groups.to_yaml.lines[1..-1].join cache_groups.gsub!(/:\s*\n/, "\n") puts cache_groups end desc '--help, -h', 'Help for all arguments' def help(*args) help_string = +'' help_string << help_header(args) help_string << add_class_options_to_help help_string << add_commands_to_help puts help_string end no_commands do def help_header(_args) path = File.join(File.dirname(__FILE__), '../../') Facter::Util::FileHelper.safe_read("#{path}fixtures/facter_help_header") end def add_class_options_to_help help_class_options = +'' class_options = Cli.class_options class_options.each do |class_option| option = class_option[1] next if option.hide help_class_options << build_option(option.name, option.aliases, option.description) end help_class_options end def add_commands_to_help help_command_options = +'' Cli.commands.values .select { |command_class| command_class.instance_of?(Thor::Command) } .each do |command| help_command_options << build_option( command['name'], [command['usage'].split(',')[1]], command['description'] ) end help_command_options end def build_option(name, aliases, description) name = name.tr('_', '-') help_option = +'' help_option << aliases.join(',').rjust(10) help_option << ' ' help_option << "[--#{name}]".ljust(30) help_option << " #{description}" help_option << "\n" help_option end end def self.exit_on_failure? true end default_task :query end end puppetlabs-facter-dfe6df4/lib/facter/framework/cli/cli_launcher.rb000077500000000000000000000027571470204764400255000ustar00rootroot00000000000000#!/usr/bin/env ruby # frozen_string_literal: true require_relative '../../../facter/framework/logging/logger' Facter::Log.output(STDERR) require_relative '../../../facter' require_relative '../../../facter/framework/cli/cli' class CliLauncher class << self def prepare_arguments(args, task = Facter::Cli.default_task) args.unshift(task) unless check_if_arguments_is_known(Facter::Cli.all_tasks, args) || check_if_arguments_is_known(Facter::Cli.instance_variable_get(:@map), args) || !task reorder_program_arguments(args) end def start(args) # stop parsing arguments if we don't recognize them Thor.check_unknown_options! Facter::Cli.start(args, debug: true) rescue Thor::UnknownArgumentError => e Facter::OptionsValidator.write_error_and_exit("unrecognised option '#{e.unknown.first}'") end private def check_if_arguments_is_known(known_arguments, program_arguments) program_arguments.each do |argument| return true if known_arguments.key?(argument) end false end def reorder_program_arguments(program_arguments) priority_arguments = Facter::Cli.instance_variable_get(:@map) priority_args = [] normal_args = [] program_arguments.each do |argument| if priority_arguments.include?(argument) priority_args << argument else normal_args << argument end end priority_args.concat(normal_args) end end end puppetlabs-facter-dfe6df4/lib/facter/framework/config/000077500000000000000000000000001470204764400232035ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/framework/config/config_reader.rb000066400000000000000000000024731470204764400263250ustar00rootroot00000000000000# frozen_string_literal: true module Facter class ConfigReader class << self attr_accessor :conf def init(config_path = nil) config_path ||= default_path refresh_config(config_path) self end def block_list @conf['facts'] && @conf['facts']['blocklist'] end def ttls @conf['facts'] && @conf['facts']['ttls'] end def global @conf['global'] end def cli @conf['cli'] end def fact_groups @conf['fact-groups'] end def refresh_config(config_path) @conf = File.readable?(config_path) ? Hocon.load(config_path) : {} rescue StandardError => e log.warn("Facter failed to read config file #{config_path} with the following error: #{e.message}") @conf = {} end def clear @conf = {} end private def log @log ||= Log.new(self) end def default_path return '' if RUBY_PLATFORM == 'java' os = OsDetector.instance.identifier windows_path = File.join('C:', 'ProgramData', 'PuppetLabs', 'facter', 'etc', 'facter.conf') linux_path = File.join('/', 'etc', 'puppetlabs', 'facter', 'facter.conf') os == :windows ? windows_path : linux_path end end end end puppetlabs-facter-dfe6df4/lib/facter/framework/config/fact_groups.rb000066400000000000000000000076001470204764400260470ustar00rootroot00000000000000# frozen_string_literal: true require_relative '../../../facter/config' module Facter class FactGroups attr_accessor :groups_ttls attr_reader :groups, :block_list, :facts_ttls STRING_TO_SECONDS = { 'ns' => 1.fdiv(1_000_000_000), 'nanos' => 1.fdiv(1_000_000_000), 'nanoseconds' => 1.fdiv(1_000_000_000), 'us' => 1.fdiv(1_000_000), 'micros' => 1.fdiv(1_000_000), 'microseconds' => 1.fdiv(1_000_000), '' => 1.fdiv(1000), 'ms' => 1.fdiv(1000), 'milis' => 1.fdiv(1000), 'milliseconds' => 1.fdiv(1000), 's' => 1, 'seconds' => 1, 'm' => 60, 'minutes' => 60, 'h' => 3600, 'hours' => 3600, 'd' => 3600 * 24, 'days' => 3600 * 24 }.freeze def initialize @groups = Facter::Config::FACT_GROUPS.dup load_groups load_groups_from_options load_facts_ttls # Reverse sort facts so that children have precedence when caching. eg: os.macosx vs os @facts_ttls = @facts_ttls.sort.reverse.to_h end # Breakes down blocked groups in blocked facts def blocked_facts fact_list = [] @block_list.each do |group_name| # legacy is a special group and does not need to be broken into facts next if group_name == 'legacy' facts_for_block = @groups[group_name] fact_list += facts_for_block || [group_name] end fact_list end # Get the group name a fact is part of def get_fact_group(fact_name) fact = get_fact(fact_name) return fact[:group] if fact # @groups.detect { |k, v| break k if Array(v).find { |f| fact_name =~ /^#{f}.*/ } } @groups.detect do |k, v| break k if Array(v).find { |f| fact_name.include?('.*') ? fact_name == f : fact_name =~ /^#{f}.*/ } end end # Get config ttls for a given group def get_group_ttls(group_name) return unless (ttls = @groups_ttls.find { |g| g[group_name] }) ttls_to_seconds(ttls[group_name]) end def get_fact(fact_name) return @facts_ttls[fact_name] if @facts_ttls[fact_name] result = @facts_ttls.select { |name, fact| break fact if /^#{name}\..*/.match?(fact_name) } return nil if result == {} result end private def load_groups_from_options Options.external_dir.each do |dir| next unless Dir.exist?(dir) ext_facts = Dir.entries(dir) ext_facts.reject! { |ef| ef =~ /^(\.|\.\.)$/ } ext_facts.each do |ef| @groups[ef] = nil end end end def load_facts_ttls @facts_ttls ||= {} return if @groups_ttls == [] @groups_ttls.reduce(:merge).each do |group, ttls| ttls = ttls_to_seconds(ttls) if @groups[group] @groups[group].each do |fact| if (@facts_ttls[fact] && @facts_ttls[fact][:ttls] < ttls) || @facts_ttls[fact].nil? @facts_ttls[fact] = { ttls: ttls, group: group } end end else @facts_ttls[group] = { ttls: ttls, group: group } end end end def load_groups config = ConfigReader.init(Options[:config]) @block_list = config.block_list || [] @groups_ttls = config.ttls || [] @groups.merge!(config.fact_groups) if config.fact_groups end def ttls_to_seconds(ttls) duration, unit = ttls.split(' ', 2) unit = '' if duration && !unit unit = append_s(unit) seconds = STRING_TO_SECONDS[unit] if seconds (duration.to_i * seconds).to_i else log = Log.new(self) log.error("Could not parse time unit #{unit} (try #{STRING_TO_SECONDS.keys.reject(&:empty?).join(', ')})") nil end end def append_s(unit) return "#{unit}s" if unit.length > 2 && unit[-1] != 's' unit end end end puppetlabs-facter-dfe6df4/lib/facter/framework/core/000077500000000000000000000000001470204764400226665ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/framework/core/cache_manager.rb000066400000000000000000000147631470204764400257630ustar00rootroot00000000000000# frozen_string_literal: true module Facter class CacheManager def initialize @groups = {} @log = Log.new(self) @fact_groups = Facter::FactGroups.new @cache_dir = LegacyFacter::Util::Config.facts_cache_dir end def resolve_facts(searched_facts) return searched_facts, [] if (!File.directory?(@cache_dir) || !Options[:cache]) && Options[:ttls].any? facts = [] searched_facts.delete_if do |fact| res = resolve_fact(fact) if res facts << res true else false end end [searched_facts, facts.flatten] end def cache_facts(resolved_facts) return unless Options[:cache] && Options[:ttls].any? @groups = {} resolved_facts.each do |fact| cache_fact(fact) end begin write_cache unless @groups.empty? rescue Errno::EACCES => e @log.warn("Could not write cache: #{e.message}") end end def fact_cache_enabled?(fact_name) fact = @fact_groups.get_fact(fact_name) if fact !fact[:ttls].nil? else false end # fact_group = @fact_groups.get_fact_group(fact_name) # delete_cache(fact_group) if fact_group && !cached end private def resolve_fact(searched_fact) fact_name = if searched_fact.file File.basename(searched_fact.file) else searched_fact.name end return unless fact_cache_enabled?(fact_name) fact = @fact_groups.get_fact(fact_name) return if external_fact_in_custom_group?(searched_fact, fact_name, fact) return unless fact return unless check_ttls?(fact[:group], fact[:ttls]) read_fact(searched_fact, fact[:group]) end def external_fact_in_custom_group?(searched_fact, fact_name, fact) if searched_fact.type == :file && fact[:group] != fact_name @log.error("Cannot cache '#{fact_name}' fact from '#{fact[:group]}' group. "\ 'Caching custom group is not supported for external facts.') return true end false end def read_fact(searched_fact, fact_group) data = nil Facter::Framework::Benchmarking::Timer.measure(searched_fact.name, 'cached') do data = read_group_json(fact_group) end return unless data unless searched_fact.file return unless valid_format_version?(searched_fact, data, fact_group) delete_cache(fact_group) unless data.keys.grep(/#{searched_fact.name}/).any? # data.fetch(searched_fact.name) { delete_cache(fact_group) } end @log.debug("loading cached values for #{searched_fact.name} facts") create_facts(searched_fact, data) end def valid_format_version?(searched_fact, data, fact_group) unless data['cache_format_version'] == 1 @log.debug("The fact #{searched_fact.name} could not be read from the cache, \ cache_format_version is incorrect!") delete_cache(fact_group) return false end true end def create_facts(searched_fact, data) if searched_fact.type == :file resolve_external_fact(searched_fact, data) else return unless data[searched_fact.name] [Facter::ResolvedFact.new(searched_fact.name, data[searched_fact.name], searched_fact.type, searched_fact.user_query)] end end def resolve_external_fact(searched_fact, data) facts = [] data.each do |fact_name, fact_value| next if fact_name == 'cache_format_version' fact = Facter::ResolvedFact.new(fact_name, fact_value, searched_fact.type, searched_fact.user_query) fact.file = searched_fact.file facts << fact end facts end def cache_fact(fact) fact_name = if fact.file File.basename(fact.file) else fact.name end group_name = @fact_groups.get_fact_group(fact_name) return unless group_name return unless fact_cache_enabled?(fact_name) @groups[group_name] ||= {} @groups[group_name][fact.name] = fact.value end def write_cache unless File.directory?(@cache_dir) require 'fileutils' FileUtils.mkdir_p(@cache_dir) end @groups.each do |group_name, data| next unless check_ttls?(group_name, @fact_groups.get_group_ttls(group_name)) cache_file_name = File.join(@cache_dir, group_name) next if facts_already_cached?(cache_file_name, data) @log.debug("caching values for #{group_name} facts") data['cache_format_version'] = 1 File.write(cache_file_name, JSON.pretty_generate(data)) end end def facts_already_cached?(cache_file_name, data) if File.readable?(cache_file_name) file = Facter::Util::FileHelper.safe_read(cache_file_name) begin cached_data = JSON.parse(file) unless file.nil? return true if (data.keys - cached_data.keys).empty? rescue JSON::ParserError => e @log.debug("Failed to read cache file #{cache_file_name}. Detail: #{e.message}") rescue NoMethodError => e @log.debug("No keys found in #{cache_file_name}. Detail: #{e.message}") end end false end def read_group_json(group_name) return @groups[group_name] if @groups.key?(group_name) cache_file_name = File.join(@cache_dir, group_name) data = nil file = Facter::Util::FileHelper.safe_read(cache_file_name) begin data = JSON.parse(file) unless file.nil? rescue JSON::ParserError delete_cache(group_name) end @groups[group_name] = data end def check_ttls?(group_name, ttls) return false unless ttls cache_file_name = File.join(@cache_dir, group_name) if File.readable?(cache_file_name) file_time = File.mtime(cache_file_name) expire_date = file_time + ttls return true if expire_date > Time.now File.delete(cache_file_name) end @log.debug("#{group_name} facts cache file expired, missing or is corrupt") true end def delete_cache(group_name) cache_file_name = File.join(@cache_dir, group_name) begin File.delete(cache_file_name) if File.readable?(cache_file_name) rescue Errno::EACCES, Errno::EROFS => e @log.warn("Could not delete cache: #{e.message}") end end end end puppetlabs-facter-dfe6df4/lib/facter/framework/core/fact/000077500000000000000000000000001470204764400236035ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/framework/core/fact/external/000077500000000000000000000000001470204764400254255ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/framework/core/fact/external/external_fact_manager.rb000066400000000000000000000015011470204764400322600ustar00rootroot00000000000000# frozen_string_literal: true module Facter class ExternalFactManager def resolve_facts(searched_facts) searched_facts = filter_external_facts(searched_facts) external_facts(searched_facts) end private def filter_external_facts(searched_facts) searched_facts.select { |searched_fact| %i[custom external].include?(searched_fact.type) } end def external_facts(custom_facts) resolved_custom_facts = [] custom_facts.each do |custom_fact| fact = LegacyFacter[custom_fact.name] resolved_fact = ResolvedFact.new(custom_fact.name, fact.value, :custom) resolved_fact.user_query = custom_fact.user_query resolved_fact.file = fact.options[:file] resolved_custom_facts << resolved_fact end resolved_custom_facts end end end puppetlabs-facter-dfe6df4/lib/facter/framework/core/fact/internal/000077500000000000000000000000001470204764400254175ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/framework/core/fact/internal/core_fact.rb000066400000000000000000000006631470204764400276760ustar00rootroot00000000000000# frozen_string_literal: true module Facter class CoreFact def initialize(searched_fact) @searched_fact = searched_fact end def create fact_class = @searched_fact.fact_class return unless fact_class fact_value = nil Facter::Framework::Benchmarking::Timer.measure(@searched_fact.name) do fact_value = fact_class.new.call_the_resolver end fact_value end end end puppetlabs-facter-dfe6df4/lib/facter/framework/core/fact/internal/internal_fact_manager.rb000066400000000000000000000045611470204764400322550ustar00rootroot00000000000000# frozen_string_literal: true module Facter class InternalFactManager # resolves each SearchFact and filter out facts that do not match the given user query # @param searched_facts [Array] array of searched facts # # @return [Array] # # @api private def resolve_facts(searched_facts) internal_searched_facts = filter_internal_facts(searched_facts) resolved_facts = if Options[:sequential] resolve_sequentially(internal_searched_facts) else resolve_in_parallel(internal_searched_facts) end resolved_facts.flatten! resolved_facts.compact! nil_resolved_facts = resolve_nil_facts(searched_facts) resolved_facts.concat(nil_resolved_facts) end private def filter_internal_facts(searched_facts) searched_facts.select { |searched_fact| %i[core legacy].include? searched_fact.type } end def valid_fact?(searched_fact, resolved_fact) return if resolved_fact.value.nil? searched_fact_name = searched_fact.name if searched_fact_name.include?('.*') resolved_fact.name.match(searched_fact_name) else resolved_fact.name == searched_fact_name end end def resolve_nil_facts(searched_facts) resolved_facts = [] searched_facts.select { |fact| fact.type == :nil }.each do |fact| resolved_facts << ResolvedFact.new(fact.name, nil, :nil, fact.name) end resolved_facts end def resolve_sequentially(searched_facts) searched_facts.map! { |searched_fact| resolve_fact(searched_fact) } end def resolve_in_parallel(searched_facts) searched_facts.map! do |searched_fact| Thread.new { resolve_fact(searched_fact) } end.map!(&:value) end def resolve_fact(searched_fact) fact_value = core_fact(searched_fact) Array(fact_value).map! do |resolved_fact| if valid_fact?(searched_fact, resolved_fact) resolved_fact.user_query = searched_fact.user_query resolved_fact end end end def core_fact(searched_fact) fact = CoreFact.new(searched_fact) fact.create rescue StandardError => e log.log_exception(e) nil end def log @log ||= Facter::Log.new(self) end end end puppetlabs-facter-dfe6df4/lib/facter/framework/core/fact_filter.rb000066400000000000000000000015721470204764400255020ustar00rootroot00000000000000# frozen_string_literal: true module Facter class FactFilter def filter_facts!(resolved_facts, user_query) filter_legacy_facts!(resolved_facts) if user_query.empty? filter_blocked_legacy_facts!(resolved_facts) resolved_facts end private # This will filter out the legacy facts that should be blocked. Because some legacy facts are just aliases # to the core ones, even if they are blocked, facter will resolved them but they won't be displayed. def filter_blocked_legacy_facts!(facts) blocked_facts = Options[:blocked_facts] || [] facts.reject! do |fact| blocked_facts.select { |blocked_fact| fact.name.match(/^#{blocked_fact}/) && fact.type == :legacy }.any? end end def filter_legacy_facts!(resolved_facts) return if Options[:show_legacy] resolved_facts.reject!(&:legacy?) end end end puppetlabs-facter-dfe6df4/lib/facter/framework/core/fact_loaders/000077500000000000000000000000001470204764400253145ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/framework/core/fact_loaders/class_discoverer.rb000066400000000000000000000015521470204764400311760ustar00rootroot00000000000000# frozen_string_literal: true module Facter class ClassDiscoverer include Singleton def initialize @log = Log.new(self) end def discover_classes(operating_system) os_module_name = Module.const_get("Facts::#{operating_system}") # select only classes find_nested_classes(os_module_name, discovered_classes = []) discovered_classes rescue NameError @log.debug("There is no module named #{operating_system}") [] end def find_nested_classes(mod, discovered_classes) mod.constants.each do |constant_name| obj = mod.const_get(constant_name) if obj.instance_of? Class discovered_classes << obj elsif obj.instance_of? Module find_nested_classes(Module.const_get("#{mod.name}::#{constant_name}"), discovered_classes) end end end end end puppetlabs-facter-dfe6df4/lib/facter/framework/core/fact_loaders/external_fact_loader.rb000066400000000000000000000022251470204764400320070ustar00rootroot00000000000000# frozen_string_literal: true module Facter class ExternalFactLoader def custom_facts @custom_facts = load_custom_facts end def external_facts @external_facts = load_external_facts end def load_fact(fact_name) build_custom_facts(LegacyFacter.collection.custom_fact(fact_name)) || [] end private def load_custom_facts custom_facts_to_load = LegacyFacter.collection.custom_facts build_custom_facts(custom_facts_to_load) || [] end def build_custom_facts(custom_facts_to_load) custom_facts_to_load&.map do |k, v| loaded_fact = LoadedFact.new(k.to_s, nil, :custom) loaded_fact.is_env = v.options[:is_env] if v.options[:is_env] loaded_fact end end def load_external_facts external_facts = [] external_facts_to_load = LegacyFacter.collection.external_facts external_facts_to_load&.each do |k, v| loaded_fact = LoadedFact.new(k.to_s, nil, :external) loaded_fact.file = v.options[:file] loaded_fact.is_env = v.options[:is_env] external_facts << loaded_fact end external_facts end end end puppetlabs-facter-dfe6df4/lib/facter/framework/core/fact_loaders/fact_loader.rb000066400000000000000000000071371470204764400301140ustar00rootroot00000000000000# frozen_string_literal: true module Facter class FactLoader include Singleton attr_reader :internal_facts, :external_facts, :facts def initialize @log = Log.new(self) @internal_facts = [] @external_facts = [] @custom_facts = [] @facts = [] @internal_loader ||= InternalFactLoader.new @external_fact_loader ||= ExternalFactLoader.new end def load(user_query, options) @internal_facts = load_internal_facts(user_query, options) @custom_facts = load_custom_facts(options) if ENV['INSIDE_FACTER'] @log.debug('INSIDE_FACTER env var detected, not loading external facts to prevent recursion') if options[:external_facts] @log.warn('Recursion detected, skipping external facts. Silence this warning by adding --no-external-facts') end else begin ENV['INSIDE_FACTER'] = 'true' @external_facts = load_external_facts(options) ensure ENV.delete('INSIDE_FACTER') end end filter_env_facts @facts = @internal_facts + @external_facts + @custom_facts end def load_internal_facts(user_query, options) internal_facts = [] if user_query || options[:show_legacy] # if we have a user query, then we must search in core facts and legacy facts @log.debug('Loading all internal facts') internal_facts = @internal_loader.facts else @log.debug('Load only core facts') internal_facts = @internal_loader.core_facts end block_facts(internal_facts, options) end def load_custom_fact(options, fact_name) return [] unless options[:custom_facts] custom_facts = @external_fact_loader.load_fact(fact_name) block_facts(custom_facts, options) end def load_custom_facts(options) return [] unless options[:custom_facts] @log.debug('Loading custom facts') custom_facts = @external_fact_loader.custom_facts block_facts(custom_facts, options) end def load_external_facts(options) return [] unless options[:external_facts] @log.debug('Loading external facts') external_facts = @external_fact_loader.external_facts block_facts(external_facts, options) end private def filter_env_facts env_fact_names = @external_facts.select { |fact| fact.is_env == true }.map(&:name) return unless env_fact_names.any? @internal_facts.delete_if do |fact| if env_fact_names.include?(fact.name) @log.debug("Reading #{fact.name} fact from environment variable") true else false end end end def block_facts(facts, options) blocked_facts = options[:blocked_facts] || [] facts.reject! { |fact| fact.type == :legacy } if options[:block_list]&.include?('legacy') reject_list_core, reject_list_legacy = construct_reject_lists(blocked_facts, facts) facts.reject do |fact| reject_list_core.include?(fact) || reject_list_core.find do |fact_to_block| fact_to_block.klass == fact.klass end || reject_list_legacy.include?(fact) end end def construct_reject_lists(blocked_facts, facts) reject_list_core = [] reject_list_legacy = [] blocked_facts.each do |blocked| facts.each do |fact| next unless /^#{blocked}\..*|^#{blocked}$/.match?(fact.name) if fact.type == :core reject_list_core << fact else reject_list_legacy << fact end end end [reject_list_core, reject_list_legacy] end end end puppetlabs-facter-dfe6df4/lib/facter/framework/core/fact_loaders/internal_fact_loader.rb000066400000000000000000000026531470204764400320060ustar00rootroot00000000000000# frozen_string_literal: true module Facter class InternalFactLoader attr_reader :facts def core_facts @facts.select { |fact| fact.type == :core } end def legacy_facts @facts.select { |fact| fact.type == :legacy } end def initialize(os_descendents = nil) @facts = [] os_descendents ||= OsDetector.instance.hierarchy load_all_oses_in_descending_order(os_descendents) end private def load_all_oses_in_descending_order(os_descendents) os_descendents.reverse_each do |os| load_for_os(os) end end def load_for_os(operating_system) # select only classes classes = ClassDiscoverer.instance.discover_classes(operating_system) classes.each do |class_name| fact_name = class_name::FACT_NAME # if fact is already loaded, skip it unless @facts.any? { |fact| fact.name == fact_name } type = class_name.const_defined?('TYPE') ? class_name::TYPE : :core load_fact(fact_name, class_name, type) end next unless class_name.const_defined?('ALIASES') [*class_name::ALIASES].each do |fact_alias| load_fact(fact_alias, class_name, :legacy) unless @facts.any? { |fact| fact.name == fact_alias } end end end def load_fact(fact_name, klass, type) loaded_fact = LoadedFact.new(fact_name, klass, type) @facts << loaded_fact end end end puppetlabs-facter-dfe6df4/lib/facter/framework/core/fact_manager.rb000066400000000000000000000123701470204764400256250ustar00rootroot00000000000000# frozen_string_literal: true module Facter class FactManager include Singleton def initialize @internal_fact_mgr = InternalFactManager.new @external_fact_mgr = ExternalFactManager.new @fact_loader = FactLoader.instance @options = Options.get @log = Log.new(self) end def resolve_facts(user_query = []) log_resolving_method @options[:user_query] = user_query cache_manager = Facter::CacheManager.new searched_facts = QueryParser.parse(user_query, @fact_loader.load(user_query, @options)) searched_facts, cached_facts = cache_manager.resolve_facts(searched_facts) internal_facts = @internal_fact_mgr.resolve_facts(searched_facts) external_facts = @external_fact_mgr.resolve_facts(searched_facts) resolved_facts = override_core_facts(internal_facts, external_facts) resolved_facts.concat(cached_facts) cache_manager.cache_facts(resolved_facts) FactFilter.new.filter_facts!(resolved_facts, user_query) log_resolved_facts(resolved_facts) resolved_facts end # resolve a fact by name, in a similar way that facter 3 does. # search is done in multiple steps, and the next step is executed # only if the previous one was not able to resolve the fact # - load the `fact_name.rb` from the configured custom directories # - load all the core facts, external facts and env facts # - load all custom facts def resolve_fact(user_query) log_resolving_method @options[:user_query] = user_query @log.debug("resolving fact with user_query: #{user_query}") @cache_manager = Facter::CacheManager.new custom_facts = custom_fact_by_filename(user_query) || [] core_and_external_facts = core_or_external_fact(user_query) || [] resolved_facts = core_and_external_facts + custom_facts if resolved_facts.empty? || resolved_facts.none? { |rf| rf.resolves?(user_query) } resolved_facts.concat(all_custom_facts(user_query)) end @cache_manager.cache_facts(resolved_facts) log_resolved_facts(resolved_facts) resolved_facts end def resolve_core(user_query = [], options = {}) log_resolving_method @cache_manager = CacheManager.new core_fact(user_query, options) end private def log_resolving_method if Options[:sequential] @log.debugonce('Resolving facts sequentially') else @log.debugonce('Resolving fact in parallel') end end def core_fact(user_query, options) loaded_facts_hash = @fact_loader.load_internal_facts(user_query, options) searched_facts = QueryParser.parse(user_query, loaded_facts_hash) searched_facts, cached_facts = @cache_manager.resolve_facts(searched_facts) resolved_facts = @internal_fact_mgr.resolve_facts(searched_facts) resolved_facts.concat(cached_facts) FactFilter.new.filter_facts!(resolved_facts, user_query) resolved_facts end def custom_fact_by_filename(user_query) @log.debug("Searching fact: #{user_query} in file: #{user_query}.rb") custom_fact = @fact_loader.load_custom_fact(@options, user_query) return unless custom_fact.any? searched_facts = parse_user_query(custom_fact, user_query) searched_facts, cached_facts = @cache_manager.resolve_facts(searched_facts) resolved_facts = @external_fact_mgr.resolve_facts(searched_facts) resolved_facts.concat(cached_facts) resolved_facts if resolved_facts.any? end def core_or_external_fact(user_query) @log.debug("Searching fact: #{user_query} in core facts and external facts") core_facts = core_fact([user_query], @options) external_facts = @fact_loader.load_external_facts(@options) searched_facts = parse_user_query(external_facts, user_query) searched_facts, cached_facts = @cache_manager.resolve_facts(searched_facts) resolved_facts = @external_fact_mgr.resolve_facts(searched_facts) resolved_facts = override_core_facts(core_facts, resolved_facts) resolved_facts.concat(cached_facts) resolved_facts unless resolved_facts.map(&:value).compact.empty? end def all_custom_facts(user_query) @log.debug("Searching fact: #{user_query} in all custom facts") custom_facts = @fact_loader.load_custom_facts(@options) searched_facts = parse_user_query(custom_facts, user_query) searched_facts, cached_facts = @cache_manager.resolve_facts(searched_facts) resolved_facts = @external_fact_mgr.resolve_facts(searched_facts) resolved_facts.concat(cached_facts) end def parse_user_query(loaded_facts, user_query) user_query = Array(user_query) QueryParser.parse(user_query, loaded_facts) end def override_core_facts(core_facts, custom_facts) return core_facts unless custom_facts custom_facts.each do |custom_fact| core_facts.delete_if { |core_fact| root_fact_name(core_fact) == custom_fact.name } end core_facts + custom_facts end def root_fact_name(fact) fact.name.split('.').first end def log_resolved_facts(resolved_facts) resolved_facts.each do |fact| @log.debug("fact \"#{fact.name}\" has resolved to: #{fact.value}") unless fact.value.nil? end end end end puppetlabs-facter-dfe6df4/lib/facter/framework/core/file_loader.rb000066400000000000000000001454131470204764400254700ustar00rootroot00000000000000# frozen_string_literal: true require 'open3' require 'json' require 'yaml' require 'hocon' require 'hocon/config_value_factory' require 'singleton' require 'logger' require_relative '../../framework/core/options/config_file_options' require_relative '../../framework/core/options/option_store' require_relative '../../framework/core/options/options_validator' require_relative '../../../facter/framework/core/options' require_relative '../../../facter/framework/logging/logger_helper' require_relative '../../../facter/framework/logging/logger' require_relative '../../../facter/util/file_helper' require_relative '../../../facter/resolvers/base_resolver' require_relative '../../../facter/framework/detector/os_hierarchy' require_relative '../../../facter/framework/detector/os_detector' require_relative '../../../facter/framework/config/config_reader' require_relative '../../../facter/framework/config/fact_groups' require_relative '../../util/api_debugger' require_relative '../../util/file_helper' require_relative '../../util/utils' require_relative '../../util/resolvers/aws_token' require_relative '../../util/resolvers/filesystem_helper' require_relative '../../util/resolvers/fingerprint' require_relative '../../util/resolvers/http' require_relative '../../util/resolvers/ssh' require_relative '../../util/resolvers/ssh_helper' require_relative '../../util/resolvers/uptime_helper' require_relative '../../util/facts/facts_utils' require_relative '../../util/facts/unit_converter' require_relative '../../util/facts/uptime_parser' require_relative '../../util/facts/windows_release_finder' require_relative '../../util/facts/posix/virtual_detector' require_relative '../../util/resolvers/networking/dhcp' require_relative '../../util/resolvers/networking/networking' require_relative '../../util/resolvers/networking/primary_interface' require_relative '../../resolvers/aio_agent_version' require_relative '../../resolvers/augeas' require_relative '../../resolvers/az' require_relative '../../resolvers/base_resolver' require_relative '../../resolvers/containers' require_relative '../../resolvers/debian_version' require_relative '../../resolvers/disks' require_relative '../../resolvers/dmi' require_relative '../../resolvers/dmi_decode' require_relative '../../resolvers/ec2' require_relative '../../resolvers/eos_release' require_relative '../../resolvers/facterversion' require_relative '../../resolvers/filesystems' require_relative '../../resolvers/fips_enabled' require_relative '../../resolvers/gce' require_relative '../../resolvers/hostname' require_relative '../../resolvers/identity' require_relative '../../resolvers/load_averages' require_relative '../../resolvers/lpar' require_relative '../../resolvers/lsb_release' require_relative '../../resolvers/lspci' require_relative '../../resolvers/memory' require_relative '../../resolvers/mountpoints' require_relative '../../resolvers/networking' require_relative '../../resolvers/open_vz' require_relative '../../resolvers/os_release' require_relative '../../resolvers/partitions' require_relative '../../resolvers/path' require_relative '../../resolvers/processors' require_relative '../../resolvers/processors_lscpu' require_relative '../../resolvers/redhat_release' require_relative '../../resolvers/release_from_first_line' require_relative '../../resolvers/ruby' require_relative '../../resolvers/selinux' require_relative '../../resolvers/specific_release_file' require_relative '../../resolvers/ssh' require_relative '../../resolvers/suse_release' require_relative '../../resolvers/sw_vers' require_relative '../../resolvers/timezone' require_relative '../../resolvers/uname' require_relative '../../resolvers/uptime' require_relative '../../resolvers/virt_what' require_relative '../../resolvers/vmware' require_relative '../../resolvers/wpar' require_relative '../../resolvers/xen' require_relative '../../resolvers/zfs' require_relative '../../resolvers/zpool' require_relative '../../framework/core/cache_manager' require_relative '../../framework/core/fact_filter' require_relative '../../framework/core/fact_manager' require_relative '../../framework/core/options' require_relative '../../framework/core/session_cache' require_relative '../../models/fact_collection' require_relative '../../models/loaded_fact' require_relative '../../models/resolved_fact' require_relative '../../models/searched_fact' require_relative '../../framework/benchmarking/timer' require_relative '../../framework/core/fact_loaders/class_discoverer' require_relative '../../framework/core/fact_loaders/external_fact_loader' require_relative '../../framework/core/fact_loaders/fact_loader' require_relative '../../framework/core/fact_loaders/internal_fact_loader' require_relative '../../framework/core/fact/internal/core_fact' require_relative '../../framework/core/fact/internal/internal_fact_manager' require_relative '../../framework/core/fact/external/external_fact_manager' require_relative '../../framework/formatters/formatter_factory' require_relative '../../framework/formatters/formatter_helper' require_relative '../../framework/formatters/hocon_fact_formatter' require_relative '../../framework/formatters/json_fact_formatter' require_relative '../../framework/formatters/legacy_fact_formatter' require_relative '../../framework/formatters/yaml_fact_formatter' os_hierarchy = OsDetector.instance.hierarchy os_hierarchy.each do |os| case os.downcase when 'aix' require_relative '../../util/aix/info_extractor' require_relative '../../util/aix/odm_query' require_relative '../../facts/aix/aio_agent_version' require_relative '../../facts/aix/augeas/version' require_relative '../../facts/aix/disks' require_relative '../../facts/aix/facterversion' require_relative '../../facts/aix/filesystems' require_relative '../../facts/aix/hypervisors/lpar' require_relative '../../facts/aix/hypervisors/wpar' require_relative '../../facts/aix/identity/gid' require_relative '../../facts/aix/identity/group' require_relative '../../facts/aix/identity/privileged' require_relative '../../facts/aix/identity/uid' require_relative '../../facts/aix/identity/user' require_relative '../../facts/aix/interfaces' require_relative '../../facts/aix/ipaddress6_interfaces' require_relative '../../facts/aix/ipaddress_interfaces' require_relative '../../facts/aix/kernel' require_relative '../../facts/aix/kernelmajversion' require_relative '../../facts/aix/kernelrelease' require_relative '../../facts/aix/kernelversion' require_relative '../../facts/aix/load_averages' require_relative '../../facts/aix/macaddress_interfaces' require_relative '../../facts/aix/memory/swap/available' require_relative '../../facts/aix/memory/swap/available_bytes' require_relative '../../facts/aix/memory/swap/capacity' require_relative '../../facts/aix/memory/swap/total' require_relative '../../facts/aix/memory/swap/total_bytes' require_relative '../../facts/aix/memory/swap/used' require_relative '../../facts/aix/memory/swap/used_bytes' require_relative '../../facts/aix/memory/system/available' require_relative '../../facts/aix/memory/system/available_bytes' require_relative '../../facts/aix/memory/system/capacity' require_relative '../../facts/aix/memory/system/total' require_relative '../../facts/aix/memory/system/total_bytes' require_relative '../../facts/aix/memory/system/used' require_relative '../../facts/aix/memory/system/used_bytes' require_relative '../../facts/aix/mountpoints' require_relative '../../facts/aix/mtu_interfaces' require_relative '../../facts/aix/netmask6_interfaces' require_relative '../../facts/aix/netmask_interfaces' require_relative '../../facts/aix/network6_interfaces' require_relative '../../facts/aix/network_interfaces' require_relative '../../facts/aix/networking/domain' require_relative '../../facts/aix/networking/fqdn' require_relative '../../facts/aix/networking/hostname' require_relative '../../facts/aix/networking/interfaces' require_relative '../../facts/aix/networking/ip' require_relative '../../facts/aix/networking/ip6' require_relative '../../facts/aix/networking/mac' require_relative '../../facts/aix/networking/mtu' require_relative '../../facts/aix/networking/netmask' require_relative '../../facts/aix/networking/netmask6' require_relative '../../facts/aix/networking/network' require_relative '../../facts/aix/networking/network6' require_relative '../../facts/aix/networking/primary' require_relative '../../facts/aix/networking/scope6' require_relative '../../facts/aix/nim_type' require_relative '../../facts/aix/os/architecture' require_relative '../../facts/aix/os/family' require_relative '../../facts/aix/os/hardware' require_relative '../../facts/aix/os/name' require_relative '../../facts/aix/os/release' require_relative '../../facts/aix/partitions' require_relative '../../facts/aix/path' require_relative '../../facts/aix/processor' require_relative '../../facts/aix/processors/cores' require_relative '../../facts/aix/processors/count' require_relative '../../facts/aix/processors/isa' require_relative '../../facts/aix/processors/models' require_relative '../../facts/aix/processors/speed' require_relative '../../facts/aix/processors/threads' require_relative '../../facts/aix/ruby/platform' require_relative '../../facts/aix/ruby/sitedir' require_relative '../../facts/aix/ruby/version' require_relative '../../facts/aix/scope6_interfaces' require_relative '../../facts/aix/serialnumber' require_relative '../../facts/aix/ssh' require_relative '../../facts/aix/sshalgorithmkey' require_relative '../../facts/aix/sshfp_algorithm' require_relative '../../facts/aix/system_uptime/days' require_relative '../../facts/aix/system_uptime/hours' require_relative '../../facts/aix/system_uptime/seconds' require_relative '../../facts/aix/system_uptime/uptime' require_relative '../../facts/aix/timezone' require_relative '../../resolvers/aix/architecture' require_relative '../../resolvers/aix/disks' require_relative '../../resolvers/aix/filesystem' require_relative '../../resolvers/aix/hardware' require_relative '../../resolvers/aix/load_averages' require_relative '../../resolvers/aix/memory' require_relative '../../resolvers/aix/mountpoints' require_relative '../../resolvers/aix/networking' require_relative '../../resolvers/aix/nim' require_relative '../../resolvers/aix/os_level' require_relative '../../resolvers/aix/partitions' require_relative '../../resolvers/aix/processors' require_relative '../../resolvers/aix/serialnumber' when 'alpine' require_relative '../../facts/alpine/os/release' when 'amzn' require_relative '../../facts/amzn/lsbdistcodename' require_relative '../../facts/amzn/lsbdistdescription' require_relative '../../facts/amzn/lsbdistid' require_relative '../../facts/amzn/os/distro/codename' require_relative '../../facts/amzn/os/distro/description' require_relative '../../facts/amzn/os/distro/id' require_relative '../../facts/amzn/os/distro/release' require_relative '../../facts/amzn/os/release' require_relative '../../resolvers/amzn/os_release_rpm' when 'archlinux' require_relative '../../facts/archlinux/os/release' when 'azurelinux' require_relative '../../facts/azurelinux/os/release' when 'bsd' require_relative '../../facts/bsd/kernelmajversion' require_relative '../../facts/bsd/kernelversion' require_relative '../../facts/bsd/load_averages' require_relative '../../facts/bsd/os/family' require_relative '../../facts/bsd/processors/count' require_relative '../../facts/bsd/processors/models' require_relative '../../facts/bsd/processors/speed' require_relative '../../resolvers/bsd/processors' when 'debian' require_relative '../../facts/debian/architecture' require_relative '../../facts/debian/lsbdistcodename' require_relative '../../facts/debian/lsbdistdescription' require_relative '../../facts/debian/lsbdistid' require_relative '../../facts/debian/os/distro/codename' require_relative '../../facts/debian/os/distro/description' require_relative '../../facts/debian/os/distro/id' require_relative '../../facts/debian/os/distro/release' require_relative '../../facts/debian/os/release' when 'devuan' require_relative '../../facts/devuan/os/distro/release' require_relative '../../facts/devuan/os/release' when 'freebsd' require_relative '../../facts/freebsd/augeas/version' require_relative '../../facts/freebsd/disks' require_relative '../../facts/freebsd/dmi/bios/release_date' require_relative '../../facts/freebsd/dmi/bios/vendor' require_relative '../../facts/freebsd/dmi/bios/version' require_relative '../../facts/freebsd/dmi/manufacturer' require_relative '../../facts/freebsd/dmi/product/name' require_relative '../../facts/freebsd/dmi/product/serial_number' require_relative '../../facts/freebsd/dmi/product/uuid' require_relative '../../facts/freebsd/ec2_metadata' require_relative '../../facts/freebsd/ec2_userdata' require_relative '../../facts/freebsd/facterversion' require_relative '../../facts/freebsd/identity/gid' require_relative '../../facts/freebsd/identity/group' require_relative '../../facts/freebsd/identity/privileged' require_relative '../../facts/freebsd/identity/uid' require_relative '../../facts/freebsd/identity/user' require_relative '../../facts/freebsd/ipaddress6_interfaces' require_relative '../../facts/freebsd/ipaddress_interfaces' require_relative '../../facts/freebsd/is_virtual' require_relative '../../facts/freebsd/kernel' require_relative '../../facts/freebsd/kernelrelease' require_relative '../../facts/freebsd/memory/swap/available' require_relative '../../facts/freebsd/memory/swap/available_bytes' require_relative '../../facts/freebsd/memory/swap/capacity' require_relative '../../facts/freebsd/memory/swap/encrypted' require_relative '../../facts/freebsd/memory/swap/total' require_relative '../../facts/freebsd/memory/swap/total_bytes' require_relative '../../facts/freebsd/memory/swap/used' require_relative '../../facts/freebsd/memory/swap/used_bytes' require_relative '../../facts/freebsd/memory/system/available' require_relative '../../facts/freebsd/memory/system/available_bytes' require_relative '../../facts/freebsd/memory/system/capacity' require_relative '../../facts/freebsd/memory/system/total' require_relative '../../facts/freebsd/memory/system/total_bytes' require_relative '../../facts/freebsd/memory/system/used' require_relative '../../facts/freebsd/memory/system/used_bytes' require_relative '../../facts/freebsd/mountpoints' require_relative '../../facts/freebsd/netmask6_interfaces' require_relative '../../facts/freebsd/netmask_interfaces' require_relative '../../facts/freebsd/network6_interfaces' require_relative '../../facts/freebsd/network_interfaces' require_relative '../../facts/freebsd/networking/dhcp' require_relative '../../facts/freebsd/networking/domain' require_relative '../../facts/freebsd/networking/fqdn' require_relative '../../facts/freebsd/networking/hostname' require_relative '../../facts/freebsd/networking/interfaces' require_relative '../../facts/freebsd/networking/ip' require_relative '../../facts/freebsd/networking/ip6' require_relative '../../facts/freebsd/networking/mac' require_relative '../../facts/freebsd/networking/mtu' require_relative '../../facts/freebsd/networking/netmask' require_relative '../../facts/freebsd/networking/netmask6' require_relative '../../facts/freebsd/networking/network' require_relative '../../facts/freebsd/networking/network6' require_relative '../../facts/freebsd/networking/primary' require_relative '../../facts/freebsd/networking/scope6' require_relative '../../facts/freebsd/os/architecture' require_relative '../../facts/freebsd/os/hardware' require_relative '../../facts/freebsd/os/name' require_relative '../../facts/freebsd/os/release' require_relative '../../facts/freebsd/partitions' require_relative '../../facts/freebsd/path' require_relative '../../facts/freebsd/processors/count' require_relative '../../facts/freebsd/processors/isa' require_relative '../../facts/freebsd/processors/models' require_relative '../../facts/freebsd/processors/speed' require_relative '../../facts/freebsd/ruby/platform' require_relative '../../facts/freebsd/ruby/sitedir' require_relative '../../facts/freebsd/ruby/version' require_relative '../../facts/freebsd/ssh' require_relative '../../facts/freebsd/sshalgorithmkey' require_relative '../../facts/freebsd/sshfp_algorithm' require_relative '../../facts/freebsd/system_uptime/days' require_relative '../../facts/freebsd/system_uptime/hours' require_relative '../../facts/freebsd/system_uptime/seconds' require_relative '../../facts/freebsd/system_uptime/uptime' require_relative '../../facts/freebsd/timezone' require_relative '../../facts/freebsd/virtual' require_relative '../../facts/freebsd/zfs_featurenumbers' require_relative '../../facts/freebsd/zfs_version' require_relative '../../facts/freebsd/zpool_featureflags' require_relative '../../facts/freebsd/zpool_featurenumbers' require_relative '../../facts/freebsd/zpool_version' require_relative '../../resolvers/freebsd/dmi' require_relative '../../resolvers/freebsd/freebsd_version' require_relative '../../resolvers/freebsd/geom' require_relative '../../resolvers/freebsd/processors' require_relative '../../resolvers/freebsd/swap_memory' require_relative '../../resolvers/freebsd/system_memory' require_relative '../../resolvers/freebsd/virtual' when 'gentoo' require_relative '../../facts/gentoo/os/release' when 'linux' require_relative '../../util/linux/dhcp' require_relative '../../util/linux/if_inet6' require_relative '../../util/linux/proc' require_relative '../../util/linux/routing_table' require_relative '../../util/linux/socket_parser' require_relative '../../facts/linux/aio_agent_version' require_relative '../../facts/linux/augeas/version' require_relative '../../facts/linux/az_metadata' require_relative '../../facts/linux/cloud/provider' require_relative '../../facts/linux/dhcp_servers' require_relative '../../facts/linux/disks' require_relative '../../facts/linux/dmi/bios/release_date' require_relative '../../facts/linux/dmi/bios/vendor' require_relative '../../facts/linux/dmi/bios/version' require_relative '../../facts/linux/dmi/board/asset_tag' require_relative '../../facts/linux/dmi/board/manufacturer' require_relative '../../facts/linux/dmi/board/product' require_relative '../../facts/linux/dmi/board/serial_number' require_relative '../../facts/linux/dmi/chassis/asset_tag' require_relative '../../facts/linux/dmi/chassis/type' require_relative '../../facts/linux/dmi/manufacturer' require_relative '../../facts/linux/dmi/product/name' require_relative '../../facts/linux/dmi/product/serial_number' require_relative '../../facts/linux/dmi/product/uuid' require_relative '../../facts/linux/dmi/product/version' require_relative '../../facts/linux/ec2_metadata' require_relative '../../facts/linux/ec2_userdata' require_relative '../../facts/linux/facterversion' require_relative '../../facts/linux/filesystems' require_relative '../../facts/linux/fips_enabled' require_relative '../../facts/linux/gce' require_relative '../../facts/linux/hypervisors/docker' require_relative '../../facts/linux/hypervisors/hyper_v' require_relative '../../facts/linux/hypervisors/kvm' require_relative '../../facts/linux/hypervisors/lxc' require_relative '../../facts/linux/hypervisors/openvz' require_relative '../../facts/linux/hypervisors/systemd_nspawn' require_relative '../../facts/linux/hypervisors/virtualbox' require_relative '../../facts/linux/hypervisors/vmware' require_relative '../../facts/linux/hypervisors/xen' require_relative '../../facts/linux/identity/gid' require_relative '../../facts/linux/identity/group' require_relative '../../facts/linux/identity/privileged' require_relative '../../facts/linux/identity/uid' require_relative '../../facts/linux/identity/user' require_relative '../../facts/linux/interfaces' require_relative '../../facts/linux/ipaddress6_interfaces' require_relative '../../facts/linux/ipaddress_interfaces' require_relative '../../facts/linux/is_virtual' require_relative '../../facts/linux/kernel' require_relative '../../facts/linux/kernelmajversion' require_relative '../../facts/linux/kernelrelease' require_relative '../../facts/linux/kernelversion' require_relative '../../facts/linux/load_averages' require_relative '../../facts/linux/lsbdistrelease' require_relative '../../facts/linux/macaddress_interfaces' require_relative '../../facts/linux/memory/swap/available' require_relative '../../facts/linux/memory/swap/available_bytes' require_relative '../../facts/linux/memory/swap/capacity' require_relative '../../facts/linux/memory/swap/total' require_relative '../../facts/linux/memory/swap/total_bytes' require_relative '../../facts/linux/memory/swap/used' require_relative '../../facts/linux/memory/swap/used_bytes' require_relative '../../facts/linux/memory/system/available' require_relative '../../facts/linux/memory/system/available_bytes' require_relative '../../facts/linux/memory/system/capacity' require_relative '../../facts/linux/memory/system/total' require_relative '../../facts/linux/memory/system/total_bytes' require_relative '../../facts/linux/memory/system/used' require_relative '../../facts/linux/memory/system/used_bytes' require_relative '../../facts/linux/mountpoints' require_relative '../../facts/linux/mtu_interfaces' require_relative '../../facts/linux/netmask6_interfaces' require_relative '../../facts/linux/netmask_interfaces' require_relative '../../facts/linux/network6_interfaces' require_relative '../../facts/linux/network_interfaces' require_relative '../../facts/linux/networking/dhcp' require_relative '../../facts/linux/networking/domain' require_relative '../../facts/linux/networking/fqdn' require_relative '../../facts/linux/networking/hostname' require_relative '../../facts/linux/networking/interfaces' require_relative '../../facts/linux/networking/ip' require_relative '../../facts/linux/networking/ip6' require_relative '../../facts/linux/networking/mac' require_relative '../../facts/linux/networking/mtu' require_relative '../../facts/linux/networking/netmask' require_relative '../../facts/linux/networking/netmask6' require_relative '../../facts/linux/networking/network' require_relative '../../facts/linux/networking/network6' require_relative '../../facts/linux/networking/primary' require_relative '../../facts/linux/networking/scope6' require_relative '../../facts/linux/os/architecture' require_relative '../../facts/linux/os/distro/codename' require_relative '../../facts/linux/os/distro/description' require_relative '../../facts/linux/os/distro/id' require_relative '../../facts/linux/os/distro/release' require_relative '../../facts/linux/os/distro/specification' require_relative '../../facts/linux/os/family' require_relative '../../facts/linux/os/hardware' require_relative '../../facts/linux/os/name' require_relative '../../facts/linux/os/release' require_relative '../../facts/linux/os/selinux/config_mode' require_relative '../../facts/linux/os/selinux/config_policy' require_relative '../../facts/linux/os/selinux/current_mode' require_relative '../../facts/linux/os/selinux/enabled' require_relative '../../facts/linux/os/selinux/enforced' require_relative '../../facts/linux/os/selinux/policy_version' require_relative '../../facts/linux/partitions' require_relative '../../facts/linux/path' require_relative '../../facts/linux/processor' require_relative '../../facts/linux/processors/cores' require_relative '../../facts/linux/processors/count' require_relative '../../facts/linux/processors/extensions' require_relative '../../facts/linux/processors/isa' require_relative '../../facts/linux/processors/models' require_relative '../../facts/linux/processors/physicalcount' require_relative '../../facts/linux/processors/speed' require_relative '../../facts/linux/processors/threads' require_relative '../../facts/linux/ruby/platform' require_relative '../../facts/linux/ruby/sitedir' require_relative '../../facts/linux/ruby/version' require_relative '../../facts/linux/scope6_interfaces' require_relative '../../facts/linux/ssh' require_relative '../../facts/linux/sshalgorithmkey' require_relative '../../facts/linux/sshfp_algorithm' require_relative '../../facts/linux/system_uptime/days' require_relative '../../facts/linux/system_uptime/hours' require_relative '../../facts/linux/system_uptime/seconds' require_relative '../../facts/linux/system_uptime/uptime' require_relative '../../facts/linux/timezone' require_relative '../../facts/linux/virtual' require_relative '../../facts/linux/xen' require_relative '../../resolvers/linux/docker_uptime' require_relative '../../resolvers/linux/hostname' require_relative '../../resolvers/linux/load_averages' require_relative '../../resolvers/linux/networking' when 'linuxmint' require_relative '../../facts/linuxmint/os/name' require_relative '../../facts/linuxmint/os/release' when 'macosx' require_relative '../../util/macosx/system_profile_executor' require_relative '../../facts/macosx/aio_agent_version' require_relative '../../facts/macosx/augeas/version' require_relative '../../facts/macosx/dhcp_servers' require_relative '../../facts/macosx/dmi/product/name' require_relative '../../facts/macosx/facterversion' require_relative '../../facts/macosx/filesystems' require_relative '../../facts/macosx/identity/gid' require_relative '../../facts/macosx/identity/group' require_relative '../../facts/macosx/identity/privileged' require_relative '../../facts/macosx/identity/uid' require_relative '../../facts/macosx/identity/user' require_relative '../../facts/macosx/interfaces' require_relative '../../facts/macosx/ipaddress6_interfaces' require_relative '../../facts/macosx/ipaddress_interfaces' require_relative '../../facts/macosx/is_virtual' require_relative '../../facts/macosx/kernel' require_relative '../../facts/macosx/kernelmajversion' require_relative '../../facts/macosx/kernelrelease' require_relative '../../facts/macosx/kernelversion' require_relative '../../facts/macosx/load_averages' require_relative '../../facts/macosx/macaddress_interfaces' require_relative '../../facts/macosx/memory/swap/available' require_relative '../../facts/macosx/memory/swap/available_bytes' require_relative '../../facts/macosx/memory/swap/capacity' require_relative '../../facts/macosx/memory/swap/encrypted' require_relative '../../facts/macosx/memory/swap/total' require_relative '../../facts/macosx/memory/swap/total_bytes' require_relative '../../facts/macosx/memory/swap/used' require_relative '../../facts/macosx/memory/swap/used_bytes' require_relative '../../facts/macosx/memory/system/available' require_relative '../../facts/macosx/memory/system/available_bytes' require_relative '../../facts/macosx/memory/system/capacity' require_relative '../../facts/macosx/memory/system/total' require_relative '../../facts/macosx/memory/system/total_bytes' require_relative '../../facts/macosx/memory/system/used' require_relative '../../facts/macosx/memory/system/used_bytes' require_relative '../../facts/macosx/mountpoints' require_relative '../../facts/macosx/mtu_interfaces' require_relative '../../facts/macosx/netmask6_interfaces' require_relative '../../facts/macosx/netmask_interfaces' require_relative '../../facts/macosx/network6_interfaces' require_relative '../../facts/macosx/network_interfaces' require_relative '../../facts/macosx/networking/dhcp' require_relative '../../facts/macosx/networking/domain' require_relative '../../facts/macosx/networking/fqdn' require_relative '../../facts/macosx/networking/hostname' require_relative '../../facts/macosx/networking/interfaces' require_relative '../../facts/macosx/networking/ip' require_relative '../../facts/macosx/networking/ip6' require_relative '../../facts/macosx/networking/mac' require_relative '../../facts/macosx/networking/mtu' require_relative '../../facts/macosx/networking/netmask' require_relative '../../facts/macosx/networking/netmask6' require_relative '../../facts/macosx/networking/network' require_relative '../../facts/macosx/networking/network6' require_relative '../../facts/macosx/networking/primary' require_relative '../../facts/macosx/networking/scope6' require_relative '../../facts/macosx/os/architecture' require_relative '../../facts/macosx/os/family' require_relative '../../facts/macosx/os/hardware' require_relative '../../facts/macosx/os/macosx/build' require_relative '../../facts/macosx/os/macosx/product' require_relative '../../facts/macosx/os/macosx/version' require_relative '../../facts/macosx/os/name' require_relative '../../facts/macosx/os/release' require_relative '../../facts/macosx/path' require_relative '../../facts/macosx/processors/cores' require_relative '../../facts/macosx/processors/count' require_relative '../../facts/macosx/processors/isa' require_relative '../../facts/macosx/processors/models' require_relative '../../facts/macosx/processors/physicalcount' require_relative '../../facts/macosx/processors/speed' require_relative '../../facts/macosx/processors/threads' require_relative '../../facts/macosx/ruby/platform' require_relative '../../facts/macosx/ruby/sitedir' require_relative '../../facts/macosx/ruby/version' require_relative '../../facts/macosx/scope6_interfaces' require_relative '../../facts/macosx/ssh' require_relative '../../facts/macosx/sshalgorithmkey' require_relative '../../facts/macosx/sshfp_algorithm' require_relative '../../facts/macosx/system_profiler/boot_mode' require_relative '../../facts/macosx/system_profiler/boot_rom_version' require_relative '../../facts/macosx/system_profiler/boot_volume' require_relative '../../facts/macosx/system_profiler/computer_name' require_relative '../../facts/macosx/system_profiler/cores' require_relative '../../facts/macosx/system_profiler/hardware_uuid' require_relative '../../facts/macosx/system_profiler/kernel_version' require_relative '../../facts/macosx/system_profiler/l2_cache_per_core' require_relative '../../facts/macosx/system_profiler/l3_cache' require_relative '../../facts/macosx/system_profiler/memory' require_relative '../../facts/macosx/system_profiler/model_identifier' require_relative '../../facts/macosx/system_profiler/model_name' require_relative '../../facts/macosx/system_profiler/processor_name' require_relative '../../facts/macosx/system_profiler/processor_speed' require_relative '../../facts/macosx/system_profiler/processors' require_relative '../../facts/macosx/system_profiler/secure_virtual_memory' require_relative '../../facts/macosx/system_profiler/serial_number' require_relative '../../facts/macosx/system_profiler/smc_version' require_relative '../../facts/macosx/system_profiler/system_version' require_relative '../../facts/macosx/system_profiler/uptime' require_relative '../../facts/macosx/system_profiler/username' require_relative '../../facts/macosx/system_uptime/days' require_relative '../../facts/macosx/system_uptime/hours' require_relative '../../facts/macosx/system_uptime/seconds' require_relative '../../facts/macosx/system_uptime/uptime' require_relative '../../facts/macosx/timezone' require_relative '../../facts/macosx/virtual' require_relative '../../resolvers/macosx/dmi' require_relative '../../resolvers/macosx/filesystems' require_relative '../../resolvers/macosx/load_averages' require_relative '../../resolvers/macosx/mountpoints' require_relative '../../resolvers/macosx/processors' require_relative '../../resolvers/macosx/swap_memory' require_relative '../../resolvers/macosx/system_memory' require_relative '../../resolvers/macosx/system_profiler' when 'mageia' require_relative '../../facts/mageia/os/release' when 'mariner' require_relative '../../facts/mariner/os/release' when 'meego' require_relative '../../facts/meego/os/release' when 'oel' require_relative '../../facts/oel/os/release' when 'ol' require_relative '../../facts/ol/os/release' require_relative '../../facts/ol/lsbdistdescription' require_relative '../../facts/ol/lsbdistid' require_relative '../../facts/ol/os/distro/description' require_relative '../../facts/ol/os/distro/id' when 'openbsd' require_relative '../../facts/openbsd/augeas/version' require_relative '../../facts/openbsd/ec2_metadata' require_relative '../../facts/openbsd/ec2_userdata' require_relative '../../facts/openbsd/facterversion' require_relative '../../facts/openbsd/is_virtual' require_relative '../../facts/openbsd/kernel' require_relative '../../facts/openbsd/kernelrelease' require_relative '../../facts/openbsd/mountpoints' require_relative '../../facts/openbsd/path' require_relative '../../facts/openbsd/ssh' require_relative '../../facts/openbsd/sshalgorithmkey' require_relative '../../facts/openbsd/sshfp_algorithm' require_relative '../../facts/openbsd/timezone' require_relative '../../facts/openbsd/virtual' require_relative '../../facts/openbsd/dmi/bios/vendor' require_relative '../../facts/openbsd/dmi/bios/version' require_relative '../../facts/openbsd/dmi/manufacturer' require_relative '../../facts/openbsd/dmi/product/name' require_relative '../../facts/openbsd/dmi/product/serial_number' require_relative '../../facts/openbsd/dmi/product/uuid' require_relative '../../facts/openbsd/identity/group' require_relative '../../facts/openbsd/identity/gid' require_relative '../../facts/openbsd/identity/privileged' require_relative '../../facts/openbsd/identity/uid' require_relative '../../facts/openbsd/identity/user' require_relative '../../facts/openbsd/networking/dhcp' require_relative '../../facts/openbsd/networking/domain' require_relative '../../facts/openbsd/networking/fqdn' require_relative '../../facts/openbsd/networking/hostname' require_relative '../../facts/openbsd/networking/interfaces' require_relative '../../facts/openbsd/networking/ip' require_relative '../../facts/openbsd/networking/ip6' require_relative '../../facts/openbsd/networking/mac' require_relative '../../facts/openbsd/networking/mtu' require_relative '../../facts/openbsd/networking/netmask' require_relative '../../facts/openbsd/networking/netmask6' require_relative '../../facts/openbsd/networking/network' require_relative '../../facts/openbsd/networking/network6' require_relative '../../facts/openbsd/networking/primary' require_relative '../../facts/openbsd/networking/scope6' require_relative '../../facts/openbsd/os/architecture' require_relative '../../facts/openbsd/os/hardware' require_relative '../../facts/openbsd/os/name' require_relative '../../facts/openbsd/os/release' require_relative '../../facts/openbsd/processors/isa' require_relative '../../facts/openbsd/ruby/platform' require_relative '../../facts/openbsd/ruby/sitedir' require_relative '../../facts/openbsd/ruby/version' require_relative '../../facts/openbsd/system_uptime/days' require_relative '../../facts/openbsd/system_uptime/hours' require_relative '../../facts/openbsd/system_uptime/seconds' require_relative '../../facts/openbsd/system_uptime/uptime' require_relative '../../resolvers/openbsd/dhcp' require_relative '../../resolvers/openbsd/dmi' require_relative '../../resolvers/openbsd/mountpoints' require_relative '../../resolvers/openbsd/virtual' when 'openwrt' require_relative '../../facts/openwrt/os/release' when 'ovs' require_relative '../../facts/ovs/os/release' when 'photon' require_relative '../../facts/photon/os/release' when 'rhel' require_relative '../../facts/rhel/lsbdistcodename' require_relative '../../facts/rhel/lsbdistdescription' require_relative '../../facts/rhel/lsbdistid' require_relative '../../facts/rhel/os/distro/codename' require_relative '../../facts/rhel/os/distro/description' require_relative '../../facts/rhel/os/distro/id' require_relative '../../facts/rhel/os/distro/release' require_relative '../../facts/rhel/os/family' require_relative '../../facts/rhel/os/name' require_relative '../../facts/rhel/os/release' when 'slackware' require_relative '../../facts/slackware/os/release' when 'sles' require_relative '../../facts/sles/lsbdistcodename' require_relative '../../facts/sles/lsbdistdescription' require_relative '../../facts/sles/lsbdistid' require_relative '../../facts/sles/os/distro/codename' require_relative '../../facts/sles/os/distro/description' require_relative '../../facts/sles/os/distro/id' require_relative '../../facts/sles/os/distro/release' require_relative '../../facts/sles/os/family' require_relative '../../facts/sles/os/release' when 'solaris' require_relative '../../facts/solaris/aio_agent_version' require_relative '../../facts/solaris/augeas/version' require_relative '../../facts/solaris/current_zone' require_relative '../../facts/solaris/dhcp_servers' require_relative '../../facts/solaris/disks' require_relative '../../facts/solaris/dmi/bios/release_date' require_relative '../../facts/solaris/dmi/bios/vendor' require_relative '../../facts/solaris/dmi/bios/version' require_relative '../../facts/solaris/dmi/chassis/asset_tag' require_relative '../../facts/solaris/dmi/chassis/type' require_relative '../../facts/solaris/dmi/manufacturer' require_relative '../../facts/solaris/dmi/product/name' require_relative '../../facts/solaris/dmi/product/serial_number' require_relative '../../facts/solaris/dmi/product/uuid' require_relative '../../facts/solaris/facterversion' require_relative '../../facts/solaris/filesystems' require_relative '../../facts/solaris/hypervisors/ldom' require_relative '../../facts/solaris/hypervisors/zone' require_relative '../../facts/solaris/identity/gid' require_relative '../../facts/solaris/identity/group' require_relative '../../facts/solaris/identity/privileged' require_relative '../../facts/solaris/identity/uid' require_relative '../../facts/solaris/identity/user' require_relative '../../facts/solaris/interfaces' require_relative '../../facts/solaris/ipaddress6_interfaces' require_relative '../../facts/solaris/ipaddress_interfaces' require_relative '../../facts/solaris/is_virtual' require_relative '../../facts/solaris/kernel' require_relative '../../facts/solaris/kernelmajversion' require_relative '../../facts/solaris/kernelrelease' require_relative '../../facts/solaris/kernelversion' require_relative '../../facts/solaris/ldom' require_relative '../../facts/solaris/load_averages' require_relative '../../facts/solaris/macaddress_interfaces' require_relative '../../facts/solaris/memory/swap/available' require_relative '../../facts/solaris/memory/swap/available_bytes' require_relative '../../facts/solaris/memory/swap/capacity' require_relative '../../facts/solaris/memory/swap/total' require_relative '../../facts/solaris/memory/swap/total_bytes' require_relative '../../facts/solaris/memory/swap/used' require_relative '../../facts/solaris/memory/swap/used_bytes' require_relative '../../facts/solaris/memory/system/available' require_relative '../../facts/solaris/memory/system/available_bytes' require_relative '../../facts/solaris/memory/system/capacity' require_relative '../../facts/solaris/memory/system/total' require_relative '../../facts/solaris/memory/system/total_bytes' require_relative '../../facts/solaris/memory/system/used' require_relative '../../facts/solaris/memory/system/used_bytes' require_relative '../../facts/solaris/mountpoints' require_relative '../../facts/solaris/mtu_interfaces' require_relative '../../facts/solaris/netmask6_interfaces' require_relative '../../facts/solaris/netmask_interfaces' require_relative '../../facts/solaris/network6_interfaces' require_relative '../../facts/solaris/network_interfaces' require_relative '../../facts/solaris/networking/dhcp' require_relative '../../facts/solaris/networking/domain' require_relative '../../facts/solaris/networking/fqdn' require_relative '../../facts/solaris/networking/hostname' require_relative '../../facts/solaris/networking/interfaces' require_relative '../../facts/solaris/networking/ip' require_relative '../../facts/solaris/networking/ip6' require_relative '../../facts/solaris/networking/mac' require_relative '../../facts/solaris/networking/mtu' require_relative '../../facts/solaris/networking/netmask' require_relative '../../facts/solaris/networking/netmask6' require_relative '../../facts/solaris/networking/network' require_relative '../../facts/solaris/networking/network6' require_relative '../../facts/solaris/networking/primary' require_relative '../../facts/solaris/os/architecture' require_relative '../../facts/solaris/os/family' require_relative '../../facts/solaris/os/hardware' require_relative '../../facts/solaris/os/name' require_relative '../../facts/solaris/os/release' require_relative '../../facts/solaris/path' require_relative '../../facts/solaris/processors/cores' require_relative '../../facts/solaris/processors/count' require_relative '../../facts/solaris/processors/isa' require_relative '../../facts/solaris/processors/models' require_relative '../../facts/solaris/processors/physicalcount' require_relative '../../facts/solaris/processors/speed' require_relative '../../facts/solaris/processors/threads' require_relative '../../facts/solaris/ruby/platform' require_relative '../../facts/solaris/ruby/sitedir' require_relative '../../facts/solaris/ruby/version' require_relative '../../facts/solaris/ssh' require_relative '../../facts/solaris/sshalgorithmkey' require_relative '../../facts/solaris/sshfp_algorithm' require_relative '../../facts/solaris/system_uptime/days' require_relative '../../facts/solaris/system_uptime/hours' require_relative '../../facts/solaris/system_uptime/seconds' require_relative '../../facts/solaris/system_uptime/uptime' require_relative '../../facts/solaris/timezone' require_relative '../../facts/solaris/virtual' require_relative '../../facts/solaris/zfs_featurenumbers' require_relative '../../facts/solaris/zfs_version' require_relative '../../facts/solaris/zones' require_relative '../../facts/solaris/zpool_featureflags' require_relative '../../facts/solaris/zpool_featurenumbers' require_relative '../../facts/solaris/zpool_version' require_relative '../../resolvers/solaris/disks' require_relative '../../resolvers/solaris/dmi' require_relative '../../resolvers/solaris/dmi_sparc' require_relative '../../resolvers/solaris/filesystems' require_relative '../../resolvers/solaris/ipaddress' require_relative '../../resolvers/solaris/ldom' require_relative '../../resolvers/solaris/memory' require_relative '../../resolvers/solaris/mountpoints' require_relative '../../resolvers/solaris/networking' require_relative '../../resolvers/solaris/os_release' require_relative '../../resolvers/solaris/processors' require_relative '../../resolvers/solaris/zone' require_relative '../../resolvers/solaris/zone_name' when 'ubuntu' require_relative '../../facts/ubuntu/lsbdistrelease' require_relative '../../facts/ubuntu/os/distro/release' require_relative '../../facts/ubuntu/os/release' when 'windows' require_relative '../../util/windows/win32ole' require_relative '../../facts/windows/aio_agent_version' require_relative '../../facts/windows/az_metadata' require_relative '../../facts/windows/cloud/provider' require_relative '../../facts/windows/dhcp_servers' require_relative '../../facts/windows/dmi/manufacturer' require_relative '../../facts/windows/dmi/product/name' require_relative '../../facts/windows/dmi/product/serial_number' require_relative '../../facts/windows/dmi/product/uuid' require_relative '../../facts/windows/ec2_metadata' require_relative '../../facts/windows/ec2_userdata' require_relative '../../facts/windows/facterversion' require_relative '../../facts/windows/fips_enabled' require_relative '../../facts/windows/gce' require_relative '../../facts/windows/hypervisors/hyperv' require_relative '../../facts/windows/hypervisors/kvm' require_relative '../../facts/windows/hypervisors/virtualbox' require_relative '../../facts/windows/hypervisors/vmware' require_relative '../../facts/windows/hypervisors/xen' require_relative '../../facts/windows/identity/privileged' require_relative '../../facts/windows/identity/user' require_relative '../../facts/windows/interfaces' require_relative '../../facts/windows/ipaddress6_interfaces' require_relative '../../facts/windows/ipaddress_interfaces' require_relative '../../facts/windows/is_virtual' require_relative '../../facts/windows/kernel' require_relative '../../facts/windows/kernelmajversion' require_relative '../../facts/windows/kernelrelease' require_relative '../../facts/windows/kernelversion' require_relative '../../facts/windows/macaddress_interfaces' require_relative '../../facts/windows/memory/system/available' require_relative '../../facts/windows/memory/system/available_bytes' require_relative '../../facts/windows/memory/system/capacity' require_relative '../../facts/windows/memory/system/total' require_relative '../../facts/windows/memory/system/total_bytes' require_relative '../../facts/windows/memory/system/used' require_relative '../../facts/windows/memory/system/used_bytes' require_relative '../../facts/windows/mtu_interfaces' require_relative '../../facts/windows/netmask6_interfaces' require_relative '../../facts/windows/netmask_interfaces' require_relative '../../facts/windows/network6_interfaces' require_relative '../../facts/windows/network_interfaces' require_relative '../../facts/windows/networking/dhcp' require_relative '../../facts/windows/networking/domain' require_relative '../../facts/windows/networking/fqdn' require_relative '../../facts/windows/networking/hostname' require_relative '../../facts/windows/networking/interfaces' require_relative '../../facts/windows/networking/ip' require_relative '../../facts/windows/networking/ip6' require_relative '../../facts/windows/networking/mac' require_relative '../../facts/windows/networking/mtu' require_relative '../../facts/windows/networking/netmask' require_relative '../../facts/windows/networking/netmask6' require_relative '../../facts/windows/networking/network' require_relative '../../facts/windows/networking/network6' require_relative '../../facts/windows/networking/primary' require_relative '../../facts/windows/networking/scope6' require_relative '../../facts/windows/os/architecture' require_relative '../../facts/windows/os/family' require_relative '../../facts/windows/os/hardware' require_relative '../../facts/windows/os/name' require_relative '../../facts/windows/os/release' require_relative '../../facts/windows/os/windows/display_version' require_relative '../../facts/windows/os/windows/edition_id' require_relative '../../facts/windows/os/windows/installation_type' require_relative '../../facts/windows/os/windows/product_name' require_relative '../../facts/windows/os/windows/release_id' require_relative '../../facts/windows/os/windows/system32' require_relative '../../facts/windows/path' require_relative '../../facts/windows/processor' require_relative '../../facts/windows/processors/cores' require_relative '../../facts/windows/processors/count' require_relative '../../facts/windows/processors/isa' require_relative '../../facts/windows/processors/models' require_relative '../../facts/windows/processors/physicalcount' require_relative '../../facts/windows/processors/threads' require_relative '../../facts/windows/ruby/platform' require_relative '../../facts/windows/ruby/sitedir' require_relative '../../facts/windows/ruby/version' require_relative '../../facts/windows/scope6_interfaces' require_relative '../../facts/windows/ssh' require_relative '../../facts/windows/sshalgorithmkey' require_relative '../../facts/windows/sshfp_algorithm' require_relative '../../facts/windows/system_uptime/days' require_relative '../../facts/windows/system_uptime/hours' require_relative '../../facts/windows/system_uptime/seconds' require_relative '../../facts/windows/system_uptime/uptime' require_relative '../../facts/windows/timezone' require_relative '../../facts/windows/virtual' require_relative '../../resolvers/windows/aio_agent_version' require_relative '../../resolvers/windows/dmi_bios' require_relative '../../resolvers/windows/dmi_computersystem' require_relative '../../resolvers/windows/fips' require_relative '../../resolvers/windows/hardware_architecture' require_relative '../../resolvers/windows/identity' require_relative '../../resolvers/windows/kernel' require_relative '../../resolvers/windows/memory' require_relative '../../resolvers/windows/netkvm' require_relative '../../resolvers/windows/networking' require_relative '../../resolvers/windows/processors' require_relative '../../resolvers/windows/product_release' require_relative '../../resolvers/windows/ssh' require_relative '../../resolvers/windows/system32' require_relative '../../resolvers/windows/timezone' require_relative '../../resolvers/windows/uptime' require_relative '../../resolvers/windows/virtualization' require_relative '../../resolvers/windows/win_os_description' end end require_relative '../../../facter/custom_facts/core/legacy_facter' require_relative '../../../facter/framework/parsers/query_parser' puppetlabs-facter-dfe6df4/lib/facter/framework/core/options.rb000066400000000000000000000031641470204764400247120ustar00rootroot00000000000000# frozen_string_literal: true module Facter class Options class << self def cli? OptionStore.cli end def get OptionStore.all end def [](key) OptionStore.send(key.to_sym) end def []=(key, value) OptionStore.send("#{key}=".to_sym, value) end def custom_dir? OptionStore.custom_dir && OptionStore.custom_facts end def custom_dir [OptionStore.custom_dir].flatten end def external_dir? OptionStore.external_dir && OptionStore.external_facts end def external_dir OptionStore.external_dir end def init OptionStore.cli = false ConfigFileOptions.init store(ConfigFileOptions.get) end def init_from_cli(cli_options = {}) Facter::OptionStore.cli = true Facter::OptionStore.show_legacy = false Facter::OptionStore.trace = cli_options[:trace] OptionStore.set(:config, cli_options[:config]) ConfigFileOptions.init(cli_options[:config]) store(ConfigFileOptions.get) store(cli_options) Facter::OptionsValidator.validate_configs(get) end def store(options) options.each do |key, value| value = munge_option(key, value) OptionStore.set(key, value) end end private def munge_option(key, value) return value unless key.to_sym == :log_level case value.to_sym when :log_level '' when :none 'unknown' else value end end end end end puppetlabs-facter-dfe6df4/lib/facter/framework/core/options/000077500000000000000000000000001470204764400243615ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/framework/core/options/config_file_options.rb000066400000000000000000000070231470204764400307270ustar00rootroot00000000000000# frozen_string_literal: true module Facter class ConfigFileOptions class << self def init(config_path = nil) @options = {} Facter::ConfigReader.init(config_path) augment_config_path(config_path) augment_all end def get @options || {} end def clear @options = {} end private def augment_structured_facts(global_conf) return if !global_conf || global_conf['force-dot-resolution'].nil? @options[:force_dot_resolution] = global_conf['force-dot-resolution'] end def augment_all augment_cli(Facter::ConfigReader.cli) if Options.cli? augment_globals augment_facts(Facter::ConfigReader.ttls, Facter::ConfigReader.fact_groups) end def augment_globals augment_ruby(Facter::ConfigReader.global) augment_structured_facts(Facter::ConfigReader.global) augment_custom(Facter::ConfigReader.global) augment_external(Facter::ConfigReader.global) augment_show_legacy(Facter::ConfigReader.global) augment_sequential(Facter::ConfigReader.global) end def augment_config_path(config_path) @options[:config] = config_path end def augment_cli(file_cli_conf) return unless file_cli_conf @options[:debug] = file_cli_conf['debug'] unless file_cli_conf['debug'].nil? @options[:trace] = file_cli_conf['trace'] unless file_cli_conf['trace'].nil? @options[:verbose] = file_cli_conf['verbose'] unless file_cli_conf['verbose'].nil? @options[:log_level] = file_cli_conf['log-level'].to_sym unless file_cli_conf['log-level'].nil? end def augment_custom(file_global_conf) return unless file_global_conf if Options.cli? && !file_global_conf['no-custom-facts'].nil? @options[:no_custom_facts] = file_global_conf['no-custom-facts'] end @options[:custom_dir] = file_global_conf['custom-dir'] unless file_global_conf['custom-dir'].nil? @options[:config_file_custom_dir] = @options[:custom_dir] || [] end def augment_external(global_conf) return unless global_conf if Options.cli? && !global_conf['no-external-facts'].nil? @options[:no_external_facts] = global_conf['no-external-facts'] end @options[:external_dir] = [global_conf['external-dir']].flatten unless global_conf['external-dir'].nil? @options[:config_file_external_dir] = @options[:external_dir] || [] end def augment_ruby(global_conf) return unless global_conf return unless Options.cli? @options[:no_ruby] = global_conf['no-ruby'].nil? ? false : global_conf['no-ruby'] end def augment_show_legacy(global_conf) return unless global_conf @options[:show_legacy] = global_conf['show-legacy'] unless global_conf['show-legacy'].nil? end def augment_sequential(global_conf) return unless global_conf @options[:sequential] = global_conf['sequential'] unless global_conf['sequential'].nil? end def augment_facts(ttls, groups) fact_groups = Facter::FactGroups.new @options[:blocked_facts] = fact_groups.blocked_facts unless fact_groups.blocked_facts.nil? @options[:block_list] = fact_groups.block_list @options[:ttls] = ttls unless ttls.nil? f_groups = fact_groups.groups || {} f_groups = groups.merge(f_groups) unless groups.nil? @options[:fact_groups] = f_groups end end end end puppetlabs-facter-dfe6df4/lib/facter/framework/core/options/option_store.rb000066400000000000000000000116101470204764400274310ustar00rootroot00000000000000# frozen_string_literal: true module Facter class OptionStore # default options @debug = false @verbose = false # TODO: constant is not yet available when running puppet facts @log_level = :warn @show_legacy = true @custom_facts = true @blocked_facts = [] @ruby = true @external_facts = true @config = nil @strict = false @json = false @cache = true @yaml = false @puppet = false @ttls = [] @block = true @cli = nil @config_file_custom_dir = [] @config_file_external_dir = [] @default_external_dir = [] @fact_groups = {} @sequential = true @ttls = [] @block_list = [] @color = true @trace = false @timing = false @external_dir = [] @custom_dir = [] @hocon = false @allow_external_loggers = true @force_dot_resolution = false @http_debug = false class << self attr_reader :debug, :verbose, :log_level, :show_legacy, :custom_facts, :blocked_facts, :ruby, :external_facts attr_accessor :config, :strict, :json, :cache, :yaml, :puppet, :ttls, :block, :cli, :config_file_custom_dir, :config_file_external_dir, :default_external_dir, :fact_groups, :force_dot_resolution, :block_list, :color, :trace, :sequential, :timing, :hocon, :allow_external_loggers, :http_debug attr_writer :external_dir def all options = {} instance_variables.each do |iv| variable_name = iv.to_s.delete('@') options[variable_name.to_sym] = OptionStore.send(variable_name.to_sym) end options end def no_ruby=(bool) if bool @ruby = false @custom_facts = false @blocked_facts << 'ruby' else @ruby = true end end def no_block=(bool) @block = !bool end def no_cache=(bool) @cache = !bool end def no_color=(bool) @color = !bool end def external_dir return fallback_external_dir if @external_dir.empty? && @external_facts @external_dir end def blocked_facts=(*facts) @blocked_facts += [*facts] @blocked_facts.flatten! end def custom_dir return @config_file_custom_dir unless @custom_dir.any? @custom_dir end def custom_dir=(*dirs) @ruby = true @custom_dir = [*dirs] @custom_dir.flatten! end def debug=(bool) if bool == true self.log_level = :debug else @debug = false self.log_level = Facter::DEFAULT_LOG_LEVEL end end def verbose=(bool) if bool == true @verbose = true self.log_level = :info else @verbose = false self.log_level = Facter::DEFAULT_LOG_LEVEL end end def no_custom_facts=(bool) if bool == false @custom_facts = true @ruby = true else @custom_facts = false end end def no_external_facts=(bool) @external_facts = !bool end def log_level=(level) level = level.to_sym case level when :trace @log_level = :debug when :debug @log_level = :debug @debug = true else @log_level = level end Facter::Log.level = @log_level end def show_legacy=(bool) if bool == true @show_legacy = bool @ruby = true else @show_legacy = false end end def set(key, value) send("#{key}=".to_sym, value) end def reset @debug = false @verbose = false # TODO: constant is not yet available when running puppet facts @log_level = :warn @show_legacy = true @ruby = true @json = false @hocon = false @cache = true @yaml = false @puppet = false @ttls = [] @block = true @cli = nil @http_debug = false reset_config end def reset_config @blocked_facts = [] @external_facts = true @config = nil @strict = false @config_file_custom_dir = [] @config_file_external_dir = [] @default_external_dir = [] @fact_groups = {} @block_list = {} @color = true @sequential = true @ttls = [] @trace = false @timing = false @allow_external_loggers = true reset_facts end def reset_facts @custom_facts = true @force_dot_resolution = false @external_dir = [] @custom_dir = [] end def fallback_external_dir return @config_file_external_dir if @config_file_external_dir.any? @default_external_dir end end end end puppetlabs-facter-dfe6df4/lib/facter/framework/core/options/options_validator.rb000066400000000000000000000074531470204764400304570ustar00rootroot00000000000000# frozen_string_literal: true module Facter module OptionsValidator INVALID_PAIRS_RULES = { '--color' => '--no-color', '--json' => ['--no-json', '-y', '--yaml', '--hocon'], '--yaml' => ['--no-yaml', '-j', '--hocon'], '--hocon' => '--no-hocon', '-j' => ['--no-json', '--hocon'], '-y' => ['--no-yaml', '-j', '--hocon'], '--puppet' => ['--no-puppet', '--no-ruby', '--no-custom-facts'], '-p' => ['--no-puppet', '--no-ruby', '--no-custom-facts'], '--no-external-facts' => '--external-dir', '--custom-dir' => ['--no-custom-facts', '--no-ruby'] }.freeze DUPLICATED_OPTIONS_RULES = { '-j' => '--json', '-y' => '--yaml', '-p' => '--puppet', '-h' => '--help', '-v' => '--version', '-l' => '--log-level', '-d' => '--debug', '-c' => '--config' }.freeze LOG_LEVEL = %i[none trace debug info warn error fatal].freeze def self.validate(options) DUPLICATED_OPTIONS_RULES.each do |key, value| if options.include?(key) && options.include?(value) write_error_and_exit("option #{value} cannot be specified more than once.") end end INVALID_PAIRS_RULES.each do |key, value| common_values = [value].flatten & options if options.include?(key) && common_values.any? write_error_and_exit("#{key} and #{common_values.first} options conflict: please specify only one.") end end end def self.write_error_and_exit(message) log = Facter::Log.new(self) log.error(message, true) Facter::Cli.start(['--help']) exit 1 end def self.validate_configs(options) conflicting_configs(options).each do |op| next unless op.values[0] && op.values[1] message = "#{op.keys[0]} and #{op.keys[1]} options conflict: please specify only one" write_error_and_exit(message) end validate_log_options(options) end def self.conflicting_configs(options) no_ruby = !options[:ruby] no_custom_facts = !options[:custom_facts] puppet = options[:puppet] custom_dir = options[:custom_dir].nil? ? false : options[:custom_dir].any? default_external_dir = Facter::OptionStore.default_external_dir # --puppet/-p option adds an external directory and is not an explicitly # set external_dir from cli or config file default_external_dir += [Puppet[:pluginfactdest]] if puppet && const_defined?('Puppet') external_dir = if options[:external_dir].nil? || options[:external_dir].none? false else options[:external_dir] != default_external_dir end [ { 'no-ruby' => no_ruby, 'custom-dir' => custom_dir }, { 'no-external-facts' => !options[:external_facts], 'external-dir' => external_dir }, { 'no-custom-facts' => no_custom_facts, 'custom-dir' => custom_dir }, { 'no-ruby' => no_ruby, 'puppet' => puppet }, { 'no-custom-facts' => no_custom_facts, 'puppet' => puppet } ] end def self.validate_log_options(options) # TODO: find a better way to do this return if options[:debug] == true && options[:log_level] == :debug return if options[:verbose] == true && options[:log_level] == :info return unless [options[:debug], options[:verbose], options[:log_level] != Facter::DEFAULT_LOG_LEVEL] .count(true) > 1 message = 'debug, verbose, and log-level options conflict: please specify only one.' write_error_and_exit(message) end end end puppetlabs-facter-dfe6df4/lib/facter/framework/core/session_cache.rb000066400000000000000000000004301470204764400260160ustar00rootroot00000000000000# frozen_string_literal: true module Facter class SessionCache @resolvers = [] def self.subscribe(resolver) @resolvers << resolver end def self.invalidate_all_caches @resolvers.uniq.each(&:invalidate_cache) @resolvers = [] end end end puppetlabs-facter-dfe6df4/lib/facter/framework/detector/000077500000000000000000000000001470204764400235475ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/framework/detector/os_detector.rb000066400000000000000000000044351470204764400264140ustar00rootroot00000000000000# frozen_string_literal: true require 'rbconfig' class OsDetector include Singleton attr_reader :identifier, :hierarchy def initialize(*_args) @log = Facter::Log.new(self) @os_hierarchy = Facter::OsHierarchy.new @identifier = detect end private def detect host_os = RbConfig::CONFIG['host_os'] identifier = case host_os when /mswin|msys|mingw|cygwin|bccwin|wince|emc/ :windows when /darwin|mac os/ :macosx when /linux/ detect_distro when /freebsd/ :freebsd when /openbsd/i :openbsd when /bsd/ :bsd when /solaris/ :solaris when /aix/ :aix else raise "unknown os: #{host_os.inspect}" end @hierarchy = detect_hierarchy(identifier) @identifier = identifier end def detect_hierarchy(identifier) hierarchy = @os_hierarchy.construct_hierarchy(identifier) if hierarchy.empty? @log.debug("Could not detect hierarchy using os identifier: #{identifier} , trying with family") # https://www.commandlinux.com/man-page/man5/os-release.5.html detect_family.to_s.split.each do |family| hierarchy = @os_hierarchy.construct_hierarchy(family) return hierarchy unless hierarchy.empty? end end if hierarchy.empty? @log.debug("Could not detect hierarchy using family #{detect_family}, falling back to Linux") hierarchy = @os_hierarchy.construct_hierarchy(:linux) end hierarchy end def detect_family Facter::Resolvers::OsRelease.resolve(:id_like) end def detect_based_on_release_file @identifier = :devuan if File.readable?('/etc/devuan_version') @identifier = :archlinux if File.readable?('/etc/arch-release') end def detect_distro detect_based_on_release_file return @identifier if @identifier [Facter::Resolvers::OsRelease, Facter::Resolvers::RedHatRelease, Facter::Resolvers::SuseRelease].each do |resolver| @identifier = resolver.resolve(:id) break if @identifier end @identifier&.downcase&.to_sym end end puppetlabs-facter-dfe6df4/lib/facter/framework/detector/os_hierarchy.rb000066400000000000000000000023611470204764400265550ustar00rootroot00000000000000# frozen_string_literal: true require_relative '../../../facter/config' module Facter class OsHierarchy def initialize @log = Log.new(self) @os_hierarchy = Facter::Config::OS_HIERARCHY end def construct_hierarchy(searched_os) return [] if searched_os.nil? searched_os = searched_os.to_s.capitalize if @os_hierarchy.nil? @log.debug("There is no os_hierarchy, will fall back to: #{searched_os}") return [searched_os] end @searched_path = [] search(@os_hierarchy, searched_os, []) @searched_path.map { |os_name| os_name.to_s.capitalize } end private def search(json_data, searched_element, path) # we hit a dead end, the os was not found on this branch # and we cannot go deeper return unless json_data json_data.each do |tree_node| # we found the searched OS, so save the path from the tree @searched_path = path.dup << tree_node if tree_node == searched_element next unless tree_node.is_a?(Hash) tree_node.each do |k, v| return @searched_path = path.dup << k if k == searched_element search(v, searched_element, path << k) path.pop end end end end end puppetlabs-facter-dfe6df4/lib/facter/framework/formatters/000077500000000000000000000000001470204764400241245ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/framework/formatters/formatter_factory.rb000066400000000000000000000004641470204764400302070ustar00rootroot00000000000000# frozen_string_literal: true module Facter class FormatterFactory def self.build(options) return JsonFactFormatter.new if options[:json] return YamlFactFormatter.new if options[:yaml] return HoconFactFormatter.new if options[:hocon] LegacyFactFormatter.new end end end puppetlabs-facter-dfe6df4/lib/facter/framework/formatters/formatter_helper.rb000066400000000000000000000024771470204764400300250ustar00rootroot00000000000000# frozen_string_literal: true module Facter class FormatterHelper class << self def retrieve_facts_to_display_for_user_query(user_queries, resolved_facts) facts_to_display = FactCollection.new user_queries.each do |user_query| fact_collection = build_fact_collection_for_user_query(user_query, resolved_facts) printable_value = fact_collection.dig_fact(user_query) facts_to_display.merge!(user_query => printable_value) end Facter::Utils.sort_hash_by_key(facts_to_display) end def retrieve_fact_collection(resolved_facts) fact_collection = FactCollection.new.build_fact_collection!(resolved_facts) Facter::Utils.sort_hash_by_key(fact_collection) end def retrieve_fact_value_for_single_query(user_query, resolved_facts) fact_collection = build_fact_collection_for_user_query(user_query, resolved_facts) fact_collection = Utils.sort_hash_by_key(fact_collection) fact_collection.dig_fact(user_query) end private def build_fact_collection_for_user_query(user_query, resolved_facts) facts_for_query = resolved_facts.select { |resolved_fact| resolved_fact.user_query == user_query } FactCollection.new.build_fact_collection!(facts_for_query) end end end end puppetlabs-facter-dfe6df4/lib/facter/framework/formatters/hocon_fact_formatter.rb000066400000000000000000000032131470204764400306360ustar00rootroot00000000000000# frozen_string_literal: true module Facter class HoconFactFormatter def initialize @log = Log.new(self) end def format(resolved_facts) user_queries = resolved_facts.uniq(&:user_query).map(&:user_query) return if user_queries.count < 1 return format_for_multiple_user_queries(user_queries, resolved_facts) if user_queries.count > 1 user_query = user_queries.first return format_for_no_query(resolved_facts) if user_query.empty? format_for_single_user_query(user_queries.first, resolved_facts) unless user_query.empty? end private def format_for_no_query(resolved_facts) @log.debug('Formatting for no user query') fact_collection = FormatterHelper.retrieve_fact_collection(resolved_facts) hash_to_hocon(fact_collection) end def format_for_multiple_user_queries(user_queries, resolved_facts) @log.debug('Formatting for multiple user queries') facts_to_display = FormatterHelper.retrieve_facts_to_display_for_user_query(user_queries, resolved_facts) hash_to_hocon(facts_to_display) end def format_for_single_user_query(user_query, resolved_facts) @log.debug('Formatting for single user query') fact_value = FormatterHelper.retrieve_fact_value_for_single_query(user_query, resolved_facts) return '' unless fact_value fact_value.instance_of?(Hash) ? hash_to_hocon(fact_value) : fact_value end def hash_to_hocon(fact_collection) render_opts = Hocon::ConfigRenderOptions.new(false, false, true, false) Hocon::ConfigFactory.parse_string(fact_collection.to_json).root.render(render_opts) end end end puppetlabs-facter-dfe6df4/lib/facter/framework/formatters/json_fact_formatter.rb000066400000000000000000000016701470204764400305060ustar00rootroot00000000000000# frozen_string_literal: true module Facter class JsonFactFormatter def initialize @log = Facter::Log.new(self) end def format(resolved_facts) user_queries = resolved_facts.uniq(&:user_query).map(&:user_query) if user_queries.count == 1 && user_queries.first.empty? format_for_no_query(resolved_facts) else format_for_user_queries(user_queries, resolved_facts) end end private def format_for_no_query(resolved_facts) @log.debug('No user query provided') fact_collection = FormatterHelper.retrieve_fact_collection(resolved_facts) JSON.pretty_generate(fact_collection) end def format_for_user_queries(user_queries, resolved_facts) @log.debug('User provided a query') facts_to_display = FormatterHelper.retrieve_facts_to_display_for_user_query(user_queries, resolved_facts) JSON.pretty_generate(facts_to_display) end end end puppetlabs-facter-dfe6df4/lib/facter/framework/formatters/legacy_fact_formatter.rb000066400000000000000000000067571470204764400310140ustar00rootroot00000000000000# frozen_string_literal: true module Facter class LegacyFactFormatter def initialize @log = Log.new(self) end def format(resolved_facts) user_queries = resolved_facts.uniq(&:user_query).map(&:user_query) return if user_queries.count < 1 return format_for_multiple_user_queries(user_queries, resolved_facts) if user_queries.count > 1 user_query = user_queries.first return format_for_no_query(resolved_facts) if user_query.empty? format_for_single_user_query(user_queries.first, resolved_facts) end private def format_for_no_query(resolved_facts) @log.debug('Formatting for no user query') fact_collection = Facter::FormatterHelper.retrieve_fact_collection(resolved_facts) pretty_json = hash_to_facter_format(fact_collection) pretty_json = remove_enclosing_accolades(pretty_json) pretty_json = remove_comma_and_quotation(pretty_json) handle_newlines(pretty_json) end def format_for_multiple_user_queries(user_queries, resolved_facts) @log.debug('Formatting for multiple user queries') facts_to_display = Facter::FormatterHelper.retrieve_facts_to_display_for_user_query(user_queries, resolved_facts) facts_to_display.each { |k, v| facts_to_display[k] = v.nil? ? '' : v } pretty_json = hash_to_facter_format(facts_to_display) pretty_json = remove_enclosing_accolades(pretty_json) pretty_json = remove_comma_and_quotation(pretty_json) pretty_json = handle_newlines(pretty_json) @log.debug('Remove quotes from value if value is a string') pretty_json.gsub(/^(\S*) => "(.*)"/, '\1 => \2') end def format_for_single_user_query(user_query, resolved_facts) @log.debug('Formatting for single user query') fact_value = Facter::FormatterHelper.retrieve_fact_value_for_single_query(user_query, resolved_facts) return fact_value if fact_value.is_a?(String) pretty_json = fact_value.nil? ? '' : hash_to_facter_format(fact_value) @log.debug('Remove quotes from value if it is a simple string') pretty_json.gsub(/^"(.*)"/, '\1') end def hash_to_facter_format(facts_hash) @log.debug('Converting hash to pretty json') pretty_json = JSON.pretty_generate(facts_hash) @log.debug('Change key value delimiter from : to =>') pretty_json.gsub!(/":\s/, '" => ') @log.debug('Remove quotes from parent nodes') pretty_json.gsub!(/"(.*)"\ =>/, '\1 =>') @log.debug('Remove double backslashes from paths') pretty_json.gsub(/\\\\/, '\\') end def remove_enclosing_accolades(pretty_fact_json) @log.debug('Removing enclosing accolades') pretty_fact_json = pretty_fact_json[1..-2] @log.debug('Remove empty lines') pretty_fact_json.gsub!(/^$\n/, '') @log.debug('Fix indentation after removing enclosed accolades') pretty_fact_json = pretty_fact_json.gsub(/^\s\s(.*)$/, '\1') @log.debug('remove comas from query results') pretty_fact_json.gsub(/^},/, '}') end def handle_newlines(pretty_fact_json) @log.debug('Convert newline characters to actual newlines') pretty_fact_json.gsub('\n', "\n") end def remove_comma_and_quotation(output) # quotation marks that come after \ are not removed @log.debug('Remove unnecessary comma and quotation marks on root facts') output.split("\n") .map! { |line| /^\s+/.match?(line) ? line : line.gsub(/,$|(?] a list of searchable facts that resolve the user's query def parse(query_list, loaded_facts) matched_facts = [] @query_list = query_list return no_user_query(loaded_facts) unless query_list.any? query_list.each do |query| found_facts = search_for_facts(query, loaded_facts) matched_facts << found_facts end matched_facts.flatten(1) end def no_user_query(loaded_facts) searched_facts = [] loaded_facts.each do |loaded_fact| searched_facts << SearchedFact.new(loaded_fact.name, loaded_fact.klass, '', loaded_fact.type) end searched_facts end def search_for_facts(query, loaded_facts) resolvable_fact_list = [] query = query.to_s query_tokens = query.end_with?('.*') ? [query] : query.split('.') size = query_tokens.size # Try to match the most specific query_tokens to the least, returning the first match size.times do |i| query_token_range = 0..size - i - 1 query_fact = query_tokens[query_token_range].join('.') resolvable_fact_list = get_facts_matching_tokens(query_tokens, query_fact, loaded_facts) return resolvable_fact_list if resolvable_fact_list.any? end resolvable_fact_list << SearchedFact.new(query, nil, query, :nil) if resolvable_fact_list.empty? resolvable_fact_list end def get_facts_matching_tokens(query_tokens, query_fact, loaded_facts) resolvable_fact_list = [] loaded_facts.each do |loaded_fact| next unless found_fact?(loaded_fact.name, query_fact) searched_fact = construct_loaded_fact(query_tokens, loaded_fact) resolvable_fact_list << searched_fact end @log.debug "List of resolvable facts: #{resolvable_fact_list.inspect}" if resolvable_fact_list.any? resolvable_fact_list end def found_fact?(fact_name, query_fact) # This is the case where the fact_name contains a wildcard like # blockdevice_.*_model and we're querying for the legacy fact # specifically using 'blockdevice_sba_model' and we don't want the query # 'blockdevice.sba.model' to match fact_with_wildcard = fact_name.include?('.*') && !query_fact.include?('.') if fact_with_wildcard # fact_name contains wildcard, so we're intentially not escaping. query_fact.match("^#{fact_name}$") else processed_equery_fact = query_fact.gsub('\\', '\\\\\\\\') # Must escape metacharacters (like dots) to ensure the correct fact is found fact_name.match("^#{Regexp.escape(processed_equery_fact)}($|\\.)") end end def construct_loaded_fact(query_tokens, loaded_fact) user_query = @query_list.any? ? query_tokens.join('.') : '' fact_name = loaded_fact.name.to_s klass_name = loaded_fact.klass type = loaded_fact.type sf = SearchedFact.new(fact_name, klass_name, user_query, type) sf.file = loaded_fact.file sf end end end end puppetlabs-facter-dfe6df4/lib/facter/models/000077500000000000000000000000001470204764400212245ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/models/fact_collection.rb000066400000000000000000000047021470204764400247040ustar00rootroot00000000000000# frozen_string_literal: true module Facter class FactCollection < Hash def initialize super @log = Log.new(self) end def to_yaml deep_to_h.to_yaml end # Transorms a list of {Facter::ResolvedFact} into a nested collection. # @param facts [Array] # # @return [FactCollection] # # @api private def build_fact_collection!(facts) facts.each do |fact| next if %i[core legacy].include?(fact.type) && fact.value.nil? bury_fact(fact) end self end def dig_fact(user_query) value(user_query) rescue KeyError, TypeError nil end # Collection#fetch implementation for nested collections. # @param user_query [String] the search terms, separated by "." # # @return [String] # # @example for fact_collection = { "os": { "name": "Darwin" } } # fact_collection.fetch("os.name") #=> "Darwin" # # @api private def value(user_query) fetch(user_query) do split_user_query = Facter::Utils.split_user_query(user_query) split_user_query.reduce(self) do |memo, key| raise KeyError unless memo.respond_to?(:fetch) memo.fetch(key) { memo.fetch(key.to_s) } end end end def bury(*args) raise ArgumentError, '2 or more arguments required' if args.count < 2 if args.count == 2 self[args[0]] = args[1] else arg = args.shift self[arg] = FactCollection.new unless self[arg] self[arg].bury(*args) unless args.empty? end self end private def deep_to_h(collection = self) collection.each_pair.with_object({}) do |(key, value), hash| hash[key] = value.is_a?(FactCollection) ? deep_to_h(value) : value end end def bury_fact(fact) split_fact_name = extract_fact_name(fact) bury(*split_fact_name << fact.value) rescue NoMethodError @log.error("#{fact.type.to_s.capitalize} fact `#{fact.name}` cannot be added to collection."\ ' The format of this fact is incompatible with other'\ " facts that belong to `#{fact.name.split('.').first}` group") end def extract_fact_name(fact) case fact.type when :legacy [fact.name] when :custom, :external Options[:force_dot_resolution] == true ? fact.name.split('.') : [fact.name] else fact.name.split('.') end end end end puppetlabs-facter-dfe6df4/lib/facter/models/loaded_fact.rb000066400000000000000000000005111470204764400237730ustar00rootroot00000000000000# frozen_string_literal: true module Facter class LoadedFact attr_reader :name, :klass, :type attr_accessor :file, :is_env def initialize(name, klass, type = nil, file = nil) @name = name @klass = klass @type = type.nil? ? :core : type @file = file @is_env = false end end end puppetlabs-facter-dfe6df4/lib/facter/models/resolved_fact.rb000066400000000000000000000010341470204764400243670ustar00rootroot00000000000000# frozen_string_literal: true module Facter class ResolvedFact attr_reader :name, :type attr_accessor :user_query, :value, :file def initialize(name, value = '', type = :core, user_query = nil) @name = name @value = Utils.deep_stringify_keys(value) @type = type @user_query = user_query end def legacy? type == :legacy end def core? type == :core end def to_s @value.to_s end def resolves?(user_query) @name == user_query end end end puppetlabs-facter-dfe6df4/lib/facter/models/searched_fact.rb000066400000000000000000000005111470204764400243210ustar00rootroot00000000000000# frozen_string_literal: true module Facter class SearchedFact attr_reader :name, :fact_class, :user_query, :type attr_accessor :file def initialize(fact_name, fact_class, user_query, type) @name = fact_name @fact_class = fact_class @user_query = user_query @type = type end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/000077500000000000000000000000001470204764400217655ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/resolvers/aio_agent_version.rb000066400000000000000000000011511470204764400260030ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class AioAgentVersion < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_agent_version } end def read_agent_version aio_agent_version = Facter::Util::FileHelper.safe_read('/opt/puppetlabs/puppet/VERSION', nil)&.chomp aio_agent_version = aio_agent_version&.match(/^\d+\.\d+\.\d+(\.\d+){0,2}/)&.to_s @fact_list[:aio_agent_version] = aio_agent_version end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/aix/000077500000000000000000000000001470204764400225465ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/resolvers/aix/architecture.rb000066400000000000000000000024531470204764400255610ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Architecture < BaseResolver # :architecture init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_architecture(fact_name) } end def read_architecture(fact_name) require_relative '../../../facter/util/aix/odm_query' proc_number = read_proc odmquery = Facter::Util::Aix::ODMQuery.new odmquery .equals('name', proc_number) .equals('attribute', 'type') result = odmquery.execute return unless result result.each_line do |line| if line.include?('value') @fact_list[:architecture] = line.split('=')[1].strip.delete('\"') break end end @fact_list[fact_name] end def read_proc odmquery = Facter::Util::Aix::ODMQuery.new odmquery .equals('PdDvLn', 'processor/sys/proc_rspc') .equals('status', '1') result = odmquery.execute result.each_line do |line| return line.split('=')[1].strip.delete('\"') if line.include?('name') end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/aix/disks.rb000066400000000000000000000033631470204764400242150ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Aix class Disks < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { execute_lspv(fact_name) } end def execute_lspv(fact_name) result = Facter::Core::Execution.execute('lspv', logger: log) return if result.empty? @fact_list[:disks] = {} result.each_line do |line| disk_name = line.split(' ')[0].strip size = find_size(disk_name) @fact_list[:disks][disk_name] = size if size end @fact_list[fact_name] end def find_size(name) stdout = Facter::Core::Execution.execute("lspv #{name}", logger: log) return if stdout.empty? info_size = Facter::Util::Aix::InfoExtractor.extract(stdout, :lspv) return unless info_size['PV STATE'] size_bytes = compute_size(info_size) { size_bytes: size_bytes, size: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(size_bytes) } end def compute_size(size_hash) physical_partitions = size_hash['TOTAL PPs'].to_i size_physical_partition = size_hash['PP SIZE'] exp = if size_physical_partition[/mega/] Facter::Util::Aix::InfoExtractor::MEGABYTES_EXPONENT else Facter::Util::Aix::InfoExtractor::GIGABYTES_EXPONENT end size_physical_partition.to_i * physical_partitions * exp end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/aix/ffi/000077500000000000000000000000001470204764400233125ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/resolvers/aix/ffi/ffi.rb000066400000000000000000000022551470204764400244070ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Aix module FFI RTM_IFINFO = 0xe RTM_NEWADDR = 0xc RTAX_DST = 0 RTAX_GATEWAY = 1 RTAX_NETMASK = 2 RTAX_GENMASK = 3 RTAX_IFP = 4 RTAX_IFA = 5 RTAX_AUTHOR = 6 RTAX_BRD = 7 RTAX_MAX = 8 RTA_DST = 0x1 RTA_GATEWAY = 0x2 RTA_NETMASK = 0x4 RTA_GENMASK = 0x8 RTA_IFP = 0x10 RTA_IFA = 0x20 RTA_AUTHOR = 0x40 RTA_BRD = 0x80 RTA_DOWNSTREAM = 0x100 AF_UNSPEC = 0 AF_INET = 2 AF_INET6 = 24 AF_MAX = 30 INET_ADDRSTRLEN = 16 INET6_ADDRSTRLEN = 46 RTAX_LIST = [ RTAX_DST, RTAX_GATEWAY, RTAX_NETMASK, RTAX_GENMASK, RTAX_IFP, RTAX_IFA, RTAX_AUTHOR, RTAX_BRD ].freeze RTA_LIST = [ RTA_DST, RTA_GATEWAY, RTA_NETMASK, RTA_GENMASK, RTA_IFP, RTA_IFA, RTA_AUTHOR, RTA_BRD, RTA_DOWNSTREAM ].freeze end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/aix/ffi/ffi_helper.rb000066400000000000000000000124661470204764400257530ustar00rootroot00000000000000# frozen_string_literal: true require 'ffi' require_relative 'structs' require_relative 'ffi' module Facter module Resolvers module Aix module FfiHelper KINFO_GET_AVENRUN = 1 KINFO_READ = 8 << 8 KINFO_RT = 1 << 8 KINFO_RT_IFLIST = KINFO_RT | 3 module Libc extend ::FFI::Library RTLD_LAZY = 0x00000004 RTLD_GLOBAL = 0x00010000 RTLD_MEMBER = 0x00040000 @ffi_lib_flags = RTLD_LAZY | RTLD_GLOBAL | RTLD_MEMBER ffi_lib 'libc.a(shr.o)' attach_function :getkerninfo, %i[int pointer pointer int], :int attach_function :inet_ntop, %i[int pointer pointer uint], :string end def self.read_load_averages averages = ::FFI::MemoryPointer.new(:long_long, 3) averages_size = ::FFI::MemoryPointer.new(:int, 1) averages_size.write_int(averages.size) return if Libc.getkerninfo(KINFO_READ | KINFO_GET_AVENRUN, averages, averages_size, 0).negative? averages.read_array_of_long_long(3).map { |x| (x / 65_536.0) } end def self.read_interfaces ksize = Libc.getkerninfo(KINFO_RT_IFLIST, nil, nil, 0) log.debug('getkerninfo call was unsuccessful') if ksize.zero? ksize_ptr = ::FFI::MemoryPointer.new(:int, ksize.size) ksize_ptr.write_int(ksize) result_ptr = ::FFI::MemoryPointer.new(:char, ksize) res = Libc.getkerninfo(KINFO_RT_IFLIST, result_ptr, ksize_ptr, 0) log.debug('getkerninfo call was unsuccessful') if res == -1 cursor = 0 interfaces = {} while cursor < ksize_ptr.read_int hdr = FFI::IfMsghdr.new(result_ptr + cursor) case hdr[:ifm_type] when FFI::RTM_IFINFO link_addr = FFI::SockaddrDl.new(hdr.to_ptr + hdr.size) interface_name = link_addr[:sdl_data].to_s[0, link_addr[:sdl_nlen]] interfaces[interface_name] ||= {} when FFI::RTM_NEWADDR addresses = {} addr_cursor = cursor + hdr.size FFI::RTAX_LIST.each do |key| xand = hdr[:ifm_addrs] & FFI::RTA_LIST[key] next unless xand != 0 sockaddr = FFI::Sockaddr.new(result_ptr + addr_cursor) addresses[key] = sockaddr roundup_nr = roundup(sockaddr) addr_cursor += roundup_nr end family = FFI::AF_UNSPEC addresses.each_value do |addr| if family != FFI::AF_UNSPEC && addr[:sa_family] != FFI::AF_UNSPEC && family != addr[:sa_family] family = FFI::AF_MAX break end family = addr[:sa_family] end if addresses[FFI::RTAX_NETMASK][:sa_len] addresses[FFI::RTAX_NETMASK][:sa_family] = family netmask = address_to_string(addresses[FFI::RTAX_NETMASK]) end address = address_to_string(addresses[FFI::RTAX_IFA]) if addresses[FFI::RTAX_IFA][:sa_len] if addresses[FFI::RTAX_NETMASK][:sa_len] && addresses[FFI::RTAX_IFA][:sa_len] network = address_to_string(addresses[FFI::RTAX_IFA], addresses[FFI::RTAX_NETMASK]) end bindings = family == FFI::AF_INET ? :bindings : :bindings6 interfaces[interface_name][bindings] ||= [] interfaces[interface_name][bindings] << { netmask: netmask.read_string, address: address.read_string, network: network.read_string } else log.debug("got an unknown RT_IFLIST message: #{hdr[:ifm_type]}") end cursor += hdr[:ifm_msglen] end interfaces end def self.roundup(sockaddr) if sockaddr[:sa_len].positive? 1 + ((sockaddr[:sa_len] - 1) | (1.size - 1)) else 1.size end end def self.address_to_string(sockaddr, mask = nil) if sockaddr[:sa_family] == FFI::AF_INET in_addr_ip = FFI::SockaddrIn.new(sockaddr.to_ptr) if mask && sockaddr[:sa_family] == mask[:sa_family] in_addr_mask = FFI::SockaddrIn.new(mask.to_ptr) in_addr_ip[:sin_addr][:s_addr] &= in_addr_mask[:sin_addr][:s_addr] end buffer = ::FFI::MemoryPointer.new(:char, FFI::INET_ADDRSTRLEN) Libc.inet_ntop(FFI::AF_INET, in_addr_ip[:sin_addr].to_ptr, buffer, 16) buffer elsif sockaddr[:sa_family] == FFI::AF_INET6 in_addr_ip = FFI::SockaddrIn6.new(sockaddr.to_ptr) if mask && sockaddr[:sa_family] == mask[:sa_family] in_addr_mask = FFI::SockaddrIn6.new(sockaddr.to_ptr) 16.times do |i| in_addr_ip[:sin6_addr][:u6_addr8][i] &= in_addr_mask[:sin6_addr][:u6_addr8][i] end end buffer = ::FFI::MemoryPointer.new(:char, FFI::INET6_ADDRSTRLEN) Libc.inet_ntop(FFI::AF_INET6, in_addr_ip[:sin6_addr].to_ptr, buffer, 16) buffer end end def self.log @log ||= Log.new(self) end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/aix/ffi/structs.rb000066400000000000000000000035471470204764400253570ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Aix module FFI class SockaddrDl < ::FFI::Struct layout :sdl_len, :uchar, :sdl_family, :uchar, :sdl_index, :ushort, :sdl_type, :uchar, :sdl_nlen, :uchar, :sdl_alen, :uchar, :sdl_slen, :uchar, :sdl_data, [:char, 120] end class IfMsghdr < ::FFI::Struct layout :ifm_msglen, :ushort, :ifm_version, :uchar, :ifm_type, :uchar, :ifm_addrs, :int, :ifm_flags, :int, :ifm_index, :ushort, :ifm_addrlen, :uchar end class Sockaddr < ::FFI::Struct layout :sa_len, :uchar, :sa_family, :uchar, :sa_data, [:char, 14] end class InAddr < ::FFI::Struct layout :s_addr, :uint end class In6Addr < ::FFI::Struct layout :u6_addr8, [:uchar, 16] end class SockaddrIn < ::FFI::Struct layout :sin_len, :uchar, :sin_family, :uchar, :sin_port, :ushort, :sin_addr, InAddr, :sin_zero, [:uchar, 8] end class SockaddrIn6 < ::FFI::Struct layout :sin6_len, :uchar, :sin6_family, :uchar, :sin6_port, :ushort, :sin6_flowinfo, :uint, :sin6_addr, In6Addr, :sin6_scope_id, :uint end class SockaddrStorage < ::FFI::Struct layout :ss_len, :uchar, :ss_family, :uchar, :ss_pad, [:char, 6], :ss_align, :long_long, :ss_pad2, [:char, 1264] end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/aix/filesystem.rb000066400000000000000000000015051470204764400252600ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Aix class Filesystem < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_vtf_file(fact_name) } end def read_vtf_file(fact_name) file_content = Facter::Util::FileHelper.safe_readlines('/etc/vfs') return if file_content.empty? file_content = file_content.map do |line| next if /#|%/.match?(line) # skip lines that are comments or defaultvfs line line.split(' ').first end @fact_list[:file_systems] = file_content.compact.sort.join(',') @fact_list[fact_name] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/aix/hardware.rb000066400000000000000000000016031470204764400246700ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Hardware < BaseResolver # :hardware init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_hardware(fact_name) } end def read_hardware(fact_name) require_relative '../../../facter/util/aix/odm_query' odmquery = Facter::Util::Aix::ODMQuery.new odmquery .equals('name', 'sys0') .equals('attribute', 'modelname') result = odmquery.execute return unless result result.each_line do |line| if line.include?('value') @fact_list[:hardware] = line.split('=')[1].strip.delete('\"') break end end @fact_list[fact_name] end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/aix/load_averages.rb000066400000000000000000000012021470204764400256620ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Aix class LoadAverages < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_load_averages(fact_name) } end def read_load_averages(fact_name) require_relative 'ffi/ffi_helper' @fact_list[:load_averages] = {}.tap do |h| h['1m'], h['5m'], h['15m'] = FfiHelper.read_load_averages end @fact_list[fact_name] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/aix/memory.rb000066400000000000000000000035511470204764400244070ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Aix class Memory < BaseResolver init_resolver # :hardware class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { execute_svmon(fact_name) } end def execute_svmon(fact_name) result = Facter::Core::Execution.execute('svmon', logger: log) return if result.empty? pagesize = call_pagesize.to_i return if pagesize.zero? @fact_list[:system] = @fact_list[:swap] = {} result.each_line do |line| @fact_list[:system] = populate_system(line, pagesize) if line.include?('memory') @fact_list[:swap] = populate_swap(line, pagesize) if /pg\sspace/.match?(line) end @fact_list[fact_name] end def call_pagesize Facter::Core::Execution.execute('pagesize', logger: log).strip end def populate_system(content, pagesize) content = content.split(' ') total = content[1].to_i * pagesize used = content[2].to_i * pagesize { available_bytes: content[3].to_i * pagesize, total_bytes: total, used_bytes: used, capacity: Facter::Util::Resolvers::FilesystemHelper.compute_capacity(used, total) } end def populate_swap(content, pagesize) content = content.split(' ') total = content[2].to_i * pagesize used = content[3].to_i * pagesize { available_bytes: total - used, total_bytes: total, used_bytes: used, capacity: Facter::Util::Resolvers::FilesystemHelper.compute_capacity(used, total) } end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/aix/mountpoints.rb000066400000000000000000000050641470204764400254770ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Aix class Mountpoints < BaseResolver init_resolver BLOCK_SIZE = 512 class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_mount(fact_name) } end def read_mount(fact_name) @fact_list[:mountpoints] = {} output = Facter::Core::Execution.execute('mount', logger: log) output.split("\n").drop(2).map do |line| next if /procfs|ahafs/.match?(line) add_mount_points_fact(line) end retrieve_sizes_for_mounts @fact_list[fact_name] end def add_mount_points_fact(line) elem = line.split("\s") if line[0] != ' ' server = elem.shift device = "#{server}:#{elem[0]}" else device = elem[0] end @fact_list[:mountpoints][elem[1]] = { device: device, filesystem: elem[2], options: elem.last.include?(':') ? [] : elem.last.split(',') } end def retrieve_sizes_for_mounts output = Facter::Core::Execution.execute('df -P', logger: log) output.split("\n").drop(1).map do |line| next if /-\s+-\s+-/.match?(line) mount_info = line.split("\s") mount_info[3] = translate_to_bytes(mount_info[3]) mount_info[2] = translate_to_bytes(mount_info[2]) mount_info[1] = translate_to_bytes(mount_info[1]) compute_sizes(mount_info) end end def translate_to_bytes(strin_size) strin_size.to_i * BLOCK_SIZE end def compute_sizes(info) available_bytes = info[3] used_bytes = info[2] size_bytes = info[1] @fact_list[:mountpoints][info.last].merge!( capacity: Facter::Util::Resolvers::FilesystemHelper.compute_capacity(used_bytes, size_bytes), available_bytes: available_bytes, used_bytes: used_bytes, size_bytes: size_bytes, available: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(available_bytes), used: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(used_bytes), size: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(size_bytes) ) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/aix/networking.rb000066400000000000000000000051311470204764400252620ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Aix class Networking < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_netstat(fact_name) } end def read_netstat(fact_name) @fact_list[:interfaces] = {} output = Facter::Core::Execution.execute('netstat -rn', logger: log) output = output.each_line.select { |line| (line =~ /\s\s[0-9]+.[0-9]+.[0-9]+.[0-9]+|\s\s.*:[0-9a-f]+/) } @fact_list[:interfaces] = load_interfaces populate_with_mtu_and_mac!(@fact_list[:interfaces]) get_primary_interface_info(output) Facter::Util::Resolvers::Networking.expand_main_bindings(@fact_list) @fact_list[fact_name] end def get_primary_interface_info(output) primary_interface_info = output.find { |line| line =~ /default/ }&.split(' ') @fact_list[:primary_interface] = primary_interface_info[5] if primary_interface_info end def build_bindings(name, ip, mask_length, is_ipv4) bind_to_add = is_ipv4 ? :bindings : :bindings6 ip = ip.gsub(/%[0-9]$/, '') # remove mask information if it exists mask_length = mask_length.to_i - 1 unless is_ipv4 @fact_list[:interfaces][name] ||= {} @fact_list[:interfaces][name][bind_to_add] ||= [] @fact_list[:interfaces][name][bind_to_add] << Facter::Util::Resolvers::Networking .build_binding(ip, mask_length) end def populate_with_mtu_and_mac!(interfaces) output = Facter::Core::Execution.execute('netstat -in', logger: log) output.each_line do |line| next if /Name\s/.match?(line) info = line.split("\s") interface_name = info[0] mac = info[3][/^([0-9a-f]{1,2}[.:-]){5}([0-9a-f]{1,2})$/] if interfaces[interface_name] interfaces[interface_name][:mtu] = info[1].to_i interfaces[interface_name][:mac] = format_mac_address(mac) if mac end end end def format_mac_address(address) address.split('.').map { |e| format('%02s', mac_address: e) }.join(':').tr(' ', '0') end def load_interfaces require_relative 'ffi/ffi_helper' FfiHelper.read_interfaces end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/aix/nim.rb000066400000000000000000000012641470204764400236610ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Aix class Nim < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_niminfo(fact_name) } end def read_niminfo(fact_name) output = Facter::Util::FileHelper.safe_read('/etc/niminfo', nil) return unless output type = /NIM_CONFIGURATION=(.*)/.match(output) @fact_list[:type] = type[1] if type[1] && /master|standalone/.match?(type[1]) @fact_list[fact_name] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/aix/os_level.rb000066400000000000000000000011621470204764400247030ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Aix class OsLevel < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_oslevel(fact_name) } end def read_oslevel(fact_name) output = Facter::Core::Execution.execute('/usr/bin/oslevel -s', logger: log) @fact_list[:build] = output unless output.empty? @fact_list[:kernel] = 'AIX' @fact_list[fact_name] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/aix/partitions.rb000066400000000000000000000043041470204764400252700ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Aix class Partitions < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { query_cudv(fact_name) } end def query_cudv(fact_name) odmquery = Facter::Util::Aix::ODMQuery.new odmquery.equals('PdDvLn', 'logical_volume/lvsubclass/lvtype') result = odmquery.execute return unless result @fact_list[:partitions] = {} result.each_line do |line| next unless line.include?('name') part_name = line.split('=')[1].strip.delete('"') part = "/dev/#{part_name}" info = populate_from_lslv(part_name) @fact_list[:partitions][part] = info if info end @fact_list[fact_name] end def populate_from_lslv(name) stdout = Facter::Core::Execution.execute("lslv -L #{name}", logger: log) return if stdout.empty? info_hash = Facter::Util::Aix::InfoExtractor.extract(stdout, :lslv) size_bytes = compute_size(info_hash) part_info = { filesystem: info_hash['TYPE'], size_bytes: size_bytes, size: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(size_bytes) } mount = info_hash['MOUNT POINT'] label = info_hash['LABEL'] part_info[:mount] = mount unless %r{N/A}.match?(mount) part_info[:label] = label.strip unless /None/.match?(label) part_info end def compute_size(info_hash) logical_partitions = info_hash['LPs'].to_i size_physical_partition = info_hash['PP SIZE'] exp = if size_physical_partition[/mega/] Facter::Util::Aix::InfoExtractor::MEGABYTES_EXPONENT else Facter::Util::Aix::InfoExtractor::GIGABYTES_EXPONENT end size_physical_partition.to_i * logical_partitions * exp end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/aix/processors.rb000066400000000000000000000052111470204764400252740ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Aix class Processors < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { query_pddv(fact_name) } end def query_pddv(fact_name) @fact_list[:models] = [] @fact_list[:logical_count] = 0 @fact_list[:cores_per_socket] = 0 @fact_list[:threads_per_core] = 0 odmquery = Facter::Util::Aix::ODMQuery.new odmquery.equals('class', 'processor') result = odmquery.execute return unless result proc_names = retrieve_from_array(result.scan(/uniquetype\s=\s.*/), 1) proc_names.each { |name| populate_from_cudv(name) } @fact_list[fact_name] end def populate_from_cudv(name) odmquery = Facter::Util::Aix::ODMQuery.new odmquery.equals('PdDvLn', name) result = odmquery.execute return unless result names = retrieve_from_array(result.scan(/name\s=\s.*/), 1) status = retrieve_from_array(result.scan(/\s+status\s=\s.*/), 1) names.each_with_index { |elem, idx| query_cuat(elem) if status[idx] == '1' } end def query_cuat(name) odmquery = Facter::Util::Aix::ODMQuery.new odmquery.equals('name', name) result = odmquery.execute return unless result type, frequency, smt_threads, smt_enabled = process(result) @fact_list[:speed] ||= frequency if frequency threads = smt_enabled ? smt_threads : 1 @fact_list[:logical_count] += threads @fact_list[:cores_per_socket] += 1 @fact_list[:threads_per_core] = threads @fact_list[:models].concat([type] * threads) end def process(stdout) type = retrieve_from_array(stdout.scan(/attribute\s=\s"type"\n\s+value\s=\s.*/), 2).first frequency = retrieve_from_array(stdout.scan(/attribute\s=\s"frequency"\n\s+value\s=\s.*/), 2).first smt_threads = retrieve_from_array(stdout.scan(/attribute\s=\s"smt_threads"\n\s+value\s=\s.*/), 2).first smt_enabled = retrieve_from_array(stdout.scan(/attribute\s=\s"smt_enabled"\n\s+value\s=\s.*/), 2).first [type, frequency.to_i, smt_threads.to_i, smt_enabled] end def retrieve_from_array(array, pos) array.map { |elem| elem.split('=')[pos].strip.delete('"') } end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/aix/serialnumber.rb000066400000000000000000000015531470204764400255670ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Aix class Serialnumber < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_serialnumber(fact_name) } end def read_serialnumber(fact_name) odmquery = Facter::Util::Aix::ODMQuery.new odmquery .equals('name', 'sys0') .equals('attribute', 'systemid') result = odmquery.execute result.each_line do |line| if line.include?('value') @fact_list[:serialnumber] = line.split('=')[1].strip.delete('\"')[6..-1] break end end @fact_list[fact_name] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/amzn/000077500000000000000000000000001470204764400227325ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/resolvers/amzn/os_release_rpm.rb000066400000000000000000000017311470204764400262600ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Amzn class OsReleaseRpm < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { rpm_system_call(fact_name) } end def rpm_system_call(fact_name) output = Facter::Core::Execution.execute( 'rpm -q --qf \'%s\n%s\n%s\n%s\' -f /etc/os-release', logger: log ) build_fact_list(output) @fact_list[fact_name] end def build_fact_list(output) rpm_results = output.split("\n") return if rpm_results.empty? @fact_list[:package], @fact_list[:version], @fact_list[:release], @fact_list[:vendor] = rpm_results.map(&:strip) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/augeas.rb000066400000000000000000000026621470204764400235650ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Augeas < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_augeas_version(fact_name) } end def read_augeas_version(fact_name) @fact_list[:augeas_version] = read_augeas_from_cli @fact_list[:augeas_version] ||= read_augeas_from_gem @fact_list[fact_name] rescue LoadError => e log.debug("Resolving fact #{fact_name}, but got #{e} at #{e.backtrace[0]}") @fact_list[:augeas_version] = nil end def read_augeas_from_cli command = if File.readable?('/opt/puppetlabs/puppet/bin/augparse') '/opt/puppetlabs/puppet/bin/augparse' else 'augparse' end output = Facter::Core::Execution.execute("#{command} --version 2>&1", logger: log) Regexp.last_match(1) if output =~ /^augparse (\d+\.\d+\.\d+)/ end def read_augeas_from_gem require 'augeas' if Gem.loaded_specs['augeas'] ::Augeas.create { |aug| aug.get('/augeas/version') } else # it is used for legacy augeas <= 0.5.0 (ruby-augeas gem) ::Augeas.open { |aug| aug.get('/augeas/version') } end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/az.rb000066400000000000000000000020441470204764400227240ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Az < BaseResolver init_resolver AZ_METADATA_URL = 'http://169.254.169.254/metadata/instance?api-version=2020-09-01' AZ_SESSION_TIMEOUT = 5 class << self private def post_resolve(fact_name, _options) log.debug('Querying Az metadata') @fact_list.fetch(fact_name) { read_facts(fact_name) } end def read_facts(fact_name) @fact_list[:metadata] = {} data = get_data_from(AZ_METADATA_URL) @fact_list[:metadata] = JSON.parse(data) unless data.empty? @fact_list[fact_name] end def get_data_from(url) headers = { Metadata: 'true' } Facter::Util::Resolvers::Http.get_request(url, headers, { session: determine_session_timeout }, false) end def determine_session_timeout session_env = ENV['AZ_SESSION_TIMEOUT'] session_env ? session_env.to_i : AZ_SESSION_TIMEOUT end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/base_resolver.rb000066400000000000000000000022201470204764400251410ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class BaseResolver class << self attr_reader :log end def self.invalidate_cache @fact_list = {} end def self.init_resolver @fact_list = {} @semaphore = Mutex.new @log = Log.new(self) end def self.subscribe_to_manager Facter::SessionCache.subscribe(self) end def self.resolve(fact_name, options = {}) @semaphore.synchronize do subscribe_to_manager post_resolve(fact_name, options) cache_nil_for_unresolved_facts(fact_name) end rescue LoadError, NameError => e log.error("Resolving fact #{fact_name}, but got #{e} at #{e.backtrace[0]}") @fact_list[fact_name] = nil end def self.cache_nil_for_unresolved_facts(fact_name) @fact_list.fetch(fact_name) { @fact_list[fact_name] = nil } @fact_list[fact_name] end def self.post_resolve(_fact_name, _options) raise NotImplementedError, "You must implement post_resolve(fact_name, options) method in #{name}" end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/bsd/000077500000000000000000000000001470204764400225355ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/resolvers/bsd/ffi/000077500000000000000000000000001470204764400233015ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/resolvers/bsd/ffi/ffi_helper.rb000066400000000000000000000021101470204764400257230ustar00rootroot00000000000000# frozen_string_literal: true require 'ffi' module Facter module Bsd module FfiHelper module Libc extend FFI::Library ffi_lib 'c' attach_function :sysctl, %i[pointer uint pointer pointer pointer size_t], :int end def self.sysctl(type, oids) name = FFI::MemoryPointer.new(:uint, oids.size) name.write_array_of_uint(oids) namelen = oids.size oldp = FFI::Pointer::NULL oldlenp = FFI::MemoryPointer.new(:size_t) newp = FFI::Pointer::NULL newlen = 0 if type == :string res = Libc.sysctl(name, namelen, oldp, oldlenp, newp, newlen) return nil if res.negative? else oldlenp.write(:size_t, FFI.type_size(type)) end oldp = FFI::MemoryPointer.new(:uint8_t, oldlenp.read(:size_t)) res = Libc.sysctl(name, namelen, oldp, oldlenp, newp, newlen) return nil if res.negative? case type when :string oldp.read_string else oldp.read(type) end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/bsd/processors.rb000066400000000000000000000023741470204764400252720ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Bsd class Processors < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { collect_processors_info(fact_name) } end def collect_processors_info(fact_name) require_relative '../../../facter/resolvers/bsd/ffi/ffi_helper' count = logical_count model = processor_model speed = processor_speed @fact_list[:logical_count] = count @fact_list[:models] = Array.new(count, model) if count && model @fact_list[:speed] = speed * 1000 * 1000 if speed @fact_list[fact_name] end CTL_HW = 6 HW_MODEL = 2 HW_NCPU = 3 HW_CPUSPEED = 12 def processor_model Facter::Bsd::FfiHelper.sysctl(:string, [CTL_HW, HW_MODEL]) end def logical_count Facter::Bsd::FfiHelper.sysctl(:uint32_t, [CTL_HW, HW_NCPU]) end def processor_speed Facter::Bsd::FfiHelper.sysctl(:uint32_t, [CTL_HW, HW_CPUSPEED]) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/containers.rb000066400000000000000000000043031470204764400244570ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Containers < BaseResolver # :virtual # :hypervisor init_resolver INFO = { 'docker' => 'id', 'lxc' => 'name' }.freeze class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) do read_environ(fact_name) || read_cgroup(fact_name) end end def read_cgroup(fact_name) output_cgroup = Facter::Util::FileHelper.safe_read('/proc/1/cgroup', nil) return unless output_cgroup output_docker = %r{docker/(.+)}.match(output_cgroup) output_lxc = %r{^/lxc/([^/]+)}.match(output_cgroup) info, vm = extract_vm_and_info(output_docker, output_lxc) @fact_list[:vm] = vm @fact_list[:hypervisor] = { vm.to_sym => info } if vm @fact_list[fact_name] end def read_environ(fact_name) begin container = Facter::Util::Linux::Proc.getenv_for_pid(1, 'container') rescue StandardError => e log.warn("Unable to getenv for pid 1, '#{e}'") return nil end return if container.nil? || container.empty? info = {} case container when 'lxc' vm = 'lxc' when 'podman' vm = 'podman' when 'crio' vm = 'crio' when 'systemd-nspawn' vm = 'systemd_nspawn' info = { 'id' => Facter::Util::FileHelper.safe_read('/etc/machine-id', nil).strip } else vm = 'container_other' log.warn("Container runtime, '#{container}', is unsupported, setting to '#{vm}'") end @fact_list[:vm] = vm @fact_list[:hypervisor] = { vm.to_sym => info } if vm @fact_list[fact_name] end def extract_vm_and_info(output_docker, output_lxc) vm = nil if output_docker vm = 'docker' info = output_docker[1] elsif output_lxc vm = 'lxc' info = output_lxc[1] end [info ? { INFO[vm] => info } : {}, vm] end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/debian_version.rb000066400000000000000000000011501470204764400252760ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class DebianVersion < BaseResolver # :major # :minor # :full init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_debian_version(fact_name) } end def read_debian_version(fact_name) file_content = Facter::Util::FileHelper.safe_read('/etc/debian_version') @fact_list[:version] = file_content.strip unless file_content.empty? @fact_list[fact_name] end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/disks.rb000066400000000000000000000051351470204764400234330ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Linux class Disks < BaseResolver init_resolver DIR = '/sys/block' FILE_PATHS = { model: 'device/model', size: 'size', vendor: 'device/vendor', type: 'queue/rotational', serial: 'false', wwn: 'false' }.freeze class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) do return unless @fact_list.empty? build_disks_hash read_facts @fact_list[:disks] = nil if @fact_list[:disks].empty? @fact_list[fact_name] end end def lsblk(option, disk) result = Facter::Core::Execution.execute( "lsblk -dn -o #{option} /dev/#{disk}", on_fail: '', timeout: 1 ).strip result.empty? ? nil : result end def read_facts FILE_PATHS.each do |key, file| @fact_list[:disks].each do |disk, value| file_path = File.join(DIR, disk, file) result = if file == 'false' lsblk(key, disk) else Facter::Util::FileHelper.safe_read(file_path, nil)&.strip end next unless result value[key] = case key when :size # Linux always considers sectors to be 512 bytes long # independently of the devices real block size. construct_size(value, result) when :type result == '0' ? 'ssd' : 'hdd' else result end end end end def build_disks_hash valid_disks = Facter::Util::FileHelper.dir_children(DIR) .select { |disk| File.readable?(File.join(DIR, disk, 'device')) } @fact_list[:disks] = {} valid_disks.each { |disk| @fact_list[:disks][disk] = {} } end def construct_size(facts, value) value = value.to_i * 512 facts[:size_bytes] = value facts[:size] = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(value) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/dmi.rb000066400000000000000000000044431470204764400230700ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Linux class DmiBios < BaseResolver init_resolver class << self # :bios_vendor # :bios_date # :bios_version # :board_asset_tag # :board_vendor # :board_serial # :board_name # :chassis_asset_tag # :chassis_type # :sys_vendor # :product_serial # :product_name # :product_uuid # :product_version private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_facts(fact_name) } end def read_facts(fact_name) files = %w[bios_date bios_vendor bios_version board_asset_tag board_vendor board_name board_serial chassis_asset_tag chassis_type sys_vendor product_name product_serial product_uuid product_version] return unless File.directory?('/sys/class/dmi') file_content = Facter::Util::FileHelper.safe_read("/sys/class/dmi/id/#{fact_name}", nil) file_content = file_content.encode('UTF-8', invalid: :replace) if file_content if files.include?(fact_name.to_s) && file_content file_content = file_content.strip @fact_list[fact_name] = file_content unless file_content.empty? chassis_to_name(@fact_list[fact_name]) if fact_name == :chassis_type end @fact_list[fact_name] end def chassis_to_name(chassis_type) types = ['Other', nil, 'Desktop', 'Low Profile Desktop', 'Pizza Box', 'Mini Tower', 'Tower', 'Portable', 'Laptop', 'Notebook', 'Hand Held', 'Docking Station', 'All in One', 'Sub Notebook', 'Space-Saving', 'Lunch Box', 'Main System Chassis', 'Expansion Chassis', 'SubChassis', 'Bus Expansion Chassis', 'Peripheral Chassis', 'Storage Chassis', 'Rack Mount Chassis', 'Sealed-Case PC', 'Multi-system', 'CompactPCI', 'AdvancedTCA', 'Blade', 'Blade Enclosure', 'Tablet', 'Convertible', 'Detachable'] @fact_list[:chassis_type] = types[chassis_type.to_i - 1] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/dmi_decode.rb000066400000000000000000000026751470204764400244000ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class DmiDecode < BaseResolver init_resolver ADDRESS_TO_VERSION = { 0xe8480 => 'ESXi 2.5', 0xe7c70 => 'ESXi 3.0', 0xe66c0 => 'ESXi 3.5', 0xe7910 => 'ESXi 3.5', 0xea550 => 'ESXi 4.0', 0xea6c0 => 'ESXi 4.0', 0xea2e0 => 'ESXi 4.1', 0xe72c0 => 'ESXi 5.0', 0xea0c0 => 'ESXi 5.1', 0xea050 => 'ESXi 5.5', 0xe99e0 => 'ESXi 6.0', 0xE9A40 => 'ESXi 6.0', 0xea580 => 'ESXi 6.5', 0xEA520 => 'ESXi 6.7', 0xEA490 => 'ESXi 6.7', 0xea5e0 => 'Fusion 8.5' }.freeze class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { run_dmidecode(fact_name) } end def run_dmidecode(fact_name) output = Facter::Core::Execution.execute('dmidecode', logger: log) @fact_list[:virtualbox_version] = output.match(/vboxVer_(\S+)/)&.captures&.first @fact_list[:virtualbox_revision] = output.match(/vboxRev_(\S+)/)&.captures&.first @fact_list[:vmware_version] = extract_vmware_version(output) @fact_list[fact_name] end def extract_vmware_version(output) address_of_version = output.match(/Address:\s(0x[a-zA-Z0-9]*)/)&.captures&.first ADDRESS_TO_VERSION[address_of_version&.hex] end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/ec2.rb000066400000000000000000000044531470204764400227710ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Ec2 < BaseResolver init_resolver EC2_METADATA_ROOT_URL = 'http://169.254.169.254/latest/meta-data/' EC2_USERDATA_ROOT_URL = 'http://169.254.169.254/latest/user-data/' EC2_SESSION_TIMEOUT = 5 class << self private def post_resolve(fact_name, _options) log.debug('Querying Ec2 metadata') @fact_list.fetch(fact_name) { read_facts(fact_name) } end def read_facts(fact_name) @fact_list[:metadata] = {} query_for_metadata(EC2_METADATA_ROOT_URL, @fact_list[:metadata]) @fact_list[:userdata] = get_data_from(EC2_USERDATA_ROOT_URL).strip.force_encoding('UTF-8') @fact_list[fact_name] end def query_for_metadata(url, container) metadata = get_data_from(url) metadata.each_line do |line| next if line.empty? http_path_component = build_path_component(line) next if http_path_component == 'security-credentials/' if http_path_component.end_with?('/') child = {} child[http_path_component] = query_for_metadata("#{url}#{http_path_component}", child) child.reject! { |key, _info| key == http_path_component } name = http_path_component.chomp('/') container[name] = child else container[http_path_component] = get_data_from("#{url}#{http_path_component}").strip end end end def build_path_component(line) array_match = /^(\d+)=.*$/.match(line) array_match ? "#{array_match[1]}/" : line.strip end def get_data_from(url) headers = {} headers['X-aws-ec2-metadata-token'] = v2_token if v2_token Facter::Util::Resolvers::Http.get_request(url, headers, { session: determine_session_timeout }, false) end def determine_session_timeout session_env = ENV['EC2_SESSION_TIMEOUT'] session_env ? session_env.to_i : EC2_SESSION_TIMEOUT end def v2_token @v2_token ||= begin token = Facter::Util::Resolvers::AwsToken.get token == '' ? nil : token end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/eos_release.rb000066400000000000000000000013371470204764400246040ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class EosRelease < BaseResolver # :name # :version # :codename init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_eos_release(fact_name) } end def read_eos_release(fact_name) output = Facter::Util::FileHelper.safe_read('/etc/Eos-release', nil) return @fact_list[fact_name] = nil if output.nil? output_strings = output.split(' ') @fact_list[:name] = output_strings[0] @fact_list[:version] = output_strings[-1] @fact_list[fact_name] end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/facterversion.rb000066400000000000000000000006251470204764400251670ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Facterversion < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_version_file } end def read_version_file @fact_list[:facterversion] = Facter::VERSION end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/filesystems.rb000066400000000000000000000015271470204764400246660ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Linux class Filesystems < BaseResolver # :systems init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_filesystems(fact_name) } end def read_filesystems(fact_name) output = Facter::Util::FileHelper.safe_readlines('/proc/filesystems', nil) return unless output filesystems = [] output.each do |line| tokens = line.split(' ') filesystems << tokens if tokens.size == 1 && tokens.first != 'fuseblk' end @fact_list[:systems] = filesystems.sort.join(',') @fact_list[fact_name] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/fips_enabled.rb000066400000000000000000000011651470204764400247300ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Linux class FipsEnabled < BaseResolver # :fips_enabled init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_fips_file(fact_name) } end def read_fips_file(fact_name) file_output = Facter::Util::FileHelper.safe_read('/proc/sys/crypto/fips_enabled') @fact_list[:fips_enabled] = file_output.strip == '1' @fact_list[fact_name] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/freebsd/000077500000000000000000000000001470204764400233775ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/resolvers/freebsd/dmi.rb000066400000000000000000000023011470204764400244710ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Freebsd class DmiBios < BaseResolver init_resolver class << self # :model private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_facts(fact_name) } end def read_facts(fact_name) require_relative 'ffi/ffi_helper' @fact_list[:bios_date] = Facter::Freebsd::FfiHelper.kenv(:get, 'smbios.bios.reldate') @fact_list[:bios_vendor] = Facter::Freebsd::FfiHelper.kenv(:get, 'smbios.bios.vendor') @fact_list[:bios_version] = Facter::Freebsd::FfiHelper.kenv(:get, 'smbios.bios.version') @fact_list[:product_name] = Facter::Freebsd::FfiHelper.kenv(:get, 'smbios.system.product') @fact_list[:product_serial] = Facter::Freebsd::FfiHelper.kenv(:get, 'smbios.system.serial') @fact_list[:product_uuid] = Facter::Freebsd::FfiHelper.kenv(:get, 'smbios.system.uuid') @fact_list[:sys_vendor] = Facter::Freebsd::FfiHelper.kenv(:get, 'smbios.system.maker') @fact_list[fact_name] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/freebsd/ffi/000077500000000000000000000000001470204764400241435ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/resolvers/freebsd/ffi/ffi_helper.rb000066400000000000000000000027351470204764400266020ustar00rootroot00000000000000# frozen_string_literal: true require 'ffi' module Facter module Freebsd module FfiHelper module Libc extend FFI::Library KENV_GET = 0 KENV_MVALLEN = 128 ffi_lib 'c' attach_function :kenv, %i[int string pointer int], :int attach_function :sysctlbyname, %i[string pointer pointer pointer size_t], :int end def self.kenv(action, name, value = nil) case action when :get len = Libc::KENV_MVALLEN + 1 value = FFI::MemoryPointer.new(:char, len) res = Libc.kenv(Libc::KENV_GET, name, value, len) return nil if res.negative? value.read_string(res).chomp("\0") else raise "Action #{action} not supported" end end def self.sysctl_by_name(type, name) oldp = FFI::Pointer::NULL oldlenp = FFI::MemoryPointer.new(:size_t) newp = FFI::Pointer::NULL newlenp = 0 if type == :string res = Libc.sysctlbyname(name, oldp, oldlenp, newp, newlenp) return nil if res.negative? else oldlenp.write(:size_t, FFI.type_size(type)) end oldp = FFI::MemoryPointer.new(:uint8_t, oldlenp.read(:size_t)) res = Libc.sysctlbyname(name, oldp, oldlenp, newp, newlenp) return nil if res.negative? case type when :string oldp.read_string else oldp.read(type) end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/freebsd/freebsd_version.rb000066400000000000000000000020571470204764400271070ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Freebsd class FreebsdVersion < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { freebsd_version_system_call(fact_name) } end def freebsd_version_system_call(fact_name) output = Facter::Core::Execution.execute('/bin/freebsd-version -k', logger: log) @fact_list[:installed_kernel] = output.strip unless output.empty? output = Facter::Core::Execution.execute('/bin/freebsd-version -ru', logger: log) build_fact_list(output) unless output.empty? @fact_list[fact_name] end def build_fact_list(output) freebsd_version_results = output.split("\n") @fact_list[:running_kernel] = freebsd_version_results[0].strip @fact_list[:installed_userland] = freebsd_version_results[1].strip end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/freebsd/geom.rb000066400000000000000000000056151470204764400246620ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Freebsd class Geom < BaseResolver init_resolver DISKS_ATTRIBUTES = %i[read_model read_serial_number read_size].freeze PARTITIONS_ATTRIBUTES = %i[read_partlabel read_partuuid read_size].freeze class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_facts(fact_name) } end def read_facts(fact_name) require_relative 'ffi/ffi_helper' require 'rexml/document' topology = geom_topology read_data('DISK', topology, DISKS_ATTRIBUTES) read_data('PART', topology, PARTITIONS_ATTRIBUTES) @fact_list[fact_name] end def read_data(fact_name, geom_topology, data_to_read) fact_list_key = fact_name == 'DISK' ? :disks : :partitions @fact_list[fact_list_key] = {} each_geom_class_provider(fact_name, geom_topology) do |provider| name = provider.get_text('./name').value @fact_list[fact_list_key][name] = data_to_read.map do |x| send(x, provider) end.inject(:merge) end end def each_geom_class_provider(geom_class_name, geom_topology, &block) REXML::XPath.each(geom_topology, "/mesh/class[name/text() = '#{geom_class_name}']/geom/provider", &block) end def read_size(provider) res = {} return res unless (mediasize = provider.get_text('mediasize')) mediasize = Integer(mediasize.value) res[:size_bytes] = mediasize res[:size] = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(mediasize) res end def read_model(provider) res = {} return res unless (model = provider.get_text('./config/descr')) res[:model] = model.value res end def read_partlabel(provider) res = {} return res unless (rawuuid = provider.get_text('./config/label')) res[:partlabel] = rawuuid.value res end def read_partuuid(provider) res = {} return res unless (rawuuid = provider.get_text('./config/rawuuid')) res[:partuuid] = rawuuid.value res end def read_serial_number(provider) res = {} return res unless (serial_number = provider.get_text('./config/ident')) res[:serial_number] = serial_number.value res end def geom_topology REXML::Document.new(geom_confxml) end def geom_confxml Facter::Freebsd::FfiHelper.sysctl_by_name(:string, 'kern.geom.confxml') end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/freebsd/processors.rb000066400000000000000000000023741470204764400261340ustar00rootroot00000000000000# frozen_string_literal: true require_relative '../../../facter/resolvers/bsd/processors' module Facter module Resolvers module Freebsd class Processors < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { collect_processors_info(fact_name) } end def collect_processors_info(fact_name) require_relative '../../../facter/resolvers/freebsd/ffi/ffi_helper' count = logical_count model = processors_model speed = processors_speed @fact_list[:logical_count] = count @fact_list[:models] = Array.new(count, model) if logical_count && model @fact_list[:speed] = speed * 1000 * 1000 if speed @fact_list[fact_name] end def processors_model Facter::Freebsd::FfiHelper.sysctl_by_name(:string, 'hw.model') end def logical_count Facter::Freebsd::FfiHelper.sysctl_by_name(:uint32_t, 'hw.ncpu') end def processors_speed Facter::Freebsd::FfiHelper.sysctl_by_name(:uint32_t, 'hw.clockrate') end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/freebsd/swap_memory.rb000066400000000000000000000026101470204764400262650ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Freebsd class SwapMemory < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_swap_memory(fact_name) } end def read_swap_memory(fact_name) output = Facter::Core::Execution.execute('swapinfo -k', logger: log) data = output.split("\n")[1..-1].map { |line| line.split(/\s+/) } unless data.empty? @fact_list[:total_bytes] = kilobytes_to_bytes(data.map { |line| line[1].to_i }.inject(:+)) @fact_list[:used_bytes] = kilobytes_to_bytes(data.map { |line| line[2].to_i }.inject(:+)) @fact_list[:available_bytes] = kilobytes_to_bytes(data.map { |line| line[3].to_i }.inject(:+)) @fact_list[:capacity] = Facter::Util::Resolvers::FilesystemHelper .compute_capacity(@fact_list[:used_bytes], @fact_list[:total_bytes]) @fact_list[:encrypted] = data.map { |line| line[0].end_with?('.eli') }.all? end @fact_list[fact_name] end def kilobytes_to_bytes(quantity) (quantity.to_f * 1024).to_i end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/freebsd/system_memory.rb000066400000000000000000000030601470204764400266370ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Freebsd class SystemMemory < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { calculate_system_memory(fact_name) } end def calculate_system_memory(fact_name) read_total_memory_in_bytes read_used_memory_in_bytes @fact_list[:available_bytes] = @fact_list[:total_bytes] - @fact_list[:used_bytes] @fact_list[:capacity] = Facter::Util::Resolvers::FilesystemHelper .compute_capacity(@fact_list[:used_bytes], @fact_list[:total_bytes]) @fact_list[fact_name] end def pagesize @pagesize ||= Facter::Freebsd::FfiHelper.sysctl_by_name(:long, 'vm.stats.vm.v_page_size') end def read_used_memory_in_bytes require_relative 'ffi/ffi_helper' @fact_list[:used_bytes] = pagesize * ( Facter::Freebsd::FfiHelper.sysctl_by_name(:long, 'vm.stats.vm.v_active_count') + Facter::Freebsd::FfiHelper.sysctl_by_name(:long, 'vm.stats.vm.v_wire_count') ) end def read_total_memory_in_bytes require_relative 'ffi/ffi_helper' @fact_list[:total_bytes] = pagesize * Facter::Freebsd::FfiHelper.sysctl_by_name(:long, 'vm.stats.vm.v_page_count') end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/freebsd/virtual.rb000066400000000000000000000021001470204764400254030ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Freebsd class Virtual < BaseResolver init_resolver class << self # :model VM_GUEST_SYSCTL_NAMES = { 'hv' => 'hyperv', 'microsoft' => 'hyperv', 'oracle' => 'virtualbox', 'xen' => 'xenu', 'none' => nil }.freeze private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_facts(fact_name) } end def read_facts(fact_name) require_relative 'ffi/ffi_helper' if Facter::Freebsd::FfiHelper.sysctl_by_name(:long, 'security.jail.jailed').zero? vm = Facter::Freebsd::FfiHelper.sysctl_by_name(:string, 'kern.vm_guest') vm = VM_GUEST_SYSCTL_NAMES[vm] if VM_GUEST_SYSCTL_NAMES.key?(vm) @fact_list[:vm] = vm else @fact_list[:vm] = 'jail' end @fact_list[fact_name] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/gce.rb000066400000000000000000000040471470204764400230550ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Gce < BaseResolver init_resolver METADATA_URL = 'http://metadata.google.internal/computeMetadata/v1/?recursive=true&alt=json' HEADERS = { "Metadata-Flavor": 'Google', "Accept": 'application/json' }.freeze class << self private def post_resolve(fact_name, _options) log.debug('reading Gce metadata') @fact_list.fetch(fact_name) { read_facts(fact_name) } end def read_facts(fact_name) @fact_list[:metadata] = query_for_metadata @fact_list[fact_name] end def query_for_metadata gce_data = extract_to_hash(Facter::Util::Resolvers::Http.get_request(METADATA_URL, HEADERS, {}, false)) parse_instance(gce_data) gce_data.empty? ? nil : gce_data end def extract_to_hash(metadata) JSON.parse(metadata) rescue JSON::ParserError => e log.debug("Trying to parse result but got: #{e.message}") {} end def parse_instance(gce_data) instance_data = gce_data['instance'] return if instance_data.nil? || instance_data.empty? # See https://cloud.google.com/compute/docs/metadata for information about these values %w[sshKeys ssh-keys].each do |name| keys = gce_data.dig('project', 'attributes', name) gce_data['project']['attributes'][name] = keys.strip.split("\n") if keys keys = instance_data.dig('attributes', name) instance_data['attributes'][name] = keys.strip.split("\n") if keys end %w[image machineType zone].each do |key| instance_data[key] = instance_data[key].split('/').last if instance_data[key] end network = instance_data.dig('networkInterfaces', 0, 'network') instance_data['networkInterfaces'][0]['network'] = network.split('/').last unless network.nil? gce_data['instance'] = instance_data end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/hostname.rb000066400000000000000000000056461470204764400241430ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Hostname < BaseResolver # :fqdn # :domain # :hostname init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { retrieve_info(fact_name) } end def retrieve_info(fact_name) require 'socket' output = Socket.gethostname unless output log.debug('Socket.gethostname failed to return hostname') return end hostname, domain = retrieve_from_fqdn(output) fqdn = retrieve_with_addrinfo(hostname) if hostname_and_no_domain?(hostname, domain) _, domain = retrieve_from_fqdn(fqdn) if exists_and_valid_fqdn?(fqdn, hostname) domain = read_domain unless exists_and_not_empty?(domain) construct_fact_list(hostname, domain, fqdn) @fact_list[fact_name] end def retrieve_from_fqdn(output) if output =~ /(.*?)\.(.+$)/ log.debug("Managed to read hostname: #{Regexp.last_match(1)} and domain: #{Regexp.last_match(2)}") [Regexp.last_match(1), Regexp.last_match(2)] else log.debug("Only managed to read hostname: #{output}, no domain was found.") [output, ''] end end def retrieve_with_addrinfo(host) begin name = Socket.getaddrinfo(host, 0, Socket::AF_UNSPEC, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME)[0] rescue StandardError => e @log.debug("Socket.getaddrinfo failed to retrieve fqdn for hostname #{host} with: #{e}") return end return if name.nil? || name.empty? || host == name[2] || name[2] == name[3] name[2] end def exists_and_valid_fqdn?(fqdn, hostname) exists_and_not_empty?(fqdn) && fqdn.start_with?("#{hostname}.") end def hostname_and_no_domain?(hostname, domain) domain.empty? && !hostname.empty? end def read_domain file_content = Facter::Util::FileHelper.safe_read('/etc/resolv.conf') if file_content =~ /^domain\s+([^.]\S+)/ Regexp.last_match(1) elsif file_content =~ /^search\s+([^.]\S+)/ Regexp.last_match(1) end end def construct_fqdn(host, domain, fqdn) return fqdn if exists_and_not_empty?(fqdn) return if host.nil? || host.empty? exists_and_not_empty?(domain) ? "#{host}.#{domain}" : host end def construct_fact_list(hostname, domain, fqdn) @fact_list[:hostname] = hostname @fact_list[:domain] = domain @fact_list[:fqdn] = construct_fqdn(@fact_list[:hostname], @fact_list[:domain], fqdn) end def exists_and_not_empty?(variable) variable && !variable.empty? end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/identity.rb000066400000000000000000000013201470204764400241370ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class PosxIdentity < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { retrieve_identity(fact_name) } end def retrieve_identity(fact_name) require 'etc' login_info = Etc.getpwuid @fact_list[:gid] = login_info.gid @fact_list[:group] = Etc.getgrgid(login_info.gid).name @fact_list[:privileged] = login_info.uid.zero? @fact_list[:uid] = login_info.uid @fact_list[:user] = login_info.name @fact_list[fact_name] end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/linux/000077500000000000000000000000001470204764400231245ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/resolvers/linux/docker_uptime.rb000066400000000000000000000024751470204764400263130ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Linux class DockerUptime < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { detect_uptime(fact_name) } end def detect_uptime(fact_name) days, hours, minutes, seconds = extract_uptime_from_docker total_seconds = convert_to_seconds(days, hours, minutes, seconds) @fact_list = Facter::Util::Resolvers::UptimeHelper.create_uptime_hash(total_seconds) @fact_list[fact_name] end def extract_uptime_from_docker # time format [dd-][hh:]mm:ss time = Facter::Core::Execution.execute('ps -o etime= -p "1"', logger: log) extracted_time = time.split(/[-:]/) reversed_time = extracted_time.reverse seconds = reversed_time[0].to_i minutes = reversed_time[1].to_i hours = reversed_time[2].to_i days = reversed_time[3].to_i [days, hours, minutes, seconds] end def convert_to_seconds(days, hours, minutes, seconds) days * 24 * 3600 + hours * 3600 + minutes * 60 + seconds end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/linux/hostname.rb000066400000000000000000000077621470204764400253030ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Linux class Hostname < BaseResolver # :fqdn # :domain # :hostname init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { retrieve_info(fact_name) } end def retrieve_info(fact_name) require 'socket' output = retrieving_hostname return nil unless output # Check if the gethostname method retrieved fqdn hostname, domain = parse_fqdn(output) fqdn = retrieve_fqdn_for_host(hostname) if hostname_and_no_domain?(hostname, domain) _, domain = parse_fqdn(fqdn) if exists_and_valid_fqdn?(fqdn, hostname) domain = read_domain unless exists_and_not_empty?(domain) construct_fact_list(hostname, domain, fqdn) @fact_list[fact_name] end def retrieving_hostname output = Socket.gethostname || '' if output.empty? || output['0.0.0.0'] begin require_relative '../../../facter/util/resolvers/ffi/hostname' output = Facter::Util::Resolvers::Ffi::Hostname.getffihostname rescue LoadError => e log.debug(e.message) output = nil end end log.debug("Tried to retrieve hostname and got: #{output}") output unless output&.empty? end def parse_fqdn(output) if output =~ /(.*?)\.(.+$)/ log.debug("Managed to read hostname: #{Regexp.last_match(1)} and domain: #{Regexp.last_match(2)}") [Regexp.last_match(1), Regexp.last_match(2)] else log.debug("Only managed to read hostname: #{output}, no domain was found.") [output, ''] end end def retrieve_fqdn_for_host(host) begin name = Socket.getaddrinfo(host, 0, Socket::AF_UNSPEC, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME)[0] rescue StandardError => e log.debug("Socket.getaddrinfo failed to retrieve fqdn for hostname #{host} with: #{e}") end return name[2] if !name.nil? && !name.empty? && host != name[2] && name[2] != name[3] retrieve_fqdn_for_host_with_ffi(host) end def retrieve_fqdn_for_host_with_ffi(host) require_relative '../../../facter/util/resolvers/ffi/hostname' fqdn = Facter::Util::Resolvers::Ffi::Hostname.getffiaddrinfo(host) log.debug("FFI getaddrinfo was called and it retrieved: #{fqdn}") fqdn rescue LoadError => e log.debug(e.message) nil end def exists_and_valid_fqdn?(fqdn, hostname) exists_and_not_empty?(fqdn) && fqdn.start_with?("#{hostname}.") end def hostname_and_no_domain?(hostname, domain) domain.empty? && !hostname.empty? end def read_domain file_content = Facter::Util::FileHelper.safe_read('/etc/resolv.conf') if file_content =~ /^domain\s+([^.]\S+)/ Regexp.last_match(1) elsif file_content =~ /^search\s+([^.]\S+)/ Regexp.last_match(1) end end def construct_fqdn(host, domain, fqdn) return fqdn if exists_and_not_empty?(fqdn) return if host.nil? || host.empty? exists_and_not_empty?(domain) ? "#{host}.#{domain}" : host end def construct_fact_list(hostname, domain, fqdn) @fact_list[:hostname] = hostname @fact_list[:domain] = domain @fact_list[:fqdn] = construct_fqdn(@fact_list[:hostname], @fact_list[:domain], fqdn) end def exists_and_not_empty?(variable) variable && !variable.empty? end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/linux/load_averages.rb000066400000000000000000000012111470204764400262400ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Linux class LoadAverages < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_load_averages_file(fact_name) } end def read_load_averages_file(fact_name) output = Facter::Util::FileHelper.safe_read('/proc/loadavg') @fact_list[:load_averages] = {}.tap { |h| h['1m'], h['5m'], h['15m'], = output.split.map(&:to_f) } @fact_list[fact_name] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/linux/networking.rb000066400000000000000000000140371470204764400256450ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Linux class Networking < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { retrieve_network_info(fact_name) } @fact_list[fact_name] end def retrieve_network_info(fact_name) add_info_from_socket_reader add_info_from_routing_table retrieve_primary_interface Facter::Util::Resolvers::Networking.expand_main_bindings(@fact_list) add_flags @fact_list[fact_name] end def add_info_from_socket_reader @fact_list[:interfaces] = Facter::Util::Linux::SocketParser.retrieve_interfaces(log) mtu_and_indexes = interfaces_mtu_and_index @fact_list[:interfaces].each_pair do |interface_name, iface| mtu(interface_name, mtu_and_indexes, iface) dhcp(interface_name, mtu_and_indexes, iface) operstate(interface_name, iface) physical(interface_name, iface) linkspeed(interface_name, iface) duplex(interface_name, iface) @log.debug("Found interface #{interface_name} with #{@fact_list[:interfaces][interface_name]}") end end def interfaces_mtu_and_index mtu_and_indexes = {} output = Facter::Core::Execution.execute('ip link show', logger: log) output.each_line do |line| next unless line.include?('mtu') parse_ip_command_line(line, mtu_and_indexes) end mtu_and_indexes end def operstate(interface_name, iface) state = Facter::Util::FileHelper.safe_read("/sys/class/net/#{interface_name}/operstate", nil) iface[:operational_state] = state.strip if state end def physical(ifname, iface) iface[:physical] = if File.exist?("/sys/class/net/#{ifname}/device") true else false end end def duplex(interface_name, iface) return unless iface[:physical] # not all interfaces support this, wifi for example causes an EINVAL (Invalid argument) begin plex = Facter::Util::FileHelper.safe_read("/sys/class/net/#{interface_name}/duplex", nil) iface[:duplex] = plex.strip if plex rescue StandardError => e @log.debug("Failed to read '/sys/class/net/#{interface_name}/duplex': #{e.message}") end end def linkspeed(interface_name, iface) return unless iface[:physical] # not all interfaces support this, wifi for example causes an EINVAL (Invalid argument) begin speed = Facter::Util::FileHelper.safe_read("/sys/class/net/#{interface_name}/speed", nil) iface[:speed] = speed.strip.to_i if speed rescue StandardError => e @log.debug("Failed to read '/sys/class/net/#{interface_name}/speed': #{e.message}") end end def parse_ip_command_line(line, mtu_and_indexes) mtu = line.match(/mtu (\d+)/)&.captures&.first&.to_i index_tokens = line.split(':') index = index_tokens[0].strip # vlans are displayed as @ name = index_tokens[1].split('@').first.strip mtu_and_indexes[name] = { index: index, mtu: mtu } end def mtu(interface_name, mtu_and_indexes, iface) mtu = mtu_and_indexes.dig(interface_name, :mtu) iface[:mtu] = mtu unless mtu.nil? end def dhcp(interface_name, mtu_and_indexes, iface) dhcp = Facter::Util::Linux::Dhcp.dhcp(interface_name, mtu_and_indexes.dig(interface_name, :index), log) iface[:dhcp] = dhcp unless dhcp.nil? end def add_info_from_routing_table routes4, routes6 = Facter::Util::Linux::RoutingTable.read_routing_table(log) compare_ips(routes4, :bindings) compare_ips(routes6, :bindings6) end def add_flags flags = Facter::Util::Linux::IfInet6.read_flags flags.each_pair do |iface, ips| next unless @fact_list[:interfaces].key?(iface) ips.each_pair do |ip, ip_flags| next unless @fact_list[:interfaces][iface].key?(:bindings6) @fact_list[:interfaces][iface][:bindings6].each do |binding| next unless binding[:address] == ip binding[:flags] = ip_flags end end end end def compare_ips(routes, binding_key) routes.each do |route| next unless @fact_list[:interfaces].key?(route[:interface]) interface_data = @fact_list[:interfaces][route[:interface]] add_binding_if_missing(interface_data, binding_key, route) end end def add_binding_if_missing(interface_data, binding_key, route) interface_binding = interface_data[binding_key] if interface_binding.nil? interface_data[binding_key] = [{ address: route[:ip] }] elsif interface_binding.none? { |binding| binding[:address] == route[:ip] } interface_binding << { address: route[:ip] } end end def retrieve_primary_interface primary_helper = Facter::Util::Resolvers::Networking::PrimaryInterface primary_interface = primary_helper.read_from_proc_route primary_interface ||= primary_helper.read_from_ip_route primary_interface ||= primary_helper.find_in_interfaces(@fact_list[:interfaces]) @fact_list[:primary_interface] = primary_interface end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/load_averages.rb000066400000000000000000000012351470204764400251070ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class LoadAverages < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_load_averages(fact_name) } end def read_load_averages(fact_name) require_relative '../../facter/util/resolvers/ffi/load_averages' log.debug('loading cpu load averages') @fact_list[:load_averages] = %w[1m 5m 15m].zip(Facter::Util::Resolvers::Ffi::LoadAverages .read_load_averages).to_h @fact_list[fact_name] end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/lpar.rb000066400000000000000000000015061470204764400232520ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Lpar < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_lpar(fact_name) } end def read_lpar(fact_name) output = Facter::Core::Execution.execute('/usr/bin/lparstat -i', logger: log) output.each_line do |line| populate_lpar_data(line.split(':').map(&:strip)) end @fact_list[fact_name] end def populate_lpar_data(key_value) @fact_list[:lpar_partition_name] = key_value[1] if key_value[0] == 'Partition Name' @fact_list[:lpar_partition_number] = key_value[1].to_i if key_value[0] == 'Partition Number' end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/lsb_release.rb000066400000000000000000000022751470204764400246000ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class LsbRelease < BaseResolver # :lsb_version # :distributor_id # :description # :release # :codename init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { retrieve_facts(fact_name) } end def retrieve_facts(fact_name) lsb_release_installed? if @fact_list[:lsb_release_installed].nil? read_lsb_release_file if @fact_list[:lsb_release_installed] @fact_list[fact_name] end def lsb_release_installed? @fact_list[:lsb_release_installed] = !Facter::Core::Execution.which('lsb_release').nil? end def read_lsb_release_file output = Facter::Core::Execution.execute('lsb_release -a', logger: log) build_fact_list(output) end def build_fact_list(info) release_info = info.delete("\t").split("\n").map { |e| e.split(':', 2) } result = Hash[*release_info.flatten] result.each { |k, v| @fact_list[k.downcase.gsub(/\s/, '_').to_sym] = v } end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/lspci.rb000066400000000000000000000020411470204764400234210ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Lspci < BaseResolver init_resolver REGEX_VALUES = { 'VirtualBox' => 'virtualbox', 'XenSource' => 'xenhvm', 'Microsoft Corporation Hyper-V' => 'hyperv', 'Class 8007: Google, Inc' => 'gce', 'VM[wW]are' => 'vmware', '1ab8:' => 'parallels', '[Pp]arallels' => 'parallels', '(?i)(virtio)' => 'kvm' }.freeze class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { lspci_command(fact_name) } end def lspci_command(fact_name) output = Facter::Core::Execution.execute('lspci', logger: log) return if output.empty? @fact_list[:vm] = retrieve_vm(output) @fact_list[fact_name] end def retrieve_vm(output) output.each_line { |line| REGEX_VALUES.each { |key, value| return value if /#{key}/.match?(line) } } nil end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/macosx/000077500000000000000000000000001470204764400232575ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/resolvers/macosx/dmi.rb000066400000000000000000000011151470204764400243530ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Macosx class DmiBios < BaseResolver init_resolver class << self # :model private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_facts } end def read_facts # OSX only supports the product name output = Facter::Core::Execution.execute('sysctl -n hw.model', logger: log) @fact_list[:macosx_model] = output&.strip end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/macosx/filesystems.rb000066400000000000000000000012671470204764400261610ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Macosx class Filesystems < BaseResolver # :macosx_filesystems init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_filesystems(fact_name) } end def read_filesystems(fact_name) output = Facter::Core::Execution.execute('mount', logger: log) filesystems = output.scan(/\(([a-z]+),*/).flatten @fact_list[:macosx_filesystems] = filesystems.uniq.sort.join(',') @fact_list[fact_name] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/macosx/load_averages.rb000066400000000000000000000012361470204764400264020ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Macosx class LoadAverages < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_load_averages_file(fact_name) } end def read_load_averages_file(fact_name) output = Facter::Core::Execution.execute('sysctl -n vm.loadavg', logger: log) @fact_list[:load_averages] = {}.tap { |h| _, h['1m'], h['5m'], h['15m'], = output.split.map(&:to_f) } @fact_list[fact_name] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/macosx/mountpoints.rb000066400000000000000000000047661470204764400262200ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Macosx class Mountpoints < BaseResolver include Facter::Util::Resolvers::FilesystemHelper init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_mounts } end def read_mounts mounts = {} begin Facter::Util::Resolvers::FilesystemHelper.read_mountpoints.each do |fs| device = fs.name filesystem = fs.mount_type path = fs.mount_point options = read_options(fs.options) mounts[path] = read_stats(path).tap do |hash| hash[:device] = device hash[:filesystem] = filesystem hash[:options] = options if options.any? end end rescue LoadError => e @log.debug("Could not read mounts: #{e}") end @fact_list[:mountpoints] = mounts end def read_stats(path) begin stats = Facter::Util::Resolvers::FilesystemHelper.read_mountpoint_stats(path) size_bytes = stats.bytes_total available_bytes = stats.bytes_available used_bytes = size_bytes - available_bytes rescue Sys::Filesystem::Error, LoadError size_bytes = used_bytes = available_bytes = 0 end { size_bytes: size_bytes, used_bytes: used_bytes, available_bytes: available_bytes, capacity: Facter::Util::Resolvers::FilesystemHelper.compute_capacity(used_bytes, size_bytes), size: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(size_bytes), available: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(available_bytes), used: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(used_bytes) } end def read_options(options) options_map = { 'read-only' => 'readonly', 'asynchronous' => 'async', 'synchronous' => 'noasync', 'quotas' => 'quota', 'rootfs' => 'root', 'defwrite' => 'deferwrites' } options.split(',').map(&:strip).map { |o| options_map.key?(o) ? options_map[o] : o } end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/macosx/processors.rb000066400000000000000000000044101470204764400260050ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Macosx class Processors < BaseResolver init_resolver ITEMS = { logical_count: 'hw.logicalcpu_max', physical_count: 'hw.physicalcpu_max', brand: 'machdep.cpu.brand_string', speed: 'hw.cpufrequency_max', cores_per_socket: 'machdep.cpu.core_count', threads_per_core: 'machdep.cpu.thread_count' }.freeze class << self # :logicalcount # :models # :physicalcount # :speed # :cores_per_socket # :threads_per_core private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_processor_data(fact_name) } end def read_processor_data(fact_name) output = Facter::Core::Execution.execute("sysctl #{ITEMS.values.join(' ')}", logger: log) processors_hash = Hash[*output.split("\n").collect { |v| [v.split(': ')[0], v.split(': ')[1]] }.flatten] build_fact_list(processors_hash) @fact_list[fact_name] end def build_fact_list(hash) build_logical_count(hash) build_physical_count(hash) build_models(hash) build_speed(hash) build_cores_per_socket(hash) build_threads_per_core(hash) end def build_logical_count(hash) @fact_list[:logicalcount] = hash[ITEMS[:logical_count]].to_i end def build_physical_count(hash) @fact_list[:physicalcount] = hash[ITEMS[:physical_count]].to_i end def build_models(hash) @fact_list[:models] = Array.new(@fact_list[:logicalcount].to_i, hash[ITEMS[:brand]]) end def build_speed(hash) @fact_list[:speed] = hash[ITEMS[:speed]].to_i end def build_cores_per_socket(hash) @fact_list[:cores_per_socket] = hash[ITEMS[:cores_per_socket]].to_i end def build_threads_per_core(hash) @fact_list[:threads_per_core] = hash[ITEMS[:threads_per_core]].to_i / hash[ITEMS[:cores_per_socket]].to_i end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/macosx/swap_memory.rb000066400000000000000000000024511470204764400261500ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Macosx class SwapMemory < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_swap_memory(fact_name) } end def read_swap_memory(fact_name) output = Facter::Core::Execution.execute('sysctl -n vm.swapusage', logger: log) data = output.match(/^total = ([\d.]+)M used = ([\d.]+)M free = ([\d.]+)M (\(encrypted\))$/) if data[1].to_f.positive? @fact_list[:total_bytes] = megabytes_to_bytes(data[1]) @fact_list[:used_bytes] = megabytes_to_bytes(data[2]) @fact_list[:available_bytes] = megabytes_to_bytes(data[3]) @fact_list[:capacity] = compute_capacity(@fact_list[:used_bytes], @fact_list[:total_bytes]) @fact_list[:encrypted] = data[4] == '(encrypted)' end @fact_list[fact_name] end def megabytes_to_bytes(quantity) (quantity.to_f * 1_048_576).to_i end def compute_capacity(used, total) "#{format('%.2f', value: (used / total.to_f * 100))}%" end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/macosx/system_memory.rb000066400000000000000000000025631470204764400265260ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Macosx class SystemMemory < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { calculate_system_memory(fact_name) } end def calculate_system_memory(fact_name) read_total_memory_in_bytes read_available_memory_in_bytes @fact_list[:used_bytes] = @fact_list[:total_bytes] - @fact_list[:available_bytes] @fact_list[:capacity] = compute_capacity(@fact_list[:used_bytes], @fact_list[:total_bytes]) @fact_list[fact_name] end def read_available_memory_in_bytes output = Facter::Core::Execution.execute('vm_stat', logger: log) page_size = output.match(/page size of (\d+) bytes/)[1].to_i pages_free = output.match(/Pages free:\s+(\d+)/)[1].to_i @fact_list[:available_bytes] = page_size * pages_free end def read_total_memory_in_bytes @fact_list[:total_bytes] = Facter::Core::Execution.execute('sysctl -n hw.memsize', logger: log).to_i end def compute_capacity(used, total) "#{format('%.2f', value: (used / total.to_f * 100))}%" end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/macosx/system_profiler.rb000066400000000000000000000033521470204764400270350ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Macosx class SystemProfiler < BaseResolver SP_HARDWARE_DATA_TYPE = %i[model_name model_identifier processor_speed number_of_processors processor_name total_number_of_cores l2_cache_per_core l3_cache memory boot_rom_version smc_version_system serial_number_system hardware_uuid hyper-threading_technology activation_lock_status].freeze SP_SOFTWARE_DATA_TYPE = %i[system_version kernel_version boot_volume boot_mode computer_name user_name secure_virtual_memory system_integrity_protection time_since_boot].freeze SP_ETHERNET_DATA_TYPE = %i[type bus vendor_id device_id subsystem_vendor_id subsystem_id revision_id bsd_name kext_name location version].freeze init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { retrieve_system_profiler(fact_name) } end def retrieve_system_profiler(fact_name) case fact_name when *SP_HARDWARE_DATA_TYPE @fact_list.merge!(Facter::Util::Macosx::SystemProfileExecutor.execute('SPHardwareDataType')) when *SP_SOFTWARE_DATA_TYPE @fact_list.merge!(Facter::Util::Macosx::SystemProfileExecutor.execute('SPSoftwareDataType')) when *SP_ETHERNET_DATA_TYPE @fact_list.merge!(Facter::Util::Macosx::SystemProfileExecutor.execute('SPEthernetDataType')) end @fact_list[fact_name] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/memory.rb000066400000000000000000000044451470204764400236310ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Linux class Memory < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_meminfo_file(fact_name) } end def read_meminfo_file(fact_name) meminfo_output = Facter::Util::FileHelper.safe_read('/proc/meminfo', nil) return unless meminfo_output read_system(meminfo_output) read_swap(meminfo_output) @fact_list[fact_name] end def read_system(output) @fact_list[:total] = kilobytes_to_bytes(output.match(/MemTotal:\s+(\d+)\s/)[1]) @fact_list[:memfree] = memfree(output) @fact_list[:used_bytes] = compute_used(@fact_list[:total], @fact_list[:memfree]) @fact_list[:capacity] = compute_capacity(@fact_list[:used_bytes], @fact_list[:total]) end def memfree(output) available = output.match(/MemAvailable:\s+(\d+)\s/) return kilobytes_to_bytes(available[1]) if available buffers = kilobytes_to_bytes(output.match(/Buffers:\s+(\d+)\s/)[1]) cached = kilobytes_to_bytes(output.match(/Cached:\s+(\d+)\s/)[1]) memfree = kilobytes_to_bytes(output.match(/MemFree:\s+(\d+)\s/)[1]) memfree + buffers + cached end def read_swap(output) total = output.match(/SwapTotal:\s+(\d+)\s/)[1] return if total.to_i.zero? @fact_list[:swap_total] = kilobytes_to_bytes(total) @fact_list[:swap_free] = kilobytes_to_bytes(output.match(/SwapFree:\s+(\d+)\s/)[1]) @fact_list[:swap_used_bytes] = compute_used(@fact_list[:swap_total], @fact_list[:swap_free]) @fact_list[:swap_capacity] = compute_capacity(@fact_list[:swap_used_bytes], @fact_list[:swap_total]) end def kilobytes_to_bytes(quantity) quantity.to_i * 1024 end def compute_capacity(used, total) "#{format('%.2f', computed_capacity: (used / total.to_f * 100))}%" end def compute_used(total, free) total - free end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/mountpoints.rb000066400000000000000000000071061470204764400247150ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Mountpoints < BaseResolver include Facter::Util::Resolvers::FilesystemHelper init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_mounts(fact_name) } end def root_device cmdline = Facter::Util::FileHelper.safe_read('/proc/cmdline') match = cmdline.match(/root=([^\s]+)/) root = match&.captures&.first if !root.nil? && root.include?('=') # We are dealing with the PARTUUID of the partition. Need to extract partition path. root_partition_path = convert_partuuid_to_path(root) root = root_partition_path unless root_partition_path.nil? end root end def convert_partuuid_to_path(root) blkid_content = Facter::Core::Execution.execute('blkid', logger: log) partuuid = root.split('=').last match = blkid_content.match(/(.+)#{partuuid}/) match&.captures&.first&.split(':')&.first end def compute_device(device) # If the "root" device, lookup the actual device from the kernel options # This is done because not all systems symlink /dev/root device = root_device if device == '/dev/root' device end def read_mounts(fact_name) mounts = [] begin Facter::Util::Resolvers::FilesystemHelper.read_mountpoints.each do |file_system| mount = {} get_mount_data(file_system, mount) if mount[:path] =~ %r{^/(proc|sys)} && mount[:filesystem] != 'tmpfs' || mount[:filesystem] == 'autofs' next end get_mount_sizes(mount) mounts << mount end rescue LoadError => e @log.debug("Could not read mounts: #{e}") end @fact_list[:mountpoints] = mounts @fact_list[fact_name] end def get_mount_data(file_system, mount) mount[:device] = compute_device(file_system.name) mount[:filesystem] = file_system.mount_type mount[:path] = file_system.mount_point mount[:options] = file_system.options.split(',').map(&:strip) end def get_mount_sizes(mount) begin stats = Facter::Util::Resolvers::FilesystemHelper.read_mountpoint_stats(mount[:path]) get_bytes_data(mount, stats) rescue LoadError, Sys::Filesystem::Error => e @log.debug("Could not get stats for mountpoint #{mount[:path]}, got #{e}") mount[:size_bytes] = mount[:available_bytes] = mount[:used_bytes] = 0 end populate_mount(mount) end def get_bytes_data(mount, stats) mount[:size_bytes] = stats.bytes_total.abs mount[:available_bytes] = stats.bytes_available.abs mount[:used_bytes] = stats.bytes_used.abs end def populate_mount(mount) total_bytes = mount[:used_bytes] + mount[:available_bytes] mount[:capacity] = Facter::Util::Resolvers::FilesystemHelper.compute_capacity(mount[:used_bytes], total_bytes) mount[:size] = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(mount[:size_bytes]) mount[:available] = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(mount[:available_bytes]) mount[:used] = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(mount[:used_bytes]) end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/networking.rb000066400000000000000000000101071470204764400245000ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Networking < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_facts(fact_name) } end def read_facts(fact_name) interfaces_data primary_interface Facter::Util::Resolvers::Networking.expand_main_bindings(@fact_list) @fact_list[fact_name] end def primary_interface primary_helper = Facter::Util::Resolvers::Networking::PrimaryInterface primary_interface ||= primary_helper.read_from_route primary_interface ||= primary_helper.find_in_interfaces(@fact_list[:interfaces]) @fact_list[:primary_interface] = primary_interface end def interfaces_data command_response = Facter::Core::Execution.execute('ifconfig -a', logger: log) clean_up_interfaces_response(command_response) parse_interfaces_response(command_response) end def clean_up_interfaces_response(response) # convert ip ranges into single ip. eg. 10.16.132.213 --> 10.16.132.213 is converted to 10.16.132.213 # convert ip6 ranges into single ip. eg. 2001:db8:cafe::132:213 --> # 2001:db8:cafe::132:213 is converted to 2001:db8:cafe::132:213 response.gsub!(/([\da-fA-F]+([.:]+[\da-fA-F]+)*)\s+-->\s+[\da-fA-F]+([.:]+[\da-fA-F]+)*/, '\\1') end def parse_interfaces_response(response) parsed_interfaces_data = {} interfaces_data = Hash[*response.split(/^([A-Za-z0-9_.]+): /)[1..-1]] interfaces_data.each do |interface_name, raw_data| parsed_interface_data = {} extract_mtu(raw_data, parsed_interface_data) extract_mac(raw_data, parsed_interface_data) extract_dhcp(interface_name, raw_data, parsed_interface_data) extract_ip_data(raw_data, parsed_interface_data) parsed_interfaces_data[interface_name] = parsed_interface_data end @fact_list[:interfaces] = parsed_interfaces_data unless parsed_interfaces_data.empty? end def extract_mtu(raw_data, parsed_interface_data) mtu = raw_data.match(/mtu\s+(\d+)/)&.captures&.first&.to_i parsed_interface_data[:mtu] = mtu unless mtu.nil? end def extract_mac(raw_data, parsed_interface_data) mac = raw_data.match(/(?:ether|lladdr)\s+((?:\w?\w:){5}\w?\w)|(?:infiniband)\s+((?:\w?\w:){19}\w?\w)/) &.captures&.compact&.first parsed_interface_data[:mac] = mac unless mac.nil? end def extract_dhcp(interface_name, raw_data, parsed_interface_data) return unless /status:\s+active/.match?(raw_data) result = Facter::Core::Execution.execute("ipconfig getoption #{interface_name} " \ 'server_identifier', logger: log) parsed_interface_data[:dhcp] = result.match(/^[\d.a-f:\s]+$/)&.to_s&.strip unless result.empty? end def extract_ip_data(raw_data, parsed_interface_data) ip = extract_values(raw_data, /inet (\S+)/) mask = extract_values(raw_data, /netmask (\S+)/).map { |val| val.hex.to_s(2).count('1') } ip6 = extract_values(raw_data, /inet6 (\S+)/).map { |val| val.gsub(/%.+/, '') } mask6 = extract_values(raw_data, /prefixlen (\S+)/) parsed_interface_data[:bindings] = create_bindings(ip, mask) unless ip.empty? parsed_interface_data[:bindings6] = create_bindings(ip6, mask6) unless ip6.empty? end def extract_values(data, regex) results = [] data.scan(regex).flatten.each do |val| results << val end results end def create_bindings(ips, masks) bindings = [] ips.zip(masks).each do |ip, mask| bindings << Facter::Util::Resolvers::Networking.build_binding(ip, mask) end bindings end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/open_vz.rb000066400000000000000000000020541470204764400237730ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class OpenVz < BaseResolver # build init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { check_proc_vz(fact_name) } end def check_proc_vz(fact_name) return if !Dir.exist?('/proc/vz') || File.file?('/proc/lve/list') || Dir.entries('/proc/vz').count.equal?(2) @fact_list[:vm] = read_proc_status @fact_list[fact_name] end def read_proc_status proc_status_content = Facter::Util::FileHelper.safe_readlines('/proc/self/status', nil) return unless proc_status_content proc_status_content.each do |line| parts = line.split("\s") next unless parts.size.equal?(2) next unless /^envID:/.match?(parts[0]) @fact_list[:id] = parts[1] return 'openvzhn' if parts[1] == '0' return 'openvzve' end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/openbsd/000077500000000000000000000000001470204764400234175ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/resolvers/openbsd/dhcp.rb000066400000000000000000000011561470204764400246650ustar00rootroot00000000000000# frozen_string_literal: true require_relative '../networking' module Facter module Resolvers module Openbsd class Dhcp < Facter::Resolvers::Networking init_resolver class << self def extract_dhcp(interface_name, raw_data, parsed_interface_data) return unless raw_data.match?(/status:\s+active/) result = Facter::Core::Execution.execute("dhcpleasectl -l #{interface_name}", logger: log) parsed_interface_data[:dhcp] = extract_values(result, /\sdhcp server (\S+)/).first unless result.empty? end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/openbsd/dmi.rb000066400000000000000000000023441470204764400245200ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Openbsd class DmiBios < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_facts(fact_name) } end CTL_HW = 6 HW_VENDOR = 14 HW_PRODUCT = 15 HW_VERSION = 16 HW_SERIALNO = 17 HW_UUID = 18 def read_facts(fact_name) require 'facter/resolvers/bsd/ffi/ffi_helper' @fact_list[:bios_vendor] = Facter::Bsd::FfiHelper.sysctl(:string, [CTL_HW, HW_VENDOR]) @fact_list[:bios_version] = Facter::Bsd::FfiHelper.sysctl(:string, [CTL_HW, HW_VERSION]) @fact_list[:product_name] = Facter::Bsd::FfiHelper.sysctl(:string, [CTL_HW, HW_PRODUCT]) @fact_list[:product_serial] = Facter::Bsd::FfiHelper.sysctl(:string, [CTL_HW, HW_SERIALNO]) @fact_list[:product_uuid] = Facter::Bsd::FfiHelper.sysctl(:string, [CTL_HW, HW_UUID]) @fact_list[:sys_vendor] = Facter::Bsd::FfiHelper.sysctl(:string, [CTL_HW, HW_VENDOR]) @fact_list[fact_name] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/openbsd/mountpoints.rb000066400000000000000000000046011470204764400263440ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Openbsd class Mountpoints < BaseResolver init_resolver BLOCK_SIZE = 512 class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_mount(fact_name) } end def read_mount(fact_name) @fact_list[:mountpoints] = {} output = Facter::Core::Execution.execute('mount', logger: log) output.split("\n").map do |line| add_mount_points_fact(line) end retrieve_sizes_for_mounts @fact_list[fact_name] end def add_mount_points_fact(line) elem = line.split("\s") options = elem.drop(5) options.each { |option| option.tr!('(),', '') } @fact_list[:mountpoints][elem[2]] = { device: elem[0], filesystem: elem[4], options: options } end def retrieve_sizes_for_mounts output = Facter::Core::Execution.execute('df -P', logger: log) output.split("\n").drop(1).map do |line| next if line.match?(/-\s+-\s+-/) mount_info = line.split("\s") mount_info[3] = translate_to_bytes(mount_info[3]) mount_info[2] = translate_to_bytes(mount_info[2]) mount_info[1] = translate_to_bytes(mount_info[1]) compute_sizes(mount_info) end end def translate_to_bytes(strin_size) strin_size.to_i * BLOCK_SIZE end def compute_sizes(info) available_bytes = info[3] used_bytes = info[2] size_bytes = info[1] @fact_list[:mountpoints][info.last].merge!( capacity: Facter::Util::Resolvers::FilesystemHelper.compute_capacity(used_bytes, size_bytes), available_bytes: available_bytes, used_bytes: used_bytes, size_bytes: size_bytes, available: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(available_bytes), used: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(used_bytes), size: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(size_bytes) ) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/openbsd/virtual.rb000066400000000000000000000020371470204764400254340ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Openbsd class Virtual < BaseResolver init_resolver class << self # :model VM_GUEST_SYSCTL_NAMES = { 'VMM' => 'vmm', 'vServer' => 'vserver', 'oracle' => 'virtualbox', 'xen' => 'xenu', 'none' => nil }.freeze private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_facts(fact_name) } end CTL_HW = 6 HW_PRODUCT = 15 def read_facts(fact_name) require 'facter/resolvers/bsd/ffi/ffi_helper' vm = Facter::Bsd::FfiHelper.sysctl(:string, [CTL_HW, HW_PRODUCT]) vm = if VM_GUEST_SYSCTL_NAMES.key?(vm) VM_GUEST_SYSCTL_NAMES[vm] else 'physical' end @fact_list[:vm] = vm @fact_list[fact_name] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/os_release.rb000066400000000000000000000071301470204764400244340ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class OsRelease < BaseResolver # :pretty_name # :name # :version_id # :version # :id # :id_like # :ansi_color # :home_url # :support_url # :bug_report_url init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) do # If we get here multiple times per run it's probably because # someone's asking for a os-release value not present in the file # (e.g. VERSION is not a thing on rolling distributions, so this # code will always run if the resolver is being asked for :version, # because it'll never get cached). # # Just return early to avoid reparsing the file. return unless @fact_list.empty? pairs = read_and_parse_os_release_file return unless pairs fill_fact_list(pairs) process_name process_version_id process_id @fact_list[fact_name] end end def read_and_parse_os_release_file content = Facter::Util::FileHelper.safe_readlines('/etc/os-release') return nil if content.empty? pairs = [] content.each do |line| pairs << line.strip.delete('"').split('=', 2) unless line.start_with?('#') end pairs end def fill_fact_list(pairs) result = Hash[*pairs.flatten] result.each { |k, v| @fact_list[k.downcase.to_sym] = v } end def process_version_id return unless @fact_list[:version_id] @fact_list[:version_id] = "#{@fact_list[:version_id]}.0" unless /\./.match?(@fact_list[:version_id]) end def process_id return unless @fact_list[:id] @fact_list[:id] = 'sles' if /sles_sap/i.match?(@fact_list[:id]) @fact_list[:id] = 'opensuse' if /opensuse/i.match?(@fact_list[:id]) end def process_name return unless @fact_list[:name] normalize_os_name join_os_name capitalize_os_name append_linux_to_os_name end def normalize_os_name os_name = @fact_list[:name] @fact_list[:name] = if os_name.downcase.start_with?('sles') 'SLES' else os_name end end def join_os_name os_name = @fact_list[:name] @fact_list[:name] = if os_name.downcase.start_with?('red', 'oracle', 'arch', 'manjaro') os_name = os_name.split(' ')[0..1].join os_name elsif os_name.downcase.end_with?('azure linux') os_name.split(' ')[1..2].join elsif os_name.downcase.end_with?('mariner') os_name.split(' ')[-1].strip else os_name.split(' ')[0].strip end end def capitalize_os_name os_name = @fact_list[:name] @fact_list[:name] = os_name.capitalize if os_name.downcase.start_with?('arch', 'manjaro') end def append_linux_to_os_name os_name = @fact_list[:name] @fact_list[:name] = "#{os_name}Linux" if os_name.downcase.start_with?('virtuozzo') end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/partitions.rb000066400000000000000000000157441470204764400245210ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Partitions < BaseResolver init_resolver BLOCK_PATH = '/sys/block' BLOCK_SIZE = 512 class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_partitions(fact_name) } end def read_partitions(fact_name) return unless File.readable?(BLOCK_PATH) block_devices = Dir.entries(BLOCK_PATH).reject { |dir| dir =~ /^\.+/ } @fact_list[:partitions] = {} unless block_devices.empty? blkid_and_lsblk = {} block_devices.each do |block_device| block_path = "#{BLOCK_PATH}/#{block_device}" if File.directory?("#{block_path}/device") extract_from_device(block_path, blkid_and_lsblk) elsif File.directory?("#{block_path}/dm") extract_from_dm(block_path, block_device, blkid_and_lsblk) elsif File.directory?("#{block_path}/loop") extract_from_loop(block_path, block_device, blkid_and_lsblk) end end @fact_list[fact_name] end def extract_from_device(block_path, blkid_and_lsblk) subdirs = browse_subdirectories(block_path) subdirs.each do |subdir| name = "/dev/#{subdir.split('/').last}" populate_partitions(name, subdir, blkid_and_lsblk) end end def extract_from_dm(block_path, block_device, blkid_and_lsblk) map_name = Facter::Util::FileHelper.safe_read("#{block_path}/dm/name").chomp if map_name.empty? populate_partitions("/dev/#{block_device}", block_path, blkid_and_lsblk) else populate_partitions("/dev/mapper/#{map_name}", block_path, blkid_and_lsblk) end end def extract_from_loop(block_path, block_device, blkid_and_lsblk) backing_file = Facter::Util::FileHelper.safe_read("#{block_path}/loop/backing_file").chomp if backing_file.empty? populate_partitions("/dev/#{block_device}", block_path, blkid_and_lsblk) else populate_partitions("/dev/#{block_device}", block_path, blkid_and_lsblk, backing_file) end end def populate_partitions(partition_name, block_path, blkid_and_lsblk, backing_file = nil) size_bytes = Facter::Util::FileHelper.safe_read("#{block_path}/size", '0') .chomp.to_i * BLOCK_SIZE info_hash = { size_bytes: size_bytes, size: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(size_bytes), backing_file: backing_file } info_hash.merge!(populate_from_syscalls(partition_name, blkid_and_lsblk)) @fact_list[:partitions][partition_name] = info_hash.compact end def populate_from_syscalls(partition_name, blkid_and_lsblk) # Prefer lsblk over blkid since lsblk does not require root, returns more information, and is recommended by blkid part_info = populate_from_lsblk(partition_name, blkid_and_lsblk) return populate_from_blkid(partition_name, blkid_and_lsblk) if part_info.empty? part_info end def browse_subdirectories(path) dirs = Dir[File.join(path, '**', '*')].select { |p| File.directory? p } dirs.select { |subdir| subdir.split('/').last.include?(path.split('/').last) }.reject(&:nil?) end def populate_from_blkid(partition_name, blkid_and_lsblk) return {} unless available?('blkid', blkid_and_lsblk) blkid_and_lsblk[:blkid] ||= execute_and_extract_blkid_info partition_data = blkid_and_lsblk[:blkid][partition_name] return {} unless partition_data filesys = partition_data['TYPE'] uuid = partition_data['UUID'] label = partition_data['LABEL'] part_uuid = partition_data['PARTUUID'] part_label = partition_data['PARTLABEL'] { filesystem: filesys, uuid: uuid, label: label, partuuid: part_uuid, partlabel: part_label } end def available?(command, blkid_and_lsblk) command_exists_key = command == 'blkid' ? :blkid_exists : :lsblk_exists return blkid_and_lsblk[command_exists_key] unless blkid_and_lsblk[command_exists_key].nil? blkid_and_lsblk[command_exists_key] = !Facter::Core::Execution.which(command).nil? end def execute_and_extract_blkid_info stdout = Facter::Core::Execution.execute('blkid', logger: log) output_hash = Hash[*stdout.split(/^([^:]+):/)[1..-1]] output_hash.each do |key, value| output_hash[key] = Hash[*value.delete('"').chomp.rstrip.split(/ ([^= ]+)=/)[1..-1]] end end def populate_from_lsblk(partition_name, blkid_and_lsblk) return {} unless available?('lsblk', blkid_and_lsblk) lsblk_version_raw = Facter::Core::Execution.execute('lsblk --version 2>&1', logger: log) # Return if the version of lsblk is too old (< 2.22) to support the --version flag lsblk_version_raw.match?(/ \d\.\d+/) ? lsblk_version = lsblk_version_raw.match(/ \d\.\d+/)[0].to_f : (return {}) # The -p/--paths option was added in lsblk 2.23, return early and fall back to blkid with earlier versions return {} if lsblk_version < 2.23 blkid_and_lsblk[:lsblk] ||= execute_and_extract_lsblk_info(lsblk_version) partition_data = blkid_and_lsblk[:lsblk][partition_name] return {} unless partition_data filesys = partition_data['FSTYPE'] uuid = partition_data['UUID'] label = partition_data['LABEL'] part_uuid = partition_data['PARTUUID'] part_label = partition_data['PARTLABEL'] part_type = partition_data['PARTTYPE'] result = { filesystem: filesys, uuid: uuid, label: label, partuuid: part_uuid, partlabel: part_label } result[:parttype] = part_type if part_type result end def execute_and_extract_lsblk_info(lsblk_version) # lsblk 2.25 added support for GPT partition type GUIDs stdout = if lsblk_version >= 2.25 Facter::Core::Execution.execute('lsblk -p -P -o NAME,FSTYPE,UUID,LABEL,PARTUUID,PARTLABEL,PARTTYPE', logger: log) else Facter::Core::Execution.execute('lsblk -p -P -o NAME,FSTYPE,LABEL,UUID,PARTUUID,PARTLABEL', logger: log) end output_hash = Hash[*stdout.split(/^(NAME=\S+)/)[1..-1]] output_hash.transform_keys! { |key| key.delete('NAME=')[1..-2] } output_hash.each do |key, value| output_hash[key] = Hash[*value.chomp.rstrip.split(/ ([^= ]+)=/)[1..-1].each { |x| x.delete!('"') }] end output_hash.each_value { |value_hash| value_hash.delete_if { |_k, v| v.empty? } } output_hash.delete_if { |_k, v| v.empty? } end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/path.rb000066400000000000000000000006011470204764400232430ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Path < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_path_from_env } end def read_path_from_env @fact_list[:path] = ENV['PATH'] end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/processors.rb000066400000000000000000000076701470204764400245260ustar00rootroot00000000000000# frozen_string_literal: true require 'set' module Facter module Resolvers module Linux class Processors < BaseResolver init_resolver MHZ_TO_HZ = 1_000_000 class << self # :count # :extensions # :models # :physical_count # :speed private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_cpuinfo(fact_name) } end def read_cpuinfo(fact_name) cpuinfo_output = Facter::Util::FileHelper.safe_readlines('/proc/cpuinfo') return if cpuinfo_output.empty? read_processors(cpuinfo_output) # + model names @fact_list[:physical_count] = @fact_list[:physical_processors].uniq.length @fact_list[:physical_count] = physical_devices_count if @fact_list[:physical_count].zero? @fact_list[fact_name] end def read_processors(cpuinfo_output) @fact_list[:extensions] = Set[Facter::Resolvers::Uname.resolve(:processor)] @fact_list[:processors] = 0 @fact_list[:models] = [] @fact_list[:physical_processors] = [] cpuinfo_output.each do |line| tokens = line.split(':') count_processors(tokens) construct_models_list(tokens) count_physical_processors(tokens) build_speed(tokens) check_extensions(tokens) end @fact_list[:extensions] = @fact_list[:extensions].to_a @fact_list[:extensions].sort! end def count_processors(tokens) @fact_list[:processors] += 1 if tokens.first.strip == 'processor' end def construct_models_list(tokens) return unless tokens.first.strip == 'model name' || tokens.first.strip == 'cpu' @fact_list[:models] << tokens.last.strip end def count_physical_processors(tokens) @fact_list[:physical_processors] << tokens.last.strip.to_i if tokens.first.strip == 'physical id' end def physical_devices_count Dir.entries('/sys/devices/system/cpu') .select { |dir| dir =~ /cpu[0-9]+$/ } .select { |dir| File.exist?("/sys/devices/system/cpu/#{dir}/topology/physical_package_id") } .map do |dir| Facter::Util::FileHelper.safe_read("/sys/devices/system/cpu/#{dir}/topology/physical_package_id").strip end .uniq.count end def build_speed(tokens) build_speed_for_power_pc(tokens) if tokens.first.strip == 'clock' build_speed_for_x86(tokens) if tokens.first.strip == 'cpu MHz' end def build_speed_for_power_pc(tokens) speed = tokens.last.strip.match(/^(\d+).*MHz/)[1] @fact_list[:speed] = speed.to_i * MHZ_TO_HZ end def build_speed_for_x86(tokens) speed = tokens.last.strip.match(/^(\d+).*/)[1] @fact_list[:speed] = speed.to_i * MHZ_TO_HZ end def check_extensions(tokens) return unless tokens.first.strip == 'flags' flags = tokens.last.split(' ') # TODO: As we gain support for other arches, change the guard # so we only check the flags for the corosponding arches return unless @fact_list[:extensions].include?('x86_64') @fact_list[:extensions].add('x86_64-v1') if (%w[cmov cx8 fpu fxsr lm mmx syscall sse2] - flags).empty? @fact_list[:extensions].add('x86_64-v2') if (%w[cx16 lahf_lm popcnt sse4_1 sse4_2 ssse3] - flags).empty? @fact_list[:extensions].add('x86_64-v3') if (%w[abm avx avx2 bmi1 bmi2 f16c fma movbe xsave] - flags).empty? @fact_list[:extensions].add('x86_64-v4') if (%w[avx512f avx512bw avx512cd avx512dq avx512vl] - flags).empty? end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/processors_lscpu.rb000066400000000000000000000022711470204764400257240ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Linux class Lscpu < BaseResolver init_resolver ITEMS = { threads_per_core: "-e 'Thread(s)'", cores_per_socket: "-e 'Core(s)'" }.freeze class << self # :cores_per_socket # :threads_per_core private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_cpuinfo(fact_name) } end def read_cpuinfo(fact_name) lscpu_output = Facter::Core::Execution.execute("lscpu | grep #{ITEMS.values.join(' ')}", logger: log) build_fact_list(lscpu_output.split("\n")) @fact_list[fact_name] end def build_fact_list(processors_data) build_threads_per_core(processors_data[0]) build_cores_per_socket(processors_data[1]) end def build_threads_per_core(index) @fact_list[:threads_per_core] = index.split(': ')[1].to_i end def build_cores_per_socket(index) @fact_list[:cores_per_socket] = index.split(': ')[1].to_i end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/redhat_release.rb000066400000000000000000000035251470204764400252660ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class RedHatRelease < BaseResolver # :name # :version # :codename # :description # :distributor_id init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_redhat_release(fact_name) } end def read_redhat_release(fact_name) output = Facter::Util::FileHelper.safe_read('/etc/redhat-release', nil) return @fact_list[fact_name] = nil if output.nil? build_fact_list(output) @fact_list[fact_name] end def build_fact_list(output) @fact_list[:description] = output.strip output_strings = output.split('release') output_strings.map!(&:strip) @fact_list[:codename] = codename(output) @fact_list[:distributor_id] = distributor_id(output_strings[0]) @fact_list[:name] = release_name(output_strings[0]) @fact_list[:version] = version(output_strings) @fact_list[:id] = id(@fact_list[:name]) end def release_name(value) value.split.reject { |el| el.casecmp('linux').zero? }[0..1].join end def id(value) id = value.downcase id = 'rhel' if @fact_list[:name].casecmp('Red Hat Enterprise Linux') id end def codename(value) matched_data = value.match(/.*release.*(\(.*\)).*/) return unless matched_data codename = (matched_data[1] || '').gsub(/\(|\)/, '') codename.empty? ? nil : codename end def version(value) value[1].split.first end def distributor_id(value) value.split.reject { |el| el.casecmp('linux').zero? }.join end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/release_from_first_line.rb000066400000000000000000000020321470204764400271700ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class ReleaseFromFirstLine < BaseResolver # :release init_resolver class << self private def post_resolve(fact_name, options) @fact_list.fetch(fact_name) { read_release_file(fact_name, options) } end def read_release_file(fact_name, options) release_file = options[:release_file] return unless release_file output = Facter::Util::FileHelper.safe_read(release_file, nil) return @fact_list[fact_name] = nil if output.nil? @fact_list[:release] = retrieve_version(output) @fact_list[fact_name] end def retrieve_version(output) if output[/(Rawhide)$/] 'Rawhide' elsif output['release'] output.strip =~ /release (\d[\d.]*)/ ? Regexp.last_match(1) : nil else output.strip =~ /Amazon Linux (\d+)/ ? Regexp.last_match(1) : nil end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/ruby.rb000066400000000000000000000011301470204764400232660ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Ruby < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { retrieve_ruby_information(fact_name) } end def retrieve_ruby_information(fact_name) @fact_list[:sitedir] = RbConfig::CONFIG['sitelibdir'] if RbConfig::CONFIG['sitedir'] @fact_list[:platform] = RUBY_PLATFORM @fact_list[:version] = RUBY_VERSION @fact_list[fact_name] end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/selinux.rb000066400000000000000000000036011470204764400240010ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class SELinux < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { retrieve_facts(fact_name) } end def retrieve_facts(fact_name) mountpoint = selinux_mountpoint @fact_list[:enabled] = !mountpoint.empty? && read_selinux_config read_other_selinux_facts(mountpoint) if @fact_list[:enabled] @fact_list[fact_name] end def selinux_mountpoint output = Facter::Core::Execution.execute('cat /proc/self/mounts', logger: log) mountpoint = '' output.each_line do |line| next unless /selinuxfs/.match?(line) mountpoint = line.split("\s")[1] break end mountpoint end def read_other_selinux_facts(mountpoint) enforce_file = "#{mountpoint}/enforce" policy_file = "#{mountpoint}/policyvers" @fact_list[:policy_version] = Facter::Util::FileHelper.safe_read(policy_file, nil) enforce = Facter::Util::FileHelper.safe_read(enforce_file) if enforce.eql?('1') @fact_list[:enforced] = true @fact_list[:current_mode] = 'enforcing' else @fact_list[:enforced] = false @fact_list[:current_mode] = 'permissive' end end def read_selinux_config file_lines = Facter::Util::FileHelper.safe_readlines('/etc/selinux/config') file_lines.map do |line| @fact_list[:config_mode] = line.split('=').last.strip if /^SELINUX=/.match?(line) @fact_list[:config_policy] = line.split('=').last.strip if /^SELINUXTYPE=/.match?(line) end !file_lines.empty? ? true : false end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/solaris/000077500000000000000000000000001470204764400234415ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/resolvers/solaris/disks.rb000066400000000000000000000026271470204764400251120ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Solaris class Disks < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_disks_info(fact_name) } end def read_disks_info(fact_name) return unless File.executable?('/usr/bin/kstat') log.debug('loading disks info') kstat_output = Facter::Core::Execution.execute('/usr/bin/kstat sderr', logger: log) return if kstat_output.empty? @fact_list[fact_name] = parse(kstat_output) end def parse(kstat_output) disks = {} names = kstat_output.scan(/name:\s+(\w+)/).flatten products = kstat_output.scan(/Product\s+(.+)/).flatten vendors = kstat_output.scan(/Vendor\s+(\w+)/).flatten sizes = kstat_output.scan(/Size\s+(\w+)/).flatten names.each_with_index do |name, index| disk_size = sizes[index].to_i disks[name] = { product: products[index], size: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(disk_size), size_bytes: disk_size, vendor: vendors[index] } end disks end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/solaris/dmi.rb000066400000000000000000000031161470204764400245400ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Solaris class Dmi < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_facts(fact_name) } end SMBIOS_PARAMS = { 'SMB_TYPE_BIOS' => { bios_version: 'Version String: (.+)', bios_vendor: 'Vendor: (.+)', bios_release_date: 'Release Date: (.+)' }, 'SMB_TYPE_SYSTEM' => { manufacturer: 'Manufacturer: (.+)', product_name: 'Product: (.+)', serial_number: 'Serial Number: (.+)', product_uuid: 'UUID: (.+)' }, 'SMB_TYPE_CHASSIS' => { chassis_asset_tag: 'Asset Tag: (.+)', chassis_type: '(?:Chassis )?Type: (.+)' } }.freeze def read_facts(fact_name) param = SMBIOS_PARAMS.find { |_key, hash| hash[fact_name] } return nil unless param output = exec_smbios(param[0]) facts = param[1] return unless output facts.each do |name, regx| @fact_list[name] = output.match(/#{regx}/)&.captures&.first end @fact_list[fact_name] end def exec_smbios(args) return unless File.executable?('/usr/sbin/smbios') Facter::Core::Execution.execute("/usr/sbin/smbios -t #{args}", logger: log) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/solaris/dmi_sparc.rb000066400000000000000000000026741470204764400257400ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Solaris class DmiSparc < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_facts(fact_name) } end def read_facts(fact_name) output = exec_prtdiag return unless output matches = output.match(/System Configuration:\s+(.+?)\s+sun\d+\S+\s+(.+)/)&.captures # There are circumstances (e.g. in non-global zones) when prtdiag # will return text, but it's an error message or some other string # that isn't parsed by the above match/capture. In that case, we # simply return. return if matches.nil? @fact_list[:manufacturer] = matches[0]&.strip @fact_list[:product_name] = matches[1]&.strip sneep = exec_sneep&.strip @fact_list[:serial_number] = sneep @fact_list[fact_name] end def exec_prtdiag return unless File.executable?('/usr/sbin/prtdiag') Facter::Core::Execution.execute('/usr/sbin/prtdiag', logger: log) end def exec_sneep return unless File.executable?('/usr/sbin/sneep') Facter::Core::Execution.execute('/usr/sbin/sneep', logger: log) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/solaris/ffi/000077500000000000000000000000001470204764400242055ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/resolvers/solaris/ffi/ffi.rb000066400000000000000000000013031470204764400252730ustar00rootroot00000000000000# frozen_string_literal: true require 'ffi' require_relative 'structs' require_relative 'functions' module Facter module Resolvers module Solaris module FFI SIOCGLIFNUM = -1_072_928_382 SIOCGLIFCONF = -1_072_666_203 SIOCGLIFMTU = -1_065_850_502 SIOCGLIFNETMASK = -1_065_850_499 SIOCGARP = -1_071_355_617 AF_INET = 2 AF_INET6 = 26 AF_UNSPEC = 0 SOCK_DGRAM = 1 INET_ADDRSTRLEN = 16 INET6_ADDRSTRLEN = 46 end BINDINGS_KEY = { FFI::AF_INET => :bindings, FFI::AF_INET6 => :bindings6 }.freeze end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/solaris/ffi/functions.rb000066400000000000000000000014631470204764400265460ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Solaris module FFI module Ioctl extend ::FFI::Library ffi_lib ::FFI::Library::LIBC, 'socket' attach_function :ioctl_base, :ioctl, %i[int int pointer], :int attach_function :open_socket, :socket, %i[int int int], :int attach_function :close_socket, :close, %i[int], :int attach_function :inet_ntop, %i[int pointer pointer uint], :string def self.ioctl(call_const, pointer, address_family = AF_INET) fd = Ioctl.open_socket(address_family, SOCK_DGRAM, 0) begin ioctl_base(fd, call_const, pointer) ensure Ioctl.close_socket(fd) end end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/solaris/ffi/structs.rb000066400000000000000000000067741470204764400262570ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Solaris module FFI class SockaddrStorage < ::FFI::Struct layout :ss_family, :int16, :pad, [:char, 254] end class Sockaddr < ::FFI::Struct layout :sa_family, :sa_family_t, :sa_data, [:uchar, 14] end class Lifnum < ::FFI::Struct layout :lifn_family, :sa_family_t, :lifn_flags, :int, :lifn_count, :int end class Arpreq < ::FFI::Struct layout :arp_pa, Sockaddr, :arp_ha, Sockaddr, :arp_flags, :int def sa_data_to_mac self[:arp_ha][:sa_data].entries[0, 6].map do |s| s.to_s(16).rjust(2, '0') end.join ':' end def self.new_for_ioctl(lifreq) arp = Arpreq.new arp_addr = SockaddrIn.new(arp[:arp_pa].to_ptr) arp_addr[:sin_addr][:s_addr] = SockaddrIn.new(lifreq.lifru_addr.to_ptr).s_addr arp end end class Lifru1 < ::FFI::Union layout :lifru_addrlen, :int, :lifru_ppa, :uint_t end class Lifru < ::FFI::Union layout :lifru_addr, SockaddrStorage, :lifru_dstaddr, SockaddrStorage, :lifru_broadaddr, SockaddrStorage, :lifru_token, SockaddrStorage, :lifru_subnet, SockaddrStorage, :lifru_flags, :uint64, :lifru_metric, :int, :pad, [:char, 80] end class Lifreq < ::FFI::Struct layout :lifr_name, [:char, 32], :lifr_lifru1, Lifru1, :lifr_movetoindex, :int, :lifr_lifru, Lifru, :pad, [:char, 80] def name self[:lifr_name].to_s end def ss_family self[:lifr_lifru][:lifru_addr][:ss_family] end def lifru_addr self[:lifr_lifru][:lifru_addr] end end class Lifconf < ::FFI::Struct layout :lifc_family, :uint, :lifc_flags, :int, :lifc_len, :int, :lifc_buf, :pointer def self.new_for_ioctl(interface_count) lifconf = new lifconf[:lifc_family] = 0 lifconf[:lifc_flags] = 0 lifconf[:lifc_len] = interface_count * Lifreq.size lifconf[:lifc_buf] = ::FFI::MemoryPointer.new(Lifreq, interface_count) lifconf end end class Lifcu < ::FFI::Union layout :lifcu_buf, :caddr_t, :lifcu_req, Lifreq end class InAddr < ::FFI::Struct layout :s_addr, :uint32_t end class SockaddrIn < ::FFI::Struct layout :sin_family, :sa_family_t, :sin_port, :in_port_t, :sin_addr, InAddr, :sin_zero, [:char, 8] def s_addr self[:sin_addr][:s_addr] end end class In6Addr < ::FFI::Struct layout :s_addr, [:uint32_t, 4] end class SockaddrIn6 < ::FFI::Struct layout :sin6_family, :sa_family_t, :sin6_port, :in_port_t, :sin6_flowinfo, :uint32_t, :sin6_addr, In6Addr, :sin6_scope_id, :uint32_t end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/solaris/filesystems.rb000066400000000000000000000014531470204764400263400ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Solaris class Filesystem < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_sysdef_file(fact_name) } end def read_sysdef_file(fact_name) return unless File.executable?('/usr/sbin/sysdef') file_content = Facter::Core::Execution.execute('/usr/sbin/sysdef', logger: log) files = file_content.split("\n").map do |line| line.split('/').last if /^fs\.*/.match?(line) end @fact_list[:file_systems] = files.compact.sort.join(',') @fact_list[fact_name] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/solaris/ipaddress.rb000066400000000000000000000022051470204764400257430ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Solaris class Ipaddress < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_ipaddress(fact_name) } end def read_ipaddress(fact_name) ip = nil primary_interface = read_primary_interface unless primary_interface.nil? output = Facter::Core::Execution.execute("ifconfig #{primary_interface}", logger: log) output.each_line do |str| if str.strip =~ /inet\s(\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}) .+/ @fact_list[:ip] = ip = Regexp.last_match(1) break end end end @fact_list[fact_name] end def read_primary_interface output = Facter::Core::Execution.execute('route -n get default | grep interface', logger: log) output.strip =~ /interface:\s(\S+)/ ? Regexp.last_match(1) : nil end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/solaris/ldom.rb000066400000000000000000000033621470204764400247250ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Solaris class Ldom < BaseResolver # :chassis_serial # :control_domain # :domain_name # :domain_uuid # :role_control # :role_io # :role_root # :role_service # :role_impl init_resolver VIRTINFO_MAPPING = { chassis_serial: %w[DOMAINCHASSIS serialno], control_domain: %w[DOMAINCONTROL name], domain_name: %w[DOMAINNAME name], domain_uuid: %w[DOMAINUUID uuid], role_control: %w[DOMAINROLE control], role_io: %w[DOMAINROLE io], role_root: %w[DOMAINROLE root], role_service: %w[DOMAINROLE service], role_impl: %w[DOMAINROLE impl] }.freeze class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { call_virtinfo(fact_name) } end def call_virtinfo(fact_name) virtinfo_output = Facter::Core::Execution.execute('/usr/sbin/virtinfo -a -p', logger: log) return if virtinfo_output.empty? output_hash = parse_output(virtinfo_output) return if output_hash.empty? VIRTINFO_MAPPING.each do |key, value| @fact_list[key] = output_hash.dig(*value)&.strip end @fact_list[fact_name] end def parse_output(output) result = {} output.each_line do |line| next unless line.include? 'DOMAIN' x = line.split('|') result[x.shift] = x.map { |f| f.split('=') }.to_h end result end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/solaris/memory.rb000066400000000000000000000051701470204764400253010ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Solaris class Memory < BaseResolver init_resolver BLOCKSIZE = 512 # :system # :swap class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { calculate_memory(fact_name) } end def calculate_memory(fact_name) @fact_list = { system: sys, swap: swap } @fact_list[fact_name] end def sys sys = {} output = Facter::Core::Execution.execute('/usr/bin/kstat -m unix -n system_pages', logger: log).strip total, free = parse_sys_output(output) return unless total || free sys[:total_bytes] = total sys[:available_bytes] = free sys[:used_bytes] = total - free sys[:capacity] = Facter::Util::Resolvers::FilesystemHelper.compute_capacity(total - free, total) sys end def swap swap_hash = {} output = Facter::Core::Execution.execute('/usr/sbin/swap -l', logger: log).strip total, free = parse_swap_output(output) swap_hash[:total_bytes] = total swap_hash[:available_bytes] = free swap_hash[:used_bytes] = total - free swap_hash[:capacity] = Facter::Util::Resolvers::FilesystemHelper.compute_capacity(total - free, total) swap_hash if total != 0 end def parse_sys_output(output) kstats = output.scan(/(physmem|pagesfree)\s+(\d+)/) kstats = kstats.to_h return unless kstats['physmem'] || kstats['pagesfree'] return unless pagesize != 0 total = kstats['physmem'].to_i * pagesize free = kstats['pagesfree'].to_i * pagesize [total, free] end def parse_swap_output(output) total = 0 free = 0 output.each_line do |line| swap_sizes = line.match(/(\d+)\s+(\d+)$/) next if swap_sizes.nil? total += swap_sizes[1].to_i free += swap_sizes[2].to_i end total *= BLOCKSIZE free *= BLOCKSIZE [total, free] end def pagesize unless @fact_list[:pagesize] @fact_list[:pagesize] = Facter::Core::Execution.execute('pagesize', logger: log).strip.to_i log.debug("Pagesize: #{@fact_list[:pagesize]}") end @fact_list[:pagesize] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/solaris/mountpoints.rb000066400000000000000000000057531470204764400263770ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Solaris class Mountpoints < BaseResolver include Facter::Util::Resolvers::FilesystemHelper init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_mounts(fact_name) } end def exclude_auto_home_mounts! @mounts.reject! do |mount| parent = mount[:path].rpartition('/').first @auto_home_paths.include?(parent) end end def read_mounts(fact_name) @mounts = [] @auto_home_paths = [] begin Facter::Util::Resolvers::FilesystemHelper.read_mountpoints&.each do |fs| if fs.name == 'auto_home' @auto_home_paths << fs.mount_point next end next if fs.mount_type == 'autofs' mounts = {} device = fs.name filesystem = fs.mount_type path = fs.mount_point options = fs.options.split(',').map(&:strip) mounts = read_stats(path).tap do |hash| hash[:device] = device hash[:filesystem] = filesystem hash[:path] = path hash[:options] = options if options.any? end @mounts << Hash[Facter::Util::Resolvers::FilesystemHelper::MOUNT_KEYS .zip(Facter::Util::Resolvers::FilesystemHelper::MOUNT_KEYS .map { |v| mounts[v] })] end rescue LoadError => e @log.debug("Could not read mounts: #{e}") end exclude_auto_home_mounts! @fact_list[:mountpoints] = @mounts @fact_list[fact_name] end def read_stats(path) begin stats = Facter::Util::Resolvers::FilesystemHelper.read_mountpoint_stats(path) size_bytes = stats.bytes_total.abs available_bytes = stats.bytes_available.abs used_bytes = stats.bytes_used.abs total_bytes = used_bytes + available_bytes rescue Sys::Filesystem::Error, LoadError size_bytes = used_bytes = available_bytes = 0 end { size_bytes: size_bytes, available_bytes: available_bytes, used_bytes: used_bytes, total_bytes: total_bytes, capacity: Facter::Util::Resolvers::FilesystemHelper.compute_capacity(used_bytes, total_bytes), size: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(size_bytes), available: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(available_bytes), used: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(used_bytes) } end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/solaris/networking.rb000066400000000000000000000126731470204764400261660ustar00rootroot00000000000000# frozen_string_literal: true require_relative 'ffi/ffi' module Facter module Resolvers module Solaris class Networking < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_facts(fact_name) } end def read_facts(fact_name) begin lifreqs = load_interfaces @interfaces = {} lifreqs.each do |lifreq| obtain_info_for_interface(lifreq) end @fact_list[:primary_interface] = Facter::Util::Resolvers::Networking::PrimaryInterface.read_from_route unless @interfaces.empty? @fact_list[:interfaces] = @interfaces @fact_list[:primary_interface] ||= Facter::Util::Resolvers::Networking::PrimaryInterface.find_in_interfaces(@interfaces) end Facter::Util::Resolvers::Networking.expand_main_bindings(@fact_list) rescue StandardError => e @log.log_exception(e) end @fact_list[fact_name] end def obtain_info_for_interface(lifreq) @interfaces[lifreq.name] ||= {} add_mac(lifreq) add_bindings(lifreq) add_mtu(lifreq) dhcp = Facter::Util::Resolvers::Networking::Dhcp.get(lifreq.name, @log) @interfaces[lifreq.name][:dhcp] = dhcp if dhcp end def add_mac(lifreq) arp = FFI::Arpreq.new_for_ioctl(lifreq) ioctl = FFI::Ioctl.ioctl(FFI::SIOCGARP, arp, lifreq.ss_family) if ioctl == -1 @log.debug("Could not read MAC address for interface #{lifreq.name} "\ "error code is: #{::FFI::LastError.error}") end mac = arp.sa_data_to_mac @interfaces[lifreq.name][:mac] ||= mac if mac.count('0') < 12 end def add_bindings(lifreq) ip = inet_ntop(lifreq, lifreq.ss_family) _netmask, netmask_length = load_netmask(lifreq) bindings = Facter::Util::Resolvers::Networking.build_binding(ip, netmask_length) bindings_key = BINDINGS_KEY[lifreq.ss_family] @interfaces[lifreq.name][bindings_key] ||= [] @interfaces[lifreq.name][bindings_key] << bindings end def add_mtu(lifreq) ioctl = FFI::Ioctl.ioctl(FFI::SIOCGLIFMTU, lifreq, lifreq.ss_family) if ioctl == -1 @log.error("Could not read MTU, error code is: #{::FFI::LastError.error}") return end @interfaces[lifreq.name][:mtu] ||= lifreq[:lifr_lifru][:lifru_metric] end def load_netmask(lifreq) netmask_lifreq = FFI::Lifreq.new(lifreq.to_ptr) ioctl = FFI::Ioctl.ioctl(FFI::SIOCGLIFNETMASK, netmask_lifreq, lifreq.ss_family) if ioctl == -1 @log.error("Could not read Netmask, error code is: #{::FFI::LastError.error}") return end netmask = inet_ntop(netmask_lifreq, lifreq.ss_family) [netmask, Facter::Util::Resolvers::Networking.calculate_mask_length(netmask)] end def inet_ntop(lifreq, ss_family) if ss_family == FFI::AF_INET buffer_size = FFI::INET_ADDRSTRLEN ip = get_ipv4(lifreq) else # FFI::AF_INET6 buffer_size = FFI::INET6_ADDRSTRLEN ip = get_ipv6(lifreq) end buffer = ::FFI::MemoryPointer.new(:char, buffer_size) FFI::Ioctl.inet_ntop(ss_family, ip.to_ptr, buffer.to_ptr, buffer.size) end def get_ipv4(lifreq) sockaddr = FFI::Sockaddr.new(lifreq.lifru_addr.to_ptr) sockaddr_in = FFI::SockaddrIn.new(sockaddr.to_ptr) FFI::InAddr.new(sockaddr_in[:sin_addr].to_ptr) end def get_ipv6(lifreq) sockaddr = FFI::Sockaddr.new(lifreq.lifru_addr.to_ptr) sockaddr_in6 = FFI::SockaddrIn6.new(sockaddr.to_ptr) FFI::In6Addr.new(sockaddr_in6[:sin6_addr].to_ptr) end def count_interfaces lifnum = FFI::Lifnum.new lifnum[:lifn_family] = FFI::AF_UNSPEC lifnum[:lifn_flags] = 0 lifnum[:lifn_count] = 0 ioctl = FFI::Ioctl.ioctl(FFI::SIOCGLIFNUM, lifnum) @log.error("Could not read interface count, error code is: #{::FFI::LastError.error}") if ioctl == -1 lifnum[:lifn_count] end def load_interfaces interface_count = count_interfaces lifconf = FFI::Lifconf.new_for_ioctl(interface_count) ioctl = FFI::Ioctl.ioctl(FFI::SIOCGLIFCONF, lifconf) # we need to enlarge the scope of this pointer so that Ruby GC will not free the memory. # If the pointer if freed, Lifreq structures will contain garbage from memory. @long_living_pointer = lifconf if ioctl == -1 @log.error("Could not read interface information, error code is: #{::FFI::LastError.error}") return [] end interfaces = [] interface_count.times do |i| interfaces << FFI::Lifreq.new(lifconf[:lifc_buf] + (i * FFI::Lifreq.size)) end interfaces end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/solaris/os_release.rb000066400000000000000000000026511470204764400261130ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Solaris class OsRelease < BaseResolver init_resolver OS_VERSION_REGEX_PATTERNS = ['Solaris \d+ \d+/\d+ s(\d+)[sx]?_u(\d+)wos_', 'Solaris (\d+)[.](\d+)', 'Solaris (\d+)'].freeze class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { build_release_facts(fact_name) } end def build_release_facts(fact_name) result = Facter::Util::FileHelper.safe_read('/etc/release', nil) return @fact_list[fact_name] = nil if result.nil? OS_VERSION_REGEX_PATTERNS.each do |os_version_regex| major, minor = search_for_os_version(/#{os_version_regex}/, result) next unless major || minor @fact_list[:major] = major @fact_list[:minor] = minor @fact_list[:full] = major == '10' ? "#{major}_u#{minor}" : "#{major}.#{minor}" break end @fact_list[fact_name] end def search_for_os_version(regex_pattern, text) result = text.match(regex_pattern) major, minor = result.captures if result minor = regex_pattern == /Solaris (\d+)/ ? '0' : minor [major, minor] if major && minor end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/solaris/processors.rb000066400000000000000000000027121470204764400261720ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Solaris class Processors < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { collect_kstat_info(fact_name) } end def collect_kstat_info(fact_name) return unless File.executable?('/usr/bin/kstat') kstat_output = Facter::Core::Execution.execute('/usr/bin/kstat -m cpu_info', logger: log) return if kstat_output.empty? parse_output(kstat_output.chomp) @fact_list[fact_name] end def parse_output(output) @fact_list[:logical_count] = output.scan(/module/).size @fact_list[:physical_count] = output.scan(/chip_id .*/).uniq.size @fact_list[:speed] = output.scan(/current_clock_Hz .*/).first.gsub(/[a-zA-z\s]+/, '').to_i @fact_list[:models] = output.scan(/brand .*/).map { |elem| elem.gsub(/brand(\s+)/, '') } calculate_threads_cores(output) end def calculate_threads_cores(output) @fact_list[:core_count] = output.scan(/\score_id .*/).uniq.size @fact_list[:threads_per_core] = @fact_list[:logical_count] / @fact_list[:core_count] @fact_list[:cores_per_socket] = @fact_list[:core_count] / @fact_list[:physical_count] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/solaris/zone.rb000066400000000000000000000024321470204764400247420ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Solaris class Zone < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { build_zone_fact(fact_name) } end def build_zone_fact(fact_name) command = '/usr/sbin/zoneadm list -cp' zone_adm_output = Facter::Core::Execution.execute(command, logger: log) if zone_adm_output.empty? log.debug("Command #{command} returned an empty result") return end @fact_list[:zone] = create_zone_facts(zone_adm_output) @fact_list[fact_name] end def create_zone_facts(zones_result) zones_fact = [] zones_result.each_line do |zone_line| id, name, status, path, uuid, brand, ip_type = zone_line.split(':') zones_fact << { brand: brand, id: id, iptype: ip_type.chomp, name: name, uuid: uuid, status: status, path: path } end zones_fact end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/solaris/zone_name.rb000066400000000000000000000014151470204764400257420ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Solaris class ZoneName < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { build_current_zone_name_fact(fact_name) } end def build_current_zone_name_fact(fact_name) zone_name_output = Facter::Core::Execution.execute('/bin/zonename', logger: log) if zone_name_output.empty? log.debug("Command #{command} returned an empty result") return end @fact_list[:current_zone_name] = zone_name_output.chomp @fact_list[fact_name] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/specific_release_file.rb000066400000000000000000000015761470204764400266070ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class SpecificReleaseFile < BaseResolver # :release init_resolver class << self private def post_resolve(fact_name, options) @fact_list.fetch(fact_name) { read_release_file(fact_name, options) } end def read_release_file(fact_name, options) release_file = options[:release_file] return unless release_file output = Facter::Util::FileHelper.safe_read(release_file, nil) return @fact_list[fact_name] = nil if output.nil? if options[:regex] @fact_list[:release] = output.strip =~ /#{options[:regex]}/ ? Regexp.last_match : nil return @fact_list[fact_name] end @fact_list[:release] = output.strip @fact_list[fact_name] end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/ssh.rb000066400000000000000000000021641470204764400231120ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Ssh < BaseResolver init_resolver FILE_NAMES = %w[ssh_host_rsa_key.pub ssh_host_dsa_key.pub ssh_host_ecdsa_key.pub ssh_host_ed25519_key.pub].freeze FILE_PATHS = %w[/etc/ssh /usr/local/etc/ssh /etc /usr/local/etc /etc/opt/ssh].freeze class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { retrieve_info(fact_name) } end def retrieve_info(fact_name) ssh_list = [] FILE_PATHS.each do |file_path| next unless File.directory?(file_path) FILE_NAMES.each do |file_name| file_content = Facter::Util::FileHelper.safe_read(File.join(file_path, file_name), nil) next unless file_content key_type, key = file_content.split(' ') ssh = Facter::Util::Resolvers::SshHelper.create_ssh(key_type, key) ssh_list << ssh if ssh end end @fact_list[:ssh] = ssh_list @fact_list[fact_name] end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/suse_release.rb000066400000000000000000000014321470204764400247710ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class SuseRelease < BaseResolver # :name # :version # :codename init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_suse_release(fact_name) } end def read_suse_release(fact_name) output = Facter::Util::FileHelper.safe_read('/etc/SuSE-release', nil) return @fact_list[fact_name] = nil if output.nil? output_strings = output.split(' ') @fact_list[:name] = output_strings[0] @fact_list[:version] = output_strings[1] @fact_list[:id] = @fact_list[:name].downcase @fact_list[fact_name] end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/sw_vers.rb000066400000000000000000000014231470204764400240020ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class SwVers < BaseResolver # :productname # :productversion # :productversionextra # :buildversion init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { software_version_system_call(fact_name) } end def software_version_system_call(fact_name) output = Facter::Core::Execution.execute('sw_vers', logger: log) release_info = output.delete("\t").split("\n").map { |e| e.split(':') } result = Hash[*release_info.flatten] result.each { |k, v| @fact_list[k.downcase.to_sym] = v } @fact_list[fact_name] end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/timezone.rb000066400000000000000000000006371470204764400241520ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Timezone < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { determine_timezone } end def determine_timezone @fact_list[:timezone] = Time.now.localtime.strftime('%Z') end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/uname.rb000066400000000000000000000021611470204764400234170ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Uname < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { uname_system_call(fact_name) } end def uname_system_call(fact_name) output = Facter::Core::Execution.execute('uname -m && uname -n && uname -p && uname -r && uname -s && uname -v', logger: log) build_fact_list(output) @fact_list[fact_name] end def build_fact_list(output) uname_results = output.split("\n") if !uname_results.empty? @fact_list[:machine], @fact_list[:nodename], @fact_list[:processor], @fact_list[:kernelrelease], @fact_list[:kernelname], @fact_list[:kernelversion] = uname_results.map(&:strip) else log.warn('Request to uname returned no output. Uname related facts are not populated.') end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/uptime.rb000066400000000000000000000013111470204764400236110ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Uptime < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { uptime_system_call(fact_name) } end def uptime_system_call(fact_name) seconds = Facter::Util::Facts::UptimeParser.uptime_seconds_unix build_fact_list(seconds) @fact_list[fact_name] end def build_fact_list(seconds) return @fact_list[:uptime] = 'unknown' unless seconds @fact_list = Facter::Util::Resolvers::UptimeHelper.create_uptime_hash(seconds) end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/virt_what.rb000066400000000000000000000035151470204764400243250ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class VirtWhat < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { retrieve_from_virt_what(fact_name) } end def retrieve_from_virt_what(fact_name) output = Facter::Core::Execution.execute('virt-what', logger: log) @fact_list[:vm] = determine_xen(output) @fact_list[:vm] ||= determine_other(output) retrieve_vserver unless @fact_list[:vserver] @fact_list[fact_name] end def determine_xen(output) xen_info = /^xen\n.*/.match(output) return unless xen_info xen_info = xen_info.to_s return 'xenu' if /xen-domu/.match?(xen_info) return 'xenhvm' if /xen-hvm/.match?(xen_info) 'xen0' if /xen-dom0/.match?(xen_info) end def determine_other(output) values = output.split("\n") other_vm = values.first return unless other_vm return 'zlinux' if /ibm_systemz/.match?(other_vm) return retrieve_vserver if /linux_vserver/.match?(other_vm) return (values - ['redhat']).first if values.include?('redhat') other_vm end def retrieve_vserver proc_status_content = Facter::Util::FileHelper.safe_readlines('/proc/self/status', nil) return unless proc_status_content proc_status_content.each do |line| parts = line.split("\s") next unless parts.size.equal?(2) next unless /^s_context:|^VxID:/.match?(parts[0]) return @fact_list[:vserver] = 'vserver_host' if parts[1] == '0' return @fact_list[:vserver] = 'vserver' end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/vmware.rb000066400000000000000000000012221470204764400236100ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Vmware < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { vmware_command(fact_name) } end def vmware_command(fact_name) output = Facter::Core::Execution.execute('vmware -v', logger: log) return if output.empty? parts = output.split("\s") return unless parts.size.equal?(2) @fact_list[:vm] = "#{parts[0].downcase}_#{parts[1].downcase}" @fact_list[fact_name] end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/000077500000000000000000000000001470204764400234575ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/aio_agent_version.rb000066400000000000000000000032401470204764400274760ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Windows class AioAgentVersion < BaseResolver REGISTRY_PATH = 'SOFTWARE\\Puppet Labs\\Puppet' init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_version(fact_name) } end def read_version(fact_name) ::Win32::Registry::HKEY_LOCAL_MACHINE.open(REGISTRY_PATH) do |reg| build_fact_list(reg) end @fact_list[fact_name] rescue Win32::Registry::Error log.debug("The registry path #{REGISTRY_PATH} does not exist") end def build_fact_list(reg) puppet_aio_path = read_for_64_bit(reg) || read_for_32_bit(reg) return if puppet_aio_path.nil? || puppet_aio_path.empty? puppet_aio_version_path = File.join(puppet_aio_path, 'VERSION') aio_agent_version = Facter::Util::FileHelper.safe_read(puppet_aio_version_path, nil)&.chomp @fact_list[:aio_agent_version] = aio_agent_version&.match(/^\d+\.\d+\.\d+(\.\d+){0,2}/)&.to_s end def read_for_64_bit(reg) reg.read('RememberedInstallDir64')[1] rescue Win32::Registry::Error log.debug('Could not read Puppet AIO path from 64 bit registry') nil end def read_for_32_bit(reg) reg.read('RememberedInstallDir')[1] rescue Win32::Registry::Error log.debug('Could not read Puppet AIO path from 32 bit registry') nil end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/dmi_bios.rb000066400000000000000000000016661470204764400256020ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class DMIBios < BaseResolver init_resolver class << self # Manufacturer # SerialNumber private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_fact_from_bios(fact_name) } end def read_fact_from_bios(fact_name) win = Facter::Util::Windows::Win32Ole.new bios = win.return_first('SELECT Manufacturer,SerialNumber from Win32_BIOS') unless bios @log.debug 'WMI query returned no results for Win32_BIOS with values Manufacturer and SerialNumber.' return end build_fact_list(bios) @fact_list[fact_name] end def build_fact_list(bios) @fact_list[:manufacturer] = bios.Manufacturer @fact_list[:serial_number] = bios.SerialNumber end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/dmi_computersystem.rb000066400000000000000000000017311470204764400277420ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class DMIComputerSystem < BaseResolver init_resolver class << self # Name # UUID private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_fact_from_computer_system(fact_name) } end def read_fact_from_computer_system(fact_name) win = Facter::Util::Windows::Win32Ole.new computersystem = win.return_first('SELECT Name,UUID FROM Win32_ComputerSystemProduct') unless computersystem @log.debug 'WMI query returned no results for Win32_ComputerSystemProduct with values Name and UUID.' return end build_fact_list(computersystem) @fact_list[fact_name] end def build_fact_list(computersys) @fact_list[:name] = computersys.Name @fact_list[:uuid] = computersys.UUID end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/ffi/000077500000000000000000000000001470204764400242235ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/ffi/ffi.rb000066400000000000000000000037601470204764400253220ustar00rootroot00000000000000# frozen_string_literal: true require 'ffi' FFI.typedef :uint16, :word FFI.typedef :uint32, :dword FFI.typedef :uintptr_t, :handle FFI.typedef :buffer_inout, :lpwstr FFI.typedef :pointer, :lpcvoid FFI.typedef :pointer, :lpvoid FFI.typedef :pointer, :lpdword FFI.typedef :pointer, :pdword FFI.typedef :pointer, :phandle FFI.typedef :pointer, :pbool FFI.typedef :pointer, :ulong_ptr FFI.typedef :uint32, :win32_ulong FFI.typedef :int32, :win32_long FFI.typedef :int32, :win32_bool FFI.typedef :uint16, :wchar FFI.typedef :uintptr_t, :hwnd ERROR_MORE_DATA = 234 MAX_PATH = 32_767 module FFI WIN32FALSE = 0 END_OF_WCHAR_STRING = (+"\0\0").force_encoding(Encoding::UTF_16LE).freeze class Pointer def read_wide_string_with_length(char_length) # char_length is number of wide chars (typically excluding NULLs), *not* bytes str = get_bytes(0, char_length * 2).force_encoding(Encoding::UTF_16LE) str.encode(Encoding::UTF_8, str.encoding) end def read_wide_string_without_length(replace_invalid_chars: false) wide_character = get_bytes(0, 2) wide_character.force_encoding(Encoding::UTF_16LE) i = 2 str = [] while wide_character != END_OF_WCHAR_STRING str << wide_character wide_character = get_bytes(i, 2) wide_character.force_encoding(Encoding::UTF_16LE) i += 2 end if replace_invalid_chars str.join.force_encoding(Encoding::UTF_16LE).encode(Encoding::UTF_8, Encoding::UTF_16LE, invalid: :replace) else str.join.force_encoding(Encoding::UTF_16LE).encode(Encoding::UTF_8) end end def read_win32_bool # BOOL is always a 32-bit integer in Win32 # some Win32 APIs return 1 for true, while others are non-0 read_int32 != WIN32FALSE end end class Struct def self.read_list(first_address) instance = new(first_address) while instance.to_ptr != Pointer::NULL yield(instance) instance = new(instance[:Next]) end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/ffi/hardware_ffi.rb000066400000000000000000000007101470204764400271670ustar00rootroot00000000000000# frozen_string_literal: true require_relative '../../../../facter/resolvers/windows/ffi/ffi' require_relative '../../../../facter/resolvers/windows/ffi/system_info' module HardwareFFI extend FFI::Library ffi_convention :stdcall ffi_lib :kernel32 attach_function :GetNativeSystemInfo, [:pointer], :void PROCESSOR_ARCHITECTURE_INTEL = 0 PROCESSOR_ARCHITECTURE_ARM = 5 PROCESSOR_ARCHITECTURE_IA64 = 6 PROCESSOR_ARCHITECTURE_AMD64 = 9 end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/ffi/identity_ffi.rb000066400000000000000000000007151470204764400272300ustar00rootroot00000000000000# frozen_string_literal: true require_relative '../../../../facter/resolvers/windows/ffi/ffi' module IdentityFFI extend FFI::Library ffi_convention :stdcall ffi_lib :secur32 attach_function :GetUserNameExW, %i[uint32 lpwstr pointer], :win32_bool ffi_convention :stdcall ffi_lib :shell32 attach_function :IsUserAnAdmin, [], :win32_bool def self.privileged? result = self.IsUserAnAdmin() result && result != FFI::WIN32FALSE end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/ffi/ip_adapter_addresses_lh.rb000066400000000000000000000074551470204764400314130ustar00rootroot00000000000000# frozen_string_literal: true MAX_ADAPTER_ADDRESS_LENGTH = 8 MAX_DHCPV6_DUID_LENGTH = 130 class SockAddr < FFI::Struct layout( :sa_family, :ushort, :sa_data, [:uint8, 14] ) end class SocketAddress < FFI::Struct layout( :lpSockaddr, :pointer, :iSockaddrLength, :int32 ) end module Enums extend FFI::Library IP_PREFIX_ORIGIN = enum( :IpPrefixOriginOther, 0, :IpPrefixOriginManual, :IpPrefixOriginWellKnown, :IpPrefixOriginDhcp, :IpPrefixOriginRouterAdvertisement, :IpPrefixOriginUnchanged ) IP_SUFFIX_ORIGIN = enum( :NlsoOther, 0, :NlsoManual, :NlsoWellKnown, :NlsoDhcp, :NlsoLinkLayerAddress, :NlsoRandom, :IpSuffixOriginOther, :IpSuffixOriginManual, :IpSuffixOriginWellKnown, :IpSuffixOriginDhcp, :IpSuffixOriginLinkLayerAddress, :IpSuffixOriginRandom, :IpSuffixOriginUnchanged ) IP_DAD_STATE = enum( :NldsInvalid, 0, :NldsTentative, :NldsDuplicate, :NldsDeprecated, :NldsPreferred, :IpDadStateInvalid, :IpDadStateTentative, :IpDadStateDuplicate, :IpDadStateDeprecated, :IpDadStatePreferred ) IF_CONNECTION_TYPE = enum( :NET_IF_CONNECTION_DEDICATED, 1, :NET_IF_CONNECTION_PASSIVE, :NET_IF_CONNECTION_DEMAND, :NET_IF_CONNECTION_MAXIMUM ) TUNNEL_TYPE = enum( :TUNNEL_TYPE_NONE, 0, :TUNNEL_TYPE_OTHER, :TUNNEL_TYPE_DIRECT, :TUNNEL_TYPE_6TO4, :TUNNEL_TYPE_ISATAP, :TUNNEL_TYPE_TEREDO, :TUNNEL_TYPE_IPHTTPS ) end class IpAdapterUnicastAddressXPUnionStruct < FFI::Struct layout( :Length, :win32_ulong, :Flags, :dword ) end class IpAdapterUnicastAddressXPUnion < FFI::Union layout( :Aligment, :ulong_long, :Struct, IpAdapterUnicastAddressXPUnionStruct ) end class IpAdapterUnicastAddressLH < FFI::Struct layout( :Union, IpAdapterUnicastAddressXPUnion, :Next, :pointer, :Address, SocketAddress, :PrefixOrigin, Enums::IP_PREFIX_ORIGIN, :SuffixOrigin, Enums::IP_SUFFIX_ORIGIN, :DadState, Enums::IP_DAD_STATE, :ValidLifetime, :win32_ulong, :PreferredLifetime, :win32_ulong, :LeaseLifetime, :win32_ulong, :OnLinkPrefixLength, :uint8 ) end class AdapterAddressStruct < FFI::Struct layout( :Length, :win32_ulong, :IfIndex, :dword ) end class AdapterAddressAligmentUnion < FFI::Union layout( :Aligment, :uint64, :Struct, AdapterAddressStruct ) end class IpAdapterAddressesLh < FFI::Struct layout( :Union, AdapterAddressAligmentUnion, :Next, :pointer, :AdapterName, :pointer, :FirstUnicastAddress, :pointer, :FirstAnycastAddress, :pointer, :FirstMulticastAddress, :pointer, :FirstDnsServerAddress, :pointer, :DnsSuffix, :pointer, :Description, :pointer, :FriendlyName, :pointer, :PhysicalAddress, [:uchar, MAX_ADAPTER_ADDRESS_LENGTH], :PhysicalAddressLength, :win32_ulong, :Flags, :win32_ulong, :Mtu, :win32_ulong, :IfType, :dword, :OperStatus, :uint8, :Ipv6IfIndex, :dword, :ZoneIndices, [:win32_ulong, 16], :FirstPrefix, :pointer, :TransmitLinkSpeed, :ulong_long, :ReceiveLinkSpeed, :ulong_long, :FirstWinsServerAddress, :pointer, :FirstGatewayAddress, :pointer, :Ipv4Metric, :win32_ulong, :Ipv6Metric, :win32_ulong, :Luid, :ulong_long, :Dhcpv4Server, SocketAddress, :CompartmentId, :uint32, # https://github.com/tpn/winsdk-10/blob/master/Include/10.0.14393.0/shared/ifdef.h :NetworkGuid, [:uint8, 16], # https://docs.microsoft.com/en-us/windows/win32/api/guiddef/ns-guiddef-guid :ConnectionType, Enums::IF_CONNECTION_TYPE, :TunnelType, Enums::TUNNEL_TYPE, :Dhcpv6Server, SocketAddress, :Dhcpv6ClientDuid, [:uchar, MAX_DHCPV6_DUID_LENGTH], :Dhcpv6ClientDuidLength, :win32_ulong, :Dhcpv6Iaid, :win32_ulong, :FirstDnsSuffix, :pointer ) end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/ffi/kernel_ffi.rb000066400000000000000000000005211470204764400266520ustar00rootroot00000000000000# frozen_string_literal: true require_relative '../../../../facter/resolvers/windows/ffi/ffi' require_relative '../../../../facter/resolvers/windows/ffi/os_version_info_ex' module KernelFFI extend FFI::Library ffi_convention :stdcall ffi_lib :ntdll attach_function :RtlGetVersion, [:pointer], :int32 STATUS_SUCCESS = 0 end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/ffi/memory_ffi.rb000066400000000000000000000005211470204764400267020ustar00rootroot00000000000000# frozen_string_literal: true require_relative '../../../../facter/resolvers/windows/ffi/ffi' require_relative '../../../../facter/resolvers/windows/ffi/performance_information' module MemoryFFI extend FFI::Library ffi_convention :stdcall ffi_lib :psapi attach_function :GetPerformanceInfo, %i[pointer dword], :win32_bool end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/ffi/network_utils.rb000066400000000000000000000023071470204764400274630ustar00rootroot00000000000000# frozen_string_literal: true class NetworkUtils @log = Facter::Log.new(self) class << self def address_to_string(addr) return if addr[:lpSockaddr] == FFI::Pointer::NULL size = FFI::MemoryPointer.new(NetworkingFFI::INET6_ADDRSTRLEN + 1) buffer = FFI::MemoryPointer.new(:wchar, NetworkingFFI::INET6_ADDRSTRLEN + 1) error = nil 3.times do error = NetworkingFFI::WSAAddressToStringW(addr[:lpSockaddr], addr[:iSockaddrLength], FFI::Pointer::NULL, buffer, size) break if error.zero? end unless error.zero? @log.debug 'address to string translation failed!' return end extract_address(buffer) end def extract_address(addr) addr.read_wide_string_without_length.split('%').first end def ignored_ip_address(addr) addr.empty? || addr.start_with?('127.', '169.254.') || addr.start_with?('fe80') || addr.eql?('::1') end def find_mac_address(adapter) adapter[:PhysicalAddress].first(adapter[:PhysicalAddressLength]) .map { |e| format('%02x', mac_address: e.to_i) }.join(':').upcase end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/ffi/networking_ffi.rb000066400000000000000000000017051470204764400275660ustar00rootroot00000000000000# frozen_string_literal: true require_relative '../../../../facter/resolvers/windows/ffi/ffi' require_relative '../../../../facter/resolvers/windows/ffi/network_utils' require_relative '../../../../facter/resolvers/windows/ffi/ip_adapter_addresses_lh' module NetworkingFFI extend FFI::Library ffi_convention :stdcall ffi_lib :iphlpapi attach_function :GetAdaptersAddresses, %i[uint32 uint32 pointer pointer pointer], :dword ffi_convention :stdcall ffi_lib :ws2_32 attach_function :WSAAddressToStringW, %i[pointer dword pointer pointer pointer], :int32 AF_UNSPEC = 0 GAA_FLAG_SKIP_ANYCAST = 2 GAA_FLAG_SKIP_MULTICAST = 4 GAA_FLAG_SKIP_DNS_SERVER = 8 BUFFER_LENGTH = 15_000 ERROR_SUCCES = 0 ERROR_BUFFER_OVERFLOW = 111 ERROR_NO_DATA = 232 IF_OPER_STATUS_UP = 1 IF_OPER_STATUS_DOWN = 2 IF_TYPE_ETHERNET_CSMACD = 6 IF_TYPE_IEEE80211 = 71 IP_ADAPTER_DHCP_ENABLED = 4 INET6_ADDRSTRLEN = 46 AF_INET = 2 AF_INET6 = 23 end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/ffi/os_version_info_ex.rb000066400000000000000000000006661470204764400304550ustar00rootroot00000000000000# frozen_string_literal: true class OsVersionInfoEx < FFI::Struct layout( :dwOSVersionInfoSize, :win32_ulong, :dwMajorVersion, :win32_ulong, :dwMinorVersion, :win32_ulong, :dwBuildNumber, :win32_ulong, :dwPlatformId, :win32_ulong, :szCSDVersion, [:wchar, 128], :wServicePackMajor, :ushort, :wServicePackMinor, :ushort, :wSuiteMask, :ushort, :wProductType, :uchar, :wReserved, :uchar ) end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/ffi/performance_information.rb000066400000000000000000000007201470204764400314550ustar00rootroot00000000000000# frozen_string_literal: true class PerformanceInformation < FFI::Struct layout( :cb, :dword, :CommitTotal, :size_t, :CommitLimit, :size_t, :CommitPeak, :size_t, :PhysicalTotal, :size_t, :PhysicalAvailable, :size_t, :SystemCache, :size_t, :KernelTotal, :size_t, :KernelPaged, :size_t, :KernelNonpaged, :size_t, :PageSize, :size_t, :HandleCount, :dword, :ProcessCount, :dword, :ThreadCount, :dword ) end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/ffi/system32_ffi.rb000066400000000000000000000006051470204764400270660ustar00rootroot00000000000000# frozen_string_literal: true require_relative '../../../../facter/resolvers/windows/ffi/ffi' module System32FFI extend FFI::Library ffi_convention :stdcall ffi_lib :kernel32 attach_function :IsWow64Process, %i[handle pointer], :win32_bool ffi_convention :stdcall ffi_lib :kernel32 attach_function :GetCurrentProcess, [], :handle CSIDL_WINDOWS = 0x0024 H_OK = 0 end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/ffi/system_info.rb000066400000000000000000000012201470204764400271020ustar00rootroot00000000000000# frozen_string_literal: true class DummyStructName < FFI::Struct layout( :wProcessorArchitecture, :word, :wReserved, :word ) end class DummyUnionName < FFI::Union layout( :dwOemId, :dword, :dummystructname, DummyStructName ) end class SystemInfo < FFI::Struct layout( :dummyunionname, DummyUnionName, :dwPageSize, :dword, :lpMinimumApplicationAddress, :pointer, :lpMaximumApplicationAddress, :pointer, :dwActiveProcessorMask, :pdword, :dwNumberOfProcessors, :dword, :dwProcessorType, :dword, :dwAllocationGranularity, :dword, :wProcessorLevel, :word, :wProcessorRevision, :word ) end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/ffi/winnls_ffi.rb000066400000000000000000000003371470204764400267110ustar00rootroot00000000000000# frozen_string_literal: true require_relative '../../../../facter/resolvers/windows/ffi/ffi' module WinnlsFFI extend FFI::Library ffi_convention :stdcall ffi_lib :kernel32 attach_function :GetACP, [], :uint end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/fips.rb000066400000000000000000000015001470204764400247410ustar00rootroot00000000000000# frozen_string_literal: true require 'win32/registry' module Facter module Resolvers module Windows class Fips < BaseResolver # :fips_enabled init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_fact_from_registry(fact_name) } end def read_fact_from_registry(fact_name) reg = ::Win32::Registry::HKEY_LOCAL_MACHINE .open('System\\CurrentControlSet\\Control\\Lsa\\FipsAlgorithmPolicy') @fact_list[:fips_enabled] = reg['Enabled'] != 0 if reg.any? { |name, _value| name == 'Enabled' } reg.close @fact_list[:fips_enabled] ||= false @fact_list[fact_name] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/hardware_architecture.rb000066400000000000000000000036261470204764400303520ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class HardwareArchitecture < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_hardware_information(fact_name) } end def read_hardware_information(fact_name) require_relative '../../../facter/resolvers/windows/ffi/hardware_ffi' sys_info_ptr = FFI::MemoryPointer.new(SystemInfo.size) HardwareFFI::GetNativeSystemInfo(sys_info_ptr) sys_info = SystemInfo.new(sys_info_ptr) hard = determine_hardware(sys_info) arch = determine_architecture(hard) build_facts_list(hardware: hard, architecture: arch) @fact_list[fact_name] rescue LoadError => e log.debug("The ffi gem has not been installed: #{e}") end def determine_hardware(sys_info) union = sys_info[:dummyunionname] struct = union[:dummystructname] case struct[:wProcessorArchitecture] when HardwareFFI::PROCESSOR_ARCHITECTURE_AMD64 'x86_64' when HardwareFFI::PROCESSOR_ARCHITECTURE_ARM 'arm' when HardwareFFI::PROCESSOR_ARCHITECTURE_IA64 'ia64' when HardwareFFI::PROCESSOR_ARCHITECTURE_INTEL family = sys_info[:wProcessorLevel] > 5 ? 6 : sys_info[:wProcessorLevel] "i#{family}86" else 'unknown' end end def determine_architecture(hardware) case hardware when /i[3456]86/ 'x86' when 'x86_64' 'x64' else hardware end end def build_facts_list(facts) @fact_list[:hardware] = facts[:hardware] @fact_list[:architecture] = facts[:architecture] end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/identity.rb000066400000000000000000000030411470204764400256330ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Identity < BaseResolver NAME_SAM_COMPATIBLE = 2 init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { retrieve_facts(fact_name) } end def find_username require_relative '../../../facter/resolvers/windows/ffi/identity_ffi' size_ptr = FFI::MemoryPointer.new(:win32_ulong, 1) IdentityFFI::GetUserNameExW(NAME_SAM_COMPATIBLE, FFI::Pointer::NULL, size_ptr) if FFI.errno != ERROR_MORE_DATA @log.debug "failure resolving identity facts: #{FFI.errno}" return end name_ptr = FFI::MemoryPointer.new(:wchar, size_ptr.read_uint32) if IdentityFFI::GetUserNameExW(NAME_SAM_COMPATIBLE, name_ptr, size_ptr) == FFI::WIN32FALSE @log.debug "failure resolving identity facts: #{FFI.errno}" return end { user: name_ptr.read_wide_string_with_length(size_ptr.read_uint32), privileged: IdentityFFI.privileged? } rescue LoadError => e @log.debug("Could not find username: #{e}") end def retrieve_facts(fact_name) result = find_username return unless result build_fact_list(result) @fact_list[fact_name] end def build_fact_list(facts) @fact_list[:user] = facts[:user] @fact_list[:privileged] = facts[:privileged] end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/kernel.rb000066400000000000000000000025041470204764400252650ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Kernel < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_os_version_information(fact_name) } end def read_os_version_information(fact_name) require_relative '../../../facter/resolvers/windows/ffi/kernel_ffi' ver_ptr = FFI::MemoryPointer.new(OsVersionInfoEx.size) ver = OsVersionInfoEx.new(ver_ptr) ver[:dwOSVersionInfoSize] = OsVersionInfoEx.size if KernelFFI::RtlGetVersion(ver_ptr) != KernelFFI::STATUS_SUCCESS @log.debug 'Calling Windows RtlGetVersion failed' return end result = { major: ver[:dwMajorVersion], minor: ver[:dwMinorVersion], build: ver[:dwBuildNumber] } build_facts_list(result) @fact_list[fact_name] rescue LoadError => e @log.debug("Could not get OS version information: #{e}") end def build_facts_list(result) @fact_list[:kernelversion] = "#{result[:major]}.#{result[:minor]}.#{result[:build]}" @fact_list[:kernelmajorversion] = "#{result[:major]}.#{result[:minor]}" @fact_list[:kernel] = 'windows' end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/memory.rb000066400000000000000000000042031470204764400253130ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Memory < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { validate_info(fact_name) } end def read_performance_information require_relative '../../../facter/resolvers/windows/ffi/memory_ffi' state_ptr = FFI::MemoryPointer.new(PerformanceInformation.size) if MemoryFFI::GetPerformanceInfo(state_ptr, state_ptr.size) == FFI::WIN32FALSE @log.debug 'Resolving memory facts failed' return end # we need to enlarge the scope of this pointer so that Ruby GC will not free the memory. # If the pointer if freed, Lifreq structures will contain garbage from memory. @long_living_pointer = state_ptr PerformanceInformation.new(state_ptr) rescue LoadError => e @log.debug("Could not resolve memory facts: #{e}") end def calculate_memory state = read_performance_information return unless state total_bytes = state[:PhysicalTotal] * state[:PageSize] available_bytes = state[:PhysicalAvailable] * state[:PageSize] if total_bytes.zero? || available_bytes.zero? @log.debug 'Available or Total bytes are zero could not proceed further' return end { total_bytes: total_bytes, available_bytes: available_bytes, used_bytes: total_bytes - available_bytes } end def validate_info(fact_name) result = calculate_memory return unless result build_facts_list(result) @fact_list[fact_name] end def build_facts_list(result) @fact_list[:total_bytes] = result[:total_bytes] @fact_list[:available_bytes] = result[:available_bytes] @fact_list[:used_bytes] = result[:used_bytes] @fact_list[:capacity] = format( '%.2f%%', capacity: (result[:used_bytes] / result[:total_bytes].to_f * 100) ) end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/netkvm.rb000066400000000000000000000014531470204764400253130ustar00rootroot00000000000000# frozen_string_literal: true require 'win32/registry' module Facter module Resolvers class NetKVM < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_fact_from_registry(fact_name) } end def read_fact_from_registry(fact_name) reg = ::Win32::Registry::HKEY_LOCAL_MACHINE.open('SYSTEM\\CurrentControlSet\\Services') build_fact_list(reg) reg.close @fact_list[fact_name] end def build_fact_list(reg) # rubocop:disable Performance/InefficientHashSearch @fact_list[:kvm] = reg.keys.include?('netkvm') # rubocop:enable Performance/InefficientHashSearch end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/networking.rb000066400000000000000000000140321470204764400261730ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Windows class Networking < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_network_information(fact_name) } end def read_network_information(fact_name) require_relative '../../../facter/resolvers/windows/ffi/networking_ffi' size_ptr = FFI::MemoryPointer.new(NetworkingFFI::BUFFER_LENGTH) adapter_addresses = FFI::MemoryPointer.new(IpAdapterAddressesLh.size, NetworkingFFI::BUFFER_LENGTH) flags = NetworkingFFI::GAA_FLAG_SKIP_ANYCAST | NetworkingFFI::GAA_FLAG_SKIP_MULTICAST | NetworkingFFI::GAA_FLAG_SKIP_DNS_SERVER return unless (adapter_addresses = get_adapter_addresses(size_ptr, adapter_addresses, flags)) retrieve_domain_from_registry iterate_list(adapter_addresses) Facter::Util::Resolvers::Networking.expand_main_bindings(@fact_list) @fact_list[fact_name] rescue LoadError => e @log.debug("The ffi gem has not been installed: #{e}") end def get_adapter_addresses(size_ptr, adapter_addresses, flags) error = nil 3.times do error = NetworkingFFI::GetAdaptersAddresses(NetworkingFFI::AF_UNSPEC, flags, FFI::Pointer::NULL, adapter_addresses, size_ptr) break if error == NetworkingFFI::ERROR_SUCCES if error == NetworkingFFI::ERROR_BUFFER_OVERFLOW adapter_addresses = FFI::MemoryPointer.new(IpAdapterAddressesLh.size, NetworkingFFI::BUFFER_LENGTH) else @log.debug 'Unable to retrieve networking facts!' return nil end end return nil unless error.zero? adapter_addresses end def adapter_down?(adapter) adapter[:OperStatus] != NetworkingFFI::IF_OPER_STATUS_UP || ![NetworkingFFI::IF_TYPE_ETHERNET_CSMACD, NetworkingFFI::IF_TYPE_IEEE80211].include?(adapter[:IfType]) end def retrieve_dhcp_server(adapter) if !(adapter[:Flags] & NetworkingFFI::IP_ADAPTER_DHCP_ENABLED).zero? && adapter[:Union][:Struct][:Length] >= IpAdapterAddressesLh.size NetworkUtils.address_to_string(adapter[:Dhcpv4Server]) end end def iterate_list(adapter_addresses) net_interface = {} IpAdapterAddressesLh.read_list(adapter_addresses) do |adapter_address| if adapter_down?(adapter_address) adapter_address = IpAdapterAddressesLh.new(adapter_address[:Next]) next end if !@fact_list[:domain] || @fact_list[:domain].empty? @fact_list[:domain] = adapter_address[:DnsSuffix] .read_wide_string_without_length(replace_invalid_chars: true) end name = adapter_address[:FriendlyName].read_wide_string_without_length(replace_invalid_chars: true) net_interface[name] = build_interface_info(adapter_address, name) end @fact_list[:interfaces] = net_interface unless net_interface.empty? end def build_interface_info(adapter_address, name) hash = {} hash[:dhcp] = retrieve_dhcp_server(adapter_address) hash[:mtu] = adapter_address[:Mtu] bindings = find_ip_addresses(adapter_address[:FirstUnicastAddress], name) hash[:bindings] = bindings[:ipv4] unless bindings[:ipv4].empty? hash[:bindings6] = bindings[:ipv6] unless bindings[:ipv6].empty? hash[:mac] = NetworkUtils.find_mac_address(adapter_address) hash end def find_ip_addresses(unicast_addresses, name) bindings = {} bindings[:ipv6] = [] bindings[:ipv4] = [] IpAdapterUnicastAddressLH.read_list(unicast_addresses) do |unicast| addr = NetworkUtils.address_to_string(unicast[:Address]) unless addr unicast = IpAdapterUnicastAddressLH.new(unicast[:Next]) next end sock_addr = SockAddr.new(unicast[:Address][:lpSockaddr]) add_ip_data(addr, unicast, sock_addr, bindings) find_primary_interface(sock_addr, name, addr) end bindings end def add_ip_data(addr, unicast, sock_addr, bindings) result = find_bindings(sock_addr, unicast, addr) return unless result bindings[:ipv6] << result if sock_addr[:sa_family] == NetworkingFFI::AF_INET6 bindings[:ipv4] << result if sock_addr[:sa_family] == NetworkingFFI::AF_INET end def find_bindings(sock_addr, unicast, addr) return unless [NetworkingFFI::AF_INET, NetworkingFFI::AF_INET6].include?(sock_addr[:sa_family]) Facter::Util::Resolvers::Networking.build_binding(addr, unicast[:OnLinkPrefixLength]) end def find_primary_interface(sock_addr, name, addr) if !@fact_list[:primary_interface] && ([NetworkingFFI::AF_INET, NetworkingFFI::AF_INET6].include?(sock_addr[:sa_family]) && !::Facter::Util::Resolvers::Networking.ignored_ip_address(addr)) @fact_list[:primary_interface] = name.to_s end end def retrieve_domain_from_registry ::Win32::Registry::HKEY_LOCAL_MACHINE.open( 'SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters' ) do |key| domain = key['Domain'] @fact_list[:domain] = domain if domain end rescue Win32::Registry::Error @log.debug('Could not read TCPIP Parameters from registry') nil end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/processors.rb000066400000000000000000000063311470204764400262110ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Processors < BaseResolver init_resolver class << self # Count # Isa # Models # PhysicalCount private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_fact_from_win32_processor(fact_name) } end def read_fact_from_win32_processor(fact_name) win = Facter::Util::Windows::Win32Ole.new query_string = 'SELECT Name,'\ 'Architecture,'\ 'NumberOfLogicalProcessors,'\ 'NumberOfCores FROM Win32_Processor' proc = win.exec_query(query_string) unless proc log.debug 'WMI query returned no results'\ 'for Win32_Processor with values Name, Architecture and NumberOfLogicalProcessors.' return end result = iterate_proc(proc) cores_threads = calculate_cores_threads(proc, result) build_fact_list(result, cores_threads) @fact_list[fact_name] end def iterate_proc(result) models = [] isa = nil logical_count = 0 result.each do |proc| models << proc.Name logical_count += proc.NumberOfLogicalProcessors if proc.NumberOfLogicalProcessors isa ||= find_isa(proc.Architecture) end { models: models, isa: isa, logical_count: logical_processors_count(logical_count, models.count) } end def calculate_cores_threads(result_proc, data_proc) cores = 0 threads_per_core = 0 result_proc.each do |proc| cores = proc.NumberOfCores threads_per_core = if check_hyperthreading(data_proc[:logical_count], cores) || cores > data_proc[:logical_count] 1 else data_proc[:logical_count] / (cores * data_proc[:models].size) end end { cores_per_socket: cores, threads_per_core: threads_per_core } end def check_hyperthreading(cores, logical_processors) cores == logical_processors end def find_isa(arch) architecture_hash = { 0 => 'x86', 1 => 'MIPS', 2 => 'Alpha', 3 => 'PowerPC', 5 => 'ARM', 6 => 'Itanium', 9 => 'x64' } isa = architecture_hash[arch] return isa if isa log.debug 'Unable to determine processor type: unknown architecture' end def logical_processors_count(logical_count, models_count) if logical_count.zero? models_count else logical_count end end def build_fact_list(result, cores_threads) @fact_list[:count] = result[:logical_count] @fact_list[:isa] = result[:isa] @fact_list[:models] = result[:models] @fact_list[:physicalcount] = result[:models].size @fact_list[:cores_per_socket] = cores_threads[:cores_per_socket] @fact_list[:threads_per_core] = cores_threads[:threads_per_core] end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/product_release.rb000066400000000000000000000023121470204764400271620ustar00rootroot00000000000000# frozen_string_literal: true require 'win32/registry' module Facter module Resolvers class ProductRelease < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_fact_from_registry(fact_name) } end def read_fact_from_registry(fact_name) reg = ::Win32::Registry::HKEY_LOCAL_MACHINE.open('SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion') build_fact_list(reg) reg.close @fact_list[fact_name] end def build_fact_list(reg) reg.each do |name, _type, value| case name when 'EditionID' @fact_list[:edition_id] = value when 'InstallationType' @fact_list[:installation_type] = value when 'ProductName' @fact_list[:product_name] = value when 'DisplayVersion' @fact_list[:release_id] = value @fact_list[:display_version] = value when 'ReleaseId' @fact_list[:release_id] = value unless @fact_list[:release_id] end end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/ssh.rb000066400000000000000000000024161470204764400246040ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Windows class Ssh < BaseResolver init_resolver FILE_NAMES = %w[ssh_host_rsa_key.pub ssh_host_dsa_key.pub ssh_host_ecdsa_key.pub ssh_host_ed25519_key.pub].freeze class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { retrieve_info(fact_name) } end def retrieve_info(fact_name) ssh_dir = determine_ssh_dir return unless ssh_dir && File.directory?(ssh_dir) ssh_list = [] FILE_NAMES.each do |file_name| output = Facter::Util::FileHelper.safe_read(File.join(ssh_dir, file_name)) next if output.empty? key_type, key = output.split(' ') ssh_list << Facter::Util::Resolvers::SshHelper.create_ssh(key_type, key) end @fact_list[:ssh] = ssh_list.empty? ? nil : ssh_list @fact_list[fact_name] end def determine_ssh_dir progdata_dir = ENV['programdata'] return if !progdata_dir || progdata_dir.empty? File.join(progdata_dir, 'ssh') end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/system32.rb000066400000000000000000000023631470204764400255010ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class System32 < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { retrieve_windows_binaries_path } end def retrieve_windows_binaries_path require_relative '../../../facter/resolvers/windows/ffi/system32_ffi' windows_path = ENV['SystemRoot'] if !windows_path || windows_path.empty? @log.debug 'Unable to find correct value for SystemRoot enviroment variable' return nil end bool_ptr = FFI::MemoryPointer.new(:win32_bool, 1) if System32FFI::IsWow64Process(System32FFI::GetCurrentProcess(), bool_ptr) == FFI::WIN32FALSE @log.debug 'IsWow64Process failed' return end @fact_list[:system32] = construct_path(bool_ptr, windows_path) rescue LoadError => e @log.debug("Could not retrieve: #{e}") end def construct_path(bool_ptr, windows) if bool_ptr.read_win32_bool "#{windows}\\sysnative" else "#{windows}\\system32" end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/timezone.rb000066400000000000000000000022731470204764400256420ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Windows class Timezone < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { determine_timezone } end def determine_timezone timezone = Time.now.zone @fact_list[:timezone] = timezone.force_encoding("CP#{codepage}").encode('UTF-8', invalid: :replace) rescue ArgumentError @fact_list[:timezone] = timezone end def codepage result = codepage_from_api result&.empty? ? codepage_from_registry : result end def codepage_from_registry require 'win32/registry' ::Win32::Registry::HKEY_LOCAL_MACHINE.open('SYSTEM\CurrentControlSet\Control\Nls\CodePage')['ACP'] end def codepage_from_api require_relative '../../../facter/resolvers/windows/ffi/winnls_ffi' WinnlsFFI.GetACP.to_s rescue LoadError => e log.debug("Could not retrieve codepage: #{e}") end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/uptime.rb000066400000000000000000000032721470204764400253130ustar00rootroot00000000000000# frozen_string_literal: true require 'date' module Facter module Resolvers module Windows class Uptime < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { calculate_system_uptime(fact_name) } end def subtract_system_uptime_from_ole win = Facter::Util::Windows::Win32Ole.new opsystem = win.return_first('SELECT LocalDateTime,LastBootUpTime FROM Win32_OperatingSystem') unless opsystem @log.debug 'WMI query returned no results'\ 'for Win32_OperatingSystem with values LocalDateTime and LastBootUpTime.' return end local_time = opsystem.LocalDateTime last_bootup = opsystem.LastBootUpTime return DateTime.parse(local_time).to_time - DateTime.parse(last_bootup).to_time if local_time && last_bootup nil end def calculate_system_uptime(fact_name) seconds = subtract_system_uptime_from_ole&.to_i if !seconds || seconds.negative? @log.debug 'Unable to determine system uptime!' return end @fact_list = Facter::Util::Resolvers::UptimeHelper.create_uptime_hash(seconds) @fact_list[fact_name] end def build_fact_list(system_uptime) @fact_list[:days] = system_uptime[:days] @fact_list[:hours] = system_uptime[:hours] @fact_list[:seconds] = system_uptime[:seconds] @fact_list[:uptime] = system_uptime[:uptime] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/virtualization.rb000066400000000000000000000042621470204764400270740ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers module Windows class Virtualization < BaseResolver init_resolver class << self # Virtual # Is_Virtual MODEL_HASH = { 'VirtualBox' => 'virtualbox', 'VMware' => 'vmware', 'KVM' => 'kvm', 'Bochs' => 'bochs', 'Google' => 'gce', 'OpenStack' => 'openstack', 'AHV' => 'ahv' }.freeze private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_fact_from_computer_system(fact_name) } end def read_fact_from_computer_system(fact_name) win = Facter::Util::Windows::Win32Ole.new comp = win.exec_query('SELECT Manufacturer,Model,OEMStringArray FROM Win32_ComputerSystem') unless comp @log.debug 'WMI query returned no results for Win32_ComputerSystem with values'\ ' Manufacturer, Model and OEMStringArray.' return end build_fact_list(comp) @fact_list[fact_name] end def determine_hypervisor_by_model(comp) MODEL_HASH[MODEL_HASH.keys.find { |key| comp.Model =~ /^#{key}/ }] end def determine_hypervisor_by_manufacturer(comp) manufacturer = comp.Manufacturer if comp.Model =~ /^Virtual Machine/ && manufacturer =~ /^Microsoft/ 'hyperv' elsif /^Xen/.match?(manufacturer) 'xen' elsif /^Amazon EC2/.match?(manufacturer) 'kvm' else 'physical' end end def build_fact_list(comp) @fact_list[:oem_strings] = [] @fact_list[:oem_strings] += comp.to_enum.map(&:OEMStringArray).flatten comp = comp.to_enum.first hypervisor = determine_hypervisor_by_model(comp) || determine_hypervisor_by_manufacturer(comp) @fact_list[:virtual] = hypervisor @fact_list[:is_virtual] = hypervisor.include?('physical') ? false : true end end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/windows/win_os_description.rb000066400000000000000000000016031470204764400277050ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class WinOsDescription < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_from_ole(fact_name) } end def read_from_ole(fact_name) win = Facter::Util::Windows::Win32Ole.new op_sys = win.return_first('SELECT ProductType,OtherTypeDescription FROM Win32_OperatingSystem') unless op_sys @log.debug 'WMI query returned no results for Win32_OperatingSystem'\ 'with values ProductType and OtherTypeDescription.' return end @fact_list[:consumerrel] = (op_sys.ProductType == 1) @fact_list[:description] = op_sys.OtherTypeDescription @fact_list[fact_name] end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/wpar.rb000066400000000000000000000015461470204764400232710ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Wpar < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_wpar(fact_name) } end def read_wpar(fact_name) output = Facter::Core::Execution.execute('/usr/bin/lparstat -W', logger: log) return if output.empty? output.each_line do |line| populate_wpar_data(line.split(':').map(&:strip)) end @fact_list[fact_name] end def populate_wpar_data(key_value) @fact_list[:wpar_key] = key_value[1].to_i if key_value[0] == 'WPAR Key' @fact_list[:wpar_configured_id] = key_value[1].to_i if key_value[0] == 'WPAR Configured ID' end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/xen.rb000066400000000000000000000037501470204764400231110ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Xen < BaseResolver init_resolver XEN_PATH = '/proc/xen/capabilities' XEN_TOOLSTACK = '/usr/lib/xen-common/bin/xen-toolstack' XEN_COMMANDS = ['/usr/sbin/xl', '/usr/sbin/xm'].freeze class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { detect_xen(fact_name) } end def detect_xen(fact_name) @fact_list[:vm] = detect_xen_type @fact_list[:privileged] = privileged?(@fact_list[:vm]) @fact_list[:domains] = detect_domains @fact_list[fact_name] end def detect_xen_type xen_type = 'xen0' if File.exist?('/dev/xen/evtchn') if !xen_type && (File.exist?('/proc/xen') || (File.exist?('/dev/xvda1') && !File.symlink?('/dev/xvda1'))) xen_type = 'xenu' end xen_type end def privileged?(xen_type) content = Facter::Util::FileHelper.safe_read(XEN_PATH, nil) content&.strip == 'control_d' || xen_type == 'xen0' end def detect_domains domains = [] xen_command = find_command return unless xen_command output = Facter::Core::Execution.execute("#{xen_command} list", logger: log) return if output.empty? output.each_line do |line| next if /Domain-0|Name/.match?(line) domain = line.match(/^([^\s]*)\s/) domain = domain&.captures&.first domains << domain if domain end domains end def find_command num_stacks = 0 XEN_COMMANDS.each do |command| num_stacks += 1 if File.exist?(command) end return XEN_TOOLSTACK if num_stacks > 1 && File.exist?(XEN_TOOLSTACK) XEN_COMMANDS.each { |command| return command if File.exist?(command) } nil end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/zfs.rb000066400000000000000000000013571470204764400231220ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class ZFS < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { zfs_fact(fact_name) } end def zfs_fact(fact_name) build_zfs_facts @fact_list[fact_name] end def build_zfs_facts output = Facter::Core::Execution.execute('zfs upgrade -v', logger: log) features_list = output.scan(/^\s+(\d+)/).flatten return if features_list.empty? @fact_list[:zfs_featurenumbers] = features_list.join(',') @fact_list[:zfs_version] = features_list.last end end end end end puppetlabs-facter-dfe6df4/lib/facter/resolvers/zpool.rb000066400000000000000000000017201470204764400234550ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Resolvers class Zpool < BaseResolver init_resolver class << self private def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { zpool_fact(fact_name) } end def zpool_fact(fact_name) build_zpool_facts @fact_list[fact_name] end def build_zpool_facts output = Facter::Core::Execution.execute('zpool upgrade -v', logger: log) features_list = output.scan(/^\s+(\d+)/).flatten features_flags = output.scan(/^([a-z0-9_]+)[[:blank:]]*(\(read-only compatible\))?$/).map(&:first) return if features_list.empty? @fact_list[:zpool_featurenumbers] = features_list.join(',') @fact_list[:zpool_featureflags] = features_flags.join(',') @fact_list[:zpool_version] = features_flags.any? ? '5000' : features_list.last end end end end end puppetlabs-facter-dfe6df4/lib/facter/templates/000077500000000000000000000000001470204764400217375ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/templates/man.erb000066400000000000000000000063571470204764400232170ustar00rootroot00000000000000<%# encoding: UTF-8%> facter - collect and display facts about the current system =========================================================== SYNOPSIS -------- facter [options] [query] [query] [...] DESCRIPTION ----------- facter is a command-line tool that gathers basic facts about nodes (systems) such as hardware details, network settings, OS type and version, and more. These facts are made available as variables in your Puppet manifests and can be used to inform conditional expressions in Puppet. If no queries are given, then all facts will be returned. Many of the command line options can also be set via the HOCON config file. This file can also be used to block or cache certain fact groups. OPTIONS ------- <% Facter::Cli.class_options.each do |name, option| -%><% next if option.hide%> * `<%= option.aliases[0] + '`, `' if option.aliases.any? %>--<%= 'no-' if negate_options.include?(name.to_s)%><%= name.to_s.gsub('_','-') %>`: <%= option.description %> <% end -%> <% Facter::Cli.commands.select { |_k, command_class| command_class.instance_of?(Thor::Command) }.each do |_, command| -%> * `<%= command.usage %>`: <%= command.description %> <% end -%> FILES ----- /etc/puppetlabs/facter/facter.conf A HOCON config file that can be used to specify directories for custom and external facts, set various command line options, and specify facts to block. See example below for details, or visit the [GitHub README](https://github.com/puppetlabs/puppetlabs-hocon#overview). EXAMPLES -------- Display all facts: ``` $ facter disks => { sda => { model => "Virtual disk", size => "8.00 GiB", size_bytes => 8589934592, vendor => "ExampleVendor" } } dmi => { bios => { release_date => "06/23/2013", vendor => "Example Vendor", version => "6.00" } } [...] ``` Display a single structured fact: ``` $ facter processors { count => 2, isa => "x86_64", models => [ "Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz", "Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz" ], physicalcount => 2 } ``` Display a single fact nested within a structured fact: ``` $ facter processors.isa x86_64 ``` Display a single legacy fact. Note that non-structured facts existing in previous versions of Facter are still available, but are not displayed by default due to redundancy with newer structured facts: ``` $ facter processorcount 2 ``` Format facts as JSON: ``` $ facter --json os.name os.release.major processors.isa { "os.name": "Ubuntu", "os.release.major": "14.04", "processors.isa": "x86_64" } ``` An example config file. ``` # always loaded (CLI and as Ruby module) global : { external-dir : "~/external/facts", custom-dir : [ "~/custom/facts", "~/custom/facts/more-facts" ], no-external-facts : false, no-custom-facts : false, no-ruby : false } # loaded when running from the command line cli : { debug : false, trace : true, verbose : false, log-level : "info" } # always loaded, fact-specific configuration facts : { # for valid blocklist entries, use --list-block-groups blocklist : [ "file system", "EC2" ], # for valid time-to-live entries, use --list-cache-groups ttls : [ { "timezone" : 30 days } ] } ``` puppetlabs-facter-dfe6df4/lib/facter/util/000077500000000000000000000000001470204764400207165ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/util/aix/000077500000000000000000000000001470204764400214775ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/util/aix/info_extractor.rb000066400000000000000000000037361470204764400250630ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Util module Aix module InfoExtractor MEGABYTES_EXPONENT = 1024**2 GIGABYTES_EXPONENT = 1024**3 PROPERTIES = { lslv: [ 'LOGICAL VOLUME:', 'VOLUME GROUP:', 'LV IDENTIFIER:', 'PERMISSION:', 'VG STATE:', 'LV STATE:', 'TYPE:', 'WRITE VERIFY:', 'MAX LPs:', 'PP SIZE:', 'COPIES:', 'SCHED POLICY:', 'LPs:', 'PPs:', 'STALE PPs:', 'BB POLICY:', 'INTER-POLICY:', 'RELOCATABLE:', 'INTRA-POLICY:', 'UPPER BOUND:', 'MOUNT POINT:', 'LABEL:', 'MIRROR WRITE CONSISTENCY:', 'EACH LP COPY ON A SEPARATE PV ?:', 'Serialize IO ?:' ], lspv: [ 'PHYSICAL VOLUME:', 'VOLUME GROUP:', 'PV IDENTIFIER:', 'VG IDENTIFIER', 'PV STATE:', 'STALE PARTITIONS:', 'ALLOCATABLE:', 'PP SIZE:', 'LOGICAL VOLUMES:', 'TOTAL PPs:', 'VG DESCRIPTORS:', 'FREE PPs:', 'HOT SPARE:', 'USED PPs:', 'MAX REQUEST:', 'FREE DISTRIBUTION:', 'USED DISTRIBUTION:', 'MIRROR POOL:' ] }.freeze def self.extract(content, cmd) property_hash = {} properties = PROPERTIES[cmd] properties.each do |property| str = (properties - [property]).join('|') matcher = content.match(/(?:^|^[^:]+:[^:]+)#{Regexp.escape(property)}([^\n]*?)(#{str}|\n|$)/s) if matcher value = matcher[1].strip property_hash[property.split(':').first] = value end end property_hash end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/aix/odm_query.rb000066400000000000000000000021551470204764400240330ustar00rootroot00000000000000# frozen_string_literal: true # CuAt (Customized Attributes) non-default attribute values # CuDv (Customized Devices) the devices present on this machine # PdAt (Predefined Attributes) default values for all device attributes # PdDv (Predefined Devices) the list of all devices supported by this release of AIX module Facter module Util module Aix class ODMQuery REPOS = %w[CuAt CuDv PdAt PdDv].freeze def initialize @query = '' @conditions = [] @log = Facter::Log.new(self) end def equals(field, value) @conditions << "#{field}='#{value}'" self end def like(field, value) @conditions << "#{field} like '#{value}'" self end def execute result = nil REPOS.each do |repo| break if result && !result.empty? result = Facter::Core::Execution.execute("#{query} #{repo}", logger: @log) end result end def query "odmget -q \"#{@conditions.join(' AND ')}\"" end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/api_debugger.rb000066400000000000000000000023121470204764400236560ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Util module ApiDebugger def self.prepended(receiver) exclude, print_caller = parse_options(ENV['API_DEBUG']) receiver_methods = receiver.instance_methods - Object.methods receiver_methods.each do |meth| ApiDebugger.class_eval do define_method(meth) do |*args| method_call = super(*args) unless exclude.include?(meth) puts '#' * 80 puts "Method call: #{meth}" puts "Called with: #{args.inspect}" if print_caller.include?(meth) puts '-' * 80 puts caller end puts '#' * 80 end method_call end end end end def self.parse_options(options) exclude = [] print_caller = [] options.split(',').each do |option| if option.start_with?('-') exclude << option[1..-1].to_sym elsif option.start_with?('+') print_caller << option[1..-1].to_sym end end [exclude, print_caller] end end end end puppetlabs-facter-dfe6df4/lib/facter/util/facts/000077500000000000000000000000001470204764400220165ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/util/facts/facts_utils.rb000066400000000000000000000037671470204764400247000ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Util module Facts HYPERVISORS_HASH = { 'VMware' => 'vmware', 'VirtualBox' => 'virtualbox', 'Parallels' => 'parallels', 'KVM' => 'kvm', 'Virtual Machine' => 'hyperv', 'RHEV Hypervisor' => 'rhev', 'oVirt Node' => 'ovirt', 'HVM domU' => 'xenhvm', 'Bochs' => 'bochs', 'OpenBSD' => 'vmm', 'BHYVE' => 'bhyve' }.freeze PHYSICAL_HYPERVISORS = %w[physical xen0 vmware_server vmware_workstation openvzhn vserver_host].freeze REDHAT_FAMILY = %w[redhat rhel fedora centos scientific ascendos cloudlinux psbm oraclelinux ovs oel amazon xenserver xcp-ng virtuozzo photon mariner azurelinux].freeze DEBIAN_FAMILY = %w[debian ubuntu huaweios linuxmint devuan kde].freeze SUSE_FAMILY = %w[sles sled suse].freeze GENTOO_FAMILY = ['gentoo'].freeze ARCH_FAMILY = %w[arch manjaro].freeze MANDRAKE_FAMILY = %w[mandrake mandriva mageia].freeze FAMILY_HASH = { 'RedHat' => REDHAT_FAMILY, 'Debian' => DEBIAN_FAMILY, 'Suse' => SUSE_FAMILY, 'Gentoo' => GENTOO_FAMILY, 'Archlinux' => ARCH_FAMILY, 'Mandrake' => MANDRAKE_FAMILY }.freeze class << self def discover_family(os) FAMILY_HASH.each { |key, array_value| return key if array_value.any? { |os_flavour| os =~ /#{os_flavour}/i } } os end def release_hash_from_string(output, include_patch: false) return unless output versions = output.split('.') {}.tap do |release| release['full'] = output release['major'] = versions[0] release['minor'] = versions[1] if versions[1] release['patch'] = versions[2] if versions[2] && include_patch end end def release_hash_from_matchdata(data) return if data.nil? || data[1].nil? release_hash_from_string(data[1].to_s) end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/facts/posix/000077500000000000000000000000001470204764400231605ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/util/facts/posix/virtual_detector.rb000066400000000000000000000047601470204764400270730ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Util module Facts module Posix module VirtualDetector class << self def platform @fact_value ||= # rubocop:disable Naming/MemoizedInstanceVariableName check_docker_lxc || check_freebsd || check_openbsd || check_gce || check_illumos_lx || \ retrieve_from_virt_what || check_vmware || check_open_vz || check_vserver || \ check_xen || check_other_facts || check_lspci || 'physical' end private def check_docker_lxc Facter::Resolvers::Containers.resolve(:vm) end def check_gce bios_vendor = Facter::Resolvers::Linux::DmiBios.resolve(:bios_vendor) 'gce' if bios_vendor&.include?('Google') end def check_illumos_lx 'illumos-lx' if Facter::Resolvers::Uname.resolve(:kernelversion) == 'BrandZ virtual linux' end def check_vmware Facter::Resolvers::Vmware.resolve(:vm) end def retrieve_from_virt_what Facter::Resolvers::VirtWhat.resolve(:vm) end def check_open_vz Facter::Resolvers::OpenVz.resolve(:vm) end def check_vserver Facter::Resolvers::VirtWhat.resolve(:vserver) end def check_xen Facter::Resolvers::Xen.resolve(:vm) end def check_freebsd return unless Object.const_defined?('Facter::Resolvers::Freebsd::Virtual') Facter::Resolvers::Freebsd::Virtual.resolve(:vm) end def check_openbsd return unless Object.const_defined?('Facter::Resolvers::Openbsd::Virtual') Facter::Resolvers::Openbsd::Virtual.resolve(:vm) end def check_other_facts bios_vendor = Facter::Resolvers::Linux::DmiBios.resolve(:bios_vendor) return 'kvm' if bios_vendor&.include?('Amazon EC2') product_name = Facter::Resolvers::Linux::DmiBios.resolve(:product_name) return unless product_name Facter::Util::Facts::HYPERVISORS_HASH.each { |key, value| return value if product_name.include?(key) } nil end def check_lspci Facter::Resolvers::Lspci.resolve(:vm) end end end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/facts/unit_converter.rb000066400000000000000000000037371470204764400254230ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Util module Facts class UnitConverter class << self def bytes_to_mb(value_in_bytes) return unless value_in_bytes value_in_bytes = value_in_bytes.to_i (value_in_bytes / (1024.0 * 1024.0)) end def hertz_to_human_readable(speed) speed = speed.to_i return if !speed || speed.zero? validated_speed, metric_prefix = determine_metric_prefix(speed) "#{format('%.2f', displayed_speed: validated_speed.round(2))} #{metric_prefix}Hz" end def bytes_to_human_readable(bytes) return unless bytes return "#{bytes} bytes" if bytes < 1024 number, multiple = determine_exponent(bytes) "#{pad_number(number)} #{multiple}" end private def pad_number(number) number = number.to_s number << '0' if number.split('.').last.length == 1 number end def determine_exponent(bytes) prefix = %w[KiB MiB GiB TiB PiB EiB] exp = (Math.log2(bytes) / 10.0).floor converted_number = (100.0 * (bytes / 1024.0**exp)).round / 100.0 if (converted_number - 1024.0).abs < Float::EPSILON exp += 1 converted_number = 1.00 end multiple = prefix[exp - 1] || 'bytes' converted_number = bytes if multiple == 'bytes' [converted_number, multiple] end def determine_metric_prefix(num) metric_prefix = { 0 => '', 3 => 'k', 6 => 'M', 9 => 'G', 12 => 'T' } power = Math.log10(num).floor display_exponent = power - power % 3 coefficient = power.zero? ? num.to_f : num.fdiv(10**display_exponent) [coefficient, metric_prefix[display_exponent]] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/facts/uptime_parser.rb000066400000000000000000000072551470204764400252330ustar00rootroot00000000000000# frozen_string_literal: true require 'time' module Facter module Util module Facts class UptimeParser SECS_IN_A_DAY = 86_400 SECS_IN_AN_HOUR = 3_600 SECS_IN_A_MINUTE = 60 @log = Facter::Log.new(self) class << self def uptime_seconds_unix uptime_proc_uptime || uptime_sysctl || uptime_executable end private def uptime_proc_uptime output = Facter::Core::Execution.execute("/bin/cat #{uptime_file}", logger: @log) output.chomp.split(' ').first.to_i unless output.empty? end def uptime_sysctl output = Facter::Core::Execution.execute("sysctl -n #{uptime_sysctl_variable}", logger: @log) compute_uptime(Time.at(output.match(/\d+/)[0].to_i)) unless output.empty? end def uptime_executable output = Facter::Core::Execution.execute(uptime_executable_cmd, logger: @log) return unless output up = 0 output_calculator_methods.find { |method| up = send(method, output) } up || 0 end def uptime_file '/proc/uptime' end def uptime_sysctl_variable 'kern.boottime' end def uptime_executable_cmd 'uptime' end def output_calculator_methods %i[ calculate_days_hours_minutes calculate_days_hours calculate_days_minutes calculate_days calculate_hours_minutes calculate_hours calculate_minutes ] end def compute_uptime(time) (Time.now - time).to_i end # Regexp handles Solaris, AIX, HP-UX, and Tru64. # 'day(?:s|\(s\))?' says maybe 'day', 'days', # or 'day(s)', and don't set $2. def calculate_days_hours_minutes(output) return unless output =~ /(\d+) day(?:s|\(s\))?,?\s+(\d+):-?(\d+)/ SECS_IN_A_DAY * Regexp.last_match(1).to_i + SECS_IN_AN_HOUR * Regexp.last_match(2).to_i + SECS_IN_A_MINUTE * Regexp.last_match(3).to_i end def calculate_days_hours(output) return unless output =~ /(\d+) day(?:s|\(s\))?,\s+(\d+) hr(?:s|\(s\))?,/ SECS_IN_A_DAY * Regexp.last_match(1).to_i + SECS_IN_AN_HOUR * Regexp.last_match(2).to_i end def calculate_days_minutes(output) return unless output =~ /(\d+) day(?:s|\(s\))?,\s+(\d+) min(?:s|\(s\))?,/ SECS_IN_A_DAY * Regexp.last_match(1).to_i + SECS_IN_A_MINUTE * Regexp.last_match(2).to_i end def calculate_days(output) return unless output =~ /(\d+) day(?:s|\(s\))?,/ SECS_IN_A_DAY * Regexp.last_match(1).to_i end # must anchor to 'up' to avoid matching time of day # at beginning of line. Certain versions of uptime on # Solaris may insert a '-' into the minutes field. def calculate_hours_minutes(output) return unless output =~ /up\s+(\d+):-?(\d+),/ SECS_IN_AN_HOUR * Regexp.last_match(1).to_i + SECS_IN_A_MINUTE * Regexp.last_match(2).to_i end def calculate_hours(output) return unless output =~ /(\d+) hr(?:s|\(s\))?,/ SECS_IN_AN_HOUR * Regexp.last_match(1).to_i end def calculate_minutes(output) return unless output =~ /(\d+) min(?:s|\(s\))?,/ SECS_IN_A_MINUTE * Regexp.last_match(1).to_i end end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/facts/windows_release_finder.rb000066400000000000000000000032061470204764400270650ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Util module Facts class WindowsReleaseFinder class << self def find_release(input) version = input[:version] return unless version consumerrel = input[:consumerrel] description = input[:description] kernel_version = input[:kernel_version] if /10.0/.match?(version) check_version_10_11(consumerrel, kernel_version) else check_version_6(version, consumerrel) || check_version_5(version, consumerrel, description) || version end end private def check_version_10_11(consumerrel, kernel_version) build_number = kernel_version[/([^.]*)$/].to_i return '11' if build_number >= 22_000 return '10' if consumerrel if build_number >= 20_348 '2022' elsif build_number >= 17_623 '2019' else '2016' end end def check_version_6(version, consumerrel) hash = {} hash['6.3'] = consumerrel ? '8.1' : '2012 R2' hash['6.2'] = consumerrel ? '8' : '2012' hash['6.1'] = consumerrel ? '7' : '2008 R2' hash['6.0'] = consumerrel ? 'Vista' : '2008' hash[version] end def check_version_5(version, consumerrel, description) return unless /5.2/.match?(version) return 'XP' if consumerrel description == 'R2' ? '2003 R2' : '2003' end end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/file_helper.rb000066400000000000000000000023141470204764400235210ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Util class FileHelper @log = Log.new(self) class << self DEBUG_MESSAGE = 'File at: %s is not accessible.' def safe_read(path, default_return = '') return File.read(path, encoding: Encoding::UTF_8) if File.readable?(path) log_failed_to_read(path) default_return end # rubocop:disable Style/SpecialGlobalVars def safe_readlines(path, default_return = [], sep = $/, chomp: false) return File.readlines(path, sep, chomp: chomp, encoding: Encoding::UTF_8) if File.readable?(path) log_failed_to_read(path) default_return end # rubocop:enable Style/SpecialGlobalVars # This previously acted as a helper method for versions of Ruby older # than 2.5, before Dir.children was added. As it isn't a private # method, we can't remove it entirely until the next major Facter # release (presumably Facter 5). def dir_children(path) Dir.children(path) end private def log_failed_to_read(path) @log.debug(DEBUG_MESSAGE % path) end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/linux/000077500000000000000000000000001470204764400220555ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/util/linux/dhcp.rb000066400000000000000000000061611470204764400233240ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Util module Linux class Dhcp class << self DIRS = %w[/var/lib/dhclient/ /var/lib/dhcp/ /var/lib/dhcp3/ /var/lib/NetworkManager/ /var/db/].freeze def dhcp(interface_name, interface_index, logger) @log = logger @log.debug("Get DHCP for interface #{interface_name}") dhcp = search_systemd_netif_leases(interface_index, interface_name) dhcp ||= search_dhclient_leases(interface_name) dhcp ||= search_internal_leases(interface_name) dhcp ||= search_with_dhcpcd_command(interface_name) dhcp end private def search_systemd_netif_leases(index, interface_name) return if index.nil? @log.debug("Attempt to get DHCP for interface #{interface_name}, from systemd/netif/leases") file_content = Facter::Util::FileHelper.safe_read("/run/systemd/netif/leases/#{index}", nil) dhcp = file_content.match(/SERVER_ADDRESS=(.*)/) if file_content dhcp[1] if dhcp end def search_dhclient_leases(interface_name) @log.debug("Attempt to get DHCP for interface #{interface_name}, from dhclient leases") DIRS.each do |dir| next unless File.readable?(dir) lease_files = Dir.entries(dir).select { |file| file =~ /dhclient.*\.lease/ } next if lease_files.empty? lease_files.select do |file| content = Facter::Util::FileHelper.safe_read("#{dir}#{file}", nil) next unless /interface.*#{interface_name}/.match?(content) dhcp = content.match(/dhcp-server-identifier ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) return dhcp[1] if dhcp end end nil end def search_internal_leases(interface_name) return unless File.readable?('/var/lib/NetworkManager/') @log.debug("Attempt to get DHCP for interface #{interface_name}, from NetworkManager leases") files = Dir.entries('/var/lib/NetworkManager/').reject { |dir| dir =~ /^\.+$/ } lease_file = files.find { |file| file =~ /internal.*#{interface_name}\.lease/ } return unless lease_file dhcp = Facter::Util::FileHelper.safe_read("/var/lib/NetworkManager/#{lease_file}", nil) return unless dhcp dhcp = dhcp.match(/SERVER_ADDRESS=(.*)/) dhcp[1] if dhcp end def search_with_dhcpcd_command(interface_name) @log.debug("Attempt to get DHCP for interface #{interface_name}, from dhcpcd command") @dhcpcd_command ||= Facter::Core::Execution.which('dhcpcd') return unless @dhcpcd_command output = Facter::Core::Execution.execute("#{@dhcpcd_command} -U #{interface_name}", logger: @log) dhcp = output.match(/dhcp_server_identifier='(.*)'/) dhcp[1] if dhcp end end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/linux/if_inet6.rb000066400000000000000000000037051470204764400241120ustar00rootroot00000000000000# frozen_string_literal: true require 'ipaddr' module Facter module Util module Linux class IfInet6 class << self IFA_FLAGS = { 'temporary' => 0x01, 'noad' => 0x02, 'optimistic' => 0x04, 'dadfailed' => 0x08, 'homeaddress' => 0x10, 'deprecated' => 0x20, 'tentative' => 0x40, 'permanent' => 0x80 # /proc/net/if_inet6 only supports the old 8bit flags # I have been unable to find a simple solution to accesses # the full 32bit flags. netlink is all I can could find but # that will likely be ugly # 'managetempaddr' => 0x100, # 'noprefixroute' => 0x200, # 'mcautojoin' => 0x400, # 'stableprivacy' => 0x800 }.freeze def read_flags return read_flags_from_proc if File.exist?('/proc/net/if_inet6') {} end private def read_flags_from_proc flags = init_flags Facter::Util::FileHelper.safe_read('/proc/net/if_inet6', nil).each_line do |line| iface = line.split next unless iface.size == 6 ip = parse_ip(iface[0]) flags[iface[5]][ip] = parse_ifa_flags(iface[4]) end flags end def init_flags Hash.new { |h1, k1| h1[k1] = Hash.new { |h2, k2| h2[k2] = [] } } end def parse_ifa_flags(flag) flag = flag.hex flags = [] IFA_FLAGS.each_pair do |name, value| next if (flag & value).zero? flags << name end flags end def parse_ip(ip) # The ip address in if_net6 is a long string wit no colons ip = ip.scan(/(\h{4})/).join(':') IPAddr.new(ip).to_s end end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/linux/proc.rb000066400000000000000000000007571470204764400233560ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Util module Linux class Proc class << self def getenv_for_pid(pid, field) path = "/proc/#{pid}/environ" lines = Facter::Util::FileHelper.safe_readlines(path, [], "\0", chomp: true) lines.each do |line| key, value = line.split('=', 2) return value if key == field end nil end end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/linux/routing_table.rb000066400000000000000000000035121470204764400252410ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Util module Linux class RoutingTable class << self ROUTE_TYPES = %w[anycast unicast broadcast local nat unreachable prohibit blackhole throw].freeze def read_routing_table(logger) ipv4_output = Facter::Core::Execution.execute('ip route show', logger: logger) ipv6_output = Facter::Core::Execution.execute('ip -6 route show', logger: logger) routes4 = parse_routes(ipv4_output, true) routes6 = parse_routes(ipv6_output, false) [routes4, routes6] end private def parse_routes(output, ipv4_type) routes = [] output.each_line do |line| parts = line.split(' ').compact next if parts.include?('linkdown') delete_invalid_route_type(parts) next if !ipv4_type && !parts[0].include?(':') route = construct_route(parts) routes << route unless route[:ip].nil? end routes.uniq end def delete_invalid_route_type(parts) route_type = parts[0] parts.delete_at(0) if ROUTE_TYPES.include?(route_type) end def construct_route(parts) route = {} dev_index = parts.find_index { |elem| elem == 'dev' } src_index = parts.find_index { |elem| elem == 'src' } route[:interface] = parts[dev_index + 1] if dev_index route[:ip] = parts[src_index + 1] if src_index route end end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/linux/socket_parser.rb000066400000000000000000000104641470204764400252530ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Util module Linux class SocketParser class << self def retrieve_interfaces(logger) require 'socket' @interfaces = {} @log = logger Socket.getifaddrs.each do |ifaddr| populate_interface_info(ifaddr) end @interfaces end private def populate_interface_info(ifaddr) interface_name = ifaddr.name @interfaces[interface_name] = {} if @interfaces[interface_name].nil? mac(ifaddr) ip_info_of(ifaddr) end def mac(ifaddr) return unless @interfaces[ifaddr.name][:mac].nil? mac = search_for_mac(ifaddr) @interfaces[ifaddr.name][:mac] = mac if mac end def search_for_mac(ifaddr) mac = mac_from_bonded_interface(ifaddr.name) mac ||= mac_from(ifaddr) mac if !mac.nil? && mac != '00:00:00:00:00:00' && mac =~ /^([0-9A-Fa-f]{2}[:-]){5,19}([0-9A-Fa-f]{2})$/ end def mac_from_bonded_interface(interface_name) master = bond_master_of(interface_name) return unless master output = Facter::Util::FileHelper.safe_read("/proc/net/bonding/#{master}", nil) return unless output found_match = false output.each_line do |line| if line.strip == "Slave Interface: #{interface_name}" found_match = true elsif line.include? 'Slave Interface' # if we reached the data block of another interface belonging to the bonded interface found_match = false end return Regexp.last_match(1) if found_match && line =~ /Permanent HW addr: (\S*)/ end end def bond_master_of(interface_name) content = get_ip_link_show_data(interface_name) content&.match(/master (\S*) /)&.captures&.first end def get_ip_link_show_data(interface_name) @ip_link_show_data ||= read_ip_link_show_data @ip_link_show_data[interface_name] end def read_ip_link_show_data ip_link_show_data = {} output = Facter::Core::Execution.execute('ip -o link show', logger: @log) output.each_line do |line| interface_name = line.split(':')[1]&.strip if line ip_link_show_data[interface_name] = line if interface_name end ip_link_show_data end def mac_from(ifaddr) if Socket.const_defined? :PF_LINK ifaddr.addr&.getnameinfo&.first # sometimes it returns localhost or ip elsif Socket.const_defined? :PF_PACKET return if ifaddr.addr.nil? mac_from_sockaddr_of(ifaddr) end rescue StandardError => e @log.debug("Could not read mac for interface #{ifaddr.name}, got #{e}") nil end def mac_from_sockaddr_of(ifaddr) result = ifaddr.addr.inspect_sockaddr result&.match(/hwaddr=([\h:]+)/)&.captures&.first end def ip_info_of(ifaddr) return if ifaddr.addr.nil? || ifaddr.netmask.nil? add_binding(ifaddr.name, ifaddr) rescue StandardError => e @log.debug("Could not read binding data, got #{e}") end def add_binding(interface_name, ifaddr) ip, netmask, binding_key = binding_data(ifaddr) binding = Facter::Util::Resolvers::Networking.build_binding(ip, netmask) return if binding.nil? @interfaces[interface_name][binding_key] = [] if @interfaces[interface_name][binding_key].nil? @interfaces[interface_name][binding_key] << binding @log.debug("Adding to interface #{interface_name}, binding:\n#{binding}") end def binding_data(ifaddr) # ipv6 ips are retrieved as % ip = ifaddr.addr.ip_address.split('%').first netmask = ifaddr.netmask.ip_address binding_key = ifaddr.addr.ipv4? ? :bindings : :bindings6 [ip, netmask, binding_key] end end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/macosx/000077500000000000000000000000001470204764400222105ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/util/macosx/system_profile_executor.rb000066400000000000000000000017411470204764400275220ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Util module Macosx class SystemProfileExecutor @log = Log.new(self) class << self def execute(category_name) @log.debug "Executing command: system_profiler #{category_name}" output = Facter::Core::Execution.execute( "system_profiler #{category_name}", logger: @log )&.force_encoding('UTF-8') return unless output system_profiler_hash = output_to_hash(output) normalize_keys(system_profiler_hash) end private def output_to_hash(output) output.scan(/.*: .*$/).map { |e| e.strip.match(/(.*?): (.*)/).captures }.to_h end def normalize_keys(system_profiler_hash) system_profiler_hash.transform_keys do |k| k.downcase.tr(' ', '_').delete("\(\)").to_sym end.to_h end end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/resolvers/000077500000000000000000000000001470204764400227425ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/util/resolvers/aws_token.rb000066400000000000000000000014361470204764400252650ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Util module Resolvers module AwsToken attr_reader :token @log = Facter::Log.new(self) class << self AWS_API_TOKEN_URL = 'http://169.254.169.254/latest/api/token' def get(lifetime = 100) @expiry ||= Time.now return @token if @token && @expiry > Time.now @token = nil @expiry = Time.now + lifetime headers = { 'X-aws-ec2-metadata-token-ttl-seconds' => lifetime.to_s } @token = Facter::Util::Resolvers::Http.put_request(AWS_API_TOKEN_URL, headers) end def reset @expiry = nil @token = nil end end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/resolvers/ffi/000077500000000000000000000000001470204764400235065ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/util/resolvers/ffi/hostname.rb000066400000000000000000000042241470204764400256530ustar00rootroot00000000000000# frozen_string_literal: true require 'ffi' module Facter module Util module Resolvers module Ffi class AddrInfo < ::FFI::Struct layout :ai_flags, :int, :ai_family, :int, :ai_socketype, :int, :ai_protocol, :int, :ai_addrlen, :uint, :ai_addr, :pointer, :ai_canonname, :string, :ai_next, :pointer end module Hostname HOST_NAME_MAX = 64 extend ::FFI::Library ffi_lib ::FFI::Library::LIBC attach_function :getaddrinfo, %i[string string pointer pointer], :int attach_function :gethostname, %i[pointer int], :int attach_function :freeaddrinfo, [:pointer], :void def self.getffihostname raw_hostname = ::FFI::MemoryPointer.new(:char, HOST_NAME_MAX) res = Hostname.gethostname(raw_hostname, HOST_NAME_MAX) return unless res.zero? raw_hostname.read_string end def self.getffiaddrinfo(hostname) ret = FFI::MemoryPointer.new(:pointer) hints = Facter::Util::Resolvers::Ffi::AddrInfo.new hints[:ai_family] = Socket::AF_UNSPEC hints[:ai_socketype] = Socket::SOCK_STREAM hints[:ai_flags] = Socket::AI_CANONNAME res = Hostname.getaddrinfo(hostname, '', hints.to_ptr, ret) log = Log.new(self) log.debug("FFI Getaddrinfo finished with exit status: #{res}") log.debug("FFI Getaddrinfo returned an AddrInfo struct at address: #{ret}") return unless res.zero? return if ret == FFI::Pointer::NULL || ret.read_pointer == FFI::Pointer::NULL begin addr = Facter::Util::Resolvers::Ffi::AddrInfo.new(ret.read_pointer) name = addr[:ai_canonname] log.debug("FFI AddrInfo struct has the fqdn: #{name}") return if !name || hostname == name name ensure Hostname.freeaddrinfo(ret.read_pointer) end end end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/resolvers/ffi/load_averages.rb000066400000000000000000000010761470204764400266330ustar00rootroot00000000000000# frozen_string_literal: true require 'ffi' module Facter module Util module Resolvers module Ffi module LoadAverages extend ::FFI::Library ffi_lib ::FFI::Library::LIBC attach_function :getloadavg, %i[pointer int], :int def self.read_load_averages raw_loadavg = ::FFI::MemoryPointer.new(:double, 3) res = LoadAverages.getloadavg(raw_loadavg, 3) return unless res == 3 raw_loadavg.read_array_of_double(res) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/resolvers/filesystem_helper.rb000066400000000000000000000022731470204764400270160ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Util module Resolvers module FilesystemHelper MOUNT_KEYS = %i[device filesystem path options available available_bytes size size_bytes used used_bytes capacity].freeze class << self def read_mountpoints require 'sys/filesystem' force_utf(Sys::Filesystem.mounts) end def read_mountpoint_stats(path) require 'sys/filesystem' Sys::Filesystem.stat(path) end def compute_capacity(used, total) if used == total '100%' elsif used.positive? "#{format('%.2f', value: (used / total.to_f * 100))}%" else '0%' end end private def force_utf(mounts) mounts&.each do |mount| mount.name.force_encoding('UTF-8') mount.mount_type.force_encoding('UTF-8') mount.mount_point.force_encoding('UTF-8') mount.options.force_encoding('UTF-8') end end end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/resolvers/fingerprint.rb000066400000000000000000000002211470204764400256110ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Util module Resolvers FingerPrint = Struct.new(:sha1, :sha256) end end end puppetlabs-facter-dfe6df4/lib/facter/util/resolvers/http.rb000066400000000000000000000070071470204764400242520ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Util module Resolvers module Http @log = Facter::Log.new(self) class << self CONNECTION_TIMEOUT = 0.6 SESSION_TIMEOUT = 5 # Makes a GET HTTP request and returns its response. # # @param url [String] the address to which the request will be made. # @param headers [Hash] the headers you need to add to your request. # Defaults to an empty hash. # @param timeouts [Hash] Values for the session and connection # timeouts. # @param proxy [Boolean] Whether to use proxy settings when calling # Net::HTTP.new. Defaults to true. # @returns [String] the response body if the response code is 200. # If the response code is not 200, an empty string is returned. # @example # get_request('https://example.com', { "Accept": 'application/json' }, { session: 2.4, connection: 5 }) def get_request(url, headers = {}, timeouts = {}, proxy = true) make_request(url, headers, timeouts, 'GET', proxy) end # Makes a PUT HTTP request and returns its response # @param (see #get_request) # @return (see #get_request) def put_request(url, headers = {}, timeouts = {}, proxy = true) make_request(url, headers, timeouts, 'PUT', proxy) end private def make_request(url, headers, timeouts, request_type, proxy) require 'net/http' uri = URI.parse(url) http = http_obj(uri, timeouts, proxy) request = request_obj(headers, uri, request_type) # The Windows implementation of sockets does not respect net/http # timeouts, so check if the target is reachable in a different way if Gem.win_platform? Socket.tcp(uri.host, uri.port, connect_timeout: timeouts[:connection] || CONNECTION_TIMEOUT) end # Make the request response = http.request(request) response.uri = url successful_response?(response) ? response.body : '' rescue StandardError => e @log.debug("Trying to connect to #{url} but got: #{e.message}") '' end def http_obj(parsed_url, timeouts, proxy) # If get_request or put_request are called and set proxy to false, # manually set Net::HTTP.new's p_addr (proxy address) positional # argument to nil to override anywhere else a proxy may be set # (e.g. the http_proxy environment variable). http = if proxy Net::HTTP.new(parsed_url.host) else Net::HTTP.new(parsed_url.host, 80, nil) end http.read_timeout = timeouts[:session] || SESSION_TIMEOUT http.open_timeout = timeouts[:connection] || CONNECTION_TIMEOUT http.set_debug_output($stderr) if Options[:http_debug] http end def request_obj(headers, parsed_url, request_type) Module.const_get("Net::HTTP::#{request_type.capitalize}").new(parsed_url.request_uri, headers) end def successful_response?(response) success = response.code.to_i.equal?(200) @log.debug("Request to #{response.uri} failed with error code #{response.code}") unless success success end end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/resolvers/networking/000077500000000000000000000000001470204764400251315ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/util/resolvers/networking/dhcp.rb000066400000000000000000000010511470204764400263710ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Util module Resolvers module Networking module Dhcp class << self def get(interface_name, log = nil) dhcpinfo_command = Facter::Core::Execution.which('dhcpinfo') || '/sbin/dhcpinfo' result = Facter::Core::Execution.execute("#{dhcpinfo_command} -i #{interface_name} ServerID", logger: log) result.chomp! result.empty? ? nil : result end end end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/resolvers/networking/networking.rb000066400000000000000000000103371470204764400276510ustar00rootroot00000000000000# frozen_string_literal: true require 'ipaddr' module Facter module Util module Resolvers module Networking class << self # Creates a hash with IP, netmask and network. Works for IPV4 and IPV6 # @param [String] addr The IP address # @param [Integer] mask_length Number of 1 bits the netmask has # # @return [Hash] Hash containing ip address, netmask and network def build_binding(addr, mask_length) return if !addr || !mask_length ip = IPAddr.new(addr) mask_helper = nil scope = nil if ip.ipv6? scope = get_scope(addr) mask_helper = 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' else mask_helper = '255.255.255.255' end mask = IPAddr.new(mask_helper).mask(mask_length) result = { address: addr, netmask: mask.to_s, network: ip.mask(mask_length).to_s } result[:scope6] = scope if scope result end def expand_main_bindings(networking_facts) primary = networking_facts[:primary_interface] interfaces = networking_facts[:interfaces] expand_interfaces(interfaces) unless interfaces.nil? return if primary.nil? || interfaces.nil? || networking_facts.nil? expand_primary_interface(networking_facts, primary) end def get_scope(ip) require 'socket' scope6 = [] addrinfo = Addrinfo.new(['AF_INET6', 0, nil, ip], :INET6) scope6 << 'compat,' if IPAddr.new(ip).ipv4_compat? scope6 << if addrinfo.ipv6_linklocal? 'link' elsif addrinfo.ipv6_sitelocal? 'site' elsif addrinfo.ipv6_loopback? 'host' else 'global' end scope6.join end def find_valid_binding(bindings) bindings.each do |binding| return binding unless ignored_ip_address(binding[:address]) end bindings.empty? ? nil : bindings.first end IPV4_LINK_LOCAL_ADDR = IPAddr.new('169.254.0.0/16').freeze # RFC5735 IPV6_LINK_LOCAL_ADDR = IPAddr.new('fe80::/10').freeze # RFC4291 IPV6_UNIQUE_LOCAL_ADDR = IPAddr.new('fc00::/7').freeze # RFC4193 def ignored_ip_address(addr) return true if addr.empty? ip = IPAddr.new(addr) return true if ip.loopback? [ IPV4_LINK_LOCAL_ADDR, IPV6_LINK_LOCAL_ADDR, IPV6_UNIQUE_LOCAL_ADDR ].each do |range| return true if range.include?(ip) end false end def calculate_mask_length(netmask) ipaddr = IPAddr.new(netmask) ipaddr.to_i.to_s(2).count('1') end def format_mac_address(address) address.split('.').map { |e| format('%02s', mac_address: e) }.join(':').tr(' ', '0') end private def expand_interfaces(interfaces) interfaces.each_value do |values| expand_binding(values, values[:bindings]) if values[:bindings] expand_binding(values, values[:bindings6], ipv4_type: false) if values[:bindings6] end end def expand_primary_interface(networking_facts, primary) networking_facts[:interfaces][primary]&.each do |key, value| networking_facts[key] = value unless %i[bindings bindings6].include?(key) end end def expand_binding(values, bindings, ipv4_type: true) binding = find_valid_binding(bindings) ip_protocol_type = ipv4_type ? '' : '6' values["ip#{ip_protocol_type}".to_sym] = binding[:address] values["netmask#{ip_protocol_type}".to_sym] = binding[:netmask] values["network#{ip_protocol_type}".to_sym] = binding[:network] values[:scope6] = get_scope(binding[:address]) unless ipv4_type end end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/resolvers/networking/primary_interface.rb000066400000000000000000000052671470204764400311730ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Util module Resolvers module Networking module PrimaryInterface @log ||= Log.new(self) class << self ROUTE_TABLE_MAPPING = { 'Iface' => 0, 'Destination' => 1, 'Gateway' => 2, 'Flags' => 3, 'RefCnt' => 4, 'Use' => 5, 'Metric' => 6, 'Mask' => 7, 'MTU' => 8, 'Window' => 9, 'IRTT' => 10 }.freeze def read_from_route return if Facter::Core::Execution.which('route').nil? result = Facter::Core::Execution.execute('route -n get default', logger: @log) result.match(/interface: (.+)/)&.captures&.first end def read_from_proc_route content = Facter::Util::FileHelper.safe_read('/proc/net/route', '') content.each_line.with_index do |line, index| next if index.zero? route = line.strip.split("\t") return route[ROUTE_TABLE_MAPPING['Iface']] if valid_default_route?(route) end nil end def read_from_ip_route return if Facter::Core::Execution.which('ip').nil? output = Facter::Core::Execution.execute('ip route show default', logger: @log) primary_interface = nil output.each_line do |line| primary_interface = line.strip.split(' ')[4] if line.start_with?('default') end primary_interface end def find_in_interfaces(interfaces) return if interfaces.nil? interfaces.each do |iface_name, interface| interface[:bindings]&.each do |binding| return iface_name unless Facter::Util::Resolvers::Networking.ignored_ip_address(binding[:address]) end next unless interface[:bindings6] interface[:bindings6].each do |binding| return iface_name unless Facter::Util::Resolvers::Networking.ignored_ip_address(binding[:address]) end end nil end private def valid_default_route?(route) route.count > 7 && route[ROUTE_TABLE_MAPPING['Destination']] == '00000000' && route[ROUTE_TABLE_MAPPING['Mask']] == '00000000' && route[ROUTE_TABLE_MAPPING['Iface']] != '*' # `*` represents blackhole and not a valid interface end end end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/resolvers/ssh.rb000066400000000000000000000002331470204764400240620ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Util module Resolvers Ssh = Struct.new(:fingerprint, :type, :key, :name) end end end puppetlabs-facter-dfe6df4/lib/facter/util/resolvers/ssh_helper.rb000066400000000000000000000022171470204764400254250ustar00rootroot00000000000000# frozen_string_literal: true require 'base64' require 'digest/sha1' module Facter module Util module Resolvers class SshHelper class << self SSH_NAME = { 'ssh-dss' => 'dsa', 'ecdsa-sha2-nistp256' => 'ecdsa', 'ecdsa-sha2-nistp384' => 'ecdsa', 'ecdsa-sha2-nistp521' => 'ecdsa', 'ssh-ed25519' => 'ed25519', 'ssh-rsa' => 'rsa' }.freeze SSH_FINGERPRINT = { 'rsa' => 1, 'dsa' => 2, 'ecdsa' => 3, 'ed25519' => 4 }.freeze def create_ssh(key_type, key) key_name = SSH_NAME[key_type] return unless key_name # decode64 ignores non-base64 characters including newlines decoded_key = Base64.decode64(key) ssh_fp = SSH_FINGERPRINT[key_name] sha1 = "SSHFP #{ssh_fp} 1 #{Digest::SHA1.new.update(decoded_key)}" sha256 = "SSHFP #{ssh_fp} 2 #{Digest::SHA2.new.update(decoded_key)}" fingerprint = Facter::Util::Resolvers::FingerPrint.new(sha1, sha256) Facter::Util::Resolvers::Ssh.new(fingerprint, key_type, key, key_name) end end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/resolvers/uptime_helper.rb000066400000000000000000000014651470204764400261370ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Util module Resolvers module UptimeHelper class << self def create_uptime_hash(seconds) results = {} minutes = (seconds / 60) % 60 results[:seconds] = seconds results[:hours] = seconds / (60 * 60) results[:days] = results[:hours] / 24 results[:uptime] = build_uptime_text(results[:days], results[:hours], minutes) results end def build_uptime_text(days, hours, minutes) case days when 0 then "#{hours}:#{format('%02d', minutes: minutes)} hours" when 1 then '1 day' else "#{days} days" end end end end end end end puppetlabs-facter-dfe6df4/lib/facter/util/utils.rb000066400000000000000000000022071470204764400224040ustar00rootroot00000000000000# frozen_string_literal: true module Facter module Utils # Sort nested hash. def self.sort_hash_by_key(hash, recursive: true, &block) hash.keys.sort(&block).each_with_object(hash.class.new) do |key, seed| seed[key] = hash[key] seed[key] = sort_hash_by_key(seed[key], recursive: true, &block) if recursive && seed[key].is_a?(Hash) seed end end def self.split_user_query(user_query) queries = user_query.split('.') queries.map! { |query| /^[0-9]+$/.match?(query) ? query.to_i : query } end def self.deep_stringify_keys(object) case object when Hash object.each_with_object({}) do |(key, value), result| result[key.to_s] = deep_stringify_keys(value) end when Array object.map { |e| deep_stringify_keys(e) } else object end end def self.try_to_bool(value) case value.to_s when 'true' true when 'false' false else value end end def self.try_to_int(value) Integer(value) rescue ArgumentError, TypeError value end end end puppetlabs-facter-dfe6df4/lib/facter/util/windows/000077500000000000000000000000001470204764400224105ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/facter/util/windows/win32ole.rb000066400000000000000000000012021470204764400243720ustar00rootroot00000000000000# frozen_string_literal: true require 'win32ole' module Facter module Util module Windows class Win32Ole RPC_C_IMP_LEVEL_IMPERSONATE = 3 def initialize locator = WIN32OLE.new('WbemScripting.SWbemLocator') @conn = locator.ConnectServer('.', 'root\\cimv2') @conn.Security_.ImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE end def return_first(query) result = exec_query(query) return result.to_enum.first if result nil end def exec_query(query) @conn.execquery(query) end end end end end puppetlabs-facter-dfe6df4/lib/facter/version.rb000066400000000000000000000001371470204764400217540ustar00rootroot00000000000000# frozen_string_literal: true module Facter VERSION = '4.10.0' unless defined?(VERSION) end puppetlabs-facter-dfe6df4/lib/schema/000077500000000000000000000000001470204764400177355ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/lib/schema/facter.yaml000066400000000000000000002477741470204764400221120ustar00rootroot00000000000000# This file is used to validate the facter output schema and also document facts. # # Use the following attributes for each entry: # - pattern (optional): the pattern to match against a fact name; if not specified, an exact match is performed. # - type (required): the type of the fact. Must be one of the following: # * integer # * double # * string # * boolean # * array # * map # * ip (IPv4 address string) # * ip6 (IPv6 address string) # * mac (MAC address string) # - hidden (optional; default: false): true if the value is hidden from facter output by default, false if not. # - description (required): describes the fact's purpose. # - resolution (optional): describes how the fact is resolved. # - caveats (optional): describes any caveats to the fact. # - elements (required for map types): contains the element values of a map value; each element is another entry. # - validate (optional; default: true): true if a map value's elements should be validated or false if not. # - blockgroup (optional): the block group of this fact; if not specified, the fact cannot be blocked # # Please keep the facts in alphabetical order. aio_agent_version: type: string description: Return the version of the puppet-agent package that installed facter. resolution: | All platforms: use the compile-time enabled version definition. architecture: type: string hidden: true description: Return the operating system's hardware architecture. resolution: | POSIX platforms: use the `uname` function to retrieve the OS hardware architecture. Windows: use the `GetNativeSystemInfo` function to retrieve the OS hardware architecture. caveats: | Linux: Debian, Gentoo, kFreeBSD, and Ubuntu use "amd64" for "x86_64" and Gentoo uses "x86" for "i386". augeas: type: map description: Return information about augeas. resolution: | All platforms: query augparse for augeas metadata. elements: version: type: string description: The version of augparse. augeasversion: type: string hidden: true description: Return the version of augeas. resolution: | All platforms: query augparse for the augeas version. az_metadata: type: map description: | Return the Microsoft Azure instance metadata. Please see the [Microsoft Azure instance metadata documentation](http://https://docs.microsoft.com/en-us/azure/virtual-machines/windows/instance-metadata-service) for the contents of this fact. resolution: | Azure: query the Azure metadata endpoint and parse the response. caveats: | All platforms: `libfacter` must be built with `libcurl` support. validate: false blockdevices: type: string hidden: true description: Return a comma-separated list of block devices. resolution: | Linux: parse the contents of `/sys/block//`. Solaris: use the `kstat` function to query disk information. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. blockdevice__model: pattern: '^blockdevice_[A-Za-z0-9]+_model$' type: string hidden: true description: Return the model name of block devices attached to the system. resolution: | Linux: parse the contents of `/sys/block//device/model` to retrieve the model name/number for a device. Solaris: use the `kstat` function to query disk information. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. blockdevice__size: pattern: ^blockdevice_[A-Za-z0-9]+_size$ type: integer hidden: true description: Return the size of a block device in bytes. resolution: | Linux: parse the contents of `/sys/block//size` to receive the size (multiplying by 512 to correct for blocks-to-bytes). Solaris: use the `kstat` function to query disk information. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. blockdevice__vendor: pattern: ^blockdevice_[A-Za-z0-9]+_vendor$ type: string hidden: true description: Return the vendor name of block devices attached to the system. resolution: | Linux: parse the contents of `/sys/block//device/vendor` to retrieve the vendor for a device. Solaris: use the `kstat` function to query disk information. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. bios_release_date: type: string hidden: true description: Return the release date of the system BIOS. resolution: | Linux: parse the contents of `/sys/class/dmi/id/bios_date` to retrieve the system BIOS release date. Solaris: use the `smbios` utility to retrieve the system BIOS release date. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. bios_vendor: type: string hidden: true description: Return the vendor of the system BIOS. resolution: | Linux: parse the contents of `/sys/class/dmi/id/bios_vendor` to retrieve the system BIOS vendor. Solaris: use the `smbios` utility to retrieve the system BIOS vendor. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. bios_version: type: string hidden: true description: Return the version of the system BIOS. resolution: | Linux: parse the contents of `/sys/class/dmi/id/bios_version` to retrieve the system BIOS version. Solaris: use the `smbios` utility to retrieve the system BIOS version. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. boardassettag: type: string hidden: true description: Return the system board asset tag. resolution: | Linux: parse the contents of `/sys/class/dmi/id/board_asset_tag` to retrieve the system board asset tag. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. boardmanufacturer: type: string hidden: true description: Return the system board manufacturer. resolution: | Linux: parse the contents of `/sys/class/dmi/id/board_vendor` to retrieve the system board manufacturer. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. boardproductname: type: string hidden: true description: Return the system board product name. resolution: | Linux: parse the contents of `/sys/class/dmi/id/board_name` to retrieve the system board product name. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. boardserialnumber: type: string hidden: true description: Return the system board serial number. resolution: | Linux: parse the contents of `/sys/class/dmi/id/board_serial` to retrieve the system board serial number. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. chassisassettag: type: string hidden: true description: Return the system chassis asset tag. resolution: | Linux: parse the contents of `/sys/class/dmi/id/chassis_asset_tag` to retrieve the system chassis asset tag. Solaris: use the `smbios` utility to retrieve the system chassis asset tag. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. chassistype: type: string hidden: true description: Return the system chassis type. resolution: | Linux: parse the contents of `/sys/class/dmi/id/chassis_type` to retrieve the system chassis type. Solaris: use the `smbios` utility to retrieve the system chassis type. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. cloud: type: map description: Information about the cloud instance of the node. This is currently only populated on nodes running in Microsoft Azure, Amazon Web Services, and Google Compute Engine. elements: provider: type: string description: The cloud provider for the node. dhcp_servers: type: map hidden: true description: Return the DHCP servers for the system. resolution: | Linux: parse `dhclient` lease files or use the `dhcpcd` utility to retrieve the DHCP servers. Mac OSX: use the `ipconfig` utility to retrieve the DHCP servers. Solaris: use the `dhcpinfo` utility to retrieve the DHCP servers. Windows: use the `GetAdaptersAddresses` (Windows Server 2003: `GetAdaptersInfo`) function to retrieve the DHCP servers. elements: : pattern: ^((?!system).+)*$ type: ip description: The DHCP server for the interface. system: type: ip description: The DHCP server for the default interface. disks: type: map description: Return the disk (block) devices attached to the system. resolution: | AIX: query the ODM for all disk devices Linux: parse the contents of `/sys/block//`. Solaris: use the `kstat` function to query disk information. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. elements: : pattern: \w+ type: map description: Represents a disk or block device. elements: model: type: string description: The model of the disk or block device. product: type: string description: The product name of the disk or block device. caveats: Only present on Solaris. serial_number: type: string description: The serial number of the disk or block device. serial: type: string description: The serial number of the disk or block device on Linux based systems. size: type: string description: The display size of the disk or block device, such as "1 GiB". size_bytes: type: integer description: The size of the disk or block device, in bytes. vendor: type: string description: The vendor of the disk or block device. type: type: string description: The type of disk or block device (sshd or hdd). This fact is available only on Linux. wwn: type: string description: The identifier for the disk. dmi: type: map description: Return the system management information. resolution: | Linux: parse the contents of `/sys/class/dmi/id/` to retrieve system management information. Mac OSX: use the `sysctl` function to retrieve system management information. Solaris: use the `smbios`, `prtconf`, and `uname` utilities to retrieve system management information. Windows: use WMI to retrieve system management information. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. elements: bios: type: map description: The system BIOS information. elements: release_date: type: string description: The release date of the system BIOS. vendor: type: string description: The vendor of the system BIOS. version: type: string description: The version of the system BIOS. board: type: map description: The system board information. elements: asset_tag: type: string description: The asset tag of the system board. manufacturer: type: string description: The manufacturer of the system board. product: type: string description: The product name of the system board. serial_number: type: string description: The serial number of the system board. chassis: type: map description: The system chassis information. elements: asset_tag: type: string description: The asset tag of the system chassis. type: type: string description: The type of the system chassis. manufacturer: type: string description: The system manufacturer. product: type: map description: The system product information. elements: name: type: string description: The product name of the system. serial_number: type: string description: The product serial number of the system. uuid: type: string description: The product unique identifier of the system. version: type: string description: The product model information of the system. domain: type: string hidden: true description: Return the network domain of the system. resolution: | POSIX platforms: use the `getaddrinfo` function to retrieve the network domain. Windows: query the registry to retrieve the network domain; falls back to the primary interface's domain if not set in the registry. ec2_metadata: type: map description: | Return the Amazon Elastic Compute Cloud (EC2) instance metadata. Please see the [EC2 instance metadata documentation](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) for the contents of this fact. resolution: | EC2: query the EC2 metadata endpoint and parse the response. caveats: | All platforms: `libfacter` must be built with `libcurl` support. validate: false blockgroup: EC2 ec2_userdata: type: string description: | Return the Amazon Elastic Compute Cloud (EC2) instance user data. Please see the [EC2 instance user data documentation](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) for the contents of this fact. resolution: | EC2: query the EC2 user data endpoint and parse the response. caveats: | All platforms: `libfacter` must be built with `libcurl` support. blockgroup: EC2 env_windows_installdir: type: string description: Return the path of the directory in which Puppet was installed. resolution: | Windows: This fact is specific to the Windows MSI generated environment, and is set using the `environment.bat` script that configures the runtime environment for all Puppet executables. Please see [the original commit in the puppet_for_the_win repo](https://github.com/puppetlabs/puppet_for_the_win/commit/0cc32c1a09550c13d725b200d3c0cc17d93ec262) for more information. caveats: | This fact is specific to Windows, and will not resolve on any other platform. facterversion: type: string description: Return the version of facter. resolution: | All platforms: use the built-in version of libfacter. filesystems: type: string description: Return the usable file systems for block or disk devices. resolution: | AIX: parse the contents of `/etc/vfs` to retrieve the usable file systems. Linux: parse the contents of `/proc/filesystems` to retrieve the usable file systems. Mac OSX: use the `getfsstat` function to retrieve the usable file systems. Solaris: use the `sysdef` utility to retrieve the usable file systems. caveats: | Linux: The proc file system must be mounted. Mac OSX: The usable file systems is limited to the file system of mounted devices. blockgroup: file system fips_enabled: type: boolean description: Return whether the platform is in FIPS mode resolution: | Linux: parse the contents of `/proc/sys/crypto/fips_enabled` which if non-zero indicates fips mode has been enabled. Windows: check if key `HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Lsa/FipsAlgorithmPolicy/Enabled` is 1 or 0 caveats: | Linux: Limited to linux redhat family only details: | Only available on Windows and Redhat linux family fqdn: type: string hidden: true description: Return the fully qualified domain name (FQDN) of the system. resolution: | POSIX platforms: use the `getaddrinfo` function to retrieve the FQDN or use host and domain names. Windows: use the host and domain names to build the FQDN. gce: type: map description: | Return the Google Compute Engine (GCE) metadata. Please see the [GCE metadata documentation](https://cloud.google.com/compute/docs/metadata) for the contents of this fact. resolution: | GCE: query the GCE metadata endpoint and parse the response. caveats: | All platforms: `libfacter` must be built with `libcurl` support. validate: false gid: type: string hidden: true description: Return the group identifier (GID) of the user running facter. resolution: | POSIX platforms: use the `getegid` fuction to retrieve the group identifier. hardwareisa: type: string hidden: true description: Return the hardware instruction set architecture (ISA). resolution: | POSIX platforms: use `uname` to retrieve the hardware ISA. Windows: use WMI to retrieve the hardware ISA. hardwaremodel: type: string hidden: true description: Return the operating system's hardware model. resolution: | POSIX platforms: use the `uname` function to retrieve the OS hardware model. Windows: use the `GetNativeSystemInfo` function to retrieve the OS hardware model. hostname: type: string hidden: true description: Return the host name of the system. resolution: | POSIX platforms: use the `gethostname` function to retrieve the host name Windows: use the `GetComputerNameExW` function to retrieve the host name. hypervisors: type: map description: | Experimental fact: Return the names of any detected hypervisors and any collected metadata about them. resolution: | All platforms: Use the external `whereami` library to gather hypervisor data, if available. validate: false id: type: string hidden: true description: Return the user identifier (UID) of the user running facter. resolution: | POSIX platforms: use the `geteuid` fuction to retrieve the user identifier. identity: type: map description: Return the identity information of the user running facter. resolution: | POSIX platforms: use the `getegid`, `getpwuid_r`, `geteuid`, and `getgrgid_r` functions to retrieve the identity information; use the result of the `geteuid() == 0` test as the value of the privileged element Windows: use the `GetUserNameExW` function to retrieve the identity information; use the `GetTokenInformation` to get the current process token elevation status and use it as the value of the privileged element on versions of Windows supporting the token elevation, on older versions of Windows use the `CheckTokenMembership` to test whether the well known local Administrators group SID is enabled in the current thread impersonation token and use the test result as the value of the privileged element elements: gid: type: integer description: The group identifier of the user running facter. group: type: string description: The group name of the user running facter. uid: type: integer description: The user identifier of the user running facter. user: type: string description: The user name of the user running facter. privileged: type: boolean description: True if facter is running as a privileged process or false if not. interfaces: type: string hidden: true description: Return the comma-separated list of network interface names. resolution: | Linux: use the `getifaddrs` function to retrieve the network interface names. Mac OSX: use the `getifaddrs` function to retrieve the network interface names. Solaris: use the `ioctl` function to retrieve the network interface names. Windows: use the `GetAdaptersAddresses` function to retrieve the network interface names. ipaddress: type: ip hidden: true description: Return the IPv4 address for the default network interface. resolution: | Linux: use the `getifaddrs` function to retrieve the network interface address. Mac OSX: use the `getifaddrs` function to retrieve the network interface address. Solaris: use the `ioctl` function to retrieve the network interface address. Windows: use the `GetAdaptersAddresses` function to retrieve the network interface address. ipaddress6: type: ip6 hidden: true description: Return the IPv6 address for the default network interface. resolution: | Linux: use the `getifaddrs` function to retrieve the network interface address. Mac OSX: use the `getifaddrs` function to retrieve the network interface address. Solaris: use the `ioctl` function to retrieve the network interface address. Windows: use the `GetAdaptersAddresses` function to retrieve the network interface address. ipaddress6_: pattern: ^ipaddress6_.+$ type: ip6 hidden: true description: Return the IPv6 address for a network interface. resolution: | Linux: use the `getifaddrs` function to retrieve the network interface address. Mac OSX: use the `getifaddrs` function to retrieve the network interface address. Solaris: use the `ioctl` function to retrieve the network interface address. Windows: use the `GetAdaptersAddresses` function to retrieve the network interface address. ipaddress_: pattern: ^ipaddress_.+$ type: ip hidden: true description: Return the IPv4 address for a network interface. resolution: | Linux: use the `getifaddrs` function to retrieve the network interface address. Mac OSX: use the `getifaddrs` function to retrieve the network interface address. Solaris: use the `ioctl` function to retrieve the network interface address. Windows: use the `GetAdaptersAddresses` function to retrieve the network interface address. is_virtual: type: boolean description: Return whether or not the host is a virtual machine. resolution: | Linux: use procfs or utilities such as `vmware` and `virt-what` to retrieve virtual machine status. Mac OSX: use the system profiler to retrieve virtual machine status. Solaris: use the `zonename` utility to retrieve virtual machine status. Windows: use WMI to retrieve virtual machine status. kernel: type: string description: Return the kernel's name. resolution: | POSIX platforms: use the `uname` function to retrieve the kernel name. Windows: use the value of `windows` for all Windows versions. kernelmajversion: type: string description: Return the kernel's major version. resolution: | POSIX platforms: use the `uname` function to retrieve the kernel's major version. Windows: use the file version of `kernel32.dll` to retrieve the kernel's major version. kernelrelease: type: string description: Return the kernel's release. resolution: | POSIX platforms: use the `uname` function to retrieve the kernel's release. Windows: use the file version of `kernel32.dll` to retrieve the kernel's release. kernelversion: type: string description: Return the kernel's version. resolution: | POSIX platforms: use the `uname` function to retrieve the kernel's version. Windows: use the file version of `kernel32.dll` to retrieve the kernel's version. ldom: type: map description: Return Solaris LDom information from the `virtinfo` utility. resolution: | Solaris: use the `virtinfo` utility to retrieve LDom information. validate: false ldom_: pattern: ^ldom_.+$ hidden: true type: string description: Return Solaris LDom information. resolution: | Solaris: use the `virtinfo` utility to retrieve LDom information. load_averages: type: map description: Return the load average over the last 1, 5 and 15 minutes. resolution: | POSIX platforms: use `getloadavg` function to retrieve the system load averages. elements: 1m: type: double description: The system load average over the last minute. 5m: type: double description: The system load average over the last 5 minutes. 15m: type: double description: The system load average over the last 15 minutes. lsbdistcodename: type: string hidden: true description: Return the Linux Standard Base (LSB) distribution code name. resolution: | Linux: use the `lsb_release` utility to retrieve the LSB distribution code name. caveats: | Linux: Requires that the `lsb_release` utility be installed. lsbdistdescription: type: string hidden: true description: Return the Linux Standard Base (LSB) distribution description. resolution: | Linux: use the `lsb_release` utility to retrieve the LSB distribution description. caveats: | Linux: Requires that the `lsb_release` utility be installed. lsbdistid: type: string hidden: true description: Return the Linux Standard Base (LSB) distribution identifier. resolution: | Linux: use the `lsb_release` utility to retrieve the LSB distribution identifier. caveats: | Linux: Requires that the `lsb_release` utility be installed. lsbdistrelease: type: string hidden: true description: Return the Linux Standard Base (LSB) distribution release. resolution: | Linux: use the `lsb_release` utility to retrieve the LSB distribution release. caveats: | Linux: Requires that the `lsb_release` utility be installed. lsbmajdistrelease: type: string hidden: true description: Return the Linux Standard Base (LSB) major distribution release. resolution: | Linux: use the `lsb_release` utility to retrieve the LSB major distribution release. caveats: | Linux: Requires that the `lsb_release` utility be installed. lsbminordistrelease: type: string hidden: true description: Return the Linux Standard Base (LSB) minor distribution release. resolution: | Linux: use the `lsb_release` utility to retrieve the LSB minor distribution release. caveats: | Linux: Requires that the `lsb_release` utility be installed. lsbrelease: type: string hidden: true description: Return the Linux Standard Base (LSB) release. resolution: | Linux: use the `lsb_release` utility to retrieve the LSB release. caveats: | Linux: Requires that the `lsb_release` utility be installed. macaddress: type: mac hidden: true description: Return the MAC address for the default network interface. resolution: | Linux: use the `getifaddrs` function to retrieve the network interface address. Mac OSX: use the `getifaddrs` function to retrieve the network interface address. Solaris: use the `ioctl` function to retrieve the network interface address. Windows: use the `GetAdaptersAddresses` function to retrieve the network interface address. macaddress_: pattern: ^macaddress_.+$ type: mac hidden: true description: Return the MAC address for a network interface. resolution: | Linux: use the `getifaddrs` function to retrieve the network interface address. Mac OSX: use the `getifaddrs` function to retrieve the network interface address. Solaris: use the `ioctl` function to retrieve the network interface address. Windows: use the `GetAdaptersAddresses` function to retrieve the network interface address. macosx_buildversion: type: string hidden: true description: Return the Mac OSX build version. resolution: | Mac OSX: use the `sw_vers` utility to retrieve the Mac OSX build version. macosx_productname: type: string hidden: true description: Return the Mac OSX product name. resolution: | Mac OSX: use the `sw_vers` utility to retrieve the Mac OSX product name. macosx_productversion: type: string hidden: true description: Return the Mac OSX product version. resolution: | Mac OSX: use the `sw_vers` utility to retrieve the Mac OSX product version. macosx_productversion_major: type: string hidden: true description: Return the Mac OSX product major version. resolution: | Mac OSX: use the `sw_vers` utility to retrieve the Mac OSX product major version. macosx_productversion_minor: type: string hidden: true description: Return the Mac OSX product minor version. resolution: | Mac OSX: use the `sw_vers` utility to retrieve the Mac OSX product minor version. macosx_productversion_patch: type: string hidden: true description: Return the Mac OSX product patch version. resolution: | Mac OSX: use the `sw_vers` utility to retrieve the Mac OSX product patch version. manufacturer: type: string hidden: true description: Return the system manufacturer. resolution: | Linux: parse the contents of `/sys/class/dmi/id/sys_vendor` to retrieve the system manufacturer. Solaris: use the `prtconf` utility to retrieve the system manufacturer. Windows: use WMI to retrieve the system manufacturer. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. memory: type: map description: Return the system memory information. resolution: | Linux: parse the contents of `/proc/meminfo` to retrieve the system memory information. Mac OSX: use the `sysctl` function to retrieve the system memory information. Solaris: use the `kstat` function to retrieve the system memory information. Windows: use the `GetPerformanceInfo` function to retrieve the system memory information. elements: swap: type: map description: Represents information about swap memory. elements: available: type: string description: The display size of the available amount of swap memory, such as "1 GiB". available_bytes: type: integer description: The size of the available amount of swap memory, in bytes. capacity: type: string description: The capacity percentage (0% is empty, 100% is full). encrypted: type: boolean description: True if the swap is encrypted or false if not. total: type: string description: The display size of the total amount of swap memory, such as "1 GiB". total_bytes: type: integer description: The size of the total amount of swap memory, in bytes. used: type: string description: The display size of the used amount of swap memory, such as "1 GiB". used_bytes: type: integer description: The size of the used amount of swap memory, in bytes. system: type: map description: Represents information about system memory. elements: available: type: string description: The display size of the available amount of system memory, such as "1 GiB". available_bytes: type: integer description: The size of the available amount of system memory, in bytes. capacity: type: string description: The capacity percentage (0% is empty, 100% is full). total: type: string description: The display size of the total amount of system memory, such as "1 GiB". total_bytes: type: integer description: The size of the total amount of system memory, in bytes. used: type: string description: The display size of the used amount of system memory, such as "1 GiB". used_bytes: type: integer description: The size of the used amount of system memory, in bytes. memoryfree: type: string hidden: true description: Return the display size of the free system memory, such as "1 GiB". resolution: | Linux: parse the contents of `/proc/meminfo` to retrieve the free system memory. Mac OSX: use the `sysctl` function to retrieve the free system memory. Solaris: use the `kstat` function to retrieve the free system memory. Windows: use the `GetPerformanceInfo` function to retrieve the free system memory. memoryfree_mb: type: double hidden: true description: Return the size of the free system memory, in mebibytes. resolution: | Linux: parse the contents of `/proc/meminfo` to retrieve the free system memory. Mac OSX: use the `sysctl` function to retrieve the free system memory. Solaris: use the `kstat` function to retrieve the free system memory. Windows: use the `GetPerformanceInfo` function to retrieve the free system memory. memorysize: type: string hidden: true description: Return the display size of the total system memory, such as "1 GiB". resolution: | Linux: parse the contents of `/proc/meminfo` to retrieve the total system memory. Mac OSX: use the `sysctl` function to retrieve the total system memory. Solaris: use the `kstat` function to retrieve the total system memory. Windows: use the `GetPerformanceInfo` function to retrieve the total system memory. memorysize_mb: type: double hidden: true description: Return the size of the total system memory, in mebibytes. resolution: | Linux: parse the contents of `/proc/meminfo` to retrieve the total system memory. Mac OSX: use the `sysctl` function to retrieve the total system memory. Solaris: use the `kstat` function to retrieve the total system memory. Windows: use the `GetPerformanceInfo` function to retrieve the total system memory. mountpoints: type: map description: Return the current mount points of the system. resolution: | AIX: use the `mntctl` function to retrieve the mount points. Linux: use the `setmntent` function to retrieve the mount points. Mac OSX: use the `getfsstat` function to retrieve the mount points. Solaris: parse the contents of `/etc/mnttab` to retrieve the mount points. blockgroup: file system elements: : pattern: .+ type: map description: Represents a mount point. elements: available: type: string description: The display size of the available space, such as "1 GiB". available_bytes: type: integer description: The size of the available space, in bytes. capacity: type: string description: The capacity percentage (0% is empty, 100% is full). device: type: string description: The name of the mounted device. filesystem: type: string description: The file system of the mounted device. options: type: array description: The mount options. size: type: string description: The display size of the total space, such as "1 GiB". size_bytes: type: integer description: The size of the total space, in bytes. used: type: string description: The display size of the used space, such as "1 GiB". used_bytes: type: integer description: The size of the used space, in bytes. mtu_: pattern: ^mtu_.+$ type: integer hidden: true description: Return the Maximum Transmission Unit (MTU) for a network interface. resolution: | Linux: use the `ioctl` function to retrieve the network interface MTU. Mac OSX: use the `getifaddrs` function to retrieve the network interface MTU. Solaris: use the `ioctl` function to retrieve the network interface MTU. Windows: use the `GetAdaptersAddresses` function to retrieve the network interface MTU. netmask: type: ip hidden: true description: Return the IPv4 netmask for the default network interface. resolution: | Linux: use the `getifaddrs` function to retrieve the network interface netmask. Mac OSX: use the `getifaddrs` function to retrieve the network interface netmask. Solaris: use the `ioctl` function to retrieve the network interface netmask. Windows: use the `GetAdaptersAddresses` (Windows Server 2003: `GetAdaptersInfo`) function to retrieve the network interface netmask. netmask6: type: ip6 hidden: true description: Return the IPv6 netmask for the default network interface. resolution: | Linux: use the `getifaddrs` function to retrieve the network interface netmask. Mac OSX: use the `getifaddrs` function to retrieve the network interface netmask. Solaris: use the `ioctl` function to retrieve the network interface netmask. Windows: use the `GetAdaptersAddresses` function to retrieve the network interface netmask. caveats: | Windows Server 2003: IPv6 netmasks are not supported. netmask6_: pattern: ^netmask6_.+$ type: ip6 hidden: true description: Return the IPv6 netmask for a network interface. resolution: | Linux: use the `getifaddrs` function to retrieve the network interface netmask. Mac OSX: use the `getifaddrs` function to retrieve the network interface netmask. Solaris: use the `ioctl` function to retrieve the network interface netmask. Windows: use the `GetAdaptersAddresses` function to retrieve the network interface netmask. caveats: | Windows Server 2003: IPv6 netmasks are not supported. netmask_: pattern: ^netmask_.+$ type: ip hidden: true description: Return the IPv4 netmask for a network interface. resolution: | Linux: use the `getifaddrs` function to retrieve the network interface netmask. Mac OSX: use the `getifaddrs` function to retrieve the network interface netmask. Solaris: use the `ioctl` function to retrieve the network interface netmask. Windows: use the `GetAdaptersAddresses` (Windows Server 2003: `GetAdaptersInfo`) function to retrieve the network interface netmask. network: type: ip hidden: true description: Return the IPv4 network for the default network interface. resolution: | Linux: use the `getifaddrs` function to retrieve the network interface network. Mac OSX: use the `getifaddrs` function to retrieve the network interface network. Solaris: use the `ioctl` function to retrieve the network interface network. Windows: use the `GetAdaptersAddresses` function to retrieve the network interface network. network6: type: ip6 hidden: true description: Return the IPv6 network for the default network interface. resolution: | Linux: use the `getifaddrs` function to retrieve the network interface network. Mac OSX: use the `getifaddrs` function to retrieve the network interface network. Solaris: use the `ioctl` function to retrieve the network interface network. Windows: use the `GetAdaptersAddresses` function to retrieve the network interface network. network6_: pattern: ^network6_.+$ type: ip6 hidden: true description: Return the IPv6 network for a network interface. resolution: | Linux: use the `getifaddrs` function to retrieve the network interface network. Mac OSX: use the `getifaddrs` function to retrieve the network interface network. Solaris: use the `ioctl` function to retrieve the network interface network. Windows: use the `GetAdaptersAddresses` function to retrieve the network interface network. network_: pattern: ^network_.+$ type: ip hidden: true description: Return the IPv4 network for a network interface. resolution: | Linux: use the `getifaddrs` function to retrieve the network interface network. Mac OSX: use the `getifaddrs` function to retrieve the network interface network. Solaris: use the `ioctl` function to retrieve the network interface network. Windows: use the `GetAdaptersAddresses` function to retrieve the network interface network. networking: type: map description: Return the networking information for the system. resolution: | Linux: use the `getifaddrs` function to retrieve the network interfaces. Mac OSX: use the `getifaddrs` function to retrieve the network interfaces. Solaris: use the `ioctl` function to retrieve the network interfaces. Windows: use the `GetAdaptersAddresses` function to retrieve the network interfaces. caveats: | Windows Server 2003: the `GetAdaptersInfo` function is used for DHCP and netmask lookup. This function does not support IPv6 netmasks. elements: dhcp: type: ip description: The address of the DHCP server for the default interface. domain: type: string description: The domain name of the system. fqdn: type: string description: The fully-qualified domain name of the system. hostname: type: string description: The host name of the system. interfaces: type: map description: The network interfaces of the system. elements: : pattern: .+ type: map description: Represents a network interface. elements: bindings: type: array description: The array of IPv4 address bindings for the interface. bindings6: type: array description: The array of IPv6 address bindings for the interface. dhcp: type: ip description: The DHCP server for the network interface. duplex: type: string description: The duplex settings for physical network interfaces on Linux using /sys/class/net. ip: type: ip description: The IPv4 address for the network interface. ip6: type: ip6 description: The IPv6 address for the network interface. mac: type: mac description: The MAC address for the network interface. mtu: type: integer description: The Maximum Transmission Unit (MTU) for the network interface. netmask: type: ip description: The IPv4 netmask for the network interface. netmask6: type: ip6 description: The IPv6 netmask for the network interface. network: type: ip description: The IPv4 network for the network interface. network6: type: ip6 description: The IPv6 network for the network interface. operational_state: type: string description: The operational state for Linux based systems. physical: type: boolean description: Return whether network interface is a physical device on Linux based systems. scope6: type: string description: The IPv6 scope for the network interface. speed: type: integer description: The speed of physical network interfaces on Linux using /sys/class/net. ip: type: ip description: The IPv4 address of the default network interface. ip6: type: ip6 description: The IPv6 address of the default network interface. mac: type: mac description: The MAC address of the default network interface. mtu: type: integer description: The Maximum Transmission Unit (MTU) of the default network interface. netmask: type: ip description: The IPv4 netmask of the default network interface. netmask6: type: ip6 description: The IPv6 netmask of the default network interface. network: type: ip description: The IPv4 network of the default network interface. network6: type: ip6 description: The IPv6 network of the default network interface. primary: type: string description: The name of the primary interface. scope6: type: string description: The IPv6 scope of the default network interface. operatingsystem: type: string hidden: true description: Return the name of the operating system. resolution: | All platforms: default to the kernel name. Linux: use various release files in `/etc` to retrieve the OS name. operatingsystemmajrelease: type: string hidden: true description: Return the major release of the operating system. resolution: | All platforms: default to the major version of the kernel release. Linux: parse the contents of release files in `/etc` to retrieve the OS major release. Solaris: parse the contents of `/etc/release` to retrieve the OS major release. Windows: use WMI to retrieve the OS major release. caveats: | Linux: for Ubuntu, the major release is X.Y, such as "10.4". operatingsystemrelease: type: string hidden: true description: Return the release of the operating system. resolution: | All platforms: default to the kernel release. Linux: parse the contents of release files in `/etc` to retrieve the OS release. Solaris: parse the contents of `/etc/release` to retrieve the OS release. Windows: use WMI to retrieve the OS release. os: type: map description: Return information about the host operating system. resolution: | Linux: use the `lsb_release` utility and parse the contents of release files in `/etc` to retrieve the OS information. OSX: use the `sw_vers` utility to retrieve the OS information. Solaris: parse the contents of `/etc/release` to retrieve the OS information. Windows: use WMI to retrieve the OS information. elements: architecture: type: string description: The operating system's hardware architecture. distro: type: map description: Represents information about a Linux distribution. caveats: | Linux: requires that the `lsb_release` is present. elements: codename: type: string description: The code name of the Linux distribution. description: type: string description: The description of the Linux distribution. id: type: string description: The identifier of the Linux distribution. release: type: map description: Represents information about a Linux distribution release. elements: full: type: string description: The full release of the Linux distribution. major: type: string description: The major release of the Linux distribution. minor: type: string description: The minor release of the Linux distribution. specification: type: string description: The Linux Standard Base (LSB) release specification. family: type: string description: The operating system family. hardware: type: string description: The operating system's hardware model. macosx: type: map description: Represents information about Mac OSX. elements: build: type: string description: The Mac OSX build version. product: type: string description: The Mac OSX product name. version: type: map description: Represents information about the Mac OSX version. elements: extra: type: string description: The ProductVersionExtra value. Only supported on macOS 13 and later. full: type: string description: The full Mac OSX version number. major: type: string description: The major Mac OSX version number. minor: type: string description: The minor Mac OSX version number. patch: type: string description: The patch Mac OSX version number. name: type: string description: The operating system's name. release: type: map description: Represents the operating system's release. elements: full: type: string description: The full operating system release. major: type: string description: The major release of the operating system. minor: type: string description: The minor release of the operating system. patchlevel: type: string description: The patchlevel of the operating system. branch: type: string description: The branch the operating system was cut from. selinux: type: map description: Represents information about Security-Enhanced Linux (SELinux). resolution: | Linux: parse the contents of `/proc/self/mounts`, `/etc/selinux/config`, and `/enforce` to retrieve SELinux information. elements: config_mode: type: string description: The configured SELinux mode. config_policy: type: string description: The configured SELinux policy. current_mode: type: string description: The current SELinux mode. enabled: type: boolean description: True if SELinux is enabled or false if not. enforced: type: boolean description: True if SELinux policy is enforced or false if not. policy_version: type: string description: The version of the SELinux policy. windows: type: map description: Represents information about Windows. elements: edition_id: type: string description: Specify the edition variant. (ServerStandard|Professional|Enterprise) installation_type: type: string description: Specify the installation type. (Server|Server Core|Client) product_name: type: string description: Specify the textual product name. release_id: type: string description: Windows Build Version of the form YYMM. system32: type: string description: The path to the System32 directory. osfamily: type: string hidden: true description: Return the family of the operating system. resolution: | All platforms: default to the kernel name. Linux: map various Linux distributions to their base distribution. For example, Ubuntu is a "Debian" distro. Solaris: map various Solaris-based operating systems to the "Solaris" family. Windows: use "windows" as the family name. partitions: type: map description: Return the disk partitions of the system. resolution: | AIX: use the ODM to retrieve list of logical volumes; use `lvm_querylv` function to get details Linux: use `libblkid` to retrieve the disk partitions. caveats: | Linux: `libfacter` must be built with `libblkid` support. blockgroup: file system elements: : pattern: \w+ type: map description: Represents a disk partition. elements: filesystem: type: string description: The file system of the partition. label: type: string description: The label of the partition. mount: type: string description: The mount point of the partition (if mounted). partlabel: type: string description: The label of a GPT partition. partuuid: type: string description: The unique identifier of a GPT partition. size: type: string description: The display size of the partition, such as "1 GiB". size_bytes: type: integer description: The size of the partition, in bytes. uuid: type: string description: The unique identifier of a partition. backing_file: type: string description: The path to the file backing the partition. parttype: type: string description: The partition type GUID. path: type: string description: Return the PATH environment variable. resolution: | All platforms: retrieve the value of the PATH environment variable. physicalprocessorcount: type: integer hidden: true description: Return the count of physical processors. resolution: | Linux: parse the contents `/sys/devices/system/cpu/` and `/proc/cpuinfo` to retrieve the count of physical processors. Mac OSX: use the `sysctl` function to retrieve the count of physical processors. Solaris: use the `kstat` function to retrieve the count of physical processors. Windows: use WMI to retrieve the count of physical processors. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. processor: pattern: ^processor\d+$ type: string hidden: true description: Return the model string of processor N. resolution: | Linux: parse the contents of `/proc/cpuinfo` to retrieve the processor model string. Mac OSX: use the `sysctl` function to retrieve the processor model string. Solaris: use the `kstat` function to retrieve the processor model string. Windows: use WMI to retrieve the processor model string. processorcount: type: integer hidden: true description: Return the count of logical processors. resolution: | Linux: parse the contents `/sys/devices/system/cpu/` and `/proc/cpuinfo` to retrieve the count of logical processors. Mac OSX: use the `sysctl` function to retrieve the count of logical processors. Solaris: use the `kstat` function to retrieve the count of logical processors. Windows: use WMI to retrieve the count of logical processors. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. processors: type: map description: Return information about the system's processors. resolution: | Linux: parse the contents `/sys/devices/system/cpu/` and `/proc/cpuinfo` to retrieve the processor information. Mac OSX: use the `sysctl` function to retrieve the processor information. Solaris: use the `kstat` function to retrieve the processor information. Windows: use WMI to retrieve the processor information. elements: count: type: integer description: The count of logical processors. extensions: type: array description: The CPU extensions the processor supports. isa: type: string description: The processor instruction set architecture. models: type: array description: The processor model strings (one for each logical processor). physicalcount: type: integer description: The count of physical processors. speed: type: string description: The speed of the processors, such as "2.0 GHz". cores: type: integer description: The number of cores per processor socket. threads: type: integer description: The number of threads per processor core. productname: type: string hidden: true description: Return the system product name. resolution: | Linux: parse the contents of `/sys/class/dmi/id/product_name` to retrieve the system product name. Mac OSX: use the `sysctl` function to retrieve the system product name. Solaris: use the `smbios` utility to retrieve the system product name. Windows: use WMI to retrieve the system product name. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. ruby: type: map description: Return information about the Ruby loaded by facter. resolution: | All platforms: Use `RbConfig`, `RUBY_PLATFORM`, and `RUBY_VERSION` to retrieve information about Ruby. caveats: | All platforms: facter must be able to locate `libruby`. elements: platform: type: string description: The platform Ruby was built for. sitedir: type: string description: The path to Ruby's site library directory. version: type: string description: The version of Ruby. rubyplatform: type: string hidden: true description: Return the platform Ruby was built for. resolution: | All platforms: use `RUBY_PLATFORM` from the Ruby loaded by facter. caveats: | All platforms: facter must be able to locate `libruby`. rubysitedir: type: string hidden: true description: Return the path to Ruby's site library directory. resolution: | All platforms: use `RbConfig` from the Ruby loaded by facter. caveats: | All platforms: facter must be able to locate `libruby`. rubyversion: type: string hidden: true description: Return the version of Ruby. resolution: | All platforms: use `RUBY_VERSION` from the Ruby loaded by facter. caveats: | All platforms: facter must be able to locate `libruby`. scope6: type: string hidden: true description: Return the IPv6 scope for the default network interface. resolution: | Linux: parse the contents of /proc/net/if_inet6 to retrieve the network interface scope. Mac OSX: use the `getifaddrs` function to retrieve the network interface scope. Solaris: use the `ioctl` function to retrieve the network interface scope. Windows: use the `GetAdaptersAddresses` function to retrieve the network interface scope. scope6_: pattern: ^scope6_.+$ type: string hidden: true description: Return the IPv6 scope for the default network interface. resolution: | Linux: parse the contents of /proc/net/if_inet6 to retrieve the network interface scope. Mac OSX: use the `getifaddrs` function to retrieve the network interface scope. Solaris: use the `ioctl` function to retrieve the network interface scope. Windows: use the `GetAdaptersAddresses` function to retrieve the network interface scope. selinux: type: boolean hidden: true description: Return whether Security-Enhanced Linux (SELinux) is enabled. resolution: | Linux: parse the contents of `/proc/self/mounts` to determine if SELinux is enabled. selinux_config_mode: type: string hidden: true description: Return the configured Security-Enhanced Linux (SELinux) mode. resolution: | Linux: parse the contents of `/etc/selinux/config` to retrieve the configured SELinux mode. selinux_config_policy: type: string hidden: true description: Return the configured Security-Enhanced Linux (SELinux) policy. resolution: | Linux: parse the contents of `/etc/selinux/config` to retrieve the configured SELinux policy. selinux_current_mode: type: string hidden: true description: Return the current Security-Enhanced Linux (SELinux) mode. resolution: | Linux: parse the contents of `/enforce` to retrieve the current SELinux mode. selinux_enforced: type: boolean hidden: true description: Return whether Security-Enhanced Linux (SELinux) is enforced. resolution: | Linux: parse the contents of `/enforce` to retrieve the current SELinux mode. selinux_policyversion: type: string hidden: true description: Return the Security-Enhanced Linux (SELinux) policy version. resolution: | Linux: parse the contents of `/policyvers` to retrieve the SELinux policy version. serialnumber: type: string hidden: true description: Return the system product serial number. resolution: | Linux: parse the contents of `/sys/class/dmi/id/product_name` to retrieve the system product serial number. Solaris: use the `smbios` utility to retrieve the system product serial number. Windows: use WMI to retrieve the system product serial number. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. solaris_zones: type: map description: Return information about Solaris zones. resolution: | Solaris: use the `zoneadm` and `zonename` utilities to retrieve information about the Solaris zones. elements: current: type: string description: The name of the current Solaris zone. zones: type: map description: Represents the Solaris zones. elements: : pattern: .* type: map description: Represents a Solaris zone. elements: brand: type: string description: The brand of the Solaris zone. id: type: string description: The id of the Solaris zone. ip_type: type: string description: The IP type of the Solaris zone. path: type: string description: The path of the Solaris zone. status: type: string description: The status of the Solaris zone. uuid: type: string description: The unique identifier of the Solaris zone. sp_: pattern: ^sp_\w+$ hidden: true type: string description: Return Mac OSX system profiler information. resolution: | Mac OSX: use the `system_profiler` utility to retrieve system profiler information. ssh: type: map description: Return SSH public keys and fingerprints. resolution: | POSIX platforms: parse SSH public key files and derive fingerprints. caveats: | POSIX platforms: facter must be built with OpenSSL support. elements: dsa: type: map description: Represents the public key and fingerprints for the DSA algorithm. elements: fingerprints: type: map description: Represents fingerprint information. elements: sha1: type: string description: The SHA1 fingerprint of the public key. sha256: type: string description: The SHA256 fingerprint of the public key. key: type: string description: The DSA public key. type: type: string description: The exact type of the key, i.e. "ssh-dss". ecdsa: type: map description: Represents the public key and fingerprints for the ECDSA algorithm. elements: fingerprints: type: map description: Represents fingerprint information. elements: sha1: type: string description: The SHA1 fingerprint of the public key. sha256: type: string description: The SHA256 fingerprint of the public key. key: type: string description: The ECDSA public key. type: type: string description: The exact type of the key, e.g. "ecdsa-sha2-nistp256". ed25519: type: map description: Represents the public key and fingerprints for the Ed25519 algorithm. elements: fingerprints: type: map description: Represents fingerprint information. elements: sha1: type: string description: The SHA1 fingerprint of the public key. sha256: type: string description: The SHA256 fingerprint of the public key. key: type: string description: The Ed25519 public key. type: type: string description: The exact type of the key, i.e. "ssh-ed25519". rsa: type: map description: Represents the public key and fingerprints for the RSA algorithm. elements: fingerprints: type: map description: Represents fingerprint information. elements: sha1: type: string description: The SHA1 fingerprint of the public key. sha256: type: string description: The SHA256 fingerprint of the public key. key: type: string description: The RSA public key. type: type: string description: The exact type of the key, i.e. "ssh-rsa". sshkey: pattern: ^ssh\w*key$ hidden: true type: string description: Return the SSH public key for the algorithm. resolution: | POSIX platforms: parse SSH public key files. caveats: | POSIX platforms: facter must be built with OpenSSL support. sshfp_: pattern: ^sshfp_\w*$ hidden: true type: string description: Return the SSH fingerprints for the algorithm's public key. resolution: | POSIX platforms: derive the SHA1 and SHA256 fingerprints; delimit with a new line character. caveats: | POSIX platforms: facter must be built with OpenSSL support. swapencrypted: type: boolean hidden: true description: Return whether or not the swap is encrypted. resolution: | Mac OSX: use the `sysctl` function to retrieve swap encryption status. swapfree: type: string hidden: true description: Return the display size of the free swap memory, such as "1 GiB". resolution: | Linux: parse the contents of `/proc/meminfo` to retrieve the free swap memory. Mac OSX: use the `sysctl` function to retrieve the free swap memory. Solaris: use the `swapctl` function to retrieve the free swap memory. swapfree_mb: type: double hidden: true description: Return the size of the free swap memory, in mebibytes. resolution: | Linux: parse the contents of `/proc/meminfo` to retrieve the free swap memory. Mac OSX: use the `sysctl` function to retrieve the free swap memory. Solaris: use the `swapctl` function to retrieve the free swap memory. swapsize: type: string hidden: true description: Return the display size of the total swap memory, such as "1 GiB". resolution: | Linux: parse the contents of `/proc/meminfo` to retrieve the total swap memory. Mac OSX: use the `sysctl` function to retrieve the total swap memory. Solaris: use the `swapctl` function to retrieve the total swap memory. swapsize_mb: type: double hidden: true description: Return the size of the total swap memory, in mebibytes. resolution: | Linux: parse the contents of `/proc/meminfo` to retrieve the total swap memory. Mac OSX: use the `sysctl` function to retrieve the total swap memory. Solaris: use the `swapctl` function to retrieve the total swap memory. windows_edition_id: type: string hidden: true description: Return the type of Windows edition, Server or Desktop Edition variant. resolution: | Windows: query the registry to retrieve the type of edition (ServerStandard|Professional|Enterprise). windows_installation_type: type: string hidden: true description: Return Windows installation type (Server|Server Core|Client). resolution: | Windows: query the registry to retrive data to differentiate Server, Server Core, Client. windows_product_name: type: string hidden: true description: Return Windows textual product name. resolution: | Windows: uery the registry to retrive textual product name. windows_release_id: type: string hidden: true description: Return Windows Build Version of the form YYMM. resolution: | Windows: query the registry to retrieve the build version number. system32: type: string hidden: true description: Return the path to the System32 directory on Windows. resolution: | Windows: use the `SHGetFolderPath` function to retrieve the path to the System32 directory. system_profiler: type: map description: Return information from the Mac OSX system profiler. resolution: | Mac OSX: use the `system_profiler` utility to retrieve system profiler information. elements: boot_mode: type: string description: The boot mode. boot_rom_version: type: string description: The boot ROM version. boot_volume: type: string description: The boot volume. computer_name: type: string description: The name of the computer. cores: type: string description: The total number of processor cores. hardware_uuid: type: string description: The hardware unique identifier. kernel_version: type: string description: The version of the kernel. l2_cache_per_core: type: string description: The size of the processor per-core L2 cache. l3_cache: type: string description: The size of the processor L3 cache. memory: type: string description: The size of the system memory. model_identifier: type: string description: The identifier of the computer model. model_name: type: string description: The name of the computer model. processor_name: type: string description: The model name of the processor. processor_speed: type: string description: The speed of the processor. processors: type: string description: The total number of processors. secure_virtual_memory: type: string description: Whether or not secure virtual memory is enabled. serial_number: type: string description: The serial number of the computer. smc_version: type: string description: The System Management Controller (SMC) version. system_version: type: string description: The operating system version. uptime: type: string description: The uptime of the system. username: type: string description: The name of the user running facter. system_uptime: type: map description: Return the system uptime information. resolution: | Linux: use the `sysinfo` function to retrieve the system uptime. POSIX platforms: use the `uptime` utility to retrieve the system uptime. Solaris: use the `kstat` function to retrieve the system uptime. Windows: use WMI to retrieve the system uptime. elements: days: type: integer description: The number of complete days the system has been up. hours: type: integer description: The number of complete hours the system has been up. seconds: type: integer description: The number of total seconds the system has been up. uptime: type: string description: The full uptime string. timezone: type: string description: Return the system timezone. resolution: | POSIX platforms: use the `localtime_r` function to retrieve the system timezone. Windows: use the `localtime_s` function to retrieve the system timezone. uptime: type: string hidden: true description: Return the system uptime. resolution: | Linux: use the `sysinfo` function to retrieve the system uptime. POSIX platforms: use the `uptime` utility to retrieve the system uptime. Solaris: use the `kstat` function to retrieve the system uptime. Windows: use WMI to retrieve the system uptime. uptime_days: type: integer hidden: true description: Return the system uptime days. resolution: | Linux: use the `sysinfo` function to retrieve the system uptime days. POSIX platforms: use the `uptime` utility to retrieve the system uptime days. Solaris: use the `kstat` function to retrieve the system uptime days. Windows: use WMI to retrieve the system uptime days. uptime_hours: type: integer hidden: true description: Return the system uptime hours. resolution: | Linux: use the `sysinfo` function to retrieve the system uptime hours. POSIX platforms: use the `uptime` utility to retrieve the system uptime hours. Solaris: use the `kstat` function to retrieve the system uptime hours. Windows: use WMI to retrieve the system uptime hours. uptime_seconds: type: integer hidden: true description: Return the system uptime seconds. resolution: | Linux: use the `sysinfo` function to retrieve the system uptime seconds. POSIX platforms: use the `uptime` utility to retrieve the system uptime seconds. Solaris: use the `kstat` function to retrieve the system uptime seconds. Windows: use WMI to retrieve the system uptime seconds. uuid: type: string hidden: true description: Return the system product unique identifier. resolution: | Linux: parse the contents of `/sys/class/dmi/id/product_uuid` to retrieve the system product unique identifier. Solaris: use the `smbios` utility to retrieve the system product unique identifier. caveats: | Linux: kernel 2.6+ is required due to the reliance on sysfs. virtual: type: string description: Return the hypervisor name for virtual machines or "physical" for physical machines. resolution: | Linux: use procfs or utilities such as `vmware` and `virt-what` to retrieve virtual machine name. Mac OSX: use the system profiler to retrieve virtual machine name. Solaris: use the `zonename` utility to retrieve virtual machine name. Windows: use WMI to retrieve virtual machine name. xen: type: map description: Return metadata for the Xen hypervisor. resolution: | POSIX platforms: if `/usr/sbin/xl` and `/usr/sbin/xm` is installed use `/usr/lib/xen-common/bin/xen-toolstack` to choose, otherwise try `/usr/sbin/xl` then `/usr/sbin/xm` in order. Use the found command to execute the `list` query. caveats: | POSIX platforms: confined to Xen privileged virtual machines. elements: domains: type: array description: list of strings identifying active Xen domains. xendomains: type: string hidden: true description: Return a list of comma-separated active Xen domain names. resolution: | POSIX platforms: see the `xen` structured fact. caveats: | POSIX platforms: confined to Xen privileged virtual machines. zfs_featurenumbers: type: string description: Return the comma-delimited feature numbers for ZFS. resolution: | Solaris: use the `zfs` utility to retrieve the feature numbers for ZFS caveats: | Solaris: the `zfs` utility must be present. zfs_version: type: string description: Return the version for ZFS. resolution: | Solaris: use the `zfs` utility to retrieve the version for ZFS caveats: | Solaris: the `zfs` utility must be present. zone__brand: pattern: ^zone_[\w\-\.]+_brand$ type: string hidden: true description: Return the brand for the Solaris zone. resolution: | Solaris: use the `zoneadm` utility to retrieve the brand for the Solaris zone. caveats: | Solaris: the `zoneadm` utility must be present. zone__iptype: pattern: ^zone_[\w\-\.]+_iptype$ type: string hidden: true description: Return the IP type for the Solaris zone. resolution: | Solaris: use the `zoneadm` utility to retrieve the IP type for the Solaris zone. caveats: | Solaris: the `zoneadm` utility must be present. zone__name: pattern: ^zone_[\w\-\.]+_name$ type: string hidden: true description: Return the name for the Solaris zone. resolution: | Solaris: use the `zoneadm` utility to retrieve the name for the Solaris zone. caveats: | Solaris: the `zoneadm` utility must be present. zone__uuid: pattern: ^zone_[\w\-\.]+_uuid$ type: string hidden: true description: Return the unique identifier for the Solaris zone. resolution: | Solaris: use the `zoneadm` utility to retrieve the unique identifier for the Solaris zone. caveats: | Solaris: the `zoneadm` utility must be present. zone__id: pattern: ^zone_[\w\-\.]+_id$ type: string hidden: true description: Return the zone identifier for the Solaris zone. resolution: | Solaris: use the `zoneadm` utility to retrieve the zone identifier for the Solaris zone. caveats: | Solaris: the `zoneadm` utility must be present. zone__path: pattern: ^zone_[\w\-\.]+_path$ type: string hidden: true description: Return the zone path for the Solaris zone. resolution: | Solaris: use the `zoneadm` utility to retrieve the zone path for the Solaris zone. caveats: | Solaris: the `zoneadm` utility must be present. zone__status: pattern: ^zone_[\w\-\.]+_status$ type: string hidden: true description: Return the zone state for the Solaris zone. resolution: | Solaris: use the `zoneadm` utility to retrieve the zone state for the Solaris zone. caveats: | Solaris: the `zoneadm` utility must be present. zonename: type: string hidden: true description: Return the name of the current Solaris zone. resolution: | Solaris: use the `zonename` utility to retrieve the current zone name. caveats: | Solaris: the `zonename` utility must be present. zones: type: integer hidden: true description: Return the count of Solaris zones. resolution: | Solaris: use the `zoneadm` utility to retrieve the count of Solaris zones. caveats: | Solaris: the `zoneadm` utility must be present. zpool_featureflags: type: string description: Return the comma-delimited feature flags for ZFS storage pools. resolution: | Solaris: use the `zpool` utility to retrieve the feature numbers for ZFS storage pools caveats: | Solaris: the `zpool` utility must be present. zpool_featurenumbers: type: string description: Return the comma-delimited feature numbers for ZFS storage pools. resolution: | Solaris: use the `zpool` utility to retrieve the feature numbers for ZFS storage pools caveats: | Solaris: the `zpool` utility must be present. zpool_version: type: string description: Return the version for ZFS storage pools. resolution: | Solaris: use the `zpool` utility to retrieve the version for ZFS storage pools caveats: | Solaris: the `zpool` utility must be present. nim_type: type: string description: Tells if the node is master or standalone inside an AIX Nim environment. details: | Is Available only on AIX. puppetlabs-facter-dfe6df4/man/000077500000000000000000000000001470204764400165025ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/man/man8/000077500000000000000000000000001470204764400173455ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/man/man8/facter.8000066400000000000000000000120471470204764400207060ustar00rootroot00000000000000.\" generated with Ronn/v0.7.3 .\" http://github.com/rtomayko/ronn/tree/0.7.3 . .TH "FACTER" "8" "March 2024" "Puppet, Inc." "Facter manual" . .SH "NAME" \fBfacter\fR \- collect and display facts about the current system . .SH "SYNOPSIS" \fBfacter\fR [options] [query] [query] [\.\.\.] . .SH "DESCRIPTION" \fBfacter\fR is a command\-line tool that gathers basic facts about nodes (systems) such as hardware details, network settings, OS type and version, and more\. These facts are made available as variables in your Puppet manifests and can be used to inform conditional expressions in Puppet\. . .P If no queries are given, then all facts will be returned\. . .P Many of the command line options can also be set via the HOCON config file\. This file can also be used to block or cache certain fact groups\. . .SH "OPTIONS" . .TP \fB\-\-color\fR: . .IP Enable color output\. . .TP \fB\-\-no\-color\fR: . .IP Disable color output\. . .TP \fB\-c\fR, \fB\-\-config\fR: . .IP The location of the config file\. . .TP \fB\-\-custom\-dir\fR: . .IP A directory to use for custom facts\. . .TP \fB\-d\fR, \fB\-\-debug\fR: . .IP Enable debug output\. . .TP \fB\-\-external\-dir\fR: . .IP A directory to use for external facts\. . .TP \fB\-\-hocon\fR: . .IP Output in Hocon format\. . .TP \fB\-j\fR, \fB\-\-json\fR: . .IP Output in JSON format\. . .TP \fB\-l\fR, \fB\-\-log\-level\fR: . .IP Set logging level\. Supported levels are: none, trace, debug, info, warn, error, and fatal\. . .TP \fB\-\-no\-block\fR: . .IP Disable fact blocking\. . .TP \fB\-\-no\-cache\fR: . .IP Disable loading and refreshing facts from the cache . .TP \fB\-\-no\-custom\-facts\fR: . .IP Disable custom facts\. . .TP \fB\-\-no\-external\-facts\fR: . .IP Disable external facts\. . .TP \fB\-\-no\-ruby\fR: . .IP Disable loading Ruby, facts requiring Ruby, and custom facts\. . .TP \fB\-\-trace\fR: . .IP Enable backtraces for custom facts\. . .TP \fB\-\-verbose\fR: . .IP Enable verbose (info) output\. . .TP \fB\-\-show\-legacy\fR: . .IP Show legacy facts when querying all facts\. . .TP \fB\-y\fR, \fB\-\-yaml\fR: . .IP Output in YAML format\. . .TP \fB\-\-strict\fR: . .IP Enable more aggressive error reporting\. . .TP \fB\-t\fR, \fB\-\-timing\fR: . .IP Show how much time it took to resolve each fact . .TP \fB\-\-sequential\fR: . .IP Resolve facts sequentially . .TP \fB\-\-http\-debug\fR: . .IP Whether to write HTTP request and responses to stderr\. This should never be used in production\. . .TP \fB\-p\fR, \fB\-\-puppet\fR: . .IP Load the Puppet libraries, thus allowing Facter to load Puppet\-specific facts\. . .TP \fB\-\-version, \-v\fR: . .IP Print the version . .TP \fB\-\-list\-block\-groups\fR: . .IP List block groups . .TP \fB\-\-list\-cache\-groups\fR: . .IP List cache groups . .TP \fB\-\-help, \-h\fR: . .IP Help for all arguments . .SH "FILES" \fI/etc/puppetlabs/facter/facter\.conf\fR . .P A HOCON config file that can be used to specify directories for custom and external facts, set various command line options, and specify facts to block\. See example below for details, or visit the GitHub README \fIhttps://github\.com/puppetlabs/puppetlabs\-hocon#overview\fR\. . .SH "EXAMPLES" Display all facts: . .IP "" 4 . .nf $ facter disks => { sda => { model => "Virtual disk", size => "8\.00 GiB", size_bytes => 8589934592, vendor => "ExampleVendor" } } dmi => { bios => { release_date => "06/23/2013", vendor => "Example Vendor", version => "6\.00" } } [\.\.\.] . .fi . .IP "" 0 . .P Display a single structured fact: . .IP "" 4 . .nf $ facter processors { count => 2, isa => "x86_64", models => [ "Intel(R) Xeon(R) CPU E5\-2680 v2 @ 2\.80GHz", "Intel(R) Xeon(R) CPU E5\-2680 v2 @ 2\.80GHz" ], physicalcount => 2 } . .fi . .IP "" 0 . .P Display a single fact nested within a structured fact: . .IP "" 4 . .nf $ facter processors\.isa x86_64 . .fi . .IP "" 0 . .P Display a single legacy fact\. Note that non\-structured facts existing in previous versions of Facter are still available, but are not displayed by default due to redundancy with newer structured facts: . .IP "" 4 . .nf $ facter processorcount 2 . .fi . .IP "" 0 . .P Format facts as JSON: . .IP "" 4 . .nf $ facter \-\-json os\.name os\.release\.major processors\.isa { "os\.name": "Ubuntu", "os\.release\.major": "14\.04", "processors\.isa": "x86_64" } . .fi . .IP "" 0 . .P An example config file\. . .IP "" 4 . .nf # always loaded (CLI and as Ruby module) global : { external\-dir : "~/external/facts", custom\-dir : [ "~/custom/facts", "~/custom/facts/more\-facts" ], no\-external\-facts : false, no\-custom\-facts : false, no\-ruby : false } # loaded when running from the command line cli : { debug : false, trace : true, verbose : false, log\-level : "info" } # always loaded, fact\-specific configuration facts : { # for valid blocklist entries, use \-\-list\-block\-groups blocklist : [ "file system", "EC2" ], # for valid time\-to\-live entries, use \-\-list\-cache\-groups ttls : [ { "timezone" : 30 days } ] } . .fi . .IP "" 0 puppetlabs-facter-dfe6df4/scripts/000077500000000000000000000000001470204764400174165ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/scripts/generate_changelog.rb000077500000000000000000000076501470204764400235570ustar00rootroot00000000000000#!/usr/bin/env ruby # frozen_string_literal: true require 'octokit' class ChangelogGenerator attr_reader :version, :entries, :unlabeled_prs def initialize(version) unless version warn 'Usage: generate_changelog.rb VERSION' exit 1 end @version = version @entries = { 'feature' => { name: 'Added', entries: {} }, 'bugfix' => { name: 'Fixed', entries: {} }, 'backwards-incompatible' => { name: 'Changed', entries: {} } } @unlabeled_prs = [] # Setting the changelog path early lets us check that it exists # before we spend time making API calls changelog end def labels @entries.keys end def client unless @client unless ENV['GITHUB_TOKEN'] warn 'Missing GitHub personal access token. Set $GITHUB_TOKEN with a '\ 'personal access token to use this script.' exit 1 end Octokit.configure do |c| c.auto_paginate = true end @client = Octokit::Client.new(access_token: ENV['GITHUB_TOKEN']) end @client end def latest @latest ||= client.latest_release('puppetlabs/facter').tag_name end def commits @commits ||= client.compare('puppetlabs/facter', latest, 'main').commits end def changelog unless @changelog @changelog = File.expand_path('CHANGELOG.md', Dir.pwd) unless File.file?(@changelog) warn "Unable to find changelog at #{@changelog}" exit 1 end end @changelog end # Parses individual commits by scanning the commit message for valid release notes # and adding them to the list of entries. Entries include extra information about # the author and whether it was an internal or external contribution so we can give # kudos. def parse_commit(commit) prs = client.commit_pulls('puppetlabs/facter', commit.sha, { accept: 'application/vnd.github.groot-preview+json' }) prs.each do |pr| next if pr[:state] != 'closed' && pr[:merged_at].nil? if (pr[:labels].nil? || pr[:labels].empty?) && !unlabeled_prs.include?(pr[:html_url]) unlabeled_prs << pr[:html_url] end pr[:labels].each do |label| next unless entries.key?(label[:name]) entries[label[:name]][:entries][pr[:html_url]] = { title: pr[:title], number: pr[:number], url: pr[:html_url], author: pr[:user][:login], profile: pr[:user][:html_url] } end end end def update_changelog old_lines = File.read(changelog).split("\n") new_lines = [ "## [#{version}](https://github.com/puppetlabs/facter/tree/#{version}) (#{Time.now.strftime '%Y-%m-%d'})\n", "[Full Changelog](https://github.com/puppetlabs/facter/compare/#{latest}...#{version})" ] entries.each_value do |type| next unless type[:entries].any? new_lines << "\n### #{type[:name]}\n" type[:entries].each_value do |entry| new_lines << "- #{entry[:title].strip} [\##{entry[:number]}](#{entry[:url]})" \ " ([#{entry[:author]}](#{entry[:profile]}))" end end new_lines = check_unlabeled_prs(new_lines) content = (new_lines + ["\n"] + old_lines).join("\n") if File.write(changelog, content) puts "Successfully wrote entries to #{changelog}" else warn "Unable to write entries to #{changelog}" exit 1 end end def check_unlabeled_prs(content) return content unless unlabeled_prs.any? content << "\n### Unlabeled PRs:\n" unlabeled_prs.each do |pr| content << "- #{pr}" end content end def generate puts "Loading and parsing commits for #{latest}..main" commits.each do |commit| parse_commit(commit) end if entries.each_value.all? { |type| type[:entries].empty? } warn "No release notes for #{latest}..main" exit 0 end update_changelog end end ChangelogGenerator.new(ARGV.first).generate if $PROGRAM_NAME == __FILE__ puppetlabs-facter-dfe6df4/spec/000077500000000000000000000000001470204764400166615ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/custom_facts/000077500000000000000000000000001470204764400213535ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/custom_facts/core/000077500000000000000000000000001470204764400223035ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/custom_facts/core/aggregate_spec.rb000066400000000000000000000112601470204764400255700ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Core::Aggregate do subject(:aggregate_res) { Facter::Core::Aggregate.new('aggregated', fact) } let(:fact) { double('stub_fact', name: 'stub_fact') } let(:logger) { Facter::Log.class_variable_get(:@@logger) } it 'can be resolved' do expect(aggregate_res).to be_a_kind_of LegacyFacter::Core::Resolvable end it 'can be confined and weighted' do expect(aggregate_res).to be_a_kind_of LegacyFacter::Core::Suitable end it 'can be compared' do aggregate1 = Facter::Core::Aggregate.new('aggregated1', fact) aggregate1.options(weight: 1) aggregate2 = Facter::Core::Aggregate.new('aggregated2', fact) aggregate2.options(weight: 2) aggregate3 = Facter::Core::Aggregate.new('aggregated3', fact) aggregate3.options(weight: 3) expect( [aggregate1, aggregate2, aggregate3].sort { |a, b| b <=> a } ).to eq([aggregate3, aggregate2, aggregate1]) end describe 'setting options' do it 'can set the timeout' do aggregate_res.options(timeout: 314) expect(aggregate_res.limit).to eq 314 end it 'can set the weight' do aggregate_res.options(weight: 27) expect(aggregate_res.weight).to eq 27 end it 'can set the name' do aggregate_res.options(name: 'something') expect(aggregate_res.name).to eq 'something' end it 'fails on unhandled options' do expect do aggregate_res.options(foo: 'bar') end.to raise_error(ArgumentError, /Invalid aggregate options .*foo/) end it 'fact_type does not raise error' do expect { aggregate_res.options(fact_type: 'custom') }.not_to raise_error end end describe 'declaring chunks' do it 'requires that an chunk is given a block' do expect { aggregate_res.chunk(:fail) }.to raise_error(ArgumentError, /requires a block/) end it 'allows an chunk to have a list of requirements' do aggregate_res.chunk(:data, require: [:other]) {} expect(aggregate_res.deps[:data]).to eq [:other] end it 'converts a single chunk requirement to an array' do aggregate_res.chunk(:data, require: :other) {} expect(aggregate_res.deps[:data]).to eq [:other] end it 'raises an error when an unhandled option is passed' do expect do aggregate_res.chunk(:data, before: [:other]) {} end.to raise_error(ArgumentError, /Unexpected options.*#chunk: .*before/) end end describe 'handling interactions between chunks' do it 'generates an error when there is a dependency cycle in chunks' do aggregate_res.chunk(:first, require: [:second]) {} aggregate_res.chunk(:second, require: [:first]) {} allow(Facter).to receive(:log_exception).with(StandardError, /dependency cycles: .*[:first, :second]/) expect { aggregate_res.value }.to raise_error(Facter::ResolveCustomFactError) end it 'passes all requested chunk results to the depending chunk' do aggregate_res.chunk(:first) { ['foo'] } aggregate_res.chunk(:second, require: [:first]) do |first| ["#{first[0]} bar"] end output = aggregate_res.value expect(output).to match_array(['foo', 'foo bar']) end it 'clones and freezes chunk results' do aggregate_res.chunk(:first) { 'foo' } aggregate_res.chunk(:second, require: [:first]) do |first| expect(first).to be_frozen end end it 'clones and freezes chunk results passed to other chunks' do aggregate_res.chunk(:first) { 'foo' } aggregate_res.chunk(:second, require: [:first]) do |first| allow(first).to be_frozen end aggregate_res.aggregate do |chunks| expect_all(chunks).to be_frozen end end end describe 'aggregating chunks' do it 'passes all chunk results as a hash to the aggregate block' do aggregate_res.chunk(:data) { 'data chunk' } aggregate_res.chunk(:datum) { 'datum chunk' } aggregate_res.aggregate do |chunks| expect(chunks).to eq(data: 'data chunk', datum: 'datum chunk') end aggregate_res.value end it 'uses the result of the aggregate block as the value' do aggregate_res.aggregate { 'who needs chunks anyways' } expect(aggregate_res.value).to eq 'who needs chunks anyways' end end describe 'evaluating' do it 'evaluates the block in the context of the aggregate' do expect(aggregate_res).to receive(:has_weight).with(5) aggregate_res.evaluate { has_weight(5) } end it 'warns if the block is evaluated more than once' do expect(logger).to receive(:warn).with(/Already evaluated aggregated at.*reevaluating anyways/) aggregate_res.evaluate {} aggregate_res.evaluate {} end end end puppetlabs-facter-dfe6df4/spec/custom_facts/core/directed_graph_spec.rb000066400000000000000000000037071470204764400266150ustar00rootroot00000000000000# frozen_string_literal: true describe LegacyFacter::Core::DirectedGraph do subject(:graph) { LegacyFacter::Core::DirectedGraph.new } describe 'detecting cycles' do it 'is acyclic if the graph is empty' do expect(graph).to be_acyclic end it 'is acyclic if the graph has no edges' do graph[:one] = [] graph[:two] = [] expect(graph).to be_acyclic end it 'is acyclic if a vertex has an edge to itself' do graph[:one] = [:one] expect(graph).to be_acyclic end it 'is acyclic if there are no loops in the graph' do graph[:one] = %i[two three] graph[:two] = [:four] graph[:three] = [:four] graph[:four] = [] expect(graph).to be_acyclic end it 'is cyclic if there is a loop in the graph' do graph[:one] = [:two] graph[:two] = [:one] expect(graph).not_to be_acyclic end it 'can return the cycles in the graph' do graph[:one] = [:two] graph[:two] = [:one] graph[:three] = [:four] graph[:four] = [:three] first_cycle = graph.cycles.find { |cycle| cycle.include? :one } expect(first_cycle).to match_array(%i[one two]) end end describe 'sorting' do it 'returns the vertices in topologically sorted order' do graph[:one] = %i[two three] graph[:two] = [:three] graph[:three] = [] expect(graph.tsort).to eq %i[three two one] end it 'raises an error if there is a cycle in the graph' do graph[:one] = [:two] graph[:two] = [:one] expect do graph.tsort end.to raise_error(LegacyFacter::Core::DirectedGraph::CycleError, /found the following cycles:/) end it 'raises an error if there is an edge to a non-existent vertex' do graph[:one] = %i[two three] graph[:two] = [:three] expect do graph.tsort end.to raise_error(LegacyFacter::Core::DirectedGraph::MissingVertex, /missing elements.*three/) end end end puppetlabs-facter-dfe6df4/spec/custom_facts/core/execution/000077500000000000000000000000001470204764400243065ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/custom_facts/core/execution/fact_manager_spec.rb000066400000000000000000000175521470204764400302660ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Core::Execution::Base do subject(:executor) { Facter::Core::Execution::Posix.new } describe '#with_env' do let(:sentinel_var) { :resolution_test_foo.to_s } it "executes the caller's block with the specified env vars" do test_env = { 'LANG' => 'C', 'LC_ALL' => 'C', 'FOO' => 'BAR' } executor.with_env test_env do test_env.each_key do |key| expect(ENV[key]).to eq test_env[key] end end end it 'restores pre-existing environment variables' do orig_env = {} new_env = {} # an arbitrary sentinel value to use to temporarily set the environment vars to sentinel_value = 'Abracadabra' # grab some values from the existing ENV (arbitrarily choosing 3 here) ENV.keys.first(3).each do |key| # save the original values so that we can test against them later orig_env[key] = ENV[key] # create bogus temp values for the chosen keys new_env[key] = sentinel_value end # verify that, during the 'with_env', the new values are used executor.with_env new_env do orig_env.each_key do |key| expect(ENV[key]).to eq new_env[key] end end end it 'restores pre-existing environment variables to their previous values' do orig_env = {} new_env = {} # an arbitrary sentinel value to use to temporarily set the environment vars to sentinel_value = 'Abracadabra' # grab some values from the existing ENV (arbitrarily choosing 3 here) ENV.keys.first(3).each do |key| # save the original values so that we can test against them later orig_env[key] = ENV[key] # create bogus temp values for the chosen keys new_env[key] = sentinel_value end # verify that, after the 'with_env', the old values are restored orig_env.each_key do |key| expect(ENV[key]).to eq orig_env[key] end end it "is not affected by a 'return' statement in the yield block" do # the intent of this test case is to test a yield block that contains a return statement. However, it's illegal # to use a return statement outside of a method, so we need to create one here to give scope to the 'return' def handy_method ENV[sentinel_var] = 'foo' new_env = { sentinel_var => 'bar' } executor.with_env new_env do ENV[sentinel_var] = 'bar' return end end handy_method expect(ENV[sentinel_var]).to eq 'foo' end end describe '#execute' do it 'expands the command before running it' do allow(File).to receive(:executable?).and_return(false) allow(FileTest).to receive(:file?).and_return(false) allow(File).to receive(:executable?).with('/sbin/foo').and_return(true) allow(FileTest).to receive(:file?).with('/sbin/foo').and_return(true) expect(Facter::Core::Execution::Popen3).to receive(:popen3e).with({ 'LC_ALL' => 'C', 'LANG' => 'C' }, '/sbin/foo') .and_return('') executor.execute('foo') end context 'with expand on posix' do let(:test_env) { { 'LANG' => 'C', 'LC_ALL' => 'C', 'PATH' => '/sbin' } } before do test_env.each do |key, value| allow(ENV).to receive(:[]).with(key).and_return(value) allow(File).to receive(:executable?).with('/bin/foo').and_return(true) allow(FileTest).to receive(:file?).with('/bin/foo').and_return(true) end end it 'does not expant builtin command' do allow(Facter::Core::Execution::Popen3).to receive(:popen3e).with({ 'LC_ALL' => 'C', 'LANG' => 'C' }, '/bin/foo') .and_return('') allow(Open3).to receive(:capture2).with('type /bin/foo').and_return('builtin') executor.execute('/bin/foo', expand: false) end end context 'with expand on windows' do subject(:execution_base) { Facter::Core::Execution::Windows.new } let(:test_env) { { 'LANG' => 'C', 'LC_ALL' => 'C', 'PATH' => '/sbin' } } before do test_env.each do |key, value| allow(ENV).to receive(:[]).with(key).and_return(value) end end it 'throws exception' do allow(Facter::Core::Execution::Popen3).to receive(:popen3e).with({ 'LC_ALL' => 'C', 'LANG' => 'C' }, 'foo') .and_return('') allow(Open3).to receive(:capture2).with({ 'LC_ALL' => 'C', 'LANG' => 'C' }, 'type foo').and_return('builtin') expect { execution_base.execute('foo', expand: false) } .to raise_error(ArgumentError, 'Unsupported argument on Windows expand with value false') end end context 'when there are stderr messages from file' do let(:logger) { instance_spy(Facter::Log) } let(:command) { '/bin/foo' } before do allow(Facter::Core::Execution::Popen3).to receive(:popen3e).with({ 'LC_ALL' => 'C', 'LANG' => 'C' }, command) .and_return(['', 'some error']) allow(File).to receive(:executable?).with(command).and_return(true) allow(FileTest).to receive(:file?).with(command).and_return(true) end it 'logs warning messages on stderr' do executor.execute(command, logger: logger) expect(logger).to have_received(:debug).with('Command /bin/foo completed with '\ 'the following stderr message: some error') end end describe 'and the command is not present' do before do allow(File).to receive(:executable?).and_return(false) allow(FileTest).to receive(:file?).and_return(false) end it 'raises an error when the :on_fail behavior is :raise' do expect { executor.execute('foo') }.to raise_error(Facter::Core::Execution::ExecutionFailure) end it 'returns the given value when :on_fail is set to a value' do expect(executor.execute('foo', on_fail: nil)).to be_nil end end describe 'when command execution fails' do before do allow(Facter::Core::Execution::Popen3).to receive(:popen3e).with({ 'LC_ALL' => 'C', 'LANG' => 'C' }, '/bin/foo') .and_raise('kaboom!') allow(File).to receive(:executable?).and_return(false) allow(FileTest).to receive(:file?).and_return(false) allow(File).to receive(:executable?).with('/bin/foo').and_return(true) allow(FileTest).to receive(:file?).with('/bin/foo').and_return(true) end it 'raises an error when the :on_fail behavior is :raise' do expect { executor.execute('foo') }.to raise_error(Facter::Core::Execution::ExecutionFailure) end it 'returns the given value when :on_fail is set to a value' do expect(executor.execute('foo', on_fail: nil)).to be_nil end end context 'when expand command succeds' do before do allow(File).to receive(:executable?).and_return(false) allow(FileTest).to receive(:file?).and_return(false) allow(File).to receive(:executable?).with('/sbin/foo').and_return(true) allow(FileTest).to receive(:file?).with('/sbin/foo').and_return(true) end it 'returns the output of the command' do allow(Facter::Core::Execution::Popen3).to receive(:popen3e) .with({ 'LC_ALL' => 'C', 'LANG' => 'C' }, '/sbin/foo') .and_return('hi') expect(executor.execute('foo')).to eq 'hi' end it 'strips off trailing newlines' do allow(Facter::Core::Execution::Popen3).to receive(:popen3e) .with({ 'LC_ALL' => 'C', 'LANG' => 'C' }, '/sbin/foo') .and_return "hi\n" expect(executor.execute('foo')).to eq 'hi' end end end end puppetlabs-facter-dfe6df4/spec/custom_facts/core/execution/posix_spec.rb000066400000000000000000000131751470204764400270160ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Core::Execution::Posix, unless: LegacyFacter::Util::Config.windows? do let(:posix_executor) { Facter::Core::Execution::Posix.new } describe '#search_paths' do it 'uses the PATH environment variable plus /sbin and /usr/sbin on unix' do allow(ENV).to receive(:[]).with('PATH').and_return '/bin:/usr/bin' expect(posix_executor.search_paths).to eq %w[/bin /usr/bin /sbin /usr/sbin] end end describe '#which' do before do allow(posix_executor).to receive(:search_paths).and_return ['/bin', '/sbin', '/usr/sbin'] end context 'when provided with an absolute path' do it 'returns the binary if executable' do allow(File).to receive(:executable?).with('/opt/foo').and_return(true) allow(FileTest).to receive(:file?).with('/opt/foo').and_return true expect(posix_executor.which('/opt/foo')).to eq '/opt/foo' end it 'returns nil if the binary is not executable' do allow(File).to receive(:executable?).with('/opt/foo').and_return(false) expect(posix_executor.which('/opt/foo')).to be nil end it 'returns nil if the binary is not a file' do allow(File).to receive(:executable?).with('/opt/foo').and_return(true) allow(FileTest).to receive(:file?).with('/opt/foo').and_return false expect(posix_executor.which('/opt/foo')).to be nil end end context "when it isn't provided with an absolute path" do it 'returns the absolute path if found' do allow(File).to receive(:executable?).with('/bin/foo').and_return false allow(FileTest).to receive(:file?).with('/sbin/foo').and_return true allow(File).to receive(:executable?).with('/sbin/foo').and_return true expect(posix_executor.which('foo')).to eq '/sbin/foo' end it 'returns nil if not found' do allow(File).to receive(:executable?).with('/bin/foo').and_return false allow(File).to receive(:executable?).with('/sbin/foo').and_return false allow(File).to receive(:executable?).with('/usr/sbin/foo').and_return false expect(posix_executor.which('foo')).to be nil end end end describe '#expand_command' do it 'expands binary' do allow(posix_executor).to receive(:which).with('foo').and_return '/bin/foo' expect(posix_executor.expand_command('foo -a | stuff >> /dev/null')).to eq '/bin/foo -a | stuff >> /dev/null' end it 'expands double quoted binary' do allow(posix_executor).to receive(:which).with('/tmp/my foo').and_return '/tmp/my foo' expect(posix_executor.expand_command('"/tmp/my foo" bar')).to eq "'/tmp/my foo' bar" end it 'expands single quoted binary' do allow(posix_executor).to receive(:which).with('my foo').and_return '/home/bob/my path/my foo' expect(posix_executor.expand_command("'my foo' -a")).to eq "'/home/bob/my path/my foo' -a" end it 'quotes expanded binary if found in path with spaces' do allow(posix_executor).to receive(:which).with('foo.sh').and_return '/home/bob/my tools/foo.sh' expect(posix_executor.expand_command('foo.sh /a /b')).to eq "'/home/bob/my tools/foo.sh' /a /b" end it 'expands a multi-line command with single quotes' do allow(posix_executor).to receive(:which).with('dpkg-query').and_return '/usr/bin/dpkg-query' expect(posix_executor.expand_command( "dpkg-query --showformat='${PACKAGE} ${VERSION}\n' --show | egrep '(^samba)" )).to eq("/usr/bin/dpkg-query --showformat='${PACKAGE} ${VERSION}\n' --show | egrep '(^samba)") end it 'expands a multi-line command with double quotes' do allow(posix_executor).to receive(:which).with('dpkg-query').and_return '/usr/bin/dpkg-query' expect(posix_executor.expand_command( "dpkg-query --showformat='${PACKAGE} ${VERSION}\n\" --show | egrep \"(^samba)" )).to eq("/usr/bin/dpkg-query --showformat='${PACKAGE} ${VERSION}\n\" --show | egrep \"(^samba)") end it 'returns nil if not found' do allow(posix_executor).to receive(:which).with('foo').and_return nil expect(posix_executor.expand_command('foo -a | stuff >> /dev/null')).to be nil end end describe '#absolute_path?' do %w[/ /foo /foo/../bar //foo //Server/Foo/Bar //?/C:/foo/bar /\Server/Foo /foo//bar/baz].each do |path| it "returns true for #{path}" do expect(posix_executor).to be_absolute_path(path) end end %w[. ./foo \foo C:/foo \\Server\Foo\Bar \\?\C:\foo\bar \/?/foo\bar \/Server/foo foo//bar/baz].each do |path| it "returns false for #{path}" do expect(posix_executor).not_to be_absolute_path(path) end end end context 'when calling execute_command' do let(:logger) { instance_spy(Facter::Log) } it 'executes a command' do expect(posix_executor.execute_command('/usr/bin/true', nil, logger)).to eq(['', '']) end it "raises if 'on_fail' argument is specified" do expect do posix_executor.execute_command('/bin/notgoingtofindit', :raise) end.to raise_error(Facter::Core::Execution::ExecutionFailure, %r{Failed while executing '/bin/notgoingtofindit'}) end it 'returns nil if the command fails by default' do expect(posix_executor.execute_command('/bin/notgoingtofindit')).to be_nil end it 'returns stdout string if the command fails and a logger was specified (!?)' do expect(posix_executor.execute_command('/bin/notgoingtofindit', nil, logger)).to eq('') end it 'returns a mutable stdout string' do expect(posix_executor.execute_command('/bin/notgoingtofindit', nil, logger)).not_to be_frozen end end end puppetlabs-facter-dfe6df4/spec/custom_facts/core/execution/windows_spec.rb000066400000000000000000000145421470204764400273450ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Core::Execution::Windows do let(:executor) { Facter::Core::Execution::Windows.new } before do allow(LegacyFacter).to receive(:value).and_return('Windows') allow(LegacyFacter::Util::Config).to receive(:windows?).and_return(true) stub_const('::File::PATH_SEPARATOR', ';') stub_const('File::ALT_SEPARATOR', '\\') end describe '#search_paths' do it 'uses the PATH environment variable to determine locations' do allow(ENV).to receive(:[]).with('PATH').and_return 'C:\Windows;C:\Windows\System32' expect(executor.search_paths).to eq %w[C:\Windows C:\Windows\System32] end end describe '#execute' do context 'when expand is false' do subject(:executor) { Facter::Core::Execution::Windows.new } it 'raises exception' do expect { executor.execute('c:\foo.exe', expand: false) } .to raise_error(ArgumentError, 'Unsupported argument on Windows expand with value false') end end end describe '#which' do before do allow(executor) .to receive(:search_paths) .and_return ['C:\Windows\system32', 'C:\Windows', 'C:\Windows\System32\Wbem'] allow(ENV).to receive(:[]).with('PATHEXT').and_return nil end context 'when trying to use builtin windows commands' do it 'allows echo' do expect(executor.which('echo')).to eq 'echo' end it 'disallows other builtin windows commands' do expect(executor.which('dir')).to eq nil end end context 'when it is provided with an absolute path' do it 'returns the path to binary if executable' do allow(File).to receive(:executable?).with('C:\Tools\foo.exe').and_return true expect(executor.which('C:\Tools\foo.exe')).to eq 'C:\Tools\foo.exe' end it 'returns the binary if executable' do allow(File).to receive(:executable?).with('\\\\remote\dir\foo.exe').and_return true expect(executor.which('\\\\remote\dir\foo.exe')).to eq '\\\\remote\dir\foo.exe' end it 'returns nil if the binary path is not executable' do allow(File).to receive(:executable?).with('C:\Tools\foo.exe').and_return false expect(executor.which('C:\Tools\foo.exe')).to be nil end it 'returns nil if the binary is not executable' do allow(File).to receive(:executable?).with('\\\\remote\dir\foo.exe').and_return false expect(executor.which('\\\\remote\dir\foo.exe')).to be nil end end context 'when it is not provided with an absolute path' do it 'returns the absolute path if found' do allow(File).to receive(:executable?).with('C:\Windows\system32\foo.exe').and_return false allow(File).to receive(:executable?).with('C:\Windows\foo.exe').and_return true expect(executor.which('foo.exe')).to eq 'C:\Windows\foo.exe' end it 'does not check all paths if one is executable' do allow(File).to receive(:executable?).with('C:\Windows\system32\foo.exe').and_return false allow(File).to receive(:executable?).with('C:\Windows\foo.exe').and_return true expect(File).not_to receive(:executable?).with('C:\Windows\System32\Wbem\foo.exe') executor.which('foo.exe') end it 'returns the absolute path with file extension if found' do ['.COM', '.EXE', '.BAT', '.CMD', ''].each do |ext| allow(File).to receive(:executable?).with("C:\\Windows\\system32\\foo#{ext}").and_return false allow(File).to receive(:executable?).with("C:\\Windows\\System32\\Wbem\\foo#{ext}").and_return false end ['.COM', '.BAT', '.CMD', ''].each do |ext| allow(File).to receive(:executable?).with("C:\\Windows\\foo#{ext}").and_return false end allow(File).to receive(:executable?).with('C:\Windows\foo.EXE').and_return true expect(executor.which('foo')).to eq 'C:\Windows\foo.EXE' end it 'returns nil if not found' do allow(File).to receive(:executable?).with('C:\Windows\system32\foo.exe').and_return false allow(File).to receive(:executable?).with('C:\Windows\foo.exe').and_return false allow(File).to receive(:executable?).with('C:\Windows\System32\Wbem\foo.exe').and_return false expect(executor.which('foo.exe')).to be nil end end end describe '#expand_command' do it 'expands binary' do allow(executor).to receive(:which).with('cmd').and_return 'C:\Windows\System32\cmd' expect(executor.expand_command( 'cmd /c echo foo > C:\bar' )).to eq 'C:\Windows\System32\cmd /c echo foo > C:\bar' end it 'returns nil if not found' do allow(executor).to receive(:which).with('my foo').and_return 'C:\My Tools\my foo.exe' expect(executor.expand_command('"my foo" /a /b')).to eq '"C:\My Tools\my foo.exe" /a /b' end it 'does not expand single quoted binary' do allow(executor).to receive(:which).with('\'C:\My').and_return nil expect(executor.expand_command('\'C:\My Tools\foo.exe\' /a /b')).to be nil end it 'quotes expanded binary if found in path with spaces' do allow(executor).to receive(:which).with('foo').and_return 'C:\My Tools\foo.exe' expect(executor.expand_command('foo /a /b')).to eq '"C:\My Tools\foo.exe" /a /b' end it 'expands a multi-line command with double quotes' do allow(executor).to receive(:which).with('foo').and_return 'C:\My Tools\foo.exe' expect(executor.expand_command( 'foo cmd /c\\n" show | grep "(^test)' )).to eq(%q("C:\My Tools\foo.exe" cmd /c\n" show | grep "(^test))) end it 'returns nil if command not found' do allow(executor).to receive(:which).with('foo').and_return nil expect(executor.expand_command('foo /a | stuff >> NUL')).to be nil end end describe '#absolute_path?' do ['C:/foo', 'C:\foo', '\\\\Server\Foo\Bar', '\\\\?\C:\foo\bar', '//Server/Foo/Bar', '//?/C:/foo/bar', '/\?\C:/foo\bar', '\/Server\Foo/Bar', 'c:/foo//bar//baz'].each do |path| it "returns true for #{path}" do expect(executor).to be_absolute_path(path) end end %w[/ . ./foo \foo /foo /foo/../bar //foo C:foo/bar foo//bar/baz].each do |path| it "returns false for #{path}" do expect(executor).not_to be_absolute_path(path) end end end end puppetlabs-facter-dfe6df4/spec/custom_facts/core/execution_spec.rb000066400000000000000000000064051470204764400256520ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Core::Execution do subject(:execution) { Facter::Core::Execution } let(:windows_impl) { instance_spy(Facter::Core::Execution::Windows) } let(:impl) { Facter::Core::Execution.impl } let(:logger) { impl.instance_variable_get(:@log) } before do allow(Facter::Core::Execution::Windows).to receive(:new).and_return(windows_impl) end it 'delegates #search_paths to the implementation' do expect(impl).to receive(:search_paths) execution.search_paths end it 'delegates #which to the implementation' do expect(impl).to receive(:which).with('waffles') execution.which('waffles') end it 'delegates #absolute_path? to the implementation' do expect(impl).to receive(:absolute_path?).with('waffles') execution.absolute_path?('waffles') end it 'delegates #absolute_path? with an optional platform to the implementation' do expect(windows_impl).to receive(:absolute_path?).with('waffles') execution.absolute_path?('waffles', :windows) end it 'delegates #expand_command to the implementation' do expect(impl).to receive(:expand_command).with('waffles') execution.expand_command('waffles') end it 'delegates #exec to #execute' do expect(impl).to receive(:execute).with('waffles', { on_fail: nil }) execution.exec('waffles') end it 'delegates #execute to the implementation' do expect(impl).to receive(:execute).with('waffles', {}) execution.execute('waffles') end context 'when running an actual command' do before do allow(impl).to receive(:which).with('waffles').and_return('/under/the/honey/are/the/waffles') allow(impl).to receive(:execute_command) end context 'with default parameters' do it 'executes the found command' do execution.execute('waffles') expect(impl).to have_received(:execute_command).with('/under/the/honey/are/the/waffles', :raise, nil, nil) end end context 'with a timeout' do it 'executes the found command with a timeout' do execution.execute('waffles', timeout: 90) expect(impl).to have_received(:execute_command).with('/under/the/honey/are/the/waffles', :raise, nil, 90) end end context 'when passing deprecated arguments' do %i[time_limit limit].each do |option| it 'executes the found command with a timeout' do execution.execute('waffles', option => 90) expect(impl).to have_received(:execute_command).with('/under/the/honey/are/the/waffles', :raise, nil, 90) end end it 'emits a warning to the default logger' do expect(logger).to receive(:warn) .with('Unexpected key passed to Facter::Core::Execution.execute option: time_limit,bad_opt' \ ' - valid keys: on_fail,expand,logger,timeout') execution.execute('waffles', time_limit: 90, bad_opt: true) end it 'ignores the passed in logger when logging the warning' do expect(logger).to receive(:warn) .with('Unexpected key passed to Facter::Core::Execution.execute option: time_limit,bad_opt' \ ' - valid keys: on_fail,expand,logger,timeout') execution.execute('waffles', time_limit: 90, bad_opt: true, logger: Facter::Log.new('ignored')) end end end end puppetlabs-facter-dfe6df4/spec/custom_facts/core/resolvable_spec.rb000066400000000000000000000056141470204764400260060ustar00rootroot00000000000000# frozen_string_literal: true module FacterSpec class ResolvableClass include LegacyFacter::Core::Resolvable attr_accessor :name, :resolve_value attr_reader :fact def initialize(name) @name = name @fact = Facter::Util::Fact.new('stub fact') end end class FlushFakeError < StandardError; end end describe LegacyFacter::Core::Resolvable do subject(:resolvable) { FacterSpec::ResolvableClass.new('resolvable') } it 'has a default timeout of 0 seconds' do expect(resolvable.limit).to eq 0 end it 'can specify a custom timeout' do resolvable.timeout = 10 expect(resolvable.limit).to eq 10 end describe 'generating a value' do it 'returns the results of #resolve_value' do resolvable.resolve_value = 'stuff' expect(resolvable.value).to eq 'stuff' end it 'normalizes the resolved value' do allow(LegacyFacter::Util::Normalization).to receive(:normalize).and_return('stuff') resolvable.resolve_value = 'stuff' expect(resolvable.value).to eq('stuff') end it 'raises ResolveCustomFactError' do allow(resolvable).to receive(:resolve_value).and_raise RuntimeError, 'kaboom!' allow(Facter).to receive(:log_exception) .with(RuntimeError, "Error while resolving custom fact fact='stub fact', " \ "resolution='resolvable': kaboom!") expect { resolvable.value }.to raise_error(Facter::ResolveCustomFactError) end context 'with a fact whose value is invalid UTF-8 string' do let(:logger) { Facter.send(:logger) } it 'cannot resolve and logs error with fact name' do expect(logger).to receive(:error).with(/Fact resolution fact='stub fact', resolution='resolvable' resolved to an invalid value: String "\\xC3\(" doesn't match the reported encoding UTF-8/) resolvable.resolve_value = "\xc3\x28" resolvable.value end end end describe 'timing out' do it 'uses #limit instead of #timeout to determine the timeout period' do expect(resolvable).not_to receive(:timeout) allow(resolvable).to receive(:limit).and_return(25) allow(Timeout).to receive(:timeout).with(25) resolvable.value end it 'returns nil if the timeout was reached' do allow(Facter).to receive(:log_exception).with(Timeout::Error, /Timed out after 0\.1 seconds while resolving/) allow(Timeout).to receive(:timeout).and_raise Timeout::Error resolvable.timeout = 0.1 expect(resolvable.value).to be_nil end end describe 'callbacks when flushing facts' do describe '#on_flush' do it 'accepts a block with on_flush' do resolvable.on_flush { raise NotImplementedError } end end describe '#flush' do it 'calls the block passed to on_flush' do resolvable.on_flush { raise FlushFakeError } expect { resolvable.flush }.to raise_error FlushFakeError end end end end puppetlabs-facter-dfe6df4/spec/custom_facts/core/suitable_spec.rb000066400000000000000000000061431470204764400254560ustar00rootroot00000000000000# frozen_string_literal: true module FacterSpec class SuitableClass include LegacyFacter::Core::Suitable attr_reader :confines def initialize @confines = [] end end end describe LegacyFacter::Core::Suitable do subject(:suitable_obj) { FacterSpec::SuitableClass.new } describe 'confining on facts' do it 'can add confines with a fact and a single value' do suitable_obj.confine kernel: 'Linux' end it 'creates a Facter::Util::Confine object for the confine call' do suitable_obj.confine kernel: 'Linux' conf = suitable_obj.confines.first expect(conf).to be_an_instance_of(LegacyFacter::Util::Confine).and( having_attributes(fact: :kernel, values: ['Linux']) ) end end describe 'confining on blocks' do it 'can add a single fact with a block parameter' do suitable_obj.confine(:one) { true } end it 'creates a Util::Confine instance for the provided fact with block parameter' do block = -> { true } # Facter::Util::Confine.expects(:new).with("one") expect(LegacyFacter::Util::Confine).to receive(:new).with('one') suitable_obj.confine('one', &block) end it 'accepts a single block parameter' do suitable_obj.confine { true } end it 'creates a Util::Confine instance for the provided block parameter' do block = -> { true } expect(LegacyFacter::Util::Confine).to receive :new suitable_obj.confine(&block) end end describe 'determining weight' do it 'is zero if no confines are set' do expect(suitable_obj.weight).to eq 0 end it 'defaults to the number of confines' do suitable_obj.confine kernel: 'Linux' expect(suitable_obj.weight).to eq 1 end it 'can be explicitly set' do suitable_obj.has_weight 10 expect(suitable_obj.weight).to eq 10 end it 'prefers an explicit weight over the number of confines' do suitable_obj.confine kernel: 'Linux' suitable_obj.has_weight 11 expect(suitable_obj.weight).to eq 11 end it 'returns the class instance' do expect(suitable_obj.has_weight(10)).to be(suitable_obj) end end describe 'determining suitability' do it 'is true if all confines for the object evaluate to true' do suitable_obj.confine kernel: 'Linux' suitable_obj.confine operatingsystem: 'Redhat' suitable_obj.confines.each { |confine| allow(confine).to receive(:true?).and_return(true) } expect(suitable_obj).to be_suitable end it 'is false if any confines for the object evaluate to false' do suitable_obj.confine kernel: 'Linux' suitable_obj.confine operatingsystem: 'Redhat' allow(suitable_obj.confines.first).to receive(:true?).and_return(false) expect(suitable_obj).not_to be_suitable end it 'recalculates suitability on every invocation' do suitable_obj.confine kernel: 'Linux' allow(suitable_obj.confines.first).to receive(:true?).and_return(false) allow(suitable_obj.confines.first).to receive(:true?).and_return(true) expect(suitable_obj).to be_suitable end end end puppetlabs-facter-dfe6df4/spec/custom_facts/puppetlabs_spec/000077500000000000000000000000001470204764400245445ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/custom_facts/puppetlabs_spec/files.rb000077500000000000000000000026001470204764400261740ustar00rootroot00000000000000# frozen_string_literal: true require 'fileutils' require 'tempfile' require 'pathname' # A support module for testing files. module PuppetlabsSpec module Files # This code exists only to support tests that run as root, pretty much. # Once they have finally been eliminated this can all go... --daniel 2011-04-08 def self.in_tmp(path) tempdir = Dir.tmpdir Pathname.new(path).ascend do |dir| return true if File.identical?(tempdir, dir) end false end def self.cleanup @@global_tempfiles ||= [] while (path = @@global_tempfiles.pop) raise "Not deleting tmpfile #{path} outside regular tmpdir" unless in_tmp(path) begin FileUtils.rm_r path, secure: true rescue Errno::ENOENT # nothing to do end end end def make_absolute(path) path = File.expand_path(path) path[0] = 'c' if Puppet.features.microsoft_windows? path end def tmpfilename(name) # Generate a temporary file, just for the name... source = Tempfile.new(name) path = source.path source.close! # ...record it for cleanup, @@global_tempfiles ||= [] @@global_tempfiles << File.expand_path(path) # ...and bam. path end def tmpdir(name) path = tmpfilename(name) FileUtils.mkdir_p(path) path end end end puppetlabs-facter-dfe6df4/spec/custom_facts/puppetlabs_spec/verbose.rb000077500000000000000000000003531470204764400265420ustar00rootroot00000000000000# frozen_string_literal: true # Support code for running stuff with warnings disabled. module Kernel def with_verbose_disabled verbose = $VERBOSE $VERBOSE = nil result = yield $VERBOSE = verbose result end end puppetlabs-facter-dfe6df4/spec/custom_facts/util/000077500000000000000000000000001470204764400223305ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/custom_facts/util/collection_spec.rb000077500000000000000000000340011470204764400260230ustar00rootroot00000000000000#! /usr/bin/env ruby # frozen_string_literal: true module FacterSpec class SingleFactLoader def initialize(name, value) @name = name @value = value end def load(collection) collection.add(@name, value: @value) end end end describe LegacyFacter::Util::Collection do let(:external_loader) { instance_spy(LegacyFacter::Util::NothingLoader) } let(:internal_loader) do load = LegacyFacter::Util::Loader.new allow(load).to receive(:load).and_return nil allow(load).to receive(:load_all).and_return nil load end let(:collection) { LegacyFacter::Util::Collection.new(internal_loader, external_loader) } let(:logger) { collection.send(:log) } before do Singleton.__init__(Facter::FactManager) Singleton.__init__(Facter::FactLoader) Singleton.__init__(Facter::ClassDiscoverer) end it 'delegates its load_all method to its loader' do expect(internal_loader).to receive(:load_all) collection.load_all end describe 'when adding facts' do it 'creates a new fact if no fact with the same name already exists' do collection.add(:myname) expect(collection.fact(:myname).name).to eq :myname end it 'accepts options' do collection.add(:myname, timeout: 1) {} end it 'passes resolution specific options to the fact' do fact = Facter::Util::Fact.new(:myname) allow(Facter::Util::Fact).to receive(:new).with(:myname, { timeout: 'myval' }).and_return(fact) expect(fact).to receive(:add).with({ timeout: 'myval' }) collection.add(:myname, timeout: 'myval') {} end describe 'and a block is provided' do it 'uses the block to add a resolution to the fact' do fact = double 'fact' allow(Facter::Util::Fact).to receive(:new).and_return(fact) allow(fact).to receive(:add) collection.add(:myname) {} expect(fact).to have_received(:add) end it 'discards resolutions that throw an exception when added' do allow(logger).to receive(:warn).with(/Unable to add resolve .* kaboom!/) expect do collection.add('yay') do raise 'kaboom!' end end.not_to raise_error collection.value('yay') end end end describe 'when only defining facts' do it 'creates a new fact if no such fact exists' do fact = Facter::Util::Fact.new(:newfact) allow(Facter::Util::Fact).to receive(:new).with(:newfact, {}).and_return fact expect(collection.define_fact(:newfact)).to equal fact end it 'returns an existing fact if the fact has already been defined' do fact = collection.define_fact(:newfact) expect(collection.define_fact(:newfact)).to equal fact end it 'passes options to newly generated facts' do allow(logger).to receive(:warnonce) fact = collection.define_fact(:newfact, ldapname: 'NewFact') expect(fact.ldapname).to eq 'NewFact' end it 'logs an error if the fact name contains the utf-8 null byte' do name = "Uncool\0Name" normalization_error = LegacyFacter::Util::Normalization::NormalizationError expect(logger).to receive(:log_exception).with(an_instance_of(normalization_error)) do |exception| expect(exception.message).to match(/contains a null byte reference/) end collection.define_fact(name) end it 'logs an error if the fact could not be defined' do expect(logger).to receive(:log_exception).with(RuntimeError) do |exception| expect(exception.message).to equal('kaboom!') end collection.define_fact(:newfact) do raise 'kaboom!' end end end describe 'when retrieving facts' do let(:fact) { collection.add('YayNess') } # initialize before { fact } it 'returns the fact instance specified by the name' do expect(collection.fact('YayNess')).to equal(fact) end it 'is case-insensitive' do expect(collection.fact('yayness')).to equal(fact) end it 'treats strings and symbols equivalently' do expect(collection.fact(:yayness)).to equal(fact) end it 'uses its loader to try to load the fact if no fact can be found' do expect(collection.internal_loader).to receive(:load).with(:testing) collection.fact('testing') end it 'returns nil if it cannot find or load the fact' do allow(collection.internal_loader).to receive(:load).with(:testing) expect(collection.fact('testing')).to be nil end end describe "when returning a fact's value" do before do collection.add('YayNess', value: 'result', weight: 0) collection.add('my_fact', value: 'my_fact_value', weight: 0) collection.add('nil_core_value_custom', value: 'custom_fact_value', weight: 0) end it 'returns the result of calling :value on the fact' do expect(collection.value('YayNess')).to eq 'result' end it 'is case-insensitive' do expect(collection.value('yayness')).to eq 'result' end it 'treats strings and symbols equivalently' do expect(collection.value(:yayness)).to eq 'result' end describe 'when the weight of the resolution is 0' do before do allow(Facter).to receive(:core_value).with(:yayness).and_return('core_result') allow(Facter).to receive(:core_value).with(:my_fact).and_return(nil) allow(Facter).to receive(:core_value).with(:non_existing_fact) allow(Facter).to receive(:core_value).with(:nil_core_value_custom).and_return(nil) end context 'when there is a custom fact with the name in collection' do it 'calls Facter.core_value' do collection.value('yayness') expect(Facter).to have_received(:core_value).with(:yayness) end it 'returns core facts value' do expect(collection.value('yayness')).to eq('core_result') end end context 'when there is no custom fact with the name in collection' do it 'calls Facter.core_value' do collection.value('non_existing_fact') expect(Facter).not_to have_received(:core_value).with(:non_existing_fact) end it 'returns custom facts value' do expect(collection.value('my_fact')).to eq('my_fact_value') end end context 'when core fact is nil and custom fact has value' do it 'returns custom fact' do expect(collection.value('nil_core_value_custom')).to eq('custom_fact_value') end end end describe 'when the weight of the resolution is greater than 0' do before do collection.add('100_weight_fact', value: 'my_weight_fact_value', weight: 100) collection.add('100_weight_nil_fact', value: nil, weight: 100) allow(Facter).to receive(:core_value).with(:'100_weight_fact').and_return('core_result') allow(Facter).to receive(:core_value).with(:'100_weight_nil_fact').and_return('core_100_weight_nil_fact_value') allow(Facter).to receive(:core_value).with(:core_fact_only).and_return('core_fact_only_value') allow(Facter).to receive(:core_value).with(:no_fact).and_return(nil) end context 'when there is a custom fact with the name in collection' do it 'returns the custom fact value' do expect(collection.value('100_weight_fact')).to eq('my_weight_fact_value') end end context 'when the custom fact returns nil' do it 'returns core fact value' do expect(collection.value('100_weight_nil_fact')).to eq('core_100_weight_nil_fact_value') end end context 'when no custom fact and no core fact with the name' do it 'returns nil' do expect(collection.value('no_fact')).to be_nil end end end end it "returns the fact's value when the array index method is used" do collection.add('myfact', value: 'foo') expect(collection['myfact']).to eq 'foo' end it 'has a method for flushing all facts' do fact = collection.add('YayNess') expect(fact).to receive(:flush) collection.flush end it 'has a method that returns all fact names' do collection.add(:one) collection.add(:two) expect(collection.list.sort_by(&:to_s)).to eq %i[one two] end describe 'when returning a hash of values' do it 'returns a hash of fact names and values with the fact names as strings' do collection.add(:one, value: 'me') expect(collection.to_hash).to eq 'one' => 'me' end it 'does not include facts that did not return a value' do collection.add(:two, value: nil) expect(collection.to_hash).not_to be_include(:two) end end describe 'when iterating over facts' do before do collection.add(:one, value: 'ONE') collection.add(:two, value: 'TWO') end it 'yields each fact name and the fact value' do facts = {} collection.each do |fact, value| facts[fact] = value end expect(facts).to eq 'one' => 'ONE', 'two' => 'TWO' end it 'converts the fact name to a string' do collection.each do |fact, _value| # rubocop:disable Style/HashEachMethods expect(fact).to be_instance_of(String) end end it 'onlies yield facts that have values' do collection.add(:nil_fact, value: nil) facts = {} collection.each do |fact, value| facts[fact] = value end expect(facts).not_to be_include('nil_fact') end end describe 'when no facts are loaded' do it 'warns when no facts were loaded' do expect(logger) .to receive(:warnonce) .with("No facts loaded from #{internal_loader.search_path.join(File::PATH_SEPARATOR)}").once collection.fact('one') end end describe 'external facts' do let(:external_loader) { FacterSpec::SingleFactLoader.new(:test_fact, 'fact value') } let(:collection) { LegacyFacter::Util::Collection.new(internal_loader, external_loader) } it 'loads when a specific fact is requested' do expect(collection.fact(:test_fact).value).to eq 'fact value' end it 'loads when facts are listed' do expect(collection.list).to eq [:test_fact] end it 'loads when all facts are iterated over' do facts = [] collection.each { |fact_name, fact_value| facts << [fact_name, fact_value] } expect(facts).to eq [['test_fact', 'fact value']] end it 'are loaded only once' do expect(external_loader).to receive(:load).with(collection) collection.load_all collection.load_all end it 'are reloaded after flushing' do expect(external_loader).to receive(:load).with(collection).twice collection.load_all collection.flush collection.load_all end end describe '#custom_facts' do it 'loads no facts' do expect(collection.custom_facts).to be_empty end context 'when custom facts are valid' do before do collection.instance_variable_set(:@custom_facts, ['my_custom_fact']) collection.instance_variable_set(:@valid_custom_facts, true) end it 'return one custom fact' do expect(collection.custom_facts.size).to eq(1) end it 'returns already loaded custom facts' do expect(collection.custom_facts.first).to eq('my_custom_fact') end end context 'when custom fact are invalid' do before do collection.add('my_fact', fact_type: :custom) {} end it 'returns one fact' do expect(collection.custom_facts.size).to eq(1) end it 'returns my_fact custom fact' do expect(collection.custom_facts.first[0]).to eq(:my_fact) end end context 'when reload custom facts' do before do collection.instance_variable_set(:@custom_facts, ['old_fact']) collection.instance_variable_set(:@valid_custom_facts, false) collection.instance_variable_set(:@loaded, false) collection.add('new_fact', fact_type: :custom) {} end it 'loads all internal facts' do collection.custom_facts expect(internal_loader).to have_received(:load_all) end it 'loads one fact' do expect(collection.custom_facts.size).to eq(1) end it 'loads the new fact' do expect(collection.custom_facts.first[0]).to eq(:new_fact) end end context "when don't reload custom facts" do before do collection.instance_variable_set(:@custom_facts, ['old_fact']) collection.instance_variable_set(:@valid_custom_facts, false) collection.instance_variable_set(:@loaded, true) collection.add('new_fact', fact_type: :custom) {} end it 'loads no internal facts' do collection.custom_facts expect(internal_loader).not_to have_received(:load_all) end it 'loads one fact' do expect(collection.custom_facts.size).to eq(1) end it 'loads the new fact' do expect(collection.custom_facts.first[0]).to eq(:new_fact) end end end describe '#external_facts' do before do collection.add('my_external_fact', fact_type: :external) {} end context 'when external facts are loaded for the first time' do it 'calls load on external_loader' do collection.external_facts expect(external_loader).to have_received(:load) end it 'return 1 fact' do expect(collection.external_facts.size).to eq(1) end it 'returns external fact' do expect(collection.external_facts.first[0]).to eq(:my_external_fact) end end context 'when external facts were already loaded' do before do collection.instance_variable_set(:@external_facts, [:my_external_fact]) collection.instance_variable_set(:@external_facts_loaded, false) end it 'doe not call load on external_loader' do collection.external_facts expect(external_loader).not_to have_received(:load) end it 'return 1 fact' do expect(collection.external_facts.size).to eq(1) end it 'returns external fact' do expect(collection.external_facts.first).to eq(:my_external_fact) end end end end puppetlabs-facter-dfe6df4/spec/custom_facts/util/config_spec.rb000077500000000000000000000117501470204764400251430ustar00rootroot00000000000000#! /usr/bin/env ruby # frozen_string_literal: true describe LegacyFacter::Util::Config do include PuppetlabsSpec::Files describe "ENV['HOME'] is unset", unless: LegacyFacter::Util::Root.root? do around do |example| Facter::Core::Execution.with_env('HOME' => nil) do example.run end end it 'does not set @external_facts_dirs' do LegacyFacter::Util::Config.setup_default_ext_facts_dirs expect(LegacyFacter::Util::Config.external_facts_dirs).to be_empty end end describe 'is_windows? function' do it "detects windows if Ruby RbConfig::CONFIG['host_os'] returns a windows OS" do host_os = %w[mswin win32 dos mingw cygwin] host_os.each do |h| allow(RbConfig::CONFIG).to receive(:[]).with('host_os').and_return(h) expect(LegacyFacter::Util::Config).to be_windows end end it "does not detect windows if Ruby RbConfig::CONFIG['host_os'] returns a non-windows OS" do host_os = %w[darwin linux] host_os.each do |h| allow(RbConfig::CONFIG).to receive(:[]).with('host_os').and_return(h) expect(LegacyFacter::Util::Config).not_to be_windows end end end describe 'is_mac? function' do it "detects mac if Ruby RbConfig::CONFIG['host_os'] returns darwin" do host_os = ['darwin'] host_os.each do |h| allow(RbConfig::CONFIG).to receive(:[]).with('host_os').and_return(h) expect(LegacyFacter::Util::Config).to be_mac end end end describe 'external_facts_dirs' do before do allow(LegacyFacter::Util::Root).to receive(:root?).and_return(true) end it 'returns the default value for linux' do allow(LegacyFacter::Util::Config).to receive(:windows?).and_return(false) allow(LegacyFacter::Util::Config).to receive(:windows_data_dir).and_return(nil) LegacyFacter::Util::Config.setup_default_ext_facts_dirs expect(LegacyFacter::Util::Config.external_facts_dirs) .to eq [ '/etc/puppetlabs/facter/facts.d', '/etc/facter/facts.d/', '/opt/puppetlabs/facter/facts.d' ] end it 'returns the default value for windows 2008' do allow(LegacyFacter::Util::Config).to receive(:windows?).and_return(true) allow(LegacyFacter::Util::Config).to receive(:windows_data_dir).and_return('C:\\ProgramData') LegacyFacter::Util::Config.setup_default_ext_facts_dirs expect(LegacyFacter::Util::Config.external_facts_dirs) .to eq [File.join('C:\\ProgramData', 'PuppetLabs', 'facter', 'facts.d')] end it 'returns the default value for windows 2003R2' do allow(LegacyFacter::Util::Config).to receive(:windows?).and_return(true) allow(LegacyFacter::Util::Config).to receive(:windows_data_dir).and_return('C:\\Documents') LegacyFacter::Util::Config.setup_default_ext_facts_dirs expect(LegacyFacter::Util::Config.external_facts_dirs) .to eq [File.join('C:\\Documents', 'PuppetLabs', 'facter', 'facts.d')] end it "returns the old and new (AIO) paths under user's home directory when not root" do allow(LegacyFacter::Util::Root).to receive(:root?).and_return(false) LegacyFacter::Util::Config.setup_default_ext_facts_dirs expect(LegacyFacter::Util::Config.external_facts_dirs) .to eq [File.join(ENV['HOME'], '.facter', 'facts.d'), File.join(ENV['HOME'], '.puppetlabs', 'opt', 'facter', 'facts.d')] end it 'includes additional values when user appends to the list' do LegacyFacter::Util::Config.setup_default_ext_facts_dirs original_values = LegacyFacter::Util::Config.external_facts_dirs.dup new_value = '/usr/share/newdir' LegacyFacter::Util::Config.external_facts_dirs << new_value expect(LegacyFacter::Util::Config.external_facts_dirs).to eq original_values + [new_value] end it 'onlies output new values when explicitly set' do LegacyFacter::Util::Config.setup_default_ext_facts_dirs new_value = ['/usr/share/newdir'] Facter::Options[:external_dir] = new_value expect(LegacyFacter::Util::Config.external_facts_dirs).to eq new_value end end describe 'override_binary_dir' do it 'returns the default value for linux' do allow(LegacyFacter::Util::Config).to receive(:windows?).and_return(false) LegacyFacter::Util::Config.setup_default_override_binary_dir expect(LegacyFacter::Util::Config.override_binary_dir).to eq '/opt/puppetlabs/puppet/bin' end it 'returns nil for windows' do allow(LegacyFacter::Util::Config).to receive(:windows?).and_return(true) LegacyFacter::Util::Config.setup_default_override_binary_dir expect(LegacyFacter::Util::Config.override_binary_dir).to eq nil end it 'outputs new values when explicitly set' do LegacyFacter::Util::Config.setup_default_override_binary_dir new_value = '/usr/share/newdir' LegacyFacter::Util::Config.override_binary_dir = new_value expect(LegacyFacter::Util::Config.override_binary_dir).to eq new_value end end end puppetlabs-facter-dfe6df4/spec/custom_facts/util/confine_spec.rb000077500000000000000000000131561470204764400253210ustar00rootroot00000000000000#! /usr/bin/env ruby # frozen_string_literal: true describe LegacyFacter::Util::Confine do it 'requires a fact name' do expect(LegacyFacter::Util::Confine.new('yay', true).fact).to eq 'yay' end it 'accepts a value specified individually' do expect(LegacyFacter::Util::Confine.new('yay', 'test').values).to eq ['test'] end it 'accepts multiple values specified at once' do expect(LegacyFacter::Util::Confine.new('yay', 'test', 'other').values).to eq %w[test other] end it 'fails if no fact name is provided' do expect { LegacyFacter::Util::Confine.new(nil, :test) }.to raise_error(ArgumentError) end it 'fails if no values were provided' do expect { LegacyFacter::Util::Confine.new('yay') }.to raise_error(ArgumentError) end it 'has a method for testing whether it matches' do expect(LegacyFacter::Util::Confine.new('yay', :test)).to respond_to(:true?) end describe 'when evaluating' do let(:fact) { double 'fact' } def confined(fact_value, *confines) allow(fact).to receive(:value).and_return fact_value LegacyFacter::Util::Confine.new('yay', *confines).true? end before do allow(Facter).to receive(:[]).and_return fact end it 'returns false if the fact does not exist' do allow(Facter).to receive(:[]).with('yay').and_return nil expect(LegacyFacter::Util::Confine.new('yay', 'test').true?).to be false end it 'uses the returned fact to get the value' do allow(Facter).to receive(:[]).with('yay').and_return fact expect(fact).to receive(:value).and_return nil LegacyFacter::Util::Confine.new('yay', 'test').true? end it 'returns false if the fact has no value' do expect(confined(nil, 'test')).to be false end it "returns true if any of the provided values matches the fact's value" do expect(confined('two', 'two')).to be true end it "returns true if any of the provided symbol values matches the fact's value" do expect(confined(:xy, :xy)).to be true end it "returns true if any of the provided integer values matches the fact's value" do expect(confined(1, 1)).to be true end it "returns true if any of the provided boolan values matches the fact's value" do expect(confined(true, true)).to be true end it "returns true if any of the provided array values matches the fact's value" do expect(confined([3, 4], [3, 4])).to be true end it "returns true if any of the provided symbol values matches the fact's value as a string" do expect(confined(:one, 'one')).to be true end it "returns true if any of the provided string values matches case-insensitive the fact's value" do expect(confined('four', 'Four')).to be true end it "returns true if any of the provided symbol values matches case-insensitive the fact's string value" do expect(confined(:four, 'Four')).to be true end it "returns true if any of the provided symbol values matches the fact's string value" do expect(confined('xy', :xy)).to be true end it "returns true if any of the provided regexp values matches the fact's string value" do expect(confined('abc', /abc/)).to be true end it "returns true if any of the provided ranges matches the fact's value" do expect(confined(6, (5..7))).to be true end it "returns false if none of the provided values matches the fact's value" do expect(confined('three', 'two', 'four')).to be false end it "returns false if none of the provided integer values matches the fact's value" do expect(confined(2, 1, [3, 4], (5..7))).to be false end it "returns false if none of the provided boolan values matches the fact's value" do expect(confined(false, true)).to be false end it "returns false if none of the provided array values matches the fact's value" do expect(confined([1, 2], [3, 4])).to be false end it "returns false if none of the provided ranges matches the fact's value" do expect(confined(8, (5..7))).to be false end it 'accepts and evaluate a block argument against the fact' do allow(fact).to receive(:value).and_return 'foo' confine = LegacyFacter::Util::Confine.new(:yay) { |f| f == 'foo' } expect(confine.true?).to be true end it 'accepts and evaluate a block argument against the fact while respecting case' do allow(fact).to receive(:value).and_return 'Foo' confine = LegacyFacter::Util::Confine.new(:yay) { |f| f == 'Foo' } expect(confine.true?).to be true end it 'accepts and evaluate multiple block arguments' do allow(fact).to receive(:value).and_return 'bar' first_confine = LegacyFacter::Util::Confine.new(:yay) { |f| f == 'foo' } second_confine = LegacyFacter::Util::Confine.new(:yay) { |f| f == 'bar' } expect(first_confine.true?).to be false expect(second_confine.true?).to be true end it 'returns false if the block raises a StandardError when checking a fact' do allow(fact).to receive(:value).and_return 'foo' confine = LegacyFacter::Util::Confine.new(:yay) { |_f| raise StandardError } expect(confine.true?).to be false end it 'accepts and evaluate only a block argument with true' do expect(LegacyFacter::Util::Confine.new { true }.true?).to be true end it 'accepts and evaluate only a block argument with false' do expect(LegacyFacter::Util::Confine.new { false }.true?).to be false end it 'returns false if the block raises a StandardError' do expect(LegacyFacter::Util::Confine.new { raise StandardError }.true?).to be false end end end puppetlabs-facter-dfe6df4/spec/custom_facts/util/directory_loader_spec.rb000077500000000000000000000112221470204764400272220ustar00rootroot00000000000000#!/usr/bin/env ruby # frozen_string_literal: true describe LegacyFacter::Util::DirectoryLoader do include PuppetlabsSpec::Files subject(:dir_loader) { LegacyFacter::Util::DirectoryLoader.new(tmpdir('directory_loader')) } let(:collection) { LegacyFacter::Util::Collection.new(double('internal loader'), dir_loader) } let(:collection_double) { instance_spy(LegacyFacter::Util::Collection) } it 'makes the directory available' do expect(dir_loader.directories).to be_instance_of(Array) end it "does nothing bad when dir doesn't exist" do fakepath = '/foobar/path' my_loader = LegacyFacter::Util::DirectoryLoader.new(fakepath) allow(FileTest).to receive(:exist?).with(my_loader.directories[0]).and_return(false) expect { my_loader.load(collection) }.not_to raise_error end describe 'when loading facts from disk' do let(:log_spy) { instance_spy(Facter::Log) } before do allow(Facter::Log).to receive(:new).and_return(log_spy) end it 'is able to load files from disk and set facts' do data = { 'f1' => 'one', 'f2' => 'two' } write_to_file('data.yaml', YAML.dump(data)) dir_loader.load(collection) expect(collection.value('f1')).to eq 'one' end it 'adds fact with external type to collection' do data = { 'f1' => 'one' } write_to_file('data.yaml', YAML.dump(data)) dir_loader.load(collection_double) file = File.join(dir_loader.directories[0], 'data.yaml') expect(collection_double).to have_received(:add).with('f1', value: 'one', fact_type: :external, file: file) end it 'ignores when a structured data fact contains empty hash' do data = {} write_to_file('data.yaml', YAML.dump(data)) file = File.join(dir_loader.directories[0], 'data.yaml') expect(log_spy).to receive(:debug).with( "Structured data fact file #{file} was parsed but was either empty or an invalid filetype (valid filetypes "\ 'are .yaml, .json, and .txt).' ) dir_loader.load(collection) end it 'ignores when fact with external type contains invalid data type' do data = 'foo' write_to_file('data.yaml', YAML.dump(data)) file = File.join(dir_loader.directories[0], 'data.yaml') expect(log_spy).to receive(:error).with( "Structured data fact file #{file} was parsed but no key=>value data was returned." ) dir_loader.load(collection) end it "ignores files that begin with '.'" do not_to_be_used_collection = double('collection should not be used') expect(not_to_be_used_collection).not_to receive(:add) data = { 'f1' => 'one', 'f2' => 'two' } write_to_file('.data.yaml', YAML.dump(data)) dir_loader.load(not_to_be_used_collection) end %w[bak orig].each do |ext| it "ignores files with an extension of '#{ext}'" do expect(log_spy).to receive(:debug).with(/#{ext}/) write_to_file("data.#{ext}", 'foo=bar') dir_loader.load(collection) end end it 'warns when trying to parse unknown file types' do write_to_file('file.unknownfiletype', 'stuff=bar') expect(log_spy).to receive(:debug).with(/file.unknownfiletype/) dir_loader.load(collection) end it 'external facts should almost always precedence over all other facts' do collection.add('f1', value: 'lower_weight_fact') do has_weight(LegacyFacter::Util::DirectoryLoader::EXTERNAL_FACT_WEIGHT - 1) end data = { 'f1' => 'external_fact' } write_to_file('data.yaml', YAML.dump(data)) dir_loader.load(collection) expect(collection.value('f1')).to eq 'external_fact' end describe 'given a custom weight' do subject(:dir_loader) { LegacyFacter::Util::DirectoryLoader.new(tmpdir('directory_loader'), 10) } it 'sets that weight for loaded external facts' do collection.add('f1', value: 'higher_weight_fact') { has_weight(11) } data = { 'f1' => 'external_fact' } write_to_file('data.yaml', YAML.dump(data)) dir_loader.load(collection) expect(collection.value('f1')).to eq 'higher_weight_fact' end end context 'when blocking external facts' do before do Facter::Options[:blocked_facts] = ['data.yaml'] end it 'is not loading blocked file' do data = { 'f1' => 'one', 'f2' => 'two' } write_to_file('data.yaml', YAML.dump(data)) dir_loader.load(collection) expect(collection_double).not_to have_received(:add) end end end def write_to_file(file_name, to_write) file = File.join(dir_loader.directories[0], file_name) File.open(file, 'w') { |f| f.print to_write } end end puppetlabs-facter-dfe6df4/spec/custom_facts/util/fact_spec.rb000077500000000000000000000133771470204764400246220ustar00rootroot00000000000000#! /usr/bin/env ruby # frozen_string_literal: true describe Facter::Util::Fact do subject(:fact) { Facter::Util::Fact.new('yay') } let(:resolution) { Facter::Util::Resolution.new('yay', fact) } let(:options) { { fact_type: :custom } } let(:logger) { instance_spy(Facter::Log) } before do allow(Facter::Log).to receive(:new).and_return(logger) end it 'requires a name' do expect { Facter::Util::Fact.new }.to raise_error(ArgumentError) end it 'raises a normalization error when trying a name has a UTF-8 null byte' do expect do Facter::Util::Fact.new("Cool \0 name") end.to raise_error(LegacyFacter::Util::Normalization::NormalizationError) end describe '#initialize' do it 'persists options' do fact = Facter::Util::Fact.new('yay', options) options.delete(:fact_type) expect(fact.options).to eq(fact_type: :custom) end end describe '#name' do it 'changing the name raises error' do expect { fact.name = 'new name' }.to raise_error(NoMethodError) end end describe '#add' do it 'persists options' do fact.add(options) {} options.delete(:fact_type) expect(fact.options).to eq(fact_type: :custom) end end it 'downcases and converts the name to a symbol' do expect(Facter::Util::Fact.new('YayNess').name).to eq :yayness end it 'issues a deprecation warning for use of ldapname' do expect(logger).to receive(:warnonce).with('ldapname is deprecated and will be removed in a future version') Facter::Util::Fact.new('YayNess', ldapname: 'fooness') end describe 'when adding resolution mechanisms using #add' do it 'delegates to #define_resolution with an anonymous resolution' do expect(fact).to receive(:define_resolution).with(nil, {}) fact.add end end describe 'looking up resolutions by name' do subject(:fact) { Facter::Util::Fact.new('yay') } it 'returns nil if no such resolution exists' do expect(fact.resolution('nope')).to be_nil end it 'never returns anonymous resolutions' do fact.add { setcode { 'anonymous' } } expect(fact.resolution(nil)).to be_nil end end describe 'adding resolution mechanisms by name' do let(:res) do double 'resolution', name: 'named', options: nil, resolution_type: :simple end it 'creates a new resolution if no such resolution exists' do allow(Facter::Util::Resolution).to receive(:new).once.with('named', fact).and_return(res) fact.define_resolution('named') expect(fact.resolution('named')).to eq res end it 'creates a simple resolution when the type is nil' do fact.define_resolution('named') expect(fact.resolution('named')).to be_a_kind_of Facter::Util::Resolution end it 'creates a simple resolution when the type is :simple' do fact.define_resolution('named', type: :simple) expect(fact.resolution('named')).to be_a_kind_of Facter::Util::Resolution end it 'creates an aggregate resolution when the type is :aggregate' do fact.define_resolution('named', type: :aggregate) expect(fact.resolution('named')).to be_a_kind_of Facter::Core::Aggregate end it 'raises an error if there is an existing resolution with a different type' do expect(logger).to receive(:error).with( "Unable to add resolve \"named\" for fact 'yay': Cannot return resolution named with type aggregate; already "\ 'defined as simple', true ) fact.define_resolution('named', type: :simple) fact.define_resolution('named', type: :aggregate) end it 'returns existing resolutions by name' do allow(Facter::Util::Resolution).to receive(:new).once.with('named', fact).and_return(res) fact.define_resolution('named') fact.define_resolution('named') expect(fact.resolution('named')).to eq res end end describe 'when returning a value' do it 'returns nil if there are no resolutions' do expect(Facter::Util::Fact.new('yay').value).to be nil end it 'prefers the highest weight resolution' do fact.add do has_weight 1 setcode { '1' } end fact.add do has_weight 2 setcode { '2' } end fact.add do has_weight 0 setcode { '0' } end expect(fact.value).to eq '2' end it 'returns the first value returned by a resolution' do fact.add do has_weight 1 setcode { '1' } end fact.add do has_weight 2 setcode { nil } end fact.add do has_weight 0 setcode { '0' } end expect(fact.value).to eq '1' end it 'skips unsuitable resolutions' do fact.add do has_weight 1 setcode { '1' } end fact.add do def suitable? false end has_weight 2 setcode { 2 } end expect(fact.value).to eq '1' end it 'sets weight of the resolution that gave the value' do fact.add do has_weight 1 setcode { '1' } end fact.add do has_weight 2 setcode { nil } end fact.add do has_weight 0 setcode { '0' } end expect(fact).to be_an_instance_of(Facter::Util::Fact).and( having_attributes(value: '1', used_resolution_weight: 1) ) end end describe '#flush' do subject(:fact) { Facter::Util::Fact.new(:foo) } it 'invokes #flush on simple resolutions' do simple = fact.add(type: :simple) expect(simple).to receive(:flush) fact.flush end it 'invokes #flush on aggregate resolutions' do aggregate = fact.add(type: :aggregate) expect(aggregate).to receive(:flush) fact.flush end end end puppetlabs-facter-dfe6df4/spec/custom_facts/util/loader_spec.rb000077500000000000000000000207401470204764400251430ustar00rootroot00000000000000#! /usr/bin/env ruby # frozen_string_literal: true describe LegacyFacter::Util::Loader do let(:logger) { instance_spy(Facter::Log) } before do allow(Facter::Log).to receive(:new).and_return(logger) end def loader_from(places) env = places[:env] || {} search_path = places[:search_path] || [] loader = LegacyFacter::Util::Loader.new(env) allow(loader).to receive(:search_path).and_return(search_path) loader end it 'has a method for loading individual facts by name' do expect(LegacyFacter::Util::Loader.new).to respond_to(:load) end it 'has a method for loading all facts' do expect(LegacyFacter::Util::Loader.new).to respond_to(:load_all) end it 'has a method for returning directories containing facts' do expect(LegacyFacter::Util::Loader.new).to respond_to(:search_path) end describe 'when determining the search path' do let(:loader) { LegacyFacter::Util::Loader.new } it 'includes the facter subdirectory of all paths in ruby LOAD_PATH' do dirs = $LOAD_PATH.collect { |d| File.expand_path('facter', d) } allow(File).to receive(:directory?).and_return true paths = loader.search_path dirs.each do |dir| expect(paths).to include(dir) end end it 'excludes invalid search paths' do dirs = $LOAD_PATH.collect { |d| File.expand_path('custom_facts', d) } allow(File).to receive(:directory?).and_return false paths = loader.search_path dirs.each do |dir| expect(paths).not_to include(dir) end end it 'includes all search paths registered with Facter' do allow(Facter::Options).to receive(:custom_dir).and_return %w[/one two/three] allow(File).to receive(:directory?).and_return false allow(File).to receive(:directory?).with('/one').and_return true allow(File).to receive(:directory?).with('two/three').and_return true paths = loader.search_path expect(paths).to include('/one', 'two/three') end it 'strips paths that are valid paths but are not present' do allow(Facter::Options).to receive(:custom_dir).and_return %w[/one /two] allow(File).to receive(:directory?).and_return false allow(File).to receive(:directory?).with('/one').and_return true allow(File).to receive(:directory?).with('/two').and_return false paths = loader.search_path expect(paths).to match_array(['/one']) end describe 'and the FACTERLIB environment variable is set' do it 'includes all paths in FACTERLIB' do loader = LegacyFacter::Util::Loader.new('FACTERLIB' => "/one/path#{File::PATH_SEPARATOR}/two/path") allow(File).to receive(:directory?).and_return false allow(File).to receive(:directory?).with('/one/path').and_return true allow(File).to receive(:directory?).with('/two/path').and_return true paths = loader.search_path %w[/one/path /two/path].each do |dir| expect(paths).to include(dir) end end end end describe 'when loading facts' do it 'loads values from the matching environment variable if one is present' do loader = loader_from(env: { 'facter_testing' => 'yayness' }) allow(LegacyFacter).to receive(:add) loader.load(:testing) expect(LegacyFacter).to have_received(:add).with('testing', { fact_type: :external, is_env: true }) end it 'loads any files in the search path with names matching the fact name' do loader = loader_from(search_path: %w[/one/dir /two/dir]) allow(loader).to receive(:search_path).and_return %w[/one/dir /two/dir] allow(FileTest).to receive(:file?).and_return false allow(FileTest).to receive(:file?).with('/one/dir/testing.rb').and_return true expect(Kernel).to receive(:load).with('/one/dir/testing.rb') loader.load(:testing) end it 'does not load any ruby files from subdirectories matching the fact name in the search path' do loader = LegacyFacter::Util::Loader.new allow(FileTest).to receive(:file?).and_return false allow(FileTest).to receive(:file?).with('/one/dir/testing.rb').and_return true allow(File).to receive(:directory?).with('/one/dir/testing').and_return true allow(loader).to receive(:search_path).and_return %w[/one/dir] allow(Dir).to receive(:entries).with('/one/dir/testing').and_return %w[foo.rb bar.rb] %w[/one/dir/testing/foo.rb /one/dir/testing/bar.rb].each do |f| allow(File).to receive(:directory?).with(f).and_return false allow(Kernel).to receive(:load).with(f) end expect(Kernel).to receive(:load).with('/one/dir/testing.rb') loader.load(:testing) end it "does not load files that don't end in '.rb'" do loader = LegacyFacter::Util::Loader.new allow(loader).to receive(:search_path).and_return %w[/one/dir] allow(FileTest).to receive(:file?).and_return false allow(FileTest).to receive(:file?).with('/one/dir/testing.rb').and_return false expect(Kernel).not_to receive(:load) loader.load(:testing) end end describe 'when loading all facts' do let(:loader) { LegacyFacter::Util::Loader.new } before do allow(loader).to receive(:search_path).and_return([]) allow(File).to receive(:directory?).and_return true end it 'loads all files in all search paths' do loader = loader_from(search_path: %w[/one/dir /two/dir]) allow(Dir).to receive(:glob).with('/one/dir/*.rb').and_return %w[/one/dir/a.rb /one/dir/b.rb] allow(Dir).to receive(:glob).with('/two/dir/*.rb').and_return %w[/two/dir/c.rb /two/dir/d.rb] %w[/one/dir/a.rb /one/dir/b.rb /two/dir/c.rb /two/dir/d.rb].each do |f| allow(FileTest).to receive(:file?).with(f).and_return true expect(Kernel).to receive(:load).with(f) end loader.load_all end it 'does not try to load subdirectories of search paths' do allow(loader).to receive(:search_path).and_return %w[/one/dir /two/dir] # a.rb is a directory allow(Dir).to receive(:glob).with('/one/dir/*.rb').and_return %w[/one/dir/a.rb /one/dir/b.rb] allow(FileTest).to receive(:file?).with('/one/dir/a.rb').and_return false allow(FileTest).to receive(:file?).with('/one/dir/b.rb').and_return true allow(Kernel).to receive(:load).with('/one/dir/b.rb') # c.rb is a directory allow(Dir).to receive(:glob).with('/two/dir/*.rb').and_return %w[/two/dir/c.rb /two/dir/d.rb] allow(FileTest).to receive(:file?).with('/two/dir/c.rb').and_return false allow(FileTest).to receive(:file?).with('/two/dir/d.rb').and_return true expect(Kernel).to receive(:load).with('/two/dir/d.rb') loader.load_all end it 'does not raise an exception when a file is unloadable' do allow(loader).to receive(:search_path).and_return %w[/one/dir] allow(Dir).to receive(:glob).with('/one/dir/*.rb').and_return %w[/one/dir/a.rb] allow(FileTest).to receive(:file?).with('/one/dir/a.rb').and_return true allow(Facter).to receive(:log_exception).with(LoadError, 'Error loading fact /one/dir/a.rb: LoadError') allow(Kernel).to receive(:load).with('/one/dir/a.rb').and_raise(LoadError) expect { loader.load_all }.not_to raise_error end context 'when loads all facts from the environment' do before do Facter::Util::Resolution.with_env 'FACTER_one' => 'yayness', 'FACTER_TWO' => 'boo' do loader.load_all end end it 'loaded fact one' do expect(LegacyFacter.value(:one)).to eq 'yayness' end it 'loaded fact two' do expect(LegacyFacter.value(:two)).to eq 'boo' end end it 'only load all facts once' do loader = loader_from(env: {}) expect(loader).to receive(:load_env).once loader.load_all loader.load_all end context 'when directory path has wrong slashes' do before do allow(Dir).to receive(:glob).with('/one/dir/*.rb').and_return %w[/one/dir/a.rb] end dir_paths = ['//one///dir', '//one///\\dir', '/one///\/\dir', '\one///\\dir'] dir_paths.each do |dir_path| it 'corrects the directory path' do allow(loader).to receive(:search_path).and_return [dir_path] loader.load_all expect(Dir).to have_received(:glob).with('/one/dir/*.rb') end end end end it 'loads facts on the facter search path only once' do loader = loader_from(env: {}) loader.load_all expect(loader).not_to receive(:kernel_load).with(/ec2/) loader.load(:ec2) end end puppetlabs-facter-dfe6df4/spec/custom_facts/util/normalization_spec.rb000066400000000000000000000133151470204764400265600ustar00rootroot00000000000000# frozen_string_literal: true describe LegacyFacter::Util::Normalization do subject(:normalization) { LegacyFacter::Util::Normalization } def utf16(str) if String.method_defined?(:encode) && defined?(::Encoding) str.encode(Encoding::UTF_16LE) else str end end def utf8(str) if String.method_defined?(:encode) && defined?(::Encoding) str.encode(Encoding::UTF_8) else str end end describe 'validating strings' do describe 'and string encoding is supported', if: String.instance_methods.include?(:encoding) do it 'accepts strings that are ASCII and match their encoding and converts them to UTF-8' do str = 'ASCII'.encode(Encoding::ASCII) normalized_str = normalization.normalize(str) expect(normalized_str.encoding).to eq(Encoding::UTF_8) end it 'accepts strings that are UTF-8 and match their encoding' do str = "let's make a ☃!".encode(Encoding::UTF_8) expect(normalization.normalize(str)).to eq(str) end it 'converts valid non UTF-8 strings to UTF-8' do str = "let's make a ☃!".encode(Encoding::UTF_16LE) enc = normalization.normalize(str).encoding expect(enc).to eq(Encoding::UTF_8) end it 'normalizes a frozen string returning a non-frozen string' do str = 'factvalue'.encode(Encoding::UTF_16LE).freeze normalized_str = normalization.normalize(str) expect(normalized_str).not_to be_frozen end it 'rejects strings that are not UTF-8 and do not match their claimed encoding' do invalid_shift_jis = (+"\xFF\x5C!").force_encoding(Encoding::SHIFT_JIS) expect do normalization.normalize(invalid_shift_jis) end.to raise_error(LegacyFacter::Util::Normalization::NormalizationError, /String encoding Shift_JIS is not UTF-8 and could not be converted to UTF-8/) end it "rejects strings that claim to be UTF-8 encoded but aren't" do str = (+"\255ay!").force_encoding(Encoding::UTF_8) expect do normalization.normalize(str) end.to raise_error(LegacyFacter::Util::Normalization::NormalizationError, /String "\\xADay!" doesn't match the reported encoding UTF-8/) end it 'rejects strings that only have the start of a valid UTF-8 sequence' do str = "\xc3\x28" expect do normalization.normalize(str) end.to raise_error(LegacyFacter::Util::Normalization::NormalizationError, /String "\\xC3\(" doesn't match the reported encoding UTF-8/) end it 'rejects valid non-UTF-8 encoded strings that claim to be UTF-8 encoded' do str = 'Mitteleuropäische Zeit'.encode(Encoding::UTF_16LE) str.force_encoding(Encoding::UTF_8) expect do normalization.normalize(str) end.to raise_error(LegacyFacter::Util::Normalization::NormalizationError, /String.*doesn't match the reported encoding UTF-8/) end it 'rejects UTF-8 strings that contain null bytes' do test_strings = ["\u0000", "\0", "\x00", "null byte \x00 in the middle"] test_strings.each do |str| expect do normalization.normalize(str) end.to raise_error(LegacyFacter::Util::Normalization::NormalizationError, /String.*contains a null byte reference/) end end end describe 'and string encoding is not supported', unless: String.instance_methods.include?(:encoding) do it 'accepts strings that are UTF-8 and match their encoding' do str = "let's make a ☃!" expect(normalization.normalize(str)).to eq(str) end it 'rejects strings that are not UTF-8' do str = "let's make a \255\255\255!" expect do normalization.normalize(str) end.to raise_error(LegacyFacter::Util::Normalization::NormalizationError, /String .* is not valid UTF-8/) end end end describe 'normalizing arrays' do it 'normalizes each element in the array' do arr = [utf16('first'), utf16('second'), [utf16('third'), utf16('fourth')]] expected_arr = [utf8('first'), utf8('second'), [utf8('third'), utf8('fourth')]] expect(normalization.normalize_array(arr)).to eq(expected_arr) end end describe 'normalizing hashes' do it 'normalizes each element in the array' do hsh = { utf16('first') => utf16('second'), utf16('third') => [utf16('fourth'), utf16('fifth')] } expected_hsh = { utf8('first') => utf8('second'), utf8('third') => [utf8('fourth'), utf8('fifth')] } expect(normalization.normalize_hash(hsh)).to eq(expected_hsh) end end describe '.normalize' do context 'when Time object' do it 'returns a string in an ISO 8601 format' do value = Time.utc(2020) expected = '2020-01-01T00:00:00Z' expect(normalization.normalize(value)).to eq(expected) end end context 'when Date object' do it 'returns a string in an ISO 8601 format' do value = Date.new(2020) expected = '2020-01-01' expect(normalization.normalize(value)).to eq(expected) end end [1, 1.0, true, false, nil, :symbol].each do |val| it "accepts #{val.inspect}:#{val.class}" do expect(normalization.normalize(val)).to eq(val) end end [Object.new, Set.new].each do |val| it "rejects #{val.inspect}:#{val.class}" do expect do normalization.normalize(val) end.to raise_error(LegacyFacter::Util::Normalization::NormalizationError, /Expected .*but was #{val.class}/) end end end end puppetlabs-facter-dfe6df4/spec/custom_facts/util/parser_spec.rb000077500000000000000000000316121470204764400251710ustar00rootroot00000000000000#!/usr/bin/env ruby # frozen_string_literal: true require 'tempfile' require 'tmpdir' describe LegacyFacter::Util::Parser do include PuppetlabsSpec::Files let(:data) { { 'one' => 'two', 'three' => 'four' } } describe '#extension_matches?' do it 'matches extensions when subclass uses match_extension' do expect(LegacyFacter::Util::Parser.extension_matches?('myfile.foobar', 'foobar')).to be true end it 'matches extensions when subclass uses match_extension with an array' do expect(LegacyFacter::Util::Parser.extension_matches?('myfile.ext3', %w[ext1 ext2 ext3])).to be true end it 'matches extension ignoring case on file' do expect(LegacyFacter::Util::Parser.extension_matches?('myfile.ExT1', 'ext1')).to be true end it 'matches extension ignoring case for match_extension' do expect(LegacyFacter::Util::Parser.extension_matches?('myfile.exT1', 'EXT1')).to be true end end describe '#parse_executable_output' do subject(:parser) { LegacyFacter::Util::Parser::Base.new('myfile.sh') } let(:yaml_data) { "one: two\nthree: four\n" } let(:keyvalue) { "one=two\nthree=four\n" } it 'receives yaml and returns hash' do expect(parser.parse_executable_output(yaml_data)).to eq data end it 'receives keyvalue and returns hash' do expect(parser.parse_executable_output(keyvalue)).to eq data end it 'raises no exception on nil' do expect(parser.parse_executable_output(nil)).to be_empty end it 'returns {} on invalid data' do expect(parser.parse_executable_output('random')).to be_empty end end shared_examples_for 'handling a not readable file' do before do allow(Facter::Util::FileHelper).to receive(:safe_read).with(data_file, nil).and_return(nil) allow(Facter).to receive(:log_exception).at_least(:once) end it 'handles not readable file' do expect { LegacyFacter::Util::Parser.parser_for(data_file).results }.not_to raise_error end end describe 'yaml' do let(:data_in_yaml) { YAML.dump(data) } let(:data_file) { '/tmp/foo.yaml' } it 'returns a hash of whatever is stored on disk' do allow(Facter::Util::FileHelper).to receive(:safe_read).with(data_file, nil).and_return(data_in_yaml) expect(LegacyFacter::Util::Parser.parser_for(data_file).results).to eq data end it 'handles exceptions' do allow(Facter::Util::FileHelper).to receive(:safe_read) .with(data_file, nil).and_return("#{data_in_yaml}}") allow(Facter).to receive(:log_exception).at_least(:once) expect { LegacyFacter::Util::Parser.parser_for(data_file).results }.not_to raise_error end it_behaves_like 'handling a not readable file' end describe 'json' do let(:data_in_json) { JSON.dump(data) } let(:data_file) { '/tmp/foo.json' } it 'returns a hash of whatever is stored on disk' do pending('this test requires the json library') unless LegacyFacter.json? allow(Facter::Util::FileHelper).to receive(:safe_read).with(data_file, nil).and_return(data_in_json) expect(LegacyFacter::Util::Parser.parser_for(data_file).results).to eq data end it_behaves_like 'handling a not readable file' end describe 'txt' do let(:data_file) { '/tmp/foo.txt' } shared_examples_for 'txt parser' do it 'returns a hash of whatever is stored on disk' do allow(Facter::Util::FileHelper).to receive(:safe_read).with(data_file, nil).and_return(data_in_txt) expect(LegacyFacter::Util::Parser.parser_for(data_file).results).to eq data end end context 'when is well formed data' do let(:data_in_txt) { "one=two\nthree=four\n" } it_behaves_like 'txt parser' end context 'when there is an extra equal sign' do let(:data_in_txt) { "one=two\nthree=four=five\n" } let(:data) { { 'one' => 'two', 'three' => 'four=five' } } it_behaves_like 'txt parser' end context 'when there is extra data' do let(:data_in_txt) { "one=two\nfive\nthree=four\n" } it_behaves_like 'txt parser' end it_behaves_like 'handling a not readable file' end describe 'scripts' do let(:ext) { LegacyFacter::Util::Config.windows? ? '.bat' : '.sh' } let(:cmd) { "/tmp/foo#{ext}" } let(:data_in_txt) { "one=two\nthree=four\n" } let(:yaml_data) { "one: two\nthree: four\n" } let(:logger) { instance_spy(Facter::Log) } def expects_script_to_return(path, content, result, err = nil) allow(Facter::Core::Execution).to receive(:execute_command).with(path).and_return([content, err]) allow(File).to receive(:executable?).with(path).and_return(true) allow(FileTest).to receive(:file?).with(path).and_return(true) expect(LegacyFacter::Util::Parser.parser_for(path).results).to eq result end def expects_parser_to_return_nil_for_directory(path) allow(FileTest).to receive(:file?).with(path).and_return(false) expect(LegacyFacter::Util::Parser.parser_for(path).results).to be nil end it 'returns a hash of whatever is returned by the executable' do expects_script_to_return(cmd, data_in_txt, data) end it 'does not parse a directory' do expects_parser_to_return_nil_for_directory(cmd) end it 'returns structured data' do expects_script_to_return(cmd, yaml_data, data) end it 'handles Symbol correctly' do yaml_data = "---\n:one: :two\nthree: four\n" exptected_data = { :one => :two, 'three' => 'four' } expects_script_to_return(cmd, yaml_data, exptected_data) end it 'writes warning message' do allow(Facter).to receive(:warn).at_least(:once) allow(Facter::Log).to receive(:new).with("foo#{ext}").and_return(logger) expects_script_to_return(cmd, yaml_data, data, 'some error') expect(logger).to have_received(:warn).with("Command /tmp/foo#{ext} completed with the "\ 'following stderr message: some error') end it 'handles Time correctly' do yaml_data = "---\nfirst: 2020-07-15 05:38:12.427678398 +00:00\n" allow(Facter::Core::Execution).to receive(:execute_command).with(cmd).and_return([yaml_data, nil]) allow(File).to receive(:executable?).with(cmd).and_return(true) allow(FileTest).to receive(:file?).with(cmd).and_return(true) expect(LegacyFacter::Util::Parser.parser_for(cmd).results['first']).to be_a(Time) end it 'returns an empty hash when the script returns nil' do expects_script_to_return(cmd, nil, {}) end it 'quotes scripts with spaces' do path = "/h a s s p a c e s#{ext}" expect(Facter::Core::Execution).to receive(:execute_command) .with("\"#{path}\"").and_return([data_in_txt, nil]) expects_script_to_return(path, data_in_txt, data) end describe 'exe, bat, cmd, and com files' do let(:cmds) { ['/tmp/foo.bat', '/tmp/foo.cmd', '/tmp/foo.exe', '/tmp/foo.com'] } before do cmds.each do |cmd| allow(File).to receive(:executable?).with(cmd).and_return(true) allow(FileTest).to receive(:file?).with(cmd).and_return(true) end end it 'returns nothing parser if not on windows' do allow(LegacyFacter::Util::Config).to receive(:windows?).and_return(false) cmds.each do |cmd| expect(LegacyFacter::Util::Parser.parser_for(cmd)) .to be_an_instance_of(LegacyFacter::Util::Parser::NothingParser) end end it 'returns script parser if on windows' do allow(LegacyFacter::Util::Config).to receive(:windows?).and_return(true) cmds.each do |cmd| expect(LegacyFacter::Util::Parser.parser_for(cmd)) .to be_an_instance_of(LegacyFacter::Util::Parser::ScriptParser) end end end describe 'powershell' do let(:ps1) { '/tmp/foo.ps1' } let(:logger) { instance_spy(Facter::Log) } before do allow(File).to receive(:readable?).and_return(false) end def expects_to_parse_powershell(cmd, result) allow(LegacyFacter::Util::Config).to receive(:windows?).and_return(true) allow(FileTest).to receive(:file?).with(ps1).and_return(true) expect(LegacyFacter::Util::Parser.parser_for(cmd).results).to eq result end it 'does not parse a directory' do expects_parser_to_return_nil_for_directory(ps1) end it 'parses output from powershell' do allow(Facter::Core::Execution).to receive(:execute_command).and_return([data_in_txt, nil]) expects_to_parse_powershell(ps1, data) end it 'parses yaml output from powershell' do allow(Facter::Core::Execution).to receive(:execute_command).and_return([yaml_data, nil]) expects_to_parse_powershell(ps1, data) end it 'logs warning from powershell' do allow(Facter::Core::Execution).to receive(:execute_command).and_return([yaml_data, 'some error']) allow(Facter::Log).to receive(:new).with('foo.ps1').and_return(logger) expects_to_parse_powershell(ps1, data) expect(logger).to have_received(:warn).with('Command "powershell.exe" -NoProfile -NonInteractive -NoLogo '\ '-ExecutionPolicy Bypass -File "/tmp/foo.ps1" completed with the following stderr message: some error') end context 'when executing powershell' do let(:sysnative_powershell) { "#{ENV['SYSTEMROOT']}\\sysnative\\WindowsPowershell\\v1.0\\powershell.exe" } let(:system32_powershell) { "#{ENV['SYSTEMROOT']}\\system32\\WindowsPowershell\\v1.0\\powershell.exe" } let(:sysnative_regexp) { /^"#{Regexp.escape(sysnative_powershell)}"/ } let(:system32_regexp) { /^"#{Regexp.escape(system32_powershell)}"/ } let(:powershell_regexp) { /^"#{Regexp.escape('powershell.exe')}"/ } it 'prefers the sysnative alias to resolve 64-bit powershell on 32-bit ruby' do allow(File).to receive(:readable?).with(sysnative_powershell).and_return(true) allow(Facter::Core::Execution) .to receive(:execute_command) .with(sysnative_regexp) .and_return([data_in_txt, nil]) expects_to_parse_powershell(ps1, data) end it "uses system32 if sysnative alias doesn't exist on 64-bit ruby" do allow(File).to receive(:readable?).with(sysnative_powershell).and_return(false) allow(File).to receive(:readable?).with(system32_powershell).and_return(true) allow(Facter::Core::Execution).to receive(:execute_command).with(system32_regexp) .and_return([data_in_txt, nil]) expects_to_parse_powershell(ps1, data) end it "uses 'powershell' as a last resort" do allow(File).to receive(:readable?).with(sysnative_powershell).and_return(false) allow(File).to receive(:readable?).with(system32_powershell).and_return(false) allow(Facter::Core::Execution) .to receive(:execute_command) .with(powershell_regexp) .and_return([data_in_txt, nil]) expects_to_parse_powershell(ps1, data) end end end end describe 'nothing parser' do it 'uses the nothing parser when there is no other parser' do expect(LegacyFacter::Util::Parser.parser_for('this.is.not.valid').results).to be nil end end describe LegacyFacter::Util::Parser::YamlParser do let(:yaml_parser) { LegacyFacter::Util::Parser::YamlParser.new(nil, yaml_content) } describe '#parse_results' do context 'when yaml anchors are present' do let(:yaml_content) { load_fixture('external_fact_yaml_anchor').read } it 'parses the yaml anchors' do expected_result = { 'one' => { 'test' => { 'a' => ['foo'] } }, 'two' => { 'TEST' => { 'A' => ['foo'] } } } expect(yaml_parser.parse_results).to eq(expected_result) end end context 'when yaml contains Time formatted fields' do context 'when time zone is present' do let(:yaml_content) { load_fixture('external_fact_yaml').read } it 'treats it as a string' do expected_result = { 'testsfact' => { 'time' => '2020-04-28 01:44:08.148119000 +01:01' } } expect(yaml_parser.parse_results).to eq(expected_result) end end context 'when time zone is missing' do let(:yaml_content) { load_fixture('external_fact_yaml_no_zone').read } it 'is interpreted as a string' do expected_result = { 'testsfact' => { 'time' => '2020-04-28 01:44:08.148119000' } } expect(yaml_parser.parse_results).to eq(expected_result) end end end context 'when yaml contains Date formatted fields' do let(:yaml_content) { load_fixture('external_fact_yaml_date').read } it 'loads date' do expected_result = { 'testsfact' => { 'date' => Date.parse('2020-04-28') } } expect(yaml_parser.parse_results).to eq(expected_result) end end end end end puppetlabs-facter-dfe6df4/spec/custom_facts/util/resolution_spec.rb000077500000000000000000000122651470204764400261030ustar00rootroot00000000000000#! /usr/bin/env ruby # frozen_string_literal: true describe Facter::Util::Resolution do subject(:resolution) { Facter::Util::Resolution.new(:foo, stub_fact) } let(:stub_fact) { double('fact', name: :stubfact) } let(:logger) { Facter::Log.class_variable_get(:@@logger) } it 'requires a name' do expect { Facter::Util::Resolution.new }.to raise_error(ArgumentError) end it 'requires a fact' do expect { Facter::Util::Resolution.new('yay') }.to raise_error(ArgumentError) end it 'can return its name' do expect(resolution.name).to eq :foo end it 'can explicitly set a value' do resolution.value = 'foo' expect(resolution.value).to eq 'foo' end it 'defaults to nil for code' do expect(resolution.code).to be_nil end describe 'when setting the code' do it 'creates a block when given a command' do resolution.setcode 'foo' expect(resolution.code).to be_a_kind_of Proc end it 'stores the provided block when given a block' do block = -> {} resolution.setcode(&block) expect(resolution.code).to equal(block) end it 'prefers a command over a block' do block = -> {} resolution.setcode('foo', &block) expect(resolution.code).not_to eq block end it 'fails if neither a string nor block has been provided' do expect { resolution.setcode }.to raise_error(ArgumentError) end end describe 'when returning the value' do it 'returns any value that has been provided' do resolution.value = 'foo' expect(resolution.value).to eq 'foo' end it 'returns a value that is equal to false' do resolution.value = false expect(resolution.value).to eq false end describe 'and setcode has not been called' do it 'returns nil' do expect(resolution.value).to be_nil end end describe 'and the code is a string' do it 'returns the result of executing the code' do resolution.setcode '/bin/foo' allow(Facter::Core::Execution).to receive(:execute).once.with('/bin/foo', anything).and_return('yup') expect(resolution.value).to eq 'yup' end end describe 'and the code is a block' do it 'returns the value returned by the block' do resolution.setcode { 'yayness' } expect(resolution.value).to eq 'yayness' end end end describe 'setting options' do it 'can set the value' do resolution.options(value: 'something') expect(resolution.value).to eq 'something' end it 'can set the timeout' do resolution.options(timeout: 314) expect(resolution.limit).to eq 314 end it 'can set the weight' do resolution.options(weight: 27) expect(resolution.weight).to eq 27 end it 'fact_type does not raise error' do expect { resolution.options(fact_type: 'simple') }.not_to raise_error end it 'fails on unhandled options' do expect do resolution.options(foo: 'bar') end.to raise_error(ArgumentError, /Invalid resolution options.*foo/) end end describe '#has_weight' do it 'returns the class instance' do expect(resolution.has_weight(42)).to be(resolution) end end describe 'evaluating' do it 'evaluates the block in the context of the given resolution' do expect(resolution).to receive(:setcode).with('code') resolution.evaluate { setcode('code') } end it 'raises a warning if the resolution is evaluated twice' do expect(logger).to receive(:warn).with(/Already evaluated foo at.*reevaluating anyways/) resolution.evaluate {} resolution.evaluate {} end end describe '#<=>' do let(:other_fact) { instance_spy(Facter::Util::Fact, name: :other_fact) } let(:other_resolution) { Facter::Util::Resolution.new(:other_fact, other_fact) } context 'when self has greater weight than other' do before do resolution.options(weight: 100) other_resolution.options(weight: 99) end it 'return 1' do expect(resolution <=> other_resolution).to eq(1) end end context 'when self has lower weight than other' do before do resolution.options(weight: 99) other_resolution.options(weight: 100) end it 'return -1' do expect(resolution <=> other_resolution).to eq(-1) end end context 'when self has equal weight to other' do before do resolution.options(weight: 100) other_resolution.options(weight: 100) end it 'returns 0' do expect(resolution <=> other_resolution).to eq(0) end context 'when self is custom and other is external' do before do resolution.options(fact_type: :external) other_resolution.options(fact_type: :custom) end it 'returns 1' do expect(resolution <=> other_resolution).to eq(1) end end context 'when self is external and other is custom' do before do resolution.options(fact_type: :custom) other_resolution.options(fact_type: :external) end it 'returns -1' do expect(resolution <=> other_resolution).to eq(-1) end end end end end puppetlabs-facter-dfe6df4/spec/facter/000077500000000000000000000000001470204764400201255ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/cache_manager_spec.rb000066400000000000000000000313721470204764400242270ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::CacheManager do subject(:cache_manager) { Facter::CacheManager.new } let(:cache_dir) { '/etc/facter/cache' } let(:searched_core_fact) do instance_spy(Facter::SearchedFact, name: 'os', fact_class: instance_spy(Facts::Linux::Os::Name), user_query: '', type: :core, file: nil) end let(:searched_custom_fact) do instance_spy(Facter::SearchedFact, name: 'my_custom_fact', fact_class: nil, user_query: '', type: :custom, file: nil) end let(:searched_external_fact) do instance_spy(Facter::SearchedFact, name: 'my_external_fact', fact_class: nil, user_query: '', type: :file, file: '/tmp/ext_file.txt') end let(:searched_facts) { [searched_core_fact, searched_custom_fact, searched_external_fact] } let(:cached_core_fact) { "{\n \"os\": \"Ubuntu\",\n \"cache_format_version\": 1\n}" } let(:cached_external_fact) { "{\n \"my_external_fact\": \"ext_fact\",\n\"cache_format_version\": 1\n}" } let(:resolved_core_fact) { mock_resolved_fact('os', 'Ubuntu', '') } let(:resolved_facts) { [resolved_core_fact] } let(:group_name) { 'operating system' } let(:cache_file_name) { File.join(cache_dir, group_name) } let(:fact_groups) { instance_spy(Facter::FactGroups) } let(:os_fact) { { ttls: 60, group: 'operating system' } } let(:external_fact) { { ttls: 60, group: 'ext_file.txt' } } let(:logger) { instance_spy(Facter::Log) } before do allow(File).to receive(:readable?).and_call_original allow(File).to receive(:directory?).and_call_original allow(LegacyFacter::Util::Config).to receive(:facts_cache_dir).and_return(cache_dir) allow(Facter::FactGroups).to receive(:new).and_return(fact_groups) allow(Facter::Options).to receive(:[]).with(:debug).and_return(false) allow(Facter::Options).to receive(:[]) allow(Facter::Options).to receive(:[]).with(:ttls).and_return([]) allow(Facter::Log).to receive(:new).and_return(logger) end describe '#resolve_facts' do context 'with no cache dir' do before do allow(File).to receive(:directory?).with(cache_dir).and_return(false) allow(Facter::Options).to receive(:[]).with(:cache).and_return(true) allow(Facter::Options).to receive(:[]).with(:ttls).and_return(['fact']) end it 'returns searched facts' do sf, _cf = cache_manager.resolve_facts(searched_facts) expect(sf).to eq(searched_facts) end it 'returns no cached facts' do _, cf = cache_manager.resolve_facts(searched_facts) expect(cf).to be_empty end end context 'with no cache false' do before do allow(File).to receive(:directory?).with(cache_dir).and_return(true) allow(Facter::Options).to receive(:[]).with(:cache).and_return(false) allow(Facter::Options).to receive(:[]).with(:ttls).and_return(['fact']) end it 'returns searched facts' do sf, _cf = cache_manager.resolve_facts(searched_facts) expect(sf).to eq(searched_facts) end it 'returns no cached facts' do _, cf = cache_manager.resolve_facts(searched_facts) expect(cf).to be_empty end end context 'with cached facts' do before do allow(File).to receive(:directory?).with(cache_dir).and_return(true) allow(fact_groups).to receive(:get_fact_group).with('os').and_return(group_name) allow(fact_groups).to receive(:get_fact_group).with('my_custom_fact').and_return(nil) allow(fact_groups).to receive(:get_fact_group).with('ext_file.txt').and_return(nil) allow(fact_groups).to receive(:get_group_ttls).with('ext_file.txt').and_return(nil) allow(fact_groups).to receive(:get_fact).with('ext_file.txt').and_return(nil) allow(fact_groups).to receive(:get_fact).with('my_custom_fact').and_return(nil) allow(File).to receive(:readable?).with(cache_file_name).and_return(true) allow(File).to receive(:mtime).with(cache_file_name).and_return(Time.now) allow(Facter::Util::FileHelper).to receive(:safe_read).with(cache_file_name).and_return(cached_core_fact) allow(Facter::Options).to receive(:[]).with(:cache).and_return(true) end it 'returns cached fact' do allow(fact_groups).to receive(:get_fact).with('os').and_return(os_fact) allow(File).to receive(:readable?).with(cache_file_name).and_return(true) allow(File).to receive(:readable?).with(File.join(cache_dir, 'ext_file.txt')).and_return(false) _, cached_facts = cache_manager.resolve_facts(searched_facts) expect(cached_facts).to be_an_instance_of(Array).and contain_exactly( an_instance_of(Facter::ResolvedFact).and(having_attributes(name: 'os', value: 'Ubuntu', type: :core)) ) end it 'returns searched fact' do allow(fact_groups).to receive(:get_fact).with('os').and_return(os_fact) allow(File).to receive(:readable?).with(cache_file_name).and_return(true) allow(File).to receive(:readable?).with(File.join(cache_dir, 'ext_file.txt')).and_return(false) sf, _cf = cache_manager.resolve_facts(searched_facts) expect(sf).to be_an_instance_of(Array).and contain_exactly( an_object_having_attributes(name: 'my_custom_fact', type: :custom), an_object_having_attributes(name: 'my_external_fact', type: :file) ) end it 'returns cached external facts' do allow(fact_groups).to receive(:get_fact).with('os').and_return(nil) allow(fact_groups).to receive(:get_fact).with('my_custom_fact').and_return(nil) allow(fact_groups).to receive(:get_fact).with('ext_file.txt').and_return(external_fact) allow(File).to receive(:readable?).with(cache_file_name).and_return(false) allow(Facter::Util::FileHelper).to receive(:safe_read).with(File.join(cache_dir, 'ext_file.txt')) .and_return(cached_external_fact) allow(File).to receive(:readable?).with(File.join(cache_dir, 'ext_file.txt')).and_return(true) allow(File).to receive(:mtime).with(File.join(cache_dir, 'ext_file.txt')).and_return(Time.now) _, cached_facts = cache_manager.resolve_facts(searched_facts) expect(cached_facts).to be_an_instance_of(Array).and contain_exactly( an_instance_of(Facter::ResolvedFact).and(having_attributes(name: 'my_external_fact', value: 'ext_fact', type: :file)) ) end context 'when file cannot be deleted because of access denied' do let(:cache_file) { File.join(cache_dir, 'ext_file.txt') } it 'logs warn if it cannot delete' do allow(fact_groups).to receive(:get_fact).with('ext_file.txt').and_return(external_fact) allow(File).to receive(:readable?).with(cache_file_name).and_return(false) allow(Facter::Util::FileHelper).to receive(:safe_read).with(cache_file) .and_return(cached_external_fact) allow(JSON).to receive(:parse).with(cached_external_fact).and_raise(JSON::ParserError) allow(File).to receive(:readable?).with(cache_file).and_return(true) allow(File).to receive(:mtime).with(File.join(cache_dir, 'ext_file.txt')).and_return(Time.now) allow(File).to receive(:delete).with(cache_file).and_raise(Errno::EACCES) cache_manager.resolve_facts([searched_external_fact]) expect(logger).to have_received(:warn) end end context 'when file cannot be deleted because of read-only filesystem' do let(:cache_file) { File.join(cache_dir, 'ext_file.txt') } it 'logs warn if it cannot delete' do allow(fact_groups).to receive(:get_fact).with('ext_file.txt').and_return(external_fact) allow(File).to receive(:readable?).with(cache_file_name).and_return(false) allow(Facter::Util::FileHelper).to receive(:safe_read).with(cache_file) .and_return(cached_external_fact) allow(JSON).to receive(:parse).with(cached_external_fact).and_raise(JSON::ParserError) allow(File).to receive(:readable?).with(cache_file).and_return(true) allow(File).to receive(:mtime).with(File.join(cache_dir, 'ext_file.txt')).and_return(Time.now) allow(File).to receive(:delete).with(cache_file).and_raise(Errno::EROFS) cache_manager.resolve_facts([searched_external_fact]) expect(logger).to have_received(:warn) end end end context 'with timer' do before do allow(File).to receive(:directory?).and_return(true) allow(fact_groups).to receive(:get_fact_group).and_return(group_name) allow(fact_groups).to receive(:get_group_ttls).and_return(nil) allow(fact_groups).to receive(:get_fact).and_return(nil) allow(File).to receive(:readable?) allow(File).to receive(:mtime).with(cache_file_name).and_return(Time.now) allow(Facter::Util::FileHelper).to receive(:safe_read).with(cache_file_name).and_return(cached_core_fact) allow(Facter::Options).to receive(:[]).with(:cache).and_return(true) allow(Facter::Framework::Benchmarking::Timer).to receive(:measure) end it 'returns cached external facts' do allow(fact_groups).to receive(:get_fact).with('os').and_return(nil) allow(fact_groups).to receive(:get_fact).with('my_custom_fact').and_return(nil) allow(fact_groups).to receive(:get_fact).with('ext_file.txt').and_return(external_fact) allow(Facter::Util::FileHelper).to receive(:safe_read).with(File.join(cache_dir, 'ext_file.txt')) .and_return(cached_external_fact) allow(File).to receive(:mtime).with(File.join(cache_dir, 'ext_file.txt')).and_return(Time.now) cache_manager.resolve_facts(searched_facts) expect(Facter::Framework::Benchmarking::Timer).to have_received(:measure) end end end describe '#cache_facts' do context 'with group not cached' do before do allow(File).to receive(:directory?).with(cache_dir).and_return(true) allow(File).to receive(:readable?).with(cache_file_name).and_return(false) allow(fact_groups).to receive(:get_fact).with('os').and_return(nil) allow(fact_groups).to receive(:get_fact_group).with('os').and_return(group_name) allow(File).to receive(:write).with(cache_file_name, cached_core_fact) allow(Facter::Options).to receive(:[]).with(:cache).and_return(true) end it 'returns without caching' do cache_manager.cache_facts(resolved_facts) expect(File).not_to have_received(:write).with(cache_file_name, cached_core_fact) end end context 'with cache group' do before do allow(File).to receive(:directory?).with(cache_dir).and_return(true) allow(fact_groups).to receive(:get_fact).with('os').and_return(os_fact) allow(fact_groups).to receive(:get_fact_group).with('os').and_return(group_name) allow(fact_groups).to receive(:get_fact_group).with('my_custom_fact').and_return(nil) allow(fact_groups).to receive(:get_fact_group).with('my_external_fact').and_return(nil) allow(File).to receive(:readable?).with(cache_file_name).and_return(false) allow(File).to receive(:write).with(cache_file_name, cached_core_fact) allow(Facter::Options).to receive(:[]).with(:cache).and_return(true) allow(Facter::Options).to receive(:[]).with(:ttls).and_return(['fact']) end it 'caches fact' do cache_manager.cache_facts(resolved_facts) expect(File).to have_received(:write).with(cache_file_name, cached_core_fact) end end end describe '#fact_cache_enabled?' do context 'with ttls' do before do allow(fact_groups).to receive(:get_fact).with('os').and_return(os_fact) allow(File).to receive(:readable?).with(cache_file_name).and_return(false) end it 'returns true' do result = cache_manager.fact_cache_enabled?('os') expect(result).to be true end end context 'without ttls' do before do allow(fact_groups).to receive(:get_fact).with('os').and_return(nil) allow(fact_groups).to receive(:get_fact_group).with('os').and_return(group_name) allow(Facter::Options).to receive(:[]).with(:cache).and_return(true) allow(File).to receive(:delete).with(cache_file_name) end it 'returns false' do allow(File).to receive(:readable?).with(cache_file_name).and_return(false) result = cache_manager.fact_cache_enabled?('os') expect(result).to be false end end end end puppetlabs-facter-dfe6df4/spec/facter/fact_filter_spec.rb000066400000000000000000000016761470204764400237600ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::FactFilter do describe '#filter_facts!' do context 'when legacy facts are blocked' do let(:fact_value) { 'value_1' } let(:resolved_fact) { Facter::ResolvedFact.new('my_fact', fact_value, :legacy) } before do allow(Facter::Options).to receive(:[]) allow(Facter::Options).to receive(:[]).with(:show_legacy).and_return(false) end it 'filters blocked legacy facts' do fact_filter_input = [resolved_fact] Facter::FactFilter.new.filter_facts!(fact_filter_input, []) expect(fact_filter_input).to eq([]) end context 'when user_query is provided' do it 'does not filter out the requested fact' do fact_filter_input = [resolved_fact] result = Facter::FactFilter.new.filter_facts!([resolved_fact], ['my_fact']) expect(result).to eql(fact_filter_input) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facter_spec.rb000066400000000000000000000562531470204764400227430ustar00rootroot00000000000000# frozen_string_literal: true describe Facter do let(:os_fact) do Facter::ResolvedFact.new('os.name', 'ubuntu', :core, 'os.name') end let(:missing_fact) do # NOTE: the type is the :nil symbol Facter::ResolvedFact.new('missing_fact', nil, :nil, 'missing_fact') end let(:hash_fact) do Facter::ResolvedFact.new('mountpoints', { '/boot' => { 'filesystem' => 'ext4', 'device' => 'dev1' }, '/' => { 'filesystem' => 'ext4', 'device' => 'dev2' } }, :core, 'mountpoints') end let(:config_reader_double) { class_spy(Facter::ConfigReader) } let(:logger) { Facter.send(:logger) } sorted_fact_hash = { 'mountpoints' => { '/' => { 'device' => 'dev2', 'filesystem' => 'ext4' }, '/boot' => { 'device' => 'dev1', 'filesystem' => 'ext4' } } } before do allow(Facter::ConfigReader).to receive(:init).and_return(config_reader_double) allow(config_reader_double).to receive(:cli).and_return(nil) allow(config_reader_double).to receive(:global).and_return(nil) allow(config_reader_double).to receive(:ttls).and_return([]) allow(config_reader_double).to receive(:block_list).and_return([]) allow(config_reader_double).to receive(:fact_groups).and_return({}) allow(Facter::Options).to receive(:[]).and_call_original allow(Facter::Options).to receive(:[]).with(:blocked_facts).and_return([]) allow(Facter::Options).to receive(:[]).with(:block_list).and_return([]) Facter.clear allow(Facter::SessionCache).to receive(:invalidate_all_caches) end def stub_facts(resolved_facts) allow(Facter::FactManager.instance).to receive(:resolve_facts).and_return(resolved_facts) end def stub_no_facts stub_facts([]) end def stub_one_fact(resolved_facts) allow(Facter::FactManager.instance).to receive(:resolve_fact).and_return([resolved_facts]) end def stub_no_fact allow(Facter::FactManager.instance).to receive(:resolve_fact).and_return([]) end describe '#resolve' do it 'returns hash object when API called' do stub_no_facts expect(Facter.resolve('')).to be_an_instance_of(Hash) end context 'when user query in arguments' do it 'returns a stable order hash' do stub_facts([hash_fact]) expect(Facter.resolve('mountpoints')).to eq(sorted_fact_hash) end end context 'when user query and options in arguments' do it 'returns one resolved fact' do stub_facts([os_fact]) expect(Facter.resolve('os.name --show-legacy')).to eq('os.name' => 'ubuntu') end end context 'when there is no user query' do let(:hash_fact_no_user_query) do Facter::ResolvedFact.new('mountpoints', { '/boot' => { 'filesystem' => 'ext4', 'device' => 'dev1' }, '/' => { 'filesystem' => 'ext4', 'device' => 'dev2' } }, :core, '') end it 'returns a stable order hash' do stub_facts([hash_fact_no_user_query]) expect(Facter.resolve('')).to eq(sorted_fact_hash) end end end describe '#to_hash' do it 'returns one resolved fact' do stub_facts([os_fact]) expect(Facter.to_hash).to eq('os' => { 'name' => 'ubuntu' }) end it 'return no resolved facts' do stub_no_facts expect(Facter.to_hash).to eq({}) end context 'when custom fact with nil value' do it 'discards the custom fact with nil value' do stub_facts([Facter::ResolvedFact.new('custom', nil, :custom, '')]) expect(Facter.to_hash).to eq({}) end end it 'returns a stable order hash' do stub_facts([hash_fact]) expect(Facter.to_hash).to eq(sorted_fact_hash) end end describe '#to_user_output' do it 'returns one fact with value and status 0' do user_query = ['os.name'] stub_facts([os_fact]) formatted_facts = Facter.to_user_output({}, [user_query]) expect(formatted_facts).to eq(['ubuntu', 0]) end it 'returns one fact with value, one without and status 0' do user_query = ['os.name', 'missing_fact'] stub_facts([os_fact, missing_fact]) formated_facts = Facter.to_user_output({ json: true }, *user_query) expect(JSON.parse(formated_facts[0])).to eq('missing_fact' => nil, 'os.name' => 'ubuntu') expect(formated_facts[1]).to eq(0) end context 'when provided with --strict option' do it 'returns one fact with value, one without and status 1' do user_query = ['os.name', 'missing_fact'] stub_facts([os_fact, missing_fact]) allow(Facter::Options).to receive(:[]).with(:strict).and_return(true) formatted_facts = Facter.to_user_output({ json: true }, *user_query) expect(JSON.parse(formatted_facts[0])).to eq('missing_fact' => nil, 'os.name' => 'ubuntu') expect(formatted_facts[1]).to eq(1) end it 'returns one fact and status 0' do user_query = 'os.name' stub_facts([os_fact]) allow(Facter::Options).to receive(:[]).with(anything) allow(Facter::Options).to receive(:[]).with(:block_list).and_return([]) allow(Facter::Options).to receive(:[]).with(:strict).and_return(true) formated_facts = Facter.to_user_output({ json: true }, user_query) expect(JSON.parse(formated_facts[0])).to eq('os.name' => 'ubuntu') expect(formated_facts[1]).to eq(0) end end context 'when custom fact with nil value' do it 'discards the custom fact with nil value if user query is empty' do user_query = '' os_fact = Facter::ResolvedFact.new('os.name', 'ubuntu', :core, user_query) custom_fact = Facter::ResolvedFact.new('custom', nil, :custom, user_query) stub_facts([os_fact, custom_fact]) formated_facts = Facter.to_user_output({ json: true }, user_query) expect(JSON.parse(formated_facts[0])).to eq('os' => { 'name' => 'ubuntu' }) expect(formated_facts[1]).to eq(0) end it 'includes the custom fact with nil value if user query is not empty' do user_query = %w[os custom] os_fact = Facter::ResolvedFact.new('os.name', 'ubuntu', :core, 'os') custom_fact = Facter::ResolvedFact.new('custom', nil, :custom, 'custom') stub_facts([os_fact, custom_fact]) formated_facts = Facter.to_user_output({ json: true }, *user_query) expect(JSON.parse(formated_facts[0])).to eq('custom' => nil, 'os' => { 'name' => 'ubuntu' }) expect(formated_facts[1]).to eq(0) end end context 'when no facts are returned' do it 'does not raise exceptions' do stub_facts([]) expect { Facter.to_user_output({ json: true }, '') }.not_to raise_error end end end describe '#value' do it 'downcases the user query' do stub_one_fact(os_fact) expect(Facter.value('OS.NAME')).to eq('ubuntu') end it 'returns a value' do stub_one_fact(os_fact) expect(Facter.value('os.name')).to eq('ubuntu') end it 'resolves facts once' do expect(Facter::FactManager.instance).to receive(:resolve_fact).with('os.name').once.and_return([os_fact]) Facter.value('os.name') Facter.value('os.name') end it 'returns nil' do stub_no_fact expect(Facter.value('os.name')).to be nil end context 'when fact value is false' do it 'resolves facts once' do boolean_fact = Facter::ResolvedFact.new('boolean', false, :core, '') expect(Facter::FactManager.instance).to receive(:resolve_fact).with('boolean').once.and_return([boolean_fact]) Facter.value('boolean') Facter.value('boolean') end end context 'when custom fact with nil value' do it 'returns the custom fact' do stub_one_fact(Facter::ResolvedFact.new('nil_fact', nil, :custom, '')) expect(Facter.value('nil_fact')).to eq(nil) end end end describe '#fact' do it 'downcases the user query' do stub_one_fact(os_fact) expect(Facter.fact('OS.NAME')).to be_instance_of(Facter::ResolvedFact).and have_attributes(value: 'ubuntu') end it 'returns a fact' do stub_one_fact(os_fact) expect(Facter.fact('os.name')).to be_instance_of(Facter::ResolvedFact).and have_attributes(value: 'ubuntu') end it 'can be interpolated' do stub_one_fact(os_fact) expect("#{Facter.fact('os.name')}-test").to eq('ubuntu-test') end it 'returns nil' do stub_no_fact expect(Facter.fact('os.name')).to be_nil end context 'when there is a resolved fact with type :nil' do it 'returns nil' do stub_one_fact(missing_fact) expect(Facter.fact('missing_fact')).to be_nil end end context 'when custom fact with nil value' do it 'returns the custom fact' do custom_fact = Facter::ResolvedFact.new('custom', 'yes', :custom, '') stub_one_fact(custom_fact) expect(Facter.fact('custom')) .to be_instance_of(Facter::ResolvedFact) .and have_attributes(value: 'yes') end end end describe '#[]' do it 'returns a fact' do stub_one_fact(os_fact) expect(Facter['os.name']).to be_instance_of(Facter::ResolvedFact).and(having_attributes(value: 'ubuntu')) end it 'return nil' do stub_no_fact expect(Facter['os.name']).to be_nil end context 'when custom fact with nil value' do it 'returns the custom fact' do stub_one_fact(Facter::ResolvedFact.new('custom', 'yes', :custom, '')) expect(Facter['custom']) .to be_instance_of(Facter::ResolvedFact) .and have_attributes(value: 'yes') end end end describe '#core_value' do it 'searched in core facts and returns a value' do allow(Facter::FactManager.instance).to receive(:resolve_core).with(['os.name']).and_return([os_fact]) expect(Facter.core_value('os.name')).to eq('ubuntu') end it 'searches os core fact and returns nil' do allow(Facter::FactManager.instance).to receive(:resolve_core).with(['os.name']).and_return([]) expect(Facter.core_value('os.name')).to be nil end end describe 'LegacyFacter methods' do before do allow(LegacyFacter).to receive(:clear) end describe '#clear' do it 'sends call to LegacyFacter' do Facter.clear expect(LegacyFacter).to have_received(:clear).once end end describe '#flush' do it 'sends call to LegacyFacter' do allow(LegacyFacter).to receive(:flush) Facter.flush expect(LegacyFacter).to have_received(:flush).once end it 'invalidates core cache' do allow(Facter::SessionCache).to receive(:invalidate_all_caches) Facter.flush expect(Facter::SessionCache).to have_received(:invalidate_all_caches) end end describe '#load_external' do before do allow(Facter::Options).to receive(:[]=) end it 'sends call to Facter::Options' do allow(Facter::Options).to receive(:[]=) Facter.load_external(true) expect(Facter::Options).to have_received(:[]=).with(:no_external_facts, false) end it 'logs a debug message' do expect(logger).to receive(:debug).with('Facter.load_external(true) called. External facts will be loaded') Facter.load_external(true) end end describe '#search' do it 'sends call to Facter::Options' do allow(Facter::Options).to receive(:[]=) dirs = ['/dir1', '/dir2'] Facter.search(*dirs) expect(Facter::Options).to have_received(:[]=).with(:custom_dir, dirs) end end describe '#search_path' do it 'sends call to Facter::Options' do allow(Facter::Options).to receive(:custom_dir) Facter.search_path expect(Facter::Options).to have_received(:custom_dir).once end end describe '#search_external' do it 'sends call to Facter::Options' do allow(Facter::Options).to receive(:[]=) dirs = ['/dir1', '/dir2'] Facter.search_external(dirs) expect(Facter::Options).to have_received(:[]=).with(:external_dir, dirs) end end describe '#search_external_path' do it 'sends call to Facter::Options' do allow(Facter::Options).to receive(:external_dir) Facter.search_external_path expect(Facter::Options).to have_received(:external_dir).once end end describe '#reset' do it 'sends call to LegacyFacter' do allow(LegacyFacter).to receive(:reset) Facter.reset expect(LegacyFacter).to have_received(:reset).once end it 'adds custom facts dirs' do allow(Facter::Options).to receive(:[]=) Facter.reset expect(Facter::Options).to have_received(:[]=).with(:custom_dir, []) end it 'add external facts dirs' do allow(Facter::Options).to receive(:[]=) Facter.reset expect(Facter::Options).to have_received(:[]=).with(:external_dir, []) end end end describe '#define_fact' do it 'sends call to LegacyFacter' do allow(LegacyFacter).to receive(:define_fact) Facter.define_fact('fact_name') {} expect(LegacyFacter).to have_received(:define_fact).once.with('fact_name', { fact_type: :custom }) end end describe '#loadfacts' do it 'sends calls to LegacyFacter' do allow(LegacyFacter).to receive(:loadfacts) Facter.loadfacts expect(LegacyFacter).to have_received(:loadfacts).once end it 'returns nil' do allow(LegacyFacter).to receive(:loadfacts) expect(Facter.loadfacts).to be_nil end end describe '#trace?' do it 'returns trace variable' do expect(Facter).not_to be_trace end end describe '#trace' do after do Facter.trace(false) end it 'trace variable is true' do expect(Facter.trace(true)).to be_truthy end end describe '#debug' do let(:message) { 'test' } before do allow(Facter::Options).to receive(:[]).with(:debug).and_return(is_debug) end context 'when log level is debug' do let(:is_debug) { true } it 'logs a debug message' do allow(logger).to receive(:debug).with('test') expect(Facter.debug(message)).to be(nil) end end context 'when log level is not debug' do let(:is_debug) { false } it "doesn't log anything" do expect(logger).not_to receive(:debug).with(message) Facter.debug(message) end end end describe '#debugging' do it 'sets log level to debug' do allow(Facter::Options).to receive(:[]=) Facter.debugging(true) expect(Facter::Options).to have_received(:[]=).with(:debug, true) end end describe '#debugging?' do it 'returns that log_level is not debug' do Facter.debugging? expect(Facter::Options).to have_received(:[]).with(:debug) end end describe '#log_exception' do shared_examples 'when exception param is an exception' do it 'logs exception message' do exception.set_backtrace(backtrace) expect(logger).to receive(:error).with(expected_message) Facter.log_exception(exception, message) end end shared_examples 'when exception param is not an exception' do it 'logs exception message' do expect(logger).to receive(:error).with(expected_message) Facter.log_exception(exception, message) end end context 'when trace option is false' do let(:backtrace) { 'prog.rb:2:in a' } context 'when we have an exception and a message' do let(:message) { 'Some error message' } let(:exception) { FlushFakeError.new } let(:expected_message) { 'Some error message' } it_behaves_like 'when exception param is an exception' end context 'when we have an exception and an empty message' do let(:message) { '' } let(:exception) { FlushFakeError.new } let(:expected_message) { 'FlushFakeError' } it_behaves_like 'when exception param is an exception' end context 'when we have an exception and a nil message' do let(:message) { nil } let(:exception) { FlushFakeError.new } let(:expected_message) { 'FlushFakeError' } it_behaves_like 'when exception param is an exception' end context 'when we have an exception and no message' do let(:exception) { FlushFakeError.new } let(:expected_message) { 'FlushFakeError' } it 'logs exception message' do exception.set_backtrace(backtrace) expect(logger).to receive(:error).with(expected_message) Facter.log_exception(exception) end end context 'when exception and message are strings' do let(:message) { 'message' } let(:exception) { 'exception' } let(:expected_message) { 'message' } it_behaves_like 'when exception param is not an exception' end context 'when exception and message are nil' do let(:message) { nil } let(:exception) { nil } let(:expected_message) { '' } it_behaves_like 'when exception param is not an exception' end context 'when exception and message are hashes' do let(:message) { { 'a': 1 } } let(:exception) { { 'b': 2 } } let(:expected_message) { '{:a=>1}' } it_behaves_like 'when exception param is not an exception' end end context 'when trace options is true' do before do Facter.trace(true) end after do Facter.trace(false) end let(:backtrace) { 'prog.rb:2:in a' } context 'when we have an exception and a message' do let(:message) { 'Some error message' } let(:exception) { FlushFakeError.new } let(:expected_message) { "Some error message\nbacktrace:\nprog.rb:2:in a" } it_behaves_like 'when exception param is an exception' end context 'when we have an exception and an empty message' do let(:message) { '' } let(:exception) { FlushFakeError.new } let(:expected_message) { "FlushFakeError\nbacktrace:\nprog.rb:2:in a" } it_behaves_like 'when exception param is an exception' end context 'when we have an exception and a nil message' do let(:message) { nil } let(:exception) { FlushFakeError.new } let(:expected_message) { "FlushFakeError\nbacktrace:\nprog.rb:2:in a" } it_behaves_like 'when exception param is an exception' end context 'when we have an exception and no message' do let(:exception) { FlushFakeError.new } let(:expected_message) { "FlushFakeError\nbacktrace:\nprog.rb:2:in a" } it 'logs exception message' do exception.set_backtrace(backtrace) expect(logger).to receive(:error).with(expected_message) Facter.log_exception(exception) end end context 'when we have an exception with no backtrace' do let(:exception) { FlushFakeError.new } let(:expected_message) { 'FlushFakeError' } it 'logs exception message' do expect(logger).to receive(:error).with(expected_message) Facter.log_exception(exception) end end context 'when exception and message are strings' do let(:message) { 'message' } let(:exception) { 'exception' } let(:expected_message) { 'message' } it_behaves_like 'when exception param is not an exception' end context 'when exception and message are nil' do let(:message) { nil } let(:exception) { nil } let(:expected_message) { '' } it_behaves_like 'when exception param is not an exception' end context 'when exception and message are hashes' do let(:message) { { 'a': 1 } } let(:exception) { { 'b': 2 } } let(:expected_message) { '{:a=>1}' } it_behaves_like 'when exception param is not an exception' end end end describe '#debugonce' do context 'when debugging is active' do before do allow(logger).to receive(:debug) allow(Facter::Log).to receive(:level=).with(:debug) Facter.debugging(true) end after do allow(Facter::Log).to receive(:level=).with(:warn) Facter.debugging(false) end it 'calls logger with the debug message' do message = 'Some error message' expect(logger).to receive(:debugonce).with(message) Facter.debugonce(message) end it 'writes empty message when message is nil' do expect(logger).to receive(:debugonce).with(nil) Facter.debugonce(nil) end it 'when message is a hash' do expect(logger).to receive(:debugonce).with({ warn: 'message' }) Facter.debugonce({ warn: 'message' }) end it 'returns nil' do result = Facter.debugonce({ warn: 'message' }) expect(result).to be_nil end end context 'when debugging is inactive' do before do allow(logger).to receive(:debug) end it 'does not call the logger' do expect(logger).not_to receive(:debug) Facter.debugonce('message') end end end describe '#list' do before do allow(Facter).to receive(:to_hash).and_return({ 'up_time' => 235, 'timezone' => 'EEST', 'virtual' => 'physical' }) end it 'sorts the resolved fact names' do result = Facter.list expect(result).to eq(%w[timezone up_time virtual]) end end describe '#warnonce' do before do allow(logger).to receive(:warn) end it 'calls logger with the warning message' do message = 'Some error message' expect(logger).to receive(:warnonce).with(message) Facter.warnonce(message) end it 'writes empty message when message is nil' do expect(logger).to receive(:warnonce).with(nil) Facter.warnonce(nil) end it 'when message is a hash' do expect(logger).to receive(:warnonce).with({ warn: 'message' }) Facter.warnonce({ warn: 'message' }) end it 'returns nil' do result = Facter.warnonce({ warn: 'message' }) expect(result).to be_nil end end describe '#warn' do it 'calls logger' do message = 'Some error message' expect(logger).to receive(:warn).with(message) Facter.warn(message) end it 'when message is nil' do expect(logger).to receive(:warn).with('') Facter.warn(nil) end it 'when message is empty string' do expect(logger).to receive(:warn).with('') Facter.warn('') end it 'when message is a hash' do expect(logger).to receive(:warn).with('{:warn=>"message"}') Facter.warn({ warn: 'message' }) end it 'when message is an array' do expect(logger).to receive(:warn).with('[1, 2, 3]') Facter.warn([1, 2, 3]) end it 'returns nil' do result = Facter.warn('message') expect(result).to be_nil end end describe '#each' do it 'enumerates no facts' do stub_facts([]) expect(Facter.enum_for(:each).to_h).to eq({}) end it 'enumerates one fact' do stub_facts([os_fact]) expect(Facter.enum_for(:each).to_h).to eq('os.name' => 'ubuntu') end end end puppetlabs-facter-dfe6df4/spec/facter/facts/000077500000000000000000000000001470204764400212255ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/aix/000077500000000000000000000000001470204764400220065ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/aix/aio_agent_version_spec.rb000066400000000000000000000010321470204764400270340ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::AioAgentVersion do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::AioAgentVersion.new } let(:value) { '1.2.3' } before do allow(Facter::Resolvers::AioAgentVersion).to receive(:resolve).with(:aio_agent_version).and_return(value) end it 'returns aio_agent_version fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'aio_agent_version', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/augeas/000077500000000000000000000000001470204764400232535ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/aix/augeas/version_spec.rb000066400000000000000000000012161470204764400262770ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Augeas::Version do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Augeas::Version.new } let(:version) { '1.12.0' } before do allow(Facter::Resolvers::Augeas).to \ receive(:resolve).with(:augeas_version).and_return(version) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'augeas.version', value: version), an_object_having_attributes(name: 'augeasversion', value: version, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/disks_spec.rb000066400000000000000000000030341470204764400244620ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Disks do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Disks.new } let(:disk) do { 'hdisk0' => { size: '20.00 GiB', size_bytes: 21_474_836_480 } } end let(:expecte_response) do { 'hdisk0' => { 'size' => '20.00 GiB', 'size_bytes' => 21_474_836_480 } } end before do allow(Facter::Resolvers::Aix::Disks).to receive(:resolve).with(:disks).and_return(disk) end it 'returns resolved fact with name disk and value' do expect(fact.call_the_resolver) .to be_an_instance_of(Array) .and contain_exactly( an_object_having_attributes(name: 'disks', value: expecte_response), an_object_having_attributes(name: 'blockdevices', value: 'hdisk0'), an_object_having_attributes(name: 'blockdevice_hdisk0_size', value: 21_474_836_480, type: :legacy) ) end context 'when resolver returns empty hash' do let(:disk) { {} } it 'returns nil fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'disks', value: nil) end end context 'when resolver returns nil' do let(:disk) { nil } it 'returns nil fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'disks', value: nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/facterversion_spec.rb000066400000000000000000000010101470204764400262070ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Facterversion do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Facterversion.new } let(:value) { '4.0.3' } before do allow(Facter::Resolvers::Facterversion).to receive(:resolve).with(:facterversion).and_return(value) end it 'returns facterversion fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'facterversion', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/filesystems_spec.rb000066400000000000000000000010261470204764400257130ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Filesystems do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Filesystems.new } let(:files) { 'apfs,autofs,devfs' } before do allow(Facter::Resolvers::Aix::Filesystem).to \ receive(:resolve).with(:file_systems).and_return(files) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'filesystems', value: files) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/hypervisors/000077500000000000000000000000001470204764400244035ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/aix/hypervisors/lpar_spec.rb000066400000000000000000000015131470204764400267000ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Hypervisors::Lpar do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Hypervisors::Lpar.new } let(:value) { { 'partition_number' => 13, 'partition_name' => 'aix6-7' } } before do allow(Facter::Resolvers::Lpar).to receive(:resolve).with(:lpar_partition_number) .and_return(value['partition_number']) allow(Facter::Resolvers::Lpar).to receive(:resolve).with(:lpar_partition_name) .and_return(value['partition_name']) end it 'returns a hypervisors.lpar fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.lpar', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/hypervisors/wpar_spec.rb000066400000000000000000000012471470204764400267170ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Hypervisors::Wpar do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Hypervisors::Wpar.new } let(:value) { { 'key' => 13, 'configured_id' => 14 } } before do allow(Facter::Resolvers::Wpar).to receive(:resolve).with(:wpar_key).and_return(value['key']) allow(Facter::Resolvers::Wpar).to receive(:resolve).with(:wpar_configured_id).and_return(value['configured_id']) end it 'returns a hypervisors.wpar fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.wpar', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/identity/000077500000000000000000000000001470204764400236375ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/aix/identity/gid_spec.rb000066400000000000000000000007701470204764400257450ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Identity::Gid do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Identity::Gid.new } let(:value) { '20' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:gid).and_return(value) end it 'returns identity gid fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'identity.gid', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/identity/group_spec.rb000066400000000000000000000011621470204764400263320ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Identity::Group do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Identity::Group.new } let(:value) { 'staff' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:group).and_return(value) end it 'returns identity group fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'identity.group', value: value), an_object_having_attributes(name: 'gid', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/identity/privileged_spec.rb000066400000000000000000000010361470204764400273300ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Identity::Privileged do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Identity::Privileged.new } let(:value) { 'false' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:privileged).and_return(value) end it 'returns identity privileged fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'identity.privileged', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/identity/uid_spec.rb000066400000000000000000000007711470204764400257640ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Identity::Uid do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Identity::Uid.new } let(:value) { '501' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:uid).and_return(value) end it 'returns identity uid fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'identity.uid', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/identity/user_spec.rb000066400000000000000000000011621470204764400261540ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Identity::User do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Identity::User.new } let(:value) { 'root' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:user).and_return(value) end it 'returns id and identity user fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'identity.user', value: value), an_object_having_attributes(name: 'id', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/interfaces_spec.rb000066400000000000000000000016441470204764400254750ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Interfaces do subject(:fact) { Facts::Aix::Interfaces.new } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { ip6: 'fe80::99bf:da20:ad3:9bfe' }, 'en1' => { ip6: 'fe80::99bf:da20:ad3:9bfe' } } } it 'returns interfaces names' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'interfaces', value: interfaces.keys.sort.join(','), type: :legacy) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'interfaces', value: interfaces, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/ipaddress6_interfaces_spec.rb000066400000000000000000000021751470204764400276210ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Ipaddress6Interfaces do subject(:fact) { Facts::Aix::Ipaddress6Interfaces.new } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { ip6: 'fe80::99bf:da20:ad3:9bfe' }, 'en1' => { ip6: 'fe80::99bf:da20:ad3:9bfe' } } } it 'returns legacy facts with names ipaddress6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ipaddress6_eth0', value: interfaces['eth0'][:ip6], type: :legacy), an_object_having_attributes(name: 'ipaddress6_en1', value: interfaces['en1'][:ip6], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/ipaddress_interfaces_spec.rb000066400000000000000000000021361470204764400275300ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::IpaddressInterfaces do subject(:fact) { Facts::Aix::IpaddressInterfaces.new } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { ip: '10.16.117.100' }, 'en1' => { ip: '10.16.117.255' } } } it 'returns legacy facts with names ipaddress_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ipaddress_eth0', value: interfaces['eth0'][:ip], type: :legacy), an_object_having_attributes(name: 'ipaddress_en1', value: interfaces['en1'][:ip], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/kernel_spec.rb000066400000000000000000000007421470204764400246300ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Kernel do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Kernel.new } let(:value) { 'AIX' } before do allow(Facter::Resolvers::Aix::OsLevel).to receive(:resolve).with(:kernel).and_return(value) end it 'returns kernel fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernel', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/kernelmajversion_spec.rb000066400000000000000000000011141470204764400267200ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Kernelmajversion do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Kernelmajversion.new } let(:fact_value) { '6100' } let(:resolver_value) { '6100-09-00-0000' } before do allow(Facter::Resolvers::Aix::OsLevel).to receive(:resolve).with(:build).and_return(resolver_value) end it 'returns kernelmajversion fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernelmajversion', value: fact_value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/kernelrelease_spec.rb000066400000000000000000000010111470204764400261570ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Kernelrelease do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Kernelrelease.new } let(:value) { '6100-09-00-0000' } before do allow(Facter::Resolvers::Aix::OsLevel).to receive(:resolve).with(:build).and_return(value) end it 'returns kernelrelease fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernelrelease', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/kernelversion_spec.rb000066400000000000000000000011001470204764400262230ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Kernelversion do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Kernelversion.new } let(:resolver_value) { '6100-09-00-0000' } let(:fact_value) { '6100' } before do allow(Facter::Resolvers::Aix::OsLevel).to receive(:resolve).with(:build).and_return(resolver_value) end it 'returns kernelversion fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernelversion', value: fact_value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/load_averages_spec.rb000066400000000000000000000010601470204764400261360ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::LoadAverages do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::LoadAverages.new } let(:value) { { '1m' => 0.01, '5m' => 0.02, '15m' => 0.03 } } before do allow(Facter::Resolvers::Aix::LoadAverages).to receive(:resolve).with(:load_averages).and_return(value) end it 'returns load_averages fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'load_averages', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/macaddress_interfaces_spec.rb000066400000000000000000000021471470204764400276620ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::MacaddressInterfaces do subject(:fact) { Facts::Aix::MacaddressInterfaces.new } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { mac: '10.16.117.100' }, 'en1' => { mac: '10.16.117.255' } } } it 'returns legacy facts with names macaddress_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'macaddress_eth0', value: interfaces['eth0'][:mac], type: :legacy), an_object_having_attributes(name: 'macaddress_en1', value: interfaces['en1'][:mac], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/memory/000077500000000000000000000000001470204764400233165ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/aix/memory/swap/000077500000000000000000000000001470204764400242705ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/aix/memory/swap/available_bytes_spec.rb000066400000000000000000000033141470204764400307560ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Memory::Swap::AvailableBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Memory::Swap::AvailableBytes.new } let(:value) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:result) { 2_332_425 } let(:value_mb) { 2.2243738174438477 } before do allow(Facter::Resolvers::Aix::Memory).to \ receive(:resolve).with(:swap).and_return(value) end it 'returns swap available bytes fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.available_bytes', value: result), an_object_having_attributes(name: 'swapfree_mb', value: value_mb, type: :legacy)) end context 'when resolver returns nil' do let(:value) { nil } it 'returns swap available memory in bytes fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.available_bytes', value: value), an_object_having_attributes(name: 'swapfree_mb', value: value, type: :legacy)) end end context 'when resolver returns empty hash' do let(:value) { {} } let(:result) { nil } it 'returns swap available memory in bytes fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.available_bytes', value: result), an_object_having_attributes(name: 'swapfree_mb', value: result, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/memory/swap/available_spec.rb000066400000000000000000000014001470204764400275420ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Memory::Swap::Available do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Memory::Swap::Available.new } let(:value) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:result) { '2.22 MiB' } before do allow(Facter::Resolvers::Aix::Memory).to \ receive(:resolve).with(:swap).and_return(value) end it 'returns swap available memory fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.available', value: result), an_object_having_attributes(name: 'swapfree', value: result, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/memory/swap/capacity_spec.rb000066400000000000000000000012271470204764400274260ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Memory::Swap::Capacity do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Memory::Swap::Capacity.new } let(:value) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024, capacity: '7,9%' } } let(:result) { '7,9%' } before do allow(Facter::Resolvers::Aix::Memory).to \ receive(:resolve).with(:swap).and_return(value) end it 'returns swap memory capacity fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.swap.capacity', value: result) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/memory/swap/total_bytes_spec.rb000066400000000000000000000023441470204764400301630ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Memory::Swap::TotalBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Memory::Swap::TotalBytes.new } let(:value) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:result) { 2_332_999 } let(:value_mb) { 2.224921226501465 } before do allow(Facter::Resolvers::Aix::Memory).to \ receive(:resolve).with(:swap).and_return(value) end it 'returns swap total memory in bytes fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.total_bytes', value: result), an_object_having_attributes(name: 'swapsize_mb', value: value_mb, type: :legacy)) end context 'when resolver returns nil' do let(:value) { nil } it 'returns swap total memory in bytes fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.total_bytes', value: value), an_object_having_attributes(name: 'swapsize_mb', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/memory/swap/total_spec.rb000066400000000000000000000013441470204764400267540ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Memory::Swap::Total do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Memory::Swap::Total.new } let(:value) { { available_bytes: 24, total_bytes: 1024, used_bytes: 1000 } } let(:result) { '1.00 KiB' } before do allow(Facter::Resolvers::Aix::Memory).to \ receive(:resolve).with(:swap).and_return(value) end it 'returns swap total memory fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.total', value: result), an_object_having_attributes(name: 'swapsize', value: result, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/memory/swap/used_bytes_spec.rb000066400000000000000000000012141470204764400277730ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Memory::Swap::UsedBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Memory::Swap::UsedBytes.new } let(:value) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:result) { 1024 } before do allow(Facter::Resolvers::Aix::Memory).to \ receive(:resolve).with(:swap).and_return(value) end it 'returns swap used memory in bytes fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.swap.used_bytes', value: result) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/memory/swap/used_spec.rb000066400000000000000000000012111470204764400265620ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Memory::Swap::Used do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Memory::Swap::Used.new } let(:resolver_value) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:value) { '1.00 KiB' } before do allow(Facter::Resolvers::Aix::Memory).to \ receive(:resolve).with(:swap).and_return(resolver_value) end it 'returns swap used memory fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.swap.used', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/memory/system/000077500000000000000000000000001470204764400246425ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/aix/memory/system/available_bytes_spec.rb000066400000000000000000000025051470204764400313310ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Memory::System::AvailableBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Memory::System::AvailableBytes.new } let(:resolver_output) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:value) { 2_332_425 } let(:value_mb) { 2.2243738174438477 } before do allow(Facter::Resolvers::Aix::Memory).to \ receive(:resolve).with(:system).and_return(resolver_output) end it 'returns system available memory in bytes fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.available_bytes', value: value), an_object_having_attributes(name: 'memoryfree_mb', value: value_mb, type: :legacy)) end context 'when resolver returns nil' do let(:value) { nil } let(:resolver_output) { nil } it 'returns system available memory in bytes fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.available_bytes', value: value), an_object_having_attributes(name: 'memoryfree_mb', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/memory/system/available_spec.rb000066400000000000000000000014331470204764400301220ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Memory::System::Available do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Memory::System::Available.new } let(:resolver_value) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:value) { '2.22 MiB' } before do allow(Facter::Resolvers::Aix::Memory).to \ receive(:resolve).with(:system).and_return(resolver_value) end it 'returns system available memory fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.available', value: value), an_object_having_attributes(name: 'memoryfree', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/memory/system/capacity_spec.rb000066400000000000000000000012631470204764400300000ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Memory::System::Capacity do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Memory::System::Capacity.new } let(:resolver_output) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024, capacity: '5.3%' } } let(:value) { '5.3%' } before do allow(Facter::Resolvers::Aix::Memory).to \ receive(:resolve).with(:system).and_return(resolver_output) end it 'returns system memory capacity fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.system.capacity', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/memory/system/total_bytes_spec.rb000066400000000000000000000024541470204764400305370ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Memory::System::TotalBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Memory::System::TotalBytes.new } let(:resolver_output) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:value) { 2_332_999 } let(:value_mb) { 2.224921226501465 } before do allow(Facter::Resolvers::Aix::Memory).to \ receive(:resolve).with(:system).and_return(resolver_output) end it 'returns system total memory in bytes fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.total_bytes', value: value), an_object_having_attributes(name: 'memorysize_mb', value: value_mb, type: :legacy)) end context 'when resolver returns nil' do let(:value) { nil } let(:resolver_output) { nil } it 'returns system total memory in bytes fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.total_bytes', value: value), an_object_having_attributes(name: 'memorysize_mb', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/memory/system/total_spec.rb000066400000000000000000000014131470204764400273230ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Memory::System::Total do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Memory::System::Total.new } let(:resolver_value) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:value) { '2.22 MiB' } before do allow(Facter::Resolvers::Aix::Memory).to \ receive(:resolve).with(:system).and_return(resolver_value) end it 'returns system total memory fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.total', value: value), an_object_having_attributes(name: 'memorysize', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/memory/system/used_bytes_spec.rb000066400000000000000000000012501470204764400303450ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Memory::System::UsedBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Memory::System::UsedBytes.new } let(:resolver_output) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:value) { 1024 } before do allow(Facter::Resolvers::Aix::Memory).to \ receive(:resolve).with(:system).and_return(resolver_output) end it 'returns system used memory in bytes fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.system.used_bytes', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/memory/system/used_spec.rb000066400000000000000000000012231470204764400271370ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Memory::System::Used do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Memory::System::Used.new } let(:resolver_value) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:value) { '1.00 KiB' } before do allow(Facter::Resolvers::Aix::Memory).to \ receive(:resolve).with(:system).and_return(resolver_value) end it 'returns system used memory fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.system.used', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/mountpoints_spec.rb000066400000000000000000000015511470204764400257460ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Mountpoints do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Mountpoints.new } let(:result) do { '/' => { 'device' => '/dev/hd4', 'filesystem' => 'jfs2', 'options' => ['rw', 'log=/dev/hd8'], 'capacity' => '18.61%', 'available_bytes' => 1_747_865_600, 'used_bytes' => 399_618_048, 'size_bytes' => 2_147_483_648, 'available' => '1.63 GiB', 'used' => '381.11 MiB', 'size' => '2.00 GiB' } } end before do allow(Facter::Resolvers::Aix::Mountpoints).to \ receive(:resolve).with(:mountpoints).and_return(result) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'mountpoints', value: result) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/mtu_interfaces_spec.rb000066400000000000000000000017061470204764400263610ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::MtuInterfaces do subject(:fact) { Facts::Aix::MtuInterfaces.new } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { mtu: 1500 }, 'en1' => { mtu: 1500 } } } it 'returns legacy facts with names mtu_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'mtu_eth0', value: interfaces['eth0'][:mtu], type: :legacy), an_object_having_attributes(name: 'mtu_en1', value: interfaces['en1'][:mtu], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/netmask6_interfaces_spec.rb000066400000000000000000000022331470204764400273000ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Netmask6Interfaces do subject(:fact) { Facts::Aix::Netmask6Interfaces.new } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) do { 'eth0' => { netmask6: 'fe80::99bf:da20:ad3:9bfe' }, 'en1' => { netmask6: 'fe80::99bf:da20:ad3:9bfe' } } end it 'returns legacy facts with names netmask6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'netmask6_eth0', value: interfaces['eth0'][:netmask6], type: :legacy), an_object_having_attributes(name: 'netmask6_en1', value: interfaces['en1'][:netmask6], type: :legacy)) end end describe '#call_the_resolver when resolver return nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/netmask_interfaces_spec.rb000066400000000000000000000021511470204764400272110ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::NetmaskInterfaces do subject(:fact) { Facts::Aix::NetmaskInterfaces.new } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { netmask: '10.255.255.255' }, 'en1' => { netmask: '10.17.255.255' } } } it 'returns legacy facts with names netmask_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'netmask_eth0', value: interfaces['eth0'][:netmask], type: :legacy), an_object_having_attributes(name: 'netmask_en1', value: interfaces['en1'][:netmask], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/network6_interfaces_spec.rb000066400000000000000000000021401470204764400273240ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Network6Interfaces do subject(:fact) { Facts::Aix::Network6Interfaces.new } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { network6: '::1' }, 'en1' => { network6: 'fe80::' } } } it 'returns legacy facts with names network6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'network6_eth0', value: interfaces['eth0'][:network6], type: :legacy), an_object_having_attributes(name: 'network6_en1', value: interfaces['en1'][:network6], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/network_interfaces_spec.rb000066400000000000000000000021511470204764400272400ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::NetworkInterfaces do subject(:fact) { Facts::Aix::NetworkInterfaces.new } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { network: '10.255.255.255' }, 'en1' => { network: '10.17.255.255' } } } it 'returns legacy facts with names network_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'network_eth0', value: interfaces['eth0'][:network], type: :legacy), an_object_having_attributes(name: 'network_en1', value: interfaces['en1'][:network], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/networking/000077500000000000000000000000001470204764400241755ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/aix/networking/domain_spec.rb000066400000000000000000000011641470204764400270050ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Networking::Domain do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Networking::Domain.new } let(:value) { 'domain' } before do allow(Facter::Resolvers::Hostname).to receive(:resolve).with(:domain).and_return(value) end it 'returns domain fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.domain', value: value), an_object_having_attributes(name: 'domain', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/networking/fqdn_spec.rb000066400000000000000000000011551470204764400264660ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Networking::Fqdn do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Networking::Fqdn.new } let(:value) { 'host.domain' } before do allow(Facter::Resolvers::Hostname).to receive(:resolve).with(:fqdn).and_return(value) end it 'returns fqdn fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.fqdn', value: value), an_object_having_attributes(name: 'fqdn', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/networking/hostname_spec.rb000066400000000000000000000011761470204764400273570ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Networking::Hostname do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Networking::Hostname.new } let(:value) { 'host' } before do allow(Facter::Resolvers::Hostname).to receive(:resolve).with(:hostname).and_return(value) end it 'returns hostname fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.hostname', value: value), an_object_having_attributes(name: 'hostname', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/networking/interfaces_spec.rb000066400000000000000000000020661470204764400276630ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Networking::Interfaces do subject(:fact) { Facts::Aix::Networking::Interfaces.new } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:interfaces).and_return(value) end describe '#call_the_resolver' do let(:value) do { 'ens160' => { 'bindings' => [ { 'address' => '10.16.116.8', 'netmask' => '255.255.240.0', 'network' => '10.16.112.0' } ] } } end it 'returns networking.interfaces fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.interfaces', value: value) end end describe '#call_the_resolver when resolver returns nil' do let(:value) { {} } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.interfaces', value: nil) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/networking/ip6_spec.rb000066400000000000000000000017731470204764400262420ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Networking::Ip6 do subject(:fact) { Facts::Aix::Networking::Ip6.new } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:ip6).and_return(ip6) end describe '#call_the_resolver' do let(:ip6) { 'fe80::5989:97ff:75ae:dae7' } it 'returns ipv6 address fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip6', value: ip6), an_object_having_attributes(name: 'ipaddress6', value: ip6, type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:ip6) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip6', value: nil), an_object_having_attributes(name: 'ipaddress6', value: nil, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/networking/ip_spec.rb000066400000000000000000000011721470204764400261450ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Networking::Ip do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Networking::Ip.new } let(:value) { '0.16.121.255' } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:ip).and_return(value) end it 'returns ipv4 address fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip', value: value), an_object_having_attributes(name: 'ipaddress', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/networking/mac_spec.rb000066400000000000000000000017731470204764400263040ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Networking::Mac do subject(:fact) { Facts::Aix::Networking::Mac.new } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:mac).and_return(value) end describe '#call_the_resolver' do let(:value) { '64:5a:ed:ea:c3:25' } it 'returns macaddress fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.mac', value: value), an_object_having_attributes(name: 'macaddress', value: value, type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.mac', value: nil), an_object_having_attributes(name: 'macaddress', value: nil, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/networking/mtu_spec.rb000066400000000000000000000014171470204764400263440ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Networking::Mtu do subject(:fact) { Facts::Aix::Networking::Mtu.new } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:mtu).and_return(value) end describe '#call_the_resolver' do let(:value) { 1500 } it 'returns mtu fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.mtu', value: value) end end describe '#call_the_resolver when resolver returns nil' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.mtu', value: nil) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/networking/netmask6_spec.rb000066400000000000000000000020261470204764400272640ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Networking::Netmask6 do subject(:fact) { Facts::Aix::Networking::Netmask6.new } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:netmask6).and_return(value) end describe '#call_the_resolver' do let(:value) { 'fe80::5989:97ff:75ae:dae7' } it 'returns netmask6 fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask6', value: value), an_object_having_attributes(name: 'netmask6', value: value, type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask6', value: nil), an_object_having_attributes(name: 'netmask6', value: nil, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/networking/netmask_spec.rb000066400000000000000000000020121470204764400271710ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Networking::Netmask do subject(:fact) { Facts::Aix::Networking::Netmask.new } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:netmask).and_return(value) end describe '#call_the_resolver' do let(:value) { '10.16.122.163' } it 'returns netmask fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'networking.netmask', value: value), an_object_having_attributes(name: 'netmask', value: value, type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'networking.netmask', value: nil), an_object_having_attributes(name: 'netmask', value: nil, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/networking/network6_spec.rb000066400000000000000000000020261470204764400273130ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Networking::Network6 do subject(:fact) { Facts::Aix::Networking::Network6.new } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:network6).and_return(value) end describe '#call_the_resolver' do let(:value) { 'fe80::5989:97ff:75ae:dae7' } it 'returns network6 fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network6', value: value), an_object_having_attributes(name: 'network6', value: value, type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network6', value: nil), an_object_having_attributes(name: 'network6', value: nil, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/networking/network_spec.rb000066400000000000000000000020121470204764400272200ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Networking::Network do subject(:fact) { Facts::Aix::Networking::Network.new } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:network).and_return(value) end describe '#call_the_resolver' do let(:value) { '10.16.122.163' } it 'returns network fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'networking.network', value: value), an_object_having_attributes(name: 'network', value: value, type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'networking.network', value: nil), an_object_having_attributes(name: 'network', value: nil, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/networking/primary_spec.rb000066400000000000000000000010411470204764400272130ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Networking::Primary do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Networking::Primary.new } let(:value) { 'en0' } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:primary_interface).and_return(value) end it 'returns primary interface name' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'networking.primary', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/networking/scope6_spec.rb000066400000000000000000000017611470204764400267400ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Networking::Scope6 do subject(:fact) { Facts::Aix::Networking::Scope6.new } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:scope6).and_return(value) end describe '#call_the_resolver' do let(:value) { 'link' } it 'returns scope6 fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'networking.scope6', value: value), an_object_having_attributes(name: 'scope6', value: value)) end end describe '#call_the_resolver when resolver returns nil' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'networking.scope6', value: value), an_object_having_attributes(name: 'scope6', value: value)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/nim_type_spec.rb000066400000000000000000000007511470204764400251740ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::NimType do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::NimType.new } let(:value) { 'standalone' } before do allow(Facter::Resolvers::Aix::Nim).to receive(:resolve).with(:type).and_return(value) end it 'returns nim_type fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'nim_type', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/os/000077500000000000000000000000001470204764400224275ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/aix/os/architecture_spec.rb000066400000000000000000000012071470204764400264500ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Os::Architecture do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Os::Architecture.new } let(:value) { 'x86_64' } before do allow(Facter::Resolvers::Architecture).to receive(:resolve).with(:architecture).and_return(value) end it 'returns os architecture fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.architecture', value: value), an_object_having_attributes(name: 'architecture', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/os/family_spec.rb000066400000000000000000000011371470204764400252510ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Os::Family do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Os::Family.new } let(:value) { 'Aix' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelname).and_return(value) end it 'returns os family fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.family', value: value), an_object_having_attributes(name: 'osfamily', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/os/hardware_spec.rb000066400000000000000000000011631470204764400255640ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Os::Hardware do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Os::Hardware.new } let(:value) { 'x86_64' } before do allow(Facter::Resolvers::Hardware).to receive(:resolve).with(:hardware).and_return(value) end it 'returns hardware model fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.hardware', value: value), an_object_having_attributes(name: 'hardwaremodel', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/os/name_spec.rb000066400000000000000000000011541470204764400247070ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Os::Name do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Os::Name.new } let(:value) { 'AIX' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelname).and_return(value) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.name', value: value), an_object_having_attributes(name: 'operatingsystem', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/os/release_spec.rb000066400000000000000000000016661470204764400254170ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Os::Release.new } let(:value) { '12.0.1 ' } before do allow(Facter::Resolvers::Aix::OsLevel).to receive(:resolve).with(:build).and_return(value) end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: { 'full' => value.strip, 'major' => value.split('-')[0] }), an_object_having_attributes(name: 'operatingsystemmajrelease', value: value.split('-')[0], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: value.strip, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/partitions_spec.rb000066400000000000000000000013051470204764400255400ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Partitions do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Partitions.new } let(:value) do { '/dev/hd5' => { 'filesystem' => 'boot', 'size_bytes' => 33_554_432, 'size' => '32.00 MiB', 'label' => 'primary_bootlv' } } end before do allow(Facter::Resolvers::Aix::Partitions).to receive(:resolve).with(:partitions).and_return(value) end it 'returns partitions fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'partitions', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/path_spec.rb000066400000000000000000000010541470204764400243010ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Path do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Path.new } let(:value) { '/usr/bin:/etc:/usr/sbin:/usr/ucb:/usr/bin/X11:/sbin:/usr/java6/jre/bin:/usr/java6/bin' } before do allow(Facter::Resolvers::Path).to \ receive(:resolve).with(:path).and_return(value) end it 'returns path fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'path', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/processor_spec.rb000066400000000000000000000013611470204764400253650ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Processor do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Processor.new } let(:processor) { ['Intel(R) Xeon(R) Gold 6138 CPU @ 2.00GHz', 'Intel(R) Xeon(R) Gold 6138 CPU @ 2.00GHz'] } before do allow(Facter::Resolvers::Aix::Processors).to receive(:resolve).with(:models).and_return(processor) end it 'returns legacy facts about each processor' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processor0', value: processor[0], type: :legacy), an_object_having_attributes(name: 'processor1', value: processor[1], type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/processors/000077500000000000000000000000001470204764400242105ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/aix/processors/cores_spec.rb000066400000000000000000000011001470204764400266520ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Processors::Cores do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Processors::Cores.new } let(:cores_per_socket) { 8 } before do allow(Facter::Resolvers::Aix::Processors).to \ receive(:resolve).with(:cores_per_socket).and_return(cores_per_socket) end it 'returns processors cores fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'processors.cores', value: cores_per_socket) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/processors/count_spec.rb000066400000000000000000000013031470204764400266740ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Processors::Count do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Processors::Count.new } let(:processors_count) { '32' } before do allow(Facter::Resolvers::Aix::Processors).to \ receive(:resolve).with(:logical_count).and_return(processors_count) end it 'returns processors count fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.count', value: processors_count), an_object_having_attributes(name: 'processorcount', value: processors_count, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/processors/isa_spec.rb000066400000000000000000000012531470204764400263240ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Processors::Isa do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Processors::Isa.new } let(:processors_arch) { 'powerpc' } before do allow(Facter::Resolvers::Uname).to \ receive(:resolve).with(:processor).and_return(processors_arch) end it 'returns processors isa fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.isa', value: processors_arch), an_object_having_attributes(name: 'hardwareisa', value: processors_arch, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/processors/models_spec.rb000066400000000000000000000011321470204764400270270ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Processors::Models do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Processors::Models.new } let(:models) { %w[PowerPC_POWER8 PowerPC_POWER8 PowerPC_POWER8 PowerPC_POWER8] } before do allow(Facter::Resolvers::Aix::Processors).to \ receive(:resolve).with(:models).and_return(models) end it 'returns processors models fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'processors.models', value: models) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/processors/speed_spec.rb000066400000000000000000000011151470204764400266450ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Processors::Speed do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Processors::Speed.new } let(:speed) { 1_800_000_000 } let(:converted_speed) { '1.80 GHz' } before do allow(Facter::Resolvers::Aix::Processors).to \ receive(:resolve).with(:speed).and_return(speed) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'processors.speed', value: converted_speed) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/processors/threads_spec.rb000066400000000000000000000011101470204764400271720ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Processors::Threads do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Processors::Threads.new } let(:threads_per_core) { 8 } before do allow(Facter::Resolvers::Aix::Processors).to \ receive(:resolve).with(:threads_per_core).and_return(threads_per_core) end it 'returns processors threads fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'processors.threads', value: threads_per_core) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/ruby/000077500000000000000000000000001470204764400227675ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/aix/ruby/platform_spec.rb000066400000000000000000000011711470204764400261520ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Ruby::Platform do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Ruby::Platform.new } let(:value) { 'x86_64-linux' } before do allow(Facter::Resolvers::Ruby).to receive(:resolve).with(:platform).and_return(value) end it 'returns ruby platform fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ruby.platform', value: value), an_object_having_attributes(name: 'rubyplatform', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/ruby/sitedir_spec.rb000066400000000000000000000012271470204764400257730ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Ruby::Sitedir do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Ruby::Sitedir.new } let(:value) { '/opt/puppetlabs/puppet/lib/ruby/site_ruby/2.5.0' } before do allow(Facter::Resolvers::Ruby).to receive(:resolve).with(:sitedir).and_return(value) end it 'returns ruby site dir fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ruby.sitedir', value: value), an_object_having_attributes(name: 'rubysitedir', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/ruby/version_spec.rb000066400000000000000000000011711470204764400260130ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Ruby::Version do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Ruby::Version.new } let(:value) { '2.5.9' } before do allow(Facter::Resolvers::Ruby).to receive(:resolve).with(:version).and_return(value) end it 'returns ruby version fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'ruby.version', value: value), an_object_having_attributes(name: 'rubyversion', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/scope6_interfaces_spec.rb000066400000000000000000000021431470204764400267470ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Scope6Interfaces do subject(:fact) { Facts::Aix::Scope6Interfaces.new } before do allow(Facter::Resolvers::Aix::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { scope6: 'link' }, 'en1' => { scope6: 'global' } } } it 'returns legacy facts with scope6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'scope6_eth0', value: interfaces['eth0'][:scope6], type: :legacy), an_object_having_attributes(name: 'scope6_en1', value: interfaces['en1'][:scope6], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } let(:primary) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/serialnumber_spec.rb000066400000000000000000000010301470204764400260270ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Serialnumber do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Serialnumber.new } let(:value) { '21684EW' } before do allow(Facter::Resolvers::Aix::Serialnumber).to receive(:resolve).with(:serialnumber).and_return(value) end it 'returns serialnumber fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'serialnumber', value: value, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/ssh_spec.rb000066400000000000000000000020741470204764400241450ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Ssh do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Ssh.new } let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'ecdsa', 'test', 'ecdsa')] end let(:value) do { 'ecdsa' => { 'fingerprints' => { 'sha1' => 'test', 'sha256' => 'test' }, 'key' => 'test', 'type' => 'ecdsa' } } end before do allow(Facter::Resolvers::Ssh).to \ receive(:resolve).with(:ssh).and_return(ssh) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ssh', value: value) end context 'when resolver returns empty array' do let(:ssh) { [] } it 'returns nil fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ssh', value: nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/sshalgorithmkey_spec.rb000066400000000000000000000020451470204764400265630ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Sshalgorithmkey do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Sshalgorithmkey.new } let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'ecdsa', 'test', 'ecdsa'), Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'rsa', 'test', 'rsa')] end let(:legacy_fact1) { { name: 'ecdsa', value: 'test' } } let(:legacy_fact2) { { name: 'rsa', value: 'test' } } before do allow(Facter::Resolvers::Ssh).to \ receive(:resolve).with(:ssh).and_return(ssh) end it 'returns a list of resolved facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: "ssh#{legacy_fact1[:name]}key", value: legacy_fact1[:value]), an_object_having_attributes(name: "ssh#{legacy_fact2[:name]}key", value: legacy_fact2[:value])) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/sshfp_algorithm_spec.rb000066400000000000000000000020771470204764400265440ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::SshfpAlgorithm do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::SshfpAlgorithm.new } let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('sha11', 'sha2561'), 'ecdsa', 'test', 'ecdsa'), Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('sha12', 'sha2562'), 'rsa', 'test', 'rsa')] end let(:legacy_fact1) { { name: 'ecdsa', value: "sha11\nsha2561" } } let(:legacy_fact2) { { name: 'rsa', value: "sha12\nsha2562" } } before do allow(Facter::Resolvers::Ssh).to \ receive(:resolve).with(:ssh).and_return(ssh) end it 'returns a list of resolved facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: "sshfp_#{legacy_fact1[:name]}", value: legacy_fact1[:value]), an_object_having_attributes(name: "sshfp_#{legacy_fact2[:name]}", value: legacy_fact2[:value])) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/system_uptime/000077500000000000000000000000001470204764400247155ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/aix/system_uptime/days_spec.rb000066400000000000000000000011771470204764400272220ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::SystemUptime::Days do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::SystemUptime::Days.new } let(:days) { '11' } before do allow(Facter::Resolvers::Uptime).to \ receive(:resolve).with(:days).and_return(days) end it 'returns system uptime fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.days', value: days), an_object_having_attributes(name: 'uptime_days', value: days, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/system_uptime/hours_spec.rb000066400000000000000000000011651470204764400274170ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::SystemUptime::Hours do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::SystemUptime::Hours.new } let(:hours) { '2' } before do allow(Facter::Resolvers::Uptime).to \ receive(:resolve).with(:hours).and_return(hours) end it 'returns system uptime hours fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(have_attributes(name: 'system_uptime.hours', value: hours), have_attributes(name: 'uptime_hours', value: hours, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/system_uptime/seconds_spec.rb000066400000000000000000000012161470204764400277120ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::SystemUptime::Seconds do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::SystemUptime::Seconds.new } let(:seconds) { '123094' } before do allow(Facter::Resolvers::Uptime).to \ receive(:resolve).with(:seconds).and_return(seconds) end it 'returns system uptime seconds fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(have_attributes(name: 'system_uptime.seconds', value: seconds), have_attributes(name: 'uptime_seconds', value: seconds, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/system_uptime/uptime_spec.rb000066400000000000000000000011671470204764400275640ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::SystemUptime::Uptime do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::SystemUptime::Uptime.new } let(:uptime) { '10 days' } before do allow(Facter::Resolvers::Uptime).to \ receive(:resolve).with(:uptime).and_return(uptime) end it 'returns system uptime fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(have_attributes(name: 'system_uptime.uptime', value: uptime), have_attributes(name: 'uptime', value: uptime, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/aix/timezone_spec.rb000066400000000000000000000007751470204764400252100ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Aix::Timezone do describe '#call_the_resolver' do subject(:fact) { Facts::Aix::Timezone.new } let(:timezone) { 'UTC' } before do allow(Facter::Resolvers::Timezone).to \ receive(:resolve).with(:timezone).and_return(timezone) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'timezone', value: timezone) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/alpine/000077500000000000000000000000001470204764400224755ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/alpine/os/000077500000000000000000000000001470204764400231165ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/alpine/os/release_spec.rb000066400000000000000000000044511470204764400261010ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Alpine::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Alpine::Os::Release.new } before do allow(Facter::Resolvers::SpecificReleaseFile).to receive(:resolve) .with(:release, { release_file: '/etc/alpine-release' }) .and_return(value) end context 'when version is retrieved from specific file' do let(:value) { '3.13.0' } let(:release) { { 'full' => '3.13.0', 'major' => '3', 'minor' => '13' } } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end end context 'when version is retrieved from os-release file' do let(:value) { nil } let(:os_release) { '3' } let(:release) { { 'full' => '3', 'major' => '3' } } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(os_release) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end context 'when release can\'t be received' do let(:os_release) { nil } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.release', value: nil) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/amzn/000077500000000000000000000000001470204764400221725ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/amzn/lsbdistcodename_spec.rb000066400000000000000000000010301470204764400266630ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Amzn::Lsbdistcodename do describe '#call_the_resolver' do subject(:fact) { Facts::Amzn::Lsbdistcodename.new } let(:value) { 'amzn' } before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:codename).and_return(value) end it 'returns lsbdistcodename fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'lsbdistcodename', value: value, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/amzn/lsbdistdescription_spec.rb000066400000000000000000000010471470204764400274430ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Amzn::Lsbdistdescription do describe '#call_the_resolver' do subject(:fact) { Facts::Amzn::Lsbdistdescription.new } let(:value) { 'amzn' } before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:description).and_return(value) end it 'returns lsbdistdescription fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'lsbdistdescription', value: value, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/amzn/lsbdistid_spec.rb000066400000000000000000000010061470204764400255070ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Amzn::Lsbdistid do describe '#call_the_resolver' do subject(:fact) { Facts::Amzn::Lsbdistid.new } let(:value) { 'amzn' } before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:distributor_id).and_return(value) end it 'returns lsbdistid fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'lsbdistid', value: value, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/amzn/os/000077500000000000000000000000001470204764400226135ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/amzn/os/distro/000077500000000000000000000000001470204764400241175ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/amzn/os/distro/codename_spec.rb000066400000000000000000000021501470204764400272270ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Amzn::Os::Distro::Codename do describe '#call_the_resolver' do subject(:fact) { Facts::Amzn::Os::Distro::Codename.new } before do allow(Facter::Resolvers::SpecificReleaseFile).to receive(:resolve) .with(:release, { release_file: '/etc/system-release' }).and_return(value) end context 'when codename is not in system-release' do let(:value) { 'Amazon Linux AMI release 2017.03' } let(:expected_value) { 'n/a' } it "returns 'n/a' fact value" do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.codename', value: expected_value) end end context 'when codename is in system-release' do let(:value) { 'Amazon Linux release 2 (2017.12) LTS Release Candidate' } let(:expected_value) { '2017.12' } it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.codename', value: expected_value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/amzn/os/distro/description_spec.rb000066400000000000000000000011551470204764400300030ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Amzn::Os::Distro::Description do describe '#call_the_resolver' do subject(:fact) { Facts::Amzn::Os::Distro::Description.new } let(:value) { 'Amazon Linux AMI release 2017.03' } before do allow(Facter::Resolvers::SpecificReleaseFile).to receive(:resolve) .with(:release, { release_file: '/etc/system-release' }).and_return(value) end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.description', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/amzn/os/distro/id_spec.rb000066400000000000000000000012041470204764400260470ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Amzn::Os::Distro::Id do describe '#call_the_resolver' do subject(:fact) { Facts::Amzn::Os::Distro::Id.new } let(:value) { 'Amazon Linux AMI release 2017.03' } let(:expected_value) { 'AmazonAMI' } before do allow(Facter::Resolvers::SpecificReleaseFile).to receive(:resolve) .with(:release, { release_file: '/etc/system-release' }).and_return(value) end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.id', value: expected_value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/amzn/os/distro/release_spec.rb000066400000000000000000000077661470204764400271160ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Amzn::Os::Distro::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Amzn::Os::Distro::Release.new } before do allow(Facter::Resolvers::ReleaseFromFirstLine).to receive(:resolve) .with(:release, { release_file: '/etc/system-release' }) .and_return(system_release_value) end context 'when version is retrieved from rpm on AL2023' do let(:system_release_value) { '2023' } let(:os_release_value) { '2023.1.20230912' } let(:release) { { 'full' => '2023.1.20230912', 'major' => '2023', 'minor' => '1', 'patch' => '20230912' } } it 'returns os distro release fact including patch' do allow(Facter::Resolvers::Amzn::OsReleaseRpm).to receive(:resolve) .with(:version) .and_return(os_release_value) expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.distro.release', value: release), an_object_having_attributes(name: 'lsbdistrelease', value: release['full'], type: :legacy), an_object_having_attributes(name: 'lsbmajdistrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'lsbminordistrelease', value: release['minor'], type: :legacy)) end end context 'when version is retrieved from os-release file on AL1' do let(:system_release_value) { nil } let(:os_release_value) { '2017.03' } let(:release) { { 'full' => '2017.03', 'major' => '2017', 'minor' => '03' } } it 'returns os distro release fact' do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(os_release_value) expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.distro.release', value: release), an_object_having_attributes(name: 'lsbdistrelease', value: release['full'], type: :legacy), an_object_having_attributes(name: 'lsbmajdistrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'lsbminordistrelease', value: release['minor'], type: :legacy)) end end context 'when version is retrieved from os-release file on AL2' do let(:system_release_value) { '2' } let(:release) { { 'full' => '2', 'major' => '2' } } it 'returns os distro release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.distro.release', value: release), an_object_having_attributes(name: 'lsbdistrelease', value: release['full'], type: :legacy), an_object_having_attributes(name: 'lsbmajdistrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'lsbminordistrelease', value: release['minor'], type: :legacy)) end end context 'when release can\'t be retrieved' do let(:system_release_value) { nil } let(:os_release_value) { nil } it 'returns os distro release fact as nil' do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(os_release_value) expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.release', value: nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/amzn/os/release_spec.rb000066400000000000000000000066621470204764400256040ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Amzn::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Amzn::Os::Release.new } before do allow(Facter::Resolvers::ReleaseFromFirstLine).to receive(:resolve) .with(:release, { release_file: '/etc/system-release' }) .and_return(system_release_value) end context 'when version is retrieved from rpm on AL2023' do let(:system_release_value) { '2023' } let(:os_release_value) { '2023.1.20230912' } let(:release) { { 'full' => '2023.1.20230912', 'major' => '2023', 'minor' => '1' } } it 'returns os release fact excluding patch' do allow(Facter::Resolvers::Amzn::OsReleaseRpm).to receive(:resolve) .with(:version) .and_return(os_release_value) expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end end context 'when version is retrieved from os-release file on AL1' do let(:system_release_value) { nil } let(:os_release_value) { '2017.03' } let(:release) { { 'full' => '2017.03', 'major' => '2017', 'minor' => '03' } } it 'returns os release fact' do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(os_release_value) expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end end context 'when version is retrieved from os-release file on AL2' do let(:system_release_value) { '2' } let(:release) { { 'full' => '2', 'major' => '2' } } it 'returns os release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end end context 'when version can\'t be retrieved' do let(:system_release_value) { nil } let(:os_release_value) { nil } it 'returns os release fact as nil' do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(os_release_value) expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.release', value: nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/azurelinux/000077500000000000000000000000001470204764400234335ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/azurelinux/os/000077500000000000000000000000001470204764400240545ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/azurelinux/os/release_spec.rb000066400000000000000000000047571470204764400270500ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Azurelinux::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Azurelinux::Os::Release.new } before do allow(Facter::Resolvers::SpecificReleaseFile).to receive(:resolve) .with(:release, { release_file: '/etc/azurelinux-release', regex: /AZURELINUX_BUILD_NUMBER=([0-9.]+)/ }) .and_return(value) end context 'when version is retrieved from specific file' do let(:value) { /AZURELINUX_BUILD_NUMBER=([0-9.]+)/.match('AZURELINUX_BUILD_NUMBER=3.0.20240401') } let(:release) { { 'full' => '3.0.20240401', 'major' => '3', 'minor' => '0' } } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end end context 'when version is retrieved from os-release file' do let(:value) { nil } let(:os_release) { '3.0.20240401' } let(:release) { { 'full' => '3.0.20240401', 'major' => '3', 'minor' => '0' } } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(os_release) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end context 'when release can\'t be received' do let(:os_release) { nil } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.release', value: nil) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/bsd/000077500000000000000000000000001470204764400217755ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/bsd/kernelmajversion_spec.rb000066400000000000000000000011131470204764400267060ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Bsd::Kernelmajversion do describe '#call_the_resolver' do subject(:fact) { Facts::Bsd::Kernelmajversion.new } let(:fact_value) { '12' } let(:resolver_value) { '12.1-RELEASE-p3' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelrelease).and_return(resolver_value) end it 'returns kernelmajversion fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernelmajversion', value: fact_value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/bsd/kernelversion_spec.rb000066400000000000000000000011011470204764400262130ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Bsd::Kernelversion do describe '#call_the_resolver' do subject(:fact) { Facts::Bsd::Kernelversion.new } let(:resolver_value) { '12.1-RELEASE-p3' } let(:fact_value) { '12.1' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelrelease).and_return(resolver_value) end it 'returns kernelversion fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernelversion', value: fact_value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/bsd/load_averages_spec.rb000066400000000000000000000010531470204764400261270ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Bsd::LoadAverages do describe '#call_the_resolver' do subject(:fact) { Facts::Bsd::LoadAverages.new } let(:value) { { '1m' => 0.01, '5m' => 0.02, '15m' => 0.03 } } before do allow(Facter::Resolvers::LoadAverages).to receive(:resolve).with(:load_averages).and_return(value) end it 'returns load_averages fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'load_averages', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/bsd/os/000077500000000000000000000000001470204764400224165ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/bsd/os/family_spec.rb000066400000000000000000000011431470204764400252350ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Bsd::Os::Family do describe '#call_the_resolver' do subject(:fact) { Facts::Bsd::Os::Family.new } let(:value) { 'FreeBSD' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelname).and_return(value) end it 'returns os family fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.family', value: value), an_object_having_attributes(name: 'osfamily', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/bsd/processors/000077500000000000000000000000001470204764400241775ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/bsd/processors/count_spec.rb000066400000000000000000000012441470204764400266670ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Bsd::Processors::Count do describe '#call_the_resolver' do subject(:fact) { Facts::Bsd::Processors::Count.new } let(:processors) { '4' } before do allow(Facter::Resolvers::Bsd::Processors).to \ receive(:resolve).with(:logical_count).and_return(processors) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.count', value: processors), an_object_having_attributes(name: 'processorcount', value: processors, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/bsd/processors/models_spec.rb000066400000000000000000000014741470204764400270270ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Bsd::Processors::Models do describe '#call_the_resolver' do subject(:fact) { Facts::Bsd::Processors::Models.new } let(:value) { 'Intel(R) Core(TM) i7-4980HQ CPU @ 2.80GHz' } let(:models) { [value, value] } before do allow(Facter::Resolvers::Bsd::Processors).to \ receive(:resolve).with(:models).and_return(models) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.models', value: models), an_object_having_attributes(name: 'processor0', value: value, type: :legacy), an_object_having_attributes(name: 'processor1', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/bsd/processors/speed_spec.rb000066400000000000000000000011151470204764400266340ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Bsd::Processors::Speed do describe '#call_the_resolver' do subject(:fact) { Facts::Bsd::Processors::Speed.new } let(:speed) { 1_800_000_000 } let(:converted_speed) { '1.80 GHz' } before do allow(Facter::Resolvers::Bsd::Processors).to \ receive(:resolve).with(:speed).and_return(speed) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'processors.speed', value: converted_speed) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/debian/000077500000000000000000000000001470204764400224475ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/debian/lsbdistcodename_spec.rb000066400000000000000000000010371470204764400271470ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Debian::Lsbdistcodename do describe '#call_the_resolver' do subject(:fact) { Facts::Debian::Lsbdistcodename.new } let(:value) { 'stretch' } before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:codename).and_return(value) end it 'returns lsbdistcodename fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'lsbdistcodename', value: value, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/debian/lsbdistdescription_spec.rb000066400000000000000000000010561470204764400277200ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Debian::Lsbdistdescription do describe '#call_the_resolver' do subject(:fact) { Facts::Debian::Lsbdistdescription.new } let(:value) { 'stretch' } before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:description).and_return(value) end it 'returns lsbdistdescription fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'lsbdistdescription', value: value, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/debian/lsbdistid_spec.rb000066400000000000000000000010151470204764400257640ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Debian::Lsbdistid do describe '#call_the_resolver' do subject(:fact) { Facts::Debian::Lsbdistid.new } let(:value) { 'stretch' } before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:distributor_id).and_return(value) end it 'returns lsbdistid fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'lsbdistid', value: value, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/debian/os/000077500000000000000000000000001470204764400230705ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/debian/os/architecture_spec.rb000066400000000000000000000034261470204764400271160ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Debian::Os::Architecture do describe '#call_the_resolver' do subject(:fact) { Facts::Debian::Os::Architecture.new } context 'when resolver does not return x86_64' do let(:value) { 'i86pc' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:machine).and_return(value) end it 'returns architecture fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.architecture', value: value), an_object_having_attributes(name: 'architecture', value: value, type: :legacy)) end end context 'when os is 32-bit' do let(:value) { 'i586' } let(:fact_value) { 'i386' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:machine).and_return(value) end it 'returns architecture fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.architecture', value: fact_value), an_object_having_attributes(name: 'architecture', value: fact_value, type: :legacy)) end end context 'when resolver returns x86_64' do let(:value) { 'x86_64' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:machine).and_return(value) end it 'returns architecture fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.architecture', value: 'amd64'), an_object_having_attributes(name: 'architecture', value: 'amd64', type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/debian/os/distro/000077500000000000000000000000001470204764400243745ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/debian/os/distro/codename_spec.rb000066400000000000000000000047411470204764400275140ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Debian::Os::Distro::Codename do describe '#call_the_resolver' do subject(:fact) { Facts::Debian::Os::Distro::Codename.new } context 'when version codename exists in os-release' do let(:value) { 'stretch' } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_codename).and_return(value) end it 'returns os.distro.codename fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.codename', value: value) end end context 'when version codename does not exists in os-release on Ubuntu' do let(:value) { nil } let(:version) { '14.04.2 LTS, Trusty Tahr' } let(:result) { 'trusty' } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_codename).and_return(value) allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version).and_return(version) end it 'returns os.distro.codename fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.codename', value: result) end end context 'when version codename does not exists in os-release on Debian' do let(:value) { nil } let(:version) { '9 (stretch)' } let(:result) { 'stretch' } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_codename).and_return(value) allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version).and_return(version) end it 'returns os.distro.codename fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.codename', value: result) end end context 'when version codename and version do not exist in os-release' do let(:value) { nil } let(:version) { nil } let(:result) { nil } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_codename).and_return(value) allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version).and_return(version) end it 'returns os.distro.codename fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.codename', value: result) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/debian/os/distro/description_spec.rb000066400000000000000000000011051470204764400302530ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Debian::Os::Distro::Description do describe '#call_the_resolver' do subject(:fact) { Facts::Debian::Os::Distro::Description.new } let(:value) { 'Debian GNU/Linux 9.0 (stretch)' } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:pretty_name).and_return(value) end it 'returns os.distro.description fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.description', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/debian/os/distro/id_spec.rb000066400000000000000000000010131470204764400263220ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Debian::Os::Distro::Id do describe '#call_the_resolver' do subject(:fact) { Facts::Debian::Os::Distro::Id.new } let(:value) { 'debian' } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:id).and_return(value) end it 'returns os.distro.id fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.id', value: value.capitalize) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/debian/os/distro/release_spec.rb000066400000000000000000000035531470204764400273610ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Debian::Os::Distro::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Debian::Os::Distro::Release.new } shared_examples 'returns distro release fact' do it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.distro.release', value: fact_value), an_object_having_attributes(name: 'lsbdistrelease', value: fact_value['full'], type: :legacy), an_object_having_attributes(name: 'lsbmajdistrelease', value: fact_value['major'], type: :legacy), an_object_having_attributes(name: 'lsbminordistrelease', value: fact_value['minor'], type: :legacy)) end end before do allow(Facter::Resolvers::DebianVersion).to receive(:resolve).with(:version).and_return(os_release_value) end context 'when version_id is retrieved successfully' do let(:os_release_value) { '10.02' } let(:fact_value) { { 'full' => '10.02', 'major' => '10', 'minor' => '2' } } it_behaves_like 'returns distro release fact' end context 'when version_id could not be retrieve' do let(:os_release_value) { nil } let(:fact_value) { nil } it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.release', value: fact_value) end end context 'when version has no minor' do let(:os_release_value) { 'bullseye/sid' } let(:fact_value) { { 'full' => 'bullseye/sid', 'major' => 'bullseye/sid' } } it_behaves_like 'returns distro release fact' end end end puppetlabs-facter-dfe6df4/spec/facter/facts/debian/os/release_spec.rb000066400000000000000000000033561470204764400260560ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Debian::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Debian::Os::Release.new } shared_examples 'returns os release fact' do it 'returns os release fact' do expect(fact.call_the_resolver).to match_array \ [ having_attributes(name: 'os.release', value: fact_value), having_attributes(name: 'operatingsystemmajrelease', value: fact_value['major'], type: :legacy), having_attributes(name: 'operatingsystemrelease', value: fact_value['full'], type: :legacy) ] end end shared_examples 'returns os release fact as nil' do it 'returns os release fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.release', value: fact_value) end end before do allow(Facter::Resolvers::DebianVersion).to receive(:resolve).with(:version).and_return(os_release_value) end context 'when version_id is retrieved successful' do let(:os_release_value) { '10.02' } let(:fact_value) { { 'full' => '10.02', 'major' => '10', 'minor' => '2' } } it_behaves_like 'returns os release fact' end context 'when version has no minor' do let(:os_release_value) { 'testing/release' } let(:fact_value) { { 'full' => 'testing/release', 'major' => 'testing/release' } } it_behaves_like 'returns os release fact' end context 'when version_id could not §be retrieve' do let(:os_release_value) { nil } let(:fact_value) { nil } it_behaves_like 'returns os release fact as nil' end end end puppetlabs-facter-dfe6df4/spec/facter/facts/devuan/000077500000000000000000000000001470204764400225075ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/devuan/os/000077500000000000000000000000001470204764400231305ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/devuan/os/distro/000077500000000000000000000000001470204764400244345ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/devuan/os/distro/release_spec.rb000066400000000000000000000027211470204764400274150ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Devuan::Os::Distro::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Devuan::Os::Distro::Release.new } let(:value) { '7.2.1511' } let(:release) { { 'full' => '7.2.1511', 'major' => '7', 'minor' => '2' } } before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:release).and_return(value) end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.distro.release', value: release), an_object_having_attributes(name: 'lsbdistrelease', value: value, type: :legacy), an_object_having_attributes(name: 'lsbmajdistrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'lsbminordistrelease', value: release['minor'], type: :legacy)) end context 'when lsb_release is not installed' do let(:value) { nil } before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:release).and_return(value) end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'os.distro.release', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/devuan/os/release_spec.rb000066400000000000000000000044731470204764400261170ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Devuan::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Devuan::Os::Release.new } before do allow(Facter::Resolvers::SpecificReleaseFile).to receive(:resolve) .with(:release, { release_file: '/etc/devuan_version' }) .and_return(value) end context 'when version is retrieved from specific file' do let(:value) { '2.13.0' } let(:release) { { 'full' => '2.13.0', 'major' => '2', 'minor' => '13' } } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end end context 'when version is retrieved from os-release file' do let(:value) { nil } let(:os_release) { 'beowulf' } let(:release) { { 'full' => 'beowulf', 'major' => 'beowulf' } } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(os_release) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end context 'when release can\'t be received' do let(:os_release) { nil } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.release', value: nil) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/000077500000000000000000000000001470204764400226375ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/augeas/000077500000000000000000000000001470204764400241045ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/augeas/version_spec.rb000066400000000000000000000012261470204764400271310ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Augeas::Version do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Augeas::Version.new } let(:version) { '1.12.0' } before do allow(Facter::Resolvers::Augeas).to \ receive(:resolve).with(:augeas_version).and_return(version) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'augeas.version', value: version), an_object_having_attributes(name: 'augeasversion', value: version, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/disks_spec.rb000066400000000000000000000013251470204764400253140ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Disks do subject(:fact) { Facts::Freebsd::Disks.new } let(:disk) do { 'disks' => { 'sda' => { 'model' => 'Virtual disk', 'size' => '20.00 GiB', 'size_bytes' => 21_474_836_480, 'vendor' => 'VMware' } } } end describe '#call_the_resolver' do before do allow(Facter::Resolvers::Freebsd::Geom).to receive(:resolve).with(:disks).and_return(disk) end it 'returns resolved fact with name disk and value' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'disks', value: disk) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/dmi/000077500000000000000000000000001470204764400234105ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/dmi/bios/000077500000000000000000000000001470204764400243445ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/dmi/bios/release_date_spec.rb000066400000000000000000000012631470204764400303220ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Dmi::Bios::ReleaseDate do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Dmi::Bios::ReleaseDate.new } let(:date) { '07/03/2018' } before do allow(Facter::Resolvers::Freebsd::DmiBios).to \ receive(:resolve).with(:bios_date).and_return(date) end it 'returns bios release date fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.bios.release_date', value: date), an_object_having_attributes(name: 'bios_release_date', value: date, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/dmi/bios/vendor_spec.rb000066400000000000000000000012571470204764400272050ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Dmi::Bios::Vendor do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Dmi::Bios::Vendor.new } let(:vendor) { 'Phoenix Technologies LTD' } before do allow(Facter::Resolvers::Freebsd::DmiBios).to \ receive(:resolve).with(:bios_vendor).and_return(vendor) end it 'returns bios vendor fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.bios.vendor', value: vendor), an_object_having_attributes(name: 'bios_vendor', value: vendor, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/dmi/bios/version_spec.rb000066400000000000000000000012451470204764400273720ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Dmi::Bios::Version do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Dmi::Bios::Version.new } let(:version) { '6.00' } before do allow(Facter::Resolvers::Freebsd::DmiBios).to \ receive(:resolve).with(:bios_version).and_return(version) end it 'returns bios version fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.bios.version', value: version), an_object_having_attributes(name: 'bios_version', value: version, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/dmi/manufacturer_spec.rb000066400000000000000000000012651470204764400274470ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Dmi::Manufacturer do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Dmi::Manufacturer.new } let(:sys_vendor) { 'VMware, Inc.' } before do allow(Facter::Resolvers::Freebsd::DmiBios).to \ receive(:resolve).with(:sys_vendor).and_return(sys_vendor) end it 'returns manufacturer fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.manufacturer', value: sys_vendor), an_object_having_attributes(name: 'manufacturer', value: sys_vendor, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/dmi/product/000077500000000000000000000000001470204764400250705ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/dmi/product/name_spec.rb000066400000000000000000000013131470204764400273450ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Dmi::Product::Name do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Dmi::Product::Name.new } let(:product_name) { 'VMware Virtual Platform' } before do allow(Facter::Resolvers::Freebsd::DmiBios).to \ receive(:resolve).with(:product_name).and_return(product_name) end it 'returns product name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.product.name', value: product_name), an_object_having_attributes(name: 'productname', value: product_name, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/dmi/product/serial_number_spec.rb000066400000000000000000000014071470204764400312600ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Dmi::Product::SerialNumber do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Dmi::Product::SerialNumber.new } let(:serial_number) { 'VMware-42 1a a9 29 31 8f fa e9-7d 69 2e 23 21 b0 0c 45' } before do allow(Facter::Resolvers::Freebsd::DmiBios).to \ receive(:resolve).with(:product_serial).and_return(serial_number) end it 'returns resolved facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.product.serial_number', value: serial_number), an_object_having_attributes(name: 'serialnumber', value: serial_number, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/dmi/product/uuid_spec.rb000066400000000000000000000013161470204764400273760ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Dmi::Product::Uuid do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Dmi::Product::Uuid.new } let(:product_uuid) { '421aa929-318f-fae9-7d69-2e2321b00c45' } before do allow(Facter::Resolvers::Freebsd::DmiBios).to \ receive(:resolve).with(:product_uuid).and_return(product_uuid) end it 'returns resolved facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.product.uuid', value: product_uuid), an_object_having_attributes(name: 'uuid', value: product_uuid, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/ec2_metadata_spec.rb000066400000000000000000000043761470204764400265210ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Ec2Metadata do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Ec2Metadata.new } let(:virtual_detector_double) { class_spy(Facter::Util::Facts::Posix::VirtualDetector) } before do allow(Facter::Resolvers::Ec2).to receive(:resolve).with(:metadata).and_return(value) end context 'when physical machine with no hypervisor' do let(:value) { nil } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return(nil) end it 'returns ec2 metadata fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ec2_metadata', value: value) end it "doesn't call Ec2 resolver" do fact.call_the_resolver expect(Facter::Resolvers::Ec2).not_to have_received(:resolve).with(:metadata) end end shared_examples 'check ec2 resolver called with metadata' do end shared_examples 'check resolved fact value' do it 'returns ec2 metadata fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ec2_metadata', value: value) end end context 'when platform is kvm' do let(:value) { { 'info' => 'value' } } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('kvm') end it_behaves_like 'check ec2 resolver called with metadata' it_behaves_like 'check resolved fact value' end context 'when platform is xen' do let(:value) { { 'info' => 'value' } } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('xen') end it_behaves_like 'check ec2 resolver called with metadata' it_behaves_like 'check resolved fact value' end context 'when platform is aws' do let(:value) { { 'info' => 'value' } } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('aws') end it_behaves_like 'check ec2 resolver called with metadata' it_behaves_like 'check resolved fact value' end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/ec2_userdata_spec.rb000066400000000000000000000044001470204764400265350ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Ec2Userdata do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Ec2Userdata.new } let(:virtual_detector_double) { class_spy(Facter::Util::Facts::Posix::VirtualDetector) } before do allow(Facter::Resolvers::Ec2).to receive(:resolve).with(:userdata).and_return(value) end context 'when physical machine with no hypervisor' do let(:value) { nil } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('nil') end it 'returns ec2 userdata fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ec2_userdata', value: value) end it "doesn't call Ec2 resolver" do fact.call_the_resolver expect(Facter::Resolvers::Ec2).not_to have_received(:resolve).with(:userdata) end end shared_examples 'check ec2 resolver called with userdata' do end shared_examples 'check resolved fact value' do it 'returns ec2 userdata fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ec2_userdata', value: value) end end context 'when platform is kvm' do let(:value) { { 'info' => 'value' } } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('kvm') end it_behaves_like 'check ec2 resolver called with userdata' it_behaves_like 'check resolved fact value' end context 'when platform is xen' do let(:value) { { 'info' => 'value' } } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('xen') end it_behaves_like 'check ec2 resolver called with userdata' it_behaves_like 'check resolved fact value' end context 'when platform is aws' do let(:value) { { 'info' => 'value' } } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('aws') end it_behaves_like 'check ec2 resolver called with userdata' it_behaves_like 'check resolved fact value' end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/facterversion_spec.rb000066400000000000000000000010201470204764400270410ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Facterversion do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Facterversion.new } let(:value) { '4.0.3' } before do allow(Facter::Resolvers::Facterversion).to receive(:resolve).with(:facterversion).and_return(value) end it 'returns facterversion fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'facterversion', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/identity/000077500000000000000000000000001470204764400244705ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/identity/gid_spec.rb000066400000000000000000000010001470204764400265610ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Identity::Gid do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Identity::Gid.new } let(:value) { '20' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:gid).and_return(value) end it 'returns identity gid fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'identity.gid', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/identity/group_spec.rb000066400000000000000000000011721470204764400271640ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Identity::Group do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Identity::Group.new } let(:value) { 'staff' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:group).and_return(value) end it 'returns identity group fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'identity.group', value: value), an_object_having_attributes(name: 'gid', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/identity/privileged_spec.rb000066400000000000000000000010461470204764400301620ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Identity::Privileged do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Identity::Privileged.new } let(:value) { 'false' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:privileged).and_return(value) end it 'returns identity privileged fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'identity.privileged', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/identity/uid_spec.rb000066400000000000000000000010011470204764400266000ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Identity::Uid do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Identity::Uid.new } let(:value) { '501' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:uid).and_return(value) end it 'returns identity uid fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'identity.uid', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/identity/user_spec.rb000066400000000000000000000011721470204764400270060ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Identity::User do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Identity::User.new } let(:value) { 'root' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:user).and_return(value) end it 'returns id and identity user name' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'identity.user', value: value), an_object_having_attributes(name: 'id', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/ipaddress6_interfaces_spec.rb000066400000000000000000000022001470204764400304370ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Ipaddress6Interfaces do subject(:fact) { Facts::Freebsd::Ipaddress6Interfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { ip6: 'fe80::99bf:da20:ad3:9bfe' }, 'en1' => { ip6: 'fe80::99bf:da20:ad3:9bfe' } } } it 'returns legacy facts with names ipaddress6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ipaddress6_eth0', value: interfaces['eth0'][:ip6], type: :legacy), an_object_having_attributes(name: 'ipaddress6_en1', value: interfaces['en1'][:ip6], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/ipaddress_interfaces_spec.rb000066400000000000000000000021411470204764400303550ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::IpaddressInterfaces do subject(:fact) { Facts::Freebsd::IpaddressInterfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { ip: '10.16.117.100' }, 'en1' => { ip: '10.16.117.255' } } } it 'returns legacy facts with names ipaddress_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ipaddress_eth0', value: interfaces['eth0'][:ip], type: :legacy), an_object_having_attributes(name: 'ipaddress_en1', value: interfaces['en1'][:ip], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/is_virtual_spec.rb000066400000000000000000000017731470204764400263670ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::IsVirtual do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::IsVirtual.new } let(:virtual_detector_double) { class_spy(Facter::Util::Facts::Posix::VirtualDetector) } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return(virtual_value) end context 'when not in a virtual environment' do let(:virtual_value) { 'physical' } it 'return resolved fact with nil value' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'is_virtual', value: false) end end context 'when in a virtual environment' do let(:virtual_value) { 'aws' } it 'return resolved fact with nil value' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'is_virtual', value: true) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/kernel_spec.rb000066400000000000000000000007531470204764400254630ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Kernel do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Kernel.new } let(:value) { 'FreeBSD' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelname).and_return(value) end it 'returns kernel fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernel', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/kernelrelease_spec.rb000066400000000000000000000010071470204764400270150ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Kernelrelease do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Kernelrelease.new } let(:value) { '5.11' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelrelease).and_return(value) end it 'returns kernelrelease fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernelrelease', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/memory/000077500000000000000000000000001470204764400241475ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/memory/swap/000077500000000000000000000000001470204764400251215ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/memory/swap/available_bytes_spec.rb000066400000000000000000000013151470204764400316060ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Memory::Swap::AvailableBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Memory::Swap::AvailableBytes.new } let(:value) { 1024 * 1024 } let(:value_mb) { 1 } before do allow(Facter::Resolvers::Freebsd::SwapMemory).to receive(:resolve).with(:available_bytes).and_return(value) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.available_bytes', value: value), an_object_having_attributes(name: 'swapfree_mb', value: value_mb, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/memory/swap/available_spec.rb000066400000000000000000000012341470204764400304000ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Memory::Swap::Available do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Memory::Swap::Available.new } let(:value) { '1.00 KiB' } before do allow(Facter::Resolvers::Freebsd::SwapMemory).to receive(:resolve).with(:available_bytes).and_return(1024) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.available', value: value), an_object_having_attributes(name: 'swapfree', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/memory/swap/capacity_spec.rb000066400000000000000000000010331470204764400302520ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Memory::Swap::Capacity do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Memory::Swap::Capacity.new } let(:value) { 1024 } before do allow(Facter::Resolvers::Freebsd::SwapMemory).to receive(:resolve).with(:capacity).and_return(value) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.swap.capacity', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/memory/swap/encrypted_spec.rb000066400000000000000000000012261470204764400304560ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Memory::Swap::Encrypted do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Memory::Swap::Encrypted.new } let(:value) { true } before do allow(Facter::Resolvers::Freebsd::SwapMemory).to receive(:resolve).with(:encrypted).and_return(value) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.encrypted', value: value), an_object_having_attributes(name: 'swapencrypted', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/memory/swap/total_bytes_spec.rb000066400000000000000000000012751470204764400310160ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Memory::Swap::TotalBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Memory::Swap::TotalBytes.new } let(:value) { 1024 * 1024 } let(:value_mb) { 1 } before do allow(Facter::Resolvers::Freebsd::SwapMemory).to receive(:resolve).with(:total_bytes).and_return(value) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.total_bytes', value: value), an_object_having_attributes(name: 'swapsize_mb', value: value_mb, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/memory/swap/total_spec.rb000066400000000000000000000012141470204764400276010ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Memory::Swap::Total do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Memory::Swap::Total.new } let(:value) { '1.00 KiB' } before do allow(Facter::Resolvers::Freebsd::SwapMemory).to receive(:resolve).with(:total_bytes).and_return(1024) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.total', value: value), an_object_having_attributes(name: 'swapsize', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/memory/swap/used_bytes_spec.rb000066400000000000000000000010411470204764400306220ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Memory::Swap::UsedBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Memory::Swap::UsedBytes.new } let(:value) { 1024 } before do allow(Facter::Resolvers::Freebsd::SwapMemory).to receive(:resolve).with(:used_bytes).and_return(value) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.swap.used_bytes', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/memory/swap/used_spec.rb000066400000000000000000000011371470204764400274220ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Memory::Swap::Used do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Memory::Swap::Used.new } let(:resolver_result) { 1024 } let(:fact_value) { '1.00 KiB' } before do allow(Facter::Resolvers::Freebsd::SwapMemory).to receive(:resolve).with(:used_bytes).and_return(resolver_result) end it 'returns a memory.swap.used fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.swap.used', value: fact_value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/memory/system/000077500000000000000000000000001470204764400254735ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/memory/system/available_bytes_spec.rb000066400000000000000000000013271470204764400321630ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Memory::System::AvailableBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Memory::System::AvailableBytes.new } let(:value) { 1024 * 1024 } let(:value_mb) { 1 } before do allow(Facter::Resolvers::Freebsd::SystemMemory).to receive(:resolve).with(:available_bytes).and_return(value) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.available_bytes', value: value), an_object_having_attributes(name: 'memoryfree_mb', value: value_mb, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/memory/system/available_spec.rb000066400000000000000000000012461470204764400307550ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Memory::System::Available do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Memory::System::Available.new } let(:value) { '1.00 KiB' } before do allow(Facter::Resolvers::Freebsd::SystemMemory).to receive(:resolve).with(:available_bytes).and_return(1024) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.available', value: value), an_object_having_attributes(name: 'memoryfree', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/memory/system/capacity_spec.rb000066400000000000000000000010471470204764400306310ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Memory::System::Capacity do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Memory::System::Capacity.new } let(:value) { '15.53%' } before do allow(Facter::Resolvers::Freebsd::SystemMemory).to receive(:resolve).with(:capacity).and_return(value) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.system.capacity', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/memory/system/total_bytes_spec.rb000066400000000000000000000013071470204764400313640ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Memory::System::TotalBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Memory::System::TotalBytes.new } let(:value) { 1024 * 1024 } let(:value_mb) { 1 } before do allow(Facter::Resolvers::Freebsd::SystemMemory).to receive(:resolve).with(:total_bytes).and_return(value) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.total_bytes', value: value), an_object_having_attributes(name: 'memorysize_mb', value: value_mb, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/memory/system/total_spec.rb000066400000000000000000000012261470204764400301560ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Memory::System::Total do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Memory::System::Total.new } let(:value) { '1.00 KiB' } before do allow(Facter::Resolvers::Freebsd::SystemMemory).to receive(:resolve).with(:total_bytes).and_return(1024) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.total', value: value), an_object_having_attributes(name: 'memorysize', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/memory/system/used_bytes_spec.rb000066400000000000000000000010511470204764400311750ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Memory::System::UsedBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Memory::System::UsedBytes.new } let(:value) { 1024 } before do allow(Facter::Resolvers::Freebsd::SystemMemory).to receive(:resolve).with(:used_bytes).and_return(value) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.system.used_bytes', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/memory/system/used_spec.rb000066400000000000000000000011511470204764400277700ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Memory::System::Used do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Memory::System::Used.new } let(:resolver_result) { 1024 } let(:fact_value) { '1.00 KiB' } before do allow(Facter::Resolvers::Freebsd::SystemMemory).to receive(:resolve).with(:used_bytes).and_return(resolver_result) end it 'returns a memory.system.used fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.system.used', value: fact_value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/mountpoints_spec.rb000066400000000000000000000035521470204764400266020ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Mountpoints do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Mountpoints.new } context 'when resolver returns hash' do let(:resolver_output) do [{ available: '63.31 GiB', available_bytes: 67_979_685_888, capacity: '84.64%', device: '/dev/nvme0n1p2', filesystem: 'ext4', options: %w[rw noatime], path: '/', size: '434.42 GiB', size_bytes: 466_449_743_872, used: '348.97 GiB', used_bytes: 374_704_357_376 }] end let(:parsed_fact) do { '/' => { 'available' => '63.31 GiB', 'available_bytes' => 67_979_685_888, 'capacity' => '84.64%', 'device' => '/dev/nvme0n1p2', 'filesystem' => 'ext4', 'options' => %w[rw noatime], 'size' => '434.42 GiB', 'size_bytes' => 466_449_743_872, 'used' => '348.97 GiB', 'used_bytes' => 374_704_357_376 } } end before do allow(Facter::Resolvers::Mountpoints).to receive(:resolve).with(:mountpoints).and_return(resolver_output) end it 'returns mountpoints information' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'mountpoints', value: parsed_fact) end end context 'when resolver returns nil' do before do allow(Facter::Resolvers::Mountpoints).to receive(:resolve).with(:mountpoints).and_return(nil) end it 'returns mountpoints information' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'mountpoints', value: nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/netmask6_interfaces_spec.rb000066400000000000000000000022361470204764400301340ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Netmask6Interfaces do subject(:fact) { Facts::Freebsd::Netmask6Interfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) do { 'eth0' => { netmask6: 'fe80::99bf:da20:ad3:9bfe' }, 'en1' => { netmask6: 'fe80::99bf:da20:ad3:9bfe' } } end it 'returns legacy facts with names netmask6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'netmask6_eth0', value: interfaces['eth0'][:netmask6], type: :legacy), an_object_having_attributes(name: 'netmask6_en1', value: interfaces['en1'][:netmask6], type: :legacy)) end end describe '#call_the_resolver when resolver return nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/netmask_interfaces_spec.rb000066400000000000000000000021541470204764400300450ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::NetmaskInterfaces do subject(:fact) { Facts::Freebsd::NetmaskInterfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { netmask: '10.255.255.255' }, 'en1' => { netmask: '10.17.255.255' } } } it 'returns legacy facts with names netmask_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'netmask_eth0', value: interfaces['eth0'][:netmask], type: :legacy), an_object_having_attributes(name: 'netmask_en1', value: interfaces['en1'][:netmask], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/network6_interfaces_spec.rb000066400000000000000000000021431470204764400301600ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Network6Interfaces do subject(:fact) { Facts::Freebsd::Network6Interfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { network6: '::1' }, 'en1' => { network6: 'fe80::' } } } it 'returns legacy facts with names network6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'network6_eth0', value: interfaces['eth0'][:network6], type: :legacy), an_object_having_attributes(name: 'network6_en1', value: interfaces['en1'][:network6], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/network_interfaces_spec.rb000066400000000000000000000021541470204764400300740ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::NetworkInterfaces do subject(:fact) { Facts::Freebsd::NetworkInterfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { network: '10.255.255.255' }, 'en1' => { network: '10.17.255.255' } } } it 'returns legacy facts with names network_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'network_eth0', value: interfaces['eth0'][:network], type: :legacy), an_object_having_attributes(name: 'network_en1', value: interfaces['en1'][:network], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/networking/000077500000000000000000000000001470204764400250265ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/networking/dhcp_spec.rb000066400000000000000000000014451470204764400273070ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Networking::Dhcp do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Networking::Dhcp.new } let(:value) { '192.168.158.6' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:dhcp).and_return(value) end it 'returns networking.dhcp fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.dhcp', value: value) end context 'when dhcp can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.dhcp', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/networking/domain_spec.rb000066400000000000000000000020031470204764400276270ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Networking::Domain do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Networking::Domain.new } let(:value) { 'domain' } before do allow(Facter::Resolvers::Hostname).to receive(:resolve).with(:domain).and_return(value) end it 'returns domain fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.domain', value: value), an_object_having_attributes(name: 'domain', value: value, type: :legacy)) end context 'when domain can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.domain', value: value), an_object_having_attributes(name: 'domain', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/networking/fqdn_spec.rb000066400000000000000000000017661470204764400273270ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Networking::Fqdn do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Networking::Fqdn.new } let(:value) { 'host.domain' } before do allow(Facter::Resolvers::Hostname).to receive(:resolve).with(:fqdn).and_return(value) end it 'returns fqdn fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.fqdn', value: value), an_object_having_attributes(name: 'fqdn', value: value, type: :legacy)) end context 'when fqdn can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.fqdn', value: value), an_object_having_attributes(name: 'fqdn', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/networking/hostname_spec.rb000066400000000000000000000020231470204764400302000ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Networking::Hostname do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Networking::Hostname.new } let(:value) { 'host' } before do allow(Facter::Resolvers::Hostname).to receive(:resolve).with(:hostname).and_return(value) end it 'returns hostname fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.hostname', value: value), an_object_having_attributes(name: 'hostname', value: value, type: :legacy)) end context 'when hostname can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.hostname', value: value), an_object_having_attributes(name: 'hostname', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/networking/interfaces_spec.rb000066400000000000000000000100771470204764400305150ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Networking::Interfaces do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Networking::Interfaces.new } let(:interfaces) do { 'awdl0' => { mtu: 1484, mac: '2e:ba:e4:83:4b:b7', bindings6: [{ address: 'fe80::2cba:e4ff:fe83:4bb7', netmask: 'ffff:ffff:ffff:ffff::', network: 'fe80::' }], ip6: 'fe80::2cba:e4ff:fe83:4bb7', netmask6: 'ffff:ffff:ffff:ffff::', network6: 'fe80::' }, 'bridge0' => { mtu: 1500, mac: '82:17:0e:93:9d:00' }, 'en0' => { dhcp: '192.587.6.9', mtu: 1500, mac: '64:5a:ed:ea:5c:81', bindings: [{ address: '192.168.1.2', netmask: '255.255.255.0', network: '192.168.1.0' }], ip: '192.168.1.2', netmask: '255.255.255.0', network: '192.168.1.0' }, 'gif0' => { mtu: 1280 }, 'lo0' => { mtu: 16_384, bindings: [{ address: '127.0.0.1', netmask: '255.0.0.0', network: '127.0.0.0' }], bindings6: [{ address: '::1', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network: '::1' }, { address: 'fe80::1', netmask: 'ffff:ffff:ffff:ffff::', network: 'fe80::' }], ip: '127.0.0.1', netmask: '255.0.0.0', network: '127.0.0.0', ip6: '::1', netmask6: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network6: '::1' } } end before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end it 'returns networking.interfaces fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.interfaces', value: anything) end it 'returns all interfaces' do interfaces = %w[awdl0 bridge0 en0 gif0 lo0] result = fact.call_the_resolver expect(result.value).to include(*interfaces) end it 'returns the interface awdl0 correctly' do expected = { 'mtu' => 1484, 'mac' => '2e:ba:e4:83:4b:b7', 'bindings6' => [{ 'address' => 'fe80::2cba:e4ff:fe83:4bb7', 'netmask' => 'ffff:ffff:ffff:ffff::', 'network' => 'fe80::' }], 'ip6' => 'fe80::2cba:e4ff:fe83:4bb7', 'netmask6' => 'ffff:ffff:ffff:ffff::', 'network6' => 'fe80::' } result = fact.call_the_resolver expect(result.value['awdl0']).to match(expected) end it 'returns the interface bridge0 correctly' do result = fact.call_the_resolver expect(result.value['bridge0']).to match({ 'mtu' => 1500, 'mac' => '82:17:0e:93:9d:00' }) end it 'returns the interface en0 correctly' do expected = { 'mtu' => 1500, 'mac' => '64:5a:ed:ea:5c:81', 'bindings' => [{ 'address' => '192.168.1.2', 'netmask' => '255.255.255.0', 'network' => '192.168.1.0' }], 'ip' => '192.168.1.2', 'netmask' => '255.255.255.0', 'network' => '192.168.1.0', 'dhcp' => '192.587.6.9' } result = fact.call_the_resolver expect(result.value['en0']).to match(expected) end it 'returns the interface gif0 correctly' do result = fact.call_the_resolver expect(result.value['gif0']).to match({ 'mtu' => 1280 }) end context 'when interfaces can not be retrieved' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.interfaces', value: interfaces) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/networking/ip6_spec.rb000066400000000000000000000020171470204764400270630ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Networking::Ip6 do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Networking::Ip6.new } let(:value) { 'fe80::2cba:e4ff:fe83:4bb7' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:ip6).and_return(value) end it 'returns the ip6 fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip6', value: value), an_object_having_attributes(name: 'ipaddress6', value: value, type: :legacy)) end context 'when ip6 can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip6', value: value), an_object_having_attributes(name: 'ipaddress6', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/networking/ip_spec.rb000066400000000000000000000017661470204764400270070ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Networking::Ip do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Networking::Ip.new } let(:value) { '10.0.0.1' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:ip).and_return(value) end it 'returns the ip6 fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip', value: value), an_object_having_attributes(name: 'ipaddress', value: value, type: :legacy)) end context 'when ip can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip', value: value), an_object_having_attributes(name: 'ipaddress', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/networking/mac_spec.rb000066400000000000000000000020121470204764400271200ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Networking::Mac do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Networking::Mac.new } let(:value) { '64:5a:ed:ea:c3:25' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:mac).and_return(value) end it 'returns macaddress fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.mac', value: value), an_object_having_attributes(name: 'macaddress', value: value, type: :legacy)) end context 'when mac can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.mac', value: value), an_object_having_attributes(name: 'macaddress', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/networking/mtu_spec.rb000066400000000000000000000014101470204764400271660ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Networking::Mtu do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Networking::Mtu.new } let(:value) { 1500 } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:mtu).and_return(value) end it 'returns mtu fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.mtu', value: value) end context 'when mtu can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.mtu', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/networking/netmask6_spec.rb000066400000000000000000000020521470204764400301140ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Networking::Netmask6 do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Networking::Netmask6.new } let(:value) { 'ffff:ffff:ffff:ffff::' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:netmask6).and_return(value) end it 'returns the netmask6 fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask6', value: value), an_object_having_attributes(name: 'netmask6', value: value, type: :legacy)) end context 'when netmask6 can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask6', value: value), an_object_having_attributes(name: 'netmask6', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/networking/netmask_spec.rb000066400000000000000000000020311470204764400300230ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Networking::Netmask do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Networking::Netmask.new } let(:value) { '255.255.255.0' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:netmask).and_return(value) end it 'returns the netmask fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask', value: value), an_object_having_attributes(name: 'netmask', value: value, type: :legacy)) end context 'when netmask can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask', value: value), an_object_having_attributes(name: 'netmask', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/networking/network6_spec.rb000066400000000000000000000020401470204764400301400ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Networking::Network6 do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Networking::Network6.new } let(:value) { 'ff80:3454::' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:network6).and_return(value) end it 'returns the network6 fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network6', value: value), an_object_having_attributes(name: 'network6', value: value, type: :legacy)) end context 'when network6 can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network6', value: value), an_object_having_attributes(name: 'network6', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/networking/network_spec.rb000066400000000000000000000020311470204764400300520ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Networking::Network do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Networking::Network.new } let(:value) { '192.168.143.0' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:network).and_return(value) end it 'returns the network fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network', value: value), an_object_having_attributes(name: 'network', value: value, type: :legacy)) end context 'when network can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network', value: value), an_object_having_attributes(name: 'network', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/networking/primary_spec.rb000066400000000000000000000015041470204764400300500ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Networking::Primary do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Networking::Primary.new } let(:value) { 'en0' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:primary_interface).and_return(value) end it 'returns networking.primary fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.primary', value: value) end context 'when primary interface can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.primary', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/networking/scope6_spec.rb000066400000000000000000000014621470204764400275670ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Networking::Scope6 do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Networking::Scope6.new } let(:value) { 'link' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:scope6).and_return(value) end it 'returns scope6 fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.scope6', value: value) end context 'when scope6 can not be resolved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.scope6', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/os/000077500000000000000000000000001470204764400232605ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/os/architecture_spec.rb000066400000000000000000000011771470204764400273070ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Os::Architecture do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Os::Architecture.new } let(:value) { 'amd64' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:machine).and_return(value) end it 'returns architecture fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.architecture', value: value), an_object_having_attributes(name: 'architecture', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/os/hardware_spec.rb000066400000000000000000000011661470204764400264200ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Os::Hardware do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Os::Hardware.new } let(:value) { 'amd64' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:machine).and_return(value) end it 'returns hardware model fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.hardware', value: value), an_object_having_attributes(name: 'hardwaremodel', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/os/name_spec.rb000066400000000000000000000011701470204764400255360ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Os::Name do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Os::Name.new } let(:value) { 'FreeBSD' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelname).and_return(value) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.name', value: value), an_object_having_attributes(name: 'operatingsystem', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/os/release_spec.rb000066400000000000000000000057121470204764400262440ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Os::Release.new } before do allow(Facter::Resolvers::Freebsd::FreebsdVersion).to receive(:resolve).with(:installed_userland).and_return(value) end context 'when FreeBSD RELEASE' do let(:value) { '12.1-RELEASE-p3' } it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: { 'full' => value, 'major' => '12', 'minor' => '1', 'branch' => 'RELEASE-p3', 'patchlevel' => '3' }), an_object_having_attributes(name: 'operatingsystemmajrelease', value: '12', type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: value, type: :legacy)) end end context 'when FreeBSD STABLE' do let(:value) { '12.1-STABLE' } it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: { 'full' => value, 'major' => '12', 'minor' => '1', 'branch' => 'STABLE' }), an_object_having_attributes(name: 'operatingsystemmajrelease', value: '12', type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: value, type: :legacy)) end end context 'when FreeBSD CURRENT' do let(:value) { '13-CURRENT' } it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: { 'full' => value, 'major' => '13', 'branch' => 'CURRENT' }), an_object_having_attributes(name: 'operatingsystemmajrelease', value: '13', type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/partitions_spec.rb000066400000000000000000000013671470204764400264010ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Partitions do subject(:fact) { Facts::Freebsd::Partitions.new } let(:partitions) do { 'ada0p1' => { 'partlabel' => 'gptboot0', 'partuuid' => '503d3458-c135-11e8-bd11-7d7cd061b26f', 'size' => '512.00 KiB', 'size_bytes' => 524_288 } } end describe '#call_the_resolver' do before do allow(Facter::Resolvers::Freebsd::Geom).to receive(:resolve).with(:partitions).and_return(partitions) end it 'returns resolved fact with name partitions and value' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'partitions', value: partitions) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/path_spec.rb000066400000000000000000000010331470204764400251270ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Path do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Path.new } let(:value) { '/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin' } before do allow(Facter::Resolvers::Path).to \ receive(:resolve).with(:path).and_return(value) end it 'returns path fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'path', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/processors/000077500000000000000000000000001470204764400250415ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/processors/count_spec.rb000066400000000000000000000012601470204764400275270ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Processors::Count do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Processors::Count.new } let(:processors) { '4' } before do allow(Facter::Resolvers::Freebsd::Processors).to \ receive(:resolve).with(:logical_count).and_return(processors) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.count', value: processors), an_object_having_attributes(name: 'processorcount', value: processors, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/processors/isa_spec.rb000066400000000000000000000011741470204764400271570ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Processors::Isa do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Processors::Isa.new } let(:isa) { 'i386' } before do allow(Facter::Resolvers::Uname).to \ receive(:resolve).with(:processor).and_return(isa) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.isa', value: isa), an_object_having_attributes(name: 'hardwareisa', value: isa, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/processors/models_spec.rb000066400000000000000000000015101470204764400276600ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Processors::Models do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Processors::Models.new } let(:value) { 'Intel(R) Core(TM) i7-4980HQ CPU @ 2.80GHz' } let(:models) { [value, value] } before do allow(Facter::Resolvers::Freebsd::Processors).to \ receive(:resolve).with(:models).and_return(models) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.models', value: models), an_object_having_attributes(name: 'processor0', value: value, type: :legacy), an_object_having_attributes(name: 'processor1', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/processors/speed_spec.rb000066400000000000000000000011311470204764400274740ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Processors::Speed do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Processors::Speed.new } let(:speed) { 1_800_000_000 } let(:converted_speed) { '1.80 GHz' } before do allow(Facter::Resolvers::Freebsd::Processors).to \ receive(:resolve).with(:speed).and_return(speed) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'processors.speed', value: converted_speed) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/ruby/000077500000000000000000000000001470204764400236205ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/ruby/platform_spec.rb000066400000000000000000000012031470204764400267770ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Ruby::Platform do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Ruby::Platform.new } let(:value) { 'amd64-freebsd12' } before do allow(Facter::Resolvers::Ruby).to receive(:resolve).with(:platform).and_return(value) end it 'return ruby.platform fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ruby.platform', value: value), an_object_having_attributes(name: 'rubyplatform', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/ruby/sitedir_spec.rb000066400000000000000000000012351470204764400266230ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Ruby::Sitedir do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Ruby::Sitedir.new } let(:value) { '/opt/puppetlabs/puppet/lib/ruby/site_ruby/2.5.0' } before do allow(Facter::Resolvers::Ruby).to receive(:resolve).with(:sitedir).and_return(value) end it 'return ruby sitedir fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ruby.sitedir', value: value), an_object_having_attributes(name: 'rubysitedir', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/ruby/version_spec.rb000066400000000000000000000012011470204764400266360ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Ruby::Version do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Ruby::Version.new } let(:value) { '2.5.9' } before do allow(Facter::Resolvers::Ruby).to receive(:resolve).with(:version).and_return(value) end it 'returns ruby version fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'ruby.version', value: value), an_object_having_attributes(name: 'rubyversion', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/ssh_spec.rb000066400000000000000000000014741470204764400250010ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Ssh do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Ssh.new } let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'ecdsa', 'test', 'ecdsa')] end let(:value) do { 'ecdsa' => { 'fingerprints' => { 'sha1' => 'test', 'sha256' => 'test' }, 'key' => 'test', 'type' => 'ecdsa' } } end before do allow(Facter::Resolvers::Ssh).to \ receive(:resolve).with(:ssh).and_return(ssh) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ssh', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/sshalgorithmkey_spec.rb000066400000000000000000000020441470204764400274130ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Sshalgorithmkey do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Sshalgorithmkey.new } let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'ecdsa', 'test', 'ecdsa'), Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'rsa', 'test', 'rsa')] end let(:legacy_fact1) { { name: 'ecdsa', value: 'test' } } let(:legacy_fact2) { { name: 'rsa', value: 'test' } } before do allow(Facter::Resolvers::Ssh).to \ receive(:resolve).with(:ssh).and_return(ssh) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: "ssh#{legacy_fact1[:name]}key", value: legacy_fact1[:value]), an_object_having_attributes(name: "ssh#{legacy_fact2[:name]}key", value: legacy_fact2[:value])) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/sshfp_algorithm_spec.rb000066400000000000000000000020761470204764400273740ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::SshfpAlgorithm do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::SshfpAlgorithm.new } let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('sha11', 'sha2561'), 'ecdsa', 'test', 'ecdsa'), Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('sha12', 'sha2562'), 'rsa', 'test', 'rsa')] end let(:legacy_fact1) { { name: 'ecdsa', value: "sha11\nsha2561" } } let(:legacy_fact2) { { name: 'rsa', value: "sha12\nsha2562" } } before do allow(Facter::Resolvers::Ssh).to \ receive(:resolve).with(:ssh).and_return(ssh) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: "sshfp_#{legacy_fact1[:name]}", value: legacy_fact1[:value]), an_object_having_attributes(name: "sshfp_#{legacy_fact2[:name]}", value: legacy_fact2[:value])) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/system_uptime/000077500000000000000000000000001470204764400255465ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/system_uptime/days_spec.rb000066400000000000000000000012021470204764400300400ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::SystemUptime::Days do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::SystemUptime::Days.new } let(:value) { '2' } before do allow(Facter::Resolvers::Uptime).to receive(:resolve).with(:days).and_return(value) end it 'returns days since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.days', value: value), an_object_having_attributes(name: 'uptime_days', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/system_uptime/hours_spec.rb000066400000000000000000000012101470204764400302370ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::SystemUptime::Hours do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::SystemUptime::Hours.new } let(:value) { '2' } before do allow(Facter::Resolvers::Uptime).to receive(:resolve).with(:hours).and_return(value) end it 'returns hours since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.hours', value: value), an_object_having_attributes(name: 'uptime_hours', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/system_uptime/seconds_spec.rb000066400000000000000000000012251470204764400305430ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::SystemUptime::Seconds do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::SystemUptime::Seconds.new } let(:value) { 3600 } before do allow(Facter::Resolvers::Uptime).to receive(:resolve).with(:seconds).and_return(value) end it 'returns minutes since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.seconds', value: value), an_object_having_attributes(name: 'uptime_seconds', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/system_uptime/uptime_spec.rb000066400000000000000000000012221470204764400304050ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::SystemUptime::Uptime do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::SystemUptime::Uptime.new } let(:value) { '6 days' } before do allow(Facter::Resolvers::Uptime).to receive(:resolve).with(:uptime).and_return(value) end it 'returns total uptime since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.uptime', value: value), an_object_having_attributes(name: 'uptime', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/timezone_spec.rb000066400000000000000000000010051470204764400260240ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Timezone do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Timezone.new } let(:timezone) { 'UTC' } before do allow(Facter::Resolvers::Timezone).to \ receive(:resolve).with(:timezone).and_return(timezone) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'timezone', value: timezone) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/virtual_spec.rb000066400000000000000000000016441470204764400256710ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::Virtual do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::Virtual.new } let(:virtual_detector_double) { class_spy(Facter::Util::Facts::Posix::VirtualDetector) } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return(value) end shared_examples 'check resolved fact value' do it 'return resolved fact with nil value' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'virtual', value: value) end end context 'when not in a virtual environment' do let(:value) { 'physical' } it_behaves_like 'check resolved fact value' end context 'when in a virtual environment' do let(:value) { 'jail' } it_behaves_like 'check resolved fact value' end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/zfs_featurenumbers_spec.rb000066400000000000000000000010771470204764400301140ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::ZfsFeaturenumbers do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::ZfsFeaturenumbers.new } let(:feature_numbers) { '1,2,3,4,5' } before do allow(Facter::Resolvers::ZFS).to receive(:resolve).with(:zfs_featurenumbers).and_return(feature_numbers) end it 'returns zfs_featurenumbers fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'zfs_featurenumbers', value: feature_numbers) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/zfs_version_spec.rb000066400000000000000000000007741470204764400265550ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::ZfsVersion do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::ZfsVersion.new } let(:version) { '6' } before do allow(Facter::Resolvers::ZFS).to receive(:resolve).with(:zfs_version).and_return(version) end it 'returns zfs_version fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'zfs_version', value: version) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/zpool_featureflags_spec.rb000066400000000000000000000012411470204764400300670ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::ZpoolFeatureflags do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::ZpoolFeatureflags.new } let(:zpool_feature_flags) { 'async_destroy,empty_bpobj,lz4_compress,multi_vdev_crash_dump,spacemap_histogram' } before do allow(Facter::Resolvers::Zpool).to \ receive(:resolve).with(:zpool_featureflags).and_return(zpool_feature_flags) end it 'returns the zpool_featureflags fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'zpool_featureflags', value: zpool_feature_flags) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/zpool_featurenumbers_spec.rb000066400000000000000000000011541470204764400304510ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::ZpoolFeaturenumbers do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::ZpoolFeaturenumbers.new } let(:zpool_featurenumbers) { '1,2,3,4,5,6,7' } before do allow(Facter::Resolvers::Zpool).to \ receive(:resolve).with(:zpool_featurenumbers).and_return(zpool_featurenumbers) end it 'returns the zpool_featurenumbers fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'zpool_featurenumbers', value: zpool_featurenumbers) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/freebsd/zpool_version_spec.rb000066400000000000000000000010141470204764400271020ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Freebsd::ZpoolVersion do describe '#call_the_resolver' do subject(:fact) { Facts::Freebsd::ZpoolVersion.new } let(:version) { '5' } before do allow(Facter::Resolvers::Zpool).to receive(:resolve).with(:zpool_version).and_return(version) end it 'returns the ZPool version fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'zpool_version', value: version) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/gentoo/000077500000000000000000000000001470204764400225205ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/gentoo/os/000077500000000000000000000000001470204764400231415ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/gentoo/os/release_spec.rb000066400000000000000000000045111470204764400261210ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Gentoo::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Gentoo::Os::Release.new } before do allow(Facter::Resolvers::ReleaseFromFirstLine).to receive(:resolve) .with(:release, { release_file: '/etc/gentoo-release' }) .and_return(value) end context 'when version is retrieved from specific file' do let(:value) { '2007.0' } let(:release) { { 'full' => '2007.0', 'major' => '2007', 'minor' => '0' } } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end end context 'when version is retrieved from os-release file' do let(:value) { nil } let(:os_release) { '2007.0' } let(:release) { { 'full' => '2007.0', 'major' => '2007', 'minor' => '0' } } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(os_release) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end context 'when release can\'t be received' do let(:os_release) { nil } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.release', value: nil) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/000077500000000000000000000000001470204764400223645ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linux/aio_agent_version_spec.rb000066400000000000000000000010361470204764400274160ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::AioAgentVersion do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::AioAgentVersion.new } let(:value) { '1.2.3' } before do allow(Facter::Resolvers::AioAgentVersion).to receive(:resolve).with(:aio_agent_version).and_return(value) end it 'returns aio_agent_version fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'aio_agent_version', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/augeas/000077500000000000000000000000001470204764400236315ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linux/augeas/version_spec.rb000066400000000000000000000012221470204764400266520ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Augeas::Version do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Augeas::Version.new } let(:version) { '1.12.0' } before do allow(Facter::Resolvers::Augeas).to \ receive(:resolve).with(:augeas_version).and_return(version) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'augeas.version', value: version), an_object_having_attributes(name: 'augeasversion', value: version, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/az_metadata_spec.rb000066400000000000000000000032741470204764400262030ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::AzMetadata do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::AzMetadata.new } let(:virtual_detector_double) { class_spy(Facter::Util::Facts::Posix::VirtualDetector) } before do allow(Facter::Resolvers::Az).to receive(:resolve).with(:metadata).and_return(value) end context 'when physical machine with no hypervisor' do let(:value) { nil } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return(nil) end it 'returns az metadata fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'az_metadata', value: value) end it "doesn't call az resolver" do fact.call_the_resolver expect(Facter::Resolvers::Az).not_to have_received(:resolve).with(:metadata) end end context 'when platform is hyperv' do let(:value) { { 'info' => 'value' } } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('hyperv') end context 'when on Azure' do it 'returns az_metadata fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'az_metadata', value: value) end end context 'when not on Azure' do let(:value) { nil } it 'returns az_metadata fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'az_metadata', value: value) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/cloud/000077500000000000000000000000001470204764400234725ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linux/cloud/provider_spec.rb000066400000000000000000000076461470204764400267000ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Cloud::Provider do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Cloud::Provider.new } context 'when on hyperv' do before do allow(Facter::Resolvers::Az).to receive(:resolve).with(:metadata).and_return(value) allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('hyperv') end context 'when az_metadata exists' do let(:value) { { 'some' => 'fact' } } it 'returns azure as cloud.provider' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'cloud.provider', value: 'azure') end end context 'when az_metadata does not exist' do let(:value) { {} } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'cloud.provider', value: nil) end end end context 'when on a physical machine' do before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return(nil) end it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'cloud.provider', value: nil) end end describe 'when on kvm' do before do allow(Facter::Resolvers::Ec2).to receive(:resolve).with(:metadata).and_return(value) allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('kvm') end describe 'Ec2 data exists and aws fact is set' do let(:value) { { 'some' => 'fact' } } it 'Testing things' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'cloud.provider', value: 'aws') end end context 'when Ec2 data does not exist nil is returned' do let(:value) { {} } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'cloud.provider', value: nil) end end end describe 'when on xen' do before do allow(Facter::Resolvers::Ec2).to receive(:resolve).with(:metadata).and_return(value) allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('xen') end describe 'Ec2 data exists and aws fact is set' do let(:value) { { 'some' => 'fact' } } it 'Testing things' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'cloud.provider', value: 'aws') end end context 'when Ec2 data does not exist nil is returned' do let(:value) { {} } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'cloud.provider', value: nil) end end end describe 'when on gce' do before do allow(Facter::Resolvers::Gce).to receive(:resolve).with(:metadata).and_return(value) allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('gce') end describe 'and the "gce" fact has content' do let(:value) { { 'some' => 'metadata' } } it 'resolves a provider of "gce"' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'cloud.provider', value: 'gce') end end context 'when the "gce" fact has no content' do let(:value) { {} } it 'resolves to nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'cloud.provider', value: nil) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/dhcp_servers_spec.rb000066400000000000000000000021731470204764400264150ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::DhcpServers do subject(:fact) { Facts::Linux::DhcpServers.new } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:dhcp).and_return(dhcp) end describe '#call_the_resolver' do let(:value) { { 'system' => '10.16.122.163', 'eth0' => '10.16.122.163', 'en1' => '10.32.10.163' } } let(:interfaces) { { 'eth0' => { dhcp: '10.16.122.163' }, 'en1' => { dhcp: '10.32.10.163' } } } let(:dhcp) { '10.16.122.163' } it 'returns dhcp_servers' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'dhcp_servers', value: value, type: :legacy) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } let(:dhcp) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'dhcp_servers', value: nil, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/disks_spec.rb000066400000000000000000000035011470204764400250370ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Disks do subject(:fact) { Facts::Linux::Disks.new } let(:disk) do { 'sda' => { model: 'Virtual disk', size: '20.00 GiB', size_bytes: 21_474_836_480, vendor: 'VMware' } } end let(:expecte_response) do { 'sda' => { 'model' => 'Virtual disk', 'size' => '20.00 GiB', 'size_bytes' => 21_474_836_480, 'vendor' => 'VMware' } } end describe '#call_the_resolver' do before do allow(Facter::Resolvers::Linux::Disks).to receive(:resolve).with(:disks).and_return(disk) end it 'returns resolved fact with name disk and value' do expect(fact.call_the_resolver) .to be_an_instance_of(Array) .and contain_exactly( an_object_having_attributes(name: 'disks', value: expecte_response), an_object_having_attributes(name: 'blockdevices', value: 'sda'), an_object_having_attributes(name: 'blockdevice_sda_model', value: 'Virtual disk', type: :legacy), an_object_having_attributes(name: 'blockdevice_sda_size', value: 21_474_836_480, type: :legacy), an_object_having_attributes(name: 'blockdevice_sda_vendor', value: 'VMware', type: :legacy) ) end context 'when resolver returns empty hash' do let(:disk) { {} } it 'returns nil fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'disks', value: nil) end end context 'when resolver returns nil' do let(:disk) { nil } it 'returns nil fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'disks', value: nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/dmi/000077500000000000000000000000001470204764400231355ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linux/dmi/bios/000077500000000000000000000000001470204764400240715ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linux/dmi/bios/release_date_spec.rb000066400000000000000000000012551470204764400300500ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Dmi::Bios::ReleaseDate do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Dmi::Bios::ReleaseDate.new } let(:date) { '07/03/2018' } before do allow(Facter::Resolvers::Linux::DmiBios).to \ receive(:resolve).with(:bios_date).and_return(date) end it 'returns bios release date fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.bios.release_date', value: date), an_object_having_attributes(name: 'bios_release_date', value: date, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/dmi/bios/vendor_spec.rb000066400000000000000000000012511470204764400267240ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Dmi::Bios::Vendor do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Dmi::Bios::Vendor.new } let(:vendor) { 'Phoenix Technologies LTD' } before do allow(Facter::Resolvers::Linux::DmiBios).to \ receive(:resolve).with(:bios_vendor).and_return(vendor) end it 'returns bios vendor fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.bios.vendor', value: vendor), an_object_having_attributes(name: 'bios_vendor', value: vendor, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/dmi/bios/version_spec.rb000066400000000000000000000012371470204764400271200ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Dmi::Bios::Version do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Dmi::Bios::Version.new } let(:version) { '6.00' } before do allow(Facter::Resolvers::Linux::DmiBios).to \ receive(:resolve).with(:bios_version).and_return(version) end it 'returns bios version fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.bios.version', value: version), an_object_having_attributes(name: 'bios_version', value: version, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/dmi/board/000077500000000000000000000000001470204764400242245ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linux/dmi/board/asset_tag_spec.rb000066400000000000000000000012761470204764400275430ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Dmi::Board::AssetTag do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Dmi::Board::AssetTag.new } let(:asset_tag) { 'Not Specified' } before do allow(Facter::Resolvers::Linux::DmiBios).to \ receive(:resolve).with(:board_asset_tag).and_return(asset_tag) end it 'returns board asset_tag fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.board.asset_tag', value: asset_tag), an_object_having_attributes(name: 'boardassettag', value: asset_tag, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/dmi/board/manufacturer_spec.rb000066400000000000000000000013351470204764400302610ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Dmi::Board::Manufacturer do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Dmi::Board::Manufacturer.new } let(:manufacturer) { 'Intel Corporation' } before do allow(Facter::Resolvers::Linux::DmiBios).to \ receive(:resolve).with(:board_vendor).and_return(manufacturer) end it 'returns board manufacturer fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.board.manufacturer', value: manufacturer), an_object_having_attributes(name: 'boardmanufacturer', value: manufacturer, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/dmi/board/product_spec.rb000066400000000000000000000013011470204764400272360ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Dmi::Board::Product do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Dmi::Board::Product.new } let(:product) { '440BX Desktop Reference Platform' } before do allow(Facter::Resolvers::Linux::DmiBios).to \ receive(:resolve).with(:board_name).and_return(product) end it 'returns board product fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.board.product', value: product), an_object_having_attributes(name: 'boardproductname', value: product, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/dmi/board/serial_number_spec.rb000066400000000000000000000013261470204764400304140ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Dmi::Board::SerialNumber do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Dmi::Board::SerialNumber.new } let(:serial_number) { 'None' } before do allow(Facter::Resolvers::Linux::DmiBios).to \ receive(:resolve).with(:board_serial).and_return(serial_number) end it 'returns board serial number fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.board.serial_number', value: serial_number), an_object_having_attributes(name: 'boardserialnumber', value: serial_number, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/dmi/chassis/000077500000000000000000000000001470204764400245725ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linux/dmi/chassis/asset_tag_spec.rb000066400000000000000000000012611470204764400301030ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Dmi::Chassis::AssetTag do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Dmi::Chassis::AssetTag.new } let(:tag) { 'No Asset Tag' } before do allow(Facter::Resolvers::Linux::DmiBios).to \ receive(:resolve).with(:chassis_asset_tag).and_return(tag) end it 'returns chassis asset tag fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.chassis.asset_tag', value: tag), an_object_having_attributes(name: 'chassisassettag', value: tag, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/dmi/chassis/type_spec.rb000066400000000000000000000012411470204764400271100ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Dmi::Chassis::Type do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Dmi::Chassis::Type.new } let(:type) { 'Low Profile Desktop' } before do allow(Facter::Resolvers::Linux::DmiBios).to \ receive(:resolve).with(:chassis_type).and_return(type) end it 'returns chassis type fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.chassis.type', value: type), an_object_having_attributes(name: 'chassistype', value: type, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/dmi/manufacturer_spec.rb000066400000000000000000000012571470204764400271750ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Dmi::Manufacturer do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Dmi::Manufacturer.new } let(:sys_vendor) { 'VMware, Inc.' } before do allow(Facter::Resolvers::Linux::DmiBios).to \ receive(:resolve).with(:sys_vendor).and_return(sys_vendor) end it 'returns manufacturer fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.manufacturer', value: sys_vendor), an_object_having_attributes(name: 'manufacturer', value: sys_vendor, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/dmi/product/000077500000000000000000000000001470204764400246155ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linux/dmi/product/name_spec.rb000066400000000000000000000013051470204764400270730ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Dmi::Product::Name do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Dmi::Product::Name.new } let(:product_name) { 'VMware Virtual Platform' } before do allow(Facter::Resolvers::Linux::DmiBios).to \ receive(:resolve).with(:product_name).and_return(product_name) end it 'returns product name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.product.name', value: product_name), an_object_having_attributes(name: 'productname', value: product_name, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/dmi/product/serial_number_spec.rb000066400000000000000000000014011470204764400307770ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Dmi::Product::SerialNumber do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Dmi::Product::SerialNumber.new } let(:serial_number) { 'VMware-42 1a a9 29 31 8f fa e9-7d 69 2e 23 21 b0 0c 45' } before do allow(Facter::Resolvers::Linux::DmiBios).to \ receive(:resolve).with(:product_serial).and_return(serial_number) end it 'returns resolved facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.product.serial_number', value: serial_number), an_object_having_attributes(name: 'serialnumber', value: serial_number, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/dmi/product/uuid_spec.rb000066400000000000000000000013101470204764400271150ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Dmi::Product::Uuid do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Dmi::Product::Uuid.new } let(:product_uuid) { '421aa929-318f-fae9-7d69-2e2321b00c45' } before do allow(Facter::Resolvers::Linux::DmiBios).to \ receive(:resolve).with(:product_uuid).and_return(product_uuid) end it 'returns resolved facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.product.uuid', value: product_uuid), an_object_having_attributes(name: 'uuid', value: product_uuid, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/ec2_metadata_spec.rb000066400000000000000000000043721470204764400262420ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Ec2Metadata do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Ec2Metadata.new } let(:virtual_detector_double) { class_spy(Facter::Util::Facts::Posix::VirtualDetector) } before do allow(Facter::Resolvers::Ec2).to receive(:resolve).with(:metadata).and_return(value) end context 'when physical machine with no hypervisor' do let(:value) { nil } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return(nil) end it 'returns ec2 metadata fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ec2_metadata', value: value) end it "doesn't call Ec2 resolver" do fact.call_the_resolver expect(Facter::Resolvers::Ec2).not_to have_received(:resolve).with(:metadata) end end shared_examples 'check ec2 resolver called with metadata' do end shared_examples 'check resolved fact value' do it 'returns ec2 metadata fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ec2_metadata', value: value) end end context 'when platform is kvm' do let(:value) { { 'info' => 'value' } } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('kvm') end it_behaves_like 'check ec2 resolver called with metadata' it_behaves_like 'check resolved fact value' end context 'when platform is xen' do let(:value) { { 'info' => 'value' } } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('xen') end it_behaves_like 'check ec2 resolver called with metadata' it_behaves_like 'check resolved fact value' end context 'when platform is aws' do let(:value) { { 'info' => 'value' } } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('aws') end it_behaves_like 'check ec2 resolver called with metadata' it_behaves_like 'check resolved fact value' end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/ec2_userdata_spec.rb000066400000000000000000000043741470204764400262740ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Ec2Userdata do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Ec2Userdata.new } let(:virtual_detector_double) { class_spy(Facter::Util::Facts::Posix::VirtualDetector) } before do allow(Facter::Resolvers::Ec2).to receive(:resolve).with(:userdata).and_return(value) end context 'when physical machine with no hypervisor' do let(:value) { nil } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('nil') end it 'returns ec2 userdata fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ec2_userdata', value: value) end it "doesn't call Ec2 resolver" do fact.call_the_resolver expect(Facter::Resolvers::Ec2).not_to have_received(:resolve).with(:userdata) end end shared_examples 'check ec2 resolver called with userdata' do end shared_examples 'check resolved fact value' do it 'returns ec2 userdata fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ec2_userdata', value: value) end end context 'when platform is kvm' do let(:value) { { 'info' => 'value' } } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('kvm') end it_behaves_like 'check ec2 resolver called with userdata' it_behaves_like 'check resolved fact value' end context 'when platform is xen' do let(:value) { { 'info' => 'value' } } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('xen') end it_behaves_like 'check ec2 resolver called with userdata' it_behaves_like 'check resolved fact value' end context 'when platform is aws' do let(:value) { { 'info' => 'value' } } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('aws') end it_behaves_like 'check ec2 resolver called with userdata' it_behaves_like 'check resolved fact value' end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/facterversion_spec.rb000066400000000000000000000010141470204764400265710ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Facterversion do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Facterversion.new } let(:value) { '4.0.3' } before do allow(Facter::Resolvers::Facterversion).to receive(:resolve).with(:facterversion).and_return(value) end it 'returns facterversion fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'facterversion', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/filesystems_spec.rb000066400000000000000000000010331470204764400262670ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Filesystems do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Filesystems.new } let(:value) { 'ext2,ext3,ext4,xfs' } before do allow(Facter::Resolvers::Linux::Filesystems).to \ receive(:resolve).with(:systems).and_return(value) end it 'returns file systems fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'filesystems', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/fips_enabled_spec.rb000066400000000000000000000010211470204764400263300ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::FipsEnabled do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::FipsEnabled.new } let(:value) { true } before do allow(Facter::Resolvers::Linux::FipsEnabled).to \ receive(:resolve).with(:fips_enabled).and_return(value) end it 'returns fips enabled fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'fips_enabled', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/gce_spec.rb000066400000000000000000000023211470204764400244570ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Gce do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Gce.new } before do allow(Facter::Resolvers::Gce).to receive(:resolve).with(:metadata).and_return(value) allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return(vendor) end context 'when hypervisor is Gce' do let(:vendor) { 'Google' } let(:value) do { 'oslogin' => { 'authenticate' => { 'sessions' => {} } }, 'project' => { 'numericProjectId' => 728_618_928_092, 'projectId' => 'facter-performance-history' } } end it 'returns gce fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'gce', value: value) end end context 'when hypervisor is not Gce' do let(:vendor) { 'unknown' } let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'gce', value: nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/hypervisors/000077500000000000000000000000001470204764400247615ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linux/hypervisors/docker_spec.rb000066400000000000000000000030441470204764400275700ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Hypervisors::Docker do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Hypervisors::Docker.new } before do allow(Facter::Resolvers::Containers).to \ receive(:resolve).with(:hypervisor).and_return(hv) end context 'when resolver returns docker' do let(:hv) { { docker: { 'id' => 'testid' } } } let(:value) { { 'id' => 'testid' } } it 'returns virtual fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.docker', value: value) end end context 'when resolver returns lxc' do let(:hv) { { lxc: { 'name' => 'test_name' } } } it 'returns virtual fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.docker', value: nil) end end context 'when resolver returns nil' do let(:hv) { nil } it 'returns virtual fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.docker', value: hv) end end context 'when docker info is empty' do let(:hv) { { docker: {} } } let(:value) { {} } it 'returns virtual fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.docker', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/hypervisors/hyper_v_spec.rb000066400000000000000000000036701470204764400300020ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Hypervisors::HyperV do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Hypervisors::HyperV.new } before do allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:sys_vendor).and_return(manufacturer) allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return(product_name) end context 'when resolver returns hyper_v' do let(:manufacturer) { 'Microsoft' } let(:product_name) { 'Virtual Machine' } let(:value) { {} } it 'returns hyper_v fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.hyperv', value: value) end end context 'when resolver returns nil' do let(:manufacturer) { nil } let(:product_name) { nil } let(:value) { nil } it 'returns virtual fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.hyperv', value: value) end end context 'when manufacturer is not Microsoft, but product name is Virtual Machine' do let(:manufacturer) { 'unknown' } let(:product_name) { 'Virtual Machine' } let(:value) { {} } it 'returns hyper-v fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.hyperv', value: value) end end context 'when manufacturer is Microsoft and product name is not Virtual Machine' do let(:manufacturer) { 'Microsoft' } let(:product_name) { 'something_else' } let(:value) { {} } it 'returns hyper-v fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.hyperv', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/hypervisors/kvm_spec.rb000066400000000000000000000123451470204764400271220ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Hypervisors::Kvm do subject(:fact) { Facts::Linux::Hypervisors::Kvm.new } describe '#call_the_resolver' do context 'when hypervisor is virtualbox' do before do allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('VirtualBox') end it 'has nil value' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'hypervisors.kvm', value: nil) end end context 'when hypervisor is parallels' do before do allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('Parallels') end it 'has nil value' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'hypervisors.kvm', value: nil) end end context 'when VirtWhat retuns kvm' do before do allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('KVM') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return('unknown') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:sys_vendor).and_return('unknown') allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return('kvm') end it 'returns empty hash' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'hypervisors.kvm', value: {}) end end context 'when Lspci returns kvm' do before do allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('KVM') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return('unknown') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:sys_vendor).and_return('unknown') allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return('unknown') allow(Facter::Resolvers::Lspci).to receive(:resolve).with(:vm).and_return('kvm') end it 'returns empty hash' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'hypervisors.kvm', value: {}) end end context 'when VM is provided by AWS with KVM hypervisor' do before do allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('KVM') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return('Amazon EC2') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:sys_vendor).and_return('Amazon') allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return('unknown') allow(Facter::Resolvers::Lspci).to receive(:resolve).with(:vm).and_return('unknown') end it 'returns aws' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'hypervisors.kvm', value: { 'amazon' => true }) end end context 'when VM is provided by GCE with KVM hypervisor' do before do allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('KVM') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return('Google') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:sys_vendor).and_return('Google') allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return('unknown') allow(Facter::Resolvers::Lspci).to receive(:resolve).with(:vm).and_return('unknown') end it 'returns google cloud' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'hypervisors.kvm', value: { 'google' => true }) end end context 'when VM is provided by OpenStack with KVM hypervisor' do before do allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('KVM') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return('OpenStack') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:sys_vendor).and_return('OpenStack') allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return('unknown') allow(Facter::Resolvers::Lspci).to receive(:resolve).with(:vm).and_return('kvm') end it 'returns open stack' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'hypervisors.kvm', value: { 'openstack' => true }) end it 'returns open stack when Lspci return nil' do allow(Facter::Resolvers::Lspci).to receive(:resolve).with(:vm).and_return('unknown') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('OpenStack') expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'hypervisors.kvm', value: { 'openstack' => true }) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/hypervisors/lxc_spec.rb000066400000000000000000000030401470204764400271030ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Hypervisors::Lxc do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Hypervisors::Lxc.new } before do allow(Facter::Resolvers::Containers).to \ receive(:resolve).with(:hypervisor).and_return(hv) end context 'when resolver returns lxc' do let(:hv) { { lxc: { 'name' => 'test_name' } } } let(:value) { { 'name' => 'test_name' } } it 'returns virtual fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.lxc', value: value) end end context 'when resolver returns docker' do let(:hv) { { docker: { 'id' => 'testid' } } } it 'returns virtual fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.lxc', value: nil) end end context 'when resolver returns nil' do let(:hv) { nil } it 'returns virtual fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.lxc', value: hv) end end context 'when lxc info is empty' do let(:hv) { { lxc: {} } } let(:value) { {} } it 'returns virtual fact as empty array' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.lxc', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/hypervisors/openvz_spec.rb000066400000000000000000000026741470204764400276520ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Hypervisors::Openvz do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Hypervisors::Openvz.new } before do allow(Facter::Resolvers::OpenVz).to \ receive(:resolve).with(:vm).and_return(ovz) end context 'when resolver returns nil' do let(:ovz) { nil } it 'returns virtual fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.openvz', value: nil) end end context 'when resolver returns openvz host' do before { allow(Facter::Resolvers::OpenVz).to receive(:resolve).with(:id).and_return('0') } let(:ovz) { 'openvzhn' } let(:value) { { 'id' => 0, 'host' => true } } it 'returns openvz info' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.openvz', value: value) end end context 'when resolver returns openvz' do before { allow(Facter::Resolvers::OpenVz).to receive(:resolve).with(:id).and_return('101') } let(:ovz) { 'openvze' } let(:value) { { 'id' => 101, 'host' => false } } it 'returns openvz info' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.openvz', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/hypervisors/systemd_nspawn_spec.rb000066400000000000000000000032061470204764400313770ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Hypervisors::SystemdNspawn do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Hypervisors::SystemdNspawn.new } before do allow(Facter::Resolvers::Containers).to \ receive(:resolve).with(:hypervisor).and_return(hv) end context 'when resolver returns systemd_nspawn' do let(:hv) { { systemd_nspawn: { 'id' => 'testid00' } } } let(:value) { { 'id' => 'testid00' } } it 'returns virtual fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.systemd_nspawn', value: value) end end context 'when resolver returns docker' do let(:hv) { { docker: { 'id' => 'testid' } } } it 'returns virtual fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.systemd_nspawn', value: nil) end end context 'when resolver returns nil' do let(:hv) { nil } it 'returns virtual fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.systemd_nspawn', value: hv) end end context 'when systemd_nspawn info is empty' do let(:hv) { { systemd_nspawn: {} } } let(:value) { {} } it 'returns virtual fact as empty array' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.systemd_nspawn', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/hypervisors/virtual_box_spec.rb000066400000000000000000000037671470204764400306730ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Hypervisors::VirtualBox do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Hypervisors::VirtualBox.new } let(:version) { '6.4.1' } let(:revision) { '136177' } let(:value) { { 'version' => version, 'revision' => revision } } before do allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:virtualbox_version).and_return(version) allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:virtualbox_revision).and_return(revision) allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('VirtualBox') end it 'returns virtualbox fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.virtualbox', value: value) end context 'when virtualbox is not detected' do let(:value) { nil } before do allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('other') allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return('other') allow(Facter::Resolvers::Lspci).to receive(:resolve).with(:vm).and_return('other') end it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.virtualbox', value: value) end end context 'when virtualbox details are not present' do let(:value) { {} } before do allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:virtualbox_version).and_return(nil) allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:virtualbox_revision).and_return(nil) end it 'returns virtualbox fact as empty hash' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.virtualbox', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/hypervisors/vmware_spec.rb000066400000000000000000000110051470204764400276160ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Hypervisors::Vmware do subject(:fact) { Facts::Linux::Hypervisors::Vmware.new } describe '#call_the_resolver' do context 'when vmware is detected' do context 'when VirtWhat resolver returns vmware' do before do allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return('vmware') allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:vmware_version).and_return('ESXi 6.7') end it 'returns vmware' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'hypervisors.vmware', value: { 'version' => 'ESXi 6.7' }) end end context 'when vmware_version is nil' do before do allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return('vmware') allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:vmware_version).and_return(nil) end it 'returns vmware' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'hypervisors.vmware', value: {}) end end context 'when vmware_version is empty string' do before do allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return('vmware') allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:vmware_version).and_return('') end it 'returns vmware' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'hypervisors.vmware', value: {}) end end context 'when DmiBios resolver with product_name returns VMware' do before do allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return('unknown') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('VMware') allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:vmware_version).and_return('ESXi 6.7') end it 'returns vmware' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'hypervisors.vmware', value: { 'version' => 'ESXi 6.7' }) end end context 'when Lspci resolver returns vmware' do before do allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return('unknown') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('unknown') allow(Facter::Resolvers::Lspci).to receive(:resolve).with(:vm).and_return('vmware') allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:vmware_version).and_return('ESXi 6.7') end it 'returns vmware' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'hypervisors.vmware', value: { 'version' => 'ESXi 6.7' }) end end context 'when DmiBios resolver with sys_vendor returns VMware, Inc.' do before do allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return('unknown') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('unknown') allow(Facter::Resolvers::Lspci).to receive(:resolve).with(:vm).and_return('unknown') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:sys_vendor).and_return('VMware, Inc.') allow(Facter::Resolvers::DmiDecode).to receive(:resolve).with(:vmware_version).and_return('ESXi 6.7') end it 'returns vmware' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'hypervisors.vmware', value: { 'version' => 'ESXi 6.7' }) end end end context 'when vmware is not detected' do before do allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return('unknown') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('unknown') allow(Facter::Resolvers::Lspci).to receive(:resolve).with(:vm).and_return('unknown') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:sys_vendor).and_return('unknown') end it 'returns empty list' do expect(fact.call_the_resolver).to eq([]) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/hypervisors/xen_spec.rb000066400000000000000000000103651470204764400271170ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Hypervisors::Xen do subject(:fact) { Facts::Linux::Hypervisors::Xen.new } let(:virtual_detector_double) { class_spy(Facter::Util::Facts::Posix::VirtualDetector) } describe '#call_the_resolver' do before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return(value) end context 'when xen hypervisor' do let(:value) { 'xen' } context 'when Xen resolver returns privileged false' do before do allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('xenhvm') allow(Facter::Resolvers::Xen).to receive(:resolve).with(:privileged).and_return(false) end it 'returns xen' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'hypervisors.xen', value: { 'context' => 'hvm', 'privileged' => false }) end end context 'when Xen resolver returns xen0' do before do allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return('xen0') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('HVM domU') allow(Facter::Resolvers::Xen).to receive(:resolve).with(:privileged).and_return(true) end it 'returns xen' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'hypervisors.xen', value: { 'context' => 'hvm', 'privileged' => true }) end end context 'when DmiBios resolver return HVM domU' do before do allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return('unknown') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('HVM domU') allow(Facter::Resolvers::Xen).to receive(:resolve).with(:privileged).and_return(true) end it 'returns xen' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'hypervisors.xen', value: { 'context' => 'hvm', 'privileged' => true }) end end context 'when Lspci resolver returns xenhvm' do before do allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return('unknown') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('unknown') allow(Facter::Resolvers::Xen).to receive(:resolve).with(:privileged).and_return(true) allow(Facter::Resolvers::Lspci).to receive(:resolve).with(:vm).and_return('xenhvm') end it 'returns xen' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'hypervisors.xen', value: { 'context' => 'hvm', 'privileged' => true }) end end context 'when pv context' do before do allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('unknown') allow(Facter::Resolvers::Lspci).to receive(:resolve).with(:vm).and_return('unknown') allow(Facter::Resolvers::Xen).to receive(:resolve).with(:privileged).and_return(false) end it 'returns xen with pv context' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'hypervisors.xen', value: { 'context' => 'pv', 'privileged' => false }) end end context 'when privileged' do before do allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('xenhvm') allow(Facter::Resolvers::Xen).to receive(:resolve).with(:privileged).and_return(true) end it 'returns privileged xen' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'hypervisors.xen', value: { 'context' => 'hvm', 'privileged' => true }) end end end context 'when not xen hypervisor' do let(:value) { nil } it 'returns empty array' do expect(fact.call_the_resolver).to eq([]) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/identity/000077500000000000000000000000001470204764400242155ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linux/identity/gid_spec.rb000066400000000000000000000007741470204764400263270ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Identity::Gid do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Identity::Gid.new } let(:value) { '20' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:gid).and_return(value) end it 'returns identity gid fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'identity.gid', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/identity/group_spec.rb000066400000000000000000000011661470204764400267140ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Identity::Group do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Identity::Group.new } let(:value) { 'staff' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:group).and_return(value) end it 'returns identity group fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'identity.group', value: value), an_object_having_attributes(name: 'gid', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/identity/privileged_spec.rb000066400000000000000000000010421470204764400277030ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Identity::Privileged do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Identity::Privileged.new } let(:value) { 'false' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:privileged).and_return(value) end it 'returns identity privileged fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'identity.privileged', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/identity/uid_spec.rb000066400000000000000000000007751470204764400263460ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Identity::Uid do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Identity::Uid.new } let(:value) { '501' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:uid).and_return(value) end it 'returns identity uid fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'identity.uid', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/identity/user_spec.rb000066400000000000000000000011721470204764400265330ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Identity::User do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Identity::User.new } let(:value) { 'testUser' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:user).and_return(value) end it 'returns id and identity user fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'identity.user', value: value), an_object_having_attributes(name: 'id', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/interfaces_spec.rb000066400000000000000000000016521470204764400260520ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Interfaces do subject(:fact) { Facts::Linux::Interfaces.new } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { ip6: 'fe80::99bf:da20:ad3:9bfe' }, 'en1' => { ip6: 'fe80::99bf:da20:ad3:9bfe' } } } it 'returns interfaces names' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'interfaces', value: interfaces.keys.sort.join(','), type: :legacy) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'interfaces', value: interfaces, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/ipaddress6_interfaces_spec.rb000066400000000000000000000022031470204764400301670ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Ipaddress6Interfaces do subject(:fact) { Facts::Linux::Ipaddress6Interfaces.new } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { ip6: 'fe80::99bf:da20:ad3:9bfe' }, 'en1' => { ip6: 'fe80::99bf:da20:ad3:9bfe' } } } it 'returns legacy facts with names ipaddress6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ipaddress6_eth0', value: interfaces['eth0'][:ip6], type: :legacy), an_object_having_attributes(name: 'ipaddress6_en1', value: interfaces['en1'][:ip6], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/ipaddress_interfaces_spec.rb000066400000000000000000000021441470204764400301050ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::IpaddressInterfaces do subject(:fact) { Facts::Linux::IpaddressInterfaces.new } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { ip: '10.16.117.100' }, 'en1' => { ip: '10.16.117.255' } } } it 'returns legacy facts with names ipaddress_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ipaddress_eth0', value: interfaces['eth0'][:ip], type: :legacy), an_object_having_attributes(name: 'ipaddress_en1', value: interfaces['en1'][:ip], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/is_virtual_spec.rb000066400000000000000000000017671470204764400261170ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::IsVirtual do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::IsVirtual.new } let(:virtual_detector_double) { class_spy(Facter::Util::Facts::Posix::VirtualDetector) } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return(virtual_value) end context 'when not in a virtual environment' do let(:virtual_value) { 'physical' } it 'return resolved fact with nil value' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'is_virtual', value: false) end end context 'when in a virtual environment' do let(:virtual_value) { 'aws' } it 'return resolved fact with nil value' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'is_virtual', value: true) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/kernel_spec.rb000066400000000000000000000007451470204764400252110ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Kernel do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Kernel.new } let(:value) { 'Linux' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelname).and_return(value) end it 'returns kernel fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernel', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/kernelmajversion_spec.rb000066400000000000000000000016231470204764400273030ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Kernelmajversion do subject(:fact) { Facts::Linux::Kernelmajversion.new } let(:value) { '4.15' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelrelease).and_return(value) end shared_examples 'kernelmajversion fact expectation' do it 'returns the correct kernelmajversion fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernelmajversion', value: value) end end describe '#call_the_resolver' do context 'when full version is separated by . delimeter' do let(:value) { '4.15' } include_examples 'kernelmajversion fact expectation' end context 'when full version does not have a . delimeter' do let(:value) { '4test' } include_examples 'kernelmajversion fact expectation' end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/kernelrelease_spec.rb000066400000000000000000000010161470204764400265420ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Kernelrelease do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Kernelrelease.new } let(:value) { '6100-09-00-0000' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelrelease).and_return(value) end it 'returns kernelrelease fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernelrelease', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/kernelversion_spec.rb000066400000000000000000000017451470204764400266200ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Kernelversion do subject(:fact) { Facts::Linux::Kernelversion.new } let(:resolver_value) { '4.11' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelrelease).and_return(resolver_value) end shared_examples 'kernelversion fact expectation' do it 'returns the correct kernelversion fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernelversion', value: fact_value) end end describe '#call_the_resolver' do context 'when full version includes ' do let(:resolver_value) { '4.11.5-19-generic' } let(:fact_value) { '4.11.5' } include_examples 'kernelversion fact expectation' end context 'when full version does not have a . delimeter' do let(:resolver_value) { '4test' } let(:fact_value) { '4' } include_examples 'kernelversion fact expectation' end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/load_averages_spec.rb000066400000000000000000000011531470204764400265170ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::LoadAverages do subject(:fact) { Facts::Linux::LoadAverages.new } let(:averages) do { '15m' => 0.0, '10m' => 0.0, '5m' => 0.0 } end describe '#call_the_resolver' do before do allow(Facter::Resolvers::Linux::LoadAverages).to receive(:resolve).with(:load_averages).and_return(averages) end it 'returns resolved fact with name disk and value' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'load_averages', value: averages) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/lsbdistrelease_spec.rb000066400000000000000000000045031470204764400267320ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Lsbdistrelease do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Lsbdistrelease.new } context 'when lsb-release is installed' do before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:release).and_return(value) end context 'when version_id is retrieved successful' do context 'when version consists of only major' do let(:value) { '10' } let(:value_final) { { 'full' => '10', 'major' => '10', 'minor' => nil } } it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'lsbdistrelease', value: value, type: :legacy), an_object_having_attributes(name: 'lsbmajdistrelease', value: value_final['major'], type: :legacy), an_object_having_attributes(name: 'lsbminordistrelease', value: value_final['minor'], type: :legacy)) end end context 'when versin consists of both major and minor' do let(:value) { '10.08' } let(:value_final) { { 'full' => '10.08', 'major' => '10', 'minor' => '08' } } it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'lsbdistrelease', value: value, type: :legacy), an_object_having_attributes(name: 'lsbmajdistrelease', value: value_final['major'], type: :legacy), an_object_having_attributes(name: 'lsbminordistrelease', value: value_final['minor'], type: :legacy)) end end end context 'when lsb-release is not installed' do let(:value) { nil } it 'returns release fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'lsbdistrelease', value: value, type: :legacy) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/macaddress_interfaces_spec.rb000066400000000000000000000021551470204764400302370ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::MacaddressInterfaces do subject(:fact) { Facts::Linux::MacaddressInterfaces.new } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { mac: '10.16.117.100' }, 'en1' => { mac: '10.16.117.255' } } } it 'returns legacy facts with names macaddress_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'macaddress_eth0', value: interfaces['eth0'][:mac], type: :legacy), an_object_having_attributes(name: 'macaddress_en1', value: interfaces['en1'][:mac], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/memory/000077500000000000000000000000001470204764400236745ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linux/memory/swap/000077500000000000000000000000001470204764400246465ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linux/memory/swap/available_bytes_spec.rb000066400000000000000000000022631470204764400313360ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Memory::Swap::AvailableBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Memory::Swap::AvailableBytes.new } let(:value) { 2_332_425 } let(:value_mb) { 2.2243738174438477 } before do allow(Facter::Resolvers::Linux::Memory).to \ receive(:resolve).with(:swap_free).and_return(value) end it 'returns swap available bytes fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.available_bytes', value: value), an_object_having_attributes(name: 'swapfree_mb', value: value_mb, type: :legacy)) end describe '#call_the_resolver when resolver returns nil' do let(:value) { nil } it 'returns swap available memory in bytes fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.available_bytes', value: value), an_object_having_attributes(name: 'swapfree_mb', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/memory/swap/available_spec.rb000066400000000000000000000013261470204764400301270ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Memory::Swap::Available do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Memory::Swap::Available.new } let(:resolver_value) { 1024 } let(:value) { '1.00 KiB' } before do allow(Facter::Resolvers::Linux::Memory).to \ receive(:resolve).with(:swap_free).and_return(resolver_value) end it 'returns swap available memory fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.available', value: value), an_object_having_attributes(name: 'swapfree', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/memory/swap/capacity_spec.rb000066400000000000000000000010651470204764400300040ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Memory::Swap::Capacity do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Memory::Swap::Capacity.new } let(:value) { '7.4%' } before do allow(Facter::Resolvers::Linux::Memory).to \ receive(:resolve).with(:swap_capacity).and_return(value) end it 'returns swap memory capacity fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.swap.capacity', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/memory/swap/total_bytes_spec.rb000066400000000000000000000022461470204764400305420ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Memory::Swap::TotalBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Memory::Swap::TotalBytes.new } let(:value) { 2_332_425 } let(:value_mb) { 2.2243738174438477 } before do allow(Facter::Resolvers::Linux::Memory).to \ receive(:resolve).with(:swap_total).and_return(value) end it 'returns swap total memory in bytes fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.total_bytes', value: value), an_object_having_attributes(name: 'swapsize_mb', value: value_mb, type: :legacy)) end describe '#call_the_resolver when resolver returns nil' do let(:value) { nil } it 'returns swap total memory in bytes fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.total_bytes', value: value), an_object_having_attributes(name: 'swapsize_mb', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/memory/swap/total_spec.rb000066400000000000000000000013071470204764400273310ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Memory::Swap::Total do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Memory::Swap::Total.new } let(:resolver_value) { 1024 } let(:value) { '1.00 KiB' } before do allow(Facter::Resolvers::Linux::Memory).to \ receive(:resolve).with(:swap_total).and_return(resolver_value) end it 'returns swap total memory fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.total', value: value), an_object_having_attributes(name: 'swapsize', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/memory/swap/used_bytes_spec.rb000066400000000000000000000010761470204764400303570ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Memory::Swap::UsedBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Memory::Swap::UsedBytes.new } let(:value) { 1024 } before do allow(Facter::Resolvers::Linux::Memory).to \ receive(:resolve).with(:swap_used_bytes).and_return(value) end it 'returns swap used memory in bytes fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.swap.used_bytes', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/memory/swap/used_spec.rb000066400000000000000000000011261470204764400271450ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Memory::Swap::Used do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Memory::Swap::Used.new } let(:resolver_value) { 1024 } let(:value) { '1.00 KiB' } before do allow(Facter::Resolvers::Linux::Memory).to \ receive(:resolve).with(:swap_used_bytes).and_return(resolver_value) end it 'returns swap used memory fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.swap.used', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/memory/system/000077500000000000000000000000001470204764400252205ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linux/memory/system/available_bytes_spec.rb000066400000000000000000000023131470204764400317040ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Memory::System::AvailableBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Memory::System::AvailableBytes.new } let(:value) { 2_332_425 } let(:value_mb) { 2.2243738174438477 } before do allow(Facter::Resolvers::Linux::Memory).to \ receive(:resolve).with(:memfree).and_return(value) end it 'returns system available memory in bytes fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.available_bytes', value: value), an_object_having_attributes(name: 'memoryfree_mb', value: value_mb, type: :legacy)) end describe '#call_the_resolver when resolver returns nil' do let(:value) { nil } it 'returns system available memory in bytes fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.available_bytes', value: value), an_object_having_attributes(name: 'memoryfree_mb', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/memory/system/available_spec.rb000066400000000000000000000013361470204764400305020ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Memory::System::Available do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Memory::System::Available.new } let(:resolver_value) { 1024 } let(:value) { '1.00 KiB' } before do allow(Facter::Resolvers::Linux::Memory).to \ receive(:resolve).with(:memfree).and_return(resolver_value) end it 'returns system available memory fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.available', value: value), an_object_having_attributes(name: 'memoryfree', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/memory/system/capacity_spec.rb000066400000000000000000000010701470204764400303520ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Memory::System::Capacity do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Memory::System::Capacity.new } let(:value) { '5.3%' } before do allow(Facter::Resolvers::Linux::Memory).to \ receive(:resolve).with(:capacity).and_return(value) end it 'returns system memory capacity fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.system.capacity', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/memory/system/total_bytes_spec.rb000066400000000000000000000022611470204764400311110ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Memory::System::TotalBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Memory::System::TotalBytes.new } let(:value) { 2_332_425 } let(:value_mb) { 2.2243738174438477 } before do allow(Facter::Resolvers::Linux::Memory).to \ receive(:resolve).with(:total).and_return(value) end it 'returns system total memory in bytes fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.total_bytes', value: value), an_object_having_attributes(name: 'memorysize_mb', value: value_mb, type: :legacy)) end describe '#call_the_resolver when resolver returns nil' do let(:value) { nil } it 'returns system total memory in bytes fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.total_bytes', value: value), an_object_having_attributes(name: 'memorysize_mb', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/memory/system/total_spec.rb000066400000000000000000000013141470204764400277010ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Memory::System::Total do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Memory::System::Total.new } let(:resolver_value) { 1024 } let(:value) { '1.00 KiB' } before do allow(Facter::Resolvers::Linux::Memory).to \ receive(:resolve).with(:total).and_return(resolver_value) end it 'returns system total memory fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.total', value: value), an_object_having_attributes(name: 'memorysize', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/memory/system/used_bytes_spec.rb000066400000000000000000000011011470204764400307160ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Memory::System::UsedBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Memory::System::UsedBytes.new } let(:value) { 1024 } before do allow(Facter::Resolvers::Linux::Memory).to \ receive(:resolve).with(:used_bytes).and_return(value) end it 'returns system used memory in bytes fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.system.used_bytes', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/memory/system/used_spec.rb000066400000000000000000000011311470204764400275130ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Memory::System::Used do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Memory::System::Used.new } let(:resolver_value) { 1024 } let(:value) { '1.00 KiB' } before do allow(Facter::Resolvers::Linux::Memory).to \ receive(:resolve).with(:used_bytes).and_return(resolver_value) end it 'returns system used memory fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.system.used', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/mountpoints_spec.rb000066400000000000000000000035461470204764400263320ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Mountpoints do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Mountpoints.new } context 'when resolver returns hash' do let(:resolver_output) do [{ available: '63.31 GiB', available_bytes: 67_979_685_888, capacity: '84.64%', device: '/dev/nvme0n1p2', filesystem: 'ext4', options: %w[rw noatime], path: '/', size: '434.42 GiB', size_bytes: 466_449_743_872, used: '348.97 GiB', used_bytes: 374_704_357_376 }] end let(:parsed_fact) do { '/' => { 'available' => '63.31 GiB', 'available_bytes' => 67_979_685_888, 'capacity' => '84.64%', 'device' => '/dev/nvme0n1p2', 'filesystem' => 'ext4', 'options' => %w[rw noatime], 'size' => '434.42 GiB', 'size_bytes' => 466_449_743_872, 'used' => '348.97 GiB', 'used_bytes' => 374_704_357_376 } } end before do allow(Facter::Resolvers::Mountpoints).to receive(:resolve).with(:mountpoints).and_return(resolver_output) end it 'returns mountpoints information' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'mountpoints', value: parsed_fact) end end context 'when resolver returns nil' do before do allow(Facter::Resolvers::Mountpoints).to receive(:resolve).with(:mountpoints).and_return(nil) end it 'returns mountpoints information' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'mountpoints', value: nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/mtu_interfaces_spec.rb000066400000000000000000000017141470204764400267360ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::MtuInterfaces do subject(:fact) { Facts::Linux::MtuInterfaces.new } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { mtu: 1500 }, 'en1' => { mtu: 1500 } } } it 'returns legacy facts with names mtu_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'mtu_eth0', value: interfaces['eth0'][:mtu], type: :legacy), an_object_having_attributes(name: 'mtu_en1', value: interfaces['en1'][:mtu], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/netmask6_interfaces_spec.rb000066400000000000000000000022411470204764400276550ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Netmask6Interfaces do subject(:fact) { Facts::Linux::Netmask6Interfaces.new } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) do { 'eth0' => { netmask6: 'fe80::99bf:da20:ad3:9bfe' }, 'en1' => { netmask6: 'fe80::99bf:da20:ad3:9bfe' } } end it 'returns legacy facts with names netmask6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'netmask6_eth0', value: interfaces['eth0'][:netmask6], type: :legacy), an_object_having_attributes(name: 'netmask6_en1', value: interfaces['en1'][:netmask6], type: :legacy)) end end describe '#call_the_resolver when resolver return nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/netmask_interfaces_spec.rb000066400000000000000000000021571470204764400275750ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::NetmaskInterfaces do subject(:fact) { Facts::Linux::NetmaskInterfaces.new } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { netmask: '10.255.255.255' }, 'en1' => { netmask: '10.17.255.255' } } } it 'returns legacy facts with names netmask_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'netmask_eth0', value: interfaces['eth0'][:netmask], type: :legacy), an_object_having_attributes(name: 'netmask_en1', value: interfaces['en1'][:netmask], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/network6_interfaces_spec.rb000066400000000000000000000021461470204764400277100ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Network6Interfaces do subject(:fact) { Facts::Linux::Network6Interfaces.new } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { network6: '::1' }, 'en1' => { network6: 'fe80::' } } } it 'returns legacy facts with names network6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'network6_eth0', value: interfaces['eth0'][:network6], type: :legacy), an_object_having_attributes(name: 'network6_en1', value: interfaces['en1'][:network6], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/network_interfaces_spec.rb000066400000000000000000000021571470204764400276240ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::NetworkInterfaces do subject(:fact) { Facts::Linux::NetworkInterfaces.new } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { network: '10.255.255.255' }, 'en1' => { network: '10.17.255.255' } } } it 'returns legacy facts with names network_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'network_eth0', value: interfaces['eth0'][:network], type: :legacy), an_object_having_attributes(name: 'network_en1', value: interfaces['en1'][:network], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/networking/000077500000000000000000000000001470204764400245535ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linux/networking/dhcp_spec.rb000066400000000000000000000014461470204764400270350ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Networking::Dhcp do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Networking::Dhcp.new } let(:value) { '10.16.122.163' } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:dhcp).and_return(value) end it 'returns dhcp fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.dhcp', value: value) end context 'when dhcp can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.dhcp', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/networking/domain_spec.rb000066400000000000000000000020061470204764400273570ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Networking::Domain do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Networking::Domain.new } let(:value) { 'domain' } before do allow(Facter::Resolvers::Linux::Hostname).to receive(:resolve).with(:domain).and_return(value) end it 'returns domain fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.domain', value: value), an_object_having_attributes(name: 'domain', value: value, type: :legacy)) end context 'when domain can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.domain', value: value), an_object_having_attributes(name: 'domain', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/networking/fqdn_spec.rb000066400000000000000000000017711470204764400270500ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Networking::Fqdn do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Networking::Fqdn.new } let(:value) { 'host.domain' } before do allow(Facter::Resolvers::Linux::Hostname).to receive(:resolve).with(:fqdn).and_return(value) end it 'returns fqdn fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.fqdn', value: value), an_object_having_attributes(name: 'fqdn', value: value, type: :legacy)) end context 'when fqdn can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.fqdn', value: value), an_object_having_attributes(name: 'fqdn', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/networking/hostname_spec.rb000066400000000000000000000020261470204764400277300ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Networking::Hostname do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Networking::Hostname.new } let(:value) { 'host' } before do allow(Facter::Resolvers::Linux::Hostname).to receive(:resolve).with(:hostname).and_return(value) end it 'returns hostname fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.hostname', value: value), an_object_having_attributes(name: 'hostname', value: value, type: :legacy)) end context 'when hostname can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.hostname', value: value), an_object_having_attributes(name: 'hostname', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/networking/interfaces_spec.rb000066400000000000000000000021031470204764400302310ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Networking::Interfaces do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Networking::Interfaces.new } let(:value) do { 'ens160' => { 'bindings' => [ { 'address' => '10.16.116.8', 'netmask' => '255.255.240.0', 'network' => '10.16.112.0' } ] } } end before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:interfaces).and_return(value) end it 'returns networking.interfaces fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.interfaces', value: value) end context 'when interfaces can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.interfaces', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/networking/ip6_spec.rb000066400000000000000000000020271470204764400266110ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Networking::Ip6 do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Networking::Ip6.new } let(:value) { 'fe80::5989:97ff:75ae:dae7' } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:ip6).and_return(value) end it 'returns ipv6 address fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip6', value: value), an_object_having_attributes(name: 'ipaddress6', value: value, type: :legacy)) end context 'when ip6 can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip6', value: value), an_object_having_attributes(name: 'ipaddress6', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/networking/ip_spec.rb000066400000000000000000000020041470204764400265160ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Networking::Ip do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Networking::Ip.new } let(:value) { '10.16.122.163' } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:ip).and_return(value) end it 'returns ipaddress fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'networking.ip', value: value), an_object_having_attributes(name: 'ipaddress', value: value, type: :legacy)) end context 'when ip can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip', value: value), an_object_having_attributes(name: 'ipaddress', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/networking/mac_spec.rb000066400000000000000000000020141470204764400266470ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Networking::Mac do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Networking::Mac.new } let(:value) { '64:5a:ed:ea:c3:25' } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:mac).and_return(value) end it 'return macaddress fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.mac', value: value), an_object_having_attributes(name: 'macaddress', value: value, type: :legacy)) end context 'when mac can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.mac', value: value), an_object_having_attributes(name: 'macaddress', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/networking/mtu_spec.rb000066400000000000000000000014231470204764400267170ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Networking::Mtu do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Networking::Mtu.new } let(:value) { 1500 } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:mtu).and_return(value) end it 'return mtu fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.mtu', value: value) end context 'when mtu can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.mtu', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/networking/netmask6_spec.rb000066400000000000000000000020551470204764400276440ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Networking::Netmask6 do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Networking::Netmask6.new } let(:value) { 'fe80::5989:97ff:75ae:dae7' } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:netmask6).and_return(value) end it 'returns netmask6 fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask6', value: value), an_object_having_attributes(name: 'netmask6', value: value, type: :legacy)) end context 'when netmask6 can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask6', value: value), an_object_having_attributes(name: 'netmask6', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/networking/netmask_spec.rb000066400000000000000000000020341470204764400275530ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Networking::Netmask do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Networking::Netmask.new } let(:value) { '10.16.122.163' } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:netmask).and_return(value) end it 'returns netmask fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'networking.netmask', value: value), an_object_having_attributes(name: 'netmask', value: value, type: :legacy)) end context 'when netmask can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask', value: value), an_object_having_attributes(name: 'netmask', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/networking/network6_spec.rb000066400000000000000000000020551470204764400276730ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Networking::Network6 do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Networking::Network6.new } let(:value) { 'fe80::5989:97ff:75ae:dae7' } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:network6).and_return(value) end it 'returns network6 fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network6', value: value), an_object_having_attributes(name: 'network6', value: value, type: :legacy)) end context 'when network6 can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network6', value: value), an_object_having_attributes(name: 'network6', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/networking/network_spec.rb000066400000000000000000000020341470204764400276020ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Networking::Network do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Networking::Network.new } let(:value) { '10.16.122.163' } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:network).and_return(value) end it 'returns network fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'networking.network', value: value), an_object_having_attributes(name: 'network', value: value, type: :legacy)) end context 'when network can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network', value: value), an_object_having_attributes(name: 'network', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/networking/primary_spec.rb000066400000000000000000000015231470204764400275760ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Networking::Primary do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Networking::Primary.new } let(:value) { 'ens160' } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:primary_interface).and_return(value) end it 'returns networking.primary fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.primary', value: value) end context 'when primary interface can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.primary', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/networking/scope6_spec.rb000066400000000000000000000020031470204764400273040ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Networking::Scope6 do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Networking::Scope6.new } let(:value) { 'link' } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:scope6).and_return(value) end it 'return scope6 fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'networking.scope6', value: value), an_object_having_attributes(name: 'scope6', value: value)) end context 'when scope6 can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'networking.scope6', value: value), an_object_having_attributes(name: 'scope6', value: value)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/os/000077500000000000000000000000001470204764400230055ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linux/os/architecture_spec.rb000066400000000000000000000021541470204764400270300ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Os::Architecture do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Os::Architecture.new } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:machine).and_return(value) end context 'when os is 64-bit' do let(:value) { 'x86_64' } it 'returns architecture fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.architecture', value: value), an_object_having_attributes(name: 'architecture', value: value, type: :legacy)) end end context 'when os is 32-bit' do let(:value) { 'i686' } let(:fact_value) { 'i386' } it 'returns architecture fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.architecture', value: fact_value), an_object_having_attributes(name: 'architecture', value: fact_value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/os/distro/000077500000000000000000000000001470204764400243115ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linux/os/distro/codename_spec.rb000066400000000000000000000012111470204764400274160ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Os::Distro::Codename do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Os::Distro::Codename.new } let(:value) { 'Core' } before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:codename).and_return(value) end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.distro.codename', value: value), an_object_having_attributes(name: 'lsbdistcodename', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/os/distro/description_spec.rb000066400000000000000000000012701470204764400301730ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Os::Distro::Description do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Os::Distro::Description.new } let(:value) { 'CentOS Linux release 7.2.1511 (Core)' } before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:description).and_return(value) end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.distro.description', value: value), an_object_having_attributes(name: 'lsbdistdescription', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/os/distro/id_spec.rb000066400000000000000000000011711470204764400262440ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Os::Distro::Id do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Os::Distro::Id.new } let(:value) { 'CentOS' } before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:distributor_id).and_return(value) end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.distro.id', value: value), an_object_having_attributes(name: 'lsbdistid', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/os/distro/release_spec.rb000066400000000000000000000027171470204764400272770ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Os::Distro::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Os::Distro::Release.new } let(:value) { '7.2.1511' } let(:release) { { 'full' => '7.2.1511', 'major' => '7', 'minor' => '2' } } before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:release).and_return(value) end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.distro.release', value: release), an_object_having_attributes(name: 'lsbdistrelease', value: value, type: :legacy), an_object_having_attributes(name: 'lsbmajdistrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'lsbminordistrelease', value: release['minor'], type: :legacy)) end context 'when lsb_release is not installed' do let(:value) { nil } before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:release).and_return(value) end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'os.distro.release', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/os/distro/specification_spec.rb000066400000000000000000000012771470204764400304770ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Os::Distro::Specification do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Os::Distro::Specification.new } let(:value) { ':core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64' } before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:lsb_version).and_return(value) end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.distro.specification', value: value), an_object_having_attributes(name: 'lsbrelease', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/os/family_spec.rb000066400000000000000000000024761470204764400256360ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Os::Family do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Os::Family.new } let(:value) { 'Debian' } context 'when OsRelease resolver returns id_like' do before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:id_like).and_return(value) end it 'returns os family fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.family', value: value), an_object_having_attributes(name: 'osfamily', value: value, type: :legacy)) end end context 'when OsRelease resolver does not return id_like and fact has to call OsRelease resolver twice' do before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:id_like).and_return(nil) allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:id).and_return(value) end it 'returns os family fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.family', value: value), an_object_having_attributes(name: 'osfamily', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/os/hardware_spec.rb000066400000000000000000000011631470204764400261420ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Os::Hardware do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Os::Hardware.new } let(:value) { 'x86_64' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:machine).and_return(value) end it 'returns hardware model fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.hardware', value: value), an_object_having_attributes(name: 'hardwaremodel', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/os/name_spec.rb000066400000000000000000000011611470204764400252630ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Os::Name do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Os::Name.new } let(:value) { 'Debian' } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:name).and_return(value) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.name', value: value), an_object_having_attributes(name: 'operatingsystem', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/os/release_spec.rb000066400000000000000000000014141470204764400257640ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Os::Release.new } let(:value) { '10.9' } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(value) end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: { 'full' => value, 'major' => value }), an_object_having_attributes(name: 'operatingsystemmajrelease', value: value, type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/os/selinux/000077500000000000000000000000001470204764400244745ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linux/os/selinux/config_mode_spec.rb000066400000000000000000000012671470204764400303120ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Os::Selinux::ConfigMode do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Os::Selinux::ConfigMode.new } let(:config_mode) { 'enabled' } before do allow(Facter::Resolvers::SELinux).to receive(:resolve).with(:config_mode).and_return(config_mode) end it 'returns architecture fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.selinux.config_mode', value: config_mode), an_object_having_attributes(name: 'selinux_config_mode', value: config_mode, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/os/selinux/config_policy_spec.rb000066400000000000000000000013121470204764400306540ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Os::Selinux::ConfigPolicy do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Os::Selinux::ConfigPolicy.new } let(:config_policy) { 'targeted' } before do allow(Facter::Resolvers::SELinux).to receive(:resolve).with(:config_policy).and_return(config_policy) end it 'returns architecture fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.selinux.config_policy', value: config_policy), an_object_having_attributes(name: 'selinux_config_policy', value: config_policy, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/os/selinux/current_mode_spec.rb000066400000000000000000000013031470204764400305160ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Os::Selinux::CurrentMode do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Os::Selinux::CurrentMode.new } let(:current_mode) { 'permissive' } before do allow(Facter::Resolvers::SELinux).to receive(:resolve).with(:current_mode).and_return(current_mode) end it 'returns architecture fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.selinux.current_mode', value: current_mode), an_object_having_attributes(name: 'selinux_current_mode', value: current_mode, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/os/selinux/enabled_spec.rb000066400000000000000000000012101470204764400274170ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Os::Selinux::Enabled do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Os::Selinux::Enabled.new } let(:enabled) { true } before do allow(Facter::Resolvers::SELinux).to receive(:resolve).with(:enabled).and_return(enabled) end it 'returns architecture fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.selinux.enabled', value: enabled), an_object_having_attributes(name: 'selinux', value: enabled, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/os/selinux/enforced_spec.rb000066400000000000000000000012321470204764400276160ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Os::Selinux::Enforced do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Os::Selinux::Enforced.new } let(:enforced) { false } before do allow(Facter::Resolvers::SELinux).to receive(:resolve).with(:enforced).and_return(enforced) end it 'returns architecture fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.selinux.enforced', value: enforced), an_object_having_attributes(name: 'selinux_enforced', value: enforced, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/os/selinux/policy_version_spec.rb000066400000000000000000000014001470204764400310720ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Os::Selinux::PolicyVersion do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Os::Selinux::PolicyVersion.new } let(:policy_version) { '31' } before do allow(Facter::Resolvers::SELinux).to receive(:resolve).with(:policy_version).and_return(policy_version) end it 'returns architecture fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.selinux.policy_version', value: policy_version), an_object_having_attributes(name: 'selinux_policyversion', value: policy_version, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/partitions_spec.rb000066400000000000000000000123021470204764400261150ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Partitions do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Partitions.new } let(:mountpoints_resolver_output) do [{ available: '63.31 GiB', available_bytes: 67_979_685_888, capacity: '84.64%', device: '/dev/sda1', filesystem: 'ext4', options: %w[rw noatime], path: '/', size: '434.42 GiB', size_bytes: 466_449_743_872, used: '348.97 GiB', used_bytes: 374_704_357_376 }] end let(:partitions_resolver_output) do { '/dev/sda1' => { 'filesystem' => 'ext3', 'label' => '/boot', 'size' => '203.89 KiB', 'size_bytes' => 208_782, 'uuid' => '88077904-4fd4-476f-9af2-0f7a806ca25e' } } end let(:final_result) do { '/dev/sda1' => { 'filesystem' => 'ext3', 'label' => '/boot', 'size' => '203.89 KiB', 'size_bytes' => 208_782, 'uuid' => '88077904-4fd4-476f-9af2-0f7a806ca25e', 'mount' => '/' } } end context 'when resolver returns hash' do before do allow(Facter::Resolvers::Mountpoints).to receive(:resolve).with(:mountpoints) .and_return(mountpoints_resolver_output) allow(Facter::Resolvers::Partitions).to receive(:resolve).with(:partitions) .and_return(partitions_resolver_output) end it 'returns partitions information' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'partitions', value: final_result) end end context 'when mountpoints resolver returns nil' do before do allow(Facter::Resolvers::Mountpoints).to receive(:resolve).with(:mountpoints).and_return(nil) allow(Facter::Resolvers::Partitions).to receive(:resolve).with(:partitions) .and_return(partitions_resolver_output) end it 'returns partition information without mount info' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'partitions', value: partitions_resolver_output) end end context 'when partitions resolver returns empty hash' do before do allow(Facter::Resolvers::Mountpoints).to receive(:resolve).with(:mountpoints) .and_return(mountpoints_resolver_output) allow(Facter::Resolvers::Partitions).to receive(:resolve).with(:partitions).and_return({}) end it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'partitions', value: nil) end end context 'when the same device is mounted in multiple places' do let(:mountpoints_resolver_output) do [{ device: '/dev/sda2', filesystem: 'btrfs', path: '/', options: ['rw', 'relatime', 'space_cache', 'subvolid=267', 'subvol=/@/.snapshots/1/snapshot'], available: '10.74 GiB', available_bytes: 11_534_614_528, size: '13.09 GiB', size_bytes: 14_050_918_400, used: '1.96 GiB', used_bytes: 2_101_231_616, capacity: '15.41%' }, { device: '/dev/sda2', filesystem: 'btrfs', path: '/boot/grub2/x86_64-efi', options: ['rw', 'relatime', 'space_cache', 'subvolid=264', 'subvol=/@/boot/grub2/x86_64-efi'], available: '10.74 GiB', available_bytes: 11_534_614_528, size: '13.09 GiB', size_bytes: 14_050_918_400, used: '1.96 GiB', used_bytes: 2_101_231_616, capacity: '15.41%' }] end let(:partitions_resolver_output) do { '/dev/sda2' => { size_bytes: 14_050_918_400, size: '13.09 GiB', filesystem: 'btrfs', uuid: 'bbc18fba-8191-48c8-b8bd-30373654bb3e', partuuid: 'c96cd2ea-1046-461c-b0fe-1e5aa19aba61' } } end let(:final_result) do { '/dev/sda2' => { 'size_bytes' => 14_050_918_400, 'size' => '13.09 GiB', 'filesystem' => 'btrfs', 'uuid' => 'bbc18fba-8191-48c8-b8bd-30373654bb3e', 'partuuid' => 'c96cd2ea-1046-461c-b0fe-1e5aa19aba61', 'mount' => '/' } } end before do allow(Facter::Resolvers::Mountpoints).to receive(:resolve).with(:mountpoints) .and_return(mountpoints_resolver_output) allow(Facter::Resolvers::Partitions).to receive(:resolve).with(:partitions) .and_return(partitions_resolver_output) end it 'returns partitions information from the first mountpoint' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'partitions', value: final_result) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/path_spec.rb000066400000000000000000000010601470204764400246540ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Path do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Path.new } let(:value) { '/usr/bin:/etc:/usr/sbin:/usr/ucb:/usr/bin/X11:/sbin:/usr/java6/jre/bin:/usr/java6/bin' } before do allow(Facter::Resolvers::Path).to \ receive(:resolve).with(:path).and_return(value) end it 'returns path fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'path', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/processor_spec.rb000066400000000000000000000013671470204764400257510ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Processor do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Processor.new } let(:processor) { ['Intel(R) Xeon(R) Gold 6138 CPU @ 2.00GHz', 'Intel(R) Xeon(R) Gold 6138 CPU @ 2.00GHz'] } before do allow(Facter::Resolvers::Linux::Processors).to receive(:resolve).with(:models).and_return(processor) end it 'returns legacy facts about each processor' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processor0', value: processor[0], type: :legacy), an_object_having_attributes(name: 'processor1', value: processor[1], type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/processors/000077500000000000000000000000001470204764400245665ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linux/processors/cores_spec.rb000066400000000000000000000011001470204764400272300ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Processors::Cores do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Processors::Cores.new } let(:cores_per_socket) { 4 } before do allow(Facter::Resolvers::Linux::Lscpu).to \ receive(:resolve).with(:cores_per_socket).and_return(cores_per_socket) end it 'returns processors core fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'processors.cores', value: cores_per_socket) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/processors/count_spec.rb000066400000000000000000000013051470204764400272540ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Processors::Count do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Processors::Count.new } let(:processors_count) { '4' } before do allow(Facter::Resolvers::Linux::Processors).to \ receive(:resolve).with(:processors).and_return(processors_count) end it 'returns processors count fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.count', value: processors_count), an_object_having_attributes(name: 'processorcount', value: processors_count, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/processors/isa_spec.rb000066400000000000000000000012561470204764400267050ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Processors::Isa do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Processors::Isa.new } let(:processors_arch) { 'x86_64' } before do allow(Facter::Resolvers::Uname).to \ receive(:resolve).with(:processor).and_return(processors_arch) end it 'returns processors isa fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.isa', value: processors_arch), an_object_having_attributes(name: 'hardwareisa', value: processors_arch, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/processors/models_spec.rb000066400000000000000000000011731470204764400274120ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Processors::Models do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Processors::Models.new } let(:models) { ['Intel(R) Core(TM) i7-4980HQ CPU @ 2.80GHz', 'Intel(R) Core(TM) i7-4980HQ CPU @ 2.80GHz'] } before do allow(Facter::Resolvers::Linux::Processors).to \ receive(:resolve).with(:models).and_return(models) end it 'returns processors models fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'processors.models', value: models) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/processors/physicalcount_spec.rb000066400000000000000000000015221470204764400310120ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Processors::Physicalcount do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Processors::Physicalcount.new } let(:physical_count) { '2' } before do allow(Facter::Resolvers::Linux::Processors).to \ receive(:resolve).with(:physical_count).and_return(physical_count) end it 'returns processors physical count fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.physicalcount', value: physical_count), an_object_having_attributes(name: 'physicalprocessorcount', value: physical_count, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/processors/speed_spec.rb000066400000000000000000000011231470204764400272220ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Processors::Speed do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Processors::Speed.new } let(:speed) { 1_800_000_000 } let(:converted_speed) { '1.80 GHz' } before do allow(Facter::Resolvers::Linux::Processors).to \ receive(:resolve).with(:speed).and_return(speed) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'processors.speed', value: converted_speed) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/processors/threads_spec.rb000066400000000000000000000011061470204764400275550ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Processors::Threads do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Processors::Threads.new } let(:threads_per_core) { 2 } before do allow(Facter::Resolvers::Linux::Lscpu).to \ receive(:resolve).with(:threads_per_core).and_return(threads_per_core) end it 'returns processors core fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'processors.threads', value: threads_per_core) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/ruby/000077500000000000000000000000001470204764400233455ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linux/ruby/platform_spec.rb000066400000000000000000000011751470204764400265340ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Ruby::Platform do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Ruby::Platform.new } let(:value) { 'x86_64-linux' } before do allow(Facter::Resolvers::Ruby).to receive(:resolve).with(:platform).and_return(value) end it 'returns ruby platform fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ruby.platform', value: value), an_object_having_attributes(name: 'rubyplatform', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/ruby/sitedir_spec.rb000066400000000000000000000014721470204764400263530ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Ruby::Sitedir do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Ruby::Sitedir.new } let(:value) { '/opt/puppetlabs/puppet/lib/ruby/site_ruby/2.6.3' } before do allow(Facter::Resolvers::Ruby).to receive(:resolve).with(:sitedir).and_return(value) end it 'call Facter::Resolvers::Ruby' do fact.call_the_resolver expect(Facter::Resolvers::Ruby).to have_received(:resolve).with(:sitedir) end it 'returns ruby site dir fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ruby.sitedir', value: value), an_object_having_attributes(name: 'rubysitedir', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/ruby/version_spec.rb000066400000000000000000000011751470204764400263750ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Ruby::Version do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Ruby::Version.new } let(:value) { '2.5.9' } before do allow(Facter::Resolvers::Ruby).to receive(:resolve).with(:version).and_return(value) end it 'returns ruby version fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'ruby.version', value: value), an_object_having_attributes(name: 'rubyversion', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/scope6_interfaces_spec.rb000066400000000000000000000021501470204764400273230ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Scope6Interfaces do subject(:fact) { Facts::Linux::Scope6Interfaces.new } before do allow(Facter::Resolvers::Linux::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { scope6: 'link' }, 'en1' => { scope6: 'global' } } } it 'returns legacy facts with scope6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'scope6_eth0', value: interfaces['eth0'][:scope6], type: :legacy), an_object_having_attributes(name: 'scope6_en1', value: interfaces['en1'][:scope6], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } let(:scope6) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/ssh_spec.rb000066400000000000000000000020711470204764400245200ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Ssh do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Ssh.new } let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'ecdsa', 'test', 'ecdsa')] end let(:value) do { 'ecdsa' => { 'fingerprints' => { 'sha1' => 'test', 'sha256' => 'test' }, 'key' => 'test', 'type' => 'ecdsa' } } end before do allow(Facter::Resolvers::Ssh).to \ receive(:resolve).with(:ssh).and_return(ssh) end it 'returns ssh fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ssh', value: value) end context 'when resolver returns empty array' do let(:ssh) { [] } it 'returns nil fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ssh', value: nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/sshalgorithmkey_spec.rb000066400000000000000000000020511470204764400271360ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Sshalgorithmkey do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Sshalgorithmkey.new } let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'ecdsa', 'test', 'ecdsa'), Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'rsa', 'test', 'rsa')] end let(:legacy_fact1) { { name: 'ecdsa', value: 'test' } } let(:legacy_fact2) { { name: 'rsa', value: 'test' } } before do allow(Facter::Resolvers::Ssh).to \ receive(:resolve).with(:ssh).and_return(ssh) end it 'returns a list of resolved facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: "ssh#{legacy_fact1[:name]}key", value: legacy_fact1[:value]), an_object_having_attributes(name: "ssh#{legacy_fact2[:name]}key", value: legacy_fact2[:value])) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/sshfp_algorithm_spec.rb000066400000000000000000000021031470204764400271100ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::SshfpAlgorithm do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::SshfpAlgorithm.new } let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('sha11', 'sha2561'), 'ecdsa', 'test', 'ecdsa'), Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('sha12', 'sha2562'), 'rsa', 'test', 'rsa')] end let(:legacy_fact1) { { name: 'ecdsa', value: "sha11\nsha2561" } } let(:legacy_fact2) { { name: 'rsa', value: "sha12\nsha2562" } } before do allow(Facter::Resolvers::Ssh).to \ receive(:resolve).with(:ssh).and_return(ssh) end it 'returns a list of resolved facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: "sshfp_#{legacy_fact1[:name]}", value: legacy_fact1[:value]), an_object_having_attributes(name: "sshfp_#{legacy_fact2[:name]}", value: legacy_fact2[:value])) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/system_uptime/000077500000000000000000000000001470204764400252735ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linux/system_uptime/days_spec.rb000066400000000000000000000026121470204764400275730ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::SystemUptime::Days do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::SystemUptime::Days.new } let(:value) { '2' } context 'when on linux' do before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:hypervisor).and_return(nil) allow(Facter::Resolvers::Uptime).to receive(:resolve).with(:days).and_return(value) end it 'returns days since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.days', value: value), an_object_having_attributes(name: 'uptime_days', value: value, type: :legacy)) end end context 'when in docker container' do before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:hypervisor).and_return({ docker: '123' }) allow(Facter::Resolvers::Linux::DockerUptime).to receive(:resolve).with(:days).and_return(value) end it 'returns days since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.days', value: value), an_object_having_attributes(name: 'uptime_days', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/system_uptime/hours_spec.rb000066400000000000000000000026241470204764400277760ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::SystemUptime::Hours do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::SystemUptime::Hours.new } let(:value) { '2' } context 'when on linux' do before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:hypervisor).and_return(nil) allow(Facter::Resolvers::Uptime).to receive(:resolve).with(:hours).and_return(value) end it 'returns hours since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.hours', value: value), an_object_having_attributes(name: 'uptime_hours', value: value, type: :legacy)) end end context 'when in docker container' do before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:hypervisor).and_return({ docker: '123' }) allow(Facter::Resolvers::Linux::DockerUptime).to receive(:resolve).with(:hours).and_return(value) end it 'returns hours since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.hours', value: value), an_object_having_attributes(name: 'uptime_hours', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/system_uptime/seconds_spec.rb000066400000000000000000000026511470204764400302740ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::SystemUptime::Seconds do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::SystemUptime::Seconds.new } let(:value) { 3600 } context 'when on linux' do before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:hypervisor).and_return(nil) allow(Facter::Resolvers::Uptime).to receive(:resolve).with(:seconds).and_return(value) end it 'returns minutes since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.seconds', value: value), an_object_having_attributes(name: 'uptime_seconds', value: value, type: :legacy)) end end context 'when in docker container' do before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:hypervisor).and_return({ docker: '123' }) allow(Facter::Resolvers::Linux::DockerUptime).to receive(:resolve).with(:seconds).and_return(value) end it 'returns minutes since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.seconds', value: value), an_object_having_attributes(name: 'uptime_seconds', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/system_uptime/uptime_spec.rb000066400000000000000000000026411470204764400301400ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::SystemUptime::Uptime do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::SystemUptime::Uptime.new } let(:value) { '6 days' } context 'when on linux' do before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:hypervisor).and_return(nil) allow(Facter::Resolvers::Uptime).to receive(:resolve).with(:uptime).and_return(value) end it 'returns total uptime since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.uptime', value: value), an_object_having_attributes(name: 'uptime', value: value, type: :legacy)) end end context 'when in docker container' do before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:hypervisor).and_return({ docker: '123' }) allow(Facter::Resolvers::Linux::DockerUptime).to receive(:resolve).with(:uptime).and_return(value) end it 'returns total uptime since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.uptime', value: value), an_object_having_attributes(name: 'uptime', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/timezone_spec.rb000066400000000000000000000007771470204764400255700ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Timezone do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Timezone.new } let(:timezone) { 'UTC' } before do allow(Facter::Resolvers::Timezone).to \ receive(:resolve).with(:timezone).and_return(timezone) end it 'returns timezone fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'timezone', value: timezone) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/virtual_spec.rb000066400000000000000000000016371470204764400254200ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Virtual do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Virtual.new } let(:virtual_detector_double) { class_spy(Facter::Util::Facts::Posix::VirtualDetector) } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return(value) end shared_examples 'check resolved fact value' do it 'return resolved fact with nil value' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'virtual', value: value) end end context 'when not in a virtual environment' do let(:value) { 'physical' } it_behaves_like 'check resolved fact value' end context 'when in a virtual environment' do let(:value) { 'aws' } it_behaves_like 'check resolved fact value' end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linux/xen_spec.rb000066400000000000000000000051141470204764400245160ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linux::Xen do describe '#call_the_resolver' do subject(:fact) { Facts::Linux::Xen.new } before do allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(vm) allow(Facter::Resolvers::Xen).to receive(:resolve).with(:domains).and_return(domains) end context 'when is xen privileged' do let(:vm) { 'xen0' } let(:domains) { %w[domain1 domain2] } it 'returns xen fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'xen', value: { 'domains' => domains }), an_object_having_attributes(name: 'xendomains', value: domains.entries.join(','), type: :legacy)) end end context 'when is xen privileged but there are no domains' do let(:vm) { nil } let(:domains) { [] } before do allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return('xen0') end it 'returns xen fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'xen', value: { 'domains' => domains }), an_object_having_attributes(name: 'xendomains', value: domains.entries.join(','), type: :legacy)) end end context 'when is xen privileged but domains are nil' do let(:vm) { nil } let(:domains) { nil } let(:result) { [] } before do allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return('xen0') end it 'returns xen fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'xen', value: { 'domains' => result }), an_object_having_attributes(name: 'xendomains', value: result.entries.join(','), type: :legacy)) end end context 'when is xen unprivileged' do let(:vm) { 'xenhvm' } let(:domains) { nil } it 'does not call Facter::Resolvers::Xen with :domains' do fact.call_the_resolver expect(Facter::Resolvers::Xen).not_to have_received(:resolve).with(:domains) end it 'returns nil fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'xen', value: domains) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linuxmint/000077500000000000000000000000001470204764400232545ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linuxmint/os/000077500000000000000000000000001470204764400236755ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/linuxmint/os/name_spec.rb000066400000000000000000000012201470204764400261470ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linuxmint::Os::Name do describe '#call_the_resolver' do subject(:fact) { Facts::Linuxmint::Os::Name.new } let(:value) { 'linuxmint' } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:id).and_return(value) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.name', value: value.capitalize), an_object_having_attributes(name: 'operatingsystem', value: value.capitalize, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/linuxmint/os/release_spec.rb000066400000000000000000000046031470204764400266570ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Linuxmint::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Linuxmint::Os::Release.new } before do allow(Facter::Resolvers::SpecificReleaseFile).to receive(:resolve) .with(:release, { release_file: '/etc/linuxmint/info', regex: /^RELEASE=(\d+)/ }) .and_return(value) end context 'when version is retrieved from specific file' do let(:value) { /^RELEASE=(\d+)/.match('RELEASE=19.4') } let(:release) { { 'full' => '19', 'major' => '19' } } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end end context 'when version is retrieved from os-release file' do let(:value) { nil } let(:os_release) { '19.4' } let(:release) { { 'full' => '19.4', 'major' => '19', 'minor' => '4' } } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(os_release) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end context 'when release can\'t be received' do let(:os_release) { nil } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.release', value: nil) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/000077500000000000000000000000001470204764400225175ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/aio_agent_version_spec.rb000066400000000000000000000010401470204764400275440ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::AioAgentVersion do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::AioAgentVersion.new } let(:value) { '1.2.3' } before do allow(Facter::Resolvers::AioAgentVersion).to receive(:resolve).with(:aio_agent_version).and_return(value) end it 'returns aio_agent_version fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'aio_agent_version', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/augeas/000077500000000000000000000000001470204764400237645ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/augeas/version_spec.rb000066400000000000000000000012241470204764400270070ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Augeas::Version do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Augeas::Version.new } let(:version) { '1.12.0' } before do allow(Facter::Resolvers::Augeas).to \ receive(:resolve).with(:augeas_version).and_return(version) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'augeas.version', value: version), an_object_having_attributes(name: 'augeasversion', value: version, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/dhcp_servers_spec.rb000066400000000000000000000021571470204764400265520ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::DhcpServers do subject(:fact) { Facts::Macosx::DhcpServers.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) allow(Facter::Resolvers::Networking).to receive(:resolve).with(:dhcp).and_return(dhcp) end describe '#call_the_resolver' do let(:value) { { 'system' => '10.16.122.163', 'eth0' => '10.16.122.163', 'en1' => '10.32.10.163' } } let(:interfaces) { { 'eth0' => { dhcp: '10.16.122.163' }, 'en1' => { dhcp: '10.32.10.163' } } } let(:dhcp) { '10.16.122.163' } it 'returns dhcp_servers' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'dhcp_servers', value: value, type: :legacy) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } let(:dhcp) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'dhcp_servers', value: nil, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/dmi/000077500000000000000000000000001470204764400232705ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/dmi/product/000077500000000000000000000000001470204764400247505ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/dmi/product/name_spec.rb000066400000000000000000000012161470204764400272270ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Dmi::Product::Name do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Dmi::Product::Name.new } let(:value) { 'MacBookPro11,4' } before do allow(Facter::Resolvers::Macosx::DmiBios).to receive(:resolve).with(:macosx_model).and_return(value) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.product.name', value: value), an_object_having_attributes(name: 'productname', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/facterversion_spec.rb000066400000000000000000000010161470204764400267260ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Facterversion do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Facterversion.new } let(:value) { '4.0.3' } before do allow(Facter::Resolvers::Facterversion).to receive(:resolve).with(:facterversion).and_return(value) end it 'returns facterversion fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'facterversion', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/filesystems_spec.rb000066400000000000000000000010351470204764400264240ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Filesystems do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Filesystems.new } let(:value) { 'apfs,autofs,devfs' } before do allow(Facter::Resolvers::Macosx::Filesystems).to receive(:resolve).with(:macosx_filesystems).and_return(value) end it 'returns filesystems fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'filesystems', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/identity/000077500000000000000000000000001470204764400243505ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/identity/gid_spec.rb000066400000000000000000000007761470204764400264640ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Identity::Gid do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Identity::Gid.new } let(:value) { '20' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:gid).and_return(value) end it 'returns identity gid fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'identity.gid', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/identity/group_spec.rb000066400000000000000000000011701470204764400270420ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Identity::Group do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Identity::Group.new } let(:value) { 'staff' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:group).and_return(value) end it 'returns identity group fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'identity.group', value: value), an_object_having_attributes(name: 'gid', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/identity/privileged_spec.rb000066400000000000000000000010441470204764400300400ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Identity::Privileged do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Identity::Privileged.new } let(:value) { 'false' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:privileged).and_return(value) end it 'returns identity privileged fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'identity.privileged', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/identity/uid_spec.rb000066400000000000000000000007771470204764400265030ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Identity::Uid do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Identity::Uid.new } let(:value) { '501' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:uid).and_return(value) end it 'returns identity uid fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'identity.uid', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/identity/user_spec.rb000066400000000000000000000011741470204764400266700ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Identity::User do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Identity::User.new } let(:value) { 'testUser' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:user).and_return(value) end it 'returns id and identity user fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'identity.user', value: value), an_object_having_attributes(name: 'id', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/interfaces_spec.rb000066400000000000000000000017061470204764400262050ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Interfaces do subject(:fact) { Facts::Macosx::Interfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { en1: { ip: '192.168.1.6' }, llw0: { ip: '192.168.1.3' } } } let(:interfaces_names) { 'en1,llw0' } it 'returns interfaces names' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'interfaces', value: interfaces_names, type: :legacy) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } let(:interfaces_names) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'interfaces', value: interfaces_names, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/ipaddress6_interfaces_spec.rb000066400000000000000000000021761470204764400303330ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Ipaddress6Interfaces do subject(:fact) { Facts::Macosx::Ipaddress6Interfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { ip6: 'fe80::99bf:da20:ad3:9bfe' }, 'en1' => { ip6: 'fe80::99bf:da20:ad3:9bfe' } } } it 'returns legacy facts with names ipaddress6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ipaddress6_eth0', value: interfaces['eth0'][:ip6], type: :legacy), an_object_having_attributes(name: 'ipaddress6_en1', value: interfaces['en1'][:ip6], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/ipaddress_interfaces_spec.rb000066400000000000000000000021371470204764400302420ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::IpaddressInterfaces do subject(:fact) { Facts::Macosx::IpaddressInterfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { ip: '10.16.117.100' }, 'en1' => { ip: '10.16.117.255' } } } it 'returns legacy facts with names ipaddress_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ipaddress_eth0', value: interfaces['eth0'][:ip], type: :legacy), an_object_having_attributes(name: 'ipaddress_en1', value: interfaces['en1'][:ip], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/is_virtual_spec.rb000066400000000000000000000045641470204764400262500ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::IsVirtual do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::IsVirtual.new } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to receive(:resolve) .with(:model_identifier) .and_return('MacBookPro11,4') allow(Facter::Resolvers::Macosx::SystemProfiler).to receive(:resolve) .with(:boot_rom_version) .and_return('1037.60.58.0.0 (iBridge: 17.16.12551.0.0,0)') allow(Facter::Resolvers::Macosx::SystemProfiler).to receive(:resolve) .with(:subsystem_vendor_id) .and_return('0x123') end context 'when on physical machine' do it 'returns resolved fact with false value' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'is_virtual', value: false) end end context 'when on virtual machine' do context 'with hypervisor vmware' do before do allow(Facter::Resolvers::Macosx::SystemProfiler) .to receive(:resolve) .with(:model_identifier) .and_return('VMware') end it 'returns resolved fact with true value' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'is_virtual', value: true) end end context 'when hypervisor VirtualBox' do before do allow(Facter::Resolvers::Macosx::SystemProfiler) .to receive(:resolve) .with(:boot_rom_version) .and_return('VirtualBox') end it 'returns resolved fact with true value' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'is_virtual', value: true) end end context 'when hypervisor Parallels' do before do allow(Facter::Resolvers::Macosx::SystemProfiler) .to receive(:resolve) .with(:subsystem_vendor_id) .and_return('0x1ab8') end it 'returns resolved fact with true value' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'is_virtual', value: true) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/kernel_spec.rb000066400000000000000000000007501470204764400253400ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Kernel do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Kernel.new } let(:value) { 'Darwin' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelname).and_return(value) end it 'returns kernel fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernel', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/kernelmajversion_spec.rb000066400000000000000000000011161470204764400274330ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Kernelmajversion do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Kernelmajversion.new } let(:resolver_result) { '18.7.0' } let(:fact_value) { '18.7' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelrelease).and_return(resolver_result) end it 'returns a kernelmajversion fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernelmajversion', value: fact_value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/kernelrelease_spec.rb000066400000000000000000000010071470204764400266750ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Kernelrelease do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Kernelrelease.new } let(:value) { '18.7.0' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelrelease).and_return(value) end it 'returns kernelrelease fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernelrelease', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/kernelversion_spec.rb000066400000000000000000000010071470204764400267420ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Kernelversion do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Kernelversion.new } let(:value) { '18.7.0' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelrelease).and_return(value) end it 'returns kernelversion fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernelversion', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/load_averages_spec.rb000066400000000000000000000011561470204764400266550ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::LoadAverages do subject(:fact) { Facts::Macosx::LoadAverages.new } let(:averages) do { '15m' => 0.0, '10m' => 0.0, '5m' => 0.0 } end describe '#call_the_resolver' do before do allow(Facter::Resolvers::Macosx::LoadAverages).to receive(:resolve).with(:load_averages).and_return(averages) end it 'returns resolved fact with name disk and value' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'load_averages', value: averages) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/macaddress_interfaces_spec.rb000066400000000000000000000021501470204764400303650ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::MacaddressInterfaces do subject(:fact) { Facts::Macosx::MacaddressInterfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { mac: '10.16.117.100' }, 'en1' => { mac: '10.16.117.255' } } } it 'returns legacy facts with names macaddress_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'macaddress_eth0', value: interfaces['eth0'][:mac], type: :legacy), an_object_having_attributes(name: 'macaddress_en1', value: interfaces['en1'][:mac], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/memory/000077500000000000000000000000001470204764400240275ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/memory/swap/000077500000000000000000000000001470204764400250015ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/memory/swap/available_bytes_spec.rb000066400000000000000000000013121470204764400314630ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Memory::Swap::AvailableBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Memory::Swap::AvailableBytes.new } let(:value) { 1024 * 1024 } let(:value_mb) { 1 } before do allow(Facter::Resolvers::Macosx::SwapMemory).to receive(:resolve).with(:available_bytes).and_return(value) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.available_bytes', value: value), an_object_having_attributes(name: 'swapfree_mb', value: value_mb, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/memory/swap/available_spec.rb000066400000000000000000000012311470204764400302550ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Memory::Swap::Available do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Memory::Swap::Available.new } let(:value) { '1.00 KiB' } before do allow(Facter::Resolvers::Macosx::SwapMemory).to receive(:resolve).with(:available_bytes).and_return(1024) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.available', value: value), an_object_having_attributes(name: 'swapfree', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/memory/swap/capacity_spec.rb000066400000000000000000000011241470204764400301330ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Memory::Swap::Capacity do describe '#call_the_resolver' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'memory.swap.capacity', value: 1024) allow(Facter::Resolvers::Macosx::SwapMemory).to receive(:resolve).with(:capacity).and_return(1024) allow(Facter::ResolvedFact).to receive(:new).with('memory.swap.capacity', 1024).and_return(expected_fact) fact = Facts::Macosx::Memory::Swap::Capacity.new expect(fact.call_the_resolver).to eq(expected_fact) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/memory/swap/encrypted_spec.rb000066400000000000000000000012231470204764400303330ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Memory::Swap::Encrypted do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Memory::Swap::Encrypted.new } let(:value) { true } before do allow(Facter::Resolvers::Macosx::SwapMemory).to receive(:resolve).with(:encrypted).and_return(value) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.encrypted', value: value), an_object_having_attributes(name: 'swapencrypted', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/memory/swap/total_bytes_spec.rb000066400000000000000000000012721470204764400306730ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Memory::Swap::TotalBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Memory::Swap::TotalBytes.new } let(:value) { 1024 * 1024 } let(:value_mb) { 1 } before do allow(Facter::Resolvers::Macosx::SwapMemory).to receive(:resolve).with(:total_bytes).and_return(value) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.total_bytes', value: value), an_object_having_attributes(name: 'swapsize_mb', value: value_mb, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/memory/swap/total_spec.rb000066400000000000000000000012111470204764400274560ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Memory::Swap::Total do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Memory::Swap::Total.new } let(:value) { '1.00 KiB' } before do allow(Facter::Resolvers::Macosx::SwapMemory).to receive(:resolve).with(:total_bytes).and_return(1024) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.total', value: value), an_object_having_attributes(name: 'swapsize', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/memory/swap/used_bytes_spec.rb000066400000000000000000000011341470204764400305050ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Memory::Swap::UsedBytes do describe '#call_the_resolver' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'memory.swap.used_bytes', value: 1024) allow(Facter::Resolvers::Macosx::SwapMemory).to receive(:resolve).with(:used_bytes).and_return(1024) allow(Facter::ResolvedFact).to receive(:new).with('memory.swap.used_bytes', 1024).and_return(expected_fact) fact = Facts::Macosx::Memory::Swap::UsedBytes.new expect(fact.call_the_resolver).to eq(expected_fact) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/memory/swap/used_spec.rb000066400000000000000000000011341470204764400272770ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Memory::Swap::Used do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Memory::Swap::Used.new } let(:resolver_result) { 1024 } let(:fact_value) { '1.00 KiB' } before do allow(Facter::Resolvers::Macosx::SwapMemory).to receive(:resolve).with(:used_bytes).and_return(resolver_result) end it 'returns a memory.swap.used fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.swap.used', value: fact_value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/memory/system/000077500000000000000000000000001470204764400253535ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/memory/system/available_bytes_spec.rb000066400000000000000000000013241470204764400320400ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Memory::System::AvailableBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Memory::System::AvailableBytes.new } let(:value) { 1024 * 1024 } let(:value_mb) { 1 } before do allow(Facter::Resolvers::Macosx::SystemMemory).to receive(:resolve).with(:available_bytes).and_return(value) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.available_bytes', value: value), an_object_having_attributes(name: 'memoryfree_mb', value: value_mb, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/memory/system/available_spec.rb000066400000000000000000000012431470204764400306320ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Memory::System::Available do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Memory::System::Available.new } let(:value) { '1.00 KiB' } before do allow(Facter::Resolvers::Macosx::SystemMemory).to receive(:resolve).with(:available_bytes).and_return(1024) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.available', value: value), an_object_having_attributes(name: 'memoryfree', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/memory/system/capacity_spec.rb000066400000000000000000000011521470204764400305060ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Memory::System::Capacity do describe '#call_the_resolver' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'memory.system.capacity', value: '15.53%') allow(Facter::Resolvers::Macosx::SystemMemory).to receive(:resolve).with(:capacity).and_return('15.53%') allow(Facter::ResolvedFact).to receive(:new).with('memory.system.capacity', '15.53%').and_return(expected_fact) fact = Facts::Macosx::Memory::System::Capacity.new expect(fact.call_the_resolver).to eq(expected_fact) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/memory/system/total_bytes_spec.rb000066400000000000000000000013041470204764400312410ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Memory::System::TotalBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Memory::System::TotalBytes.new } let(:value) { 1024 * 1024 } let(:value_mb) { 1 } before do allow(Facter::Resolvers::Macosx::SystemMemory).to receive(:resolve).with(:total_bytes).and_return(value) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.total_bytes', value: value), an_object_having_attributes(name: 'memorysize_mb', value: value_mb, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/memory/system/total_spec.rb000066400000000000000000000012231470204764400300330ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Memory::System::Total do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Memory::System::Total.new } let(:value) { '1.00 KiB' } before do allow(Facter::Resolvers::Macosx::SystemMemory).to receive(:resolve).with(:total_bytes).and_return(1024) end it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.total', value: value), an_object_having_attributes(name: 'memorysize', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/memory/system/used_bytes_spec.rb000066400000000000000000000011461470204764400310620ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Memory::System::UsedBytes do describe '#call_the_resolver' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'memory.system.used_bytes', value: 1024) allow(Facter::Resolvers::Macosx::SystemMemory).to receive(:resolve).with(:used_bytes).and_return(1024) allow(Facter::ResolvedFact).to receive(:new).with('memory.system.used_bytes', 1024).and_return(expected_fact) fact = Facts::Macosx::Memory::System::UsedBytes.new expect(fact.call_the_resolver).to eq(expected_fact) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/memory/system/used_spec.rb000066400000000000000000000011461470204764400276540ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Memory::System::Used do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Memory::System::Used.new } let(:resolver_result) { 1024 } let(:fact_value) { '1.00 KiB' } before do allow(Facter::Resolvers::Macosx::SystemMemory).to receive(:resolve).with(:used_bytes).and_return(resolver_result) end it 'returns a memory.system.used fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.system.used', value: fact_value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/mountpoints_spec.rb000066400000000000000000000036541470204764400264650ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Mountpoints do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Mountpoints.new } context 'when resolver returns hash' do let(:resolver_output) do { '/': { available: '63.31 GiB', available_bytes: 67_979_685_888, capacity: '84.64%', device: '/dev/nvme0n1p2', filesystem: 'ext4', options: %w[rw noatime], size: '434.42 GiB', size_bytes: 466_449_743_872, used: '348.97 GiB', used_bytes: 374_704_357_376 } } end let(:parsed_fact) do { '/' => { 'available' => '63.31 GiB', 'available_bytes' => 67_979_685_888, 'capacity' => '84.64%', 'device' => '/dev/nvme0n1p2', 'filesystem' => 'ext4', 'options' => %w[rw noatime], 'size' => '434.42 GiB', 'size_bytes' => 466_449_743_872, 'used' => '348.97 GiB', 'used_bytes' => 374_704_357_376 } } end before do allow(Facter::Resolvers::Macosx::Mountpoints).to \ receive(:resolve).with(:mountpoints).and_return(resolver_output) end it 'returns mountpoints information' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'mountpoints', value: parsed_fact) end end context 'when resolver returns nil' do before do allow(Facter::Resolvers::Macosx::Mountpoints).to receive(:resolve).with(:mountpoints).and_return(nil) end it 'returns mountpoints information' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'mountpoints', value: nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/mtu_interfaces_spec.rb000066400000000000000000000017071470204764400270730ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::MtuInterfaces do subject(:fact) { Facts::Macosx::MtuInterfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { mtu: 1500 }, 'en1' => { mtu: 1500 } } } it 'returns legacy facts with names mtu_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'mtu_eth0', value: interfaces['eth0'][:mtu], type: :legacy), an_object_having_attributes(name: 'mtu_en1', value: interfaces['en1'][:mtu], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/netmask6_interfaces_spec.rb000066400000000000000000000022341470204764400300120ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Netmask6Interfaces do subject(:fact) { Facts::Macosx::Netmask6Interfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) do { 'eth0' => { netmask6: 'fe80::99bf:da20:ad3:9bfe' }, 'en1' => { netmask6: 'fe80::99bf:da20:ad3:9bfe' } } end it 'returns legacy facts with names netmask6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'netmask6_eth0', value: interfaces['eth0'][:netmask6], type: :legacy), an_object_having_attributes(name: 'netmask6_en1', value: interfaces['en1'][:netmask6], type: :legacy)) end end describe '#call_the_resolver when resolver return nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/netmask_interfaces_spec.rb000066400000000000000000000021521470204764400277230ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::NetmaskInterfaces do subject(:fact) { Facts::Macosx::NetmaskInterfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { netmask: '10.255.255.255' }, 'en1' => { netmask: '10.17.255.255' } } } it 'returns legacy facts with names netmask_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'netmask_eth0', value: interfaces['eth0'][:netmask], type: :legacy), an_object_having_attributes(name: 'netmask_en1', value: interfaces['en1'][:netmask], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/network6_interfaces_spec.rb000066400000000000000000000021411470204764400300360ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Network6Interfaces do subject(:fact) { Facts::Macosx::Network6Interfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { network6: '::1' }, 'en1' => { network6: 'fe80::' } } } it 'returns legacy facts with names network6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'network6_eth0', value: interfaces['eth0'][:network6], type: :legacy), an_object_having_attributes(name: 'network6_en1', value: interfaces['en1'][:network6], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/network_interfaces_spec.rb000066400000000000000000000021521470204764400277520ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::NetworkInterfaces do subject(:fact) { Facts::Macosx::NetworkInterfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { network: '10.255.255.255' }, 'en1' => { network: '10.17.255.255' } } } it 'returns legacy facts with names network_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'network_eth0', value: interfaces['eth0'][:network], type: :legacy), an_object_having_attributes(name: 'network_en1', value: interfaces['en1'][:network], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/networking/000077500000000000000000000000001470204764400247065ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/networking/dhcp_spec.rb000066400000000000000000000014431470204764400271650ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Networking::Dhcp do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Networking::Dhcp.new } let(:value) { '192.168.158.6' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:dhcp).and_return(value) end it 'returns networking.dhcp fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.dhcp', value: value) end context 'when dhcp can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.dhcp', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/networking/domain_spec.rb000066400000000000000000000020011470204764400275050ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Networking::Domain do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Networking::Domain.new } let(:value) { 'domain' } before do allow(Facter::Resolvers::Hostname).to receive(:resolve).with(:domain).and_return(value) end it 'returns domain fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.domain', value: value), an_object_having_attributes(name: 'domain', value: value, type: :legacy)) end context 'when domain can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.domain', value: value), an_object_having_attributes(name: 'domain', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/networking/fqdn_spec.rb000066400000000000000000000017641470204764400272050ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Networking::Fqdn do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Networking::Fqdn.new } let(:value) { 'host.domain' } before do allow(Facter::Resolvers::Hostname).to receive(:resolve).with(:fqdn).and_return(value) end it 'returns fqdn fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.fqdn', value: value), an_object_having_attributes(name: 'fqdn', value: value, type: :legacy)) end context 'when fqdn can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.fqdn', value: value), an_object_having_attributes(name: 'fqdn', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/networking/hostname_spec.rb000066400000000000000000000020211470204764400300560ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Networking::Hostname do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Networking::Hostname.new } let(:value) { 'host' } before do allow(Facter::Resolvers::Hostname).to receive(:resolve).with(:hostname).and_return(value) end it 'returns hostname fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.hostname', value: value), an_object_having_attributes(name: 'hostname', value: value, type: :legacy)) end context 'when hostname can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.hostname', value: value), an_object_having_attributes(name: 'hostname', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/networking/interfaces_spec.rb000066400000000000000000000100751470204764400303730ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Networking::Interfaces do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Networking::Interfaces.new } let(:interfaces) do { 'awdl0' => { mtu: 1484, mac: '2e:ba:e4:83:4b:b7', bindings6: [{ address: 'fe80::2cba:e4ff:fe83:4bb7', netmask: 'ffff:ffff:ffff:ffff::', network: 'fe80::' }], ip6: 'fe80::2cba:e4ff:fe83:4bb7', netmask6: 'ffff:ffff:ffff:ffff::', network6: 'fe80::' }, 'bridge0' => { mtu: 1500, mac: '82:17:0e:93:9d:00' }, 'en0' => { dhcp: '192.587.6.9', mtu: 1500, mac: '64:5a:ed:ea:5c:81', bindings: [{ address: '192.168.1.2', netmask: '255.255.255.0', network: '192.168.1.0' }], ip: '192.168.1.2', netmask: '255.255.255.0', network: '192.168.1.0' }, 'gif0' => { mtu: 1280 }, 'lo0' => { mtu: 16_384, bindings: [{ address: '127.0.0.1', netmask: '255.0.0.0', network: '127.0.0.0' }], bindings6: [{ address: '::1', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network: '::1' }, { address: 'fe80::1', netmask: 'ffff:ffff:ffff:ffff::', network: 'fe80::' }], ip: '127.0.0.1', netmask: '255.0.0.0', network: '127.0.0.0', ip6: '::1', netmask6: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network6: '::1' } } end before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end it 'returns networking.interfaces fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.interfaces', value: anything) end it 'returns all interfaces' do interfaces = %w[awdl0 bridge0 en0 gif0 lo0] result = fact.call_the_resolver expect(result.value).to include(*interfaces) end it 'returns the interface awdl0 correctly' do expected = { 'mtu' => 1484, 'mac' => '2e:ba:e4:83:4b:b7', 'bindings6' => [{ 'address' => 'fe80::2cba:e4ff:fe83:4bb7', 'netmask' => 'ffff:ffff:ffff:ffff::', 'network' => 'fe80::' }], 'ip6' => 'fe80::2cba:e4ff:fe83:4bb7', 'netmask6' => 'ffff:ffff:ffff:ffff::', 'network6' => 'fe80::' } result = fact.call_the_resolver expect(result.value['awdl0']).to match(expected) end it 'returns the interface bridge0 correctly' do result = fact.call_the_resolver expect(result.value['bridge0']).to match({ 'mtu' => 1500, 'mac' => '82:17:0e:93:9d:00' }) end it 'returns the interface en0 correctly' do expected = { 'mtu' => 1500, 'mac' => '64:5a:ed:ea:5c:81', 'bindings' => [{ 'address' => '192.168.1.2', 'netmask' => '255.255.255.0', 'network' => '192.168.1.0' }], 'ip' => '192.168.1.2', 'netmask' => '255.255.255.0', 'network' => '192.168.1.0', 'dhcp' => '192.587.6.9' } result = fact.call_the_resolver expect(result.value['en0']).to match(expected) end it 'returns the interface gif0 correctly' do result = fact.call_the_resolver expect(result.value['gif0']).to match({ 'mtu' => 1280 }) end context 'when interfaces can not be retrieved' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.interfaces', value: interfaces) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/networking/ip6_spec.rb000066400000000000000000000020151470204764400267410ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Networking::Ip6 do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Networking::Ip6.new } let(:value) { 'fe80::2cba:e4ff:fe83:4bb7' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:ip6).and_return(value) end it 'returns the ip6 fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip6', value: value), an_object_having_attributes(name: 'ipaddress6', value: value, type: :legacy)) end context 'when ip6 can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip6', value: value), an_object_having_attributes(name: 'ipaddress6', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/networking/ip_spec.rb000066400000000000000000000017641470204764400266650ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Networking::Ip do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Networking::Ip.new } let(:value) { '10.0.0.1' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:ip).and_return(value) end it 'returns the ip6 fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip', value: value), an_object_having_attributes(name: 'ipaddress', value: value, type: :legacy)) end context 'when ip can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip', value: value), an_object_having_attributes(name: 'ipaddress', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/networking/mac_spec.rb000066400000000000000000000020101470204764400267760ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Networking::Mac do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Networking::Mac.new } let(:value) { '64:5a:ed:ea:c3:25' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:mac).and_return(value) end it 'returns macaddress fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.mac', value: value), an_object_having_attributes(name: 'macaddress', value: value, type: :legacy)) end context 'when mac can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.mac', value: value), an_object_having_attributes(name: 'macaddress', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/networking/mtu_spec.rb000066400000000000000000000014061470204764400270530ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Networking::Mtu do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Networking::Mtu.new } let(:value) { 1500 } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:mtu).and_return(value) end it 'returns mtu fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.mtu', value: value) end context 'when mtu can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.mtu', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/networking/netmask6_spec.rb000066400000000000000000000020501470204764400277720ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Networking::Netmask6 do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Networking::Netmask6.new } let(:value) { 'ffff:ffff:ffff:ffff::' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:netmask6).and_return(value) end it 'returns the netmask6 fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask6', value: value), an_object_having_attributes(name: 'netmask6', value: value, type: :legacy)) end context 'when netmask6 can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask6', value: value), an_object_having_attributes(name: 'netmask6', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/networking/netmask_spec.rb000066400000000000000000000020271470204764400277100ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Networking::Netmask do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Networking::Netmask.new } let(:value) { '255.255.255.0' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:netmask).and_return(value) end it 'returns the netmask fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask', value: value), an_object_having_attributes(name: 'netmask', value: value, type: :legacy)) end context 'when netmask can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask', value: value), an_object_having_attributes(name: 'netmask', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/networking/network6_spec.rb000066400000000000000000000020361470204764400300250ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Networking::Network6 do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Networking::Network6.new } let(:value) { 'ff80:3454::' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:network6).and_return(value) end it 'returns the network6 fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network6', value: value), an_object_having_attributes(name: 'network6', value: value, type: :legacy)) end context 'when network6 can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network6', value: value), an_object_having_attributes(name: 'network6', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/networking/network_spec.rb000066400000000000000000000020271470204764400277370ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Networking::Network do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Networking::Network.new } let(:value) { '192.168.143.0' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:network).and_return(value) end it 'returns the network fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network', value: value), an_object_having_attributes(name: 'network', value: value, type: :legacy)) end context 'when network can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network', value: value), an_object_having_attributes(name: 'network', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/networking/primary_spec.rb000066400000000000000000000015021470204764400277260ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Networking::Primary do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Networking::Primary.new } let(:value) { 'en0' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:primary_interface).and_return(value) end it 'returns networking.primary fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.primary', value: value) end context 'when primary interface can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.primary', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/networking/scope6_spec.rb000066400000000000000000000017761470204764400274570ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Networking::Scope6 do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Networking::Scope6.new } let(:value) { 'link' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:scope6).and_return(value) end it 'returns scope6 fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'networking.scope6', value: value), an_object_having_attributes(name: 'scope6', value: value)) end context 'when scope6 can not be resolved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'networking.scope6', value: value), an_object_having_attributes(name: 'scope6', value: value)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/os/000077500000000000000000000000001470204764400231405ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/os/architecture_spec.rb000066400000000000000000000011761470204764400271660ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Os::Architecture do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Os::Architecture.new } let(:value) { 'x86_64' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:machine).and_return(value) end it 'returns architecture fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.architecture', value: value), an_object_having_attributes(name: 'architecture', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/os/family_spec.rb000066400000000000000000000011501470204764400257550ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Os::Family do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Os::Family.new } let(:value) { 'Darwin' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelname).and_return(value) end it 'returns os family fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.family', value: value), an_object_having_attributes(name: 'osfamily', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/os/hardware_spec.rb000066400000000000000000000011541470204764400262750ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Os::Hardware do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Os::Hardware.new } let(:value) { 'value' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:machine).and_return(value) end it 'returns augeas fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.hardware', value: value), an_object_having_attributes(name: 'hardwaremodel', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/os/macosx/000077500000000000000000000000001470204764400244325ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/os/macosx/build_spec.rb000066400000000000000000000012351470204764400270710ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Os::Macosx::Build do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Os::Macosx::Build.new } let(:version) { '10.9.8' } before do allow(Facter::Resolvers::SwVers).to \ receive(:resolve).with(:buildversion).and_return(version) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.macosx.build', value: version), an_object_having_attributes(name: 'macosx_buildversion', value: version, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/os/macosx/product_spec.rb000066400000000000000000000012431470204764400274510ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Os::Macosx::Product do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Os::Macosx::Product.new } let(:product) { 'Mac OS X' } before do allow(Facter::Resolvers::SwVers).to \ receive(:resolve).with(:productname).and_return(product) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.macosx.product', value: product), an_object_having_attributes(name: 'macosx_productname', value: product, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/os/macosx/version_spec.rb000066400000000000000000000137241470204764400274650ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Os::Macosx::Version do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Os::Macosx::Version.new } context 'when macOS version < 11' do let(:resolver_output) { '10.9.8' } let(:resolver_extra_output) { nil } let(:version) { { 'full' => '10.9.8', 'major' => '10.9', 'minor' => '8' } } before do allow(Facter::Resolvers::SwVers).to \ receive(:resolve).with(:productversion).and_return(resolver_output) allow(Facter::Resolvers::SwVers).to \ receive(:resolve).with(:productversionextra).and_return(resolver_extra_output) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.macosx.version', value: version), an_object_having_attributes(name: 'macosx_productversion', value: resolver_output, type: :legacy), an_object_having_attributes(name: 'macosx_productversion_major', value: version['major'], type: :legacy), an_object_having_attributes(name: 'macosx_productversion_minor', value: version['minor'], type: :legacy), an_object_having_attributes(name: 'macosx_productversion_patch', value: version['patch'], type: :legacy)) end end context 'when macOS version >= 11 and < 13' do let(:resolver_output) { '11.2.1' } let(:resolver_extra_output) { nil } let(:version) { { 'full' => '11.2.1', 'major' => '11', 'minor' => '2', 'patch' => '1' } } before do allow(Facter::Resolvers::SwVers).to \ receive(:resolve).with(:productversion).and_return(resolver_output) allow(Facter::Resolvers::SwVers).to \ receive(:resolve).with(:productversionextra).and_return(resolver_extra_output) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.macosx.version', value: version), an_object_having_attributes(name: 'macosx_productversion', value: resolver_output, type: :legacy), an_object_having_attributes(name: 'macosx_productversion_major', value: version['major'], type: :legacy), an_object_having_attributes(name: 'macosx_productversion_minor', value: version['minor'], type: :legacy), an_object_having_attributes(name: 'macosx_productversion_patch', value: version['patch'], type: :legacy)) end end context 'when macOS version >= 13' do let(:resolver_output) { '13.3.1' } let(:resolver_extra_output) { nil } let(:version) { { 'full' => '13.3.1', 'major' => '13', 'minor' => '3', 'patch' => '1' } } before do allow(Facter::Resolvers::SwVers).to \ receive(:resolve).with(:productversion).and_return(resolver_output) allow(Facter::Resolvers::SwVers).to \ receive(:resolve).with(:productversionextra).and_return(resolver_extra_output) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.macosx.version', value: version), an_object_having_attributes(name: 'macosx_productversion', value: resolver_output, type: :legacy), an_object_having_attributes(name: 'macosx_productversion_major', value: version['major'], type: :legacy), an_object_having_attributes(name: 'macosx_productversion_minor', value: version['minor'], type: :legacy), an_object_having_attributes(name: 'macosx_productversion_patch', value: version['patch'], type: :legacy)) end end context 'when macOS version >= 13 with RSR' do let(:resolver_output) { '13.3.1' } let(:resolver_extra_output) { '(a)' } let(:version) { { 'full' => '13.3.1', 'major' => '13', 'minor' => '3', 'patch' => '1', 'extra' => '(a)' } } before do allow(Facter::Resolvers::SwVers).to \ receive(:resolve).with(:productversion).and_return(resolver_output) allow(Facter::Resolvers::SwVers).to \ receive(:resolve).with(:productversionextra).and_return(resolver_extra_output) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.macosx.version', value: version), an_object_having_attributes(name: 'macosx_productversion', value: resolver_output, type: :legacy), an_object_having_attributes(name: 'macosx_productversion_major', value: version['major'], type: :legacy), an_object_having_attributes(name: 'macosx_productversion_minor', value: version['minor'], type: :legacy), an_object_having_attributes(name: 'macosx_productversion_patch', value: version['patch'], type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/os/name_spec.rb000066400000000000000000000011651470204764400254220ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Os::Name do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Os::Name.new } let(:value) { 'Darwin' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelname).and_return(value) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.name', value: value), an_object_having_attributes(name: 'operatingsystem', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/os/release_spec.rb000066400000000000000000000017501470204764400261220ustar00rootroot00000000000000# frozen_string_literal: true # fozen_string_literal: true describe Facts::Macosx::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Os::Release.new } let(:value) { '10.9' } let(:value_final) { { 'full' => '10.9', 'major' => '10', 'minor' => '9' } } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelrelease).and_return('10.9') end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: value_final), an_object_having_attributes(name: 'operatingsystemmajrelease', value: value_final['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: value_final['full'], type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/path_spec.rb000066400000000000000000000010621470204764400250110ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Path do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Path.new } let(:value) { '/usr/bin:/etc:/usr/sbin:/usr/ucb:/usr/bin/X11:/sbin:/usr/java6/jre/bin:/usr/java6/bin' } before do allow(Facter::Resolvers::Path).to \ receive(:resolve).with(:path).and_return(value) end it 'returns path fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'path', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/processors/000077500000000000000000000000001470204764400247215ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/processors/cores_spec.rb000066400000000000000000000011031470204764400273660ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Processors::Cores do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Processors::Cores.new } let(:cores_per_socket) { 4 } before do allow(Facter::Resolvers::Macosx::Processors).to \ receive(:resolve).with(:cores_per_socket).and_return(cores_per_socket) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'processors.cores', value: cores_per_socket) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/processors/count_spec.rb000066400000000000000000000012541470204764400274120ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Processors::Count do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Processors::Count.new } let(:processors) { '4' } before do allow(Facter::Resolvers::Macosx::Processors).to \ receive(:resolve).with(:logicalcount).and_return(processors) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.count', value: processors), an_object_having_attributes(name: 'processorcount', value: processors, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/processors/isa_spec.rb000066400000000000000000000011721470204764400270350ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Processors::Isa do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Processors::Isa.new } let(:isa) { 'i386' } before do allow(Facter::Resolvers::Uname).to \ receive(:resolve).with(:processor).and_return(isa) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.isa', value: isa), an_object_having_attributes(name: 'hardwareisa', value: isa, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/processors/models_spec.rb000066400000000000000000000015051470204764400275440ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Processors::Models do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Processors::Models.new } let(:value) { 'Intel(R) Core(TM) i7-4980HQ CPU @ 2.80GHz' } let(:models) { [value, value] } before do allow(Facter::Resolvers::Macosx::Processors).to \ receive(:resolve).with(:models).and_return(models) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.models', value: models), an_object_having_attributes(name: 'processor0', value: value, type: :legacy), an_object_having_attributes(name: 'processor1', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/processors/physicalcount_spec.rb000066400000000000000000000014151470204764400311460ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Processors::Physicalcount do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Processors::Physicalcount.new } let(:physicalcount) { '5' } before do allow(Facter::Resolvers::Macosx::Processors).to \ receive(:resolve).with(:physicalcount).and_return(physicalcount) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.physicalcount', value: physicalcount), an_object_having_attributes(name: 'physicalprocessorcount', value: physicalcount, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/processors/speed_spec.rb000066400000000000000000000011261470204764400273600ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Processors::Speed do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Processors::Speed.new } let(:speed) { 1_800_000_000 } let(:converted_speed) { '1.80 GHz' } before do allow(Facter::Resolvers::Macosx::Processors).to \ receive(:resolve).with(:speed).and_return(speed) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'processors.speed', value: converted_speed) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/processors/threads_spec.rb000066400000000000000000000011111470204764400277040ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Processors::Threads do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Processors::Threads.new } let(:threads_per_core) { 4 } before do allow(Facter::Resolvers::Macosx::Processors).to \ receive(:resolve).with(:threads_per_core).and_return(threads_per_core) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'processors.threads', value: threads_per_core) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/ruby/000077500000000000000000000000001470204764400235005ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/ruby/platform_spec.rb000066400000000000000000000012061470204764400266620ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Ruby::Platform do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Ruby::Platform.new } let(:value) { 'x86_64-linux' } before do allow(Facter::Resolvers::Ruby).to \ receive(:resolve).with(:platform).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ruby.platform', value: value), an_object_having_attributes(name: 'rubyplatform', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/ruby/sitedir_spec.rb000066400000000000000000000012441470204764400265030ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Ruby::Sitedir do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Ruby::Sitedir.new } let(:value) { '/opt/puppetlabs/puppet/lib/ruby/site_ruby/2.6.3' } before do allow(Facter::Resolvers::Ruby).to \ receive(:resolve).with(:sitedir).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ruby.sitedir', value: value), an_object_having_attributes(name: 'rubysitedir', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/ruby/version_spec.rb000066400000000000000000000011771470204764400265320ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Ruby::Version do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Ruby::Version.new } let(:value) { '2.5.9' } before do allow(Facter::Resolvers::Ruby).to receive(:resolve).with(:version).and_return(value) end it 'returns ruby version fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'ruby.version', value: value), an_object_having_attributes(name: 'rubyversion', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/scope6_interfaces_spec.rb000066400000000000000000000021431470204764400274600ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Scope6Interfaces do subject(:fact) { Facts::Macosx::Scope6Interfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { scope6: 'link' }, 'en1' => { scope6: 'global' } } } it 'returns legacy facts with scope6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'scope6_eth0', value: interfaces['eth0'][:scope6], type: :legacy), an_object_having_attributes(name: 'scope6_en1', value: interfaces['en1'][:scope6], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } let(:scope6) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/ssh_spec.rb000066400000000000000000000021031470204764400246470ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Ssh do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Ssh.new } let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'ecdsa', 'test', 'ecdsa')] end let(:value) do { 'ecdsa' => { 'fingerprints' => { 'sha1' => 'test', 'sha256' => 'test' }, 'key' => 'test', 'type' => 'ecdsa' } } end before do allow(Facter::Resolvers::Ssh).to \ receive(:resolve).with(:ssh).and_return(ssh) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ssh', value: value) end context 'when resolver returns empty list' do let(:ssh) { [] } it 'returns a nil fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ssh', value: nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/sshalgorithmkey_spec.rb000066400000000000000000000020531470204764400272730ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Sshalgorithmkey do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Sshalgorithmkey.new } let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'ecdsa', 'test', 'ecdsa'), Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'rsa', 'test', 'rsa')] end let(:legacy_fact1) { { name: 'ecdsa', value: 'test' } } let(:legacy_fact2) { { name: 'rsa', value: 'test' } } before do allow(Facter::Resolvers::Ssh).to \ receive(:resolve).with(:ssh).and_return(ssh) end it 'returns a list of resolved facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: "ssh#{legacy_fact1[:name]}key", value: legacy_fact1[:value]), an_object_having_attributes(name: "ssh#{legacy_fact2[:name]}key", value: legacy_fact2[:value])) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/sshfp_algorithm_spec.rb000066400000000000000000000021051470204764400272450ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SshfpAlgorithm do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SshfpAlgorithm.new } let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('sha11', 'sha2561'), 'ecdsa', 'test', 'ecdsa'), Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('sha12', 'sha2562'), 'rsa', 'test', 'rsa')] end let(:legacy_fact1) { { name: 'ecdsa', value: "sha11\nsha2561" } } let(:legacy_fact2) { { name: 'rsa', value: "sha12\nsha2562" } } before do allow(Facter::Resolvers::Ssh).to \ receive(:resolve).with(:ssh).and_return(ssh) end it 'returns a list of resolved facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: "sshfp_#{legacy_fact1[:name]}", value: legacy_fact1[:value]), an_object_having_attributes(name: "sshfp_#{legacy_fact2[:name]}", value: legacy_fact2[:value])) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/000077500000000000000000000000001470204764400257455ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/boot_mode_spec.rb000066400000000000000000000012631470204764400312550ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::BootMode do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::BootMode.new } let(:value) { 'Normal' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:boot_mode).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.boot_mode', value: value), an_object_having_attributes(name: 'sp_boot_mode', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/boot_rom_version_spec.rb000066400000000000000000000013311470204764400326670ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::BootRomVersion do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::BootRomVersion.new } let(:value) { '194.0.0.0.0' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:boot_rom_version).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.boot_rom_version', value: value), an_object_having_attributes(name: 'sp_boot_rom_version', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/boot_volume_spec.rb000066400000000000000000000013031470204764400316330ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::BootVolume do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::BootVolume.new } let(:value) { 'Macintosh HD' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:boot_volume).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.boot_volume', value: value), an_object_having_attributes(name: 'sp_boot_volume', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/computer_name_spec.rb000066400000000000000000000013301470204764400321370ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::ComputerName do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::ComputerName.new } let(:value) { 'Test1’s MacBook Pro' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:computer_name).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.computer_name', value: value), an_object_having_attributes(name: 'sp_local_host_name', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/cores_spec.rb000066400000000000000000000012671470204764400304250ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::Cores do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::Cores.new } let(:value) { '' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:total_number_of_cores).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.cores', value: value), an_object_having_attributes(name: 'sp_number_processors', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/hardware_uuid_spec.rb000066400000000000000000000013451470204764400321320ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::HardwareUuid do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::HardwareUuid.new } let(:value) { '7C3B701F-B88A-56C6-83F4-ACBD450075C4' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:hardware_uuid).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.hardware_uuid', value: value), an_object_having_attributes(name: 'sp_platform_uuid', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/kernel_version_spec.rb000066400000000000000000000013231470204764400323300ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::KernelVersion do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::KernelVersion.new } let(:value) { 'Darwin 18.7.0' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:kernel_version).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.kernel_version', value: value), an_object_having_attributes(name: 'sp_kernel_version', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/l2_cache_per_core_spec.rb000066400000000000000000000013231470204764400326210ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::L2CachePerCore do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::L2CachePerCore.new } let(:value) { '256 KB' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:l2_cache_per_core).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.l2_cache_per_core', value: value), an_object_having_attributes(name: 'sp_l2_cache_core', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/l3_cache_spec.rb000066400000000000000000000012541470204764400307470ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::L3Cache do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::L3Cache.new } let(:value) { '6 MB' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:l3_cache).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.l3_cache', value: value), an_object_having_attributes(name: 'sp_l3_cache', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/memory_spec.rb000066400000000000000000000012561470204764400306200ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::Memory do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::Memory.new } let(:value) { '16 GB' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:memory).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.memory', value: value), an_object_having_attributes(name: 'sp_physical_memory', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/model_identifier_spec.rb000066400000000000000000000013331470204764400326060ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::ModelIdentifier do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::ModelIdentifier.new } let(:value) { 'MacBookPro11,4' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:model_identifier).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.model_identifier', value: value), an_object_having_attributes(name: 'sp_machine_model', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/model_name_spec.rb000066400000000000000000000012771470204764400314130ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::ModelName do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::ModelName.new } let(:value) { 'MacBook Pro' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:model_name).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.model_name', value: value), an_object_having_attributes(name: 'sp_machine_name', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/processor_name_spec.rb000066400000000000000000000013151470204764400323230ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::ProcessorName do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::ProcessorName.new } let(:value) { 'Intel Core i7' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:processor_name).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.processor_name', value: value), an_object_having_attributes(name: 'sp_cpu_type', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/processor_speed_spec.rb000066400000000000000000000013321470204764400325020ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::ProcessorSpeed do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::ProcessorSpeed.new } let(:value) { '2.8 GHz' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:processor_speed).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.processor_speed', value: value), an_object_having_attributes(name: 'sp_current_processor_speed', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/processors_spec.rb000066400000000000000000000012751470204764400315130ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::Processors do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::Processors.new } let(:value) { '1' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:number_of_processors).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.processors', value: value), an_object_having_attributes(name: 'sp_packages', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/secure_virtual_memory_spec.rb000066400000000000000000000013421470204764400337300ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::SecureVirtualMemory do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::SecureVirtualMemory.new } let(:value) { 'Enabled' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:secure_virtual_memory).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.secure_virtual_memory', value: value), an_object_having_attributes(name: 'sp_secure_vm', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/serial_number_spec.rb000066400000000000000000000013241470204764400321330ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::SerialNumber do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::SerialNumber.new } let(:value) { 'C02WW1LAG8WL' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:serial_number_system).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.serial_number', value: value), an_object_having_attributes(name: 'sp_serial_number', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/smc_version_spec.rb000066400000000000000000000013141470204764400316320ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::SmcVersion do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::SmcVersion.new } let(:value) { '2.29f24' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:smc_version_system).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.smc_version', value: value), an_object_having_attributes(name: 'sp_smc_version_system', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/system_version_spec.rb000066400000000000000000000013271470204764400324000ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::SystemVersion do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::SystemVersion.new } let(:value) { 'macOS 10.14.6 (18G95)' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:system_version).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.system_version', value: value), an_object_having_attributes(name: 'sp_os_version', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/uptime_spec.rb000066400000000000000000000012661470204764400306140ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::Uptime do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::Uptime.new } let(:value) { '26 days 22:12' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:time_since_boot).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.uptime', value: value), an_object_having_attributes(name: 'sp_uptime', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_profiler/username_spec.rb000066400000000000000000000013051470204764400311220ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemProfiler::Username do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemProfiler::Username.new } let(:value) { 'Test1 Test2 (test1.test2)' } before do allow(Facter::Resolvers::Macosx::SystemProfiler).to \ receive(:resolve).with(:user_name).and_return(value) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_profiler.username', value: value), an_object_having_attributes(name: 'sp_user_name', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_uptime/000077500000000000000000000000001470204764400254265ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_uptime/days_spec.rb000066400000000000000000000012021470204764400277200ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemUptime::Days do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemUptime::Days.new } let(:days) { '11' } before do allow(Facter::Resolvers::Uptime).to \ receive(:resolve).with(:days).and_return(days) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.days', value: days), an_object_having_attributes(name: 'uptime_days', value: days, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_uptime/hours_spec.rb000066400000000000000000000012121470204764400301210ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemUptime::Hours do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemUptime::Hours.new } let(:hours) { '2' } before do allow(Facter::Resolvers::Uptime).to \ receive(:resolve).with(:hours).and_return(hours) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.hours', value: hours), an_object_having_attributes(name: 'uptime_hours', value: hours, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_uptime/seconds_spec.rb000066400000000000000000000012411470204764400304210ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemUptime::Seconds do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemUptime::Seconds.new } let(:seconds) { '123094' } before do allow(Facter::Resolvers::Uptime).to \ receive(:resolve).with(:seconds).and_return(seconds) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.seconds', value: seconds), an_object_having_attributes(name: 'uptime_seconds', value: seconds, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/system_uptime/uptime_spec.rb000066400000000000000000000012221470204764400302650ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::SystemUptime::Uptime do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::SystemUptime::Uptime.new } let(:uptime) { '10 days' } before do allow(Facter::Resolvers::Uptime).to \ receive(:resolve).with(:uptime).and_return(uptime) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.uptime', value: uptime), an_object_having_attributes(name: 'uptime', value: uptime, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/timezone_spec.rb000066400000000000000000000010031470204764400257020ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Timezone do describe '#call_the_resolver' do subject(:fact) { Facts::Macosx::Timezone.new } let(:timezone) { 'UTC' } before do allow(Facter::Resolvers::Timezone).to \ receive(:resolve).with(:timezone).and_return(timezone) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'timezone', value: timezone) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/macosx/virtual_spec.rb000066400000000000000000000046311470204764400255500ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Macosx::Virtual do subject(:fact) { Facts::Macosx::Virtual.new } describe '#call_the_resolver' do before do allow(Facter::Resolvers::Macosx::SystemProfiler).to receive(:resolve) .with(:model_identifier) .and_return('MacBookPro11,4') allow(Facter::Resolvers::Macosx::SystemProfiler).to receive(:resolve) .with(:boot_rom_version) .and_return('1037.60.58.0.0 (iBridge: 17.16.12551.0.0,0)') allow(Facter::Resolvers::Macosx::SystemProfiler).to receive(:resolve) .with(:subsystem_vendor_id) .and_return('0x123') end context 'when on physical machine' do it 'returns resolved fact with true value' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'virtual', value: 'physical') fact.call_the_resolver end end context 'when on virtual machine' do context 'with hypervisor vmware' do before do allow(Facter::Resolvers::Macosx::SystemProfiler) .to receive(:resolve) .with(:model_identifier) .and_return('VMware') end it 'returns resolved fact with true value' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'virtual', value: 'vmware') end end context 'when hypervisor VirtualBox' do before do allow(Facter::Resolvers::Macosx::SystemProfiler) .to receive(:resolve) .with(:boot_rom_version) .and_return('VirtualBox') end it 'returns resolved fact with true value' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'virtual', value: 'virtualbox') end end context 'when hypervisor Parallels' do before do allow(Facter::Resolvers::Macosx::SystemProfiler) .to receive(:resolve) .with(:subsystem_vendor_id) .and_return('0x1ab8') end it 'returns resolved fact with true value' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'virtual', value: 'parallels') end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/mageia/000077500000000000000000000000001470204764400224505ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/mageia/os/000077500000000000000000000000001470204764400230715ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/mageia/os/release_spec.rb000066400000000000000000000046521470204764400260570ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Mageia::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Mageia::Os::Release.new } before do allow(Facter::Resolvers::SpecificReleaseFile).to receive(:resolve) .with(:release, { release_file: '/etc/mageia-release', regex: /Mageia release ([0-9.]+)/ }) .and_return(value) end context 'when version is retrieved from specific file' do let(:value) { /Mageia release ([0-9.]+)/.match('Mageia release 19.4') } let(:release) { { 'full' => '19.4', 'major' => '19', 'minor' => '4' } } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end end context 'when version is retrieved from os-release file' do let(:value) { nil } let(:os_release) { '19.4' } let(:release) { { 'full' => '19.4', 'major' => '19', 'minor' => '4' } } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(os_release) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end context 'when release can\'t be received' do let(:os_release) { nil } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.release', value: nil) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/mariner/000077500000000000000000000000001470204764400226625ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/mariner/os/000077500000000000000000000000001470204764400233035ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/mariner/os/release_spec.rb000066400000000000000000000047021470204764400262650ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Mariner::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Mariner::Os::Release.new } before do allow(Facter::Resolvers::SpecificReleaseFile).to receive(:resolve) .with(:release, { release_file: '/etc/mariner-release', regex: /CBL-Mariner ([0-9.]+)/ }) .and_return(value) end context 'when version is retrieved from specific file' do let(:value) { /CBL-Mariner ([0-9.]+)/.match('CBL-Mariner 2.0.20220824') } let(:release) { { 'full' => '2.0.20220824', 'major' => '2', 'minor' => '0' } } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end end context 'when version is retrieved from os-release file' do let(:value) { nil } let(:os_release) { '2.0.20220824' } let(:release) { { 'full' => '2.0.20220824', 'major' => '2', 'minor' => '0' } } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(os_release) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end context 'when release can\'t be received' do let(:os_release) { nil } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.release', value: nil) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/meego/000077500000000000000000000000001470204764400223215ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/meego/os/000077500000000000000000000000001470204764400227425ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/meego/os/release_spec.rb000066400000000000000000000044711470204764400257270ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Meego::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Meego::Os::Release.new } before do allow(Facter::Resolvers::ReleaseFromFirstLine).to receive(:resolve) .with(:release, { release_file: '/etc/meego-release' }) .and_return(value) end context 'when version is retrieved from specific file' do let(:value) { '2.13.0' } let(:release) { { 'full' => '2.13.0', 'major' => '2', 'minor' => '13' } } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end end context 'when version is retrieved from os-release file' do let(:value) { nil } let(:os_release) { 'beowulf' } let(:release) { { 'full' => 'beowulf', 'major' => 'beowulf' } } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(os_release) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end context 'when release can\'t be received' do let(:os_release) { nil } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.release', value: nil) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/oel/000077500000000000000000000000001470204764400220045ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/oel/os/000077500000000000000000000000001470204764400224255ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/oel/os/release_spec.rb000066400000000000000000000044721470204764400254130ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Oel::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Oel::Os::Release.new } before do allow(Facter::Resolvers::ReleaseFromFirstLine).to receive(:resolve) .with(:release, { release_file: '/etc/enterprise-release' }) .and_return(value) end context 'when version is retrieved from specific file' do let(:value) { '2.13.0' } let(:release) { { 'full' => '2.13.0', 'major' => '2', 'minor' => '13' } } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end end context 'when version is retrieved from os-release file' do let(:value) { nil } let(:os_release) { 'beowulf' } let(:release) { { 'full' => 'beowulf', 'major' => 'beowulf' } } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(os_release) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end context 'when release can\'t be received' do let(:os_release) { nil } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.release', value: nil) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/ol/000077500000000000000000000000001470204764400216375ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/ol/os/000077500000000000000000000000001470204764400222605ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/ol/os/release_spec.rb000066400000000000000000000044641470204764400252470ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Ol::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Ol::Os::Release.new } before do allow(Facter::Resolvers::ReleaseFromFirstLine).to receive(:resolve) .with(:release, { release_file: '/etc/oracle-release' }) .and_return(value) end context 'when version is retrieved from specific file' do let(:value) { '2.13.0' } let(:release) { { 'full' => '2.13.0', 'major' => '2', 'minor' => '13' } } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end end context 'when version is retrieved from os-release file' do let(:value) { nil } let(:os_release) { 'beowulf' } let(:release) { { 'full' => 'beowulf', 'major' => 'beowulf' } } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(os_release) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end context 'when release can\'t be received' do let(:os_release) { nil } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.release', value: nil) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/000077500000000000000000000000001470204764400226575ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/augeas/000077500000000000000000000000001470204764400241245ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/augeas/version_spec.rb000066400000000000000000000015011470204764400271450ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Augeas::Version do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Augeas::Version.new } let(:version) { '1.12.0' } before do allow(Facter::Resolvers::Augeas).to \ receive(:resolve).with(:augeas_version).and_return(version) end it 'calls Facter::Resolvers::Augeas' do fact.call_the_resolver expect(Facter::Resolvers::Augeas).to have_received(:resolve).with(:augeas_version) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'augeas.version', value: version), an_object_having_attributes(name: 'augeasversion', value: version, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/dmi/000077500000000000000000000000001470204764400234305ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/dmi/bios/000077500000000000000000000000001470204764400243645ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/dmi/bios/vendor_spec.rb000066400000000000000000000015531470204764400272240ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Dmi::Bios::Vendor do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Dmi::Bios::Vendor.new } let(:vendor) { 'Phoenix Technologies LTD' } before do allow(Facter::Resolvers::Openbsd::DmiBios).to \ receive(:resolve).with(:bios_vendor).and_return(vendor) end it 'calls Facter::Resolvers::Openbsd::DmiBios' do fact.call_the_resolver expect(Facter::Resolvers::Openbsd::DmiBios).to have_received(:resolve).with(:bios_vendor) end it 'returns bios vendor fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.bios.vendor', value: vendor), an_object_having_attributes(name: 'bios_vendor', value: vendor, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/dmi/bios/version_spec.rb000066400000000000000000000015421470204764400274120ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Dmi::Bios::Version do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Dmi::Bios::Version.new } let(:version) { '6.00' } before do allow(Facter::Resolvers::Openbsd::DmiBios).to \ receive(:resolve).with(:bios_version).and_return(version) end it 'calls Facter::Resolvers::Openbsd::DmiBios' do fact.call_the_resolver expect(Facter::Resolvers::Openbsd::DmiBios).to have_received(:resolve).with(:bios_version) end it 'returns bios version fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.bios.version', value: version), an_object_having_attributes(name: 'bios_version', value: version, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/dmi/manufacturer_spec.rb000066400000000000000000000015531470204764400274670ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Dmi::Manufacturer do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Dmi::Manufacturer.new } let(:sys_vendor) { 'OpenBSD' } before do allow(Facter::Resolvers::Openbsd::DmiBios).to \ receive(:resolve).with(:sys_vendor).and_return(sys_vendor) end it 'calls Facter::Resolvers::Openbsd::DmiBios' do fact.call_the_resolver expect(Facter::Resolvers::Openbsd::DmiBios).to have_received(:resolve).with(:sys_vendor) end it 'returns manufacturer fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.manufacturer', value: sys_vendor), an_object_having_attributes(name: 'manufacturer', value: sys_vendor, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/dmi/product/000077500000000000000000000000001470204764400251105ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/dmi/product/name_spec.rb000066400000000000000000000015641470204764400273750ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Dmi::Product::Name do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Dmi::Product::Name.new } let(:product_name) { 'VMM' } before do allow(Facter::Resolvers::Openbsd::DmiBios).to \ receive(:resolve).with(:product_name).and_return(product_name) end it 'calls Facter::Resolvers::Openbsd::DmiBios' do fact.call_the_resolver expect(Facter::Resolvers::Openbsd::DmiBios).to have_received(:resolve).with(:product_name) end it 'returns product name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.product.name', value: product_name), an_object_having_attributes(name: 'productname', value: product_name, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/dmi/product/serial_number_spec.rb000066400000000000000000000030041470204764400312730ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Dmi::Product::SerialNumber do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Dmi::Product::SerialNumber.new } context 'when resolver returns serial number' do let(:serial_number) { '17425315' } before do allow(Facter::Resolvers::Openbsd::DmiBios).to \ receive(:resolve).with(:product_serial).and_return(serial_number) end it 'calls Facter::Resolvers::Openbsd::DmiBios' do fact.call_the_resolver expect(Facter::Resolvers::Openbsd::DmiBios).to have_received(:resolve).with(:product_serial) end it 'returns resolved facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.product.serial_number', value: serial_number), an_object_having_attributes(name: 'serialnumber', value: serial_number, type: :legacy)) end end context 'when resolver returns nil' do before do allow(Facter::Resolvers::Openbsd::DmiBios).to \ receive(:resolve).with(:product_serial).and_return(nil) end it 'returns serial information' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.product.serial_number', value: nil), an_object_having_attributes(name: 'serialnumber', value: nil, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/dmi/product/uuid_spec.rb000066400000000000000000000016131470204764400274160ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Dmi::Product::Uuid do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Dmi::Product::Uuid.new } let(:product_uuid) { '421aa929-318f-fae9-7d69-2e2321b00c45' } before do allow(Facter::Resolvers::Openbsd::DmiBios).to \ receive(:resolve).with(:product_uuid).and_return(product_uuid) end it 'calls Facter::Resolvers::Openbsd::DmiBios' do fact.call_the_resolver expect(Facter::Resolvers::Openbsd::DmiBios).to have_received(:resolve).with(:product_uuid) end it 'returns resolved facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.product.uuid', value: product_uuid), an_object_having_attributes(name: 'uuid', value: product_uuid, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/ec2_metadata_spec.rb000066400000000000000000000046331470204764400265350ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Ec2Metadata do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Ec2Metadata.new } let(:virtual_detector_double) { class_spy(Facter::Util::Facts::Posix::VirtualDetector) } before do allow(Facter::Resolvers::Ec2).to receive(:resolve).with(:metadata).and_return(value) end context 'when physical machine with no hypervisor' do let(:value) { nil } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return(nil) end it 'returns ec2 metadata fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ec2_metadata', value: value) end it "doesn't call Ec2 resolver" do fact.call_the_resolver expect(Facter::Resolvers::Ec2).not_to have_received(:resolve).with(:metadata) end end shared_examples 'check ec2 resolver called with metadata' do it 'calls ec2 resolver' do fact.call_the_resolver expect(Facter::Resolvers::Ec2).to have_received(:resolve).with(:metadata) end end shared_examples 'check resolved fact value' do it 'returns ec2 metadata fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ec2_metadata', value: value) end end context 'when platform is kvm' do let(:value) { { 'info' => 'value' } } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('kvm') end it_behaves_like 'check ec2 resolver called with metadata' it_behaves_like 'check resolved fact value' end context 'when platform is xen' do let(:value) { { 'info' => 'value' } } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('xen') end it_behaves_like 'check ec2 resolver called with metadata' it_behaves_like 'check resolved fact value' end context 'when platform is aws' do let(:value) { { 'info' => 'value' } } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('aws') end it_behaves_like 'check ec2 resolver called with metadata' it_behaves_like 'check resolved fact value' end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/ec2_userdata_spec.rb000066400000000000000000000046351470204764400265670ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Ec2Userdata do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Ec2Userdata.new } let(:virtual_detector_double) { class_spy(Facter::Util::Facts::Posix::VirtualDetector) } before do allow(Facter::Resolvers::Ec2).to receive(:resolve).with(:userdata).and_return(value) end context 'when physical machine with no hypervisor' do let(:value) { nil } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('nil') end it 'returns ec2 userdata fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ec2_userdata', value: value) end it "doesn't call Ec2 resolver" do fact.call_the_resolver expect(Facter::Resolvers::Ec2).not_to have_received(:resolve).with(:userdata) end end shared_examples 'check ec2 resolver called with userdata' do it 'calls ec2 resolver' do fact.call_the_resolver expect(Facter::Resolvers::Ec2).to have_received(:resolve).with(:userdata) end end shared_examples 'check resolved fact value' do it 'returns ec2 userdata fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ec2_userdata', value: value) end end context 'when platform is kvm' do let(:value) { { 'info' => 'value' } } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('kvm') end it_behaves_like 'check ec2 resolver called with userdata' it_behaves_like 'check resolved fact value' end context 'when platform is xen' do let(:value) { { 'info' => 'value' } } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('xen') end it_behaves_like 'check ec2 resolver called with userdata' it_behaves_like 'check resolved fact value' end context 'when platform is aws' do let(:value) { { 'info' => 'value' } } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return('aws') end it_behaves_like 'check ec2 resolver called with userdata' it_behaves_like 'check resolved fact value' end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/facterversion_spec.rb000066400000000000000000000013101470204764400270630ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Facterversion do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Facterversion.new } let(:value) { '4.0.3' } before do allow(Facter::Resolvers::Facterversion).to receive(:resolve).with(:facterversion).and_return(value) end it 'calls Facter::Resolvers::Facterversion' do fact.call_the_resolver expect(Facter::Resolvers::Facterversion).to have_received(:resolve).with(:facterversion) end it 'returns facterversion fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'facterversion', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/identity/000077500000000000000000000000001470204764400245105ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/identity/gid_spec.rb000066400000000000000000000012541470204764400266140ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Identity::Gid do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Identity::Gid.new } let(:value) { '20' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:gid).and_return(value) end it 'calls Facter::Resolvers::PosxIdentity' do fact.call_the_resolver expect(Facter::Resolvers::PosxIdentity).to have_received(:resolve).with(:gid) end it 'returns identity gid fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'identity.gid', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/identity/group_spec.rb000066400000000000000000000014501470204764400272030ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Identity::Group do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Identity::Group.new } let(:value) { 'staff' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:group).and_return(value) end it 'calls Facter::Resolvers::PosxIdentity' do fact.call_the_resolver expect(Facter::Resolvers::PosxIdentity).to have_received(:resolve).with(:group) end it 'returns identity group fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'identity.group', value: value), an_object_having_attributes(name: 'gid', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/identity/privileged_spec.rb000066400000000000000000000013311470204764400301770ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Identity::Privileged do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Identity::Privileged.new } let(:value) { 'false' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:privileged).and_return(value) end it 'calls Facter::Resolvers::PosxIdentity' do fact.call_the_resolver expect(Facter::Resolvers::PosxIdentity).to have_received(:resolve).with(:privileged) end it 'returns identity privileged fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'identity.privileged', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/identity/uid_spec.rb000066400000000000000000000012551470204764400266330ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Identity::Uid do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Identity::Uid.new } let(:value) { '501' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:uid).and_return(value) end it 'calls Facter::Resolvers::PosxIdentity' do fact.call_the_resolver expect(Facter::Resolvers::PosxIdentity).to have_received(:resolve).with(:uid) end it 'returns identity uid fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'identity.uid', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/identity/user_spec.rb000066400000000000000000000014471470204764400270330ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Identity::User do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Identity::User.new } let(:value) { 'root' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:user).and_return(value) end it 'calls Facter::Resolvers::PosxIdentity' do fact.call_the_resolver expect(Facter::Resolvers::PosxIdentity).to have_received(:resolve).with(:user) end it 'returns id and identity user name' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'identity.user', value: value), an_object_having_attributes(name: 'id', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/ipaddress6_interfaces_spec.rb000066400000000000000000000024661470204764400304750ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Ipaddress6Interfaces do subject(:fact) { Facts::Openbsd::Ipaddress6Interfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'em0' => { ip6: 'fe80::99bf:da20:ad3:9bfe' }, 'vio0' => { ip6: 'fe80::99bf:da20:ad3:9bfe' } } } it 'calls Facter::Resolvers::NetworkingOpenBSD' do fact.call_the_resolver expect(Facter::Resolvers::Networking).to have_received(:resolve).with(:interfaces) end it 'returns legacy facts with names ipaddress6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ipaddress6_em0', value: interfaces['em0'][:ip6], type: :legacy), an_object_having_attributes(name: 'ipaddress6_vio0', value: interfaces['vio0'][:ip6], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/ipaddress_interfaces_spec.rb000066400000000000000000000024271470204764400304040ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::IpaddressInterfaces do subject(:fact) { Facts::Openbsd::IpaddressInterfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'em0' => { ip: '10.16.117.100' }, 'vio0' => { ip: '10.16.117.255' } } } it 'calls Facter::Resolvers::NetworkingOpenBSD' do fact.call_the_resolver expect(Facter::Resolvers::Networking).to have_received(:resolve).with(:interfaces) end it 'returns legacy facts with names ipaddress_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ipaddress_em0', value: interfaces['em0'][:ip], type: :legacy), an_object_having_attributes(name: 'ipaddress_vio0', value: interfaces['vio0'][:ip], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/is_virtual_spec.rb000066400000000000000000000017731470204764400264070ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::IsVirtual do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::IsVirtual.new } let(:virtual_detector_double) { class_spy(Facter::Util::Facts::Posix::VirtualDetector) } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return(virtual_value) end context 'when not in a virtual environment' do let(:virtual_value) { 'physical' } it 'return resolved fact with nil value' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'is_virtual', value: false) end end context 'when in a virtual environment' do let(:virtual_value) { 'vmm' } it 'return resolved fact with nil value' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'is_virtual', value: true) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/kernel_spec.rb000066400000000000000000000012201470204764400254710ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Kernel do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Kernel.new } let(:value) { 'OpenBSD' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelname).and_return(value) end it 'calls Facter::Resolvers::Uname' do fact.call_the_resolver expect(Facter::Resolvers::Uname).to have_received(:resolve).with(:kernelname) end it 'returns kernel fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernel', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/kernelrelease_spec.rb000066400000000000000000000012561470204764400270430ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Kernelrelease do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Kernelrelease.new } let(:value) { '7.2' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelrelease).and_return(value) end it 'calls Facter::Resolvers::Uname' do fact.call_the_resolver expect(Facter::Resolvers::Uname).to have_received(:resolve).with(:kernelrelease) end it 'returns kernelrelease fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernelrelease', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/mountpoints_spec.rb000066400000000000000000000043071470204764400266210ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Mountpoints do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Mountpoints.new } context 'when resolver returns hash' do let(:resolver_output) do { '/var': { available: '15.18 GiB', available_bytes: 16_299_800_576, capacity: '12.49%', device: '/dev/sd0j', filesystem: 'ffs', options: %w[local nodev nosuid], size: '18.40 GiB', size_bytes: 19_754_121_216, used: '2.30 GiB', used_bytes: 2_466_615_296 } } end let(:parsed_fact) do { '/var' => { 'available' => '15.18 GiB', 'available_bytes' => 16_299_800_576, 'capacity' => '12.49%', 'device' => '/dev/sd0j', 'filesystem' => 'ffs', 'options' => %w[local nodev nosuid], 'size' => '18.40 GiB', 'size_bytes' => 19_754_121_216, 'used' => '2.30 GiB', 'used_bytes' => 2_466_615_296 } } end before do allow(Facter::Resolvers::Openbsd::Mountpoints).to \ receive(:resolve).with(:mountpoints).and_return(resolver_output) end it 'calls Facter::Resolvers::Openbsd::Mountpoints' do fact.call_the_resolver expect(Facter::Resolvers::Openbsd::Mountpoints).to \ have_received(:resolve).with(:mountpoints) end it 'returns mountpoints information' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'mountpoints', value: parsed_fact) end end context 'when resolver returns nil' do before do allow(Facter::Resolvers::Openbsd::Mountpoints).to \ receive(:resolve).with(:mountpoints).and_return(nil) end it 'returns mountpoints information' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'mountpoints', value: nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/netmask6_interfaces_spec.rb000066400000000000000000000025241470204764400301540ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Netmask6Interfaces do subject(:fact) { Facts::Openbsd::Netmask6Interfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) do { 'em0' => { netmask6: 'fe80::99bf:da20:ad3:9bfe' }, 'vio0' => { netmask6: 'fe80::99bf:da20:ad3:9bfe' } } end it 'calls Facter::Resolvers::NetworkingOpenBSD' do fact.call_the_resolver expect(Facter::Resolvers::Networking).to have_received(:resolve).with(:interfaces) end it 'returns legacy facts with names netmask6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'netmask6_em0', value: interfaces['em0'][:netmask6], type: :legacy), an_object_having_attributes(name: 'netmask6_vio0', value: interfaces['vio0'][:netmask6], type: :legacy)) end end describe '#call_the_resolver when resolver return nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/netmask_interfaces_spec.rb000066400000000000000000000024421470204764400300650ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::NetmaskInterfaces do subject(:fact) { Facts::Openbsd::NetmaskInterfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'em0' => { netmask: '10.255.255.255' }, 'vio0' => { netmask: '10.17.255.255' } } } it 'calls Facter::Resolvers::NetworkingOpenBSD' do fact.call_the_resolver expect(Facter::Resolvers::Networking).to have_received(:resolve).with(:interfaces) end it 'returns legacy facts with names netmask_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'netmask_em0', value: interfaces['em0'][:netmask], type: :legacy), an_object_having_attributes(name: 'netmask_vio0', value: interfaces['vio0'][:netmask], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/network6_interfaces_spec.rb000066400000000000000000000024311470204764400302000ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Network6Interfaces do subject(:fact) { Facts::Openbsd::Network6Interfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'em0' => { network6: '::1' }, 'vio0' => { network6: 'fe80::' } } } it 'calls Facter::Resolvers::NetworkingOpenBSD' do fact.call_the_resolver expect(Facter::Resolvers::Networking).to have_received(:resolve).with(:interfaces) end it 'returns legacy facts with names network6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'network6_em0', value: interfaces['em0'][:network6], type: :legacy), an_object_having_attributes(name: 'network6_vio0', value: interfaces['vio0'][:network6], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/network_interfaces_spec.rb000066400000000000000000000024421470204764400301140ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::NetworkInterfaces do subject(:fact) { Facts::Openbsd::NetworkInterfaces.new } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'em0' => { network: '10.255.255.255' }, 'vio0' => { network: '10.17.255.255' } } } it 'calls Facter::Resolvers::NetworkingOpenBSD' do fact.call_the_resolver expect(Facter::Resolvers::Networking).to have_received(:resolve).with(:interfaces) end it 'returns legacy facts with names network_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'network_em0', value: interfaces['em0'][:network], type: :legacy), an_object_having_attributes(name: 'network_vio0', value: interfaces['vio0'][:network], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/networking/000077500000000000000000000000001470204764400250465ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/networking/dhcp_spec.rb000066400000000000000000000017161470204764400273300ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Networking::Dhcp do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Networking::Dhcp.new } let(:value) { '192.168.158.6' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:dhcp).and_return(value) end it 'calls Facter::Resolvers::Networking' do fact.call_the_resolver expect(Facter::Resolvers::Networking).to have_received(:resolve).with(:dhcp) end it 'returns networking.dhcp fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.dhcp', value: value) end context 'when dhcp can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.dhcp', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/networking/domain_spec.rb000066400000000000000000000022521470204764400276550ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Networking::Domain do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Networking::Domain.new } let(:value) { 'domain' } before do allow(Facter::Resolvers::Hostname).to receive(:resolve).with(:domain).and_return(value) end it 'calls Facter::Resolvers::Hostname' do fact.call_the_resolver expect(Facter::Resolvers::Hostname).to have_received(:resolve).with(:domain) end it 'returns domain fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.domain', value: value), an_object_having_attributes(name: 'domain', value: value, type: :legacy)) end context 'when domain can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.domain', value: value), an_object_having_attributes(name: 'domain', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/networking/fqdn_spec.rb000066400000000000000000000022331470204764400273350ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Networking::Fqdn do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Networking::Fqdn.new } let(:value) { 'host.domain' } before do allow(Facter::Resolvers::Hostname).to receive(:resolve).with(:fqdn).and_return(value) end it 'calls Facter::Resolvers::Hostname' do fact.call_the_resolver expect(Facter::Resolvers::Hostname).to have_received(:resolve).with(:fqdn) end it 'returns fqdn fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.fqdn', value: value), an_object_having_attributes(name: 'fqdn', value: value, type: :legacy)) end context 'when fqdn can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.fqdn', value: value), an_object_having_attributes(name: 'fqdn', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/networking/hostname_spec.rb000066400000000000000000000022741470204764400302300ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Networking::Hostname do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Networking::Hostname.new } let(:value) { 'host' } before do allow(Facter::Resolvers::Hostname).to receive(:resolve).with(:hostname).and_return(value) end it 'calls Facter::Resolvers::Hostname' do fact.call_the_resolver expect(Facter::Resolvers::Hostname).to have_received(:resolve).with(:hostname) end it 'returns hostname fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.hostname', value: value), an_object_having_attributes(name: 'hostname', value: value, type: :legacy)) end context 'when hostname can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.hostname', value: value), an_object_having_attributes(name: 'hostname', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/networking/interfaces_spec.rb000066400000000000000000000103761470204764400305370ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Networking::Interfaces do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Networking::Interfaces.new } let(:interfaces) do { 'awdl0' => { mtu: 1484, mac: '2e:ba:e4:83:4b:b7', bindings6: [{ address: 'fe80::2cba:e4ff:fe83:4bb7', netmask: 'ffff:ffff:ffff:ffff::', network: 'fe80::' }], ip6: 'fe80::2cba:e4ff:fe83:4bb7', netmask6: 'ffff:ffff:ffff:ffff::', network6: 'fe80::' }, 'bridge0' => { mtu: 1500, mac: '82:17:0e:93:9d:00' }, 'en0' => { dhcp: '192.587.6.9', mtu: 1500, mac: '64:5a:ed:ea:5c:81', bindings: [{ address: '192.168.1.2', netmask: '255.255.255.0', network: '192.168.1.0' }], ip: '192.168.1.2', netmask: '255.255.255.0', network: '192.168.1.0' }, 'gif0' => { mtu: 1280 }, 'lo0' => { mtu: 16_384, bindings: [{ address: '127.0.0.1', netmask: '255.0.0.0', network: '127.0.0.0' }], bindings6: [{ address: '::1', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network: '::1' }, { address: 'fe80::1', netmask: 'ffff:ffff:ffff:ffff::', network: 'fe80::' }], ip: '127.0.0.1', netmask: '255.0.0.0', network: '127.0.0.0', ip6: '::1', netmask6: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network6: '::1' } } end before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end it 'calls Facter::Resolvers::Networking with interfaces' do fact.call_the_resolver expect(Facter::Resolvers::Networking).to have_received(:resolve).with(:interfaces) end it 'returns networking.interfaces fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.interfaces', value: anything) end it 'returns all interfaces' do interfaces = %w[awdl0 bridge0 en0 gif0 lo0] result = fact.call_the_resolver expect(result.value).to include(*interfaces) end it 'returns the interface awdl0 correctly' do expected = { 'mtu' => 1484, 'mac' => '2e:ba:e4:83:4b:b7', 'bindings6' => [{ 'address' => 'fe80::2cba:e4ff:fe83:4bb7', 'netmask' => 'ffff:ffff:ffff:ffff::', 'network' => 'fe80::' }], 'ip6' => 'fe80::2cba:e4ff:fe83:4bb7', 'netmask6' => 'ffff:ffff:ffff:ffff::', 'network6' => 'fe80::' } result = fact.call_the_resolver expect(result.value['awdl0']).to match(expected) end it 'returns the interface bridge0 correctly' do result = fact.call_the_resolver expect(result.value['bridge0']).to match({ 'mtu' => 1500, 'mac' => '82:17:0e:93:9d:00' }) end it 'returns the interface en0 correctly' do expected = { 'mtu' => 1500, 'mac' => '64:5a:ed:ea:5c:81', 'bindings' => [{ 'address' => '192.168.1.2', 'netmask' => '255.255.255.0', 'network' => '192.168.1.0' }], 'ip' => '192.168.1.2', 'netmask' => '255.255.255.0', 'network' => '192.168.1.0', 'dhcp' => '192.587.6.9' } result = fact.call_the_resolver expect(result.value['en0']).to match(expected) end it 'returns the interface gif0 correctly' do result = fact.call_the_resolver expect(result.value['gif0']).to match({ 'mtu' => 1280 }) end context 'when interfaces can not be retrieved' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.interfaces', value: interfaces) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/networking/ip6_spec.rb000066400000000000000000000023011470204764400270770ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Networking::Ip6 do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Networking::Ip6.new } let(:value) { 'fe80::2cba:e4ff:fe83:4bb7' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:ip6).and_return(value) end it 'calls Facter::Resolvers::Networking with :ip6' do fact.call_the_resolver expect(Facter::Resolvers::Networking).to have_received(:resolve).with(:ip6) end it 'returns the ip6 fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip6', value: value), an_object_having_attributes(name: 'ipaddress6', value: value, type: :legacy)) end context 'when ip6 can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip6', value: value), an_object_having_attributes(name: 'ipaddress6', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/networking/ip_spec.rb000066400000000000000000000022461470204764400270210ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Networking::Ip do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Networking::Ip.new } let(:value) { '10.0.0.1' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:ip).and_return(value) end it 'calls Facter::Resolvers::Networking with :ip' do fact.call_the_resolver expect(Facter::Resolvers::Networking).to have_received(:resolve).with(:ip) end it 'returns the ip6 fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip', value: value), an_object_having_attributes(name: 'ipaddress', value: value, type: :legacy)) end context 'when ip can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip', value: value), an_object_having_attributes(name: 'ipaddress', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/networking/mac_spec.rb000066400000000000000000000022741470204764400271520ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Networking::Mac do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Networking::Mac.new } let(:value) { '64:5a:ed:ea:c3:25' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:mac).and_return(value) end it 'calls Facter::Resolvers::Networking with :mac' do fact.call_the_resolver expect(Facter::Resolvers::Networking).to have_received(:resolve).with(:mac) end it 'returns macaddress fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.mac', value: value), an_object_having_attributes(name: 'macaddress', value: value, type: :legacy)) end context 'when mac can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.mac', value: value), an_object_having_attributes(name: 'macaddress', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/networking/mtu_spec.rb000066400000000000000000000016721470204764400272200ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Networking::Mtu do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Networking::Mtu.new } let(:value) { 1500 } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:mtu).and_return(value) end it 'calls Facter::Resolvers::Networking with :mtu' do fact.call_the_resolver expect(Facter::Resolvers::Networking).to have_received(:resolve).with(:mtu) end it 'returns mtu fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.mtu', value: value) end context 'when mtu can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.mtu', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/networking/netmask6_spec.rb000066400000000000000000000023461470204764400301420ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Networking::Netmask6 do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Networking::Netmask6.new } let(:value) { 'ffff:ffff:ffff:ffff::' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:netmask6).and_return(value) end it 'calls Facter::Resolvers::Networking with :netmask6' do fact.call_the_resolver expect(Facter::Resolvers::Networking).to have_received(:resolve).with(:netmask6) end it 'returns the netmask6 fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask6', value: value), an_object_having_attributes(name: 'netmask6', value: value, type: :legacy)) end context 'when netmask6 can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask6', value: value), an_object_having_attributes(name: 'netmask6', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/networking/netmask_spec.rb000066400000000000000000000023231470204764400300470ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Networking::Netmask do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Networking::Netmask.new } let(:value) { '255.255.255.0' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:netmask).and_return(value) end it 'calls Facter::Resolvers::Networking with :netmask' do fact.call_the_resolver expect(Facter::Resolvers::Networking).to have_received(:resolve).with(:netmask) end it 'returns the netmask fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask', value: value), an_object_having_attributes(name: 'netmask', value: value, type: :legacy)) end context 'when netmask can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask', value: value), an_object_having_attributes(name: 'netmask', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/networking/network6_spec.rb000066400000000000000000000023341470204764400301660ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Networking::Network6 do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Networking::Network6.new } let(:value) { 'ff80:3454::' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:network6).and_return(value) end it 'calls Facter::Resolvers::Networking with :network6' do fact.call_the_resolver expect(Facter::Resolvers::Networking).to have_received(:resolve).with(:network6) end it 'returns the network6 fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network6', value: value), an_object_having_attributes(name: 'network6', value: value, type: :legacy)) end context 'when network6 can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network6', value: value), an_object_having_attributes(name: 'network6', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/networking/network_spec.rb000066400000000000000000000023231470204764400300760ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Networking::Network do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Networking::Network.new } let(:value) { '192.168.143.0' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:network).and_return(value) end it 'calls Facter::Resolvers::Networking with :network' do fact.call_the_resolver expect(Facter::Resolvers::Networking).to have_received(:resolve).with(:network) end it 'returns the network fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network', value: value), an_object_having_attributes(name: 'network', value: value, type: :legacy)) end context 'when network can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network', value: value), an_object_having_attributes(name: 'network', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/networking/primary_spec.rb000066400000000000000000000020221470204764400300640ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Networking::Primary do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Networking::Primary.new } let(:value) { 'em0' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:primary_interface).and_return(value) end it 'calls Facter::Resolvers::Networking with :primary_interface' do fact.call_the_resolver expect(Facter::Resolvers::Networking).to have_received(:resolve).with(:primary_interface) end it 'returns networking.primary fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.primary', value: value) end context 'when primary interface can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.primary', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/networking/scope6_spec.rb000066400000000000000000000017511470204764400276100ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Networking::Scope6 do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Networking::Scope6.new } let(:value) { 'link' } before do allow(Facter::Resolvers::Networking).to receive(:resolve).with(:scope6).and_return(value) end it 'calls Facter::Resolvers::Networking with scope6' do fact.call_the_resolver expect(Facter::Resolvers::Networking).to have_received(:resolve).with(:scope6) end it 'returns scope6 fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.scope6', value: value) end context 'when scope6 can not be resolved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.scope6', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/os/000077500000000000000000000000001470204764400233005ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/os/architecture_spec.rb000066400000000000000000000014411470204764400273210ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Os::Architecture do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Os::Architecture.new } let(:value) { 'amd64' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:machine).and_return(value) end it 'calls Facter::Resolvers::Uname' do fact.call_the_resolver expect(Facter::Resolvers::Uname).to have_received(:resolve).with(:machine) end it 'returns architecture fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.architecture', value: value), an_object_having_attributes(name: 'architecture', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/os/hardware_spec.rb000066400000000000000000000014471470204764400264420ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Os::Hardware do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Os::Hardware.new } let(:value) { 'amd64' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:machine).and_return(value) end it 'calls Facter::Resolvers::HardwareArchitecture' do fact.call_the_resolver expect(Facter::Resolvers::Uname).to have_received(:resolve).with(:machine) end it 'returns hardware model fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.hardware', value: value), an_object_having_attributes(name: 'hardwaremodel', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/os/name_spec.rb000066400000000000000000000014351470204764400255620ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Os::Name do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Os::Name.new } let(:value) { 'OpenBSD' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelname).and_return(value) end it 'calls Facter::Resolvers::Uname' do fact.call_the_resolver expect(Facter::Resolvers::Uname).to have_received(:resolve).with(:kernelname) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.name', value: value), an_object_having_attributes(name: 'operatingsystem', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/os/release_spec.rb000066400000000000000000000023421470204764400262600ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Os::Release.new } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelrelease).and_return(value) end context 'when OpenBSD RELEASE' do let(:value) { '7.2' } it 'calls Facter::Resolvers::Uname' do fact.call_the_resolver expect(Facter::Resolvers::Uname).to have_received(:resolve).with(:kernelrelease) end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: { 'full' => value, 'major' => '7', 'minor' => '2' }), an_object_having_attributes(name: 'operatingsystemmajrelease', value: '7', type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/path_spec.rb000066400000000000000000000012701470204764400251520ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Path do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Path.new } let(:value) { '/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin' } before do allow(Facter::Resolvers::Path).to \ receive(:resolve).with(:path).and_return(value) end it 'calls Facter::Resolvers::Path' do fact.call_the_resolver expect(Facter::Resolvers::Path).to have_received(:resolve).with(:path) end it 'returns path fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'path', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/processors/000077500000000000000000000000001470204764400250615ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/processors/isa_spec.rb000066400000000000000000000014411470204764400271740ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Processors::Isa do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Processors::Isa.new } let(:isa) { 'amd64' } before do allow(Facter::Resolvers::Uname).to \ receive(:resolve).with(:processor).and_return(isa) end it 'calls Facter::Resolvers::Uname' do fact.call_the_resolver expect(Facter::Resolvers::Uname).to have_received(:resolve).with(:processor) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.isa', value: isa), an_object_having_attributes(name: 'hardwareisa', value: isa, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/ruby/000077500000000000000000000000001470204764400236405ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/ruby/platform_spec.rb000066400000000000000000000014431470204764400270250ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Ruby::Platform do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Ruby::Platform.new } let(:value) { 'x86_64-openbsd' } before do allow(Facter::Resolvers::Ruby).to receive(:resolve).with(:platform).and_return(value) end it 'calls Facter::Resolvers::Ruby' do fact.call_the_resolver expect(Facter::Resolvers::Ruby).to have_received(:resolve).with(:platform) end it 'return ruby.platform fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ruby.platform', value: value), an_object_having_attributes(name: 'rubyplatform', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/ruby/sitedir_spec.rb000066400000000000000000000014571470204764400266510ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Ruby::Sitedir do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Ruby::Sitedir.new } let(:value) { '/usr/local/lib/ruby/site_ruby/3.1' } before do allow(Facter::Resolvers::Ruby).to receive(:resolve).with(:sitedir).and_return(value) end it 'calls Facter::Resolvers::Ruby' do fact.call_the_resolver expect(Facter::Resolvers::Ruby).to have_received(:resolve).with(:sitedir) end it 'return ruby sitedir fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ruby.sitedir', value: value), an_object_having_attributes(name: 'rubysitedir', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/ruby/version_spec.rb000066400000000000000000000014411470204764400266640ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Ruby::Version do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Ruby::Version.new } let(:value) { '3.1.2' } before do allow(Facter::Resolvers::Ruby).to receive(:resolve).with(:version).and_return(value) end it 'calls Facter::Resolvers::Ruby' do fact.call_the_resolver expect(Facter::Resolvers::Ruby).to have_received(:resolve).with(:version) end it 'returns ruby version fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'ruby.version', value: value), an_object_having_attributes(name: 'rubyversion', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/ssh_spec.rb000066400000000000000000000017261470204764400250210ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Ssh do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Ssh.new } let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'ecdsa', 'test', 'ecdsa')] end let(:value) do { 'ecdsa' => { 'fingerprints' => { 'sha1' => 'test', 'sha256' => 'test' }, 'key' => 'test', 'type' => 'ecdsa' } } end before do allow(Facter::Resolvers::Ssh).to \ receive(:resolve).with(:ssh).and_return(ssh) end it 'calls Facter::Resolvers::Ssh' do fact.call_the_resolver expect(Facter::Resolvers::Ssh).to have_received(:resolve).with(:ssh) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ssh', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/sshalgorithmkey_spec.rb000066400000000000000000000022761470204764400274420ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Sshalgorithmkey do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Sshalgorithmkey.new } let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'ecdsa', 'test', 'ecdsa'), Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'rsa', 'test', 'rsa')] end let(:legacy_fact1) { { name: 'ecdsa', value: 'test' } } let(:legacy_fact2) { { name: 'rsa', value: 'test' } } before do allow(Facter::Resolvers::Ssh).to \ receive(:resolve).with(:ssh).and_return(ssh) end it 'calls Facter::Resolvers::Ssh' do fact.call_the_resolver expect(Facter::Resolvers::Ssh).to have_received(:resolve).with(:ssh) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: "ssh#{legacy_fact1[:name]}key", value: legacy_fact1[:value]), an_object_having_attributes(name: "ssh#{legacy_fact2[:name]}key", value: legacy_fact2[:value])) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/sshfp_algorithm_spec.rb000066400000000000000000000023301470204764400274050ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::SshfpAlgorithm do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::SshfpAlgorithm.new } let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('sha11', 'sha2561'), 'ecdsa', 'test', 'ecdsa'), Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('sha12', 'sha2562'), 'rsa', 'test', 'rsa')] end let(:legacy_fact1) { { name: 'ecdsa', value: "sha11\nsha2561" } } let(:legacy_fact2) { { name: 'rsa', value: "sha12\nsha2562" } } before do allow(Facter::Resolvers::Ssh).to \ receive(:resolve).with(:ssh).and_return(ssh) end it 'calls Facter::Resolvers::Ssh' do fact.call_the_resolver expect(Facter::Resolvers::Ssh).to have_received(:resolve).with(:ssh) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: "sshfp_#{legacy_fact1[:name]}", value: legacy_fact1[:value]), an_object_having_attributes(name: "sshfp_#{legacy_fact2[:name]}", value: legacy_fact2[:value])) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/system_uptime/000077500000000000000000000000001470204764400255665ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/system_uptime/days_spec.rb000066400000000000000000000014431470204764400300670ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::SystemUptime::Days do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::SystemUptime::Days.new } let(:value) { '2' } before do allow(Facter::Resolvers::Uptime).to receive(:resolve).with(:days).and_return(value) end it 'calls Facter::Resolvers::Uptime' do fact.call_the_resolver expect(Facter::Resolvers::Uptime).to have_received(:resolve).with(:days) end it 'returns days since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.days', value: value), an_object_having_attributes(name: 'uptime_days', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/system_uptime/hours_spec.rb000066400000000000000000000014521470204764400302670ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::SystemUptime::Hours do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::SystemUptime::Hours.new } let(:value) { '2' } before do allow(Facter::Resolvers::Uptime).to receive(:resolve).with(:hours).and_return(value) end it 'calls Facter::Resolvers::Uptime' do fact.call_the_resolver expect(Facter::Resolvers::Uptime).to have_received(:resolve).with(:hours) end it 'returns hours since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.hours', value: value), an_object_having_attributes(name: 'uptime_hours', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/system_uptime/seconds_spec.rb000066400000000000000000000014711470204764400305660ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::SystemUptime::Seconds do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::SystemUptime::Seconds.new } let(:value) { 3600 } before do allow(Facter::Resolvers::Uptime).to receive(:resolve).with(:seconds).and_return(value) end it 'calls Facter::Resolvers::Uptime' do fact.call_the_resolver expect(Facter::Resolvers::Uptime).to have_received(:resolve).with(:seconds) end it 'returns minutes since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.seconds', value: value), an_object_having_attributes(name: 'uptime_seconds', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/system_uptime/uptime_spec.rb000066400000000000000000000014651470204764400304360ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::SystemUptime::Uptime do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::SystemUptime::Uptime.new } let(:value) { '6 days' } before do allow(Facter::Resolvers::Uptime).to receive(:resolve).with(:uptime).and_return(value) end it 'calls Facter::Resolvers::Uptime' do fact.call_the_resolver expect(Facter::Resolvers::Uptime).to have_received(:resolve).with(:uptime) end it 'returns total uptime since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.uptime', value: value), an_object_having_attributes(name: 'uptime', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/timezone_spec.rb000066400000000000000000000012561470204764400260540ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Timezone do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Timezone.new } let(:timezone) { 'UTC' } before do allow(Facter::Resolvers::Timezone).to \ receive(:resolve).with(:timezone).and_return(timezone) end it 'calls Facter::Resolvers::Timezone' do fact.call_the_resolver expect(Facter::Resolvers::Timezone).to have_received(:resolve).with(:timezone) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'timezone', value: timezone) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/virtual_spec.rb000066400000000000000000000016431470204764400257100ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Virtual do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Virtual.new } let(:virtual_detector_double) { class_spy(Facter::Util::Facts::Posix::VirtualDetector) } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return(value) end shared_examples 'check resolved fact value' do it 'return resolved fact with nil value' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'virtual', value: value) end end context 'when not in a virtual environment' do let(:value) { 'physical' } it_behaves_like 'check resolved fact value' end context 'when in a virtual environment' do let(:value) { 'vmm' } it_behaves_like 'check resolved fact value' end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openbsd/virtual_spec.rb.save000066400000000000000000000016431470204764400266450ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openbsd::Virtual do describe '#call_the_resolver' do subject(:fact) { Facts::Openbsd::Virtual.new } let(:virtual_detector_double) { class_spy(Facter::Util::Facts::Posix::VirtualDetector) } before do allow(Facter::Util::Facts::Posix::VirtualDetector).to receive(:platform).and_return(value) end shared_examples 'check resolved fact value' do it 'return resolved fact with nil value' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'virtual', value: value) end end context 'when not in a virtual environment' do let(:value) { 'physical' } it_behaves_like 'check resolved fact value' end context 'when in a virtual environment' do let(:value) { 'vmm' } it_behaves_like 'check resolved fact value' end end end puppetlabs-facter-dfe6df4/spec/facter/facts/openwrt/000077500000000000000000000000001470204764400227235ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/openwrt/os/000077500000000000000000000000001470204764400233445ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/openwrt/os/release_spec.rb000066400000000000000000000046061470204764400263310ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Openwrt::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Openwrt::Os::Release.new } before do allow(Facter::Resolvers::SpecificReleaseFile).to receive(:resolve) .with(:release, { release_file: '/etc/openwrt_version', regex: /^(\d+.\d+.*)/ }) .and_return(value) end context 'when version is retrieved from specific file' do let(:value) { /^(\d+.\d+.*)/.match('19.4') } let(:release) { { 'full' => '19.4', 'major' => '19', 'minor' => '4' } } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end end context 'when version is retrieved from os-release file' do let(:value) { nil } let(:os_release) { '19.4' } let(:release) { { 'full' => '19.4', 'major' => '19', 'minor' => '4' } } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(os_release) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end context 'when release can\'t be received' do let(:os_release) { nil } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.release', value: nil) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/ovs/000077500000000000000000000000001470204764400220345ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/ovs/os/000077500000000000000000000000001470204764400224555ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/ovs/os/release_spec.rb000066400000000000000000000044631470204764400254430ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Ovs::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Ovs::Os::Release.new } before do allow(Facter::Resolvers::ReleaseFromFirstLine).to receive(:resolve) .with(:release, { release_file: '/etc/ovs-release' }) .and_return(value) end context 'when version is retrieved from specific file' do let(:value) { '2.13.0' } let(:release) { { 'full' => '2.13.0', 'major' => '2', 'minor' => '13' } } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end end context 'when version is retrieved from os-release file' do let(:value) { nil } let(:os_release) { 'beowulf' } let(:release) { { 'full' => 'beowulf', 'major' => 'beowulf' } } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(os_release) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end context 'when release can\'t be received' do let(:os_release) { nil } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.release', value: nil) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/photon/000077500000000000000000000000001470204764400225345ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/photon/os/000077500000000000000000000000001470204764400231555ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/photon/os/release_spec.rb000066400000000000000000000046631470204764400261450ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Photon::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Photon::Os::Release.new } before do allow(Facter::Resolvers::SpecificReleaseFile).to receive(:resolve) .with(:release, { release_file: '/etc/lsb-release', regex: /DISTRIB_RELEASE="(\d+)\.(\d+)/ }) .and_return(value) end context 'when version is retrieved from specific file' do let(:value) { /DISTRIB_RELEASE="(\d+)\.(\d+)/.match('DISTRIB_RELEASE="19.4') } let(:release) { { 'full' => '19.4', 'major' => '19', 'minor' => '4' } } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end end context 'when version is retrieved from os-release file' do let(:value) { nil } let(:os_release) { '19.4' } let(:release) { { 'full' => '19.4', 'major' => '19', 'minor' => '4' } } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(os_release) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end context 'when release can\'t be received' do let(:os_release) { nil } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.release', value: nil) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/rhel/000077500000000000000000000000001470204764400221575ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/rhel/lsbdistcodename_spec.rb000066400000000000000000000010301470204764400266500ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Rhel::Lsbdistcodename do describe '#call_the_resolver' do subject(:fact) { Facts::Rhel::Lsbdistcodename.new } let(:value) { 'rhel' } before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:codename).and_return(value) end it 'returns lsbdistcodename fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'lsbdistcodename', value: value, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/rhel/lsbdistdescription_spec.rb000066400000000000000000000010471470204764400274300ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Rhel::Lsbdistdescription do describe '#call_the_resolver' do subject(:fact) { Facts::Rhel::Lsbdistdescription.new } let(:value) { 'rhel' } before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:description).and_return(value) end it 'returns lsbdistdescription fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'lsbdistdescription', value: value, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/rhel/lsbdistid_spec.rb000066400000000000000000000010061470204764400254740ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Rhel::Lsbdistid do describe '#call_the_resolver' do subject(:fact) { Facts::Rhel::Lsbdistid.new } let(:value) { 'rhel' } before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:distributor_id).and_return(value) end it 'returns lsbdistid fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'lsbdistid', value: value, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/rhel/os/000077500000000000000000000000001470204764400226005ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/rhel/os/distro/000077500000000000000000000000001470204764400241045ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/rhel/os/distro/codename_spec.rb000066400000000000000000000010231470204764400272120ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Rhel::Os::Distro::Codename do describe '#call_the_resolver' do subject(:fact) { Facts::Rhel::Os::Distro::Codename.new } let(:value) { 'Fedora' } before do allow(Facter::Resolvers::RedHatRelease).to receive(:resolve).with(:codename).and_return(value) end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.codename', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/rhel/os/distro/description_spec.rb000066400000000000000000000011061470204764400277640ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Rhel::Os::Distro::Description do describe '#call_the_resolver' do subject(:fact) { Facts::Rhel::Os::Distro::Description.new } let(:value) { 'CentOS Linux release 7.2.1511 (Core)' } before do allow(Facter::Resolvers::RedHatRelease).to receive(:resolve) .with(:description).and_return(value) end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.description', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/rhel/os/distro/id_spec.rb000066400000000000000000000010211470204764400260310ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Rhel::Os::Distro::Id do describe '#call_the_resolver' do subject(:fact) { Facts::Rhel::Os::Distro::Id.new } let(:value) { 'RedHatEnterprise' } before do allow(Facter::Resolvers::RedHatRelease).to receive(:resolve).with(:distributor_id).and_return(value) end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.id', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/rhel/os/distro/release_spec.rb000066400000000000000000000064101470204764400270640ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Rhel::Os::Distro::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Rhel::Os::Distro::Release.new } before do allow(Facter::Resolvers::RedHatRelease).to receive(:resolve).with(:version).and_return(value) end context 'when os is RedHat' do context 'when version has only major and minor' do let(:value) { '6.2' } let(:release) { { 'full' => '6.2', 'major' => '6', 'minor' => '2' } } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.distro.release', value: release), an_object_having_attributes(name: 'lsbdistrelease', value: release['full'], type: :legacy), an_object_having_attributes(name: 'lsbmajdistrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'lsbminordistrelease', value: release['minor'], type: :legacy)) end end context 'when version also contains build number' do let(:value) { '7.4.1708' } let(:release) { { 'full' => '7.4.1708', 'major' => '7', 'minor' => '4' } } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.distro.release', value: release), an_object_having_attributes(name: 'lsbdistrelease', value: release['full'], type: :legacy), an_object_having_attributes(name: 'lsbmajdistrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'lsbminordistrelease', value: release['minor'], type: :legacy)) end end end context 'when os is Centos' do let(:value) { nil } let(:red_release) { '6.2' } let(:release) { { 'full' => '6.2', 'major' => '6', 'minor' => '2' } } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(red_release) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.distro.release', value: release), an_object_having_attributes(name: 'lsbdistrelease', value: release['full'], type: :legacy), an_object_having_attributes(name: 'lsbmajdistrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'lsbminordistrelease', value: release['minor'], type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/rhel/os/family_spec.rb000066400000000000000000000007561470204764400254300ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Rhel::Os::Family do describe '#call_the_resolver' do subject(:fact) { Facts::Rhel::Os::Family.new } let(:value) { 'RedHat' } it 'returns os family fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.family', value: value), an_object_having_attributes(name: 'osfamily', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/rhel/os/name_spec.rb000066400000000000000000000011571470204764400250630ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Rhel::Os::Name do describe '#call_the_resolver' do subject(:fact) { Facts::Rhel::Os::Name.new } let(:value) { 'RedHat' } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:name).and_return(value) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.name', value: value), an_object_having_attributes(name: 'operatingsystem', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/rhel/os/release_spec.rb000066400000000000000000000053651470204764400255700ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Rhel::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Rhel::Os::Release.new } before do allow(Facter::Resolvers::RedHatRelease).to receive(:resolve).with(:version).and_return(value) end context 'when os is RedHat' do context 'when version has only major and minor' do let(:value) { '6.2' } let(:release) { { 'full' => '6.2', 'major' => '6', 'minor' => '2' } } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end end context 'when version also contains build number' do let(:value) { '7.4.1708' } let(:release) { { 'full' => '7.4.1708', 'major' => '7', 'minor' => '4' } } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end end end context 'when os is Centos' do let(:value) { nil } let(:red_release) { '6.2' } let(:release) { { 'full' => '6.2', 'major' => '6', 'minor' => '2' } } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(red_release) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/slackware/000077500000000000000000000000001470204764400232015ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/slackware/os/000077500000000000000000000000001470204764400236225ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/slackware/os/release_spec.rb000066400000000000000000000046441470204764400266110ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Slackware::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Slackware::Os::Release.new } before do allow(Facter::Resolvers::SpecificReleaseFile).to receive(:resolve) .with(:release, { release_file: '/etc/slackware-version', regex: /Slackware ([0-9.]+)/ }) .and_return(value) end context 'when version is retrieved from specific file' do let(:value) { /Slackware ([0-9.]+)/.match('Slackware 19.4') } let(:release) { { 'full' => '19.4', 'major' => '19', 'minor' => '4' } } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end end context 'when version is retrieved from os-release file' do let(:value) { nil } let(:os_release) { '19.4' } let(:release) { { 'full' => '19.4', 'major' => '19', 'minor' => '4' } } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(os_release) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: release), an_object_having_attributes(name: 'operatingsystemmajrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: release['full'], type: :legacy)) end context 'when release can\'t be received' do let(:os_release) { nil } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.release', value: nil) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/sles/000077500000000000000000000000001470204764400221735ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/sles/lsbdistcodename_spec.rb000066400000000000000000000010301470204764400266640ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Sles::Lsbdistcodename do describe '#call_the_resolver' do subject(:fact) { Facts::Sles::Lsbdistcodename.new } let(:value) { 'sles' } before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:codename).and_return(value) end it 'returns lsbdistcodename fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'lsbdistcodename', value: value, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/sles/lsbdistdescription_spec.rb000066400000000000000000000010471470204764400274440ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Sles::Lsbdistdescription do describe '#call_the_resolver' do subject(:fact) { Facts::Sles::Lsbdistdescription.new } let(:value) { 'sles' } before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:description).and_return(value) end it 'returns lsbdistdescription fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'lsbdistdescription', value: value, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/sles/lsbdistid_spec.rb000066400000000000000000000010061470204764400255100ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Sles::Lsbdistid do describe '#call_the_resolver' do subject(:fact) { Facts::Sles::Lsbdistid.new } let(:value) { 'sles' } before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:distributor_id).and_return(value) end it 'returns lsbdistid fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'lsbdistid', value: value, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/sles/os/000077500000000000000000000000001470204764400226145ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/sles/os/distro/000077500000000000000000000000001470204764400241205ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/sles/os/distro/codename_spec.rb000066400000000000000000000031201470204764400272260ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Sles::Os::Distro::Codename do describe '#call_the_resolver' do subject(:fact) { Facts::Sles::Os::Distro::Codename.new } context 'when codename is not in os-release' do let(:value) { nil } let(:expected_value) { 'n/a' } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve) .with(:version_codename).and_return(value) end it "returns 'n/a' fact value" do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.codename', value: expected_value) end end context 'when codename is empty' do let(:value) { '' } let(:expected_value) { 'n/a' } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve) .with(:version_codename).and_return(value) end it "returns 'n/a' fact value" do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.codename', value: expected_value) end end context 'when codename is in os-release' do let(:value) { 'SP1' } let(:expected_value) { 'SP1' } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve) .with(:version_codename).and_return(value) end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.codename', value: expected_value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/sles/os/distro/description_spec.rb000066400000000000000000000010751470204764400300050ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Sles::Os::Distro::Description do describe '#call_the_resolver' do subject(:fact) { Facts::Sles::Os::Distro::Description.new } let(:value) { 'SUSE Linux Enterprise Server 15' } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve) .with(:pretty_name).and_return(value) end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.description', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/sles/os/distro/id_spec.rb000066400000000000000000000017731470204764400260630ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Sles::Os::Distro::Id do describe '#call_the_resolver' do subject(:fact) { Facts::Sles::Os::Distro::Id.new } context 'when sles 12' do let(:expected_value) { 'SUSE LINUX' } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve) .with(:version_id).and_return('12.1') end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.id', value: expected_value) end end context 'when sles 15' do let(:expected_value) { 'SUSE' } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve) .with(:version_id).and_return('15') end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.id', value: expected_value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/sles/os/distro/release_spec.rb000066400000000000000000000043331470204764400271020ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Sles::Os::Distro::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Sles::Os::Distro::Release.new } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve) .with(:version_id) .and_return(value) end context 'when version has .' do let(:value) { '12.1' } let(:release) { { 'full' => '12.1', 'major' => '12', 'minor' => '1' } } it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.distro.release', value: release), an_object_having_attributes(name: 'lsbdistrelease', value: release['full'], type: :legacy), an_object_having_attributes(name: 'lsbmajdistrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'lsbminordistrelease', value: release['minor'], type: :legacy)) end end context 'when version is simple' do let(:value) { '15' } let(:release) { { 'full' => '15', 'major' => '15', 'minor' => nil } } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(value) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.distro.release', value: release), an_object_having_attributes(name: 'lsbdistrelease', value: release['full'], type: :legacy), an_object_having_attributes(name: 'lsbmajdistrelease', value: release['major'], type: :legacy), an_object_having_attributes(name: 'lsbminordistrelease', value: release['minor'], type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/sles/os/family_spec.rb000066400000000000000000000007541470204764400254420ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Sles::Os::Family do describe '#call_the_resolver' do subject(:fact) { Facts::Sles::Os::Family.new } let(:value) { 'Suse' } it 'returns os family fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.family', value: value), an_object_having_attributes(name: 'osfamily', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/sles/os/release_spec.rb000066400000000000000000000015511470204764400255750ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Sles::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Sles::Os::Release.new } let(:value) { '12.1' } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(value) end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: { 'full' => value, 'major' => '12', 'minor' => '1' }), an_object_having_attributes(name: 'operatingsystemmajrelease', value: '12', type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/000077500000000000000000000000001470204764400227015ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/aio_agent_version_spec.rb000066400000000000000000000010421470204764400277300ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::AioAgentVersion do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::AioAgentVersion.new } let(:value) { '1.2.3' } before do allow(Facter::Resolvers::AioAgentVersion).to receive(:resolve).with(:aio_agent_version).and_return(value) end it 'returns aio_agent_version fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'aio_agent_version', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/augeas/000077500000000000000000000000001470204764400241465ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/augeas/version_spec.rb000066400000000000000000000012261470204764400271730ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Augeas::Version do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Augeas::Version.new } let(:version) { '1.12.0' } before do allow(Facter::Resolvers::Augeas).to \ receive(:resolve).with(:augeas_version).and_return(version) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'augeas.version', value: version), an_object_having_attributes(name: 'augeasversion', value: version, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/current_zone_spec.rb000066400000000000000000000012171470204764400267560ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::CurrentZone do subject(:fact) { Facts::Solaris::CurrentZone.new } let(:value) { 'global' } before do allow(Facter::Resolvers::Solaris::ZoneName).to receive(:resolve).with(:current_zone_name).and_return('global') end describe '#call_the_resolver' do it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly( an_object_having_attributes(name: 'solaris_zones.current', value: value, type: :core), an_object_having_attributes(name: 'zonename', value: value, type: :legacy) ) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/dhcp_servers_spec.rb000066400000000000000000000022031470204764400267240ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::DhcpServers do subject(:fact) { Facts::Solaris::DhcpServers.new } before do allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:dhcp).and_return(dhcp) end describe '#call_the_resolver' do let(:value) { { 'system' => '10.16.122.163', 'eth0' => '10.16.122.163', 'en1' => '10.32.10.163' } } let(:interfaces) { { 'eth0' => { dhcp: '10.16.122.163' }, 'en1' => { dhcp: '10.32.10.163' } } } let(:dhcp) { '10.16.122.163' } it 'returns dhcp_servers' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'dhcp_servers', value: value, type: :legacy) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } let(:dhcp) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'dhcp_servers', value: nil, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/disks_spec.rb000066400000000000000000000044421470204764400253610ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Disks do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Disks.new } let(:disks) do { 'sd0' => { product: 'VMware IDE CDR00Revision', size: '0 bytes', size_bytes: 0, vendor: 'NECVMWar' }, 'sd1' => { product: 'Virtual disk Revision', size: '20.00 GiB', size_bytes: 21_474_836_480, vendor: 'VMware' } } end let(:expected_response) do { 'sd0' => { 'product' => 'VMware IDE CDR00Revision', 'size' => '0 bytes', 'size_bytes' => 0, 'vendor' => 'NECVMWar' }, 'sd1' => { 'product' => 'Virtual disk Revision', 'size' => '20.00 GiB', 'size_bytes' => 21_474_836_480, 'vendor' => 'VMware' } } end before do allow(Facter::Resolvers::Solaris::Disks).to receive(:resolve).with(:disks).and_return(disks) end it 'returns disks fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Array) .and contain_exactly( an_object_having_attributes(name: 'disks', value: expected_response), an_object_having_attributes(name: 'blockdevices', value: 'sd0,sd1'), an_object_having_attributes(name: 'blockdevice_sd0_size', value: 0, type: :legacy), an_object_having_attributes(name: 'blockdevice_sd0_vendor', value: 'NECVMWar', type: :legacy), an_object_having_attributes(name: 'blockdevice_sd1_size', value: 21_474_836_480, type: :legacy), an_object_having_attributes(name: 'blockdevice_sd1_vendor', value: 'VMware', type: :legacy) ) end context 'when resolver returns empty hash' do let(:disks) { {} } it 'returns nil fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'disks', value: nil) end end context 'when resolver returns nil' do let(:disks) { nil } it 'returns nil fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'disks', value: nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/dmi/000077500000000000000000000000001470204764400234525ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/dmi/bios/000077500000000000000000000000001470204764400244065ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/dmi/bios/release_date_spec.rb000066400000000000000000000014401470204764400303610ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Dmi::Bios::ReleaseDate do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Dmi::Bios::ReleaseDate.new } let(:date) { '07/03/2018' } before do allow(Facter::Resolvers::Solaris::Dmi).to \ receive(:resolve).with(:bios_release_date).and_return(date) allow(Facter::Resolvers::Uname).to \ receive(:resolve).with(:processor).and_return('i386') end it 'returns bios release date fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.bios.release_date', value: date), an_object_having_attributes(name: 'bios_release_date', value: date, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/dmi/bios/vendor_spec.rb000066400000000000000000000014241470204764400272430ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Dmi::Bios::Vendor do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Dmi::Bios::Vendor.new } let(:vendor) { 'Phoenix Technologies LTD' } before do allow(Facter::Resolvers::Solaris::Dmi).to \ receive(:resolve).with(:bios_vendor).and_return(vendor) allow(Facter::Resolvers::Uname).to \ receive(:resolve).with(:processor).and_return('i386') end it 'returns bios vendor fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.bios.vendor', value: vendor), an_object_having_attributes(name: 'bios_vendor', value: vendor, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/dmi/bios/version_spec.rb000066400000000000000000000014121470204764400274300ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Dmi::Bios::Version do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Dmi::Bios::Version.new } let(:version) { '6.00' } before do allow(Facter::Resolvers::Solaris::Dmi).to \ receive(:resolve).with(:bios_version).and_return(version) allow(Facter::Resolvers::Uname).to \ receive(:resolve).with(:processor).and_return('i386') end it 'returns bios version fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.bios.version', value: version), an_object_having_attributes(name: 'bios_version', value: version, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/dmi/chassis/000077500000000000000000000000001470204764400251075ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/dmi/chassis/asset_tag_spec.rb000066400000000000000000000014341470204764400304220ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Dmi::Chassis::AssetTag do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Dmi::Chassis::AssetTag.new } let(:tag) { 'No Asset Tag' } before do allow(Facter::Resolvers::Solaris::Dmi).to \ receive(:resolve).with(:chassis_asset_tag).and_return(tag) allow(Facter::Resolvers::Uname).to \ receive(:resolve).with(:processor).and_return('i386') end it 'returns chassis asset tag fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.chassis.asset_tag', value: tag), an_object_having_attributes(name: 'chassisassettag', value: tag, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/dmi/chassis/type_spec.rb000066400000000000000000000014141470204764400274270ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Dmi::Chassis::Type do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Dmi::Chassis::Type.new } let(:type) { 'Low Profile Desktop' } before do allow(Facter::Resolvers::Solaris::Dmi).to \ receive(:resolve).with(:chassis_type).and_return(type) allow(Facter::Resolvers::Uname).to \ receive(:resolve).with(:processor).and_return('i386') end it 'returns chassis type fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.chassis.type', value: type), an_object_having_attributes(name: 'chassistype', value: type, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/dmi/manufacturer_spec.rb000066400000000000000000000026721470204764400275140ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Dmi::Manufacturer do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Dmi::Manufacturer.new } let(:manufacturer) { 'VMware, Inc.' } before do allow(Facter::Resolvers::Uname).to \ receive(:resolve).with(:processor).and_return(isa) end context 'when i386' do let(:isa) { 'i386' } before do allow(Facter::Resolvers::Solaris::Dmi).to \ receive(:resolve).with(:manufacturer).and_return(manufacturer) end it 'returns manufacturer fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.manufacturer', value: manufacturer), an_object_having_attributes(name: 'manufacturer', value: manufacturer, type: :legacy)) end end context 'when sparc' do let(:isa) { 'sparc' } before do allow(Facter::Resolvers::Solaris::DmiSparc).to \ receive(:resolve).with(:manufacturer).and_return(manufacturer) end it 'returns manufacturer fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.manufacturer', value: manufacturer), an_object_having_attributes(name: 'manufacturer', value: manufacturer, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/dmi/product/000077500000000000000000000000001470204764400251325ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/dmi/product/name_spec.rb000066400000000000000000000027051470204764400274150ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Dmi::Product::Name do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Dmi::Product::Name.new } let(:product_name) { 'VMware Virtual Platform' } before do allow(Facter::Resolvers::Uname).to \ receive(:resolve).with(:processor).and_return(isa) end context 'when i386' do let(:isa) { 'i386' } before do allow(Facter::Resolvers::Solaris::Dmi).to \ receive(:resolve).with(:product_name).and_return(product_name) end it 'returns product name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.product.name', value: product_name), an_object_having_attributes(name: 'productname', value: product_name, type: :legacy)) end end context 'when sparc' do let(:isa) { 'sparc' } before do allow(Facter::Resolvers::Solaris::DmiSparc).to \ receive(:resolve).with(:product_name).and_return(product_name) end it 'returns product name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.product.name', value: product_name), an_object_having_attributes(name: 'productname', value: product_name, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/dmi/product/serial_number_spec.rb000066400000000000000000000030131470204764400313150ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Dmi::Product::SerialNumber do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Dmi::Product::SerialNumber.new } let(:serial_number) { 'VMware-42 1a a9 29 31 8f fa e9-7d 69 2e 23 21 b0 0c 45' } before do allow(Facter::Resolvers::Uname).to \ receive(:resolve).with(:processor).and_return(isa) end context 'when i386' do let(:isa) { 'i386' } before do allow(Facter::Resolvers::Solaris::Dmi).to \ receive(:resolve).with(:serial_number).and_return(serial_number) end it 'returns resolved facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.product.serial_number', value: serial_number), an_object_having_attributes(name: 'serialnumber', value: serial_number, type: :legacy)) end end context 'when sparc' do let(:isa) { 'sparc' } before do allow(Facter::Resolvers::Solaris::DmiSparc).to \ receive(:resolve).with(:serial_number).and_return(serial_number) end it 'returns resolved facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.product.serial_number', value: serial_number), an_object_having_attributes(name: 'serialnumber', value: serial_number, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/dmi/product/uuid_spec.rb000066400000000000000000000014631470204764400274430ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Dmi::Product::Uuid do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Dmi::Product::Uuid.new } let(:product_uuid) { '421aa929-318f-fae9-7d69-2e2321b00c45' } before do allow(Facter::Resolvers::Solaris::Dmi).to \ receive(:resolve).with(:product_uuid).and_return(product_uuid) allow(Facter::Resolvers::Uname).to \ receive(:resolve).with(:processor).and_return('i386') end it 'returns resolved facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.product.uuid', value: product_uuid), an_object_having_attributes(name: 'uuid', value: product_uuid, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/facterversion_spec.rb000066400000000000000000000010201470204764400271030ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Facterversion do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Facterversion.new } let(:value) { '4.0.3' } before do allow(Facter::Resolvers::Facterversion).to receive(:resolve).with(:facterversion).and_return(value) end it 'returns facterversion fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'facterversion', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/filesystems_spec.rb000066400000000000000000000010421470204764400266040ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Filesystems do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Filesystems.new } let(:files) { 'apfs,autofs,devfs' } before do allow(Facter::Resolvers::Solaris::Filesystem).to \ receive(:resolve).with(:file_systems).and_return(files) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'filesystems', value: files) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/hypervisors/000077500000000000000000000000001470204764400252765ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/hypervisors/ldom_spec.rb000066400000000000000000000106751470204764400276010ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Hypervisors::Ldom do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Hypervisors::Ldom.new } before do allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve) end context 'when Ldom resolver returns values' do let(:value) do { 'chassis_serial' => 'AK00358110', 'control_domain' => 'opdx-a0-sun2', 'domain_name' => 'sol11-9', 'domain_uuid' => 'd7a3a4df-ce8c-47a9-b396-cb5a5f30c0b2', 'role_control' => false, 'role_io' => false, 'role_root' => false, 'role_service' => false } end before do allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:chassis_serial).and_return('AK00358110') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:control_domain).and_return('opdx-a0-sun2') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:domain_name).and_return('sol11-9') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_control).and_return('false') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_io).and_return('false') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_root).and_return('false') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_service).and_return('false') allow(Facter::Resolvers::Solaris::Ldom) .to receive(:resolve) .with(:domain_uuid) .and_return('d7a3a4df-ce8c-47a9-b396-cb5a5f30c0b2') end it 'returns virtual fact as physical' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.ldom', value: value) end end context 'when ldom resolver returns nil' do before do allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:chassis_serial).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:control_domain).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:domain_name).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_control).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_impl).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_io).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_root).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_service).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:domain_uuid).and_return(nil) end context 'when role_control is false' do let(:value) { nil } it 'returns virtual fact as physical' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.ldom', value: value) end end end context 'when ldom resolver returns empty string' do before do allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:chassis_serial).and_return('') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:control_domain).and_return('') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:domain_name).and_return('') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_control).and_return('') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_impl).and_return('') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_io).and_return('') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_root).and_return('') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_service).and_return('') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:domain_uuid).and_return('') end context 'when role_control is false' do let(:value) { nil } it 'returns virtual fact as physical' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.ldom', value: value) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/hypervisors/zone_spec.rb000066400000000000000000000053551470204764400276200ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Hypervisors::Zone do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Hypervisors::Zone.new } before do allow(Facter::Resolvers::Solaris::ZoneName).to receive(:resolve) allow(Facter::Resolvers::Solaris::Zone).to receive(:resolve) end context 'when current zone name is nil' do let(:current_zone_name) { nil } before do allow(Facter::Resolvers::Solaris::ZoneName) .to receive(:resolve) .with(:current_zone_name) .and_return(current_zone_name) end it 'returns virtual fact as physical' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.zone', value: nil) end end context 'when zone resolver call is nil' do let(:current_zone_name) { 'global' } let(:zones) { nil } before do allow(Facter::Resolvers::Solaris::ZoneName) .to receive(:resolve) .with(:current_zone_name) .and_return(current_zone_name) allow(Facter::Resolvers::Solaris::Zone).to receive(:resolve).with(:zone).and_return(zones) end it 'returns current zone details' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.zone', value: nil) end end context 'when current zone name is valid' do let(:current_zone_name) { 'global' } let(:zones) do [ { brand: 'solaris', id: 0, iptype: 'shared', name: 'global', uuid: '1234', status: 'running', path: 'my/path' }, { brand: 'solaris', id: 1, iptype: 'not_shared', name: 'global2', uuid: '4321', status: 'running', path: 'my/path' } ] end before do allow(Facter::Resolvers::Solaris::ZoneName) .to receive(:resolve) .with(:current_zone_name) .and_return(current_zone_name) allow(Facter::Resolvers::Solaris::Zone).to receive(:resolve).with(:zone).and_return(zones) end it 'returns current zone details' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'hypervisors.zone', value: { 'brand' => 'solaris', 'id' => 0, 'ip_type' => 'shared', 'name' => 'global', 'uuid' => '1234' }) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/identity/000077500000000000000000000000001470204764400245325ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/identity/gid_spec.rb000066400000000000000000000010001470204764400266230ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Identity::Gid do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Identity::Gid.new } let(:value) { '20' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:gid).and_return(value) end it 'returns identity gid fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'identity.gid', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/identity/group_spec.rb000066400000000000000000000011721470204764400272260ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Identity::Group do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Identity::Group.new } let(:value) { 'staff' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:group).and_return(value) end it 'returns identity group fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'identity.group', value: value), an_object_having_attributes(name: 'gid', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/identity/privileged_spec.rb000066400000000000000000000010461470204764400302240ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Identity::Privileged do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Identity::Privileged.new } let(:value) { 'false' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:privileged).and_return(value) end it 'returns identity privileged fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'identity.privileged', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/identity/uid_spec.rb000066400000000000000000000010011470204764400266420ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Identity::Uid do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Identity::Uid.new } let(:value) { '501' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:uid).and_return(value) end it 'returns identity uid fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'identity.uid', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/identity/user_spec.rb000066400000000000000000000011721470204764400270500ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Identity::User do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Identity::User.new } let(:value) { 'root' } before do allow(Facter::Resolvers::PosxIdentity).to receive(:resolve).with(:user).and_return(value) end it 'returns id and identity user name' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'identity.user', value: value), an_object_having_attributes(name: 'id', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/interfaces_spec.rb000066400000000000000000000016601470204764400263660ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Interfaces do subject(:fact) { Facts::Solaris::Interfaces.new } before do allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { ip6: 'fe80::99bf:da20:ad3:9bfe' }, 'en1' => { ip6: 'fe80::99bf:da20:ad3:9bfe' } } } it 'returns interfaces names' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'interfaces', value: interfaces.keys.sort.join(','), type: :legacy) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'interfaces', value: interfaces, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/ipaddress6_interfaces_spec.rb000066400000000000000000000022111470204764400305030ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Ipaddress6Interfaces do subject(:fact) { Facts::Solaris::Ipaddress6Interfaces.new } before do allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { ip6: 'fe80::99bf:da20:ad3:9bfe' }, 'en1' => { ip6: 'fe80::99bf:da20:ad3:9bfe' } } } it 'returns legacy facts with names ipaddress6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ipaddress6_eth0', value: interfaces['eth0'][:ip6], type: :legacy), an_object_having_attributes(name: 'ipaddress6_en1', value: interfaces['en1'][:ip6], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/ipaddress_interfaces_spec.rb000066400000000000000000000021521470204764400304210ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::IpaddressInterfaces do subject(:fact) { Facts::Solaris::IpaddressInterfaces.new } before do allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { ip: '10.16.117.100' }, 'en1' => { ip: '10.16.117.255' } } } it 'returns legacy facts with names ipaddress_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ipaddress_eth0', value: interfaces['eth0'][:ip], type: :legacy), an_object_having_attributes(name: 'ipaddress_en1', value: interfaces['en1'][:ip], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/is_virtual_spec.rb000066400000000000000000000142101470204764400264170ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::IsVirtual do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::IsVirtual.new } let(:processor) { 'i386' } let(:logger_double) { instance_spy(Facter::Log) } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:processor).and_return(processor) end context 'when no hypervisor is found' do let(:vm) { false } let(:current_zone_name) { 'global' } let(:role_control) { 'false' } before do allow(Facter::Resolvers::Solaris::ZoneName) .to receive(:resolve) .with(:current_zone_name) .and_return(current_zone_name) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_impl).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_control).and_return(nil) allow(Facter::Resolvers::Solaris::Dmi).to receive(:resolve).with(:product_name).and_return('unkown') allow(Facter::Resolvers::Solaris::Dmi).to receive(:resolve).with(:bios_vendor).and_return('unkown') allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return(nil) end it 'returns is_virtual fact as false' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'is_virtual', value: vm) end end context 'when Ldom role_control is false, ldom hypervisor is found' do let(:vm) { true } let(:role_control) { 'false' } before do allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_impl).and_return(vm) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_control).and_return(role_control) end it 'returns is_virtual fact as true' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'is_virtual', value: vm) end end context 'when Ldom role_control is true' do let(:role_control) { 'true' } let(:vm) { false } let(:current_zone_name) { 'global' } before do allow(Facter::Resolvers::Solaris::ZoneName) .to receive(:resolve) .with(:current_zone_name) .and_return(current_zone_name) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_impl).and_return(vm) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_control).and_return(role_control) allow(Facter::Resolvers::Solaris::Dmi).to receive(:resolve).with(:product_name).and_return(nil) allow(Facter::Resolvers::Solaris::Dmi).to receive(:resolve).with(:bios_vendor).and_return(nil) allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return(nil) end it 'returns is_virtual fact as false' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'is_virtual', value: vm) end end context 'when zone hypervisor is found' do let(:vm) { true } before do allow(Facter::Resolvers::Solaris::ZoneName).to receive(:resolve).with(:current_zone_name).and_return(vm) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_impl).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_control).and_return(nil) end it 'returns is_virtual fact as physical' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'is_virtual', value: vm) end end context 'when xen hypervisor is found' do let(:current_zone_name) { 'global' } let(:role_control) { 'false' } let(:xen_vm) { true } before do allow(Facter::Resolvers::Solaris::ZoneName) .to receive(:resolve) .with(:current_zone_name) .and_return(current_zone_name) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_impl).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_control).and_return(nil) allow(Facter::Resolvers::Solaris::Dmi).to receive(:resolve).with(:product_name).and_return('unkown') allow(Facter::Resolvers::Solaris::Dmi).to receive(:resolve).with(:bios_vendor).and_return('unkown') allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return(xen_vm) end it 'returns is_virtual fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'is_virtual', value: xen_vm) end end context 'when other hypervisors' do let(:vm) { 'global' } before do allow(Facter::Resolvers::Solaris::ZoneName).to receive(:resolve).with(:current_zone_name).and_return(vm) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_impl).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_control).and_return(nil) allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return(nil) end context 'when processor is i386' do let(:processor) { 'i386' } let(:dmi) { class_double(Facter::Resolvers::Solaris::Dmi).as_stubbed_const } before do allow(dmi).to receive(:resolve) end it 'returns is_virtual fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'is_virtual', value: false) end end context 'when processor is sparc' do let(:processor) { 'sparc' } let(:dmi) { class_spy(Facter::Resolvers::Solaris::DmiSparc).as_stubbed_const } before do allow(dmi).to receive(:resolve) end it 'returns is_virtual fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'is_virtual', value: false) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/kernel_spec.rb000066400000000000000000000007511470204764400255230ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Kernel do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Kernel.new } let(:value) { 'SunOs' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelname).and_return(value) end it 'returns kernel fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernel', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/kernelmajversion_spec.rb000066400000000000000000000022441470204764400276200ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Kernelmajversion do subject(:fact) { Facts::Solaris::Kernelmajversion.new } let(:resolver_value) { '4.15' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelversion).and_return(resolver_value) end shared_examples 'kernelmajversion fact expectation' do it 'returns the correct kernelmajversion fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernelmajversion', value: fact_value) end end describe '#call_the_resolver' do context 'when on Solaris 11.4' do let(:resolver_value) { '11.4.0.15.0' } let(:fact_value) { '11.4' } include_examples 'kernelmajversion fact expectation' end context 'when on Solaris 11.3' do let(:resolver_value) { '11.3' } let(:fact_value) { '11' } include_examples 'kernelmajversion fact expectation' end context 'when full version does not have a . delimeter' do let(:resolver_value) { '4test' } let(:fact_value) { '4test' } include_examples 'kernelmajversion fact expectation' end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/kernelrelease_spec.rb000066400000000000000000000010071470204764400270570ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Kernelrelease do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Kernelrelease.new } let(:value) { '5.11' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelrelease).and_return(value) end it 'returns kernelrelease fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernelrelease', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/kernelversion_spec.rb000066400000000000000000000010161470204764400271240ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Kernelversion do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Kernelversion.new } let(:value) { '11.4.0.15.0' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelversion).and_return(value) end it 'returns kernelversion fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernelversion', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/ldom_spec.rb000066400000000000000000000130411470204764400251720ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Ldom do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Ldom.new } before do allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve) end context 'when Ldom resolver returns values' do let(:value) do { 'domainchassis' => 'AK00358110', 'domaincontrol' => 'opdx-a0-sun2', 'domainname' => 'sol11-9', 'domainrole' => { 'control' => 'false', 'impl' => 'LDoms', 'io' => 'false', 'root' => 'false', 'service' => 'false' }, 'domainuuid' => 'd7a3a4df-ce8c-47a9-b396-cb5a5f30c0b2' } end before do allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:chassis_serial).and_return('AK00358110') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:control_domain).and_return('opdx-a0-sun2') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:domain_name).and_return('sol11-9') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_control).and_return('false') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_impl).and_return('LDoms') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_io).and_return('false') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_root).and_return('false') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_service).and_return('false') allow(Facter::Resolvers::Solaris::Ldom) .to receive(:resolve) .with(:domain_uuid) .and_return('d7a3a4df-ce8c-47a9-b396-cb5a5f30c0b2') end it 'returns virtual fact as ldom' do expect(fact.call_the_resolver).to match_array( [ an_object_having_attributes(name: 'ldom', value: value, type: :core), an_object_having_attributes(name: 'ldom_domainchassis', value: 'AK00358110', type: :legacy), an_object_having_attributes(name: 'ldom_domaincontrol', value: 'opdx-a0-sun2', type: :legacy), an_object_having_attributes(name: 'ldom_domainname', value: 'sol11-9', type: :legacy), an_object_having_attributes(name: 'ldom_domainrole_control', value: 'false', type: :legacy), an_object_having_attributes(name: 'ldom_domainrole_impl', value: 'LDoms', type: :legacy), an_object_having_attributes(name: 'ldom_domainrole_io', value: 'false', type: :legacy), an_object_having_attributes(name: 'ldom_domainrole_root', value: 'false', type: :legacy), an_object_having_attributes(name: 'ldom_domainrole_service', value: 'false', type: :legacy), an_object_having_attributes(name: 'ldom_domainuuid', value: 'd7a3a4df-ce8c-47a9-b396-cb5a5f30c0b2', type: :legacy) ] ) end end context 'when ldom resolver returns nil' do before do allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:chassis_serial).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:control_domain).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:domain_name).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_control).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_impl).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_io).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_root).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_service).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:domain_uuid).and_return(nil) end context 'when role_control is false' do let(:value) { nil } it 'returns virtual fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ldom', value: value) end end end context 'when ldom resolver returns empty string' do before do allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:chassis_serial).and_return('') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:control_domain).and_return('') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:domain_name).and_return('') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_control).and_return('') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_impl).and_return('') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_io).and_return('') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_root).and_return('') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_service).and_return('') allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:domain_uuid).and_return('') end context 'when role_control is false' do let(:value) { nil } it 'returns virtual fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ldom', value: value) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/load_averages_spec.rb000066400000000000000000000010631470204764400270340ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::LoadAverages do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::LoadAverages.new } let(:value) { { '1m' => 0.01, '5m' => 0.02, '15m' => 0.03 } } before do allow(Facter::Resolvers::LoadAverages).to receive(:resolve).with(:load_averages).and_return(value) end it 'returns load_averages fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'load_averages', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/macaddress_interfaces_spec.rb000066400000000000000000000021631470204764400305530ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::MacaddressInterfaces do subject(:fact) { Facts::Solaris::MacaddressInterfaces.new } before do allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { mac: '10.16.117.100' }, 'en1' => { mac: '10.16.117.255' } } } it 'returns legacy facts with names macaddress_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'macaddress_eth0', value: interfaces['eth0'][:mac], type: :legacy), an_object_having_attributes(name: 'macaddress_en1', value: interfaces['en1'][:mac], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/memory/000077500000000000000000000000001470204764400242115ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/memory/swap/000077500000000000000000000000001470204764400251635ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/memory/swap/available_bytes_spec.rb000066400000000000000000000033301470204764400316470ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Memory::Swap::AvailableBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Memory::Swap::AvailableBytes.new } let(:value) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:result) { 2_332_425 } let(:value_mb) { 2.2243738174438477 } before do allow(Facter::Resolvers::Solaris::Memory).to \ receive(:resolve).with(:swap).and_return(value) end it 'returns swap available bytes fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.available_bytes', value: result), an_object_having_attributes(name: 'swapfree_mb', value: value_mb, type: :legacy)) end context 'when resolver returns nil' do let(:value) { nil } it 'returns swap available memory in bytes fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.available_bytes', value: value), an_object_having_attributes(name: 'swapfree_mb', value: value, type: :legacy)) end end context 'when resolver returns empty hash' do let(:value) { {} } let(:result) { nil } it 'returns swap available memory in bytes fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.available_bytes', value: result), an_object_having_attributes(name: 'swapfree_mb', value: result, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/memory/swap/available_spec.rb000066400000000000000000000014141470204764400304420ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Memory::Swap::Available do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Memory::Swap::Available.new } let(:value) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:result) { '2.22 MiB' } before do allow(Facter::Resolvers::Solaris::Memory).to \ receive(:resolve).with(:swap).and_return(value) end it 'returns swap available memory fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.available', value: result), an_object_having_attributes(name: 'swapfree', value: result, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/memory/swap/capacity_spec.rb000066400000000000000000000012431470204764400303170ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Memory::Swap::Capacity do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Memory::Swap::Capacity.new } let(:value) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024, capacity: '7,9%' } } let(:result) { '7,9%' } before do allow(Facter::Resolvers::Solaris::Memory).to \ receive(:resolve).with(:swap).and_return(value) end it 'returns swap memory capacity fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.swap.capacity', value: result) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/memory/swap/total_bytes_spec.rb000066400000000000000000000023601470204764400310540ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Memory::Swap::TotalBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Memory::Swap::TotalBytes.new } let(:value) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:result) { 2_332_999 } let(:value_mb) { 2.224921226501465 } before do allow(Facter::Resolvers::Solaris::Memory).to \ receive(:resolve).with(:swap).and_return(value) end it 'returns swap total memory in bytes fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.total_bytes', value: result), an_object_having_attributes(name: 'swapsize_mb', value: value_mb, type: :legacy)) end context 'when resolver returns nil' do let(:value) { nil } it 'returns swap total memory in bytes fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.total_bytes', value: value), an_object_having_attributes(name: 'swapsize_mb', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/memory/swap/total_spec.rb000066400000000000000000000013601470204764400276450ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Memory::Swap::Total do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Memory::Swap::Total.new } let(:value) { { available_bytes: 24, total_bytes: 1024, used_bytes: 1000 } } let(:result) { '1.00 KiB' } before do allow(Facter::Resolvers::Solaris::Memory).to \ receive(:resolve).with(:swap).and_return(value) end it 'returns swap total memory fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.swap.total', value: result), an_object_having_attributes(name: 'swapsize', value: result, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/memory/swap/used_bytes_spec.rb000066400000000000000000000012301470204764400306640ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Memory::Swap::UsedBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Memory::Swap::UsedBytes.new } let(:value) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:result) { 1024 } before do allow(Facter::Resolvers::Solaris::Memory).to \ receive(:resolve).with(:swap).and_return(value) end it 'returns swap used memory in bytes fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.swap.used_bytes', value: result) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/memory/swap/used_spec.rb000066400000000000000000000012251470204764400274620ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Memory::Swap::Used do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Memory::Swap::Used.new } let(:resolver_value) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:value) { '1.00 KiB' } before do allow(Facter::Resolvers::Solaris::Memory).to \ receive(:resolve).with(:swap).and_return(resolver_value) end it 'returns swap used memory fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.swap.used', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/memory/system/000077500000000000000000000000001470204764400255355ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/memory/system/available_bytes_spec.rb000066400000000000000000000025211470204764400322220ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Memory::System::AvailableBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Memory::System::AvailableBytes.new } let(:resolver_output) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:value) { 2_332_425 } let(:value_mb) { 2.2243738174438477 } before do allow(Facter::Resolvers::Solaris::Memory).to \ receive(:resolve).with(:system).and_return(resolver_output) end it 'returns system available memory in bytes fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.available_bytes', value: value), an_object_having_attributes(name: 'memoryfree_mb', value: value_mb, type: :legacy)) end context 'when resolver returns nil' do let(:value) { nil } let(:resolver_output) { nil } it 'returns system available memory in bytes fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.available_bytes', value: value), an_object_having_attributes(name: 'memoryfree_mb', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/memory/system/available_spec.rb000066400000000000000000000014471470204764400310220ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Memory::System::Available do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Memory::System::Available.new } let(:resolver_value) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:value) { '2.22 MiB' } before do allow(Facter::Resolvers::Solaris::Memory).to \ receive(:resolve).with(:system).and_return(resolver_value) end it 'returns system available memory fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.available', value: value), an_object_having_attributes(name: 'memoryfree', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/memory/system/capacity_spec.rb000066400000000000000000000012771470204764400307000ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Memory::System::Capacity do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Memory::System::Capacity.new } let(:resolver_output) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024, capacity: '5.3%' } } let(:value) { '5.3%' } before do allow(Facter::Resolvers::Solaris::Memory).to \ receive(:resolve).with(:system).and_return(resolver_output) end it 'returns system memory capacity fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.system.capacity', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/memory/system/total_bytes_spec.rb000066400000000000000000000024701470204764400314300ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Memory::System::TotalBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Memory::System::TotalBytes.new } let(:resolver_output) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:value) { 2_332_999 } let(:value_mb) { 2.224921226501465 } before do allow(Facter::Resolvers::Solaris::Memory).to \ receive(:resolve).with(:system).and_return(resolver_output) end it 'returns system total memory in bytes fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.total_bytes', value: value), an_object_having_attributes(name: 'memorysize_mb', value: value_mb, type: :legacy)) end context 'when resolver returns nil' do let(:value) { nil } let(:resolver_output) { nil } it 'returns system total memory in bytes fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.total_bytes', value: value), an_object_having_attributes(name: 'memorysize_mb', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/memory/system/total_spec.rb000066400000000000000000000014271470204764400302230ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Memory::System::Total do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Memory::System::Total.new } let(:resolver_value) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:value) { '2.22 MiB' } before do allow(Facter::Resolvers::Solaris::Memory).to \ receive(:resolve).with(:system).and_return(resolver_value) end it 'returns system total memory fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.total', value: value), an_object_having_attributes(name: 'memorysize', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/memory/system/used_bytes_spec.rb000066400000000000000000000012641470204764400312450ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Memory::System::UsedBytes do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Memory::System::UsedBytes.new } let(:resolver_output) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:value) { 1024 } before do allow(Facter::Resolvers::Solaris::Memory).to \ receive(:resolve).with(:system).and_return(resolver_output) end it 'returns system used memory in bytes fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.system.used_bytes', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/memory/system/used_spec.rb000066400000000000000000000012371470204764400300370ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Memory::System::Used do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Memory::System::Used.new } let(:resolver_value) { { available_bytes: 2_332_425, total_bytes: 2_332_999, used_bytes: 1024 } } let(:value) { '1.00 KiB' } before do allow(Facter::Resolvers::Solaris::Memory).to \ receive(:resolve).with(:system).and_return(resolver_value) end it 'returns system used memory fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.system.used', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/mountpoints_spec.rb000066400000000000000000000035761470204764400266520ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Mountpoints do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Mountpoints.new } context 'when resolver returns hash' do let(:resolver_output) do [{ available: '5.59 GiB', available_bytes: 6_006_294_016, capacity: '41.76%', device: 'rpool/ROOT/solaris', filesystem: 'zfs', options: ['dev=4490002'], path: '/', size: '9.61 GiB', size_bytes: 10_313_577_472, used: '4.01 GiB', used_bytes: 4_307_283_456 }] end let(:parsed_fact) do { '/' => { 'available' => '5.59 GiB', 'available_bytes' => 6_006_294_016, 'capacity' => '41.76%', 'device' => 'rpool/ROOT/solaris', 'filesystem' => 'zfs', 'options' => ['dev=4490002'], 'size' => '9.61 GiB', 'size_bytes' => 10_313_577_472, 'used' => '4.01 GiB', 'used_bytes' => 4_307_283_456 } } end before do allow(Facter::Resolvers::Solaris::Mountpoints) .to receive(:resolve).with(:mountpoints).and_return(resolver_output) end it 'returns mountpoints information' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'mountpoints', value: parsed_fact) end end context 'when resolver returns nil' do before do allow(Facter::Resolvers::Solaris::Mountpoints).to receive(:resolve).with(:mountpoints).and_return(nil) end it 'returns mountpoints information' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'mountpoints', value: nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/mtu_interfaces_spec.rb000066400000000000000000000017221470204764400272520ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::MtuInterfaces do subject(:fact) { Facts::Solaris::MtuInterfaces.new } before do allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { mtu: 1500 }, 'en1' => { mtu: 1500 } } } it 'returns legacy facts with names mtu_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'mtu_eth0', value: interfaces['eth0'][:mtu], type: :legacy), an_object_having_attributes(name: 'mtu_en1', value: interfaces['en1'][:mtu], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/netmask6_interfaces_spec.rb000066400000000000000000000022471470204764400302000ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Netmask6Interfaces do subject(:fact) { Facts::Solaris::Netmask6Interfaces.new } before do allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) do { 'eth0' => { netmask6: 'fe80::99bf:da20:ad3:9bfe' }, 'en1' => { netmask6: 'fe80::99bf:da20:ad3:9bfe' } } end it 'returns legacy facts with names netmask6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'netmask6_eth0', value: interfaces['eth0'][:netmask6], type: :legacy), an_object_having_attributes(name: 'netmask6_en1', value: interfaces['en1'][:netmask6], type: :legacy)) end end describe '#call_the_resolver when resolver return nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/netmask_interfaces_spec.rb000066400000000000000000000021651470204764400301110ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::NetmaskInterfaces do subject(:fact) { Facts::Solaris::NetmaskInterfaces.new } before do allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { netmask: '10.255.255.255' }, 'en1' => { netmask: '10.17.255.255' } } } it 'returns legacy facts with names netmask_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'netmask_eth0', value: interfaces['eth0'][:netmask], type: :legacy), an_object_having_attributes(name: 'netmask_en1', value: interfaces['en1'][:netmask], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/network6_interfaces_spec.rb000066400000000000000000000021541470204764400302240ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Network6Interfaces do subject(:fact) { Facts::Solaris::Network6Interfaces.new } before do allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { network6: '::1' }, 'en1' => { network6: 'fe80::' } } } it 'returns legacy facts with names network6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'network6_eth0', value: interfaces['eth0'][:network6], type: :legacy), an_object_having_attributes(name: 'network6_en1', value: interfaces['en1'][:network6], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/network_interfaces_spec.rb000066400000000000000000000021651470204764400301400ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::NetworkInterfaces do subject(:fact) { Facts::Solaris::NetworkInterfaces.new } before do allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { network: '10.255.255.255' }, 'en1' => { network: '10.17.255.255' } } } it 'returns legacy facts with names network_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'network_eth0', value: interfaces['eth0'][:network], type: :legacy), an_object_having_attributes(name: 'network_en1', value: interfaces['en1'][:network], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/networking/000077500000000000000000000000001470204764400250705ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/networking/dhcp_spec.rb000066400000000000000000000014541470204764400273510ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Networking::Dhcp do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Networking::Dhcp.new } let(:value) { '10.16.122.163' } before do allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:dhcp).and_return(value) end it 'returns dhcp fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.dhcp', value: value) end context 'when dhcp can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.dhcp', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/networking/domain_spec.rb000066400000000000000000000011741470204764400277010ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Networking::Domain do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Networking::Domain.new } let(:value) { 'domain' } before do allow(Facter::Resolvers::Hostname).to receive(:resolve).with(:domain).and_return(value) end it 'returns domain fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.domain', value: value), an_object_having_attributes(name: 'domain', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/networking/fqdn_spec.rb000066400000000000000000000011651470204764400273620ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Networking::Fqdn do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Networking::Fqdn.new } let(:value) { 'host.domain' } before do allow(Facter::Resolvers::Hostname).to receive(:resolve).with(:fqdn).and_return(value) end it 'returns fqdn fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.fqdn', value: value), an_object_having_attributes(name: 'fqdn', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/networking/hostname_spec.rb000066400000000000000000000012061470204764400302440ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Networking::Hostname do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Networking::Hostname.new } let(:value) { 'host' } before do allow(Facter::Resolvers::Hostname).to receive(:resolve).with(:hostname).and_return(value) end it 'returns hostname fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.hostname', value: value), an_object_having_attributes(name: 'hostname', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/networking/interfaces_spec.rb000066400000000000000000000021111470204764400305450ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Networking::Interfaces do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Networking::Interfaces.new } let(:value) do { 'ens160' => { 'bindings' => [ { 'address' => '10.16.116.8', 'netmask' => '255.255.240.0', 'network' => '10.16.112.0' } ] } } end before do allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:interfaces).and_return(value) end it 'returns networking.interfaces fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.interfaces', value: value) end context 'when interfaces can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.interfaces', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/networking/ip6_spec.rb000066400000000000000000000020351470204764400271250ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Networking::Ip6 do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Networking::Ip6.new } let(:value) { 'fe80::5989:97ff:75ae:dae7' } before do allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:ip6).and_return(value) end it 'returns ipv6 address fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip6', value: value), an_object_having_attributes(name: 'ipaddress6', value: value, type: :legacy)) end context 'when ip6 can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip6', value: value), an_object_having_attributes(name: 'ipaddress6', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/networking/ip_spec.rb000066400000000000000000000011661470204764400270430ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Networking::Ip do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Networking::Ip.new } let(:value) { '10.0.0.1' } before do allow(Facter::Resolvers::Solaris::Ipaddress).to receive(:resolve).with(:ip).and_return(value) end it 'return ip fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip', value: value), an_object_having_attributes(name: 'ipaddress', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/networking/mac_spec.rb000066400000000000000000000020221470204764400271630ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Networking::Mac do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Networking::Mac.new } let(:value) { '64:5a:ed:ea:c3:25' } before do allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:mac).and_return(value) end it 'return macaddress fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.mac', value: value), an_object_having_attributes(name: 'macaddress', value: value, type: :legacy)) end context 'when mac can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.mac', value: value), an_object_having_attributes(name: 'macaddress', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/networking/mtu_spec.rb000066400000000000000000000014311470204764400272330ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Networking::Mtu do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Networking::Mtu.new } let(:value) { 1500 } before do allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:mtu).and_return(value) end it 'return mtu fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.mtu', value: value) end context 'when mtu can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.mtu', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/networking/netmask6_spec.rb000066400000000000000000000020631470204764400301600ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Networking::Netmask6 do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Networking::Netmask6.new } let(:value) { 'fe80::5989:97ff:75ae:dae7' } before do allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:netmask6).and_return(value) end it 'returns netmask6 fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask6', value: value), an_object_having_attributes(name: 'netmask6', value: value, type: :legacy)) end context 'when netmask6 can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask6', value: value), an_object_having_attributes(name: 'netmask6', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/networking/netmask_spec.rb000066400000000000000000000020421470204764400300670ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Networking::Netmask do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Networking::Netmask.new } let(:value) { '10.16.122.163' } before do allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:netmask).and_return(value) end it 'returns netmask fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'networking.netmask', value: value), an_object_having_attributes(name: 'netmask', value: value, type: :legacy)) end context 'when netmask can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask', value: value), an_object_having_attributes(name: 'netmask', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/networking/network6_spec.rb000066400000000000000000000020631470204764400302070ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Networking::Network6 do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Networking::Network6.new } let(:value) { 'fe80::5989:97ff:75ae:dae7' } before do allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:network6).and_return(value) end it 'returns network6 fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network6', value: value), an_object_having_attributes(name: 'network6', value: value, type: :legacy)) end context 'when network6 can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network6', value: value), an_object_having_attributes(name: 'network6', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/networking/network_spec.rb000066400000000000000000000020421470204764400301160ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Networking::Network do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Networking::Network.new } let(:value) { '10.16.122.163' } before do allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:network).and_return(value) end it 'returns network fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'networking.network', value: value), an_object_having_attributes(name: 'network', value: value, type: :legacy)) end context 'when network can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network', value: value), an_object_having_attributes(name: 'network', value: value, type: :legacy)) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/networking/primary_spec.rb000066400000000000000000000015311470204764400301120ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Networking::Primary do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Networking::Primary.new } let(:value) { 'ens160' } before do allow(Facter::Resolvers::Solaris::Networking).to receive(:resolve).with(:primary_interface).and_return(value) end it 'returns networking.primary fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.primary', value: value) end context 'when primary interface can not be retrieved' do let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact).and have_attributes(name: 'networking.primary', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/os/000077500000000000000000000000001470204764400233225ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/os/architecture_spec.rb000066400000000000000000000011771470204764400273510ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Os::Architecture do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Os::Architecture.new } let(:value) { 'i86pc' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:machine).and_return(value) end it 'returns architecture fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.architecture', value: value), an_object_having_attributes(name: 'architecture', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/os/family_spec.rb000066400000000000000000000007651470204764400261520ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Os::Family do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Os::Family.new } let(:value) { 'Solaris' } it 'returns os family fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.family', value: value), an_object_having_attributes(name: 'osfamily', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/os/hardware_spec.rb000066400000000000000000000011661470204764400264620ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Os::Hardware do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Os::Hardware.new } let(:value) { 'i86pc' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:machine).and_return(value) end it 'returns hardware model fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.hardware', value: value), an_object_having_attributes(name: 'hardwaremodel', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/os/name_spec.rb000066400000000000000000000011701470204764400256000ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Os::Name do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Os::Name.new } let(:value) { 'Solaris' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelname).and_return(value) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.name', value: value), an_object_having_attributes(name: 'operatingsystem', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/os/release_spec.rb000066400000000000000000000022461470204764400263050ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Os::Release.new } let(:value) { { 'full' => '10_u11', 'minor' => '11', 'major' => '10' } } before do allow(Facter::Resolvers::Solaris::OsRelease).to receive(:resolve).with(:full).and_return('10_u11') allow(Facter::Resolvers::Solaris::OsRelease).to receive(:resolve).with(:major).and_return('10') allow(Facter::Resolvers::Solaris::OsRelease).to receive(:resolve).with(:minor).and_return('11') end it 'returns os.release, operatingsystemmajrelease and operatingsystemrelease fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: value), an_object_having_attributes(name: 'operatingsystemmajrelease', value: value['major'], type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: value['full'], type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/path_spec.rb000066400000000000000000000010641470204764400251750ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Path do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Path.new } let(:value) { '/usr/bin:/etc:/usr/sbin:/usr/ucb:/usr/bin/X11:/sbin:/usr/java6/jre/bin:/usr/java6/bin' } before do allow(Facter::Resolvers::Path).to \ receive(:resolve).with(:path).and_return(value) end it 'returns path fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'path', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/processors/000077500000000000000000000000001470204764400251035ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/processors/cores_spec.rb000066400000000000000000000011061470204764400275530ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Processors::Cores do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Processors::Cores.new } let(:cores_per_socket) { 4 } before do allow(Facter::Resolvers::Solaris::Processors).to \ receive(:resolve).with(:cores_per_socket).and_return(cores_per_socket) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'processors.cores', value: cores_per_socket) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/processors/count_spec.rb000066400000000000000000000012601470204764400275710ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Processors::Count do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Processors::Count.new } let(:processors) { '4' } before do allow(Facter::Resolvers::Solaris::Processors).to \ receive(:resolve).with(:logical_count).and_return(processors) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.count', value: processors), an_object_having_attributes(name: 'processorcount', value: processors, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/processors/isa_spec.rb000066400000000000000000000011741470204764400272210ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Processors::Isa do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Processors::Isa.new } let(:isa) { 'i386' } before do allow(Facter::Resolvers::Uname).to \ receive(:resolve).with(:processor).and_return(isa) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.isa', value: isa), an_object_having_attributes(name: 'hardwareisa', value: isa, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/processors/models_spec.rb000066400000000000000000000015101470204764400277220ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Processors::Models do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Processors::Models.new } let(:value) { 'Intel(R) Core(TM) i7-4980HQ CPU @ 2.80GHz' } let(:models) { [value, value] } before do allow(Facter::Resolvers::Solaris::Processors).to \ receive(:resolve).with(:models).and_return(models) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.models', value: models), an_object_having_attributes(name: 'processor0', value: value, type: :legacy), an_object_having_attributes(name: 'processor1', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/processors/physicalcount_spec.rb000066400000000000000000000014211470204764400313250ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Processors::Physicalcount do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Processors::Physicalcount.new } let(:physicalcount) { '5' } before do allow(Facter::Resolvers::Solaris::Processors).to \ receive(:resolve).with(:physical_count).and_return(physicalcount) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.physicalcount', value: physicalcount), an_object_having_attributes(name: 'physicalprocessorcount', value: physicalcount, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/processors/speed_spec.rb000066400000000000000000000011311470204764400275360ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Processors::Speed do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Processors::Speed.new } let(:speed) { 1_800_000_000 } let(:converted_speed) { '1.80 GHz' } before do allow(Facter::Resolvers::Solaris::Processors).to \ receive(:resolve).with(:speed).and_return(speed) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'processors.speed', value: converted_speed) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/processors/threads_spec.rb000066400000000000000000000011141470204764400300710ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Processors::Threads do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Processors::Threads.new } let(:threads_per_core) { 4 } before do allow(Facter::Resolvers::Solaris::Processors).to \ receive(:resolve).with(:threads_per_core).and_return(threads_per_core) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'processors.threads', value: threads_per_core) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/ruby/000077500000000000000000000000001470204764400236625ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/ruby/platform_spec.rb000066400000000000000000000012001470204764400270360ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Ruby::Platform do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Ruby::Platform.new } let(:value) { 'x86_64-linux' } before do allow(Facter::Resolvers::Ruby).to receive(:resolve).with(:platform).and_return(value) end it 'return ruby.platform fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ruby.platform', value: value), an_object_having_attributes(name: 'rubyplatform', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/ruby/sitedir_spec.rb000066400000000000000000000012351470204764400266650ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Ruby::Sitedir do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Ruby::Sitedir.new } let(:value) { '/opt/puppetlabs/puppet/lib/ruby/site_ruby/2.5.0' } before do allow(Facter::Resolvers::Ruby).to receive(:resolve).with(:sitedir).and_return(value) end it 'return ruby sitedir fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ruby.sitedir', value: value), an_object_having_attributes(name: 'rubysitedir', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/ruby/version_spec.rb000066400000000000000000000012011470204764400267000ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Ruby::Version do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Ruby::Version.new } let(:value) { '2.5.9' } before do allow(Facter::Resolvers::Ruby).to receive(:resolve).with(:version).and_return(value) end it 'returns ruby version fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'ruby.version', value: value), an_object_having_attributes(name: 'rubyversion', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/ssh_spec.rb000066400000000000000000000021041470204764400250320ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Ssh do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Ssh.new } let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'ecdsa', 'test', 'ecdsa')] end let(:value) do { 'ecdsa' => { 'fingerprints' => { 'sha1' => 'test', 'sha256' => 'test' }, 'key' => 'test', 'type' => 'ecdsa' } } end before do allow(Facter::Resolvers::Ssh).to \ receive(:resolve).with(:ssh).and_return(ssh) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ssh', value: value) end context 'when resolver returns empty array' do let(:ssh) { [] } it 'returns nil fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ssh', value: nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/sshalgorithmkey_spec.rb000066400000000000000000000020551470204764400274570ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Sshalgorithmkey do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Sshalgorithmkey.new } let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'ecdsa', 'test', 'ecdsa'), Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'rsa', 'test', 'rsa')] end let(:legacy_fact1) { { name: 'ecdsa', value: 'test' } } let(:legacy_fact2) { { name: 'rsa', value: 'test' } } before do allow(Facter::Resolvers::Ssh).to \ receive(:resolve).with(:ssh).and_return(ssh) end it 'returns a list of resolved facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: "ssh#{legacy_fact1[:name]}key", value: legacy_fact1[:value]), an_object_having_attributes(name: "ssh#{legacy_fact2[:name]}key", value: legacy_fact2[:value])) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/sshfp_algorithm_spec.rb000066400000000000000000000021071470204764400274310ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::SshfpAlgorithm do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::SshfpAlgorithm.new } let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('sha11', 'sha2561'), 'ecdsa', 'test', 'ecdsa'), Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('sha12', 'sha2562'), 'rsa', 'test', 'rsa')] end let(:legacy_fact1) { { name: 'ecdsa', value: "sha11\nsha2561" } } let(:legacy_fact2) { { name: 'rsa', value: "sha12\nsha2562" } } before do allow(Facter::Resolvers::Ssh).to \ receive(:resolve).with(:ssh).and_return(ssh) end it 'returns a list of resolved facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: "sshfp_#{legacy_fact1[:name]}", value: legacy_fact1[:value]), an_object_having_attributes(name: "sshfp_#{legacy_fact2[:name]}", value: legacy_fact2[:value])) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/system_uptime/000077500000000000000000000000001470204764400256105ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/system_uptime/days_spec.rb000066400000000000000000000012021470204764400301020ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::SystemUptime::Days do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::SystemUptime::Days.new } let(:value) { '2' } before do allow(Facter::Resolvers::Uptime).to receive(:resolve).with(:days).and_return(value) end it 'returns days since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.days', value: value), an_object_having_attributes(name: 'uptime_days', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/system_uptime/hours_spec.rb000066400000000000000000000012101470204764400303010ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::SystemUptime::Hours do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::SystemUptime::Hours.new } let(:value) { '2' } before do allow(Facter::Resolvers::Uptime).to receive(:resolve).with(:hours).and_return(value) end it 'returns hours since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.hours', value: value), an_object_having_attributes(name: 'uptime_hours', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/system_uptime/seconds_spec.rb000066400000000000000000000012251470204764400306050ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::SystemUptime::Seconds do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::SystemUptime::Seconds.new } let(:value) { 3600 } before do allow(Facter::Resolvers::Uptime).to receive(:resolve).with(:seconds).and_return(value) end it 'returns minutes since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.seconds', value: value), an_object_having_attributes(name: 'uptime_seconds', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/system_uptime/uptime_spec.rb000066400000000000000000000012221470204764400304470ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::SystemUptime::Uptime do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::SystemUptime::Uptime.new } let(:value) { '6 days' } before do allow(Facter::Resolvers::Uptime).to receive(:resolve).with(:uptime).and_return(value) end it 'returns total uptime since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.uptime', value: value), an_object_having_attributes(name: 'uptime', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/timezone_spec.rb000066400000000000000000000010051470204764400260660ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Timezone do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Timezone.new } let(:timezone) { 'UTC' } before do allow(Facter::Resolvers::Timezone).to \ receive(:resolve).with(:timezone).and_return(timezone) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'timezone', value: timezone) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/virtual_spec.rb000066400000000000000000000141131470204764400257260ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Virtual do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::Virtual.new } let(:processor) { 'i386' } before do allow(Facter::Resolvers::Uname).to receive(:resolve).with(:processor).and_return(processor) end context 'when no hypervisor is found' do let(:vm) { 'physical' } let(:current_zone_name) { 'global' } let(:role_control) { 'false' } before do allow(Facter::Resolvers::Solaris::ZoneName) .to receive(:resolve) .with(:current_zone_name) .and_return(current_zone_name) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_impl).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_control).and_return(nil) allow(Facter::Resolvers::Solaris::Dmi).to receive(:resolve).with(:product_name).and_return('unkown') allow(Facter::Resolvers::Solaris::Dmi).to receive(:resolve).with(:bios_vendor).and_return('unkown') allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return(nil) end it 'returns virtual fact as physical' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'virtual', value: vm) end end context 'when Ldom role_control is false, ldom hypervisor is found' do let(:vm) { 'LDoms' } let(:role_control) { 'false' } before do allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_impl).and_return(vm) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_control).and_return(role_control) end it 'returns virtual fact as LDoms' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'virtual', value: vm) end end context 'when Ldom role_control is true' do let(:role_control) { 'true' } let(:vm) { 'physical' } let(:current_zone_name) { 'global' } before do allow(Facter::Resolvers::Solaris::ZoneName) .to receive(:resolve) .with(:current_zone_name) .and_return(current_zone_name) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_impl).and_return(vm) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_control).and_return(role_control) allow(Facter::Resolvers::Solaris::Dmi).to receive(:resolve).with(:product_name).and_return(nil) allow(Facter::Resolvers::Solaris::Dmi).to receive(:resolve).with(:bios_vendor).and_return(nil) allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return(nil) end it 'returns virtual fact as physical' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'virtual', value: vm) end end context 'when zone hypervisor is found' do let(:vm) { 'zone' } before do allow(Facter::Resolvers::Solaris::ZoneName).to receive(:resolve).with(:current_zone_name).and_return(vm) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_impl).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_control).and_return(nil) end it 'returns virtual fact as physical' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'virtual', value: vm) end end context 'when xen hypervisor is found' do let(:current_zone_name) { 'global' } let(:role_control) { 'false' } let(:xen_vm) { 'xenhvm' } before do allow(Facter::Resolvers::Solaris::ZoneName) .to receive(:resolve) .with(:current_zone_name) .and_return(current_zone_name) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_impl).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_control).and_return(nil) allow(Facter::Resolvers::Solaris::Dmi).to receive(:resolve).with(:product_name).and_return('unkown') allow(Facter::Resolvers::Solaris::Dmi).to receive(:resolve).with(:bios_vendor).and_return('unkown') allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return(xen_vm) end it 'returns virtual fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'virtual', value: xen_vm) end end context 'when other hypervisors' do let(:vm) { 'global' } before do allow(Facter::Resolvers::Solaris::ZoneName).to receive(:resolve).with(:current_zone_name).and_return(vm) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_impl).and_return(nil) allow(Facter::Resolvers::Solaris::Ldom).to receive(:resolve).with(:role_control).and_return(nil) allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return(nil) end context 'when processor is i386' do let(:processor) { 'i386' } let(:dmi) { class_double(Facter::Resolvers::Solaris::Dmi).as_stubbed_const } before do allow(dmi).to receive(:resolve) end it 'returns virtual fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'virtual', value: 'physical') end end context 'when processor is sparc' do let(:processor) { 'sparc' } let(:dmi) { class_double(Facter::Resolvers::Solaris::DmiSparc).as_stubbed_const } before do allow(dmi).to receive(:resolve) end it 'returns virtual fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'virtual', value: 'physical') end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/zfs_featurenumbers_spec.rb000066400000000000000000000010771470204764400301560ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::ZfsFeaturenumbers do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::ZfsFeaturenumbers.new } let(:feature_numbers) { '1,2,3,4,5' } before do allow(Facter::Resolvers::ZFS).to receive(:resolve).with(:zfs_featurenumbers).and_return(feature_numbers) end it 'returns zfs_featurenumbers fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'zfs_featurenumbers', value: feature_numbers) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/zfs_version_spec.rb000066400000000000000000000007741470204764400266170ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::ZfsVersion do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::ZfsVersion.new } let(:version) { '6' } before do allow(Facter::Resolvers::ZFS).to receive(:resolve).with(:zfs_version).and_return(version) end it 'returns zfs_version fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'zfs_version', value: version) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/zones_spec.rb000066400000000000000000000033121470204764400253750ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::Zones do subject(:fact) { Facts::Solaris::Zones.new } let(:zone_name) { 'global' } let(:result) do { brand: 'solaris', id: '0', iptype: 'shared', name: 'global', uuid: nil, status: nil, path: nil } end let(:result_fact) do { zone_name => { 'brand' => 'solaris', 'id' => '0', 'ip_type' => 'shared', 'status' => nil, 'path' => nil } } end before do allow(Facter::Resolvers::Solaris::Zone).to receive(:resolve).with(:zone).and_return([result]) end describe '#call_the_resolver' do it 'returns a fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly( an_object_having_attributes(name: 'solaris_zones.zones', value: result_fact, type: :core), an_object_having_attributes(name: 'zone_global_id', value: result[:id], type: :legacy), an_object_having_attributes(name: 'zone_global_uuid', value: result[:uuid], type: :legacy), an_object_having_attributes(name: 'zone_global_name', value: result[:name], type: :legacy), an_object_having_attributes(name: 'zone_global_path', value: result[:path], type: :legacy), an_object_having_attributes(name: 'zone_global_status', value: result[:status], type: :legacy), an_object_having_attributes(name: 'zone_global_brand', value: result[:brand], type: :legacy), an_object_having_attributes(name: 'zone_global_iptype', value: result[:iptype], type: :legacy), an_object_having_attributes(name: 'zones', value: 1, type: :legacy) ) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/zpool_featureflags_spec.rb000066400000000000000000000012411470204764400301310ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::ZpoolFeatureflags do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::ZpoolFeatureflags.new } let(:zpool_feature_flags) { 'async_destroy,empty_bpobj,lz4_compress,multi_vdev_crash_dump,spacemap_histogram' } before do allow(Facter::Resolvers::Zpool).to \ receive(:resolve).with(:zpool_featureflags).and_return(zpool_feature_flags) end it 'returns the zpool_featureflags fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'zpool_featureflags', value: zpool_feature_flags) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/zpool_featurenumbers_spec.rb000066400000000000000000000011541470204764400305130ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::ZpoolFeaturenumbers do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::ZpoolFeaturenumbers.new } let(:zpool_featurenumbers) { '1,2,3,4,5,6,7' } before do allow(Facter::Resolvers::Zpool).to \ receive(:resolve).with(:zpool_featurenumbers).and_return(zpool_featurenumbers) end it 'returns the zpool_featurenumbers fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'zpool_featurenumbers', value: zpool_featurenumbers) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/solaris/zpool_version_spec.rb000066400000000000000000000010141470204764400271440ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Solaris::ZpoolVersion do describe '#call_the_resolver' do subject(:fact) { Facts::Solaris::ZpoolVersion.new } let(:version) { '5' } before do allow(Facter::Resolvers::Zpool).to receive(:resolve).with(:zpool_version).and_return(version) end it 'returns the ZPool version fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'zpool_version', value: version) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/ubuntu/000077500000000000000000000000001470204764400225475ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/ubuntu/lsbdistrelease_spec.rb000066400000000000000000000026771470204764400271270ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Ubuntu::Lsbdistrelease do describe '#call_the_resolver' do subject(:fact) { Facts::Ubuntu::Lsbdistrelease.new } context 'when lsb-release is installed' do before do allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:release).and_return(value) end context 'when version_id is retrieved successful' do let(:value) { '18.04' } let(:value_final) { { 'full' => '18.04', 'major' => '18.04', 'minor' => nil } } it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'lsbdistrelease', value: value, type: :legacy), an_object_having_attributes(name: 'lsbmajdistrelease', value: value_final['major'], type: :legacy), an_object_having_attributes(name: 'lsbminordistrelease', value: value_final['minor'], type: :legacy)) end end context 'when lsb-release is not installed' do let(:value) { nil } it 'returns release fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'lsbdistrelease', value: value, type: :legacy) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/ubuntu/os/000077500000000000000000000000001470204764400231705ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/ubuntu/os/distro/000077500000000000000000000000001470204764400244745ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/ubuntu/os/distro/release_spec.rb000066400000000000000000000023541470204764400274570ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Ubuntu::Os::Distro::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Ubuntu::Os::Distro::Release.new } shared_examples 'returns distro release fact' do it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'os.distro.release', value: fact_value) end end before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(os_release_value) end context 'when version_id is retrieved successful' do let(:os_release_value) { '18.04' } let(:fact_value) { { 'full' => '18.04', 'major' => '18.04' } } it_behaves_like 'returns distro release fact' end context 'when version_id could not be retrieved' do let(:os_release_value) { nil } let(:fact_value) { nil } it_behaves_like 'returns distro release fact' end context 'when version has no minor' do let(:os_release_value) { 'experimental_release' } let(:fact_value) { { 'full' => 'experimental_release', 'major' => 'experimental_release' } } it_behaves_like 'returns distro release fact' end end end puppetlabs-facter-dfe6df4/spec/facter/facts/ubuntu/os/release_spec.rb000066400000000000000000000014161470204764400261510ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Ubuntu::Os::Release do describe '#call_the_resolver' do subject(:fact) { Facts::Ubuntu::Os::Release.new } let(:value) { '10.9' } before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:version_id).and_return(value) end it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: { 'full' => value, 'major' => value }), an_object_having_attributes(name: 'operatingsystemmajrelease', value: value, type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/000077500000000000000000000000001470204764400227175ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/windows/az_metadata_spec.rb000066400000000000000000000031741470204764400265350ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::AzMetadata do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::AzMetadata.new } before do allow(Facter::Resolvers::Az).to receive(:resolve).with(:metadata).and_return(value) end context 'when physical machine with no hypervisor' do let(:value) { nil } before do allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return(nil) end it 'returns az metadata fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'az_metadata', value: value) end it "doesn't call az resolver" do fact.call_the_resolver expect(Facter::Resolvers::Az).not_to have_received(:resolve).with(:metadata) end end context 'when platform is hyperv' do let(:value) { { 'info' => 'value' } } before do allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('hyperv') end context 'when on Azure' do it 'returns az_metadata fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'az_metadata', value: value) end end context 'when not on Azure' do let(:value) { nil } it 'returns az_metadata fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'az_metadata', value: value) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/cloud/000077500000000000000000000000001470204764400240255ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/windows/cloud/provider_spec.rb000066400000000000000000000077501470204764400272270ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Cloud::Provider do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Cloud::Provider.new } describe 'when on xen' do before do allow(Facter::Resolvers::Ec2).to receive(:resolve).with(:metadata).and_return(value) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('xen') end describe 'Ec2 data exists and aws fact is set' do let(:value) { { 'some' => 'fact' } } it 'Testing things' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'cloud.provider', value: 'aws') end end context 'when Ec2 data does not exist nil is returned' do let(:value) { {} } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'cloud.provider', value: nil) end end end describe 'when on kvm' do before do allow(Facter::Resolvers::Ec2).to receive(:resolve).with(:metadata).and_return(value) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('kvm') end describe 'Ec2 data exists and aws fact is set' do let(:value) { { 'some' => 'fact' } } it 'Testing things' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'cloud.provider', value: 'aws') end end context 'when Ec2 data does not exist nil is returned' do let(:value) { {} } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'cloud.provider', value: nil) end end end context 'when on hyperv' do before do allow(Facter::Resolvers::Az).to receive(:resolve).with(:metadata).and_return(value) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('hyperv') end context 'when az_metadata exists' do let(:value) { { 'some' => 'fact' } } it 'returns azure as cloud.provider' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'cloud.provider', value: 'azure') end end context 'when az_metadata does not exist' do let(:value) { {} } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'cloud.provider', value: nil) end end end context 'when on gce' do before do allow(Facter::Resolvers::Gce).to receive(:resolve).with(:metadata).and_return(value) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('gce') end describe 'with the "gce" fact having data' do let(:value) { { 'some' => 'metadata' } } it 'resolves a provider of "gce"' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'cloud.provider', value: 'gce') end end context 'with the "gce" fact being empty' do let(:value) { {} } it 'resolves to nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'cloud.provider', value: nil) end end end context 'when on a physical machine' do before do allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return(nil) end it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'cloud.provider', value: nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/dhcp_servers_spec.rb000066400000000000000000000022031470204764400267420ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::DhcpServers do subject(:fact) { Facts::Windows::DhcpServers.new } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:dhcp).and_return(dhcp) end describe '#call_the_resolver' do let(:value) { { 'system' => '10.16.122.163', 'eth0' => '10.16.122.163', 'en1' => '10.32.10.163' } } let(:interfaces) { { 'eth0' => { dhcp: '10.16.122.163' }, 'en1' => { dhcp: '10.32.10.163' } } } let(:dhcp) { '10.16.122.163' } it 'returns dhcp_servers' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'dhcp_servers', value: value, type: :legacy) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } let(:dhcp) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'dhcp_servers', value: nil, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/dmi/000077500000000000000000000000001470204764400234705ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/windows/dmi/manufacturer_spec.rb000066400000000000000000000012201470204764400275160ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Dmi::Manufacturer do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Dmi::Manufacturer.new } let(:value) { 'VMware, Inc.' } before do allow(Facter::Resolvers::DMIBios).to receive(:resolve).with(:manufacturer).and_return(value) end it 'returns manufacturer fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.manufacturer', value: value), an_object_having_attributes(name: 'manufacturer', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/dmi/product/000077500000000000000000000000001470204764400251505ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/windows/dmi/product/name_spec.rb000066400000000000000000000012201470204764400274220ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Dmi::Product::Name do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Dmi::Product::Name.new } let(:value) { 'VMware7,1' } before do allow(Facter::Resolvers::DMIComputerSystem).to receive(:resolve).with(:name).and_return(value) end it 'returns product name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.product.name', value: value), an_object_having_attributes(name: 'productname', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/dmi/product/serial_number_spec.rb000066400000000000000000000017171470204764400313440ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Dmi::Product::SerialNumber do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Dmi::Product::SerialNumber.new } let(:value) { 'VMware-42 1a 0d 03 0a b7 98 28-78 98 5e 85 a0 ad 18 47' } let(:expected_resolved_fact) { instance_double(Facter::ResolvedFact, name: 'dmi.product.serial_number', value: value) } let(:resolved_legacy_fact) { instance_double(Facter::ResolvedFact, name: 'serialnumber', value: value, type: :legacy) } before do allow(Facter::Resolvers::DMIBios).to receive(:resolve).with(:serial_number).and_return(value) end it 'returns serial_number fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.product.serial_number', value: value), an_object_having_attributes(name: 'serialnumber', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/dmi/product/uuid_spec.rb000066400000000000000000000012441470204764400274560ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Dmi::Product::Uuid do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Dmi::Product::Uuid.new } let(:value) { '030D1A42-B70A-2898-7898-5E85A0AD1847' } before do allow(Facter::Resolvers::DMIComputerSystem).to receive(:resolve).with(:uuid).and_return(value) end it 'returns product uuid fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'dmi.product.uuid', value: value), an_object_having_attributes(name: 'uuid', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/ec2_metadata_spec.rb000066400000000000000000000035421470204764400265730ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Ec2Metadata do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Ec2Metadata.new } before do allow(Facter::Resolvers::Ec2).to receive(:resolve).with(:metadata).and_return(value) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return(hypervisor) end context 'when hypervisor is not kvm or xen' do let(:hypervisor) { nil } let(:value) { nil } it 'returns ec2 metadata fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ec2_metadata', value: nil) end it "doesn't call Ec2 resolver" do fact.call_the_resolver expect(Facter::Resolvers::Ec2).not_to have_received(:resolve).with(:metadata) end end context 'when hypervisor is xen' do let(:hypervisor) { 'xen' } context 'when resolver returns a value' do let(:value) { 'some custom value' } it 'returns ec2 metadata fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ec2_metadata', value: value) end end context 'when resolver returns empty string' do let(:value) { '' } it 'returns ec2 userdata fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ec2_metadata', value: nil) end end context 'when resolver returns nil' do let(:value) { nil } it 'returns ec2 metadata fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ec2_metadata', value: nil) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/ec2_userdata_spec.rb000066400000000000000000000035421470204764400266230ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Ec2Userdata do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Ec2Userdata.new } before do allow(Facter::Resolvers::Ec2).to receive(:resolve).with(:userdata).and_return(value) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return(hypervisor) end context 'when hypervisor is not kvm or xen' do let(:hypervisor) { nil } let(:value) { nil } it 'returns ec2 userdata fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ec2_userdata', value: nil) end it "doesn't call Ec2 resolver" do fact.call_the_resolver expect(Facter::Resolvers::Ec2).not_to have_received(:resolve).with(:userdata) end end context 'when hypervisor is xen' do let(:hypervisor) { 'xen' } context 'when resolver returns a value' do let(:value) { 'some custom value' } it 'returns ec2 userdata fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ec2_userdata', value: value) end end context 'when resolver returns empty string' do let(:value) { '' } it 'returns ec2 userdata fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ec2_userdata', value: nil) end end context 'when resolver returns nil' do let(:value) { nil } it 'returns ec2 userdata fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ec2_userdata', value: nil) end end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/facterversion_spec.rb000066400000000000000000000010201470204764400271210ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Facterversion do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Facterversion.new } let(:value) { '4.0.3' } before do allow(Facter::Resolvers::Facterversion).to receive(:resolve).with(:facterversion).and_return(value) end it 'returns facterversion fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'facterversion', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/fips_enabled_spec.rb000066400000000000000000000010101470204764400266610ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::FipsEnabled do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::FipsEnabled.new } let(:value) { true } before do allow(Facter::Resolvers::Windows::Fips).to receive(:resolve).with(:fips_enabled).and_return(value) end it 'returns true if fips enabled' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'fips_enabled', value: true) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/hypervisors/000077500000000000000000000000001470204764400253145ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/windows/hypervisors/hyperv_spec.rb000066400000000000000000000037761470204764400302050ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Hypervisors::Hyperv do describe '#call_the_resolver' do context 'when is not HyperV hypervisor' do it 'returns nil' do expected_fact = instance_double(Facter::ResolvedFact, name: 'hypervisors.hyperv', value: nil) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('value') allow(Facter::Resolvers::DMIBios).to receive(:resolve).with(:manufacturer).and_return('value') allow(Facter::ResolvedFact).to receive(:new).with('hypervisors.hyperv', nil).and_return(expected_fact) fact = Facts::Windows::Hypervisors::Hyperv.new expect(fact.call_the_resolver).to eq(expected_fact) end end context 'when is HyperV hypervisor and CpuidSource resolver returns the required output' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'hypervisors.hyperv', value: {}) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('hyperv') allow(Facter::ResolvedFact).to receive(:new).with('hypervisors.hyperv', {}).and_return(expected_fact) fact = Facts::Windows::Hypervisors::Hyperv.new expect(fact.call_the_resolver).to eq(expected_fact) end end context 'when is HyperV hypervisor and DmiBios resolver returns the required output' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'hypervisors.hyperv', value: {}) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('value') allow(Facter::Resolvers::DMIBios).to receive(:resolve).with(:manufacturer).and_return('Microsoft Enterprise') allow(Facter::ResolvedFact).to receive(:new).with('hypervisors.hyperv', {}).and_return(expected_fact) fact = Facts::Windows::Hypervisors::Hyperv.new expect(fact.call_the_resolver).to eq(expected_fact) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/hypervisors/kvm_spec.rb000066400000000000000000000061171470204764400274550ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Hypervisors::Kvm do describe '#call_the_resolver' do context 'when is not kvm hypervisor' do it 'returns nil' do expected_fact = instance_double(Facter::ResolvedFact, name: 'hypervisors.kvm', value: nil) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('value') allow(Facter::Resolvers::NetKVM).to receive(:resolve).with(:kvm).and_return(false) allow(Facter::Resolvers::DMIComputerSystem).to receive(:resolve).with(:name).and_return('value') allow(Facter::ResolvedFact).to receive(:new).with('hypervisors.kvm', nil).and_return(expected_fact) fact = Facts::Windows::Hypervisors::Kvm.new expect(fact.call_the_resolver).to eq(expected_fact) end end context 'when is kvm hypervisor but product name is parallels' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'hypervisors.kvm', value: nil) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('kvm') allow(Facter::Resolvers::DMIComputerSystem).to receive(:resolve).with(:name).and_return('Parallels') allow(Facter::ResolvedFact).to receive(:new).with('hypervisors.kvm', nil).and_return(expected_fact) fact = Facts::Windows::Hypervisors::Kvm.new expect(fact.call_the_resolver).to eq(expected_fact) end end context 'when is kvm hypervisor and openstack' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'hypervisors.kvm', value: { openstack: true }) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('kvm') allow(Facter::Resolvers::DMIComputerSystem).to receive(:resolve).with(:name).and_return('OpenStack') allow(Facter::Resolvers::DMIBios).to receive(:resolve).with(:manufacturer).and_return('value') allow(Facter::ResolvedFact).to receive(:new) .with('hypervisors.kvm', { openstack: true }) .and_return(expected_fact) fact = Facts::Windows::Hypervisors::Kvm.new expect(fact.call_the_resolver).to eq(expected_fact) end end context 'when is kvm hypervisor and gce' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'hypervisors.kvm', value: { google: true }) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('gce') allow(Facter::Resolvers::NetKVM).to receive(:resolve).with(:kvm).and_return(true) allow(Facter::Resolvers::DMIComputerSystem).to receive(:resolve).with(:name).and_return('value') allow(Facter::Resolvers::DMIBios).to receive(:resolve).with(:manufacturer).and_return('Google') allow(Facter::ResolvedFact).to receive(:new).with('hypervisors.kvm', { google: true }).and_return(expected_fact) fact = Facts::Windows::Hypervisors::Kvm.new expect(fact.call_the_resolver).to eq(expected_fact) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/hypervisors/virtualbox_spec.rb000066400000000000000000000050611470204764400310540ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Hypervisors::Virtualbox do describe '#call_the_resolver' do context 'when is not Virtualbox hypervisor' do it 'returns nil' do expected_fact = instance_double(Facter::ResolvedFact, name: 'hypervisors.virtualbox', value: nil) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('value') allow(Facter::Resolvers::DMIComputerSystem).to receive(:resolve).with(:name).and_return('value') allow(Facter::ResolvedFact).to receive(:new).with('hypervisors.virtualbox', nil).and_return(expected_fact) fact = Facts::Windows::Hypervisors::Virtualbox.new expect(fact.call_the_resolver).to eq(expected_fact) end end context 'when is VirtualBox hypervisor and CpuidSource resolver returns the required output' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'hypervisors.virtualbox', value: { revision: ' 13.4', version: ' 13.4' }) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('virtualbox') allow(Facter::Resolvers::Windows::Virtualization) .to receive(:resolve).with(:oem_strings) .and_return(['vboxVer_ 13.4', 'vboxRev_ 13.4']) allow(Facter::ResolvedFact).to receive(:new) .with('hypervisors.virtualbox', { revision: ' 13.4', version: ' 13.4' }) .and_return(expected_fact) fact = Facts::Windows::Hypervisors::Virtualbox.new expect(fact.call_the_resolver).to eq(expected_fact) end end context 'when is VirtualBox hypervisor and DMIComputerSystem resolver returns the required output' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'hypervisors.virtualbox', value: { revision: '', version: '' }) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('value') allow(Facter::Resolvers::DMIComputerSystem).to receive(:resolve).with(:name).and_return('VirtualBox') allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:oem_strings).and_return(['', '']) allow(Facter::ResolvedFact).to receive(:new) .with('hypervisors.virtualbox', { revision: '', version: '' }) .and_return(expected_fact) fact = Facts::Windows::Hypervisors::Virtualbox.new expect(fact.call_the_resolver).to eq(expected_fact) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/hypervisors/vmware_spec.rb000066400000000000000000000037711470204764400301640ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Hypervisors::Vmware do describe '#call_the_resolver' do context 'when is not VMware hypervisor' do it 'returns nil' do expected_fact = instance_double(Facter::ResolvedFact, name: 'hypervisors.vmware', value: nil) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('value') allow(Facter::Resolvers::DMIBios).to receive(:resolve).with(:manufacturer).and_return('value') allow(Facter::ResolvedFact).to receive(:new).with('hypervisors.vmware', nil).and_return(expected_fact) fact = Facts::Windows::Hypervisors::Vmware.new expect(fact.call_the_resolver).to eq(expected_fact) end end context 'when is VMware hypervisor and virtualization resolver returns the required output' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'hypervisors.vmware', value: {}) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('vmware') allow(Facter::ResolvedFact).to receive(:new).with('hypervisors.vmware', {}).and_return(expected_fact) fact = Facts::Windows::Hypervisors::Vmware.new expect(fact.call_the_resolver).to eq(expected_fact) end end context 'when is VMware hypervisor and DmiBios resolver returns the required output' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'hypervisors.vmware', value: {}) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('value') allow(Facter::Resolvers::DMIBios).to receive(:resolve).with(:manufacturer).and_return('VMware, Inc.') allow(Facter::ResolvedFact).to receive(:new).with('hypervisors.vmware', {}).and_return(expected_fact) fact = Facts::Windows::Hypervisors::Vmware.new expect(fact.call_the_resolver).to eq(expected_fact) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/hypervisors/xen_spec.rb000066400000000000000000000037361470204764400274560ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Hypervisors::Xen do describe '#call_the_resolver' do context 'when is not xen hypervisor' do it 'returns nil' do expected_fact = instance_double(Facter::ResolvedFact, name: 'hypervisors.xen', value: nil) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('value') allow(Facter::ResolvedFact).to receive(:new).with('hypervisors.xen', nil).and_return(expected_fact) fact = Facts::Windows::Hypervisors::Xen.new expect(fact.call_the_resolver).to eq(expected_fact) end end context 'when is xen hypervisor and context not hvm' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'hypervisors.xen', value: { context: 'pv' }) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('xen') allow(Facter::Resolvers::DMIComputerSystem).to receive(:resolve).with(:name).and_return('PV domU') allow(Facter::ResolvedFact).to receive(:new) .with('hypervisors.xen', { context: 'pv' }).and_return(expected_fact) fact = Facts::Windows::Hypervisors::Xen.new expect(fact.call_the_resolver).to eq(expected_fact) end end context 'when is xen hypervisor and context hvm' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'hypervisors.xen', value: { context: 'hvm' }) allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('xen') allow(Facter::Resolvers::DMIComputerSystem).to receive(:resolve).with(:name).and_return('HVM domU') allow(Facter::ResolvedFact).to receive(:new) .with('hypervisors.xen', { context: 'hvm' }).and_return(expected_fact) fact = Facts::Windows::Hypervisors::Xen.new expect(fact.call_the_resolver).to eq(expected_fact) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/identity/000077500000000000000000000000001470204764400245505ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/windows/identity/privileged_spec.rb000066400000000000000000000011201470204764400302330ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Identity::Privileged do describe '#call_the_resolver' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'identity.privileged', value: 'value') allow(Facter::Resolvers::Identity).to receive(:resolve).with(:privileged).and_return('value') allow(Facter::ResolvedFact).to receive(:new).with('identity.privileged', 'value').and_return(expected_fact) fact = Facts::Windows::Identity::Privileged.new expect(fact.call_the_resolver).to eq(expected_fact) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/identity/user_spec.rb000066400000000000000000000011641470204764400270670ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Identity::User do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Identity::User.new } let(:value) { 'User\Administrator' } before do allow(Facter::Resolvers::Identity).to receive(:resolve).with(:user).and_return(value) end it 'returns user name' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'identity.user', value: value), an_object_having_attributes(name: 'id', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/interfaces_spec.rb000066400000000000000000000016531470204764400264060ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Interfaces do subject(:fact) { Facts::Windows::Interfaces.new } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { ip6: 'fe80::99bf:da20:ad3:9bfe' }, 'en1' => { ip6: 'fe80::99bf:da20:ad3:9bfe' } } } it 'returns interfaces names' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'interfaces', value: interfaces.keys.join(','), type: :legacy) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'interfaces', value: interfaces, type: :legacy) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/ipaddress6_interfaces_spec.rb000066400000000000000000000022111470204764400305210ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Ipaddress6Interfaces do subject(:fact) { Facts::Windows::Ipaddress6Interfaces.new } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { ip6: 'fe80::99bf:da20:ad3:9bfe' }, 'en1' => { ip6: 'fe80::99bf:da20:ad3:9bfe' } } } it 'returns legacy facts with names ipaddress6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ipaddress6_eth0', value: interfaces['eth0'][:ip6], type: :legacy), an_object_having_attributes(name: 'ipaddress6_en1', value: interfaces['en1'][:ip6], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/ipaddress_interfaces_spec.rb000066400000000000000000000021521470204764400304370ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::IpaddressInterfaces do subject(:fact) { Facts::Windows::IpaddressInterfaces.new } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { ip: '10.16.117.100' }, 'en1' => { ip: '10.16.117.255' } } } it 'returns legacy facts with names ipaddress_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ipaddress_eth0', value: interfaces['eth0'][:ip], type: :legacy), an_object_having_attributes(name: 'ipaddress_en1', value: interfaces['en1'][:ip], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/is_virtual_spec.rb000066400000000000000000000010671470204764400264430ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::IsVirtual do describe '#call_the_resolver' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'is_virtual', value: 'value') allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:is_virtual).and_return('value') allow(Facter::ResolvedFact).to receive(:new).with('is_virtual', 'value').and_return(expected_fact) fact = Facts::Windows::IsVirtual.new expect(fact.call_the_resolver).to eq(expected_fact) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/kernel_spec.rb000066400000000000000000000010001470204764400255250ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Kernel do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Kernel.new } let(:kernel_version) { '2016' } before do allow(Facter::Resolvers::Kernel).to receive(:resolve).with(:kernel).and_return(kernel_version) end it 'returns kernel fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernel', value: kernel_version) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/kernelmajversion_spec.rb000066400000000000000000000011121470204764400276270ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Kernelmajversion do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Kernelmajversion.new } let(:kernel_maj_version) { '2016' } before do allow(Facter::Resolvers::Kernel).to \ receive(:resolve).with(:kernelmajorversion).and_return(kernel_maj_version) end it 'returns kernelmajversion fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernelmajversion', value: kernel_maj_version) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/kernelrelease_spec.rb000066400000000000000000000010551470204764400271000ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Kernelrelease do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Kernelrelease.new } let(:kernel_release) { '2016' } before do allow(Facter::Resolvers::Kernel).to \ receive(:resolve).with(:kernelversion).and_return(kernel_release) end it 'returns kernelrelease fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernelrelease', value: kernel_release) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/kernelversion_spec.rb000066400000000000000000000010551470204764400271450ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Kernelversion do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Kernelversion.new } let(:kernel_version) { '2016' } before do allow(Facter::Resolvers::Kernel).to \ receive(:resolve).with(:kernelversion).and_return(kernel_version) end it 'returns kernelversion fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'kernelversion', value: kernel_version) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/macaddress_interfaces_spec.rb000066400000000000000000000021631470204764400305710ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::MacaddressInterfaces do subject(:fact) { Facts::Windows::MacaddressInterfaces.new } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { mac: '10.16.117.100' }, 'en1' => { mac: '10.16.117.255' } } } it 'returns legacy facts with names macaddress_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'macaddress_eth0', value: interfaces['eth0'][:mac], type: :legacy), an_object_having_attributes(name: 'macaddress_en1', value: interfaces['en1'][:mac], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/memory/000077500000000000000000000000001470204764400242275ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/windows/memory/system/000077500000000000000000000000001470204764400255535ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/windows/memory/system/available_bytes_spec.rb000066400000000000000000000022151470204764400322400ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Memory::System::AvailableBytes do subject(:fact) { Facts::Windows::Memory::System::AvailableBytes.new } before do allow(Facter::Resolvers::Memory).to receive(:resolve).with(:available_bytes).and_return(value) end describe '#call_the_resolver' do let(:value) { 3_331_551_232 } let(:value_mb) { 3177.21484375 } it 'returns available memory fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.available_bytes', value: value), an_object_having_attributes(name: 'memoryfree_mb', value: value_mb, type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:value) { nil } it 'returns available memory fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.available_bytes', value: value), an_object_having_attributes(name: 'memoryfree_mb', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/memory/system/available_spec.rb000066400000000000000000000012411470204764400310300ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Memory::System::Available do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Memory::System::Available.new } let(:value) { '1.00 KiB' } before do allow(Facter::Resolvers::Memory).to receive(:resolve).with(:available_bytes).and_return(1024) end it 'returns free memory fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.available', value: value), an_object_having_attributes(name: 'memoryfree', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/memory/system/capacity_spec.rb000066400000000000000000000011321470204764400307040ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Memory::System::Capacity do describe '#call_the_resolver' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'memory.system.capacity', value: 'value') allow(Facter::Resolvers::Memory).to receive(:resolve).with(:capacity).and_return('value') allow(Facter::ResolvedFact).to receive(:new).with('memory.system.capacity', 'value').and_return(expected_fact) fact = Facts::Windows::Memory::System::Capacity.new expect(fact.call_the_resolver).to eq(expected_fact) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/memory/system/total_bytes_spec.rb000066400000000000000000000022031470204764400314400ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Memory::System::TotalBytes do subject(:fact) { Facts::Windows::Memory::System::TotalBytes.new } before do allow(Facter::Resolvers::Memory).to receive(:resolve).with(:total_bytes).and_return(value) end describe '#call_the_resolver' do let(:value) { 3_331_551_232 } let(:value_mb) { 3177.21484375 } it 'returns total memory im bytes fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.total_bytes', value: value), an_object_having_attributes(name: 'memorysize_mb', value: value_mb, type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:value) { nil } it 'returns total memory in bytes fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.total_bytes', value: value), an_object_having_attributes(name: 'memorysize_mb', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/memory/system/total_spec.rb000066400000000000000000000012211470204764400302310ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Memory::System::Total do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Memory::System::Total.new } let(:value) { '1.00 KiB' } before do allow(Facter::Resolvers::Memory).to receive(:resolve).with(:total_bytes).and_return(1024) end it 'returns memory size fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'memory.system.total', value: value), an_object_having_attributes(name: 'memorysize', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/memory/system/used_bytes_spec.rb000066400000000000000000000011311470204764400312540ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Memory::System::UsedBytes do describe '#call_the_resolver' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'memory.system.used_bytes', value: 1024) allow(Facter::Resolvers::Memory).to receive(:resolve).with(:used_bytes).and_return(1024) allow(Facter::ResolvedFact).to receive(:new).with('memory.system.used_bytes', 1024).and_return(expected_fact) fact = Facts::Windows::Memory::System::UsedBytes.new expect(fact.call_the_resolver).to eq(expected_fact) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/memory/system/used_spec.rb000066400000000000000000000011321470204764400300470ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Memory::System::Used do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Memory::System::Used.new } let(:resolver_result) { 1024 } let(:fact_value) { '1.00 KiB' } before do allow(Facter::Resolvers::Memory).to receive(:resolve).with(:used_bytes).and_return(resolver_result) end it 'returns a memory.system.used fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'memory.system.used', value: fact_value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/mtu_interfaces_spec.rb000066400000000000000000000017231470204764400272710ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::MtuInterfaces do subject(:fact) { Facts::Windows::MtuInterfaces.new } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { mtu: 1500 }, 'en1' => { mtu: 1500 } } } it 'returns legacy facts with names mtu_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'mtu_eth0', value: interfaces['eth0'][:mtu], type: :legacy), an_object_having_attributes(name: 'mtu_en1', value: interfaces['en1'][:mtu], type: :legacy)) end end describe '#call_the_resolver when resolver reeturns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/netmask6_interfaces_spec.rb000066400000000000000000000022471470204764400302160ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Netmask6Interfaces do subject(:fact) { Facts::Windows::Netmask6Interfaces.new } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) do { 'eth0' => { netmask6: 'fe80::99bf:da20:ad3:9bfe' }, 'en1' => { netmask6: 'fe80::99bf:da20:ad3:9bfe' } } end it 'returns legacy facts with names netmask6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'netmask6_eth0', value: interfaces['eth0'][:netmask6], type: :legacy), an_object_having_attributes(name: 'netmask6_en1', value: interfaces['en1'][:netmask6], type: :legacy)) end end describe '#call_the_resolver when resolver return nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/netmask_interfaces_spec.rb000066400000000000000000000021651470204764400301270ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::NetmaskInterfaces do subject(:fact) { Facts::Windows::NetmaskInterfaces.new } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { netmask: '10.255.255.255' }, 'en1' => { netmask: '10.17.255.255' } } } it 'returns legacy facts with names netmask_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'netmask_eth0', value: interfaces['eth0'][:netmask], type: :legacy), an_object_having_attributes(name: 'netmask_en1', value: interfaces['en1'][:netmask], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/network6_interfaces_spec.rb000066400000000000000000000021541470204764400302420ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Network6Interfaces do subject(:fact) { Facts::Windows::Network6Interfaces.new } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { network6: '::1' }, 'en1' => { network6: 'fe80::' } } } it 'returns legacy facts with names network6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'network6_eth0', value: interfaces['eth0'][:network6], type: :legacy), an_object_having_attributes(name: 'network6_en1', value: interfaces['en1'][:network6], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/network_interfaces_spec.rb000066400000000000000000000021651470204764400301560ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::NetworkInterfaces do subject(:fact) { Facts::Windows::NetworkInterfaces.new } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { network: '10.255.255.255' }, 'en1' => { network: '10.17.255.255' } } } it 'returns legacy facts with names network_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'network_eth0', value: interfaces['eth0'][:network], type: :legacy), an_object_having_attributes(name: 'network_en1', value: interfaces['en1'][:network], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/networking/000077500000000000000000000000001470204764400251065ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/windows/networking/dhcp_spec.rb000066400000000000000000000010411470204764400273570ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Networking::Dhcp do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Networking::Dhcp.new } let(:value) { '10.16.122.163' } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:dhcp).and_return(value) end it 'returns ipaddress fact' do expect(fact.call_the_resolver) .to be_an_instance_of(Facter::ResolvedFact) .and have_attributes(name: 'networking.dhcp', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/networking/domain_spec.rb000066400000000000000000000012131470204764400277110ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Networking::Domain do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Networking::Domain.new } let(:value) { 'domain.net' } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:domain).and_return(value) end it 'returns domain fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.domain', value: value), an_object_having_attributes(name: 'domain', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/networking/fqdn_spec.rb000066400000000000000000000047631470204764400274070ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Networking::Fqdn do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Networking::Fqdn.new } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:domain).and_return(domain_name) allow(Facter::Resolvers::Hostname).to receive(:resolve).with(:hostname).and_return(hostname) end context 'when domain and hostname could be resolved' do let(:domain_name) { 'domain' } let(:hostname) { 'hostname' } let(:value) { "#{hostname}.#{domain_name}" } it 'returns fqdn fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.fqdn', value: value), an_object_having_attributes(name: 'fqdn', value: value, type: :legacy)) end end context 'when it fails to retrieve hostname' do let(:domain_name) { 'domain' } let(:hostname) { nil } let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'networking.fqdn', value: nil) end end context 'when it fails to retrieve domain' do let(:domain_name) { nil } let(:hostname) { 'hostname' } let(:value) { hostname } it 'returns hostname as fqdn' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.fqdn', value: value), an_object_having_attributes(name: 'fqdn', value: value, type: :legacy)) end end context 'when domain is empty string' do let(:domain_name) { '' } let(:hostname) { 'hostname' } let(:value) { hostname } it 'returns hostname as fqdn without a trailing dot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.fqdn', value: value), an_object_having_attributes(name: 'fqdn', value: value, type: :legacy)) end end context 'when hostname is empty' do let(:domain_name) { 'domain' } let(:hostname) { '' } let(:value) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'networking.fqdn', value: nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/networking/hostname_spec.rb000066400000000000000000000012121470204764400302570ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Networking::Hostname do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Networking::Hostname.new } let(:value) { 'hostname' } before do allow(Facter::Resolvers::Hostname).to receive(:resolve).with(:hostname).and_return(value) end it 'returns hostname fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.hostname', value: value), an_object_having_attributes(name: 'hostname', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/networking/interfaces_spec.rb000066400000000000000000000011431470204764400305670ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Networking::Interfaces do describe '#call_the_resolver' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'networking.interfaces', value: 'value') allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:interfaces).and_return('value') allow(Facter::ResolvedFact).to receive(:new).with('networking.interfaces', 'value').and_return(expected_fact) fact = Facts::Windows::Networking::Interfaces.new expect(fact.call_the_resolver).to eq(expected_fact) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/networking/ip6_spec.rb000066400000000000000000000012301470204764400271370ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Networking::Ip6 do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Networking::Ip6.new } let(:value) { 'fe80::5989:97ff:75ae:dae7' } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:ip6).and_return(value) end it 'returns ipv6 address fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip6', value: value), an_object_having_attributes(name: 'ipaddress6', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/networking/ip_spec.rb000066400000000000000000000012061470204764400270540ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Networking::Ip do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Networking::Ip.new } let(:value) { '0.16.121.255' } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:ip).and_return(value) end it 'returns ipv4 address fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.ip', value: value), an_object_having_attributes(name: 'ipaddress', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/networking/mac_spec.rb000066400000000000000000000012171470204764400272060ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Networking::Mac do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Networking::Mac.new } let(:value) { '00:50:56:9A:7E:98' } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:mac).and_return(value) end it 'returns mac address fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.mac', value: value), an_object_having_attributes(name: 'macaddress', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/networking/mtu_spec.rb000066400000000000000000000011001470204764400272420ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Networking::Mtu do describe '#call_the_resolver' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'networking.mtu', value: 'value') allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:mtu).and_return('value') allow(Facter::ResolvedFact).to receive(:new).with('networking.mtu', 'value').and_return(expected_fact) fact = Facts::Windows::Networking::Mtu.new expect(fact.call_the_resolver).to eq(expected_fact) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/networking/netmask6_spec.rb000066400000000000000000000012651470204764400302010ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Networking::Netmask6 do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Networking::Netmask6.new } let(:value) { 'ffff:ffff:ffff:ffff::' } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:netmask6).and_return(value) end it 'returns netmask for ipv6 ip address fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask6', value: value), an_object_having_attributes(name: 'netmask6', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/networking/netmask_spec.rb000066400000000000000000000012501470204764400301050ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Networking::Netmask do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Networking::Netmask.new } let(:value) { '255.255.240.0' } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:netmask).and_return(value) end it 'returns netmask for ipv4 ip address fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.netmask', value: value), an_object_having_attributes(name: 'netmask', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/networking/network6_spec.rb000066400000000000000000000012271470204764400302260ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Networking::Network6 do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Networking::Network6.new } let(:value) { 'fe80::' } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:network6).and_return(value) end it 'returns network ipv6 fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network6', value: value), an_object_having_attributes(name: 'network6', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/networking/network_spec.rb000066400000000000000000000012271470204764400301400ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Networking::Network do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Networking::Network.new } let(:value) { '10.16.112.0' } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:network).and_return(value) end it 'returns network ipv4 fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'networking.network', value: value), an_object_having_attributes(name: 'network', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/networking/primary_spec.rb000066400000000000000000000010611470204764400301260ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Networking::Primary do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Networking::Primary.new } let(:value) { 'Ethernet0' } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:primary_interface).and_return(value) end it 'returns true if fips enabled' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'networking.primary', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/networking/scope6_spec.rb000066400000000000000000000012161470204764400276440ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Networking::Scope6 do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Networking::Scope6.new } let(:value) { 'link' } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:scope6).and_return(value) end it 'returns scope for ipv6 address' do expect(fact.call_the_resolver) .to be_an_instance_of(Array) .and contain_exactly(an_object_having_attributes(name: 'networking.scope6', value: value), an_object_having_attributes(name: 'scope6', value: value)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/os/000077500000000000000000000000001470204764400233405ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/windows/os/architecture_spec.rb000066400000000000000000000012211470204764400273550ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Os::Architecture do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Os::Architecture.new } let(:value) { 'x64' } before do allow(Facter::Resolvers::HardwareArchitecture).to receive(:resolve).with(:architecture).and_return(value) end it 'returns architecture fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.architecture', value: value), an_object_having_attributes(name: 'architecture', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/os/family_spec.rb000066400000000000000000000011501470204764400261550ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Os::Family do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Os::Family.new } let(:value) { 'windows' } before do allow(Facter::Resolvers::Kernel).to receive(:resolve).with(:kernel).and_return(value) end it 'returns os family fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.family', value: value), an_object_having_attributes(name: 'osfamily', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/os/hardware_spec.rb000066400000000000000000000012071470204764400264740ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Os::Hardware do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Os::Hardware.new } let(:value) { 'x86_64' } before do allow(Facter::Resolvers::HardwareArchitecture).to receive(:resolve).with(:hardware).and_return(value) end it 'returns hardware model fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.hardware', value: value), an_object_having_attributes(name: 'hardwaremodel', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/os/name_spec.rb000066400000000000000000000011651470204764400256220ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Os::Name do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Os::Name.new } let(:value) { 'windows' } before do allow(Facter::Resolvers::Kernel).to receive(:resolve).with(:kernel).and_return(value) end it 'returns operating system name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.name', value: value), an_object_having_attributes(name: 'operatingsystem', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/os/release_spec.rb000066400000000000000000000031221470204764400263150ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Os::Release do subject(:fact) { Facts::Windows::Os::Release.new } before do allow(Facter::Resolvers::WinOsDescription).to receive(:resolve).with(:consumerrel).and_return(value) allow(Facter::Resolvers::WinOsDescription).to receive(:resolve).with(:description).and_return(value) allow(Facter::Resolvers::Kernel).to receive(:resolve).with(:kernelmajorversion).and_return(value) allow(Facter::Resolvers::Kernel).to receive(:resolve).with(:kernelversion).and_return(value) end describe '#call_the_resolver' do let(:value) { '2019' } it 'returns release fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: { 'full' => value, 'major' => value }), an_object_having_attributes(name: 'operatingsystemmajrelease', value: value, type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: value, type: :legacy)) end end describe '#call_the_resolver when resolvers return nil' do let(:value) { nil } it 'returns release fact as nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.release', value: value), an_object_having_attributes(name: 'operatingsystemmajrelease', value: value, type: :legacy), an_object_having_attributes(name: 'operatingsystemrelease', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/os/windows/000077500000000000000000000000001470204764400250325ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/windows/os/windows/display_version_spec.rb000066400000000000000000000012741470204764400316070ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Os::Windows::DisplayVersion do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Os::Windows::DisplayVersion.new } let(:value) { '1607' } before do allow(Facter::Resolvers::ProductRelease).to receive(:resolve).with(:display_version).and_return(value) end it 'returns os release id fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.windows.display_version', value: value), an_object_having_attributes(name: 'windows_display_version', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/os/windows/edition_id_spec.rb000066400000000000000000000012551470204764400305030ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Os::Windows::EditionId do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Os::Windows::EditionId.new } let(:value) { 'ServerStandard' } before do allow(Facter::Resolvers::ProductRelease).to receive(:resolve).with(:edition_id).and_return(value) end it 'returns os edition id fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.windows.edition_id', value: value), an_object_having_attributes(name: 'windows_edition_id', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/os/windows/installation_type_spec.rb000066400000000000000000000013171470204764400321350ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Os::Windows::InstallationType do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Os::Windows::InstallationType.new } let(:value) { 'Server' } before do allow(Facter::Resolvers::ProductRelease).to receive(:resolve).with(:installation_type).and_return(value) end it 'returns os installation type fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.windows.installation_type', value: value), an_object_having_attributes(name: 'windows_installation_type', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/os/windows/product_name_spec.rb000066400000000000000000000013071470204764400310520ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Os::Windows::ProductName do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Os::Windows::ProductName.new } let(:value) { 'Windows Server 2016 Standard' } before do allow(Facter::Resolvers::ProductRelease).to receive(:resolve).with(:product_name).and_return(value) end it 'returns os product name fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.windows.product_name', value: value), an_object_having_attributes(name: 'windows_product_name', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/os/windows/release_id_spec.rb000066400000000000000000000012431470204764400304650ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Os::Windows::ReleaseId do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Os::Windows::ReleaseId.new } let(:value) { '1607' } before do allow(Facter::Resolvers::ProductRelease).to receive(:resolve).with(:release_id).and_return(value) end it 'returns os release id fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.windows.release_id', value: value), an_object_having_attributes(name: 'windows_release_id', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/os/windows/system32_spec.rb000066400000000000000000000012271470204764400300640ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Os::Windows::System32 do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Os::Windows::System32.new } let(:value) { 'C:\Windows\system32' } before do allow(Facter::Resolvers::System32).to receive(:resolve).with(:system32).and_return(value) end it 'returns system32 path' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'os.windows.system32', value: value), an_object_having_attributes(name: 'system32', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/path_spec.rb000066400000000000000000000010641470204764400252130ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Path do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Path.new } let(:value) { '/usr/bin:/etc:/usr/sbin:/usr/ucb:/usr/bin/X11:/sbin:/usr/java6/jre/bin:/usr/java6/bin' } before do allow(Facter::Resolvers::Path).to \ receive(:resolve).with(:path).and_return(value) end it 'returns path fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'path', value: value) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/processor_spec.rb000066400000000000000000000013641470204764400263010ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Processor do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Processor.new } let(:processor) { ['Intel(R) Xeon(R) Gold 6138 CPU @ 2.00GHz', 'Intel(R) Xeon(R) Gold 6138 CPU @ 2.00GHz'] } before do allow(Facter::Resolvers::Processors).to receive(:resolve).with(:models).and_return(processor) end it 'returns legacy facts about each processor' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processor0', value: processor[0], type: :legacy), an_object_having_attributes(name: 'processor1', value: processor[1], type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/processors/000077500000000000000000000000001470204764400251215ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/windows/processors/cores_spec.rb000066400000000000000000000010721470204764400275730ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Processors::Cores do describe '#call_the_resolver' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'processors.cores', value: 2) allow(Facter::Resolvers::Processors).to receive(:resolve).with(:cores_per_socket).and_return(2) allow(Facter::ResolvedFact).to receive(:new).with('processors.cores', 2).and_return(expected_fact) fact = Facts::Windows::Processors::Cores.new expect(fact.call_the_resolver).to eq(expected_fact) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/processors/count_spec.rb000066400000000000000000000012061470204764400276070ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Processors::Count do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Processors::Count.new } let(:value) { '2' } before do allow(Facter::Resolvers::Processors).to receive(:resolve).with(:count).and_return(value) end it 'returns number of processors' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.count', value: value), an_object_having_attributes(name: 'processorcount', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/processors/isa_spec.rb000066400000000000000000000011641470204764400272360ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Processors::Isa do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Processors::Isa.new } let(:value) { 'x86_64' } before do allow(Facter::Resolvers::Processors).to receive(:resolve).with(:isa).and_return(value) end it 'returns isa fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.isa', value: value), an_object_having_attributes(name: 'hardwareisa', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/processors/models_spec.rb000066400000000000000000000011061470204764400277410ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Processors::Models do describe '#call_the_resolver' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'processors.models', value: 'value') allow(Facter::Resolvers::Processors).to receive(:resolve).with(:models).and_return('value') allow(Facter::ResolvedFact).to receive(:new).with('processors.models', 'value').and_return(expected_fact) fact = Facts::Windows::Processors::Models.new expect(fact.call_the_resolver).to eq(expected_fact) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/processors/physicalcount_spec.rb000066400000000000000000000012671470204764400313530ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Processors::Physicalcount do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Processors::Physicalcount.new } let(:value) { '2' } before do allow(Facter::Resolvers::Processors).to receive(:resolve).with(:physicalcount).and_return(value) end it 'returns number of physical processors' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'processors.physicalcount', value: value), an_object_having_attributes(name: 'physicalprocessorcount', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/processors/threads_spec.rb000066400000000000000000000011021470204764400301040ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Processors::Threads do describe '#call_the_resolver' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'processors.threads', value: 2) allow(Facter::Resolvers::Processors).to receive(:resolve).with(:threads_per_core).and_return(2) allow(Facter::ResolvedFact).to receive(:new).with('processors.threads', 2).and_return(expected_fact) fact = Facts::Windows::Processors::Threads.new expect(fact.call_the_resolver).to eq(expected_fact) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/ruby/000077500000000000000000000000001470204764400237005ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/windows/ruby/platform_spec.rb000066400000000000000000000012001470204764400270540ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Ruby::Platform do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Ruby::Platform.new } let(:value) { 'x64-mingw32' } before do allow(Facter::Resolvers::Ruby).to receive(:resolve).with(:platform).and_return(value) end it 'returns ruby platform fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ruby.platform', value: value), an_object_having_attributes(name: 'rubyplatform', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/ruby/sitedir_spec.rb000066400000000000000000000012621470204764400267030ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Ruby::Sitedir do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Ruby::Sitedir.new } let(:value) { 'C:/Program Files/Puppet Labs/Puppet/puppet/lib/ruby/site_ruby/2.5.0' } before do allow(Facter::Resolvers::Ruby).to receive(:resolve).with(:sitedir).and_return(value) end it 'returns ruby sitedir fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ruby.sitedir', value: value), an_object_having_attributes(name: 'rubysitedir', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/ruby/version_spec.rb000066400000000000000000000011641470204764400267260ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Ruby::Version do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Ruby::Version.new } let(:value) { '2.5.9' } before do allow(Facter::Resolvers::Ruby).to receive(:resolve).with(:version).and_return(value) end it 'returns ruby version fact' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'ruby.version', value: value), an_object_having_attributes(name: 'rubyversion', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/scope6_interfaces_spec.rb000066400000000000000000000021251470204764400276600ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Scope6Interfaces do subject(:fact) { Facts::Windows::Scope6Interfaces.new } before do allow(Facter::Resolvers::Windows::Networking).to receive(:resolve).with(:interfaces).and_return(interfaces) end describe '#call_the_resolver' do let(:interfaces) { { 'eth0' => { scope6: 'link' }, 'en1' => { scope6: 'global' } } } it 'returns legacy facts with scope6_' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'scope6_eth0', value: interfaces['eth0'][:scope6], type: :legacy), an_object_having_attributes(name: 'scope6_en1', value: interfaces['en1'][:scope6], type: :legacy)) end end describe '#call_the_resolver when resolver returns nil' do let(:interfaces) { nil } it 'returns nil' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/ssh_spec.rb000066400000000000000000000042021470204764400250510ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Ssh do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Ssh.new } context 'when user is privileged' do let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'ecdsa', 'test', 'ecdsa')] end let(:value) do { 'ecdsa' => { 'fingerprints' => { 'sha1' => 'test', 'sha256' => 'test' }, 'key' => 'test', 'type' => 'ecdsa' } } end before do allow(Facter::Resolvers::Identity).to receive(:resolve).with(:privileged).and_return(true) allow(Facter::Resolvers::Windows::Ssh).to receive(:resolve).with(:ssh).and_return(ssh) end it 'returns ssh fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ssh', value: value) end end context 'when user is privileged but no ssh key found' do let(:value) { nil } before do allow(Facter::Resolvers::Identity).to receive(:resolve).with(:privileged).and_return(true) allow(Facter::Resolvers::Windows::Ssh).to receive(:resolve).with(:ssh).and_return({}) end it 'returns ssh fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ssh', value: value) end end context 'when user is not privileged' do let(:value) { nil } before do allow(Facter::Resolvers::Identity).to receive(:resolve).with(:privileged).and_return(false) allow(Facter::Resolvers::Windows::Ssh).to receive(:resolve).with(:ssh).and_return(value) end it "doesn't call Facter::Resolvers::Windows::Ssh" do fact.call_the_resolver expect(Facter::Resolvers::Windows::Ssh).not_to have_received(:resolve).with(:ssh) end it 'returns ssh fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'ssh', value: value) end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/sshalgorithmkey_spec.rb000066400000000000000000000044311470204764400274750ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Sshalgorithmkey do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Sshalgorithmkey.new } context 'when user is privileged' do let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'ecdsa', 'test', 'ecdsa'), Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('test', 'test'), 'rsa', 'test', 'rsa')] end let(:legacy_fact1) { { name: 'ecdsa', value: 'test' } } let(:legacy_fact2) { { name: 'rsa', value: 'test' } } before do allow(Facter::Resolvers::Identity).to receive(:resolve).with(:privileged).and_return(true) allow(Facter::Resolvers::Windows::Ssh).to receive(:resolve).with(:ssh).and_return(ssh) end it 'returns a list of resolved facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly( an_object_having_attributes(name: "ssh#{legacy_fact1[:name]}key", value: legacy_fact1[:value]), an_object_having_attributes(name: "ssh#{legacy_fact2[:name]}key", value: legacy_fact2[:value]) ) end end context 'when user is privileged but no ssh key found' do let(:value) { nil } before do allow(Facter::Resolvers::Identity).to receive(:resolve).with(:privileged).and_return(true) allow(Facter::Resolvers::Windows::Ssh).to receive(:resolve).with(:ssh).and_return(nil) end it 'returns no facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end context 'when user is not privileged' do let(:value) { nil } before do allow(Facter::Resolvers::Identity).to receive(:resolve).with(:privileged).and_return(false) allow(Facter::Resolvers::Windows::Ssh).to receive(:resolve).with(:ssh).and_return(value) end it "doesn't call Facter::Resolvers::Windows::Ssh" do fact.call_the_resolver expect(Facter::Resolvers::Windows::Ssh).not_to have_received(:resolve).with(:ssh) end it 'returns no facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/sshfp_algorithm_spec.rb000066400000000000000000000044631470204764400274560ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::SshfpAlgorithm do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::SshfpAlgorithm.new } context 'when user is privileged' do let(:ssh) do [Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('sha11', 'sha2561'), 'ecdsa', 'test', 'ecdsa'), Facter::Util::Resolvers::Ssh.new(Facter::Util::Resolvers::FingerPrint .new('sha12', 'sha2562'), 'rsa', 'test', 'rsa')] end let(:legacy_fact1) { { name: 'ecdsa', value: "sha11\nsha2561" } } let(:legacy_fact2) { { name: 'rsa', value: "sha12\nsha2562" } } before do allow(Facter::Resolvers::Identity).to receive(:resolve).with(:privileged).and_return(true) allow(Facter::Resolvers::Windows::Ssh).to receive(:resolve).with(:ssh).and_return(ssh) end it 'returns a list of resolved facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly( an_object_having_attributes(name: "sshfp_#{legacy_fact1[:name]}", value: legacy_fact1[:value]), an_object_having_attributes(name: "sshfp_#{legacy_fact2[:name]}", value: legacy_fact2[:value]) ) end end context 'when user is privileged but no ssh key found' do let(:value) { nil } before do allow(Facter::Resolvers::Identity).to receive(:resolve).with(:privileged).and_return(true) allow(Facter::Resolvers::Windows::Ssh).to receive(:resolve).with(:ssh).and_return(nil) end it 'returns no facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end context 'when user is not privileged' do let(:value) { nil } before do allow(Facter::Resolvers::Identity).to receive(:resolve).with(:privileged).and_return(false) allow(Facter::Resolvers::Windows::Ssh).to receive(:resolve).with(:ssh).and_return(value) end it "doesn't call Facter::Resolvers::Windows::Ssh" do fact.call_the_resolver expect(Facter::Resolvers::Windows::Ssh).not_to have_received(:resolve).with(:ssh) end it 'returns no facts' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and contain_exactly end end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/system_uptime/000077500000000000000000000000001470204764400256265ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/facts/windows/system_uptime/days_spec.rb000066400000000000000000000012131470204764400301220ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::SystemUptime::Days do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::SystemUptime::Days.new } let(:value) { '2' } before do allow(Facter::Resolvers::Windows::Uptime).to receive(:resolve).with(:days).and_return(value) end it 'returns days since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.days', value: value), an_object_having_attributes(name: 'uptime_days', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/system_uptime/hours_spec.rb000066400000000000000000000012211470204764400303210ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::SystemUptime::Hours do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::SystemUptime::Hours.new } let(:value) { '9' } before do allow(Facter::Resolvers::Windows::Uptime).to receive(:resolve).with(:hours).and_return(value) end it 'returns hours since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.hours', value: value), an_object_having_attributes(name: 'uptime_hours', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/system_uptime/seconds_spec.rb000066400000000000000000000012411470204764400306210ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::SystemUptime::Seconds do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::SystemUptime::Seconds.new } let(:value) { '34974' } before do allow(Facter::Resolvers::Windows::Uptime).to receive(:resolve).with(:seconds).and_return(value) end it 'returns seconds since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.seconds', value: value), an_object_having_attributes(name: 'uptime_seconds', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/system_uptime/uptime_spec.rb000066400000000000000000000012271470204764400304720ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::SystemUptime::Uptime do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::SystemUptime::Uptime.new } let(:value) { '9:42 hours' } before do allow(Facter::Resolvers::Windows::Uptime).to receive(:resolve).with(:uptime).and_return(value) end it 'returns time since last boot' do expect(fact.call_the_resolver).to be_an_instance_of(Array).and \ contain_exactly(an_object_having_attributes(name: 'system_uptime.uptime', value: value), an_object_having_attributes(name: 'uptime', value: value, type: :legacy)) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/timezone_spec.rb000066400000000000000000000010161470204764400261060ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Timezone do describe '#call_the_resolver' do subject(:fact) { Facts::Windows::Timezone.new } let(:timezone) { 'UTC' } before do allow(Facter::Resolvers::Windows::Timezone).to \ receive(:resolve).with(:timezone).and_return(timezone) end it 'returns a resolved fact' do expect(fact.call_the_resolver).to be_an_instance_of(Facter::ResolvedFact).and \ have_attributes(name: 'timezone', value: timezone) end end end puppetlabs-facter-dfe6df4/spec/facter/facts/windows/virtual_spec.rb000066400000000000000000000010521470204764400257420ustar00rootroot00000000000000# frozen_string_literal: true describe Facts::Windows::Virtual do describe '#call_the_resolver' do it 'returns a fact' do expected_fact = instance_double(Facter::ResolvedFact, name: 'virtual', value: 'value') allow(Facter::Resolvers::Windows::Virtualization).to receive(:resolve).with(:virtual).and_return('value') allow(Facter::ResolvedFact).to receive(:new).with('virtual', 'value').and_return(expected_fact) fact = Facts::Windows::Virtual.new expect(fact.call_the_resolver).to eq(expected_fact) end end end puppetlabs-facter-dfe6df4/spec/facter/framework/000077500000000000000000000000001470204764400221225ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/framework/benchmarking/000077500000000000000000000000001470204764400245525ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/framework/benchmarking/timer_spec.rb000066400000000000000000000024221470204764400272310ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Framework::Benchmarking::Timer do let(:tms_mock) { instance_spy(Benchmark::Tms) } describe '#measure' do context 'when timing option is true' do before do allow(Facter::Options).to receive(:[]).with(:timing).and_return(true) allow(tms_mock).to receive(:format).with('%r').and_return('(0.123)') allow(Benchmark).to receive(:measure).and_return(tms_mock) end it 'prints fact name and time it took to resolve it' do expect do Facter::Framework::Benchmarking::Timer.measure('my_fact') {} end.to output("fact 'my_fact', took: (0.123) seconds\n").to_stdout end it 'adds prefix to printed message' do expect do Facter::Framework::Benchmarking::Timer.measure('my_fact', 'my_custom_prefix') {} end.to output("my_custom_prefix fact 'my_fact', took: (0.123) seconds\n").to_stdout end end context 'when timing option is false' do before do allow(Facter::Options).to receive(:[]).with(:timing).and_return(false) end it 'does not print any message' do expect do Facter::Framework::Benchmarking::Timer.measure('my_fact') {} end.not_to output.to_stdout end end end end puppetlabs-facter-dfe6df4/spec/facter/model/000077500000000000000000000000001470204764400212255ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/model/fact_collection_spec.rb000066400000000000000000000117631470204764400257240ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::FactCollection do subject(:fact_collection) { Facter::FactCollection.new } describe '#build_fact_collection!' do let(:user_query) { 'os' } let(:resolved_fact) { Facter::ResolvedFact.new(fact_name, fact_value, type, user_query) } let(:logger) { instance_spy(Facter::Log) } before do allow(Facter::Log).to receive(:new).and_return(logger) end context 'when fact has some value' do let(:fact_name) { 'os.version' } let(:fact_value) { '1.2.3' } let(:type) { :core } it 'adds fact to collection' do fact_collection.build_fact_collection!([resolved_fact]) expected_hash = { 'os' => { 'version' => fact_value } } expect(fact_collection).to eq(expected_hash) end end context 'when fact value is nil' do context 'when fact type is legacy' do let(:fact_name) { 'os.version' } let(:fact_value) { nil } let(:type) { :legacy } it 'does not add fact to collection' do fact_collection.build_fact_collection!([resolved_fact]) expected_hash = {} expect(fact_collection).to eq(expected_hash) end end context 'when fact type is core' do let(:fact_name) { 'os.version' } let(:fact_value) { nil } let(:type) { :core } it 'does not add fact to collection' do fact_collection.build_fact_collection!([resolved_fact]) expected_hash = {} expect(fact_collection).to eq(expected_hash) end end context 'when fact type is :legacy' do context 'when fact name contains dots' do let(:fact_name) { 'my.dotted.external.fact.name' } let(:fact_value) { 'legacy_fact_value' } let(:type) { :legacy } it 'returns a fact with dot in it`s name' do fact_collection.build_fact_collection!([resolved_fact]) expected_hash = { 'my.dotted.external.fact.name' => 'legacy_fact_value' } expect(fact_collection).to eq(expected_hash) end end end end context 'when fact cannot be added to collection' do let(:fact_name) { 'mygroup.fact1' } let(:fact_value) { 'g1_f1_value' } let(:type) { :custom } let(:resolved_fact2) { Facter::ResolvedFact.new('mygroup.fact1.subfact1', 'g1_sg1_f1_value', type) } it 'logs error' do allow(Facter::Options).to receive(:[]).with(:force_dot_resolution).and_return(true) fact_collection.build_fact_collection!([resolved_fact, resolved_fact2]) expect(logger).to have_received(:error) end end end describe '#value' do it 'raises KeyError for a non-existent key' do expect { fact_collection.value('non-existent') }.to raise_error(KeyError) end context 'when string value' do before do fact_collection['fact_name'] = 'value' end it 'returns the value by key' do expect(fact_collection.value('fact_name')).to eql('value') end end context 'when array value' do before do fact_collection['fact_name'] = [1, 2, 3] end it 'returns the value by key' do expect(fact_collection.value('fact_name')).to eql([1, 2, 3]) end it 'returns the value by index' do expect(fact_collection.value('fact_name.1')).to be(2) end it 'raises KeyError when nested key is not found in array' do expect { fact_collection.value('fact_name.1.2') }.to raise_error(KeyError) end it 'raises TypeError for a non-existent index' do expect { fact_collection.value('fact_name.4') }.to raise_error(TypeError) end end context 'when hash value' do before do fact_collection['fact_name'] = { 'key1' => 'value' } end it 'returns the value by key' do expect(fact_collection.value('fact_name')).to eql({ 'key1' => 'value' }) end it 'returns the value by nested key' do expect(fact_collection.value('fact_name.key1')).to eql('value') end it 'raises KeyError when nested key is not found in array' do expect { fact_collection.value('fact_name.key1.2') }.to raise_error(KeyError) end end context 'when deeply nested hash and array value' do before do fact_collection['fact_name'] = { 'key1' => [0, { 'key2' => 'value2' }, 2] } end it 'returns the value by key' do expect(fact_collection.value('fact_name')).to eql({ 'key1' => [0, { 'key2' => 'value2' }, 2] }) end it 'returns the value by nested key and index' do expect(fact_collection.value('fact_name.key1.1.key2')).to eql('value2') end it 'raises KeyError when nested key is not found' do expect { fact_collection.value('fact_name.key1.2.not') }.to raise_error(KeyError) end it 'raises TypeError when nested index is not found' do expect { fact_collection.value('fact_name.key1.5') }.to raise_error(TypeError) end end end end puppetlabs-facter-dfe6df4/spec/facter/model/resolved_fact_spec.rb000066400000000000000000000020071470204764400254030ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::ResolvedFact do context 'when is a legacy fact' do subject(:resolved_fact) { Facter::ResolvedFact.new('fact_name', 'fact_value', :legacy) } it 'responds to legacy? method with true' do expect(resolved_fact.legacy?).to be(true) end it 'responds to core? method with false' do expect(resolved_fact.core?).to be(false) end end context 'when is a core fact' do subject(:resolved_fact) { Facter::ResolvedFact.new('fact_name', 'fact_value') } it 'responds to legacy? method with true' do expect(resolved_fact.legacy?).to be(false) end it 'responds to core? method with false' do expect(resolved_fact.core?).to be(true) end it 'can be interpolated' do expect("#{resolved_fact}-test").to eq('fact_value-test') end it 'interpolation of nil value will be empty string' do resolved = Facter::ResolvedFact.new('fact_name', nil) expect("#{resolved}-test").to eq('-test') end end end puppetlabs-facter-dfe6df4/spec/facter/query_parser_spec.rb000066400000000000000000000133521470204764400242110ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::QueryParser do describe '#parse' do it 'creates one core searched fact' do query_list = ['os.name'] os_name_class = 'Facter::Ubuntu::OsName' os_family_class = 'Facter::Ubuntu::OsFamily' loaded_fact_os_name = instance_double(Facter::LoadedFact, name: 'os.name', klass: os_name_class, type: :core, file: nil) loaded_fact_os_family = instance_double(Facter::LoadedFact, name: 'os.family', klass: os_family_class, type: :core, file: nil) loaded_facts = [loaded_fact_os_name, loaded_fact_os_family] matched_facts = Facter::QueryParser.parse(query_list, loaded_facts) expect(matched_facts).to be_an_instance_of(Array).and \ contain_exactly(an_instance_of(Facter::SearchedFact).and(having_attributes(fact_class: os_name_class))) end it 'creates one legacy fact' do query_list = ['ipaddress_ens160'] networking_class = 'Facter::Ubuntu::NetworkInterface' os_family_class = 'Facter::Ubuntu::OsFamily' loaded_fact_networking = instance_double(Facter::LoadedFact, name: 'ipaddress_.*', klass: networking_class, type: :legacy, file: nil) loaded_fact_os_family = instance_double(Facter::LoadedFact, name: 'os.family', klass: os_family_class, type: :core, file: nil) loaded_facts = [loaded_fact_networking, loaded_fact_os_family] matched_facts = Facter::QueryParser.parse(query_list, loaded_facts) expect(matched_facts).to be_an_instance_of(Array).and \ contain_exactly(an_instance_of(Facter::SearchedFact).and(having_attributes(fact_class: networking_class))) end it 'creates a searched fact correctly without name collision' do query_list = ['ssh.rsa.key'] ssh_class = 'Facter::El::Ssh' ssh_key_class = 'Facter::El::Sshalgorithmkey' loaded_fact_ssh_key = instance_spy(Facter::LoadedFact, name: 'ssh.*key', klass: ssh_key_class, type: :legacy) loaded_fact_ssh = instance_spy(Facter::LoadedFact, name: 'ssh', klass: ssh_class, type: :core) loaded_facts = [loaded_fact_ssh_key, loaded_fact_ssh] matched_facts = Facter::QueryParser.parse(query_list, loaded_facts) expect(matched_facts).to be_an_instance_of(Array).and \ contain_exactly(an_instance_of(Facter::SearchedFact).and(having_attributes(fact_class: ssh_class))) end it 'creates one custom searched fact' do query_list = ['custom_fact'] os_name_class = 'Facter::Ubuntu::OsName' loaded_fact_os_name = instance_double(Facter::LoadedFact, name: 'os.name', klass: os_name_class, type: :core, file: nil) loaded_fact_custom_fact = instance_double(Facter::LoadedFact, name: 'custom_fact', klass: nil, type: :custom, file: nil) loaded_facts = [loaded_fact_os_name, loaded_fact_custom_fact] matched_facts = Facter::QueryParser.parse(query_list, loaded_facts) expect(matched_facts).to be_an_instance_of(Array).and \ contain_exactly(an_instance_of(Facter::SearchedFact).and(having_attributes(fact_class: nil, type: :custom))) end it 'queries if param is symbol' do query_list = [:path] path_class = 'Facter::Ubuntu::Path' loaded_fact_path = instance_double(Facter::LoadedFact, name: 'path', klass: path_class, type: :core, file: nil) loaded_facts = [loaded_fact_path] matched_facts = Facter::QueryParser.parse(query_list, loaded_facts) expect(matched_facts).to be_an_instance_of(Array).and \ contain_exactly(an_instance_of(Facter::SearchedFact).and(having_attributes(fact_class: path_class))) end context 'when user query contains metacharacters (like dots)' do it 'finds the structured fact and not the alias' do query_list = ['ldom.domainrole.impl'] ldom_class = 'Facter::Solaris::Ldom' loaded_fact_ldom = instance_double(Facter::LoadedFact, name: 'ldom', klass: ldom_class, type: :core, file: nil) ldom_fact_ldom_alias = instance_double(Facter::LoadedFact, name: 'ldom_domainrole_impl', klass: ldom_class, type: :legacy, file: nil) loaded_facts = [loaded_fact_ldom, ldom_fact_ldom_alias] matched_facts = Facter::QueryParser.parse(query_list, loaded_facts) expect(matched_facts).to be_an_instance_of(Array).and \ contain_exactly(an_instance_of(Facter::SearchedFact) .and(having_attributes(name: 'ldom', user_query: 'ldom.domainrole.impl', fact_class: ldom_class, type: :core))) end end context 'when fact does not exist' do let(:query_list) { ['non_existing_fact'] } let(:loaded_facts) { [] } it 'creates a nil fact' do matched_facts = Facter::QueryParser.parse(query_list, loaded_facts) expect(matched_facts).to be_an_instance_of(Array).and contain_exactly( an_object_having_attributes(name: 'non_existing_fact', user_query: 'non_existing_fact', type: :nil) ) end end context 'when a fact name contains a regex special character' do let(:query_list) { ['regex(string'] } let(:loaded_facts) { [instance_double(Facter::LoadedFact, name: 'a_loaded_fact', klass: nil, type: :custom, file: nil)] } it 'is escaped correctly and does not result in an unexpected regex parse error' do matched_facts = Facter::QueryParser.parse(query_list, loaded_facts) expect(matched_facts).to be_an_instance_of(Array).and contain_exactly( an_object_having_attributes(name: 'regex(string', user_query: 'regex(string', type: :nil) ) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/000077500000000000000000000000001470204764400221515ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/resolvers/aio_agent_version_spec.rb000066400000000000000000000027721470204764400272130ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::AioAgentVersion do describe '#resolve' do before do allow(Facter::Util::FileHelper) .to receive(:safe_read) .with('/opt/puppetlabs/puppet/VERSION', nil) .and_return('7.0.1') end after do Facter::Resolvers::AioAgentVersion.invalidate_cache end it 'calls FileHelper.safe_read' do Facter::Resolvers::AioAgentVersion.resolve(:aio_agent_version) expect(Facter::Util::FileHelper).to have_received(:safe_read).with('/opt/puppetlabs/puppet/VERSION', nil) end it 'detects puppet version' do expect(Facter::Resolvers::AioAgentVersion.resolve(:aio_agent_version)).to eql('7.0.1') end context 'when AIO puppet agent is a dev build' do before do allow(Facter::Util::FileHelper) .to receive(:safe_read) .with('/opt/puppetlabs/puppet/VERSION', nil) .and_return('7.0.1.8.g12345678') end it 'only shows the first 4 groups of digits' do expect(Facter::Resolvers::AioAgentVersion.resolve(:aio_agent_version)).to eql('7.0.1.8') end end context 'when there is no AIO puppet agent' do before do allow(Facter::Util::FileHelper) .to receive(:safe_read) .with('/opt/puppetlabs/puppet/VERSION', nil) .and_return(nil) end it 'resolves to nil' do expect(Facter::Resolvers::AioAgentVersion.resolve(:aio_agent_version)).to be(nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/aix/000077500000000000000000000000001470204764400227325ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/resolvers/aix/architecture_spec.rb000066400000000000000000000027501470204764400267570ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Architecture do describe '#resolve' do before do odm1 = instance_double(Facter::Util::Aix::ODMQuery) odm2 = instance_double(Facter::Util::Aix::ODMQuery) allow(Facter::Util::Aix::ODMQuery).to receive(:new).and_return(odm1, odm2) allow(odm1).to receive(:equals).with('PdDvLn', 'processor/sys/proc_rspc').and_return(odm1) allow(odm1).to receive(:equals).with('status', '1').and_return(odm1) allow(odm1).to receive(:execute).and_return('proc8') allow(odm2).to receive(:equals).with('name', 'proc8').and_return(odm2) allow(odm2).to receive(:equals).with('attribute', 'type').and_return(odm2) allow(odm2).to receive(:execute).and_return(result) end after do Facter::Resolvers::Architecture.invalidate_cache end context 'when line contains value' do let(:result) { 'value = x86' } it 'detects architecture' do expect(Facter::Resolvers::Architecture.resolve(:architecture)).to eql('x86') end end context 'when line does not value' do let(:result) { 'test = x86' } it 'detects architecture as nil' do expect(Facter::Resolvers::Architecture.resolve(:architecture)).to be(nil) end end context 'when fails to retrieve fact' do let(:result) { nil } it 'detects architecture as nil' do expect(Facter::Resolvers::Architecture.resolve(:architecture)).to be(nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/aix/disks_spec.rb000066400000000000000000000024771470204764400254200ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Aix::Disks do subject(:resolver) { Facter::Resolvers::Aix::Disks } before do allow(Facter::Core::Execution).to receive(:execute) .with('lspv', logger: an_instance_of(Facter::Log)) .and_return(result) end after do resolver.invalidate_cache end context 'when retrieving disks name fails' do let(:result) { '' } it 'returns nil' do expect(resolver.resolve(:disks)).to be_nil end end context 'when lspv is successful' do let(:result) { load_fixture('lspv_output').read } let(:disks) do { 'hdisk0' => { size: '29.97 GiB', size_bytes: 32_178_700_288 } } end before do allow(Facter::Core::Execution).to receive(:execute) .with('lspv hdisk0', logger: an_instance_of(Facter::Log)) .and_return(load_fixture('lspv_disk_output').read) end it 'returns disks informations' do expect(resolver.resolve(:disks)).to eql(disks) end context 'when second lspv call fails' do before do allow(Facter::Core::Execution).to receive(:execute) .with('lspv hdisk0', logger: an_instance_of(Facter::Log)) .and_return('') end it 'returns disks informations' do expect(resolver.resolve(:disks)).to eq({}) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/aix/ffi_helper_spec.rb000066400000000000000000000017751470204764400264060ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Aix::FfiHelper do let(:averages) { double('FFI::MemoryPointer', size: 24) } let(:averages_size) { double('FFI::MemoryPointer', write_int: 24) } before do allow(::FFI::MemoryPointer).to receive(:new).with(:long_long, 3).and_return(averages) allow(::FFI::MemoryPointer).to receive(:new).with(:int, 1).and_return(averages_size) end after do Facter::Resolvers::Aix::LoadAverages.invalidate_cache end it 'returns load average' do allow(Facter::Resolvers::Aix::FfiHelper::Libc).to receive(:getkerninfo).and_return(0) allow(averages).to receive(:read_array_of_long_long).with(3).and_return([655.36, 1310.72, 1966.08]) expect(Facter::Resolvers::Aix::FfiHelper.read_load_averages).to eq([0.01, 0.02, 0.03]) end it 'does not return load average' do allow(Facter::Resolvers::Aix::FfiHelper::Libc).to receive(:getkerninfo).and_return(-1) expect(Facter::Resolvers::Aix::FfiHelper.read_load_averages).to be_nil end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/aix/filesystem_spec.rb000066400000000000000000000016311470204764400264560ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Aix::Filesystem do let(:filesystems) { 'ahafs,cdrfs,namefs,procfs,sfs' } after do Facter::Resolvers::Aix::Filesystem.invalidate_cache end context 'when vfs file is readable' do before do allow(Facter::Util::FileHelper).to receive(:safe_readlines) .with('/etc/vfs') .and_return(load_fixture('aix_filesystems').readlines) end it 'returns filesystems' do result = Facter::Resolvers::Aix::Filesystem.resolve(:file_systems) expect(result).to eq(filesystems) end end context 'when vfs file is not readable' do before do allow(Facter::Util::FileHelper).to receive(:safe_readlines) .with('/etc/vfs') .and_return([]) end it 'returns nil' do result = Facter::Resolvers::Aix::Filesystem.resolve(:file_systems) expect(result).to be(nil) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/aix/hardware_spec.rb000066400000000000000000000021761470204764400260740ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Hardware do describe '#resolve' do before do odm = double('ODMQuery') allow(Facter::Util::Aix::ODMQuery).to receive(:new).and_return(odm) allow(odm).to receive(:equals).with('name', 'sys0').and_return(odm) allow(odm).to receive(:equals).with('attribute', 'modelname') allow(odm).to receive(:execute).and_return(result) end after do Facter::Resolvers::Hardware.invalidate_cache end context 'when line contains value' do let(:result) { 'value = hardware' } it 'detects hardware' do expect(Facter::Resolvers::Hardware.resolve(:hardware)).to eql('hardware') end end context 'when line does not contain value' do let(:result) { 'test = hardware' } it 'detects hardware as nil' do expect(Facter::Resolvers::Hardware.resolve(:hardware)).to be(nil) end end context 'when fails to retrieve fact' do let(:result) { nil } it 'detects hardware as nil' do expect(Facter::Resolvers::Hardware.resolve(:hardware)).to be(nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/aix/load_averages_spec.rb000066400000000000000000000006671470204764400270760ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Aix::LoadAverages do let(:load_averages) { [0.01, 0.02, 0.03] } before do allow(Facter::Resolvers::Aix::FfiHelper).to receive(:read_load_averages) .and_return(load_averages) end it 'returns load average' do result = Facter::Resolvers::Aix::LoadAverages.resolve(:load_averages) expect(result).to eq('15m' => 0.03, '1m' => 0.01, '5m' => 0.02) end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/aix/memory_spec.rb000066400000000000000000000042161470204764400256040ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Aix::Memory do subject(:resolver) { Facter::Resolvers::Aix::Memory } before do allow(Facter::Core::Execution).to receive(:execute) .with('svmon', logger: an_instance_of(Facter::Log)) .and_return(svmon_content) allow(Facter::Core::Execution).to receive(:execute) .with('pagesize', logger: an_instance_of(Facter::Log)) .and_return(pagesize_content) end after do resolver.invalidate_cache end context 'when svmon call fails' do let(:svmon_content) { '' } let(:pagesize_content) { '' } it 'returns nil for system' do expect(resolver.resolve(:system)).to be_nil end it 'returns nil for swap' do expect(resolver.resolve(:swap)).to be_nil end end context 'when pagesize call fails' do let(:svmon_content) { load_fixture('svmon_content').read } let(:pagesize_content) { '' } it 'returns nil for system' do expect(resolver.resolve(:system)).to be_nil end it 'returns nil for swap' do expect(resolver.resolve(:swap)).to be_nil end end context 'when svmon returns invalid content' do let(:svmon_content) { 'some_errors_on_stdout' } let(:pagesize_content) { '4096' } it 'returns empty hash for system' do expect(resolver.resolve(:system)).to be_a(Hash).and contain_exactly end it 'returns empty hash for swap' do expect(resolver.resolve(:swap)).to be_a(Hash).and contain_exactly end end context 'when all calls return valid content' do let(:svmon_content) { load_fixture('svmon_content').read } let(:pagesize_content) { '4096' } let(:system_memory) do { available_bytes: 4_966_027_264, capacity: '42.19%', total_bytes: 8_589_934_592, used_bytes: 3_623_907_328 } end let(:swap_memory) do { available_bytes: 525_660_160, capacity: '2.09%', total_bytes: 536_870_912, used_bytes: 11_210_752 } end it 'returns facts for system memory' do expect(resolver.resolve(:system)).to eq(system_memory) end it 'returns facts for swap memory' do expect(resolver.resolve(:swap)).to eq(swap_memory) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/aix/mountpoints_spec.rb000066400000000000000000000037711470204764400267000ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Aix::Mountpoints do let(:mountpoints) do { '/' => { available: '1.63 GiB', available_bytes: 1_747_865_600, capacity: '18.61%', device: '/dev/hd4', filesystem: 'jfs2', options: ['rw', 'log=/dev/hd8'], size: '2.00 GiB', size_bytes: 2_147_483_648, used: '381.11 MiB', used_bytes: 399_618_048 }, '/opt' => { device: '/dev/hd10opt', filesystem: 'jfs2', options: ['rw', 'log=/dev/hd8'] }, '/usr' => { available: '2.84 GiB', available_bytes: 3_049_021_440, capacity: '43.21%', device: '/dev/hd2', filesystem: 'jfs2', options: ['rw', 'log=/dev/hd8'], size: '5.00 GiB', size_bytes: 5_368_709_120, used: '2.16 GiB', used_bytes: 2_319_687_680 }, '/var' => { available: '205.06 MiB', available_bytes: 215_023_616, capacity: '0.76%', device: '/dev/hd3', filesystem: 'x', options: ['rw', 'nodev', 'log=/dev/hd3'], size: '206.64 MiB', size_bytes: 216_678_912, used: '1.58 MiB', used_bytes: 1_655_296 }, '/tmp/salam' => { available: '63.57 GiB', available_bytes: 68_253_413_376, capacity: '7.20%', device: 'joe:/var/share', filesystem: 'nfs3', options: [], size: '68.50 GiB', size_bytes: 73_549_217_792, used: '4.93 GiB', used_bytes: 5_295_804_416 } } end before do allow(Facter::Core::Execution).to receive(:execute) .with('mount', logger: an_instance_of(Facter::Log)) .and_return(load_fixture('mount').read) allow(Facter::Core::Execution).to receive(:execute) .with('df -P', logger: an_instance_of(Facter::Log)) .and_return(load_fixture('df').read) end it "only skips lines containing the string 'node'" do result = Facter::Resolvers::Aix::Mountpoints.resolve(:mountpoints) expect(result).to include('/var') end it 'returns mountpoints' do result = Facter::Resolvers::Aix::Mountpoints.resolve(:mountpoints) expect(result).to eq(mountpoints) end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/aix/networking_spec.rb000066400000000000000000000067541470204764400264740ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Aix::Networking do subject(:networking_resolver) { Facter::Resolvers::Aix::Networking } let(:ffi_interfaces) do { 'en0' => { bindings: [{ address: '10.32.77.1', netmask: '255.255.255.0', network: '10.32.77.0' }] }, 'lo0' => { bindings: [{ address: '127.0.0.1', netmask: '255.0.0.0', network: '127.0.0.0' }], bindings6: [{ address: '::1', netmask: '::', network: '::', scope6: 'host' }] } } end before do allow(Facter::Core::Execution).to receive(:execute) .with('netstat -rn', logger: an_instance_of(Facter::Log)) .and_return(netstat_rn) allow(Facter::Core::Execution).to receive(:execute) .with('netstat -in', logger: an_instance_of(Facter::Log)) .and_return(netstat_in) allow(Facter::Resolvers::Aix::FfiHelper).to receive(:read_interfaces).and_return(ffi_interfaces) end after do networking_resolver.invalidate_cache end context 'when netstat command exists' do let(:netstat_in) { load_fixture('netstat_in').read } let(:netstat_rn) { load_fixture('netstat_rn').read } let(:interfaces) do { 'en0' => { bindings: [{ address: '10.32.77.1', netmask: '255.255.255.0', network: '10.32.77.0' }], ip: '10.32.77.1', mac: '0a:c6:24:39:41:03', mtu: 1500, netmask: '255.255.255.0', network: '10.32.77.0' }, 'lo0' => { bindings: [{ address: '127.0.0.1', netmask: '255.0.0.0', network: '127.0.0.0' }], bindings6: [{ address: '::1', netmask: '::', network: '::', scope6: 'host' }], ip: '127.0.0.1', ip6: '::1', mtu: 16_896, netmask: '255.0.0.0', netmask6: '::', network: '127.0.0.0', network6: '::', scope6: 'host' } } end let(:primary) { 'en0' } it 'returns primary interface' do expect(networking_resolver.resolve(:primary_interface)).to eq(primary) end it 'returns ipv4 for primary interface' do expect(networking_resolver.resolve(:ip)).to eq(interfaces[primary][:ip]) end it 'returns interfaces fact' do expect(networking_resolver.resolve(:interfaces)).to eq(interfaces) end it 'returns mtu fact' do expect(networking_resolver.resolve(:mtu)).to eq(interfaces[primary][:mtu]) end end context 'when netstat command does not exist' do let(:netstat_in) { '' } let(:netstat_rn) { '' } it 'returns primary interface' do expect(networking_resolver.resolve(:primary_interface)).to be_nil end it 'returns interfaces fact' do expect(networking_resolver.resolve(:interfaces)).to eq(ffi_interfaces) end it 'returns mtu fact' do expect(networking_resolver.resolve(:mtu)).to be_nil end end context 'when interface is down' do let(:netstat_in) { load_fixture('netstat_in').read } let(:netstat_rn) { load_fixture('netstat_rn_two').read } let(:ffi_interfaces) do { 'lo0' => { bindings: [{ address: '127.0.0.1', netmask: '255.0.0.0', network: '127.0.0.0' }], bindings6: [{ address: '::1', netmask: '::', network: '::', scope6: 'host' }], ip: '127.0.0.1', ip6: '::1', mtu: 16_896, netmask: '255.0.0.0', netmask6: '::', network: '127.0.0.0', network6: '::', scope6: 'host' } } end it 'returns a nil MTU' do expect(networking_resolver.log).not_to receive(:error).with(/undefined method/) expect(networking_resolver.resolve(:mtu)).to be_nil end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/aix/nim_spec.rb000066400000000000000000000026041470204764400250560ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Aix::Nim do subject(:nim_resolver) { Facter::Resolvers::Aix::Nim } after do nim_resolver.invalidate_cache end before do allow(Facter::Util::FileHelper).to receive(:safe_readlines) .with('/etc/niminfo') .and_return(niminfo_content) end context 'when niminfo file is not readable' do let(:type) { nil } let(:niminfo_content) { nil } it 'returns nil' do expect(nim_resolver.resolve(:type)).to eq(type) end end context 'when niminfo file is readable' do context 'when NIM_CONFIGURATION field is missing from file' do let(:type) { nil } let(:niminfo_content) { load_fixture('niminfo_wo_nim_configuration').read } it 'returns nil' do expect(nim_resolver.resolve(:type)).to eq(type) end end context 'when NIM_CONFIGURATION field is not master nor standalone' do let(:type) { nil } let(:niminfo_content) { load_fixture('niminfo_w_wrong_nim_configuration').read } it 'returns nil' do expect(nim_resolver.resolve(:type)).to eq(type) end end context 'when NIM_CONFIGURATION field is correct' do let(:type) { nil } let(:niminfo_content) { load_fixture('niminfo_nim_configuration').read } it 'returns master' do expect(nim_resolver.resolve(:type)).to eq(type) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/aix/os_level_spec.rb000066400000000000000000000013061470204764400261010ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Aix::OsLevel do subject(:os_level) { Facter::Resolvers::Aix::OsLevel } before do allow(Facter::Core::Execution).to receive(:execute) .with('/usr/bin/oslevel -s', logger: an_instance_of(Facter::Log)) .and_return(output) end after do os_level.invalidate_cache end describe 'when command returns an output' do let(:output) { '6100-09-00-0000' } it 'returns build' do expect(os_level.resolve(:build)).to eq(output) end end describe 'when command returns empty string' do let(:output) { '' } it 'returns build as nil' do expect(os_level.resolve(:build)).to be_nil end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/aix/partitions_spec.rb000066400000000000000000000027441470204764400264740ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Aix::Partitions do subject(:resolver) { Facter::Resolvers::Aix::Partitions } let(:odm_query_spy) { instance_spy(Facter::Util::Aix::ODMQuery) } before do allow(Facter::Util::Aix::ODMQuery).to receive(:new).and_return(odm_query_spy) allow(odm_query_spy).to receive(:equals).with('PdDvLn', 'logical_volume/lvsubclass/lvtype') allow(odm_query_spy).to receive(:execute).and_return(result) end after do resolver.invalidate_cache end context 'when retrieving partitions name fails' do let(:result) { nil } before do allow(odm_query_spy).to receive(:execute).and_return(result) end it 'returns nil' do expect(resolver.resolve(:partitions)).to be_nil end end context 'when CuDv query succesful' do let(:result) { load_fixture('partitions_cudv_query').read } let(:partitions) do { '/dev/hd5' => { filesystem: 'boot', label: 'primary_bootlv', size: '32.00 MiB', size_bytes: 33_554_432 } } end before do allow(Facter::Core::Execution).to receive(:execute) .with('lslv -L hd5', logger: an_instance_of(Facter::Log)) .and_return(load_fixture('lslv_output').read) allow(Facter::Core::Execution).to receive(:execute) .with('lslv -L hd6', logger: an_instance_of(Facter::Log)) .and_return('') end it 'returns partitions informations' do expect(resolver.resolve(:partitions)).to eql(partitions) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/aix/processors_spec.rb000066400000000000000000000064221470204764400264770ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Aix::Processors do subject(:resolver) { Facter::Resolvers::Aix::Processors } let(:odm_query_spy) { instance_spy(Facter::Util::Aix::ODMQuery) } let(:odm_query_spy2) { instance_spy(Facter::Util::Aix::ODMQuery) } let(:odm_query_spy3) { instance_spy(Facter::Util::Aix::ODMQuery) } let(:odm_query_spy4) { instance_spy(Facter::Util::Aix::ODMQuery) } before do allow(Facter::Util::Aix::ODMQuery).to receive(:new).and_return(odm_query_spy, odm_query_spy2, odm_query_spy3, odm_query_spy4) allow(odm_query_spy).to receive(:equals).with('class', 'processor') allow(odm_query_spy).to receive(:execute).and_return(result) end after do resolver.invalidate_cache end context 'when PdDv query fails' do let(:result) { nil } it 'returns nil' do expect(resolver.resolve(:speed)).to be_nil end end context 'when PdDv query succesful but CuDv fails' do let(:result) { load_fixture('processors_pddv').read } before do allow(odm_query_spy2).to receive(:equals).with('PdDvLn', 'processor/sys/proc_rspc') allow(odm_query_spy2).to receive(:execute).and_return(nil) end it 'returns nil' do expect(resolver.resolve(:speed)).to be_nil end end context 'when CuAt query fails' do let(:result) { load_fixture('processors_pddv').read } before do allow(odm_query_spy2).to receive(:equals).with('PdDvLn', 'processor/sys/proc_rspc') allow(odm_query_spy2).to receive(:execute).and_return(load_fixture('processors_cudv').read) allow(odm_query_spy3).to receive(:equals).with('name', 'proc0') allow(odm_query_spy3).to receive(:execute).and_return(nil) end it 'returns nil' do expect(resolver.resolve(:speed)).to be_nil end end context 'when all queries returns an output' do let(:result) { load_fixture('processors_pddv').read } let(:models) do %w[PowerPC_POWER8 PowerPC_POWER8 PowerPC_POWER8 PowerPC_POWER8 PowerPC_POWER8 PowerPC_POWER8 PowerPC_POWER8 PowerPC_POWER8] end before do allow(odm_query_spy2).to receive(:equals).with('PdDvLn', 'processor/sys/proc_rspc') allow(odm_query_spy2).to receive(:execute).and_return(load_fixture('processors_cudv').read) allow(odm_query_spy3).to receive(:equals).with('name', 'proc0') allow(odm_query_spy3).to receive(:execute).and_return(load_fixture('processors_cuat').read) allow(odm_query_spy4).to receive(:equals).with('name', 'proc8') allow(odm_query_spy4).to receive(:execute).and_return(load_fixture('processors_cuat').read) end it 'returns speed fact' do expect(resolver.resolve(:speed)).to eq(3_425_000_000) end it 'returns models fact' do expect(resolver.resolve(:models)).to eq(models) end it 'returns logical_count fact' do expect(resolver.resolve(:logical_count)).to eq(8) end it 'returns cores fact' do expect(resolver.resolve(:cores_per_socket)).to eq(1) end it 'returns threads fact' do expect(resolver.resolve(:threads_per_core)).to eq(8) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/aix/serialnumber_spec.rb000066400000000000000000000023511470204764400267620ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Aix::Serialnumber do describe '#resolve' do before do odm = instance_spy('Facter::Util::Aix::ODMQuery') allow(Facter::Util::Aix::ODMQuery).to receive(:new).and_return(odm) allow(odm).to receive(:equals).with('name', 'sys0').and_return(odm) allow(odm).to receive(:equals).with('attribute', 'systemid') allow(odm).to receive(:execute).and_return(result) end after do Facter::Resolvers::Aix::Serialnumber.invalidate_cache end context 'when line contains value' do let(:result) { 'value = "IBM,0221684EW"' } it 'detects serialnumber' do expect(Facter::Resolvers::Aix::Serialnumber.resolve(:serialnumber)).to eql('21684EW') end end context 'when line does not include value key' do let(:result) { 'test = IBM,0221684EW' } it 'detects serialnumber as nil' do expect(Facter::Resolvers::Aix::Serialnumber.resolve(:serialnumber)).to be(nil) end end context 'when fails to retrieve fact' do let(:result) { '' } it 'detects serialnumber as nil' do expect(Facter::Resolvers::Aix::Serialnumber.resolve(:serialnumber)).to be(nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/amzn/000077500000000000000000000000001470204764400231165ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/resolvers/amzn/os_release_rpm_spec.rb000066400000000000000000000030221470204764400274510ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Amzn::OsReleaseRpm do subject(:os_release_resolver) { Facter::Resolvers::Amzn::OsReleaseRpm } before do allow(Facter::Core::Execution).to receive(:execute) .with("rpm -q --qf '%s\\n%s\\n%s\\n%s' -f /etc/os-release", logger: an_instance_of(Facter::Log)) .and_return(os_release_content) end after do os_release_resolver.invalidate_cache end context 'when on AmazonLinux 2023' do let(:os_release_content) { "system-release\n2023.2.20231113\n1.amzn2023\nAmazon Linux" } it 'returns os release package version' do expect(os_release_resolver.resolve(:version)).to eq('2023.2.20231113') end it 'returns os release package release' do expect(os_release_resolver.resolve(:release)).to eq('1.amzn2023') end it 'returns os release package vendor' do expect(os_release_resolver.resolve(:vendor)).to eq('Amazon Linux') end end context 'when on AmazonLinux 2' do let(:os_release_content) { "system-release\n2\n16.amzn2\nAmazon Linux" } it 'returns os release package version' do expect(os_release_resolver.resolve(:version)).to eq('2') end it 'returns os release package release' do expect(os_release_resolver.resolve(:release)).to eq('16.amzn2') end end context 'when on os-release file missing' do let(:os_release_content) { '' } it 'returns nil VERSION' do expect(os_release_resolver.resolve(:version)).to be_nil end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/augeas_spec.rb000066400000000000000000000050251470204764400247570ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Augeas do subject(:augeas) { Facter::Resolvers::Augeas } let(:readable) { false } before do allow(File).to receive(:readable?).with('/opt/puppetlabs/puppet/bin/augparse').and_return(readable) end after do augeas.invalidate_cache end context 'when augparse is installed' do before do allow(Facter::Core::Execution).to receive(:execute) .with('augparse --version 2>&1', logger: an_instance_of(Facter::Log)) .and_return('augparse 1.12.0 ') end it 'returns build' do expect(augeas.resolve(:augeas_version)).to eq('1.12.0') end end context 'when augparse is installed with puppet-agent package on unix based systems' do let(:readable) { true } before do allow(Facter::Core::Execution).to receive(:execute) .with('/opt/puppetlabs/puppet/bin/augparse --version 2>&1', logger: an_instance_of(Facter::Log)) .and_return('augparse 1.12.0 ') end it 'returns build' do expect(augeas.resolve(:augeas_version)).to eq('1.12.0') end end context 'when augparse is not installed' do before do allow(Facter::Core::Execution).to receive(:execute) .with('augparse --version 2>&1', logger: an_instance_of(Facter::Log)) .and_return('sh: augparse: command not found') end context 'when augeas gem > 0.5.0 is installed' do before do allow(Gem).to receive(:loaded_specs).and_return({ 'augeas' => true }) allow(Augeas).to receive(:create).and_return('1.12.0') end it 'returns build' do expect(augeas.resolve(:augeas_version)).to eq('1.12.0') end end context 'when augeas gem <= 0.5.0 is installed' do before do allow(Gem).to receive(:loaded_specs).and_return({}) allow(Augeas).to receive(:open).and_return('1.12.0') end it 'returns build' do expect(augeas.resolve(:augeas_version)).to eq('1.12.0') end end context 'when augeas gem is not installed' do let(:exception) { LoadError.new('load_error_message') } before do allow(Facter::Resolvers::Augeas).to receive(:require).with('augeas').and_raise(exception) end it 'rescues LoadError error and logs at debug level' do allow(augeas.log).to receive(:debug) expect(augeas.log).to receive(:debug).with(/Resolving fact augeas_version, but got load_error_message/) augeas.resolve(:augeas_version) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/az_spec.rb000066400000000000000000000021701470204764400241220ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Az do subject(:az) { Facter::Resolvers::Az } let(:uri) { 'http://169.254.169.254/metadata/instance?api-version=2020-09-01' } before do allow(Facter::Util::Resolvers::Http).to receive(:get_request) .with(uri, { Metadata: 'true' }, { session: 5 }, false).and_return(output) end after do az.invalidate_cache end context 'when no exception is thrown' do let(:output) { '{"azEnvironment":"AzurePublicCloud"}' } it 'returns az metadata' do expect(az.resolve(:metadata)).to eq({ 'azEnvironment' => 'AzurePublicCloud' }) end end context "when a proxy is set with ENV['http_proxy']" do before do stub_const('ENV', { 'http_proxy' => 'http://example.com' }) end let(:output) { '{"azEnvironment":"AzurePublicCloud"}' } it 'returns az metadata' do expect(az.resolve(:metadata)).to eq({ 'azEnvironment' => 'AzurePublicCloud' }) end end context 'when an exception is thrown' do let(:output) { '' } it 'returns empty az metadata' do expect(az.resolve(:metadata)).to eq({}) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/base_resolver_spec.rb000066400000000000000000000056461470204764400263560ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::BaseResolver do let(:fact) { 'fact' } let(:resolver) do Class.new(Facter::Resolvers::BaseResolver) do init_resolver def self.post_resolve(fact_name, _options) @fact_list[fact_name] = 'value' @fact_list end end end describe '#log' do it 'returns the log' do expect(resolver.log).to be_an_instance_of(Facter::Log) end it 'returns the same log instance each time' do expect(resolver.log).to be_equal(resolver.log) end end describe '#invalidate_cache' do it 'clears the facts_list' do resolver.resolve(fact) resolver.invalidate_cache expect(resolver.resolve('fact2')).to eq('value') end end describe '#subscribe_to_manager' do before do allow(Facter::SessionCache).to receive(:subscribe).with(resolver) end it 'calls the CacheManager subscribe method' do resolver.subscribe_to_manager expect(Facter::SessionCache).to have_received(:subscribe).with(resolver) end end describe '#resolve' do context 'when fact is resolved successfully' do before do allow(resolver).to receive(:post_resolve) allow(Facter::SessionCache).to receive(:subscribe).with(resolver) end it 'calls the CacheManager subscribe method' do resolver.resolve(fact) expect(Facter::SessionCache).to have_received(:subscribe).with(resolver) end it 'calls the post_resolve method' do resolver.resolve(fact) expect(resolver).to have_received(:post_resolve).with(fact, {}) end end context 'when Load Error is raised' do before do allow(resolver).to receive(:post_resolve).and_raise(LoadError) end it 'logs the Load Error exception at the error level' do expect(resolver.log).to receive(:error).with(/Resolving fact #{fact}, but got LoadError/) resolver.resolve(fact) end it 'sets the fact to nil' do expect(resolver.resolve(fact)).to eq(nil) end end end describe '#validate_resolution' do before do allow(resolver).to receive(:cache_nil_for_unresolved_facts) end it 'sets the fact to nil if undefined' do resolver.cache_nil_for_unresolved_facts('unresolved_fact') expect(resolver.resolve('unresolved_fact')).to be_nil end it 'does not overwrite values' do resolver.resolve('my_fact') resolver.cache_nil_for_unresolved_facts('my_fact') expect(resolver.post_resolve('my_fact', {})).to eq({ 'my_fact' => 'value' }) end end describe '#post_resolve' do let(:resolver) { Class.new(Facter::Resolvers::BaseResolver) } it 'raises NotImplementedError error' do expect { resolver.post_resolve(fact, {}) }.to \ raise_error(NotImplementedError, 'You must implement post_resolve(fact_name, options) method in ') end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/bsd/000077500000000000000000000000001470204764400227215ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/resolvers/bsd/ffi_helper_spec.rb000066400000000000000000000045611470204764400263710ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Bsd::FfiHelper do describe '#sysctl' do let(:oids) { [1, 2, 3] } let(:name) { double('FFI::MemoryPointer') } let(:oldlenp) { double('FFI::MemoryPointer') } let(:oldp) { double('FFI::MemoryPointer') } before do allow(FFI::MemoryPointer).to receive(:new).with(:uint, oids.size).and_return(name) allow(name).to receive(:write_array_of_uint).with(oids) end context 'when expecting a string' do let(:result) { 'Hello World !' } before do allow(FFI::MemoryPointer).to receive(:new) .with(:size_t) .and_return(oldlenp) allow(Facter::Bsd::FfiHelper::Libc).to receive(:sysctl) .with(name, oids.size, FFI::Pointer::NULL, oldlenp, FFI::Pointer::NULL, 0) .and_return(0) allow(oldlenp).to receive(:read) .with(:size_t) .and_return(result.length) allow(FFI::MemoryPointer).to receive(:new) .with(:uint8_t, result.length) .and_return(oldp) allow(Facter::Bsd::FfiHelper::Libc).to receive(:sysctl) .with(name, oids.size, oldp, oldlenp, FFI::Pointer::NULL, 0) .and_return(0) allow(oldp).to receive(:read_string) .and_return(result) end it 'does what is expected' do expect(Facter::Bsd::FfiHelper.sysctl(:string, oids)).to eq(result) end end context 'when expecting an uint32_t' do let(:result) { 42 } let(:oldlen) { instance_double('Integer') } before do allow(FFI::MemoryPointer).to receive(:new) .with(:size_t) .and_return(oldlenp) allow(FFI).to receive(:type_size) .with(:uint32_t) .and_return(4) allow(oldlenp).to receive(:write) .with(:size_t, 4) allow(oldlenp).to receive(:read) .and_return(oldlen) allow(FFI::MemoryPointer).to receive(:new) .with(:uint8_t, oldlen) .and_return(oldp) allow(Facter::Bsd::FfiHelper::Libc).to receive(:sysctl) .with(name, oids.size, oldp, oldlenp, FFI::Pointer::NULL, 0) .and_return(0) allow(oldp).to receive(:read) .with(:uint32_t) .and_return(result) end it 'does what is expected' do expect(Facter::Bsd::FfiHelper.sysctl(:uint32_t, oids)).to eq(result) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/bsd/processors_spec.rb000066400000000000000000000020461470204764400264640ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Bsd::Processors do subject(:resolver) { Facter::Resolvers::Bsd::Processors } let(:logicalcount) { 2 } let(:models) do ['Intel(r) Xeon(r) Gold 6138 CPU @ 2.00GHz', 'Intel(r) Xeon(r) Gold 6138 CPU @ 2.00GHz'] end let(:speed_expected) { 2_592_000_000 } before do allow(Facter::Bsd::FfiHelper) .to receive(:sysctl) .with(:uint32_t, [6, 3]) .and_return(logicalcount) allow(Facter::Bsd::FfiHelper) .to receive(:sysctl) .with(:string, [6, 2]) .and_return(models[0]) allow(Facter::Bsd::FfiHelper) .to receive(:sysctl) .with(:uint32_t, [6, 12]) .and_return(2592) end after do resolver.invalidate_cache end it 'returns number of processors' do expect(resolver.resolve(:logical_count)).to eq(logicalcount) end it 'returns list of models' do expect(resolver.resolve(:models)).to eq(models) end it 'returns speed of processors' do expect(resolver.resolve(:speed)).to eq(speed_expected) end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/containers_spec.rb000066400000000000000000000072171470204764400256640ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Containers do subject(:containers_resolver) { Facter::Resolvers::Containers } before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/proc/1/cgroup', nil) .and_return(cgroup_output) allow(Facter::Util::FileHelper).to receive(:safe_readlines) .with('/proc/1/environ', [], "\0", chomp: true) .and_return(environ_output) end after do containers_resolver.invalidate_cache end context 'when hypervisor is docker' do let(:cgroup_output) { load_fixture('docker_cgroup').read } let(:environ_output) { ['PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'] } let(:result) { { docker: { 'id' => 'ee6e3c05422f1273c9b41a26f2b4ec64bdb4480d63a1ad9741e05cafc1651b90' } } } it 'return docker for vm' do expect(containers_resolver.resolve(:vm)).to eq('docker') end it 'return docker info for hypervisor' do expect(containers_resolver.resolve(:hypervisor)).to eq(result) end end context 'when hypervisor is nspawn' do let(:cgroup_output) { load_fixture('cgroup_file').read } let(:environ_output) { ['PATH=/usr/local/sbin:/bin', 'container=systemd-nspawn', 'TERM=xterm-256color'] } let(:result) { { systemd_nspawn: { 'id' => 'ee6e3c05422f1273c9b41a26f2b4ec64bdb4480d63a1ad9741e05cafc1651b90' } } } before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/etc/machine-id', nil) .and_return("ee6e3c05422f1273c9b41a26f2b4ec64bdb4480d63a1ad9741e05cafc1651b90\n") end it 'return nspawn for vm' do expect(containers_resolver.resolve(:vm)).to eq('systemd_nspawn') end it 'return nspawn info for hypervisor' do expect(containers_resolver.resolve(:hypervisor)).to eq(result) end end context 'when hypervisor is lxc and it is discovered by cgroup' do let(:cgroup_output) { load_fixture('lxc_cgroup').read } let(:environ_output) { ['PATH=/usr/local/sbin:/sbin:/bin'] } let(:result) { { lxc: { 'name' => 'lxc_container' } } } it 'return lxc for vm' do expect(containers_resolver.resolve(:vm)).to eq('lxc') end it 'return lxc info for hypervisor' do expect(containers_resolver.resolve(:hypervisor)).to eq(result) end end context 'when hypervisor is lxc and it is discovered by environ' do let(:cgroup_output) { load_fixture('cgroup_file').read } let(:environ_output) { ['container=lxc'] } let(:result) { { lxc: {} } } it 'return lxc for vm' do expect(containers_resolver.resolve(:vm)).to eq('lxc') end it 'return lxc info for hypervisor' do expect(containers_resolver.resolve(:hypervisor)).to eq(result) end end context 'when hypervisor is neighter lxc nor docker' do let(:cgroup_output) { load_fixture('cgroup_file').read } let(:environ_output) { ['PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin'] } let(:result) { nil } it 'return lxc for vm' do expect(containers_resolver.resolve(:vm)).to eq(nil) end it 'return lxc info for hypervisor' do expect(containers_resolver.resolve(:hypervisor)).to eq(result) end end context 'when hypervisor is an unknown container runtime discovered by environ' do let(:cgroup_output) { load_fixture('cgroup_file').read } let(:environ_output) { ['container=UNKNOWN'] } let(:logger) { Facter::Log.class_variable_get(:@@logger) } it 'return container_other for vm' do expect(logger).to receive(:warn).with(/Container runtime, 'UNKNOWN', is unsupported, setting to 'container_other'/) expect(containers_resolver.resolve(:vm)).to eq('container_other') end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/debian_version_spec.rb000066400000000000000000000014551470204764400265040ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::DebianVersion do after do Facter::Resolvers::DebianVersion.invalidate_cache end context 'when file debian_version is readable' do before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/etc/debian_version').and_return("10.01\n") end it 'returns version' do result = Facter::Resolvers::DebianVersion.resolve(:version) expect(result).to eq('10.01') end end context 'when file debian_version is not readable' do before do allow(Facter::Util::FileHelper).to receive(:safe_read).with('/etc/debian_version').and_return('') end it 'returns nil' do result = Facter::Resolvers::DebianVersion.resolve(:version) expect(result).to be(nil) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/disks_spec.rb000066400000000000000000000131641470204764400246320ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Linux::Disks do describe '#resolve' do subject(:resolver) { Facter::Resolvers::Linux::Disks } let(:disk_files) { %w[sr0/device sr0/size sda/device sda/size] } let(:paths) do { model: '/device/model', size: '/size', vendor: '/device/vendor', type: '/queue/rotational', serial: 'false', wwn: 'false' } end let(:disks) do { sr0: { size: '12', rotational: '0', model: 'model1', vendor: 'vendor1', serial: 'AJDI2491AK', wwn: '239090190.0' }, sda: { size: '231', rotational: '1', model: 'model2', vendor: 'vendor2', serial: 'B2EI34F1AL', wwn: '29429191.0' } } end before do allow(Facter::Util::FileHelper).to receive(:dir_children).with('/sys/block').and_return(%w[sda sr0]) end after do Facter::Resolvers::Linux::Disks.invalidate_cache end context 'when device dir for blocks exists' do let(:expected_output) do { 'sr0' => { model: 'model1', serial: 'AJDI2491AK', wwn: '239090190.0', size: '6.00 KiB', size_bytes: 6144, vendor: 'vendor1', type: 'ssd' }, 'sda' => { model: 'model2', serial: 'B2EI34F1AL', wwn: '29429191.0', size: '115.50 KiB', size_bytes: 118_272, vendor: 'vendor2', type: 'hdd' } } end before do disk_files.each do |disk_file| allow(File).to receive(:readable?).with("/sys/block/#{disk_file}").and_return(true) end paths.each do |fact, value| disks.each do |disk, values| case value when '/size' allow(Facter::Util::FileHelper).to receive(:safe_read) .with("/sys/block/#{disk}#{value}", nil).and_return(values[:size]) when '/queue/rotational' allow(Facter::Util::FileHelper).to receive(:safe_read) .with("/sys/block/#{disk}#{value}", nil).and_return(values[:rotational]) when '/device/model' allow(Facter::Util::FileHelper).to receive(:safe_read) .with("/sys/block/#{disk}#{value}", nil).and_return(values[:model]) when '/device/vendor' allow(Facter::Util::FileHelper).to receive(:safe_read) .with("/sys/block/#{disk}#{value}", nil).and_return(values[:vendor]) when 'false' allow(Facter::Core::Execution).to receive(:execute) .with("lsblk -dn -o #{fact} /dev/#{disk}", { on_fail: '', timeout: 1 }) .and_return(values[fact]) end end end end context 'when all files are readable' do it 'returns disks fact' do expect(resolver.resolve(:disks)).to eql(expected_output) end end context 'when size files are not readable' do let(:expected_output) do { 'sr0' => { model: 'model1', vendor: 'vendor1', type: 'ssd', serial: 'AJDI2491AK', wwn: '239090190.0' }, 'sda' => { model: 'model2', vendor: 'vendor2', type: 'hdd', serial: 'B2EI34F1AL', wwn: '29429191.0' } } end before do paths.each_value do |value| disks.each_key do |disk| if value == '/size' allow(Facter::Util::FileHelper).to receive(:safe_read) .with("/sys/block/#{disk}#{value}", nil).and_return(nil) end end end end it 'returns disks fact' do expect(resolver.resolve(:disks)).to eql(expected_output) end end context 'when device vendor and model files are not readable' do let(:expected_output) do { 'sr0' => { size: '6.00 KiB', size_bytes: 6144, serial: 'AJDI2491AK', wwn: '239090190.0' }, 'sda' => { size: '115.50 KiB', size_bytes: 118_272, serial: 'B2EI34F1AL', wwn: '29429191.0' } } end before do paths.each_value do |value| disks.each_key do |disk| if value != '/size' allow(Facter::Util::FileHelper).to receive(:safe_read) .with("/sys/block/#{disk}#{value}", nil).and_return(nil) end end end end it 'returns disks fact' do expect(resolver.resolve(:disks)).to eql(expected_output) end end context 'when serial and wwn are not returned by lsblk' do let(:expected_output) do { 'sr0' => { size: '6.00 KiB', size_bytes: 6144, model: 'model1', vendor: 'vendor1', type: 'ssd' }, 'sda' => { size: '115.50 KiB', size_bytes: 118_272, model: 'model2', vendor: 'vendor2', type: 'hdd' } } end before do paths.each do |fact, value| disks.each_key do |disk| next unless value == 'false' allow(Facter::Core::Execution).to receive(:execute) .with("lsblk -dn -o #{fact} /dev/#{disk}", { on_fail: '', timeout: 1 }) .and_return('') end end end it 'returns disks fact' do expect(resolver.resolve(:disks)).to eql(expected_output) end end end context 'when all files inside device dir for blocks are missing' do before do disk_files.each do |disk_file| allow(File).to receive(:readable?).with("/sys/block/#{disk_file}").and_return(false) end end it 'returns disks fact as nil' do expect(resolver.resolve(:disks)).to be(nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/dmi_decode_spec.rb000066400000000000000000000033121470204764400255630ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::DmiDecode do describe '#resolve' do subject(:dmidecode) { Facter::Resolvers::DmiDecode } before do allow(Facter::Core::Execution).to receive(:execute) .with('dmidecode', { logger: instance_of(Facter::Log) }).and_return(command_output) end after { dmidecode.invalidate_cache } context 'when virtualbox hypervisor' do let(:command_output) { load_fixture('dmi_decode_virtualbox').read } it 'detects virtualbox version' do expect(dmidecode.resolve(:virtualbox_version)).to eql('6.1.4') end it 'detects virtualbox revision' do expect(dmidecode.resolve(:virtualbox_revision)).to eql('136177') end it 'does not detect vmware_version' do expect(dmidecode.resolve(:vmware_version)).to be_nil end end context 'when vmware hypervisor' do let(:command_output) { load_fixture('dmi_decode_vmware').read } it 'does not detects virtualbox version' do expect(dmidecode.resolve(:virtualbox_version)).to be_nil end it 'does not detect detects virtualbox revision' do expect(dmidecode.resolve(:virtualbox_revision)).to be_nil end it 'detect vmware_version' do expect(dmidecode.resolve(:vmware_version)).to eq('ESXi 6.7') end end context 'when dmidecode command failed' do let(:command_output) { 'command not found: dmidecode' } it 'detects virtualbox version as nil' do expect(dmidecode.resolve(:virtualbox_version)).to be(nil) end it 'detects virtualbox revision as nil' do expect(dmidecode.resolve(:virtualbox_revision)).to be(nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/dmi_spec.rb000066400000000000000000000121531470204764400242630ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Linux::DmiBios do describe '#resolve' do subject(:resolver) { Facter::Resolvers::Linux::DmiBios } let(:test_dir) { '/sys/class/dmi' } before do allow(File).to receive(:directory?).with(test_dir).and_return(true) allow(Facter::Util::FileHelper).to receive(:safe_read) .with("/sys/class/dmi/id/#{file}", nil).and_return(file_content) end after do Facter::Resolvers::Linux::DmiBios.invalidate_cache end context 'when bios_date file exists' do let(:file_content) { '12/12/2018' } let(:file) { 'bios_date' } it 'returns bios_release_date' do expect(resolver.resolve(:bios_date)).to eq(file_content) end end context 'when bios_vendor file exists' do let(:file_content) { 'Phoenix Technologies LTD' } let(:file) { 'bios_vendor' } it 'returns bios_release_date' do expect(resolver.resolve(:bios_vendor)).to eq(file_content) end end context 'when bios_version file exists' do let(:file_content) { '6.00' } let(:file) { 'bios_version' } it 'returns bios_version' do expect(resolver.resolve(:bios_version)).to eq(file_content) end end context 'when board_vendor file exists' do let(:file_content) { 'Intel Corporation' } let(:file) { 'board_vendor' } it 'returns board_manufacturer' do expect(resolver.resolve(:board_vendor)).to eq(file_content) end end context 'when board_asset_tag file exists' do let(:file_content) { 'Not Specified' } let(:file) { 'board_asset_tag' } it 'returns board_manufacturer' do expect(resolver.resolve(:board_asset_tag)).to eq(file_content) end end context 'when board_asset_tag file exists but is empty' do let(:file_content) { "\n" } let(:file) { 'board_asset_tag' } it 'returns board_manufacturer' do expect(resolver.resolve(:board_asset_tag)).to be(nil) end end context 'when board_name file exists' do let(:file_content) { '440BX Desktop Reference Platform' } let(:file) { 'board_name' } it 'returns board_product' do expect(resolver.resolve(:board_name)).to eq(file_content) end end context 'when board_serial file exists' do let(:file_content) { 'None' } let(:file) { 'board_serial' } it 'returns board_serial_number' do expect(resolver.resolve(:board_serial)).to eq(file_content) end end context 'when chassis_asset_tag file exists' do let(:file_content) { 'No Asset Tag' } let(:file) { 'chassis_asset_tag' } it 'returns chassis_asset_tag' do expect(resolver.resolve(:chassis_asset_tag)).to eq(file_content) end end context 'when chassis_type file exists' do let(:file_content) { '4' } let(:file) { 'chassis_type' } it 'returns chassis_type' do expect(resolver.resolve(:chassis_type)).to eq('Low Profile Desktop') end end context 'when sys_vendor file exists' do let(:file_content) { 'VMware, Inc.' } let(:file) { 'sys_vendor' } it ' returns sys_vendor' do expect(resolver.resolve(:sys_vendor)).to eq(file_content) end end context 'when product_name file exists' do let(:file_content) { 'VMware Virtual Platform' } let(:file) { 'product_name' } it 'returns product_name' do expect(resolver.resolve(:product_name)).to eq(file_content) end end context 'when product_version file exists' do let(:file_content) { 'VMware 6' } let(:file) { 'product_version' } it 'returns product_version' do expect(resolver.resolve(:product_version)).to eq(file_content) end end context 'when product_serial file exists' do let(:file_content) { 'VMware-42 1a 02 ea e6 27 76 b8-a1 23 a7 8a d3 12 ee cf' } let(:file) { 'product_serial' } it 'returns product_serial_number' do expect(resolver.resolve(:product_serial)).to eq(file_content) end end context 'when product_uuid file exists' do let(:file_content) { 'ea021a42-27e6-b876-a123-a78ad312eecf' } let(:file) { 'product_uuid' } it 'returns product_uuid' do expect(resolver.resolve(:product_uuid)).to eq(file_content) end end context 'when product_serial file does not exists' do let(:file_content) { nil } let(:file) { 'product_serial' } it 'returns nil' do expect(resolver.resolve(:product_serial)).to be(nil) end end context 'when product_uuid file does not exist' do let(:file_content) { nil } let(:file) { 'product_uuid' } it 'returns nil' do expect(resolver.resolve(:product_uuid)).to be(nil) end end context 'when product_name contains garbled information' do let(:file_content) { "Supermicro^L\x8DD$Pptal0\n" } let(:file) { 'sys_vendor' } it 'returns product_name with the invalid characters replaced' do expect(resolver.resolve(:sys_vendor)).to eq('Supermicro^L�D$Pptal0') end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/ec2_spec.rb000066400000000000000000000125471470204764400241720ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Ec2 do subject(:ec2) { Facter::Resolvers::Ec2 } let(:base_uri) { 'http://169.254.169.254/latest' } let(:userdata_uri) { "#{base_uri}/user-data/" } let(:metadata_uri) { "#{base_uri}/meta-data/" } let(:token_uri) { "#{base_uri}/api/token" } before do allow(Socket).to receive(:tcp) if Gem.win_platform? end after do ec2.invalidate_cache Facter::Util::Resolvers::AwsToken.reset end shared_examples_for 'ec2' do let(:paths) do { 'meta-data/' => "instance_type\nami_id\nsecurity-groups", 'meta-data/instance_type' => 'c1.medium', 'meta-data/ami_id' => 'ami-5d2dc934', 'meta-data/security-groups' => "group1\ngroup2" } end before do stub_request(:get, userdata_uri).with(headers: headers).to_return(status: 200, body: 'userdata') paths.each_pair do |path, body| stub_request(:get, "#{base_uri}/#{path}").with(headers: headers).to_return(status: 200, body: body) end end context 'with common metadata paths' do it 'recursively fetches all the ec2 metadata' do expect(ec2.resolve(:metadata)).to match( { 'instance_type' => 'c1.medium', 'ami_id' => 'ami-5d2dc934', 'security-groups' => "group1\ngroup2" } ) end it 'returns userdata' do expect(ec2.resolve(:userdata)).to eql('userdata') end it 'parses ec2 network/ directory as a multi-level hash' do network_hash = { 'network' => { 'interfaces' => { 'macs' => { '12:34:56:78:9a:bc' => { 'accountId' => '41234' } } } } } stub_request(:get, metadata_uri).with(headers: headers).to_return(status: 200, body: 'network/') stub_request(:get, "#{metadata_uri}network/") .with(headers: headers) .to_return(status: 200, body: 'interfaces/') stub_request(:get, "#{metadata_uri}network/interfaces/") .with(headers: headers) .to_return(status: 200, body: 'macs/') stub_request(:get, "#{metadata_uri}network/interfaces/macs/") .with(headers: headers) .to_return(status: 200, body: '12:34:56:78:9a:bc/') stub_request(:get, "#{metadata_uri}network/interfaces/macs/12:34:56:78:9a:bc/") .with(headers: headers) .to_return(status: 200, body: 'accountId') stub_request(:get, "#{metadata_uri}network/interfaces/macs/12:34:56:78:9a:bc/accountId") .with(headers: headers) .to_return(status: 200, body: '41234') expect(ec2.resolve(:metadata)).to match(hash_including(network_hash)) end it 'fetches the available data' do stub_request(:get, "#{metadata_uri}instance_type").with(headers: headers).to_return(status: 404) expect(ec2.resolve(:metadata)).to match( { 'instance_type' => '', 'ami_id' => 'ami-5d2dc934', 'security-groups' => "group1\ngroup2" } ) end end context 'when an exception is thrown' do before do stub_request(:get, userdata_uri).to_raise(StandardError) stub_request(:get, metadata_uri).to_raise(StandardError) end it 'returns empty ec2 metadata' do expect(ec2.resolve(:metadata)).to eql({}) end it 'returns empty ec2 userdata' do expect(ec2.resolve(:userdata)).to eql('') end end end context 'when IMDSv2' do before do stub_request(:put, token_uri).to_return(status: 200, body: token) end let(:token) { 'v2_token' } let(:headers) { { 'X-aws-ec2-metadata-token' => token } } it_behaves_like 'ec2' end context 'when IMDSv1' do before do stub_request(:put, token_uri).to_return(status: 404, body: 'Not Found') end let(:token) { nil } let(:headers) { { 'Accept' => '*/*' } } it_behaves_like 'ec2' end it 'does not add headers if token is nil' do allow(Facter::Resolvers::Ec2).to receive(:v2_token).and_return(nil) stub_request(:get, metadata_uri).with { |request| !request.headers.key?('X-aws-ec2-metadata-token') } stub_request(:get, userdata_uri).with { |request| !request.headers.key?('X-aws-ec2-metadata-token') } ec2.resolve(:userdata) end context 'when data received are ASCII-8BIT encoded' do let(:headers) { { 'Accept' => '*/*' } } it 'converts data received to UTF-8 encoding' do allow(Facter::Resolvers::Ec2).to receive(:v2_token).and_return(nil) expected_str = "nofail\xCC\xA6\"".strip bin_str = "nofail\xCC\xA6\"".strip.force_encoding(Encoding::ASCII_8BIT) stub_request(:get, userdata_uri).with(headers: headers).to_return(status: 200, body: bin_str, headers: { 'Content-Type' => 'application/octet-stream' }) stub_request(:get, metadata_uri).with { |request| !request.headers.key?('X-aws-ec2-metadata-token') } expect(ec2.resolve(:userdata)).to eql(expected_str) end end context "when a proxy is set with ENV['http_proxy']" do before do stub_const('ENV', { 'http_proxy' => 'http://example.com' }) stub_request(:put, token_uri).to_return(status: 200, body: token) end let(:headers) { { 'Accept' => '*/*' } } let(:token) { 'v2_token' } it_behaves_like 'ec2' end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/eos_release_spec.rb000066400000000000000000000007131470204764400257770ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::EosRelease do subject(:eos_release) { Facter::Resolvers::EosRelease } before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/etc/Eos-release', nil) .and_return('name version') end it 'returns name' do expect(eos_release.resolve(:name)).to eq('name') end it 'returns version' do expect(eos_release.resolve(:version)).to eq('version') end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/facterversion_spec.rb000066400000000000000000000012221470204764400263570ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Facterversion do describe '#resolve' do let(:version) { '4.0.1' } after { Facter::Resolvers::Facterversion.invalidate_cache } it 'detects facter version' do stub_const('Facter::VERSION', version) expect(Facter::Resolvers::Facterversion.resolve(:facterversion)).to eql('4.0.1') end context 'when there are new lines in the version file' do let(:version) { '4.0.2' } it 'removes them' do stub_const('Facter::VERSION', version) expect(Facter::Resolvers::Facterversion.resolve(:facterversion)).to eq('4.0.2') end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/filesystems_spec.rb000066400000000000000000000016321470204764400260610ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Linux::Filesystems do let(:systems) { 'ext2,ext3,ext4,xfs' } after do Facter::Resolvers::Linux::Filesystems.invalidate_cache end context 'when filesystems is readable' do before do allow(Facter::Util::FileHelper).to receive(:safe_readlines) .with('/proc/filesystems', nil) .and_return(load_fixture('filesystems').readlines) end it 'returns systems' do result = Facter::Resolvers::Linux::Filesystems.resolve(:systems) expect(result).to eq(systems) end end context 'when filesystems is not readable' do before do allow(Facter::Util::FileHelper).to receive(:safe_readlines) .with('/proc/filesystems', nil).and_return(nil) end it 'returns nil' do result = Facter::Resolvers::Linux::Filesystems.resolve(:systems) expect(result).to be(nil) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/fips_enabled_spec.rb000066400000000000000000000021261470204764400261240ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Linux::FipsEnabled do describe '#resolve' do before do allow(Facter::Util::FileHelper).to receive(:safe_read)\ .with('/proc/sys/crypto/fips_enabled').and_return(file_content) end after do Facter::Resolvers::Linux::FipsEnabled.invalidate_cache end context 'when fips is not enabled' do let(:file_content) { '0' } it 'returns fips is not enabled' do result = Facter::Resolvers::Linux::FipsEnabled.resolve(:fips_enabled) expect(result).to eq(false) end end context 'when fips_enabled file is missing' do let(:file_content) { '' } it 'returns fips is not enabled' do result = Facter::Resolvers::Linux::FipsEnabled.resolve(:fips_enabled) expect(result).to eq(false) end end context 'when fips is enabled' do let(:file_content) { '1' } it 'returns fips is enabled' do result = Facter::Resolvers::Linux::FipsEnabled.resolve(:fips_enabled) expect(result).to eq(true) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/freebsd/000077500000000000000000000000001470204764400235635ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/resolvers/freebsd/dmi_bios_spec.rb000066400000000000000000000053451470204764400267160ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Freebsd::DmiBios do describe '#resolve' do subject(:resolver) { Facter::Resolvers::Freebsd::DmiBios } let(:bios_date) { '12/12/2018' } let(:bios_vendor) { 'Phoenix Technologies LTD' } let(:bios_version) { '6.00' } let(:product_name) { 'VMware Virtual Platform' } let(:product_serial) { 'VMware-42 1a 02 ea e6 27 76 b8-a1 23 a7 8a d3 12 ee cf' } let(:product_uuid) { 'ea021a42-27e6-b876-a123-a78ad312eecf' } let(:sys_vendor) { 'VMware, Inc.' } before do allow(Facter::Freebsd::FfiHelper).to receive(:kenv) .with(:get, 'smbios.bios.reldate') .and_return(bios_date) allow(Facter::Freebsd::FfiHelper).to receive(:kenv) .with(:get, 'smbios.bios.vendor') .and_return(bios_vendor) allow(Facter::Freebsd::FfiHelper).to receive(:kenv) .with(:get, 'smbios.bios.version') .and_return(bios_version) allow(Facter::Freebsd::FfiHelper).to receive(:kenv) .with(:get, 'smbios.system.product') .and_return(product_name) allow(Facter::Freebsd::FfiHelper).to receive(:kenv) .with(:get, 'smbios.system.serial') .and_return(product_serial) allow(Facter::Freebsd::FfiHelper).to receive(:kenv) .with(:get, 'smbios.system.uuid') .and_return(product_uuid) allow(Facter::Freebsd::FfiHelper).to receive(:kenv) .with(:get, 'smbios.system.maker') .and_return(sys_vendor) end after do Facter::Resolvers::Freebsd::DmiBios.invalidate_cache end context 'when bios_date is available' do it 'returns bios_release_date' do expect(resolver.resolve(:bios_date)).to eq(bios_date) end end context 'when bios_vendor is available' do it 'returns bios_release_date' do expect(resolver.resolve(:bios_vendor)).to eq(bios_vendor) end end context 'when bios_version is available' do it 'returns bios_version' do expect(resolver.resolve(:bios_version)).to eq(bios_version) end end context 'when sys_vendor is available' do it ' returns sys_vendor' do expect(resolver.resolve(:sys_vendor)).to eq(sys_vendor) end end context 'when product_name is available' do it 'returns product_name' do expect(resolver.resolve(:product_name)).to eq(product_name) end end context 'when product_serial is available' do it 'returns product_serial_number' do expect(resolver.resolve(:product_serial)).to eq(product_serial) end end context 'when product_uuid is available' do it 'returns product_uuid' do expect(resolver.resolve(:product_uuid)).to eq(product_uuid) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/freebsd/ffi_helper_spec.rb000066400000000000000000000042661470204764400272350ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Freebsd::FfiHelper do describe '#sysctl_by_name' do let(:name) { 'foo.bar.baz' } let(:oldlenp) { double('FFI::MemoryPointer') } let(:oldp) { double('FFI::MemoryPointer') } context 'when expecting a string' do let(:result) { 'Hello World !' } before do allow(FFI::MemoryPointer).to receive(:new) .with(:size_t) .and_return(oldlenp) allow(Facter::Freebsd::FfiHelper::Libc).to receive(:sysctlbyname) .with(name, FFI::Pointer::NULL, oldlenp, FFI::Pointer::NULL, 0) .and_return(0) allow(oldlenp).to receive(:read) .with(:size_t) .and_return(result.length) allow(FFI::MemoryPointer).to receive(:new) .with(:uint8_t, result.length) .and_return(oldp) allow(Facter::Freebsd::FfiHelper::Libc).to receive(:sysctlbyname) .with(name, oldp, oldlenp, FFI::Pointer::NULL, 0) .and_return(0) allow(oldp).to receive(:read_string) .and_return(result) end it 'does what is expected' do expect(Facter::Freebsd::FfiHelper.sysctl_by_name(:string, name)).to eq(result) end end context 'when expecting an uint32_t' do let(:result) { 42 } let(:oldlen) { instance_double(Integer) } before do allow(FFI::MemoryPointer).to receive(:new) .with(:size_t) .and_return(oldlenp) allow(FFI).to receive(:type_size) .with(:uint32_t) .and_return(4) allow(oldlenp).to receive(:write) .with(:size_t, 4) allow(oldlenp).to receive(:read) .and_return(oldlen) allow(FFI::MemoryPointer).to receive(:new) .with(:uint8_t, oldlen) .and_return(oldp) allow(Facter::Freebsd::FfiHelper::Libc).to receive(:sysctlbyname) .with(name, oldp, oldlenp, FFI::Pointer::NULL, 0) .and_return(0) allow(oldp).to receive(:read) .with(:uint32_t) .and_return(result) end it 'does what is expected' do expect(Facter::Freebsd::FfiHelper.sysctl_by_name(:uint32_t, name)).to eq(result) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/freebsd/freebsd_version_spec.rb000066400000000000000000000015701470204764400303040ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Freebsd::FreebsdVersion do subject(:freebsd_version) { Facter::Resolvers::Freebsd::FreebsdVersion } before do allow(Facter::Core::Execution).to receive(:execute) .with('/bin/freebsd-version -k', { logger: freebsd_version.log }) .and_return("13.0-CURRENT\n") allow(Facter::Core::Execution).to receive(:execute) .with('/bin/freebsd-version -ru', { logger: freebsd_version.log }) .and_return("12.1-RELEASE-p3\n12.0-STABLE\n") end it 'returns installed kernel' do expect(freebsd_version.resolve(:installed_kernel)).to eq('13.0-CURRENT') end it 'returns running kernel' do expect(freebsd_version.resolve(:running_kernel)).to eq('12.1-RELEASE-p3') end it 'returns installed userland' do expect(freebsd_version.resolve(:installed_userland)).to eq('12.0-STABLE') end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/freebsd/geom_spec.rb000066400000000000000000000031071470204764400260520ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Freebsd::Geom do describe '#resolve' do subject(:resolver) { Facter::Resolvers::Freebsd::Geom } before do allow(Facter::Freebsd::FfiHelper).to receive(:sysctl_by_name) .with(:string, 'kern.geom.confxml') .and_return(load_fixture('kern.geom.confxml').read) end describe 'disks resolution' do let(:expected_output) do { 'ada0' => { model: 'Samsung SSD 850 PRO 512GB', serial_number: 'S250NXAG959927J', size: '476.94 GiB', size_bytes: 512_110_190_592 } } end it 'returns disks fact' do expect(resolver.resolve(:disks)).to eql(expected_output) end end describe 'partitions resolution' do let(:expected_output) do { 'ada0p1' => { partlabel: 'gptboot0', partuuid: '503d3458-c135-11e8-bd11-7d7cd061b26f', size: '512.00 KiB', size_bytes: 524_288 }, 'ada0p2' => { partlabel: 'swap0', partuuid: '5048d40d-c135-11e8-bd11-7d7cd061b26f', size: '2.00 GiB', size_bytes: 2_147_483_648 }, 'ada0p3' => { partlabel: 'zfs0', partuuid: '504f1547-c135-11e8-bd11-7d7cd061b26f', size: '474.94 GiB', size_bytes: 509_961_306_112 } } end it 'returns partitions fact' do expect(resolver.resolve(:partitions)).to eql(expected_output) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/freebsd/processors_spec.rb000066400000000000000000000021401470204764400273210ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Freebsd::Processors do subject(:resolver) { Facter::Resolvers::Freebsd::Processors } let(:logicalcount) { 2 } let(:models) do ['Intel(r) Xeon(r) Gold 6138 CPU @ 2.00GHz', 'Intel(r) Xeon(r) Gold 6138 CPU @ 2.00GHz'] end let(:speed_expected) { 2_592_000_000 } before do allow(Facter::Freebsd::FfiHelper) .to receive(:sysctl_by_name) .with(:uint32_t, 'hw.ncpu') .and_return(logicalcount) allow(Facter::Freebsd::FfiHelper) .to receive(:sysctl_by_name) .with(:string, 'hw.model') .and_return(models[0]) allow(Facter::Freebsd::FfiHelper) .to receive(:sysctl_by_name) .with(:uint32_t, 'hw.clockrate') .and_return(2592) end after do resolver.invalidate_cache end it 'returns number of processors' do expect(resolver.resolve(:logical_count)).to eq(logicalcount) end it 'returns list of models' do expect(resolver.resolve(:models)).to eq(models) end it 'returns speed of processors' do expect(resolver.resolve(:speed)).to eq(speed_expected) end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/freebsd/swap_memory_spec.rb000066400000000000000000000021141470204764400274620ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Freebsd::SwapMemory do subject(:swap_memory) { Facter::Resolvers::Freebsd::SwapMemory } let(:available_bytes) { 4_294_967_296 } let(:total_bytes) { 4_294_967_296 } let(:used_bytes) { 0 } let(:capacity) { '0%' } let(:encrypted) { true } before do allow(Facter::Core::Execution).to receive(:execute) .with('swapinfo -k', logger: an_instance_of(Facter::Log)) .and_return(load_fixture('freebsd_swapinfo').read) end it 'returns available swap memory in bytes' do expect(swap_memory.resolve(:available_bytes)).to eq(available_bytes) end it 'returns total swap memory in bytes' do expect(swap_memory.resolve(:total_bytes)).to eq(total_bytes) end it 'returns used swap memory in bytes' do expect(swap_memory.resolve(:used_bytes)).to eq(used_bytes) end it 'returns capacity of swap memory' do expect(swap_memory.resolve(:capacity)).to eq(capacity) end it 'returns true because swap memory is encrypted' do expect(swap_memory.resolve(:encrypted)).to eq(encrypted) end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/freebsd/system_memory_spec.rb000066400000000000000000000025261470204764400300430ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Freebsd::SystemMemory do subject(:system_memory) { Facter::Resolvers::Freebsd::SystemMemory } let(:available_bytes) { 2_696_462_336 } let(:total_bytes) { 17_043_554_304 } let(:used_bytes) { 14_347_091_968 } let(:capacity) { '84.18%' } before do allow(Facter::Freebsd::FfiHelper).to receive(:sysctl_by_name) .with(:long, 'vm.stats.vm.v_page_size') .and_return(4096) allow(Facter::Freebsd::FfiHelper).to receive(:sysctl_by_name) .with(:long, 'vm.stats.vm.v_page_count') .and_return(4_161_024) allow(Facter::Freebsd::FfiHelper).to receive(:sysctl_by_name) .with(:long, 'vm.stats.vm.v_active_count') .and_return(2_335_139) allow(Facter::Freebsd::FfiHelper).to receive(:sysctl_by_name) .with(:long, 'vm.stats.vm.v_wire_count') .and_return(1_167_569) end it 'returns available system memory in bytes' do expect(system_memory.resolve(:available_bytes)).to eq(available_bytes) end it 'returns total system memory in bytes' do expect(system_memory.resolve(:total_bytes)).to eq(total_bytes) end it 'returns used system memory in bytes' do expect(system_memory.resolve(:used_bytes)).to eq(used_bytes) end it 'returns memory capacity' do expect(system_memory.resolve(:capacity)).to eq(capacity) end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/freebsd/virtual_spec.rb000066400000000000000000000022731470204764400266140ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Freebsd::Virtual do subject(:jail_resolver) { Facter::Resolvers::Freebsd::Virtual } after do jail_resolver.invalidate_cache end before do allow(Facter::Freebsd::FfiHelper).to receive(:sysctl_by_name).with(:long, 'security.jail.jailed').and_return(jailed) allow(Facter::Freebsd::FfiHelper).to receive(:sysctl_by_name).with(:string, 'kern.vm_guest').and_return(vm) end let(:jailed) { 0 } let(:vm) { nil } context 'when not jailed' do context 'when running on bare metal' do it 'returns nil' do expect(jail_resolver.resolve(:vm)).to be_nil end end context 'when running in a vm' do let(:vm) { 'xen' } it 'returns xen' do expect(jail_resolver.resolve(:vm)).to eq('xenu') end end end context 'when jailed' do let(:jailed) { 1 } context 'when running on bare metal' do it 'returns jail' do expect(jail_resolver.resolve(:vm)).to eq('jail') end end context 'when running in a vm' do let(:vm) { 'xen' } it 'returns jail' do expect(jail_resolver.resolve(:vm)).to eq('jail') end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/gce_spec.rb000066400000000000000000000153771470204764400242630ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Gce do let(:gce_metadata_url) { 'http://metadata.google.internal/computeMetadata/v1/?recursive=true&alt=json' } let(:gce_url_headers) { { "Metadata-Flavor": 'Google', "Accept": 'application/json' } } before do allow(Facter::Util::Resolvers::Http).to receive(:get_request) .with(gce_metadata_url, gce_url_headers, {}, false) .and_return(http_response_body) end after do Facter::Resolvers::Gce.invalidate_cache end shared_examples 'check GCE resolver called with metadata' do context 'when http request is successful' do let(:http_response_body) { load_fixture('gce').read } let(:value) do { 'instance' => { 'attributes' => { # resolver transforms key1\nkey2 into array of keys 'ssh-keys' => [ 'john_doe:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA9D8Op48TtEiDmb+Gtna3Bs9B google-ssh {"userName":"john.doe@puppet.com","expireOn":"2020-08-13T12:17:19+0000"}', 'jane_doe:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA9D8Op48TtEiDmb+Gtna3Bs9B google-ssh {"userName":"jane.doe@puppet.com","expireOn":"2020-08-13T12:17:19+0000"}' ], 'sshKeys' => [ 'jill_doe:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA9D8Op48TtEiDmb+Gtna3Bs9B google-ssh {"userName":"jill.doe@puppet.com","expireOn":"2020-08-13T12:17:19+0000"}', 'jacob_doe:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA9D8Op48TtEiDmb+Gtna3Bs9B google-ssh {"userName":"jacob.doe@puppet.com","expireOn":"2020-08-13T12:17:19+0000"}' ] }, 'cpuPlatform' => 'Intel Broadwell', 'description' => '', 'disks' => [ { 'deviceName' => 'instance-3', 'index' => 0, 'interface' => 'SCSI', 'mode' => 'READ_WRITE', 'type' => 'PERSISTENT' } ], 'guestAttributes' => {}, 'hostname' => 'instance-3.c.facter-performance-history.internal', 'id' => 2_206_944_706_428_651_580, 'image' => 'ubuntu-2004-focal-v20200810', 'legacyEndpointAccess' => { '0.1' => 0, 'v1beta1' => 0 }, 'licenses' => [ { 'id' => '2211838267635035815' } ], 'machineType' => 'n1-standard-2', 'maintenanceEvent' => 'NONE', 'name' => 'instance-3', 'networkInterfaces' => [ { 'accessConfigs' => [ { 'externalIp' => '34.89.230.102', 'type' => 'ONE_TO_ONE_NAT' } ], 'dnsServers' => [ '169.254.169.254' ], 'forwardedIps' => [], 'gateway' => '10.156.0.1', 'ip' => '10.156.0.4', 'ipAliases' => [], 'mac' => '42:01:0a:9c:00:04', 'mtu' => 1460, 'network' => 'default', 'subnetmask' => '255.255.240.0', 'targetInstanceIps' => [] } ], 'preempted' => 'FALSE', 'remainingCpuTime' => -1, 'scheduling' => { 'automaticRestart' => 'TRUE', 'onHostMaintenance' => 'MIGRATE', 'preemptible' => 'FALSE' }, 'serviceAccounts' => { '728618928092-compute@developer.gserviceaccount.com' => { 'aliases' => [ 'default' ], 'email' => '728618928092-compute@developer.gserviceaccount.com', 'scopes' => [ 'https://www.googleapis.com/auth/devstorage.read_only', 'https://www.googleapis.com/auth/logging.write', 'https://www.googleapis.com/auth/monitoring.write', 'https://www.googleapis.com/auth/servicecontrol', 'https://www.googleapis.com/auth/service.management.readonly', 'https://www.googleapis.com/auth/trace.append' ] }, 'default' => { 'aliases' => [ 'default' ], 'email' => '728618928092-compute@developer.gserviceaccount.com', 'scopes' => [ 'https://www.googleapis.com/auth/devstorage.read_only', 'https://www.googleapis.com/auth/logging.write', 'https://www.googleapis.com/auth/monitoring.write', 'https://www.googleapis.com/auth/servicecontrol', 'https://www.googleapis.com/auth/service.management.readonly', 'https://www.googleapis.com/auth/trace.append' ] } }, 'tags' => [], 'virtualClock' => { 'driftToken' => '0' }, 'zone' => 'europe-west3-c' }, 'oslogin' => { 'authenticate' => { 'sessions' => {} } }, 'project' => { 'attributes' => { # resolver transforms key1\nkey2 into array of keys 'ssh-keys' => ['john_doe:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA9D8Op48TtEiDmb+Gtna3Bs9B google-ssh {"userName":"john.doe@puppet.com","expireOn":"2020-08-13T12:17:19+0000"}', 'jane_doe:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA9D8Op48TtEiDmb+Gtna3Bs9B google-ssh {"userName":"jane.doe@puppet.com","expireOn":"2020-08-13T12:17:19+0000"}'], 'sshKeys' => [ 'jill_doe:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA9D8Op48TtEiDmb+Gtna3Bs9B google-ssh {"userName":"jill.doe@puppet.com","expireOn":"2020-08-13T12:17:19+0000"}', 'jacob_doe:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA9D8Op48TtEiDmb+Gtna3Bs9B google-ssh {"userName":"jacob.doe@puppet.com","expireOn":"2020-08-13T12:17:19+0000"}' ] }, 'numericProjectId' => 728_618_928_092, 'projectId' => 'facter-performance-history' } } end it 'returns gce data' do result = Facter::Resolvers::Gce.resolve(:metadata) expect(result).to eq(value) end end end context 'when http request fails' do let(:http_response_body) { 'Request failed with error code: 404' } it 'returns nil' do result = Facter::Resolvers::Gce.resolve(:metadata) expect(result).to be(nil) end end describe 'with a proxy set' do before do stub_const('ENV', { 'http_proxy' => 'http://example.com' }) end it_behaves_like 'check GCE resolver called with metadata' end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/hostname_spec.rb000066400000000000000000000050351470204764400253310ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Hostname do subject(:hostname_resolver) { Facter::Resolvers::Hostname } describe '#resolve' do before do allow(Socket).to receive(:gethostname).and_return(host) allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/etc/resolv.conf') .and_return("nameserver 10.10.0.10\nnameserver 10.10.1.10\nsearch baz\ndomain baz\n") end after do hostname_resolver.invalidate_cache end context 'when hostname returns fqdn' do let(:hostname) { 'foo' } let(:domain) { 'bar' } let(:host) { "#{hostname}.#{domain}" } let(:fqdn) { "#{hostname}.#{domain}" } it 'detects hostname' do expect(hostname_resolver.resolve(:hostname)).to eql(hostname) end it 'returns networking Domain' do expect(hostname_resolver.resolve(:domain)).to eq(domain) end it 'returns fqdn' do expect(hostname_resolver.resolve(:fqdn)).to eq(fqdn) end end context 'when hostname returns host' do let(:hostname) { 'foo' } let(:domain) { 'baz' } let(:host) { hostname } let(:fqdn) { "#{hostname}.#{domain}" } before do allow(Socket).to receive(:getaddrinfo).and_return(domain) end it 'detects hostname' do expect(hostname_resolver.resolve(:hostname)).to eql(hostname) end it 'returns networking Domain' do expect(hostname_resolver.resolve(:domain)).to eq(domain) end it 'returns fqdn' do expect(hostname_resolver.resolve(:fqdn)).to eq(fqdn) end end context 'when hostname could not be retrieved' do let(:host) { nil } it 'detects that hostname is nil' do expect(hostname_resolver.resolve(:hostname)).to be(nil) end end context 'when /etc/resolve.conf is inaccessible' do let(:host) { 'foo' } let(:domain) { '' } before do allow(Facter::Util::FileHelper).to receive(:safe_read).with('/etc/resolv.conf').and_return('') allow(Socket).to receive(:getaddrinfo).and_return(domain) end it 'detects that domain is nil' do expect(hostname_resolver.resolve(:domain)).to be(nil) end end context 'when getaddrinfo throws exception' do let(:host) { 'foo' } before do allow(Socket).to receive(:getaddrinfo).and_raise('socket exception') end it 'detects domain from resolv.conf' do expect(hostname_resolver.resolve(:domain)).to eq('baz') end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/identity_spec.rb000066400000000000000000000027561470204764400253530ustar00rootroot00000000000000# frozen_string_literal: true require 'ostruct' describe Facter::Resolvers::PosxIdentity do before do allow(Etc).to receive(:getpwuid) .and_return(OpenStruct.new(name: 'test1.test2', passwd: '********', uid: 501, gid: 20, gecos: 'Test1 Test2', dir: '/Users/test1.test2', shell: '/bin/zsh', change: 0, uclass: '', expire: 0)) allow(Etc).to receive(:getgrgid) .with(20) .and_return(OpenStruct.new(name: 'staff', passwd: '*', gid: 20, mem: ['root', 'test1.test2', '_serialnumberd', 'jenkins'])) end shared_examples_for 'a resolved fact' do |fact_name, value| subject { Facter::Resolvers::PosxIdentity.resolve(fact_name) } it { is_expected.to eql(value) } end describe 'GID' do it_behaves_like 'a resolved fact', :gid, 20 end describe 'GROUP' do it_behaves_like 'a resolved fact', :group, 'staff' end describe 'PRIVILEGED' do it_behaves_like 'a resolved fact', :privileged, false end describe 'UID' do it_behaves_like 'a resolved fact', :uid, 501 end describe 'USER' do it_behaves_like 'a resolved fact', :user, 'test1.test2' end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/linux/000077500000000000000000000000001470204764400233105ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/resolvers/linux/docker_uptime_spec.rb000066400000000000000000000103601470204764400275010ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Linux::DockerUptime do subject(:resolver) { Facter::Resolvers::Linux::DockerUptime } after { Facter::Resolvers::Linux::DockerUptime.invalidate_cache } context 'when the uptime is less than 1 minutes' do before do allow(Facter::Core::Execution) .to receive(:execute) .with('ps -o etime= -p "1"', logger: an_instance_of(Facter::Log)) .and_return('20') allow(Facter::Util::Resolvers::UptimeHelper) .to receive(:create_uptime_hash) .with(20) .and_return({ days: 0, hours: 0, seconds: 20, uptime: '0:00 hours' }) end it 'returns 0 days' do expect(resolver.resolve(:days)).to eq(0) end it 'returns 0 hours' do expect(resolver.resolve(:hours)).to eq(0) end it 'returns 20 seconds' do expect(resolver.resolve(:seconds)).to eq(20) end it 'returns 0:00 hours for uptime' do expect(resolver.resolve(:uptime)).to eq('0:00 hours') end end context 'when the uptime is more than 1 minute and less than 1 hour' do before do allow(Facter::Core::Execution) .to receive(:execute) .with('ps -o etime= -p "1"', logger: an_instance_of(Facter::Log)) .and_return('10:20') allow(Facter::Util::Resolvers::UptimeHelper) .to receive(:create_uptime_hash) .with(620) .and_return({ days: 0, hours: 0, seconds: 620, uptime: '0:10 hours' }) end it 'returns 0 days' do expect(resolver.resolve(:days)).to eq(0) end it 'returns 0 hours' do expect(resolver.resolve(:hours)).to eq(0) end it 'returns 620 seconds' do expect(resolver.resolve(:seconds)).to eq(620) end it 'returns 0:10 hours for uptime' do expect(resolver.resolve(:uptime)).to eq('0:10 hours') end end context 'when the uptime is more than 1 hour but less than 1 day' do before do allow(Facter::Core::Execution) .to receive(:execute) .with('ps -o etime= -p "1"', logger: an_instance_of(Facter::Log)) .and_return('3:10:20') allow(Facter::Util::Resolvers::UptimeHelper) .to receive(:create_uptime_hash) .with(11_420) .and_return({ days: 0, hours: 3, seconds: 11_420, uptime: '3:10 hours' }) end it 'returns 0 days' do expect(resolver.resolve(:days)).to eq(0) end it 'returns 3 hours' do expect(resolver.resolve(:hours)).to eq(3) end it 'returns 11420 seconds' do expect(resolver.resolve(:seconds)).to eq(11_420) end it 'returns 3:10 hours for uptime' do expect(resolver.resolve(:uptime)).to eq('3:10 hours') end end context 'when the uptime is 1 day' do before do allow(Facter::Core::Execution) .to receive(:execute) .with('ps -o etime= -p "1"', logger: an_instance_of(Facter::Log)) .and_return('1-3:10:20') allow(Facter::Util::Resolvers::UptimeHelper) .to receive(:create_uptime_hash) .with(97_820) .and_return({ days: 1, hours: 27, seconds: 97_820, uptime: '1 day' }) end it 'returns 1 day' do expect(resolver.resolve(:days)).to eq(1) end it 'returns 27 hours' do expect(resolver.resolve(:hours)).to eq(27) end it 'returns 97820 seconds' do expect(resolver.resolve(:seconds)).to eq(97_820) end it 'returns 1 day for uptime' do expect(resolver.resolve(:uptime)).to eq('1 day') end end context 'when the uptime is more than 2 day' do before do allow(Facter::Core::Execution) .to receive(:execute) .with('ps -o etime= -p "1"', logger: an_instance_of(Facter::Log)) .and_return('2-3:10:20') allow(Facter::Util::Resolvers::UptimeHelper) .to receive(:create_uptime_hash) .with(184_220) .and_return({ days: 2, hours: 51, seconds: 184_220, uptime: '2 days' }) end it 'returns 2 days' do expect(resolver.resolve(:days)).to eq(2) end it 'returns 51 hours' do expect(resolver.resolve(:hours)).to eq(51) end it 'returns 184220 seconds' do expect(resolver.resolve(:seconds)).to eq(184_220) end it 'returns 2 days for uptime' do expect(resolver.resolve(:uptime)).to eq('2 days') end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/linux/hostname_spec.rb000066400000000000000000000202661470204764400264730ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Linux::Hostname do subject(:hostname_resolver) { Facter::Resolvers::Linux::Hostname } shared_examples 'detects values' do it 'detects hostname' do expect(hostname_resolver.resolve(:hostname)).to eq(hostname) end it 'returns networking domain' do expect(hostname_resolver.resolve(:domain)).to eq(domain) end it 'returns fqdn' do expect(hostname_resolver.resolve(:fqdn)).to eq(fqdn) end end describe '#resolve' do before do allow(Socket).to receive(:gethostname).and_return(host) allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/etc/resolv.conf') .and_return("nameserver 10.10.0.10\nnameserver 10.10.1.10\nsearch baz\ndomain baz\n") end after do hostname_resolver.invalidate_cache end context 'when ruby socket hostname works' do let(:hostname) { 'foo' } let(:domain) { 'bar' } let(:fqdn) { "#{hostname}.#{domain}" } context 'when it returns fqdn' do let(:host) { "#{hostname}.#{domain}" } it_behaves_like 'detects values' end context 'when it returns only the hostname and ruby addrinfo works' do let(:host) { hostname } let(:addr_info) { [['', '', "#{hostname}.#{domain}", '']] } before do allow(Socket).to receive(:getaddrinfo).and_return(addr_info) end it_behaves_like 'detects values' end context 'when it returns only the hostname and ruby addrinfo fails' do let(:host) { hostname } let(:output) { fqdn } before do allow(Socket).to receive(:getaddrinfo).and_return([]) allow(Facter::Util::Resolvers::Ffi::Hostname).to receive(:getffiaddrinfo).and_return(output) end it_behaves_like 'detects values' context 'when ffi addrinfo fails' do let(:output) { nil } let(:resolv_conf) { "domain #{domain}" } before do allow(Facter::Util::FileHelper).to receive(:safe_read).with('/etc/resolv.conf').and_return(resolv_conf) end it_behaves_like 'detects values' context 'when /etc/resolv.conf is empty' do let(:resolv_conf) { '' } let(:domain) { nil } let(:fqdn) { hostname } it_behaves_like 'detects values' end context 'when /etc/resolv.conf has "search ."' do let(:resolv_conf) { "search .\n" } let(:domain) { nil } let(:fqdn) { hostname } it_behaves_like 'detects values' end context 'when /etc/resolv.conf has "search ." with multiple entires' do let(:resolv_conf) { 'search . foo.bar' } let(:domain) { nil } let(:fqdn) { hostname } it_behaves_like 'detects values' end context 'when /etc/resolv.conf has "search" with multiple entires' do let(:resolv_conf) { 'search foo.bar example.com' } let(:domain) { 'foo.bar' } let(:fqdn) { "#{hostname}.#{domain}" } it_behaves_like 'detects values' end end context 'when FFI is not installed' do before do allow(Socket).to receive(:gethostname).and_return(nil) allow(Facter::Resolvers::Linux::Hostname).to receive(:require_relative).and_call_original allow(Facter::Resolvers::Linux::Hostname).to receive(:require_relative) .with('../../../facter/util/resolvers/ffi/hostname') .and_raise(LoadError, 'cannot load ffi') end it 'logs that ffi canot be loaded' do allow(hostname_resolver.log).to receive(:debug) expect(hostname_resolver.log).to receive(:debug).with('cannot load ffi') hostname_resolver.resolve(:hostname) end it 'does not resolve hostname' do expect(hostname_resolver.resolve(:hostname)).to be_nil end it 'does not resolve domain' do expect(hostname_resolver.resolve(:domain)).to be_nil end it 'does not resolve fqdn' do expect(hostname_resolver.resolve(:fqdn)).to be_nil end end end end context 'when ruby socket hostname fails' do let(:hostname) { 'hostnametest' } let(:domain) { 'domaintest' } let(:fqdn) { "#{hostname}.#{domain}" } let(:host) { '' } before do allow(Facter::Util::Resolvers::Ffi::Hostname).to receive(:getffihostname).and_return(ffi_host) end context 'when ffi hostname works' do let(:ffi_host) { fqdn } it_behaves_like 'detects values' end context 'when it returns only the hostname and ruby addrinfo works' do let(:addr_info) { [['', '', "#{hostname}.#{domain}", '']] } let(:ffi_host) { hostname } before do allow(Socket).to receive(:getaddrinfo).and_return(addr_info) end it_behaves_like 'detects values' end context 'when it returns only the hostname and ruby addrinfo fails' do let(:ffi_host) { hostname } let(:output) { fqdn } before do allow(Socket).to receive(:getaddrinfo).and_return([]) allow(Facter::Util::Resolvers::Ffi::Hostname).to receive(:getffiaddrinfo).and_return(output) end it_behaves_like 'detects values' context 'when ffi addrinfo fails' do let(:output) { nil } let(:resolv_conf) { "domain #{domain}" } before do allow(Facter::Util::FileHelper).to receive(:safe_read).with('/etc/resolv.conf').and_return(resolv_conf) end it_behaves_like 'detects values' context 'when /etc/resolv.conf is empty' do let(:resolv_conf) { '' } let(:domain) { nil } let(:fqdn) { hostname } it_behaves_like 'detects values' end end context 'when ffi is not installed' do let(:host) { hostname } let(:resolv_conf) { "domain #{domain}" } before do allow(Socket).to receive(:gethostname).and_return(host) allow(Facter::Util::FileHelper).to receive(:safe_read).with('/etc/resolv.conf').and_return(resolv_conf) allow(Facter::Resolvers::Linux::Hostname).to receive(:require_relative).and_call_original allow(Facter::Resolvers::Linux::Hostname).to receive(:require_relative) .with('../../../facter/util/resolvers/ffi/hostname') .and_raise(LoadError, 'cannot load ffi') end it 'logs that ffi canot be loaded' do allow(hostname_resolver.log).to receive(:debug) expect(hostname_resolver.log).to receive(:debug).with('cannot load ffi') hostname_resolver.resolve(:domain) end it_behaves_like 'detects values' context 'when /etc/resolv.conf is empty' do let(:resolv_conf) { '' } let(:domain) { nil } let(:fqdn) { hostname } it_behaves_like 'detects values' end end end end context 'when ffi hostname fails to return hostname' do let(:hostname) { nil } let(:domain) { nil } let(:host) { '' } let(:fqdn) { nil } before do allow(Facter::Util::Resolvers::Ffi::Hostname).to receive(:getffihostname).and_return('') end it_behaves_like 'detects values' end context 'when FFI is not installed' do let(:hostname) { nil } let(:domain) { nil } let(:host) { '' } let(:fqdn) { nil } before do allow(Facter::Resolvers::Linux::Hostname).to receive(:require_relative).and_call_original allow(Facter::Resolvers::Linux::Hostname).to receive(:require_relative) .with('../../../facter/util/resolvers/ffi/hostname') .and_raise(LoadError, 'cannot load ffi') end it 'logs that ffi canot be loaded' do allow(hostname_resolver.log).to receive(:debug) expect(hostname_resolver.log).to receive(:debug).with('cannot load ffi') hostname_resolver.resolve(:hostname) end it_behaves_like 'detects values' end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/linux/load_averages_spec.rb000066400000000000000000000020411470204764400274400ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Linux::LoadAverages do let(:load_averages) { { '1m' => 0.00, '5m' => 0.03, '15m' => 0.03 } } let(:no_load_averages) { { '1m' => nil, '5m' => nil, '15m' => nil } } after do Facter::Resolvers::Linux::LoadAverages.invalidate_cache end context 'when /proc/loadavg is accessible' do before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/proc/loadavg') .and_return(load_fixture('loadavg').read) end it 'returns load average' do result = Facter::Resolvers::Linux::LoadAverages.resolve(:load_averages) expect(result).to eq(load_averages) end end context 'when /proc/loadavg is not accessible' do before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/proc/loadavg') .and_return('') end it 'returns no load averages' do result = Facter::Resolvers::Linux::LoadAverages.resolve(:load_averages) expect(result).to eq(no_load_averages) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/linux/lscpu_spec.rb000066400000000000000000000015111470204764400257730ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Linux::Lscpu do before do allow(Facter::Core::Execution) .to receive(:execute) .with("lscpu | grep -e 'Thread(s)' -e 'Core(s)'", logger: an_instance_of(Facter::Log)) .and_return(lscpu_output) end after do Facter::Resolvers::Linux::Lscpu.invalidate_cache end let(:cores_per_socket) { 1 } let(:threads_per_core) { 2 } let(:lscpu_output) do ["'Thread(s) per core': 2", "'Cores(s) per socket': 1"].join("\n") end it 'returns cores per socket' do result = Facter::Resolvers::Linux::Lscpu.resolve(:cores_per_socket) expect(result).to eq(cores_per_socket) end it 'returns threads per core' do result = Facter::Resolvers::Linux::Lscpu.resolve(:threads_per_core) expect(result).to eq(threads_per_core) end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/linux/networking_spec.rb000066400000000000000000000275671470204764400270570ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Linux::Networking do subject(:networking_linux) { Facter::Resolvers::Linux::Networking } describe '#resolve' do before do allow(Facter::Core::Execution).to receive(:execute) .with('ip link show', logger: an_instance_of(Facter::Log)).and_return(load_fixture('ip_link_show').read) allow(Facter::Util::Linux::SocketParser).to receive(:retrieve_interfaces) .and_return(socket_interfaces) allow(Facter::Util::Linux::Dhcp).to receive(:dhcp) .with('lo', '1', an_instance_of(Facter::Log)) .and_return('10.32.22.9') allow(Facter::Util::Linux::Dhcp).to receive(:dhcp) .with('ens160', '2', an_instance_of(Facter::Log)) .and_return('10.32.22.10') allow(Facter::Util::Linux::RoutingTable).to receive(:read_routing_table) .and_return([[{ interface: 'ens192', ip: '10.16.125.217' }], []]) allow(Facter::Util::Resolvers::Networking::PrimaryInterface).to receive(:read_from_proc_route) .and_return('ens160') allow(File).to receive(:exist?).and_call_original allow(File).to receive(:exist?).with('/proc/net/if_inet6').and_return(true) allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/proc/net/if_inet6', nil).and_return(load_fixture('proc_net_if_inet6').read) allow(File).to receive(:exist?).with('/sys/class/net/lo/device').and_return(false) allow(File).to receive(:exist?).with('/sys/class/net/ens160/device').and_return(true) allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/sys/class/net/lo/operstate', nil).and_return('unknown') allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/sys/class/net/ens160/operstate', nil).and_return('up') allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/sys/class/net/ens160/speed', nil).and_return('1000') allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/sys/class/net/ens160/duplex', nil).and_return('full') end after do networking_linux.invalidate_cache end let(:socket_interfaces) do { 'lo' => { bindings: [ { address: '127.0.0.1', netmask: '255.0.0.0', network: '127.0.0.0' } ], bindings6: [ { address: '::1', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network: '::1', scope6: 'host' } ] }, 'ens160' => { bindings: [ { address: '10.16.119.155', netmask: '255.255.240.0', network: '10.16.112.0' }, { address: '10.16.127.70', netmask: '255.255.240.0', network: '10.16.112.0' } ], bindings6: [ { address: 'fe80::250:56ff:fe9a:8481', netmask: 'ffff:ffff:ffff:ffff::', network: 'fe80::', scope6: 'link' } ], mac: '00:50:56:9a:61:46' } } end let(:result) do { 'lo' => { bindings: [ { address: '127.0.0.1', netmask: '255.0.0.0', network: '127.0.0.0' } ], bindings6: [ { address: '::1', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network: '::1', scope6: 'host', flags: ['permanent'] } ], dhcp: '10.32.22.9', ip: '127.0.0.1', ip6: '::1', mtu: 65_536, netmask: '255.0.0.0', netmask6: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network: '127.0.0.0', network6: '::1', operational_state: 'unknown', physical: false, scope6: 'host' }, 'ens160' => { bindings: [ { address: '10.16.119.155', netmask: '255.255.240.0', network: '10.16.112.0' }, { address: '10.16.127.70', netmask: '255.255.240.0', network: '10.16.112.0' } ], bindings6: [ { address: 'fe80::250:56ff:fe9a:8481', netmask: 'ffff:ffff:ffff:ffff::', network: 'fe80::', scope6: 'link', flags: ['permanent'] } ], dhcp: '10.32.22.10', duplex: 'full', ip: '10.16.119.155', ip6: 'fe80::250:56ff:fe9a:8481', mac: '00:50:56:9a:61:46', mtu: 1500, netmask: '255.255.240.0', netmask6: 'ffff:ffff:ffff:ffff::', network: '10.16.112.0', network6: 'fe80::', operational_state: 'up', physical: true, scope6: 'link', speed: 1000 } } end it 'returns all the interfaces' do expect(networking_linux.resolve(:interfaces)).to eq(result) end it 'returns the primary interface' do expect(networking_linux.resolve(:primary_interface)).to eq('ens160') end context 'when caching' do it 'returns from cache' do networking_linux.resolve(:interfaces) networking_linux.resolve(:interfaces) expect(Facter::Util::Linux::SocketParser).to have_received(:retrieve_interfaces).once end end context 'when invalidate caching' do it 'resolved again the fact' do networking_linux.resolve(:interfaces) networking_linux.invalidate_cache networking_linux.resolve(:interfaces) expect(Facter::Util::Linux::SocketParser).to have_received(:retrieve_interfaces).twice end end context 'when 127.0.0.1 is first ip' do let(:socket_interfaces) do { 'ens160' => { bindings: [ { address: '127.0.0.1', netmask: '255.0.0.0', network: '10.16.112.0' }, { address: '10.16.127.70', netmask: '255.255.240.0', network: '10.16.112.0' } ], bindings6: [ { address: 'fe80::250:56ff:fe9a:8481', netmask: 'ffff:ffff:ffff:ffff::', network: 'fe80::', scope6: 'link' } ], mac: '00:50:56:9a:61:46' } } end let(:result_with_127_first) do { bindings: [ { address: '127.0.0.1', netmask: '255.0.0.0', network: '10.16.112.0' }, { address: '10.16.127.70', netmask: '255.255.240.0', network: '10.16.112.0' } ], bindings6: [ { address: 'fe80::250:56ff:fe9a:8481', netmask: 'ffff:ffff:ffff:ffff::', network: 'fe80::', scope6: 'link', flags: ['permanent'] } ], dhcp: '10.32.22.10', duplex: 'full', ip: '10.16.127.70', ip6: 'fe80::250:56ff:fe9a:8481', mac: '00:50:56:9a:61:46', mtu: 1500, netmask: '255.255.240.0', netmask6: 'ffff:ffff:ffff:ffff::', network: '10.16.112.0', network6: 'fe80::', operational_state: 'up', physical: true, scope6: 'link', speed: 1000 } end it 'resolves interface ens160' do expect(networking_linux.resolve(:interfaces)['ens160']).to eq(result_with_127_first) end end context 'when dhcp is not available on the os' do before do allow(Facter::Util::Linux::Dhcp).to receive(:dhcp).with('lo', '1', an_instance_of(Facter::Log)).and_return(nil) end it 'does not add dhcp to lo interface' do result = networking_linux.resolve(:interfaces) expect(result['lo'][:dhcp]).to be_nil end end context 'when ip route show finds an IP, Socket lib did not retrieve' do before do allow(Facter::Util::Linux::RoutingTable).to receive(:read_routing_table) .and_return([[{ interface: 'ens160', ip: '10.16.125.217' }], []]) end let(:socket_interfaces) do { 'ens160' => { bindings: [ { address: '10.16.119.155', netmask: '255.255.240.0', network: '10.16.112.0' } ], mac: '00:50:56:9a:61:46' } } end it 'adds it to the bindings list' do expected = { bindings: [ { address: '10.16.119.155', netmask: '255.255.240.0', network: '10.16.112.0' }, { address: '10.16.125.217' } ], dhcp: '10.32.22.10', duplex: 'full', ip: '10.16.119.155', mac: '00:50:56:9a:61:46', mtu: 1500, netmask: '255.255.240.0', network: '10.16.112.0', operational_state: 'up', physical: true, speed: 1000 } expect(networking_linux.resolve(:interfaces)['ens160']).to eq(expected) end end context 'when asking for primary interface' do before do allow(Facter::Util::Resolvers::Networking::PrimaryInterface).to receive(:read_from_proc_route).and_return(nil) end context 'when primary interface can not be read from /proc/net/route' do before do allow(Facter::Util::Resolvers::Networking::PrimaryInterface).to receive(:read_from_ip_route).and_return('lo') end it 'returns primary interface' do expect(networking_linux.resolve(:primary_interface)).to eq('lo') end end context 'when primary interface can not be read' do before do allow(Facter::Util::Resolvers::Networking::PrimaryInterface).to receive(:read_from_ip_route).and_return(nil) end it 'returns primary interface as the first not ignored ip' do expect(networking_linux.resolve(:primary_interface)).to eq('ens160') end end end context 'when only ipv6 is available' do let(:socket_interfaces) do { 'lo' => { bindings6: [ { address: '::1', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network: '::1', scope6: 'host' } ] }, 'ens160' => { bindings6: [ { address: 'fe80::250:56ff:fe9a:8481', netmask: 'ffff:ffff:ffff:ffff::', network: 'fe80::', scope6: 'link' } ], mac: '00:50:56:9a:61:46' } } end let(:result) do { 'lo' => { bindings6: [ { address: '::1', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network: '::1', scope6: 'host', flags: ['permanent'] } ], ip6: '::1', mtu: 65_536, netmask6: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network6: '::1', operational_state: 'unknown', physical: false, scope6: 'host' }, 'ens160' => { bindings6: [ { address: 'fe80::250:56ff:fe9a:8481', netmask: 'ffff:ffff:ffff:ffff::', network: 'fe80::', scope6: 'link', flags: ['permanent'] } ], duplex: 'full', ip6: 'fe80::250:56ff:fe9a:8481', mac: '00:50:56:9a:61:46', mtu: 1500, netmask6: 'ffff:ffff:ffff:ffff::', network6: 'fe80::', operational_state: 'up', physical: true, scope6: 'link', speed: 1000 } } end before do allow(Facter::Util::Resolvers::Networking::PrimaryInterface).to receive(:read_from_proc_route).and_return(nil) allow(Facter::Util::Resolvers::Networking::PrimaryInterface).to receive(:read_from_ip_route).and_return(nil) allow(Facter::Util::Linux::Dhcp).to receive(:dhcp).with('lo', '1', an_instance_of(Facter::Log)).and_return(nil) allow(Facter::Util::Linux::Dhcp).to receive(:dhcp).with('ens160', '2', an_instance_of(Facter::Log)).and_return(nil) allow(File).to receive(:exist?).with('/proc/net/if_inet6').and_return(true) allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/proc/net/if_inet6', nil).and_return(load_fixture('proc_net_if_inet6').read) end it 'returns all the interfaces' do expect(networking_linux.resolve(:interfaces)).to eq(result) end it 'returns the primary interface' do expect(networking_linux.resolve(:primary_interface)).to be_nil end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/load_averages_spec.rb000066400000000000000000000006661470204764400263140ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::LoadAverages do let(:load_averages) { [0.01, 0.02, 0.03] } before do allow(Facter::Util::Resolvers::Ffi::LoadAverages).to receive(:read_load_averages) .and_return(load_averages) end it 'returns load average' do result = Facter::Resolvers::LoadAverages.resolve(:load_averages) expect(result).to eq('15m' => 0.03, '1m' => 0.01, '5m' => 0.02) end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/lpar_spec.rb000066400000000000000000000011201470204764400244400ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Lpar do subject(:lpar_resolver) { Facter::Resolvers::Lpar } before do allow(Facter::Core::Execution).to receive(:execute) .with('/usr/bin/lparstat -i', logger: an_instance_of(Facter::Log)) .and_return(load_fixture('lparstat_i').read) lpar_resolver.invalidate_cache end it 'returns lpar pratition number' do expect(lpar_resolver.resolve(:lpar_partition_number)).to eq(15) end it 'returns lpar pratition name' do expect(lpar_resolver.resolve(:lpar_partition_name)).to eq('aix61-6') end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/lsb_release_spec.rb000066400000000000000000000056671470204764400260060ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::LsbRelease do after do Facter::Resolvers::LsbRelease.invalidate_cache end context 'when system is ubuntu' do before do allow(Facter::Core::Execution).to receive(:which) .with('lsb_release').and_return('/usr/bin/lsb_release') allow(Facter::Core::Execution::Popen3).to receive(:popen3e) .with({ 'LANG' => 'C', 'LC_ALL' => 'C' }, 'lsb_release -a') .and_return(["Distributor ID:\tUbuntu\nDescription:\tUbuntu 18.04.1 LTS\nRelease:\t18.04\nCodename:\tbionic\n", '', 0]) end it 'returns os Distributor ID' do result = Facter::Resolvers::LsbRelease.resolve(:distributor_id) expect(result).to eq('Ubuntu') end it 'returns distro Description' do result = Facter::Resolvers::LsbRelease.resolve(:description) expect(result).to eq('Ubuntu 18.04.1 LTS') end it 'returns distro release' do result = Facter::Resolvers::LsbRelease.resolve(:release) expect(result).to eq('18.04') end it 'returns distro Codename' do result = Facter::Resolvers::LsbRelease.resolve(:codename) expect(result).to eq('bionic') end end context 'when system is centos' do before do allow(Facter::Core::Execution).to receive(:which) .with('lsb_release').and_return('/usr/bin/lsb_release') allow(Facter::Core::Execution::Popen3).to receive(:popen3e) .with({ 'LANG' => 'C', 'LC_ALL' => 'C' }, 'lsb_release -a') .and_return([load_fixture('centos_lsb_release').read, '', 0]) end it 'returns distro Distributor ID' do result = Facter::Resolvers::LsbRelease.resolve(:distributor_id) expect(result).to eq('CentOS') end it 'returns distro Description' do result = Facter::Resolvers::LsbRelease.resolve(:description) expect(result).to eq('CentOS Linux release 7.2.1511 (Core)') end it 'returns distro release' do result = Facter::Resolvers::LsbRelease.resolve(:release) expect(result).to eq('7.2.1511') end it 'returns distro lsb release' do result = Facter::Resolvers::LsbRelease.resolve(:lsb_version) expect(result).to eq(':core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64') end it 'returns distro Codename' do result = Facter::Resolvers::LsbRelease.resolve(:codename) expect(result).to eq('Core') end end context 'when lsb_release is not installed on system' do before do allow(Facter::Core::Execution).to receive(:which) .with('lsb_release').and_return(nil) end it 'returns distro Distributor ID as nil' do result = Facter::Resolvers::LsbRelease.resolve(:distributor_id) expect(result).to eq(nil) end it 'returns that lsb_release is not installed' do result = Facter::Resolvers::LsbRelease.resolve(:lsb_release_installed) expect(result).to be_falsey end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/lspci_spec.rb000066400000000000000000000021041470204764400246170ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Lspci do subject(:lspci_resolver) { Facter::Resolvers::Lspci } before do allow(Facter::Core::Execution).to receive(:execute) .with('lspci', logger: an_instance_of(Facter::Log)).and_return(output) end after do lspci_resolver.invalidate_cache end context 'when lspci fails' do let(:output) { '' } it 'returns nil' do expect(lspci_resolver.resolve(:vm)).to be_nil end end context 'when lspci detects vmware' do let(:output) { load_fixture('lspci_vmware').read } it 'returns hypervisor name' do expect(lspci_resolver.resolve(:vm)).to eq('vmware') end end context 'when lspci detects xen' do let(:output) { load_fixture('lspci_aws').read } it 'returns hypervisor name' do expect(lspci_resolver.resolve(:vm)).to eq('xenhvm') end end context 'when lspci does not detect any hypervisor' do let(:output) { 'lspci output with no hypervisor' } it 'returns nil' do expect(lspci_resolver.resolve(:vm)).to be_nil end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/macosx/000077500000000000000000000000001470204764400234435ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/resolvers/macosx/dmi_spec.rb000066400000000000000000000010321470204764400255470ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Macosx::DmiBios do subject(:dmi_resolver) { Facter::Resolvers::Macosx::DmiBios } let(:macosx_model) { 'MacBookPro11,4' } before do allow(Facter::Core::Execution).to receive(:execute) .with('sysctl -n hw.model', logger: an_instance_of(Facter::Log)) .and_return(macosx_model) end context 'when it detects model' do it 'detects model' do expect(Facter::Resolvers::Macosx::DmiBios.resolve(:macosx_model)).to eql(macosx_model) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/macosx/filesystems_spec.rb000066400000000000000000000010711470204764400273500ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Macosx::Filesystems do subject(:filesystems_resolver) { Facter::Resolvers::Macosx::Filesystems } before do allow(Facter::Core::Execution).to receive(:execute) .with('mount', logger: an_instance_of(Facter::Log)) .and_return(load_fixture('macosx_filesystems').read) end describe '#call_the_resolver' do let(:filesystems) { 'apfs,autofs,devfs,vmhgfs' } it 'returns systems' do expect(filesystems_resolver.resolve(:macosx_filesystems)).to eq(filesystems) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/macosx/load_averages_spec.rb000066400000000000000000000010231470204764400275720ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Macosx::LoadAverages do subject(:load_averages) { Facter::Resolvers::Macosx::LoadAverages } let(:expected_result) { { '1m' => 0.00, '5m' => 0.03, '15m' => 0.03 } } before do allow(Facter::Core::Execution).to receive(:execute) .with('sysctl -n vm.loadavg', logger: an_instance_of(Facter::Log)) .and_return('{ 0.00 0.03 0.03 }') end it 'returns load average' do expect(load_averages.resolve(:load_averages)).to eq(expected_result) end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/macosx/mountpoints_spec.rb000066400000000000000000000102211470204764400273750ustar00rootroot00000000000000# frozen_string_literal: true module Sys class Filesystem class Error < StandardError; end end end describe Facter::Resolvers::Macosx::Mountpoints do let(:mount) do instance_double(Sys::Filesystem::Mount, mount_type: 'ext4', mount_point: '/proc/a', options: mount_options, name: '/dev/nvme0n1p2', dump_frequency: 0, pass_number: 0) end let(:stat) do instance_double(Sys::Filesystem::Stat, path: '/proc/a', base_type: nil, fragment_size: 4096, block_size: 4096, blocks: 113_879_332, blocks_available: 16_596_603, blocks_free: 22_398_776) end let(:fact) do { '/proc/a' => { available: '63.31 GiB', available_bytes: 67_979_685_888, capacity: '85.43%', device: '/dev/nvme0n1p2', filesystem: 'ext4', options: fact_options, size: '434.42 GiB', size_bytes: 466_449_743_872, used: '371.10 GiB', used_bytes: 398_470_057_984 } } end let(:mount_options) { 'rw' } let(:fact_options) { %w[rw] } before do allow(Facter::Util::Resolvers::FilesystemHelper).to receive(:read_mountpoints).and_return([mount]) allow(Facter::Util::Resolvers::FilesystemHelper).to receive(:read_mountpoint_stats) .with(mount.mount_point).and_return(stat) # mock sys/filesystem methods allow(stat).to receive(:bytes_total).and_return(stat.blocks * stat.fragment_size) allow(stat).to receive(:bytes_available).and_return(stat.blocks_available * stat.fragment_size) allow(stat).to receive(:bytes_free).and_return(stat.blocks_free * stat.fragment_size) allow(stat).to receive(:bytes_used).and_return(stat.bytes_total - stat.bytes_free) Facter::Resolvers::Macosx::Mountpoints.invalidate_cache end it 'correctly builds the mountpoints fact' do result = Facter::Resolvers::Macosx::Mountpoints.resolve(:mountpoints) expect(result).to match(fact) end describe '.root_device' do let(:mount_options) { 'rw,noatime' } let(:fact_options) { %w[rw noatime] } let(:mount) do instance_double(Sys::Filesystem::Mount, mount_point: '/', mount_type: 'ext4', options: mount_options, name: '/dev/root') end it 'looks up the actual device if /dev/root' do result = Facter::Resolvers::Macosx::Mountpoints.resolve(:mountpoints) expect(result['/'][:device]).to eq('/dev/root') end context 'when mountpoint cannot be accessed' do let(:fact) do { '/' => { available: '0 bytes', available_bytes: 0, capacity: '100%', device: '/dev/root', filesystem: 'ext4', options: fact_options, size: '0 bytes', size_bytes: 0, used: '0 bytes', used_bytes: 0 } } end before do allow(Facter::Util::Resolvers::FilesystemHelper).to \ receive(:read_mountpoint_stats).and_raise(Sys::Filesystem::Error) end it 'fallbacks to default values' do result = Facter::Resolvers::Macosx::Mountpoints.resolve(:mountpoints) expect(result).to eq(fact) end end end describe '.read_options' do shared_examples_for 'a valid option' do |input, output| let(:mount_options) { input } let(:fact_options) { [output] } it "transforms '#{input}' into '#{output}' to match Facter 3 output" do result = Facter::Resolvers::Macosx::Mountpoints.resolve(:mountpoints) expect(result).to match(fact) end end it_behaves_like 'a valid option', 'read-only', 'readonly' it_behaves_like 'a valid option', 'asynchronous', 'async' it_behaves_like 'a valid option', 'synchronous', 'noasync' it_behaves_like 'a valid option', 'quotas', 'quota' it_behaves_like 'a valid option', 'rootfs', 'root' it_behaves_like 'a valid option', 'defwrite', 'deferwrites' it_behaves_like 'a valid option', 'nodev', 'nodev' end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/macosx/processors_spec.rb000066400000000000000000000051031470204764400272030ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Macosx::Processors do subject(:processors_resolver) { Facter::Resolvers::Macosx::Processors } let(:logicalcount) { 4 } let(:models) do ['Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz', 'Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz', 'Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz', 'Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz'] end let(:physical_processors) { 1 } let(:speed_expected) { 2_300_000_000 } let(:cores_per_socket) { 4 } let(:threads_per_core) { 1 } before do allow(Facter::Core::Execution) .to receive(:execute) .with(query_string, logger: an_instance_of(Facter::Log)) .and_return(output) end after do processors_resolver.invalidate_cache end context 'when `sysctl` succeeds' do let(:output) do ['hw.logicalcpu_max: 4', 'hw.physicalcpu_max: 1', 'machdep.cpu.brand_string: Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz', 'hw.cpufrequency_max: 2300000000', 'machdep.cpu.core_count: 4', 'machdep.cpu.thread_count: 4'].join("\n") end let(:query_string) do 'sysctl hw.logicalcpu_max '\ 'hw.physicalcpu_max '\ 'machdep.cpu.brand_string '\ 'hw.cpufrequency_max '\ 'machdep.cpu.core_count machdep.cpu.thread_count' end it 'returns number of processors' do expect(processors_resolver.resolve(:logicalcount)).to eq(logicalcount) end it 'returns number of physical processors' do expect(processors_resolver.resolve(:physicalcount)).to eq(physical_processors) end it 'returns list of models' do expect(processors_resolver.resolve(:models)).to eq(models) end it 'returns speed of processors' do expect(processors_resolver.resolve(:speed)).to eq(speed_expected) end it 'returns number of cores per socket' do expect(processors_resolver.resolve(:cores_per_socket)).to eq(cores_per_socket) end it 'returns number of threads per core' do expect(processors_resolver.resolve(:threads_per_core)).to eq(threads_per_core) end end context 'when `sysctl` commands fail' do let(:output) do ['machdep.cpu.core_count: 4', 'machdep.cpu.thread_count: 4'].join("\n") end let(:query_string) do 'sysctl hw.logicalcpu_max '\ 'hw.physicalcpu_max '\ 'machdep.cpu.brand_string '\ 'hw.cpufrequency_max '\ 'machdep.cpu.core_count machdep.cpu.thread_count' end it 'returns available values' do expect(processors_resolver.resolve(:threads_per_core)).to eq(threads_per_core) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/macosx/swap_memory_spec.rb000066400000000000000000000022011470204764400273370ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Macosx::SwapMemory do subject(:swap_memory) { Facter::Resolvers::Macosx::SwapMemory } let(:available_bytes) { 1_729_363_968 } let(:total_bytes) { 3_221_225_472 } let(:used_bytes) { 1_491_861_504 } let(:capacity) { '46.31%' } let(:encrypted) { true } before do allow(Facter::Core::Execution).to receive(:execute) .with('sysctl -n vm.swapusage', logger: an_instance_of(Facter::Log)) .and_return('total = 3072.00M used = 1422.75M free = 1649.25M (encrypted)') end it 'returns available swap memory in bytes' do expect(swap_memory.resolve(:available_bytes)).to eq(available_bytes) end it 'returns total swap memory in bytes' do expect(swap_memory.resolve(:total_bytes)).to eq(total_bytes) end it 'returns used swap memory in bytes' do expect(swap_memory.resolve(:used_bytes)).to eq(used_bytes) end it 'returns capacity of swap memory' do expect(swap_memory.resolve(:capacity)).to eq(capacity) end it 'returns true because swap memory is encrypted' do expect(swap_memory.resolve(:encrypted)).to eq(encrypted) end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/macosx/system_memory_spec.rb000066400000000000000000000021471470204764400277220ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Macosx::SystemMemory do subject(:system_memory) { Facter::Resolvers::Macosx::SystemMemory } let(:available_bytes) { 5_590_519_808 } let(:total_bytes) { 34_359_738_368 } let(:used_bytes) { 28_769_218_560 } let(:capacity) { '83.73%' } before do allow(Facter::Core::Execution).to receive(:execute) .with('sysctl -n hw.memsize', logger: an_instance_of(Facter::Log)) .and_return('34359738368') allow(Facter::Core::Execution).to receive(:execute) .with('vm_stat', logger: an_instance_of(Facter::Log)) .and_return(load_fixture('vm_stat').read) end it 'returns available system memory in bytes' do expect(system_memory.resolve(:available_bytes)).to eq(available_bytes) end it 'returns total system memory in bytes' do expect(system_memory.resolve(:total_bytes)).to eq(total_bytes) end it 'returns used system memory in bytes' do expect(system_memory.resolve(:used_bytes)).to eq(used_bytes) end it 'returns memory capacity' do expect(system_memory.resolve(:capacity)).to eq(capacity) end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/memory_spec.rb000066400000000000000000000144531470204764400250270ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Linux::Memory do subject(:resolver) { Facter::Resolvers::Linux::Memory } after do Facter::Resolvers::Linux::Memory.invalidate_cache end context 'when file /proc/meminfo is readable' do before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/proc/meminfo', nil) .and_return(load_fixture(fixture_name).read) end context 'when there is swap memory' do let(:total) { 4_036_680 * 1024 } let(:available) { 3_659_324 * 1024 } let(:used) { total - available } let(:swap_total) { 2_097_148 * 1024 } let(:swap_free) { 2_097_148 * 1024 } let(:swap_used) { swap_total - swap_free } let(:fixture_name) { 'meminfo' } it 'returns total memory' do expect(resolver.resolve(:total)).to eq(total) end it 'returns memfree' do expect(resolver.resolve(:memfree)).to eq(available) end it 'returns swap total' do expect(resolver.resolve(:swap_total)).to eq(swap_total) end it 'returns swap available' do expect(resolver.resolve(:swap_free)).to eq(swap_free) end it 'returns swap capacity' do swap_capacity = "#{format('%.2f', swap_capacity: (swap_used / swap_total.to_f * 100))}%" expect(resolver.resolve(:swap_capacity)).to eq(swap_capacity) end it 'returns swap usage' do expect(resolver.resolve(:swap_used_bytes)).to eq(swap_used) end it 'returns system capacity' do system_capacity = "#{format('%.2f', capacity: (used / total.to_f * 100))}%" expect(resolver.resolve(:capacity)).to eq(system_capacity) end it 'returns system usage' do expect(resolver.resolve(:used_bytes)).to eq(used) end end context 'when there is not swap memory' do let(:total) { 4_134_510_592 } let(:available) { 3_665_024 * 1024 } let(:used) { total - available } let(:fixture_name) { 'meminfo2' } it 'returns total memory' do expect(resolver.resolve(:total)).to eq(total) end it 'returns memfree' do expect(resolver.resolve(:memfree)).to eq(available) end it 'returns swap total as nil' do expect(resolver.resolve(:swap_total)).to eq(nil) end it 'returns swap available as nil' do expect(resolver.resolve(:swap_free)).to eq(nil) end it 'returns swap capacity as nil' do expect(resolver.resolve(:swap_capacity)).to eq(nil) end it 'returns swap usage as nil' do expect(resolver.resolve(:swap_used_bytes)).to eq(nil) end it 'returns system capacity' do system_capacity = "#{format('%.2f', capacity: (used / total.to_f * 100))}%" expect(resolver.resolve(:capacity)).to eq(system_capacity) end it 'returns system usage' do expect(resolver.resolve(:used_bytes)).to eq(used) end end context 'when on Rhel 5' do let(:total) { 4_036_680 * 1024 } let(:available) { 3_659_324 * 1024 } let(:used) { total - available } let(:swap_total) { 2_097_148 * 1024 } let(:swap_free) { 2_097_148 * 1024 } let(:swap_used) { swap_total - swap_free } let(:fixture_name) { 'rhel5_memory' } it 'returns total memory' do expect(resolver.resolve(:total)).to eq(total) end it 'returns memfree' do expect(resolver.resolve(:memfree)).to eq(available) end it 'returns swap total' do expect(resolver.resolve(:swap_total)).to eq(swap_total) end it 'returns swap available' do expect(resolver.resolve(:swap_free)).to eq(swap_free) end it 'returns swap capacity' do swap_capacity = "#{format('%.2f', swap_capacity: (swap_used / swap_total.to_f * 100))}%" expect(resolver.resolve(:swap_capacity)).to eq(swap_capacity) end it 'returns swap usage' do expect(resolver.resolve(:swap_used_bytes)).to eq(swap_used) end it 'returns system capacity' do system_capacity = "#{format('%.2f', capacity: (used / total.to_f * 100))}%" expect(resolver.resolve(:capacity)).to eq(system_capacity) end it 'returns system usage' do expect(resolver.resolve(:used_bytes)).to eq(used) end end context 'when there is no available memory' do let(:total) { 4_036_680 * 1024 } let(:buffers) { 4_288 * 1024 } let(:cached) { 298_624 * 1024 } let(:free) { 3_547_792 * 1024 } let(:available) { free + buffers + cached } let(:used) { total - available } let(:swap_total) { 2_097_148 * 1024 } let(:swap_free) { 2_097_148 * 1024 } let(:swap_used) { swap_total - swap_free } let(:fixture_name) { 'meminfo_missing_available' } it 'returns total memory' do expect(resolver.resolve(:total)).to eq(total) end it 'returns memfree' do expect(resolver.resolve(:memfree)).to eq(available) end it 'returns swap total' do expect(resolver.resolve(:swap_total)).to eq(swap_total) end it 'returns swap available' do expect(resolver.resolve(:swap_free)).to eq(swap_free) end it 'returns swap capacity' do swap_capacity = "#{format('%.2f', swap_capacity: (swap_used / swap_total.to_f * 100))}%" expect(resolver.resolve(:swap_capacity)).to eq(swap_capacity) end it 'returns swap usage' do expect(resolver.resolve(:swap_used_bytes)).to eq(swap_used) end it 'returns system capacity' do system_capacity = "#{format('%.2f', capacity: (used / total.to_f * 100))}%" expect(resolver.resolve(:capacity)).to eq(system_capacity) end it 'returns system usage' do expect(resolver.resolve(:used_bytes)).to eq(used) end end end context 'when file /proc/meminfo is not readable' do before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/proc/meminfo', nil) .and_return(nil) end it 'returns swap available as nil' do expect(resolver.resolve(:swap_free)).to be(nil) end it 'returns system usage as nil' do expect(resolver.resolve(:used_bytes)).to be(nil) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/mountpoints_spec.rb000066400000000000000000000132011470204764400261040ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Mountpoints do let(:mount) do instance_double(Sys::Filesystem::Mount, mount_point: '/', mount_time: nil, mount_type: 'ext4', options: 'rw,noatime', name: '/dev/nvme0n1p2', dump_frequency: 0, pass_number: 0) end let(:stat) do instance_double(Sys::Filesystem::Stat, path: '/', base_type: nil, fragment_size: 4096, block_size: 4096, blocks: 113_879_332, blocks_available: -16_596_603, blocks_free: 22_398_776) end let(:fact) do [{ available: '63.31 GiB', available_bytes: 67_979_685_888, capacity: '84.64%', device: '/dev/nvme0n1p2', filesystem: 'ext4', options: %w[rw noatime], path: '/', size: '434.42 GiB', size_bytes: 466_449_743_872, used: '348.97 GiB', used_bytes: 374_704_357_376 }] end let(:ignored_mounts) do [instance_double(Sys::Filesystem::Mount, mount_type: 'ext4', mount_point: '/proc/a', name: '/dev/ignore', options: 'rw'), instance_double(Sys::Filesystem::Mount, mount_type: 'autofs', mount_point: '/mnt/auto', name: '/dev/ignore', options: 'rw')] end before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/proc/cmdline') .and_return(load_fixture('cmdline_root_device').read) allow(Facter::Util::Resolvers::FilesystemHelper).to receive(:read_mountpoints).and_return([mount]) allow(Facter::Util::Resolvers::FilesystemHelper).to receive(:read_mountpoint_stats) .with(mount.mount_point).and_return(stat) # mock sys/filesystem methods allow(stat).to receive(:bytes_total).and_return(stat.blocks * stat.fragment_size) allow(stat).to receive(:bytes_available).and_return(stat.blocks_available * stat.fragment_size) allow(stat).to receive(:bytes_free).and_return(stat.blocks_free * stat.fragment_size) allow(stat).to receive(:bytes_used).and_return(stat.bytes_total - stat.bytes_free) Facter::Resolvers::Mountpoints.invalidate_cache end it 'correctly builds the mountpoints fact' do result = Facter::Resolvers::Mountpoints.resolve(:mountpoints) expect(result).to eq(fact) end it 'drops automounts and non-tmpfs mounts under /proc or /sys' do allow(Facter::Util::Resolvers::FilesystemHelper).to receive(:read_mountpoints).and_return(ignored_mounts) result = Facter::Resolvers::Mountpoints.resolve(:mountpoints) expect(result).to be_empty end context 'when mountpoint cannot be accessed' do subject(:mountpoints) { Facter::Resolvers::Mountpoints } let(:expected_fact) do [{ available: '0 bytes', available_bytes: 0, capacity: '100%', device: '/dev/nvme0n1p2', filesystem: 'ext4', options: %w[rw noatime], path: '/', size: '0 bytes', size_bytes: 0, used: '0 bytes', used_bytes: 0 }] end before do stub_const('Sys::Filesystem::Error', StandardError) allow(Facter::Util::Resolvers::FilesystemHelper).to \ receive(:read_mountpoint_stats).with(mount.mount_point).and_raise(Sys::Filesystem::Error) end it 'logs into debug if it cannot receive mountpoints stats' do expect(Facter::Resolvers::Mountpoints.log).to receive(:debug) .with("Could not get stats for mountpoint #{mount.mount_point}, got StandardError") Facter::Resolvers::Mountpoints.resolve(:mountpoints) end it 'fallbacks to default values' do result = Facter::Resolvers::Mountpoints.resolve(:mountpoints) expect(result).to eq(expected_fact) end end describe '.root_device' do let(:mount) do instance_double(Sys::Filesystem::Mount, mount_point: '/', mount_type: 'ext4', options: 'rw,noatime', name: '/dev/root') end it 'looks up the actual device if /dev/root' do result = Facter::Resolvers::Mountpoints.resolve(:mountpoints) expect(result.first[:device]).to eq('/dev/mmcblk0p2') end context 'when /proc/cmdline is not accessible' do before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/proc/cmdline') .and_return('') end it 'returns device as nil' do result = Facter::Resolvers::Mountpoints.resolve(:mountpoints) expect(result.first[:device]).to be(nil) end end context 'when root device has partuuid' do before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/proc/cmdline') .and_return(load_fixture('cmdline_root_device_partuuid').read) allow(Facter::Core::Execution).to receive(:execute) .with('blkid', logger: an_instance_of(Facter::Log)) .and_return(load_fixture('blkid_output_root_has_partuuid').read) end it 'returns the path instead of the PARTUUID' do result = Facter::Resolvers::Mountpoints.resolve(:mountpoints) expect(result.first[:device]).to eq('/dev/xvda1') end context 'when blkid command is not available' do before do allow(Facter::Core::Execution).to receive(:execute) .with('blkid', logger: an_instance_of(Facter::Log)) .and_return('blkid: command not found') end it 'returns the partition path as PARTUUID' do result = Facter::Resolvers::Mountpoints.resolve(:mountpoints) expect(result.first[:device]).to eq('PARTUUID=a2f52878-01') end end end end describe 'resolver key not found' do it 'returns nil when resolver cannot find key' do expect(Facter::Resolvers::Mountpoints.resolve(:inexistent_key)).to be_nil end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/networking_spec.rb000066400000000000000000000147411470204764400257060ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Networking do subject(:networking) { Facter::Resolvers::Networking } describe '#resolve' do before do allow(Facter::Util::Resolvers::Networking::PrimaryInterface) .to receive(:read_from_route) .and_return(primary) allow(Facter::Core::Execution) .to receive(:execute).with('ifconfig -a', logger: an_instance_of(Facter::Log)).and_return(interfaces) allow(Facter::Core::Execution) .to receive(:execute).with('ipconfig getoption en0 server_identifier', logger: an_instance_of(Facter::Log)).and_return(dhcp) allow(Facter::Core::Execution) .to receive(:execute).with('ipconfig getoption en0.1 server_identifier', logger: an_instance_of(Facter::Log)).and_return(dhcp) allow(Facter::Core::Execution) .to receive(:execute).with('ipconfig getoption llw0 server_identifier', logger: an_instance_of(Facter::Log)).and_return('') allow(Facter::Core::Execution) .to receive(:execute).with('ipconfig getoption awdl0 server_identifier', logger: an_instance_of(Facter::Log)).and_return(dhcp) end after do networking.invalidate_cache end let(:interfaces) { load_fixture('ifconfig_mac').read } let(:dhcp) { '192.168.143.1' } let(:primary) { 'en0' } it 'detects primary interface' do expect(networking.resolve(:primary_interface)).to eq('en0') end it 'detects the primary interface dhcp server ip' do expect(networking.resolve(:dhcp)).to eq('192.168.143.1') end it 'detects all interfaces' do expected = %w[lo0 gif0 stf0 en0 en0.1 en1 en2 bridge0 p2p0 awdl0 llw0 utun0 utun1 utun2 utun3 ib0 ib1] expect(networking.resolve(:interfaces).keys).to match_array(expected) end it 'checks that interface lo0 has the expected keys' do expected = %i[mtu bindings6 bindings ip ip6 netmask netmask6 network network6 scope6] expect(networking.resolve(:interfaces)['lo0'].keys).to match_array(expected) end it 'checks that interface lo0 has the expected mtu' do expect(networking.resolve(:interfaces)['lo0']).to include({ mtu: 16_384 }) end it 'checks that interface lo0 has the expected bindings' do expected = { bindings: [{ address: '127.0.0.1', netmask: '255.0.0.0', network: '127.0.0.0' }] } expect(networking.resolve(:interfaces)['lo0']).to include(expected) end it 'checks interface lo0 has the expected bindings6' do expected = { bindings6: [{ address: '::1', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network: '::1', scope6: 'host' }, { address: 'fe80::1', netmask: 'ffff:ffff:ffff:ffff::', network: 'fe80::', scope6: 'link' }] } expect(networking.resolve(:interfaces)['lo0']).to include(expected) end it 'checks that interface lo0 has the expected scope6' do expect(networking.resolve(:interfaces)['lo0']).to include({ scope6: 'host' }) end it 'detects interface en1' do expected = { mtu: 1500, mac: '82:17:0e:93:9d:00' } expect(networking.resolve(:interfaces)['en1']).to eq(expected) end it 'detects interface gif0' do expected = { mtu: 1280 } expect(networking.resolve(:interfaces)['gif0']).to eq(expected) end it 'checks that interface en0 has the expected keys' do expected = %i[mtu mac bindings ip netmask network dhcp] expect(networking.resolve(:interfaces)['en0'].keys).to match_array(expected) end it 'checks that interface en0 has the expected mtu' do expected = { mtu: 1500 } expect(networking.resolve(:interfaces)['en0']).to include(expected) end it 'checks that interface en0 has the expected dhcp' do expected = { dhcp: '192.168.143.1' } expect(networking.resolve(:interfaces)['en0']).to include(expected) end it 'checks interface en0 has the expected mac' do expected = { mac: '64:5a:ed:ea:5c:81' } expect(networking.resolve(:interfaces)['en0']).to include(expected) end it 'checks that interface en0 has the expected bindings6' do expected = { bindings: [{ address: '192.168.143.212', netmask: '255.255.255.0', network: '192.168.143.0' }] } expect(networking.resolve(:interfaces)['en0']).to include(expected) end it 'checks interface bridge0' do expected = { mtu: 1500, mac: '82:17:0e:93:9d:00' } expect(networking.resolve(:interfaces)['bridge0']).to include(expected) end it 'checks that interface llw0 has no dhcp' do expected = { dhcp: '192.168.143.1' } expect(networking.resolve(:interfaces)['llw0']).not_to include(expected) end it 'checks that interface awdl0 has the expected keys' do expected = %i[mtu mac bindings6 ip6 netmask6 network6 scope6 dhcp] expect(networking.resolve(:interfaces)['awdl0'].keys).to match_array(expected) end it 'checks that interface awdl0 has dhcp' do expected = { dhcp: '192.168.143.1' } expect(networking.resolve(:interfaces)['awdl0']).to include(expected) end it 'checks interface utun2' do expected = { bindings: [{ address: '10.16.132.213', netmask: '255.255.254.0', network: '10.16.132.0' }] } expect(networking.resolve(:interfaces)['utun2']).to include(expected) end it 'checks interface utun3' do expected = { bindings6: [ { address: '2001:db8:cafe::132:213', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network: '2001:db8:cafe::132:213', scope6: 'global' } ] } expect(networking.resolve(:interfaces)['utun3']).to include(expected) end it 'checks interface ib0 has the expected mac' do expected = { mac: '80:00:02:08:FA:81:00:00:00:00:00:00:00:00:00:00:00:00:00:00' } expect(networking.resolve(:interfaces)['ib0']).to include(expected) end context 'when primary interface could not be retrieved' do let(:primary) { nil } it 'returns primary interface as from interfaces' do expect(networking.resolve(:primary_interface)).to eq('en0') end end context 'when dhcp server ip could not be retrieved' do let(:dhcp) { 'invalid output' } it 'returns dhcp server ip as nil' do expect(networking.resolve(:dhcp)).to be(nil) end end context 'when interfaces could not be retrieved' do let(:interfaces) { +'invalid output' } it 'returns interfaces as nil' do expect(networking.resolve(:interfaces)).to be(nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/open_vz_spec.rb000066400000000000000000000037731470204764400252020ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::OpenVz do subject(:openvz_resolver) { Facter::Resolvers::OpenVz } let(:vz_dir) { true } let(:list_executable) { false } after do openvz_resolver.invalidate_cache end before do allow(Dir).to receive(:exist?).with('/proc/vz').and_return(vz_dir) allow(File).to receive(:file?).with('/proc/lve/list').and_return(list_executable) allow(Dir).to receive(:entries).with('/proc/vz').and_return(vz_dir_entries) end context 'when /proc/vz dir is empty' do let(:vz_dir_entries) { ['.', '..'] } it 'returns nil for vm' do expect(openvz_resolver.resolve(:vm)).to be_nil end it 'returns nil for container id' do expect(openvz_resolver.resolve(:id)).to be_nil end end context 'when /proc/vz dir is not empty' do let(:vz_dir_entries) { ['.', '..', 'some_file.txt'] } before do allow(Facter::Util::FileHelper).to receive(:safe_readlines).with('/proc/self/status', nil).and_return(status_file) end context 'when /proc/self/status is nil' do let(:status_file) { nil } it 'returns nil for vm' do expect(openvz_resolver.resolve(:vm)).to be_nil end it 'returns nil for container id' do expect(openvz_resolver.resolve(:id)).to be_nil end end context 'when /proc/self/status is readable and openvz host' do let(:status_file) { load_fixture('proc_self_status_host').readlines } it 'returns openvzhn' do expect(openvz_resolver.resolve(:vm)).to eql('openvzhn') end it 'returns container id' do expect(openvz_resolver.resolve(:id)).to eql('0') end end context 'when /proc/self/status is readable' do let(:status_file) { load_fixture('proc_self_status').readlines } it 'returns openvzhn' do expect(openvz_resolver.resolve(:vm)).to eql('openvzve') end it 'returns container id' do expect(openvz_resolver.resolve(:id)).to eql('101') end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/openbsd/000077500000000000000000000000001470204764400236035ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/resolvers/openbsd/dmi_bios_spec.rb000066400000000000000000000046111470204764400267310ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Openbsd::DmiBios do describe '#resolve' do subject(:resolver) { Facter::Resolvers::Openbsd::DmiBios } let(:bios_vendor) { 'Phoenix Technologies LTD' } let(:bios_version) { '6.00' } let(:product_name) { 'VMware Virtual Platform' } let(:product_serial) { 'VMware-42 1a 02 ea e6 27 76 b8-a1 23 a7 8a d3 12 ee cf' } let(:product_uuid) { 'ea021a42-27e6-b876-a123-a78ad312eecf' } let(:sys_vendor) { 'Phoenix Technologies LTD' } before do allow(Facter::Bsd::FfiHelper) .to receive(:sysctl) .with(:string, [6, 14]) .and_return(bios_vendor) allow(Facter::Bsd::FfiHelper) .to receive(:sysctl) .with(:string, [6, 16]) .and_return(bios_version) allow(Facter::Bsd::FfiHelper) .to receive(:sysctl) .with(:string, [6, 15]) .and_return(product_name) allow(Facter::Bsd::FfiHelper) .to receive(:sysctl) .with(:string, [6, 17]) .and_return(product_serial) allow(Facter::Bsd::FfiHelper) .to receive(:sysctl) .with(:string, [6, 18]) .and_return(product_uuid) allow(Facter::Bsd::FfiHelper) .to receive(:sysctl) .with(:string, [6, 14]) .and_return(sys_vendor) end after do Facter::Resolvers::Openbsd::DmiBios.invalidate_cache end context 'when bios_vendor is available' do it 'returns bios_release_date' do expect(resolver.resolve(:bios_vendor)).to eq(bios_vendor) end end context 'when bios_version is available' do it 'returns bios_version' do expect(resolver.resolve(:bios_version)).to eq(bios_version) end end context 'when sys_vendor is available' do it ' returns sys_vendor' do expect(resolver.resolve(:sys_vendor)).to eq(sys_vendor) end end context 'when product_name is available' do it 'returns product_name' do expect(resolver.resolve(:product_name)).to eq(product_name) end end context 'when product_serial is available' do it 'returns product_serial_number' do expect(resolver.resolve(:product_serial)).to eq(product_serial) end end context 'when product_uuid is available' do it 'returns product_uuid' do expect(resolver.resolve(:product_uuid)).to eq(product_uuid) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/openbsd/mountpoints_spec.rb000066400000000000000000000027701470204764400275470ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Openbsd::Mountpoints do let(:mountpoints) do { '/' => { available: '738.97 MiB', available_bytes: 774_868_992, capacity: '20.04%', device: '/dev/sd0a', filesystem: 'ffs', options: ['local'], size: '985.76 MiB', size_bytes: 1_033_648_128, used: '197.50 MiB', used_bytes: 207_097_856 }, '/usr' => { available: '157.56 MiB', available_bytes: 165_216_256, capacity: '79.02%', device: '/dev/sd0d', filesystem: 'ffs', options: %w[local nodev], size: '985.76 MiB', size_bytes: 1_033_648_128, used: '778.91 MiB', used_bytes: 816_750_592 }, '/usr/local' => { available: '1.10 GiB', available_bytes: 1_178_118_144, capacity: '57.17%', device: '/dev/sd0e', filesystem: 'ffs', options: %w[local nodev wxallowed], size: '2.90 GiB', size_bytes: 3_114_448_896, used: '1.66 GiB', used_bytes: 1_780_609_024 } } end before do allow(Facter::Core::Execution).to receive(:execute) .with('mount', logger: an_instance_of(Facter::Log)) .and_return(load_fixture('openbsd_filesystems').read) allow(Facter::Core::Execution).to receive(:execute) .with('df -P', logger: an_instance_of(Facter::Log)) .and_return(load_fixture('openbsd_df').read) end it 'returns mountpoints' do result = Facter::Resolvers::Openbsd::Mountpoints.resolve(:mountpoints) expect(result).to eq(mountpoints) end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/os_release_spec.rb000066400000000000000000000114621470204764400256350ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::OsRelease do after do Facter::Resolvers::OsRelease.invalidate_cache end before do Facter::Resolvers::OsRelease.invalidate_cache allow(Facter::Util::FileHelper).to receive(:safe_readlines) .with('/etc/os-release') .and_return(os_release_content) end context 'when on Ubuntu' do let(:os_release_content) { load_fixture('os_release').readlines } it 'returns os NAME' do result = Facter::Resolvers::OsRelease.resolve(:name) expect(result).to eq('Ubuntu') end it 'returns os PRETTY_NAME' do result = Facter::Resolvers::OsRelease.resolve(:pretty_name) expect(result).to eq('Ubuntu 18.04.1 LTS') end it 'returns os VERSION_ID' do result = Facter::Resolvers::OsRelease.resolve(:version_id) expect(result).to eq('18.04') end it 'returns os VERSION_CODENAME' do result = Facter::Resolvers::OsRelease.resolve(:version_codename) expect(result).to eq('bionic') end it 'returns os id' do result = Facter::Resolvers::OsRelease.resolve(:id) expect(result).to eq('') end end context 'when /etc/os-release file is not readable' do let(:os_release_content) { [] } it 'returns nil' do result = Facter::Resolvers::OsRelease.resolve(:version_codename) expect(result).to be(nil) end end context 'when /etc/os-release file has comment' do let(:os_release_content) { load_fixture('os_release_redhat_linux_with_comment').readlines } it 'does not raise an exception' do expect { Facter::Resolvers::OsRelease.resolve(:name) }.not_to raise_error end end context 'when on Debian' do let(:os_release_content) { load_fixture('os_release_debian').readlines } it 'returns os NAME' do result = Facter::Resolvers::OsRelease.resolve(:name) expect(result).to eq('Debian') end it 'returns os PRETTY_NAME' do result = Facter::Resolvers::OsRelease.resolve(:pretty_name) expect(result).to eq('Debian GNU/Linux 10 (buster)') end it 'returns os VERSION_ID with padded 0' do result = Facter::Resolvers::OsRelease.resolve(:version_id) expect(result).to eq('10.0') end it 'returns os VERSION_CODENAME' do result = Facter::Resolvers::OsRelease.resolve(:version_codename) expect(result).to eq('buster') end it 'returns os id' do result = Facter::Resolvers::OsRelease.resolve(:id) expect(result).to eq('debian') end end context 'when on opensuse-leap' do let(:os_release_content) { load_fixture('os_release_opensuse-leap').readlines } it 'returns os id' do result = Facter::Resolvers::OsRelease.resolve(:id) expect(result).to eq('opensuse') end context 'when opensuse identifier is capitalized' do it 'returns os id' do os_release_content[2] = 'ID="Opensuse-Leap"' result = Facter::Resolvers::OsRelease.resolve(:id) expect(result).to eq('opensuse') end end end context 'when on Oracle Linux' do let(:os_release_content) { load_fixture('os_release_oracle_linux').readlines } it 'returns os NAME' do result = Facter::Resolvers::OsRelease.resolve(:name) expect(result).to eq('OracleLinux') end end context 'when on Archlinux' do let(:os_release_content) { load_fixture('os_release_archlinux').readlines } it 'returns os NAME' do result = Facter::Resolvers::OsRelease.resolve(:name) expect(result).to eq('Archlinux') end end context 'when on SLES' do let(:os_release_content) { load_fixture('os_release_sles').readlines } it 'returns os NAME' do result = Facter::Resolvers::OsRelease.resolve(:name) expect(result).to eq('SLES') end end context 'when on SLES_SAP' do let(:os_release_content) { load_fixture('os_release_sles_sap').readlines } it 'returns os NAME' do result = Facter::Resolvers::OsRelease.resolve(:name) expect(result).to eq('SLES') end it 'returns os ID' do result = Facter::Resolvers::OsRelease.resolve(:id) expect(result).to eq('sles') end end context 'when on Manjarolinux' do let(:os_release_content) { load_fixture('os_release_manjarolinux').readlines } it 'returns os NAME' do result = Facter::Resolvers::OsRelease.resolve(:name) expect(result).to eq('Manjarolinux') end it "doesn't pad a non-existent version_id" do result = Facter::Resolvers::OsRelease.resolve(:version_id) expect(result).to be_nil end end context 'when on VirtuozzoLinux' do let(:os_release_content) { load_fixture('os_release_virtuozzolinux').readlines } it 'returns os NAME' do result = Facter::Resolvers::OsRelease.resolve(:name) expect(result).to eq('VirtuozzoLinux') end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/partitions_spec.rb000066400000000000000000000227511470204764400257130ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Partitions do subject(:resolver) { Facter::Resolvers::Partitions } let(:sys_block_path) { '/sys/block' } let(:sys_block_subdirs) { ['.', '..', 'sda'] } before do Facter::Resolvers::Partitions.invalidate_cache end context 'when /sys/block is not readable' do before do allow(File).to receive(:readable?).with(sys_block_path).and_return(false) end it 'returns empty hash' do expect(resolver.resolve(:partitions)).to be(nil) end end context 'when /sys/block has no entries' do before do allow(File).to receive(:readable?).with(sys_block_path).and_return(true) allow(Dir).to receive(:entries).with(sys_block_path).and_return(['.', '..']) end it 'returns empty hash' do expect(resolver.resolve(:partitions)).to be(nil) end end context 'when /sys/block is readable' do before do allow(File).to receive(:readable?).with(sys_block_path).and_return(true) allow(Dir).to receive(:entries).with(sys_block_path).and_return(sys_block_subdirs) allow(Facter::Core::Execution).to receive(:which) .with('blkid').and_return('/usr/bin/blkid') allow(Facter::Core::Execution).to receive(:execute) .with('blkid', logger: an_instance_of(Facter::Log)).and_return(load_fixture('blkid_output').read) allow(Facter::Core::Execution).to receive(:which) .with('lsblk').and_return('/usr/bin/lsblk') allow(Facter::Core::Execution).to receive(:execute) .with('lsblk --version 2>&1', logger: an_instance_of(Facter::Log)).and_return('lsblk from util-linux 2.24') allow(Facter::Core::Execution).to receive(:execute) .with('lsblk -p -P -o NAME,FSTYPE,LABEL,UUID,PARTUUID,PARTLABEL', logger: an_instance_of(Facter::Log)).and_return(load_fixture('lsblk_output_old').read) end context 'when block has a device subdir' do let(:sda_subdirs) do ['/sys/block/sda/queue', '/sys/block/sda/sda2', '/sys/block/sda/sda2/stat', '/sys/block/sda/sda2/dev', '/sys/block/sda/sda2/uevent', '/sys/block/sda/sda1'] end before do allow(File).to receive(:directory?).with("#{sys_block_path}/sda/device").and_return(true) allow(Dir).to receive(:[]).with("#{sys_block_path}/sda/**/*").and_return(sda_subdirs) sda_subdirs.each { |subdir| allow(File).to receive(:directory?).with(subdir).and_return(true) } allow(Facter::Util::FileHelper).to receive(:safe_read) .with("#{sys_block_path}/sda/sda2/size", '0').and_return('201213') allow(Facter::Util::FileHelper).to receive(:safe_read) .with("#{sys_block_path}/sda/sda1/size", '0').and_return('234') end context 'when there is more than one partition' do it 'checks for blkid only once' do resolver.resolve(:partitions) expect(Facter::Core::Execution).to have_received(:which).with('blkid').at_most(:once) end it 'checks for lsblk only once' do resolver.resolve(:partitions) expect(Facter::Core::Execution).to have_received(:which).with('lsblk').at_most(:once) end end context 'when device size files are readable' do let(:partitions) do { '/dev/sda1' => { filesystem: 'ext3', label: '/boot', size: '117.00 KiB', size_bytes: 119_808, uuid: '88077904-4fd4-476f-9af2-0f7a806ca25e', partuuid: '00061fe0-01' }, '/dev/sda2' => { filesystem: 'LVM2_member', size: '98.25 MiB', size_bytes: 103_021_056, uuid: 'edi7s0-2WVa-ZBan' } } end it 'return partitions fact' do expect(resolver.resolve(:partitions)).to eq(partitions) end end context 'when device size files are not readable' do let(:partitions_with_no_sizes) do { '/dev/sda1' => { filesystem: 'ext3', label: '/boot', size: '0 bytes', size_bytes: 0, uuid: '88077904-4fd4-476f-9af2-0f7a806ca25e', partuuid: '00061fe0-01' }, '/dev/sda2' => { filesystem: 'LVM2_member', size: '0 bytes', size_bytes: 0, uuid: 'edi7s0-2WVa-ZBan' } } end before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with("#{sys_block_path}/sda/sda2/size", '0').and_return('') allow(Facter::Util::FileHelper).to receive(:safe_read) .with("#{sys_block_path}/sda/sda1/size", '0').and_return('') end it 'return partitions fact with 0 sizes' do result = resolver.resolve(:partitions) expect(result).to eq(partitions_with_no_sizes) end end end context 'when block has a dm subdir' do before do allow(File).to receive(:directory?).with("#{sys_block_path}/sda/device").and_return(false) allow(File).to receive(:directory?).with("#{sys_block_path}/sda/dm").and_return(true) allow(Facter::Util::FileHelper).to receive(:safe_read) .with("#{sys_block_path}/sda/dm/name").and_return('VolGroup00-LogVol00') allow(Facter::Util::FileHelper).to receive(:safe_read) .with("#{sys_block_path}/sda/size", '0').and_return('201213') end context 'when device name file is readable' do let(:partitions) do { '/dev/mapper/VolGroup00-LogVol00' => { filesystem: 'ext3', size: '98.25 MiB', size_bytes: 103_021_056, uuid: '1bd8643b-483a-4fdc-adcd-c586384919a8' } } end it 'return partitions fact' do expect(resolver.resolve(:partitions)).to eq(partitions) end end context 'when device name file is not readable' do let(:partitions) do { '/dev/sda' => { size: '98.25 MiB', size_bytes: 103_021_056 } } end before do allow(Facter::Util::FileHelper).to receive(:safe_read).with("#{sys_block_path}/sda/dm/name").and_return('') end it 'return partitions fact with no device name' do result = resolver.resolve(:partitions) expect(result).to eq(partitions) end end end context 'when block has a loop subdir' do before do allow(File).to receive(:directory?).with("#{sys_block_path}/sda/device").and_return(false) allow(File).to receive(:directory?).with("#{sys_block_path}/sda/dm").and_return(false) allow(File).to receive(:directory?).with("#{sys_block_path}/sda/loop").and_return(true) allow(Facter::Util::FileHelper).to receive(:safe_read) .with("#{sys_block_path}/sda/loop/backing_file").and_return('some_path') allow(Facter::Util::FileHelper).to receive(:safe_read) .with("#{sys_block_path}/sda/size", '0').and_return('201213') end context 'when backing_file is readable' do let(:partitions) do { '/dev/sda' => { backing_file: 'some_path', size: '98.25 MiB', size_bytes: 103_021_056 } } end it 'returns partitions fact' do expect(resolver.resolve(:partitions)).to eq(partitions) end end context 'when backing_file is not readable' do let(:partitions) do { '/dev/sda' => { size: '98.25 MiB', size_bytes: 103_021_056 } } end before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with("#{sys_block_path}/sda/loop/backing_file").and_return('') end it 'returns partitions fact' do result = resolver.resolve(:partitions) expect(result).to eq(partitions) end end end context 'when lsblk can read partition types' do let(:partitions) do { '/dev/sda1' => { filesystem: 'ext3', label: '/boot', parttype: '21686148-6449-6E6F-744E-656564454649', size: '117.00 KiB', size_bytes: 119_808, uuid: '88077904-4fd4-476f-9af2-0f7a806ca25e', partuuid: '00061fe0-01' }, '/dev/sda2' => { filesystem: 'LVM2_member', parttype: '0fc63daf-8483-4772-8e79-3d69d8477de4', size: '98.25 MiB', size_bytes: 103_021_056, uuid: 'edi7s0-2WVa-ZBan' } } end let(:sda_subdirs) do ['/sys/block/sda/queue', '/sys/block/sda/sda2', '/sys/block/sda/sda2/stat', '/sys/block/sda/sda2/dev', '/sys/block/sda/sda2/uevent', '/sys/block/sda/sda1'] end before do allow(File).to receive(:directory?).with("#{sys_block_path}/sda/device").and_return(true) allow(Dir).to receive(:[]).with("#{sys_block_path}/sda/**/*").and_return(sda_subdirs) sda_subdirs.each { |subdir| allow(File).to receive(:directory?).with(subdir).and_return(true) } allow(Facter::Util::FileHelper).to receive(:safe_read) .with("#{sys_block_path}/sda/sda2/size", '0').and_return('201213') allow(Facter::Util::FileHelper).to receive(:safe_read) .with("#{sys_block_path}/sda/sda1/size", '0').and_return('234') end it 'return partitions fact with part_type' do allow(Facter::Core::Execution).to receive(:execute) .with('lsblk --version 2>&1', logger: an_instance_of(Facter::Log)).and_return('lsblk from util-linux 2.25') allow(Facter::Core::Execution).to receive(:execute) .with('lsblk -p -P -o NAME,FSTYPE,UUID,LABEL,PARTUUID,PARTLABEL,PARTTYPE', logger: an_instance_of(Facter::Log)).and_return(load_fixture('lsblk_output_new').read) expect(resolver.resolve(:partitions)).to eq(partitions) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/path_spec.rb000066400000000000000000000003251470204764400244440ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Path do describe '#resolve path' do it 'detects path' do expect(Facter::Resolvers::Path.resolve(:path)).to eql(ENV['PATH']) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/processors_spec.rb000066400000000000000000000161711470204764400257200ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Linux::Processors do after do Facter::Resolvers::Linux::Processors.invalidate_cache Facter::Resolvers::Uname.invalidate_cache end context 'when on x86 architecture' do let(:processors) { 4 } let(:models) do ['Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz', 'Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz', 'Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz', 'Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz'] end let(:physical_processors) { 1 } context 'when cpuinfo file is readable' do before do allow(Facter::Util::FileHelper).to receive(:safe_readlines) .with('/proc/cpuinfo') .and_return(load_fixture('cpuinfo').readlines) end let(:speed) { 2_294_000_000 } let(:extensions) do %w[x86_64 x86_64-v1 x86_64-v2 x86_64-v3] end it 'returns number of processors' do result = Facter::Resolvers::Linux::Processors.resolve(:processors) expect(result).to eq(processors) end it 'returns list of models' do result = Facter::Resolvers::Linux::Processors.resolve(:models) expect(result).to eq(models) end it 'returns number of physical processors' do result = Facter::Resolvers::Linux::Processors.resolve(:physical_count) expect(result).to eq(physical_processors) end it 'returns cpu speed' do result = Facter::Resolvers::Linux::Processors.resolve(:speed) expect(result).to eq(speed) end it 'returns extensions supported' do allow(Facter::Resolvers::Uname).to receive(:resolve) .with(:processor) .and_return('x86_64') result = Facter::Resolvers::Linux::Processors.resolve(:extensions) expect(result).to eq(extensions) end end context 'when cpuinfo file is readable but no physical id' do before do allow(Facter::Util::FileHelper).to receive(:safe_readlines) .with('/proc/cpuinfo') .and_return(load_fixture('cpuinfo_wo_physical_id').readlines) allow(Dir).to receive(:entries).and_call_original allow(Dir).to receive(:entries).with('/sys/devices/system/cpu').and_return(%w[cpu0 cpu1 cpuindex]) allow(File).to receive(:exist?).and_call_original allow(File).to receive(:exist?) .with('/sys/devices/system/cpu/cpu0/topology/physical_package_id') .and_return(true) allow(File).to receive(:exist?) .with('/sys/devices/system/cpu/cpu1/topology/physical_package_id') .and_return(true) allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/sys/devices/system/cpu/cpu0/topology/physical_package_id') .and_return('0') allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/sys/devices/system/cpu/cpu1/topology/physical_package_id') .and_return('1') end after do Facter::Resolvers::Linux::Processors.invalidate_cache Facter::Resolvers::Uname.invalidate_cache end let(:physical_processors) { 2 } it 'returns number of processors' do result = Facter::Resolvers::Linux::Processors.resolve(:processors) expect(result).to eq(processors) end it 'returns list of models' do result = Facter::Resolvers::Linux::Processors.resolve(:models) expect(result).to eq(models) end it 'returns number of physical processors' do result = Facter::Resolvers::Linux::Processors.resolve(:physical_count) expect(result).to eq(physical_processors) end end context 'when cpuinfo is not readable' do before do allow(Facter::Util::FileHelper).to receive(:safe_readlines) .with('/proc/cpuinfo') .and_return([]) end it 'returns nil' do result = Facter::Resolvers::Linux::Processors.resolve(:physical_count) expect(result).to be(nil) end end end context 'when on powerpc architecture' do before do allow(Facter::Util::FileHelper).to receive(:safe_readlines) .with('/proc/cpuinfo') .and_return(load_fixture('cpuinfo_powerpc').readlines) allow(Dir).to receive(:entries).and_call_original allow(Dir).to receive(:entries).with('/sys/devices/system/cpu').and_return(%w[cpu0 cpu1 cpuindex]) allow(File).to receive(:exist?).and_call_original allow(File).to receive(:exist?).with('/sys/devices/system/cpu/cpu0/topology/physical_package_id').and_return(true) allow(File).to receive(:exist?).with('/sys/devices/system/cpu/cpu1/topology/physical_package_id').and_return(true) allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/sys/devices/system/cpu/cpu0/topology/physical_package_id') .and_return('0') allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/sys/devices/system/cpu/cpu1/topology/physical_package_id') .and_return('1') end after do Facter::Resolvers::Linux::Processors.invalidate_cache Facter::Resolvers::Uname.invalidate_cache end let(:speed) { 2_926_000_000 } let(:physical_processors) { 2 } let(:models) do ['POWER8 (raw), altivec supported', 'POWER8 (raw), altivec supported', 'POWER8 (raw), altivec supported', 'POWER8 (raw), altivec supported'] end it 'returns physical_devices_count' do result = Facter::Resolvers::Linux::Processors.resolve(:physical_count) expect(result).to eq(physical_processors) end it 'returns list of models' do result = Facter::Resolvers::Linux::Processors.resolve(:models) expect(result).to eq(models) end it 'returns cpu speed' do result = Facter::Resolvers::Linux::Processors.resolve(:speed) expect(result).to eq(speed) end end context 'when on arm64 architecture' do before do allow(Facter::Util::FileHelper).to receive(:safe_readlines) .with('/proc/cpuinfo') .and_return(load_fixture('cpuinfo_arm64').readlines) allow(Dir).to receive(:entries).and_call_original allow(Dir).to receive(:entries).with('/sys/devices/system/cpu').and_return(%w[cpu0 cpu1 cpuindex]) allow(File).to receive(:exist?).and_call_original allow(File).to receive(:exist?).with('/sys/devices/system/cpu/cpu0/topology/physical_package_id').and_return(true) allow(File).to receive(:exist?).with('/sys/devices/system/cpu/cpu1/topology/physical_package_id').and_return(true) allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/sys/devices/system/cpu/cpu0/topology/physical_package_id') .and_return('0') allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/sys/devices/system/cpu/cpu1/topology/physical_package_id') .and_return('0') end after do Facter::Resolvers::Linux::Processors.invalidate_cache Facter::Resolvers::Uname.invalidate_cache end let(:physical_processors) { 1 } it 'returns physical_devices_count' do result = Facter::Resolvers::Linux::Processors.resolve(:physical_count) expect(result).to eq(physical_processors) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/redhat_release_spec.rb000066400000000000000000000060311470204764400264570ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::RedHatRelease do subject(:redhat_release) { Facter::Resolvers::RedHatRelease } after do Facter::Resolvers::RedHatRelease.invalidate_cache end context 'when redhat-release has codename' do { fedora: { release_file_content: "Fedora release 32 (Thirty Two)\n", id: 'rhel', name: 'Fedora', version: '32', codename: 'Thirty Two', description: 'Fedora release 32 (Thirty Two)', distributor_id: 'Fedora' }, el: { release_file_content: "Red Hat Enterprise Linux release 8.0 (Ootpa)\n", id: 'rhel', name: 'RedHat', version: '8.0', codename: 'Ootpa', description: 'Red Hat Enterprise Linux release 8.0 (Ootpa)', distributor_id: 'RedHatEnterprise' }, el_server: { release_file_content: "Red Hat Enterprise Linux Server release 5.10 (Tikanga)\n", id: 'rhel', name: 'RedHat', version: '5.10', codename: 'Tikanga', description: 'Red Hat Enterprise Linux Server release 5.10 (Tikanga)', distributor_id: 'RedHatEnterpriseServer' }, centos: { release_file_content: "CentOS Linux release 7.2.1511 (Core)\n", id: 'rhel', name: 'CentOS', version: '7.2.1511', codename: 'Core', description: 'CentOS Linux release 7.2.1511 (Core)', distributor_id: 'CentOS' } }.each_pair do |platform, data| context "when #{platform.capitalize}" do before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/etc/redhat-release', nil) .and_return(data[:release_file_content]) end it 'returns os NAME' do expect(redhat_release.resolve(:name)).to eq(data[:name]) end it 'returns os ID' do expect(redhat_release.resolve(:id)).to eq(data[:id]) end it 'returns os VERSION_ID' do expect(redhat_release.resolve(:version)).to eq(data[:version]) end it 'returns os VERSION_CODENAME' do expect(redhat_release.resolve(:codename)).to eq(data[:codename]) end it 'returns os DESCRIPTION' do expect(redhat_release.resolve(:description)).to eq(data[:description]) end it 'returns os DISTRIBUTOR_ID' do expect(redhat_release.resolve(:distributor_id)).to eq(data[:distributor_id]) end end end end context 'when redhat-relase does not have codename' do before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/etc/redhat-release', nil) .and_return("Oracle VM server release 3.4.4\n") end it 'returns os NAME' do expect(redhat_release.resolve(:name)).to eq('OracleVM') end it 'returns os VERSION_ID' do expect(redhat_release.resolve(:version)).to eq('3.4.4') end it 'returns os VERSION_CODENAME' do expect(redhat_release.resolve(:codename)).to be_nil end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/release_from_first_line_spec.rb000066400000000000000000000043351470204764400303760ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::ReleaseFromFirstLine do subject(:release_from_first_line_resolver) { Facter::Resolvers::ReleaseFromFirstLine } after do release_from_first_line_resolver.invalidate_cache end context 'when release file name is not given' do it 'returns nil' do result = release_from_first_line_resolver.resolve(:release, release_folder: 'folder') expect(result).to be_nil end end context 'when release file is present' do before do allow(Facter::Util::FileHelper).to receive(:safe_read).with(file_name, nil).and_return(result) end context 'when release file can not be read' do let(:file_name) { '/etc/ovs-release' } let(:result) { nil } it 'returns nil' do result = release_from_first_line_resolver.resolve(:release, release_file: file_name) expect(result).to be_nil end end context 'when release file is readable' do let(:file_name) { '/etc/oracle-release' } let(:result) { 'Oracle Linux release 10.5 (something)' } it 'returns release value' do result = release_from_first_line_resolver.resolve(:release, release_file: file_name) expect(result).to eq('10.5') end end context 'when os-release file contains Rawhide' do let(:file_name) { '/etc/os-release' } let(:result) { 'a bunch of data and there is Rawhide' } it 'returns nil' do result = release_from_first_line_resolver.resolve(:release, release_file: file_name) expect(result).to eq('Rawhide') end end context 'when os-release file contains Amazon Linux' do let(:file_name) { '/etc/os-release' } let(:result) { 'some other data and Amazon Linux 15 and that\'s it' } it 'returns nil' do result = release_from_first_line_resolver.resolve(:release, release_file: file_name) expect(result).to eq('15') end end context 'when requesting invalid data' do let(:file_name) { '/etc/oracle-release' } let(:result) { nil } it 'returns nil' do result = release_from_first_line_resolver.resolve(:something, release_file: file_name) expect(result).to be_nil end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/ruby_spec.rb000066400000000000000000000014141470204764400244710ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Ruby do before do Facter::Resolvers::Ruby.invalidate_cache end describe '#resolve ruby facts' do it 'detects ruby sitedir' do expect(Facter::Resolvers::Ruby.resolve(:sitedir)).to eql(RbConfig::CONFIG['sitelibdir']) end it 'does not resolve the sitedir fact if sitedir does not exist' do allow(RbConfig::CONFIG).to receive(:[]).with('sitedir').and_return(nil) expect(Facter::Resolvers::Ruby.resolve(:sitedir)).to be(nil) end it 'detects ruby platform' do expect(Facter::Resolvers::Ruby.resolve(:platform)).to eql(RUBY_PLATFORM) end it 'detects ruby version' do expect(Facter::Resolvers::Ruby.resolve(:version)).to eql(RUBY_VERSION) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/selinux_spec.rb000066400000000000000000000064241470204764400252050ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::SELinux do subject(:selinux_resolver) { Facter::Resolvers::SELinux } after do selinux_resolver.invalidate_cache end before do allow(Facter::Core::Execution).to receive(:execute) .with('cat /proc/self/mounts', logger: an_instance_of(Facter::Log)) .and_return(load_fixture(file).read) end context 'when no selinuxfs is mounted' do let(:file) { 'proc_self_mounts' } it 'returns enabled false' do expect(selinux_resolver.resolve(:enabled)).to be(false) end it 'returns nil for config_mode' do expect(selinux_resolver.resolve(:config_mode)).to be(nil) end end context 'when selinuxfs is mounted' do let(:file) { 'proc_self_mounts_selinux' } context 'when config file does not exist' do before do allow(Facter::Util::FileHelper).to receive(:safe_readlines).with('/etc/selinux/config').and_return([]) end it 'sets enabled to false' do expect(selinux_resolver.resolve(:enabled)).to be(false) end it 'returns nil for config_mode' do expect(selinux_resolver.resolve(:config_mode)).to be(nil) end end context 'when config file exists' do before do allow(Facter::Util::FileHelper).to receive(:safe_readlines) .with('/etc/selinux/config').and_return(load_fixture('selinux_config').readlines) end context 'when policyvers and enforce files are readable' do before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/sys/fs/selinux/policyvers', nil).and_return('31') allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/sys/fs/selinux/enforce').and_return('1') end it 'returns enabled true' do expect(selinux_resolver.resolve(:enabled)).to be(true) end it 'returns config_mode enabled' do expect(selinux_resolver.resolve(:config_mode)).to eql('enabled') end it 'returns config_policy targeted' do expect(selinux_resolver.resolve(:config_policy)).to eql('targeted') end it 'returns policy_version 31' do expect(selinux_resolver.resolve(:policy_version)).to eql('31') end it 'returns enforced true' do expect(selinux_resolver.resolve(:enforced)).to be(true) end it 'returns current_mode enforcing' do expect(selinux_resolver.resolve(:current_mode)).to eql('enforcing') end end context 'when policyvers and enforce files are not readable' do before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/sys/fs/selinux/policyvers', nil).and_return(nil) allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/sys/fs/selinux/enforce').and_return('') end it 'returns no policy_version' do expect(selinux_resolver.resolve(:policy_version)).to be(nil) end it 'returns enforced false' do expect(selinux_resolver.resolve(:enforced)).to be(false) end it 'returns current_mode enforcing on permissive' do expect(selinux_resolver.resolve(:current_mode)).to eql('permissive') end end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/solaris/000077500000000000000000000000001470204764400236255ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/resolvers/solaris/disks_spec.rb000066400000000000000000000026201470204764400263010ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Solaris::Disks do subject(:resolver) { Facter::Resolvers::Solaris::Disks } before do allow(File).to receive(:executable?).with('/usr/bin/kstat').and_return(status) allow(Facter::Core::Execution) .to receive(:execute) .with('/usr/bin/kstat sderr', { logger: resolver.log }) .and_return(output) end after do resolver.invalidate_cache end context 'when kstat is present and can retrieve information' do let(:value) do { 'sd0' => { product: 'VMware IDE CDR00Revision', size: '0 bytes', size_bytes: 0, vendor: 'NECVMWar' }, 'sd1' => { product: 'Virtual disk Revision', size: '20.00 GiB', size_bytes: 21_474_836_480, vendor: 'VMware' } } end let(:status) { true } let(:output) { load_fixture('kstat_sderr').read } it 'returns disks info' do expect(resolver.resolve(:disks)).to eq(value) end end context 'when kstat is not present' do let(:output) { '' } let(:status) { false } it 'returns nil' do expect(resolver.resolve(:disks)).to be_nil end end context 'when kstat is present but fails' do let(:output) { '' } let(:status) { true } it 'returns nil' do expect(resolver.resolve(:disks)).to be_nil end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/solaris/dmi_sparc_spec.rb000066400000000000000000000036441470204764400271340ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Solaris::DmiSparc do describe '#resolve' do subject(:resolver) { Facter::Resolvers::Solaris::DmiSparc } before do allow(File).to receive(:executable?).with('/usr/sbin/prtdiag').and_return(true) allow(Facter::Core::Execution).to receive(:execute) .with('/usr/sbin/prtdiag', logger: an_instance_of(Facter::Log)) .and_return(load_fixture('prtdiag').read) allow(File).to receive(:executable?).with('/usr/sbin/sneep').and_return(true) allow(Facter::Core::Execution).to receive(:execute) .with('/usr/sbin/sneep', logger: an_instance_of(Facter::Log)).and_return('random_string') end after do Facter::Resolvers::Solaris::DmiSparc.invalidate_cache end it 'returns manufacturer' do expect(resolver.resolve(:manufacturer)).to eq('Oracle Corporation') end it 'returns product_name' do expect(resolver.resolve(:product_name)).to eq('SPARC T7-1') end it 'returns serial_number' do expect(resolver.resolve(:serial_number)).to eq('random_string') end end describe '#reolve under a non-global zone' do subject(:resolver) { Facter::Resolvers::Solaris::DmiSparc } before do allow(File).to receive(:executable?).with('/usr/sbin/prtdiag').and_return(true) allow(Facter::Core::Execution).to receive(:execute) .with('/usr/sbin/prtdiag', logger: an_instance_of(Facter::Log)) .and_return('prtdiag can only be run in the global zone') end after do Facter::Resolvers::Solaris::DmiSparc.invalidate_cache end it 'does not return manufacturer' do expect(resolver.resolve(:manufacturer)).to eq(nil) end it 'does not return product_name' do expect(resolver.resolve(:product_name)).to eq(nil) end it 'does not return serial_number' do expect(resolver.resolve(:serial_number)).to eq(nil) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/solaris/dmi_spec.rb000066400000000000000000000040041470204764400257330ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Solaris::Dmi do describe '#resolve' do subject(:resolver) { Facter::Resolvers::Solaris::Dmi } before do allow(File).to receive(:executable?).with('/usr/sbin/smbios').and_return(true) allow(Facter::Core::Execution).to receive(:execute) .with('/usr/sbin/smbios -t SMB_TYPE_BIOS', logger: an_instance_of(Facter::Log)) .and_return(load_fixture('smbios_bios').read) allow(Facter::Core::Execution).to receive(:execute) .with('/usr/sbin/smbios -t SMB_TYPE_SYSTEM', logger: an_instance_of(Facter::Log)) .and_return(load_fixture('smbios_system').read) allow(Facter::Core::Execution).to receive(:execute) .with('/usr/sbin/smbios -t SMB_TYPE_CHASSIS', logger: an_instance_of(Facter::Log)) .and_return(load_fixture('smbios_chassis').read) end after do Facter::Resolvers::Solaris::Dmi.invalidate_cache end it 'returns bios_release_date' do expect(resolver.resolve(:bios_release_date)).to eq('12/12/2018') end it 'returns bios_vendor' do expect(resolver.resolve(:bios_vendor)).to eq('Phoenix Technologies LTD') end it 'returns bios_version' do expect(resolver.resolve(:bios_version)).to eq('6.00') end it 'returns chassis_asset_tag' do expect(resolver.resolve(:chassis_asset_tag)).to eq('No Asset Tag') end it 'returns chassis_type' do expect(resolver.resolve(:chassis_type)).to eq('0x1 (other)') end it 'returns manufacturer' do expect(resolver.resolve(:manufacturer)).to eq('VMware, Inc.') end it 'returns product_name' do expect(resolver.resolve(:product_name)).to eq('VMware Virtual Platform') end it 'returns serial_number' do expect(resolver.resolve(:serial_number)).to eq('VMware-42 1a 46 19 2d fc 12 90-73 48 ea 8f 1a 37 cb 95') end it 'returns product_uuid' do expect(resolver.resolve(:product_uuid)).to eq('421a4619-2dfc-1290-7348-ea8f1a37cb95') end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/solaris/filesystem_spec.rb000066400000000000000000000011431470204764400273470ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Solaris::Filesystem do subject(:filesystems_resolver) { Facter::Resolvers::Solaris::Filesystem } let(:filesystems) { 'hsfs,nfs,pcfs,udfs,ufs' } before do allow(File).to receive(:executable?).with('/usr/sbin/sysdef').and_return(true) allow(Facter::Core::Execution).to receive(:execute) .with('/usr/sbin/sysdef', logger: an_instance_of(Facter::Log)) .and_return(load_fixture('solaris_filesystems').read) end it 'returns filesystems' do expect(filesystems_resolver.resolve(:file_systems)).to eq(filesystems) end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/solaris/ipaddress_spec.rb000066400000000000000000000020741470204764400271450ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Solaris::Ipaddress do subject(:ipaddress) { Facter::Resolvers::Solaris::Ipaddress } describe '#resolve' do after do ipaddress.invalidate_cache end before do allow(Facter::Core::Execution).to receive(:execute) .with('route -n get default | grep interface', logger: an_instance_of(Facter::Log)) .and_return(route) end context 'when returns ip' do let(:route) { ' interface: net0' } let(:ifconfig) { load_fixture('solaris_ifconfig').read } before do allow(Facter::Core::Execution).to receive(:execute) .with('ifconfig net0', logger: an_instance_of(Facter::Log)) .and_return(ifconfig) end it 'detects ipadress' do expect(ipaddress.resolve(:ip)).to eql('10.16.115.67') end end context 'when primary interface could not be retrieved' do let(:route) { 'invalid output' } it 'detects that ip is nil' do expect(ipaddress.resolve(:ip)).to be(nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/solaris/ldom_spec.rb000066400000000000000000000061031470204764400261170ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Solaris::Ldom do subject(:resolver) { Facter::Resolvers::Solaris::Ldom } before do allow(Facter::Core::Execution) .to receive(:execute) .with('/usr/sbin/virtinfo -a -p', logger: an_instance_of(Facter::Log)) .and_return(output) end after do resolver.invalidate_cache end context 'when syscall returns valid output' do let(:output) { load_fixture('virtinfo').read } it 'parses chassis_serial' do expect(resolver.resolve(:chassis_serial)).to eq('AK00358110') end it 'parses control_domain' do expect(resolver.resolve(:control_domain)).to eq('opdx-a0-sun2') end it 'parses domain_name' do expect(resolver.resolve(:domain_name)).to eq('sol11-11') end it 'parses domain_uuid' do expect(resolver.resolve(:domain_uuid)).to eq('415dfab4-c373-4ac0-9414-8bf00801fb72') end it 'parses role_control' do expect(resolver.resolve(:role_control)).to eq('false') end it 'parses role_io' do expect(resolver.resolve(:role_io)).to eq('false') end it 'parses role_root' do expect(resolver.resolve(:role_root)).to eq('false') end it 'parses role_service' do expect(resolver.resolve(:role_service)).to eq('false') end end context 'when syscall returns invalid output' do let(:output) { 'iNvAlId OuTpUt' } it 'parses chassis_serial to nil' do expect(resolver.resolve(:chassis_serial)).to be_nil end it 'parses control_domain to nil' do expect(resolver.resolve(:control_domain)).to be_nil end it 'parses domain_name to nil' do expect(resolver.resolve(:domain_name)).to be_nil end it 'parses domain_uuid to nil' do expect(resolver.resolve(:domain_uuid)).to be_nil end it 'parses role_control to nil' do expect(resolver.resolve(:role_control)).to be_nil end it 'parses role_io to nil' do expect(resolver.resolve(:role_io)).to be_nil end it 'parses role_root to nil' do expect(resolver.resolve(:role_root)).to be_nil end it 'parses role_service to nil' do expect(resolver.resolve(:role_service)).to be_nil end end context 'when syscall has no output' do let(:output) { '' } it 'parses chassis_serial to nil' do expect(resolver.resolve(:chassis_serial)).to be_nil end it 'parses control_domain to nil' do expect(resolver.resolve(:control_domain)).to be_nil end it 'parses domain_name to nil' do expect(resolver.resolve(:domain_name)).to be_nil end it 'parses domain_uuid to nil' do expect(resolver.resolve(:domain_uuid)).to be_nil end it 'parses role_control to nil' do expect(resolver.resolve(:role_control)).to be_nil end it 'parses role_io to nil' do expect(resolver.resolve(:role_io)).to be_nil end it 'parses role_root to nil' do expect(resolver.resolve(:role_root)).to be_nil end it 'parses role_service to nil' do expect(resolver.resolve(:role_service)).to be_nil end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/solaris/memory_spec.rb000066400000000000000000000055451470204764400265050ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Solaris::Memory do subject(:resolver) { Facter::Resolvers::Solaris::Memory } before do allow(Facter::Core::Execution) .to receive(:execute) .with('/usr/bin/kstat -m unix -n system_pages', logger: an_instance_of(Facter::Log)) .and_return(kstat_output) allow(Facter::Core::Execution) .to receive(:execute) .with('pagesize', logger: an_instance_of(Facter::Log)) .and_return(pagesize) allow(Facter::Core::Execution) .to receive(:execute) .with('/usr/sbin/swap -l', logger: an_instance_of(Facter::Log)) .and_return(swap_output) end after do resolver.invalidate_cache end context 'when everything works fine' do let(:kstat_output) { load_fixture('kstat_sys_pages').read } let(:swap_output) { load_fixture('swap_l').read } let(:pagesize) { '4096' } it 'returns values for system' do expect(resolver.resolve(:system)).to eq( available_bytes: 2_627_383_296, capacity: '59.11%', total_bytes: 6_425_141_248, used_bytes: 3_797_757_952 ) end it 'returns values for swap' do expect(resolver.resolve(:swap)).to eq( available_bytes: 1_807_736_832, capacity: '0%', total_bytes: 1_807_736_832, used_bytes: 0 ) end end context 'when there is no output from kstat' do let(:kstat_output) { '' } let(:swap_output) { load_fixture('swap_l').read } let(:pagesize) { '4096' } it 'returns nil for system' do expect(resolver.resolve(:system)).to be_nil end it 'returns values for swap' do expect(resolver.resolve(:swap)).to eq( available_bytes: 1_807_736_832, capacity: '0%', total_bytes: 1_807_736_832, used_bytes: 0 ) end end context 'when there is no output from swap' do let(:kstat_output) { load_fixture('kstat_sys_pages').read } let(:swap_output) { '' } let(:pagesize) { '4096' } it 'returns values for system' do expect(resolver.resolve(:system)).to eq( available_bytes: 2_627_383_296, capacity: '59.11%', total_bytes: 6_425_141_248, used_bytes: 3_797_757_952 ) end it 'returns nil for swap' do expect(resolver.resolve(:swap)).to be_nil end end context 'when pagesize does not return a valid value' do let(:kstat_output) { load_fixture('kstat_sys_pages').read } let(:swap_output) { load_fixture('swap_l').read } let(:pagesize) { '-bash: pagesize: command not found' } it 'returns nil for system' do expect(resolver.resolve(:system)).to be_nil end it 'returns nil for swap' do expect(resolver.resolve(:swap)).to eq( available_bytes: 1_807_736_832, capacity: '0%', total_bytes: 1_807_736_832, used_bytes: 0 ) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/solaris/mountpoints_spec.rb000066400000000000000000000101251470204764400275620ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Solaris::Mountpoints do let(:resolver) { Facter::Resolvers::Solaris::Mountpoints } let(:mounts) do [ instance_double(Sys::Filesystem::Mount, mount_point: '/', mount_time: nil, mount_type: 'zfs', options: 'dev=4490002', name: 'rpool/ROOT/solaris', dump_frequency: nil, pass_number: nil), instance_double(Sys::Filesystem::Mount, mount_point: '/devices', mount_time: nil, mount_type: 'devfs', options: 'dev=8580000', name: '/devices', dump_frequency: nil, pass_number: nil), instance_double(Sys::Filesystem::Mount, mount_point: '/proc', mount_time: nil, mount_type: 'proc', options: 'dev=8600000', name: 'proc', dump_frequency: nil, pass_number: nil), instance_double(Sys::Filesystem::Mount, mount_point: '/net', mount_time: nil, mount_type: 'autofs', options: 'nosuid,indirect,ignore,nobrowse,dev=8900007', name: '-hosts', dump_frequency: nil, pass_number: nil), instance_double(Sys::Filesystem::Mount, mount_point: '/home', mount_time: nil, mount_type: 'autofs', options: 'indirect,ignore,nobrowse,dev=8900008', name: 'auto_home', dump_frequency: nil, pass_number: nil), instance_double(Sys::Filesystem::Mount, mount_point: '/home/user', mount_time: nil, mount_type: 'zfs', options: 'dev=8900009', name: 'rpool/user', dump_frequency: nil, pass_number: nil) ] end let(:mount) { mounts.first } let(:stat) do instance_double('Sys::Filesystem::Stat', path: '/', base_type: 'zfs', fragment_size: 512, block_size: 131_072, blocks: 20_143_706, blocks_available: 11_731_043, blocks_free: 11_731_043) end let(:fact) do [{ available: '5.59 GiB', available_bytes: 6_006_294_016, capacity: '41.76%', device: 'rpool/ROOT/solaris', filesystem: 'zfs', options: ['dev=4490002'], path: '/', size: '9.61 GiB', size_bytes: 10_313_577_472, used: '4.01 GiB', used_bytes: 4_307_283_456 }] end before do allow(Facter::Util::Resolvers::FilesystemHelper).to receive(:read_mountpoint_stats).and_return(stat) # mock sys/filesystem methods allow(stat).to receive(:bytes_total).and_return(stat.blocks * stat.fragment_size) allow(stat).to receive(:bytes_available).and_return(stat.blocks_available * stat.fragment_size) allow(stat).to receive(:bytes_free).and_return(stat.blocks_free * stat.fragment_size) allow(stat).to receive(:bytes_used).and_return(stat.bytes_total - stat.bytes_free) resolver.invalidate_cache end it 'correctly builds the mountpoints fact' do allow(Facter::Util::Resolvers::FilesystemHelper).to receive(:read_mountpoints).and_return([mount]) result = resolver.resolve(:mountpoints) expect(result).to eq(fact) end it 'resolves all applicable mountpoints' do allow(Facter::Util::Resolvers::FilesystemHelper).to receive(:read_mountpoints).and_return(mounts) result = resolver.resolve(:mountpoints) expect(result.map { |m| m[:path] }).to eql(%w[/ /devices /proc]) end it 'does not resolve mounts of type autofs' do allow(Facter::Util::Resolvers::FilesystemHelper).to receive(:read_mountpoints).and_return(mounts) result = resolver.resolve(:mountpoints) expect(result).not_to include(hash_including(filesystem: 'autofs')) end it 'does not resolve mounts under auto_home' do allow(Facter::Util::Resolvers::FilesystemHelper).to receive(:read_mountpoints).and_return(mounts) result = resolver.resolve(:mountpoints) expect(result).not_to include(hash_including(path: '/home/user')) end describe 'resolver key not found' do it 'returns nil when resolver cannot find key' do expect(resolver.resolve(:inexistent_key)).to be_nil end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/solaris/processors_spec.rb000066400000000000000000000036651470204764400274000ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Solaris::Processors do subject(:resolver) { Facter::Resolvers::Solaris::Processors } before do allow(File).to receive(:executable?).with('/usr/bin/kstat').and_return(status) allow(Facter::Core::Execution) .to receive(:execute) .with('/usr/bin/kstat -m cpu_info', { logger: resolver.log }) .and_return(output) end after do resolver.invalidate_cache end context 'when kstat is present and can retrieve information' do let(:logicalcount) { 2 } let(:models) do ['Intel(r) Xeon(r) Gold 6138 CPU @ 2.00GHz', 'Intel(r) Xeon(r) Gold 6138 CPU @ 2.00GHz'] end let(:physical_processors) { 2 } let(:threads_per_core) { 1 } let(:cores_per_socket) { 1 } let(:speed_expected) { 1_995_246_617 } let(:output) { load_fixture('kstat_cpu').read } let(:status) { true } it 'returns number of processors' do expect(resolver.resolve(:logical_count)).to eq(logicalcount) end it 'returns number of physical processors' do expect(resolver.resolve(:physical_count)).to eq(physical_processors) end it 'returns list of models' do expect(resolver.resolve(:models)).to eq(models) end it 'returns speed of processors' do expect(resolver.resolve(:speed)).to eq(speed_expected) end it 'returns cores per socket' do expect(resolver.resolve(:cores_per_socket)).to eq(cores_per_socket) end it 'returns threads per core' do expect(resolver.resolve(:threads_per_core)).to eq(threads_per_core) end end context 'when kstat is not present' do let(:output) { '' } let(:status) { false } it 'returns nil' do expect(resolver.resolve(:models)).to be_nil end end context 'when kstat is present but fails' do let(:output) { '' } let(:status) { true } it 'returns nil' do expect(resolver.resolve(:models)).to be_nil end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/solaris/solaris_release_spec.rb000066400000000000000000000027461470204764400303510ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Solaris::OsRelease do subject(:solaris_release) { Facter::Resolvers::Solaris::OsRelease } before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/etc/release', nil) .and_return(output) end after do solaris_release.invalidate_cache end context 'when can resolve os release facts' do let(:output) { load_fixture('os_release_solaris').read } it 'returns os FULL' do expect(solaris_release.resolve(:full)).to eq('10_u11') end it 'returns os MINOR' do expect(solaris_release.resolve(:minor)).to eq('11') end it 'returns os MAJOR' do expect(solaris_release.resolve(:major)).to eq('10') end end context 'when os release ends with no minor version' do let(:output) { 'Oracle Solaris 11 X86' } it 'returns append 0 to minor version if no minor version is in file but regex pattern matches' do expect(solaris_release.resolve(:full)).to eq('11.0') end end context 'when trying to read os release file has exit status == 0 but file is empty' do let(:output) { '' } it 'returns result nil if file is empty' do expect(solaris_release.resolve(:full)).to eq(nil) end end context 'when the result from the os file release has no valid data' do let(:output) { 'test test' } it 'returns nil in case the file returns invalid data' do expect(solaris_release.resolve(:full)).to eq(nil) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/solaris/zone_name_spec.rb000066400000000000000000000012471470204764400271430ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Solaris::ZoneName do subject(:solaris_zone) { Facter::Resolvers::Solaris::ZoneName } let(:zone_name_output) { 'global' } before do allow(File).to receive(:executable?) .with('/bin/zonename') .and_return(true) allow(Facter::Core::Execution).to receive(:execute) .with('/bin/zonename', logger: an_instance_of(Facter::Log)) .and_return(zone_name_output) end after do solaris_zone.invalidate_cache end context 'when can resolve zone facts' do it 'returns zone fact' do expect(solaris_zone.resolve(:current_zone_name)).to eq(zone_name_output) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/solaris/zone_spec.rb000066400000000000000000000020471470204764400261420ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Solaris::Zone do subject(:solaris_zone) { Facter::Resolvers::Solaris::Zone } before do allow(Facter::Core::Execution).to receive(:execute) .with('/usr/sbin/zoneadm list -cp', logger: an_instance_of(Facter::Log)) .and_return(output) end after do solaris_zone.invalidate_cache end context 'when it can resolve zone facts' do let(:output) { '0:global:running:/::solaris:shared:-:none:' } let(:zone) do [{ brand: 'solaris', id: '0', iptype: 'shared', name: 'global', uuid: '', status: 'running', path: '/' }] end it 'returns zone fact' do expect(solaris_zone.resolve(:zone)).to eq(zone) end end context 'when it can not resolve zone facts' do let(:output) { '' } it 'prints debug message' do expect(solaris_zone.log).to receive(:debug) .with('Command /usr/sbin/zoneadm list -cp returned an empty result') solaris_zone.resolve(:zone) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/specific_release_file_spec.rb000066400000000000000000000064251470204764400300030ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::SpecificReleaseFile do subject(:specific_release_file_resolver) { Facter::Resolvers::SpecificReleaseFile } after do specific_release_file_resolver.invalidate_cache end context 'when release file name is not given' do it 'returns nil' do expect(specific_release_file_resolver.resolve(:release, {})).to be_nil end end context 'when release file is present' do let(:result) { nil } before do allow(Facter::Util::FileHelper).to receive(:safe_read).with(options[:release_file], nil).and_return(result) end context 'when release file can not be read' do let(:options) { { release_file: '/etc/alpine-release' } } let(:result) { nil } it 'returns nil' do result = specific_release_file_resolver.resolve(:release, options) expect(result).to be_nil end end context 'when release file is readable' do let(:options) { { release_file: '/etc/devuan_version' } } let(:result) { load_fixture('os_release_devuan').read } it 'returns release value' do result = specific_release_file_resolver.resolve(:release, options) expect(result).to eq('beowulf') end end context 'when requesting invalid data' do let(:options) { { release_file: '/etc/alpine-release' } } let(:result) { nil } it 'returns nil' do result = specific_release_file_resolver.resolve(:something, options) expect(result).to be_nil end end context 'when release file name is not given' do let(:options) do { release_folder: 'folder', no_regex: /regex/ } end it 'returns nil' do result = specific_release_file_resolver.resolve(:release, options) expect(result).to be_nil end end context 'when regex is not given' do let(:options) do { release_file: 'folder', no_regex: /regex/ } end it 'returns nil' do result = specific_release_file_resolver.resolve(:release, options) expect(result).to be_nil end end context 'when release file and regex are present' do let(:options) do { release_file: '/etc/ovs-release', regex: /^RELEASE=(\d+)/ } end before do allow(Facter::Util::FileHelper).to receive(:safe_read).with(options[:release_file], nil).and_return(result) end context 'when release file can not be read' do let(:result) { nil } it 'returns nil' do result = specific_release_file_resolver.resolve(:release, options) expect(result).to be_nil end end context 'when release file is readable' do let(:result) { load_fixture('os_release_mint').read } it 'returns release value' do result = specific_release_file_resolver.resolve(:release, options)[1] expect(result).to eq('19') end end context 'when requesting invalid data' do let(:result) { load_fixture('os_release_mint').read } it 'returns nil' do result = specific_release_file_resolver.resolve(:something, options) expect(result).to be_nil end end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/ssh_spec.rb000066400000000000000000000115511470204764400243100ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Ssh do describe '#folders' do let(:paths) { %w[/etc/ssh /usr/local/etc/ssh /etc /usr/local/etc /etc/opt/ssh] } let(:file_names) { %w[ssh_host_rsa_key.pub ssh_host_ecdsa_key.pub ssh_host_ed25519_key.pub] } before do paths.each { |path| allow(File).to receive(:directory?).with(path).and_return(false) unless path == '/etc' } allow(File).to receive(:directory?).with('/etc').and_return(true) allow(Facter::Util::FileHelper).to receive(:safe_read) .with(a_string_starting_with('/etc/ssh_host'), nil).and_return(nil) end after do Facter::Resolvers::Ssh.invalidate_cache end shared_examples 'an ssh key' do it 'resolves the key' do allow(Facter::Util::FileHelper).to receive(:safe_read) .with(path, nil).and_return(content) expect(Facter::Resolvers::Ssh.resolve(:ssh)).to eq([result]) end end context 'when rsa' do let(:path) { '/etc/ssh_host_rsa_key.pub' } let(:content) { load_fixture('rsa').read } let(:result) do fingerprint = Facter::Util::Resolvers::FingerPrint.new( 'SSHFP 1 1 90134f93fec6ab5e22bdd88fc4d7cd6e9dca4a07', 'SSHFP 1 2 efaa26ff8169f5ffc372ebcad17aef886f4ccaa727169acdd0379b51c6c77e99' ) Facter::Util::Resolvers::Ssh.new(fingerprint, *content.strip.split(' '), 'rsa') end include_examples 'an ssh key' end context 'when ecdsa' do let(:path) { '/etc/ssh_host_dsa_key.pub' } let(:content) { load_fixture('ecdsa').read } let(:result) do fingerprint = Facter::Util::Resolvers::FingerPrint.new( 'SSHFP 3 1 fd92cf867fac0042d491eb1067e4f3cabf54039a', 'SSHFP 3 2 a51271a67987d7bbd685fa6d7cdd2823a30373ab01420b094480523fabff2a05' ) Facter::Util::Resolvers::Ssh.new(fingerprint, *content.strip.split(' '), 'ecdsa') end include_examples 'an ssh key' end context 'when ed25519' do let(:path) { '/etc/ssh_host_ed25519_key.pub' } let(:content) { load_fixture('ed25519').read } let(:result) do fingerprint = Facter::Util::Resolvers::FingerPrint.new( 'SSHFP 4 1 1c02084d251368b98a3af97820d9fbf2b8dc9558', 'SSHFP 4 2 656bd7aa3f8ad4703bd581888231f822cb8cd4a2a258584469551d2c2c9f6b62' ) Facter::Util::Resolvers::Ssh.new(fingerprint, *content.strip.split(' '), 'ed25519') end include_examples 'an ssh key' end context 'when ecdsa 384-bit' do let(:path) { '/etc/ssh_host_ecdsa_key.pub' } let(:content) { load_fixture('ecdsa384').read } let(:result) do fingerprint = Facter::Util::Resolvers::FingerPrint.new( 'SSHFP 3 1 a3c1dc40a07cd76ea2ffe3f57e96aae146427174', 'SSHFP 3 2 949d92d65c6bb3908727bef5cdafef5b546650d64a081a4f85e7dcaf6b7cb7ab' ) Facter::Util::Resolvers::Ssh.new(fingerprint, *content.strip.split(' '), 'ecdsa') end include_examples 'an ssh key' end context 'when ecdsa 521-bit' do let(:path) { '/etc/ssh_host_ecdsa_key.pub' } let(:content) { load_fixture('ecdsa521').read } let(:result) do fingerprint = Facter::Util::Resolvers::FingerPrint.new( 'SSHFP 3 1 61046cb5f7b38df21fe4511a9280436ce89514ee', 'SSHFP 3 2 b74da480da3411a79abf37d0bcfbbcaa8c1dbfc6a983365276b3c7f0c7a8de3e' ) Facter::Util::Resolvers::Ssh.new(fingerprint, *content.strip.split(' '), 'ecdsa') end include_examples 'an ssh key' end context 'when no files are readable' do it 'returns an empty array' do expect(Facter::Resolvers::Ssh.resolve(:ssh)).to eq([]) end end context 'when ssh fails to be retrieved' do before do paths.each { |path| allow(File).to receive(:directory?).with(path).and_return(false) } end it 'returns empty array' do expect(Facter::Resolvers::Ssh.resolve(:ssh)).to eq([]) end end end describe 'invalid files' do let(:paths) { %w[/etc/ssh /usr/local/etc/ssh /etc /usr/local/etc /etc/opt/ssh] } let(:file_names) { %w[ssh_host_rsa_key.pub ssh_host_ecdsa_key.pub ssh_host_ed25519_key.pub] } before do paths.each { |path| allow(File).to receive(:directory?).with(path).and_return(false) unless path == '/etc' } allow(File).to receive(:directory?).with('/etc').and_return(true) allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/etc/ssh_host_ecdsa_key.pub', nil).and_return('invalid key') allow(Facter::Util::FileHelper).to receive(:safe_read) .with(a_string_starting_with('/etc/ssh_host'), nil) end after do Facter::Resolvers::Ssh.invalidate_cache end context 'when reading invalid ssh key' do it 'returns empty array' do expect(Facter::Resolvers::Ssh.resolve(:ssh)).to eq([]) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/suse_release_spec.rb000066400000000000000000000011321470204764400261640ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::SuseRelease do subject(:suse_release) { Facter::Resolvers::SuseRelease } before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/etc/SuSE-release', nil) .and_return("openSUSE 11.1 (i586) VERSION = 11.1") end it 'returns os NAME' do expect(suse_release.resolve(:name)).to eq('openSUSE') end it 'returns os VERSION_ID' do expect(suse_release.resolve(:version)).to eq('11.1') end it 'returns the identifier' do expect(suse_release.resolve(:id)).to eq('opensuse') end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/sw_vers_spec.rb000066400000000000000000000033071470204764400252030ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::SwVers do subject(:sw_vers) { Facter::Resolvers::SwVers } context 'with ProductVersionExtra' do before do Facter::Resolvers::SwVers.invalidate_cache allow(Facter::Core::Execution).to receive(:execute) .with('sw_vers', logger: an_instance_of(Facter::Log)) .and_return("ProductName:\tmacOS\nProductVersion:\t13.3.1\n"\ "ProductVersionExtra:\t(a)\nBuildVersion:\t22E772610a\n") end it 'returns os ProductName' do expect(sw_vers.resolve(:productname)).to eq('macOS') end it 'returns os ProductVersion' do expect(sw_vers.resolve(:productversion)).to eq('13.3.1') end it 'returns os ProductVersionExtra' do expect(sw_vers.resolve(:productversionextra)).to eq('(a)') end it 'returns os BuildVersion' do expect(sw_vers.resolve(:buildversion)).to eq('22E772610a') end end context 'without ProductVersionExtra' do before do Facter::Resolvers::SwVers.invalidate_cache allow(Facter::Core::Execution).to receive(:execute) .with('sw_vers', logger: an_instance_of(Facter::Log)) .and_return("ProductName:\tMac OS X\nProductVersion:\t10.14.1\n"\ "BuildVersion:\t18B75\n") end it 'returns os ProductName' do expect(sw_vers.resolve(:productname)).to eq('Mac OS X') end it 'returns os ProductVersion' do expect(sw_vers.resolve(:productversion)).to eq('10.14.1') end it 'returns os BuildVersion' do expect(sw_vers.resolve(:buildversion)).to eq('18B75') end it 'does not return os ProductVersionExtra' do expect(sw_vers.resolve(:productversionextra)).to eq(nil) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/system_profile_spec.rb000066400000000000000000000142411470204764400265560ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Macosx::SystemProfiler do subject(:system_profiler) { Facter::Resolvers::Macosx::SystemProfiler } let(:sp_hardware_data_type_hash) do { model_name: 'MacBook Pro', model_identifier: 'MacBookPro11,4', processor_name: 'Intel Core i7', processor_speed: '2.8 GHz', number_of_processors: '1', total_number_of_cores: '4', l2_cache_per_core: '256 KB', l3_cache: '6 MB', 'hyper-threading_technology': 'Enabled', memory: '16 GB', boot_rom_version: '1037.60.58.0.0 (iBridge: 17.16.12551.0.0,0)', smc_version_system: '2.29f24', serial_number_system: '123456789AAA', hardware_uuid: '12345678-1111-2222-AAAA-AABBCCDDEEFF', activation_lock_status: 'Disabled' } end let(:sp_software_data_type) do { system_version: 'macOS 10.15.2 (19C57)', kernel_version: 'Darwin 19.2.0', boot_volume: 'Macintosh HD', boot_mode: 'Normal', computer_name: 'Test1’s MacBook Pro', user_name: 'Test1 Test2 (test1.test2)', secure_virtual_memory: 'Enabled', system_integrity_protection: 'Enabled', time_since_boot: '3:28' } end let(:sp_ethernet_data_type) do { type: 'Ethernet Controller', bus: 'PCI', vendor_id: '0x8086', device_id: '0x100f', subsystem_vendor_id: '0x1ab8', subsystem_id: '0x0400', revision_id: '0x0000', bsd_name: 'en0', kext_name: 'AppleIntel8254XEthernet.kext', location: '/System/Library/Extensions/IONetworkingFamily.kext/Contents/PlugIns/AppleIntel8254XEthernet.kext', version: '3.1.5' } end context 'when information is obtain from SPHardwareDataType' do before do allow(Facter::Util::Macosx::SystemProfileExecutor) .to receive(:execute) .with('SPHardwareDataType') .and_return(sp_hardware_data_type_hash) end it 'returns boot_rom_version' do expect(system_profiler.resolve(:boot_rom_version)).to eq('1037.60.58.0.0 (iBridge: 17.16.12551.0.0,0)') end it 'returns cores' do expect(system_profiler.resolve(:total_number_of_cores)).to eq('4') end it 'returns hardware_uuid' do expect(system_profiler.resolve(:hardware_uuid)).to eq('12345678-1111-2222-AAAA-AABBCCDDEEFF') end it 'returns l2_cache_per_core' do expect(system_profiler.resolve(:l2_cache_per_core)).to eq('256 KB') end it 'returns l3_cache' do expect(system_profiler.resolve(:l3_cache)).to eq('6 MB') end it 'returns memory' do expect(system_profiler.resolve(:memory)).to eq('16 GB') end it 'returns model_identifier' do expect(system_profiler.resolve(:model_identifier)).to eq('MacBookPro11,4') end it 'returns model_name' do expect(system_profiler.resolve(:model_name)).to eq('MacBook Pro') end it 'returns processor_name' do expect(system_profiler.resolve(:processor_name)).to eq('Intel Core i7') end it 'returns processor_speed' do expect(system_profiler.resolve(:processor_speed)).to eq('2.8 GHz') end it 'returns number_of_processors' do expect(system_profiler.resolve(:number_of_processors)).to eq('1') end it 'returns serial_number' do expect(system_profiler.resolve(:serial_number_system)).to eq('123456789AAA') end it 'returns smc_version' do expect(system_profiler.resolve(:smc_version_system)).to eq('2.29f24') end end context 'when information is obtained from SPSoftwareDataType' do before do allow(Facter::Util::Macosx::SystemProfileExecutor) .to receive(:execute) .with('SPSoftwareDataType') .and_return(sp_software_data_type) end it 'returns boot_mode' do expect(system_profiler.resolve(:boot_mode)).to eq('Normal') end it 'returns boot_volume' do expect(system_profiler.resolve(:boot_volume)).to eq('Macintosh HD') end it 'returns computer_name' do expect(system_profiler.resolve(:computer_name)).to eq('Test1’s MacBook Pro') end it 'returns kernel_version' do expect(system_profiler.resolve(:kernel_version)).to eq('Darwin 19.2.0') end it 'returns secure_virtual_memory' do expect(system_profiler.resolve(:secure_virtual_memory)).to eq('Enabled') end it 'returns system_version' do expect(system_profiler.resolve(:system_version)).to eq('macOS 10.15.2 (19C57)') end it 'returns time_since_boot' do expect(system_profiler.resolve(:time_since_boot)).to eq('3:28') end it 'returns username' do expect(system_profiler.resolve(:user_name)).to eq('Test1 Test2 (test1.test2)') end end context 'when information is obtained from SPEthernetDataType' do before do allow(Facter::Util::Macosx::SystemProfileExecutor) .to receive(:execute) .with('SPEthernetDataType') .and_return(sp_ethernet_data_type) end it 'returns type' do expect(system_profiler.resolve(:type)).to eq('Ethernet Controller') end it 'returns bus' do expect(system_profiler.resolve(:bus)).to eq('PCI') end it 'returns vendor_id' do expect(system_profiler.resolve(:vendor_id)).to eq('0x8086') end it 'returns device_id' do expect(system_profiler.resolve(:device_id)).to eq('0x100f') end it 'returns subsystem_vendor_id' do expect(system_profiler.resolve(:subsystem_vendor_id)).to eq('0x1ab8') end it 'returns subsystem_id' do expect(system_profiler.resolve(:subsystem_id)).to eq('0x0400') end it 'returns revision_id' do expect(system_profiler.resolve(:revision_id)).to eq('0x0000') end it 'returns bsd_name' do expect(system_profiler.resolve(:bsd_name)).to eq('en0') end it 'returns kext_name' do expect(system_profiler.resolve(:kext_name)).to eq('AppleIntel8254XEthernet.kext') end it 'returns location' do expect(system_profiler.resolve(:location)) .to eq('/System/Library/Extensions/IONetworkingFamily.kext/Contents/PlugIns/AppleIntel8254XEthernet.kext') end it 'returns version' do expect(system_profiler.resolve(:version)).to eq('3.1.5') end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/timezone_spec.rb000066400000000000000000000003771470204764400253510ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Timezone do describe '#resolve timezone' do it 'detects timezone' do expect(Facter::Resolvers::Timezone.resolve(:timezone)).to eql(Time.now.localtime.strftime('%Z')) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/uname_spec.rb000066400000000000000000000024341470204764400246200ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Uname do subject(:uname_resolver) { Facter::Resolvers::Uname } before do allow(Facter::Core::Execution).to receive(:execute) .with('uname -m && uname -n && uname -p && uname -r && uname -s && uname -v', logger: an_instance_of(Facter::Log)) .and_return('x86_64 wifi.tsr.corp.puppet.net i386 18.2.0 Darwin Darwin Kernel Version 18.2.0: Fri Oct 5 19:41:49 PDT 2018; root:xnu-4903.221.2~2/RELEASE_X86_64') end after do Facter::Resolvers::Uname.invalidate_cache end it 'returns machine' do expect(uname_resolver.resolve(:machine)).to eq('x86_64') end it 'returns nodename' do expect(uname_resolver.resolve(:nodename)).to eq('wifi.tsr.corp.puppet.net') end it 'returns processor' do expect(uname_resolver.resolve(:processor)).to eq('i386') end it 'returns kernelrelease' do expect(uname_resolver.resolve(:kernelrelease)).to eq('18.2.0') end it 'returns kernelname' do expect(uname_resolver.resolve(:kernelname)).to eq('Darwin') end it 'returns kernelversion' do expect(uname_resolver.resolve(:kernelversion)).to include('root:xnu-4903.221.2~2/RELEASE_X86_64') end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/uptime_spec.rb000066400000000000000000000035021470204764400250130ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Uptime do after { Facter::Resolvers::Uptime.invalidate_cache } describe 'all uptime stats' do before { allow(Facter::Util::Facts::UptimeParser).to receive(:uptime_seconds_unix).and_return(86_500) } it 'returns uptime in days' do expect(Facter::Resolvers::Uptime.resolve(:days)).to eq(1) end it 'returns uptime in hours' do expect(Facter::Resolvers::Uptime.resolve(:hours)).to eq(24) end it 'returns uptime in seconds' do expect(Facter::Resolvers::Uptime.resolve(:seconds)).to eq(86_500) end context 'when we do not input seconds' do it 'returns "uknown" uptime value' do allow(Facter::Util::Facts::UptimeParser).to receive(:uptime_seconds_unix).and_return(nil) expect(Facter::Resolvers::Uptime.resolve(:uptime)).to eq('unknown') end end end describe 'uptime text description' do context 'when the parsed seconds are less than a day' do it 'returns the hours as a text' do allow(Facter::Util::Facts::UptimeParser).to receive(:uptime_seconds_unix).and_return(21_660) expect(Facter::Resolvers::Uptime.resolve(:uptime)).to eq('6:01 hours') end end context 'when the parsed seconds are between 1 and 2 days' do it 'returns "1 day" as a text' do allow(Facter::Util::Facts::UptimeParser).to receive(:uptime_seconds_unix).and_return(86_500) expect(Facter::Resolvers::Uptime.resolve(:uptime)).to eq('1 day') end end context 'when the parsed seconds are more than 2 days' do it 'returns the number of days as a text' do allow(Facter::Util::Facts::UptimeParser).to receive(:uptime_seconds_unix).and_return(186_500) expect(Facter::Resolvers::Uptime.resolve(:uptime)).to eq('2 days') end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/virt_what_spec.rb000066400000000000000000000036731470204764400255300ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::VirtWhat do subject(:virt_what_resolver) { Facter::Resolvers::VirtWhat } after do virt_what_resolver.invalidate_cache end before do allow(Facter::Core::Execution).to receive(:execute).with('virt-what', logger: an_instance_of(Facter::Log)).and_return(content) end context 'when virt-what fails' do let(:content) { '' } it 'returns nil' do expect(virt_what_resolver.resolve(:vm)).to be_nil end end context 'when virt-what detects xen hypervisor' do let(:content) { load_fixture('virt-what-content').read } let(:result) { 'xenhvm' } it 'returns virtual fact' do expect(virt_what_resolver.resolve(:vm)).to eq(result) end end context 'when virt-what detects vserver' do let(:content) { 'linux_vserver' } let(:result) { 'vserver_host' } let(:proc_status_content) { load_fixture('proc_self_status').readlines } before do allow(Facter::Util::FileHelper).to receive(:safe_readlines).with('/proc/self/status', nil) .and_return(proc_status_content) end it 'returns virtual fact' do expect(virt_what_resolver.resolve(:vm)).to eq(result) end end context 'when virt-what detects kvm' do let(:content) { 'kvm' } let(:result) { 'kvm' } it 'returns virtual fact' do expect(virt_what_resolver.resolve(:vm)).to eq(result) end end context 'when virt-what detects kvm in RHEL hypervisors redhat first' do let(:content) { "redhat\nkvm" } let(:result) { 'kvm' } it 'returns virtual fact' do expect(virt_what_resolver.resolve(:vm)).to eq(result) end end context 'when virt-what detects kvm in RHEL hypervisors redhat last' do let(:content) { "kvm\nredhat" } let(:result) { 'kvm' } it 'returns virtual fact' do expect(virt_what_resolver.resolve(:vm)).to eq(result) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/vmware_spec.rb000066400000000000000000000017121470204764400250120ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Vmware do subject(:vmware_resolver) { Facter::Resolvers::Vmware } before do allow(Facter::Core::Execution).to receive(:execute).with('vmware -v', logger: an_instance_of(Facter::Log)).and_return(output) end after do vmware_resolver.invalidate_cache end context 'when vmware command exists' do context 'when it returns invalid format' do let(:output) { 'vmware fusion 7.1' } it 'returns nil' do expect(vmware_resolver.resolve(:vm)).to be_nil end end context 'when it returns valid format' do let(:output) { 'VmWare Fusion' } let(:result) { 'vmware_fusion' } it 'returns nil' do expect(vmware_resolver.resolve(:vm)).to eq(result) end end end context 'when vmware command do not exists' do let(:output) { '' } it 'returns nil' do expect(vmware_resolver.resolve(:vm)).to be_nil end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/windows/000077500000000000000000000000001470204764400236435ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/resolvers/windows/aio_agent_version_spec.rb000066400000000000000000000067071470204764400307070ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Windows::AioAgentVersion do describe '#resolve' do subject(:aio_agent_resolver) { Facter::Resolvers::Windows::AioAgentVersion } let(:puppet_version) { '7.0.1' } let(:reg) { instance_spy(Win32::Registry::HKEY_LOCAL_MACHINE) } before do allow(Win32::Registry::HKEY_LOCAL_MACHINE).to receive(:open).with('SOFTWARE\\Puppet Labs\\Puppet').and_yield(reg) allow(Facter::Util::FileHelper) .to receive(:safe_read) .with('path_to_puppet/VERSION', nil) .and_return(puppet_version) end after do Facter::Resolvers::Windows::AioAgentVersion.invalidate_cache end context 'when the registry path is incorrect' do before do allow(Win32::Registry::HKEY_LOCAL_MACHINE) .to receive(:open) .with('SOFTWARE\\Puppet Labs\\Puppet') .and_raise(Win32::Registry::Error) end it 'logs debug message specific to none existent path' do expect(aio_agent_resolver.log).to receive(:debug).with('The registry path SOFTWARE\Puppet Labs\Puppet does not exist') aio_agent_resolver.resolve(:aio_agent_version) end end context 'when windows is 64 bit edition' do before do allow(reg).to receive(:read).with('RememberedInstallDir64').and_return([1, 'path_to_puppet']) end it 'returns path from registry specific to 64 bit windows' do expect(aio_agent_resolver.resolve(:aio_agent_version)).to eq(puppet_version) end context 'when RememberedInstallDir64 does not contain a value' do before do allow(reg).to receive(:read).with('RememberedInstallDir64').and_return([1, '']) end it 'calls file helper with empty path' do expect(aio_agent_resolver.resolve(:aio_agent_version)).to be(nil) end end context 'when AIO puppet agent is a dev build' do before do allow(Facter::Util::FileHelper) .to receive(:safe_read) .with('path_to_puppet/VERSION', nil) .and_return('7.0.1.8.g12345678') end it 'only shows the first 4 groups of digits' do expect(aio_agent_resolver.resolve(:aio_agent_version)).to eql('7.0.1.8') end end end context 'when windows is 32 bit edition' do before do allow(reg).to receive(:read).with('RememberedInstallDir64').and_raise(Win32::Registry::Error) allow(reg).to receive(:read).with('RememberedInstallDir').and_return([1, 'path_to_puppet']) end it 'logs debug message for 64 bit register' do expect(aio_agent_resolver.log).to receive(:debug).with('Could not read Puppet AIO path from 64 bit registry') aio_agent_resolver.resolve(:aio_agent_version) end it 'returns path from registry specific to 32 bit windows' do expect(aio_agent_resolver.resolve(:aio_agent_version)).to eq(puppet_version) end context 'when there is no registry entry for 32 bit version' do before do allow(reg).to receive(:read).with('RememberedInstallDir').and_raise(Win32::Registry::Error) end it 'logs debug error for 32 bit registry' do allow(aio_agent_resolver.log).to receive(:debug) expect(aio_agent_resolver.log).to receive(:debug).with('Could not read Puppet AIO path from 32 bit registry') aio_agent_resolver.resolve(:aio_agent_version) end end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/windows/dmi_bios_spec.rb000066400000000000000000000036011470204764400267670ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::DMIBios do before do win = double('Facter::Util::Windows::Win32Ole') allow(Facter::Util::Windows::Win32Ole).to receive(:new).and_return(win) allow(win).to receive(:return_first).with('SELECT Manufacturer,SerialNumber from Win32_BIOS').and_return(comp) end after do Facter::Resolvers::DMIBios.invalidate_cache end describe '#resolve' do let(:comp) do double('WIN32OLE', Manufacturer: 'VMware, Inc.', SerialNumber: 'VMware-42 1a 38 c5 9d 35 5b f1-7a 62 4b 6e cb a0 79 de') end it 'detects virtual machine manufacturer' do expect(Facter::Resolvers::DMIBios.resolve(:manufacturer)).to eql('VMware, Inc.') end it 'detects virtual machine serial number' do expect(Facter::Resolvers::DMIBios.resolve(:serial_number)) .to eql('VMware-42 1a 38 c5 9d 35 5b f1-7a 62 4b 6e cb a0 79 de') end end describe '#resolve when WMI query returns nil' do let(:comp) {} it 'logs debug message and serial_number is nil' do allow(Facter::Resolvers::DMIBios.log).to receive(:debug) .with('WMI query returned no results for Win32_BIOS with values Manufacturer and SerialNumber.') expect(Facter::Resolvers::DMIBios.resolve(:serial_number)).to be(nil) end it 'detects manufacturer as nil' do expect(Facter::Resolvers::DMIBios.resolve(:manufacturer)).to be(nil) end end describe '#resolve when WMI query returns nil for Manufacturer and SerialNumber' do let(:comp) do double('WIN32OLE', Manufacturer: nil, SerialNumber: nil) end it 'detects SerialNumber as nil' do expect(Facter::Resolvers::DMIBios.resolve(:serial_number)).to be(nil) end it 'detects manufacturer as nil' do expect(Facter::Resolvers::DMIBios.resolve(:manufacturer)).to be(nil) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/windows/dmi_computersystem_spec.rb000066400000000000000000000033141470204764400311370ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::DMIComputerSystem do before do win = double('Facter::Util::Windows::Win32Ole') allow(Facter::Util::Windows::Win32Ole).to receive(:new).and_return(win) allow(win).to receive(:return_first).with('SELECT Name,UUID FROM Win32_ComputerSystemProduct').and_return(comp) end after do Facter::Resolvers::DMIComputerSystem.invalidate_cache end describe '#resolve' do let(:comp) { double('WIN32OLE', Name: 'VMware7,1', UUID: 'C5381A42-359D-F15B-7A62-4B6ECBA079DE') } it 'detects virtual machine name' do expect(Facter::Resolvers::DMIComputerSystem.resolve(:name)).to eql('VMware7,1') end it 'detects uuid of virtual machine' do expect(Facter::Resolvers::DMIComputerSystem.resolve(:uuid)).to eql('C5381A42-359D-F15B-7A62-4B6ECBA079DE') end end describe '#resolve when WMI query returns nil' do let(:comp) {} it 'logs debug message and name is nil' do allow(Facter::Resolvers::DMIComputerSystem.log).to receive(:debug) .with('WMI query returned no results for Win32_ComputerSystemProduct with values Name and UUID.') expect(Facter::Resolvers::DMIComputerSystem.resolve(:name)).to be(nil) end it 'detects uuid as nil' do expect(Facter::Resolvers::DMIComputerSystem.resolve(:uuid)).to be(nil) end end describe '#resolve when WMI query returns nil for Name and UUID' do let(:comp) { double('WIN32OLE', Name: nil, UUID: nil) } it 'detects name as nil' do expect(Facter::Resolvers::DMIComputerSystem.resolve(:name)).to be(nil) end it 'detects uuid as nil' do expect(Facter::Resolvers::DMIComputerSystem.resolve(:uuid)).to be(nil) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/windows/fips_spec.rb000066400000000000000000000020521470204764400261420ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Windows::Fips do describe '#resolve' do let(:reg) { instance_double('Win32::Registry::HKEY_LOCAL_MACHINE') } before do allow(reg).to receive(:close) allow(reg).to receive(:[]).with('Enabled').and_return(is_fips) allow(reg).to receive(:any?).and_yield('Enabled', '1') allow(Win32::Registry::HKEY_LOCAL_MACHINE).to receive(:open) .with('System\\CurrentControlSet\\Control\\Lsa\\FipsAlgorithmPolicy').and_return(reg) end after do Facter::Resolvers::Windows::Fips.invalidate_cache end context 'when field exists in registry' do let(:is_fips) { 255 } it 'detects that fips is enabled' do expect(Facter::Resolvers::Windows::Fips.resolve(:fips_enabled)).to be(true) end end context "when field doesn't exists in registry" do let(:is_fips) { 0 } it "detects that fips isn't enabled" do expect(Facter::Resolvers::Windows::Fips.resolve(:fips_enabled)).to be(false) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/windows/hardware_architecture_spec.rb000066400000000000000000000064701470204764400315500ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::HardwareArchitecture do let(:sys_info_ptr) { double('FFI::MemoryPointer') } let(:sys_info) { double(SystemInfo) } let(:dummyunion) { double(DummyUnionName) } let(:dummystruct) { double(DummyStructName) } before do allow(FFI::MemoryPointer).to receive(:new).with(SystemInfo.size).and_return(sys_info_ptr) allow(HardwareFFI).to receive(:GetNativeSystemInfo).with(sys_info_ptr) allow(SystemInfo).to receive(:new).with(sys_info_ptr).and_return(sys_info) allow(sys_info).to receive(:[]).with(:dummyunionname).and_return(dummyunion) allow(dummyunion).to receive(:[]).with(:dummystructname).and_return(dummystruct) allow(dummystruct).to receive(:[]).with(:wProcessorArchitecture).and_return(arch) end after do Facter::Resolvers::HardwareArchitecture.invalidate_cache end describe '#resolve when processor is amd64' do let(:arch) { HardwareFFI::PROCESSOR_ARCHITECTURE_AMD64 } it 'detects hardware' do expect(Facter::Resolvers::HardwareArchitecture.resolve(:hardware)).to eql('x86_64') end it 'detects architecture' do expect(Facter::Resolvers::HardwareArchitecture.resolve(:architecture)).to eql('x64') end end describe '#resolve when processor is arm' do let(:arch) { HardwareFFI::PROCESSOR_ARCHITECTURE_ARM } it 'detects hardware' do expect(Facter::Resolvers::HardwareArchitecture.resolve(:hardware)).to eql('arm') end it 'detects architecture' do expect(Facter::Resolvers::HardwareArchitecture.resolve(:architecture)).to eql('arm') end end describe '#resolve when processor is ia64' do let(:arch) { HardwareFFI::PROCESSOR_ARCHITECTURE_IA64 } it 'detects hardware' do expect(Facter::Resolvers::HardwareArchitecture.resolve(:hardware)).to eql('ia64') end it 'detects architecture' do expect(Facter::Resolvers::HardwareArchitecture.resolve(:architecture)).to eql('ia64') end end describe '#resolve when processor is intel and level below 5' do before do allow(sys_info).to receive(:[]).with(:wProcessorLevel).and_return(level) end let(:arch) { HardwareFFI::PROCESSOR_ARCHITECTURE_INTEL } let(:level) { 4 } it 'detects hardware' do expect(Facter::Resolvers::HardwareArchitecture.resolve(:hardware)).to eql("i#{level}86") end it 'detects architecture' do expect(Facter::Resolvers::HardwareArchitecture.resolve(:architecture)).to eql('x86') end end describe '#resolve when processor is intel and level above 5' do before do allow(sys_info).to receive(:[]).with(:wProcessorLevel).and_return(level) end let(:arch) { HardwareFFI::PROCESSOR_ARCHITECTURE_INTEL } let(:level) { 8 } it 'detects hardware' do expect(Facter::Resolvers::HardwareArchitecture.resolve(:hardware)).to eql('i686') end it 'detects architecture' do expect(Facter::Resolvers::HardwareArchitecture.resolve(:architecture)).to eql('x86') end end describe '#resolve when processor unknown' do let(:arch) { nil } it 'detects hardware' do expect(Facter::Resolvers::HardwareArchitecture.resolve(:hardware)).to eql('unknown') end it 'detects architecture' do expect(Facter::Resolvers::HardwareArchitecture.resolve(:architecture)).to eql('unknown') end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/windows/identity_spec.rb000066400000000000000000000072051470204764400270370ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Identity do before do size_ptr = double('FFI::MemoryPointer', read_uint32: 1) name_ptr = double('FFI::MemoryPointer', read_wide_string_with_length: user_name) allow(FFI::MemoryPointer).to receive(:new).with(:win32_ulong, 1).and_return(size_ptr) allow(IdentityFFI).to receive(:GetUserNameExW).with(2, FFI::Pointer::NULL, size_ptr) FFI.define_errno(error_number) allow(FFI::MemoryPointer).to receive(:new).with(:wchar, size_ptr.read_uint32).and_return(name_ptr) allow(IdentityFFI).to receive(:GetUserNameExW).with(2, name_ptr, size_ptr).and_return(error_geting_user?) allow(IdentityFFI).to receive(:IsUserAnAdmin).and_return(admin?) end after do Facter::Resolvers::Identity.invalidate_cache end describe '#resolve when user is administrator' do let(:user_name) { 'MG93C9IN9WKOITF\Administrator' } let(:error_number) { FFI::ERROR_MORE_DATA } let(:error_geting_user?) { 1 } let(:admin?) { 1 } it 'detects user' do expect(Facter::Resolvers::Identity.resolve(:user)).to eql('MG93C9IN9WKOITF\Administrator') end it 'detects that user is administrator' do expect(Facter::Resolvers::Identity.resolve(:privileged)).to be(true) end end describe '#resolve when user is not administrator' do let(:user_name) { 'MG93C9IN9WKOITF\User' } let(:error_number) { FFI::ERROR_MORE_DATA } let(:error_geting_user?) { 1 } let(:admin?) { 0 } it 'detects user' do expect(Facter::Resolvers::Identity.resolve(:user)).to eql('MG93C9IN9WKOITF\User') end it 'detects that user is not administrator' do expect(Facter::Resolvers::Identity.resolve(:privileged)).to be(false) end end describe '#resolve when' do let(:user_name) { 'MG93C9IN9WKOITF\User' } let(:error_number) { FFI::ERROR_MORE_DATA } let(:error_geting_user?) { 1 } let(:admin?) { nil } it 'detects user' do expect(Facter::Resolvers::Identity.resolve(:user)).to eql('MG93C9IN9WKOITF\User') end it 'could not determine if user is admin' do expect(Facter::Resolvers::Identity.resolve(:privileged)).to be(nil) end end describe '#resolve when error code is different than ERROR_MORE_DATA' do let(:user_name) { '' } let(:error_number) { nil } let(:error_geting_user?) { 1 } let(:admin?) { 0 } it 'logs debug message when trying to resolve user' do allow(Facter::Resolvers::Identity.log).to receive(:debug) .with("failure resolving identity facts: #{error_number}") expect(Facter::Resolvers::Identity.resolve(:user)).to be(nil) end it 'logs debug message when trying to find if user is privileged' do allow(Facter::Resolvers::Identity.log).to receive(:debug) .with("failure resolving identity facts: #{error_number}") expect(Facter::Resolvers::Identity.resolve(:privileged)).to be(nil) end end describe '#resolve when there is an error getting user name' do let(:user_name) { '' } let(:error_number) { FFI::ERROR_MORE_DATA } let(:error_geting_user?) { 0 } let(:admin?) { 0 } it 'logs debug message when trying to resolve user' do allow(Facter::Resolvers::Identity.log).to receive(:debug) .with("failure resolving identity facts: #{error_number}") expect(Facter::Resolvers::Identity.resolve(:user)).to be(nil) end it 'logs debug message when trying to find if user is privileged' do allow(Facter::Resolvers::Identity.log).to receive(:debug) .with("failure resolving identity facts: #{error_number}") expect(Facter::Resolvers::Identity.resolve(:privileged)).to be(nil) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/windows/kernel_spec.rb000066400000000000000000000037131470204764400264660ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Kernel do before do ver_ptr = double('FFI::MemoryPointer') ver = double('OsVersionInfoEx', size: nil) allow(FFI::MemoryPointer).to receive(:new).with(OsVersionInfoEx.size).and_return(ver_ptr) allow(OsVersionInfoEx).to receive(:new).with(ver_ptr).and_return(ver) allow(ver).to receive(:[]=).with(:dwOSVersionInfoSize, ver.size) allow(KernelFFI).to receive(:RtlGetVersion).with(ver_ptr).and_return(status) allow(ver).to receive(:[]).with(:dwMajorVersion).and_return(maj) allow(ver).to receive(:[]).with(:dwMinorVersion).and_return(min) allow(ver).to receive(:[]).with(:dwBuildNumber).and_return(buildnr) end after do Facter::Resolvers::Kernel.invalidate_cache end describe '#resolve' do let(:status) { KernelFFI::STATUS_SUCCESS } let(:maj) { 10 } let(:min) { 0 } let(:buildnr) { 123 } it 'detects kernel version' do expect(Facter::Resolvers::Kernel.resolve(:kernelversion)).to eql('10.0.123') end it 'detects kernel major version' do expect(Facter::Resolvers::Kernel.resolve(:kernelmajorversion)).to eql('10.0') end it 'detects kernel name' do expect(Facter::Resolvers::Kernel.resolve(:kernel)).to eql('windows') end end describe '#resolve when RtlGetVersion function fails to get os version information' do let(:status) { 10 } let(:maj) { 10 } let(:min) { 0 } let(:buildnr) { 123 } it 'logs debug message and kernel version nil' do allow(Facter::Resolvers::Kernel.log).to receive(:debug).with('Calling Windows RtlGetVersion failed') expect(Facter::Resolvers::Kernel.resolve(:kernelversion)).to be(nil) end it 'detects that kernel major version is nil' do expect(Facter::Resolvers::Kernel.resolve(:kernelmajorversion)).to be(nil) end it 'detects that kernel name is nil' do expect(Facter::Resolvers::Kernel.resolve(:kernel)).to be(nil) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/windows/memory_spec.rb000066400000000000000000000107661470204764400265240ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Memory do before do state_ptr = double('FFI::MemoryPointer', size: nil) state = double('PerformanceInformation', size: nil) allow(FFI::MemoryPointer).to receive(:new).with(PerformanceInformation.size).and_return(state_ptr) allow(MemoryFFI).to receive(:GetPerformanceInfo).with(state_ptr, state_ptr.size).and_return(status) allow(PerformanceInformation).to receive(:new).with(state_ptr).and_return(state) allow(state).to receive(:[]).with(:PhysicalTotal).and_return(total) allow(state).to receive(:[]).with(:PageSize).and_return(page_size) allow(state).to receive(:[]).with(:PhysicalAvailable).and_return(available) end after do Facter::Resolvers::Memory.invalidate_cache end describe '#resolve' do let(:status) { 1 } let(:total) { 1_048_313 } let(:page_size) { 4096 } let(:available) { 824_031 } it 'detects total bytes' do expect(Facter::Resolvers::Memory.resolve(:total_bytes)).to eq(4_293_890_048) end it 'detects available bytes' do expect(Facter::Resolvers::Memory.resolve(:available_bytes)).to eq(3_375_230_976) end it 'determines used bytes' do expect(Facter::Resolvers::Memory.resolve(:used_bytes)).to eq(918_659_072) end it 'determines capacity' do expect(Facter::Resolvers::Memory.resolve(:capacity)).to eql('21.39%') end end describe '#resolve when total bytes is 0' do let(:status) { 1 } let(:total) { 0 } let(:page_size) { 4096 } let(:available) { 23 } it 'detects total_bytes as nil' do allow(Facter::Resolvers::Memory.log).to receive(:debug) .with('Available or Total bytes are zero could not proceed further') expect(Facter::Resolvers::Memory.resolve(:total_bytes)).to be(nil) end it 'detects available bytes as nil' do expect(Facter::Resolvers::Memory.resolve(:available_bytes)).to be(nil) end it 'determines used bytes as nil' do expect(Facter::Resolvers::Memory.resolve(:used_bytes)).to be(nil) end it 'determines capacity as nil' do expect(Facter::Resolvers::Memory.resolve(:capacity)).to be(nil) end end describe '#resolve when available bytes is 0' do let(:status) { 1 } let(:total) { 3242 } let(:page_size) { 4096 } let(:available) { 0 } it 'detects total bytes as nil' do allow(Facter::Resolvers::Memory.log).to receive(:debug) .with('Available or Total bytes are zero could not proceed further') expect(Facter::Resolvers::Memory.resolve(:total_bytes)).to be(nil) end it 'detects available bytes as nil' do expect(Facter::Resolvers::Memory.resolve(:available_bytes)).to be(nil) end it 'determines used bytes as nil' do expect(Facter::Resolvers::Memory.resolve(:used_bytes)).to be(nil) end it 'determines capacity as nil' do expect(Facter::Resolvers::Memory.resolve(:capacity)).to be(nil) end end describe '#resolve when page size is 0' do let(:status) { 1 } let(:total) { 3242 } let(:page_size) { 0 } let(:available) { 4096 } it 'detects total bytes as nil' do allow(Facter::Resolvers::Memory.log).to receive(:debug) .with('Available or Total bytes are zero could not proceed further') expect(Facter::Resolvers::Memory.resolve(:total_bytes)).to be(nil) end it 'detects available bytes as nil' do expect(Facter::Resolvers::Memory.resolve(:available_bytes)).to be(nil) end it 'determines used bytes as nil' do expect(Facter::Resolvers::Memory.resolve(:used_bytes)).to be(nil) end it 'determines capacity as nil' do expect(Facter::Resolvers::Memory.resolve(:capacity)).to be(nil) end end describe '#resolve when GetPerformanceInfo function fails' do let(:status) { FFI::WIN32FALSE } let(:total) { 1_048_313 } let(:page_size) { 4096 } let(:available) { 824_031 } it 'logs debug message and detects total bytes as nil' do allow(Facter::Resolvers::Memory.log).to receive(:debug).with('Resolving memory facts failed') expect(Facter::Resolvers::Memory.resolve(:total_bytes)).to be(nil) end it 'detects available bytes as nil' do expect(Facter::Resolvers::Memory.resolve(:available_bytes)).to be(nil) end it 'determines used bytes as nil' do expect(Facter::Resolvers::Memory.resolve(:used_bytes)).to be(nil) end it 'determines capacity as nil' do expect(Facter::Resolvers::Memory.resolve(:capacity)).to be(nil) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/windows/netkvm_spec.rb000066400000000000000000000016021470204764400265050ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::NetKVM do describe '#resolve' do let(:reg) { instance_spy('Win32::Registry') } before do allow(reg).to receive(:keys).and_return(reg_value) allow(reg).to receive(:close) allow(Win32::Registry::HKEY_LOCAL_MACHINE).to receive(:open) .with('SYSTEM\\CurrentControlSet\\Services') .and_return(reg) end after do Facter::Resolvers::NetKVM.invalidate_cache end context 'when is not kvm' do let(:reg_value) { { 'puppet' => 'labs' } } it 'returns false' do expect(Facter::Resolvers::NetKVM.resolve(:kvm)).to be(false) end end context 'when is kvm' do let(:reg_value) { { 'puppet' => 'labs', 'netkvm' => 'info' } } it 'returns true' do expect(Facter::Resolvers::NetKVM.resolve(:kvm)).to be(true) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/windows/networking_spec.rb000066400000000000000000000260751470204764400274030ustar00rootroot00000000000000# frozen_string_literal: true require 'ostruct' describe Facter::Resolvers::Windows::Networking do subject(:resolver) { Facter::Resolvers::Windows::Networking } describe '#resolve' do let(:size_ptr) { instance_spy(FFI::MemoryPointer) } let(:adapter_address) { instance_spy(FFI::MemoryPointer) } let(:reg) { instance_spy('Win32::Registry::HKEY_LOCAL_MACHINE') } let(:domain) { '' } before do allow(FFI::MemoryPointer).to receive(:new).and_call_original allow(FFI::MemoryPointer).to receive(:new) .with(NetworkingFFI::BUFFER_LENGTH).and_return(size_ptr) allow(FFI::MemoryPointer).to receive(:new) .with(IpAdapterAddressesLh.size, NetworkingFFI::BUFFER_LENGTH) .and_return(adapter_address) allow(NetworkingFFI).to receive(:GetAdaptersAddresses) .with(NetworkingFFI::AF_UNSPEC, 14, FFI::Pointer::NULL, adapter_address, size_ptr) .and_return(error_code) allow(Win32::Registry::HKEY_LOCAL_MACHINE).to receive(:open) .with('SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters') .and_yield(reg) allow(reg).to receive(:[]).with('Domain').and_return(domain) allow(reg).to receive(:close) end after do resolver.invalidate_cache end context 'when fails to retrieve networking information' do let(:error_code) { NetworkingFFI::ERROR_NO_DATA } before do allow(resolver.log).to receive(:debug).with('Unable to retrieve networking facts!') end it 'returns interfaces fact as nil' do expect(resolver.resolve(:interfaces)).to be(nil) end it 'logs debug message' do resolver.resolve(:interfaces) expect(resolver.log).to have_received(:debug).with('Unable to retrieve networking facts!') end it 'returns nil for domain' do expect(resolver.resolve(:domain)).to be(nil) end end context 'when fails to retrieve networking information after 3 tries' do let(:error_code) { NetworkingFFI::ERROR_BUFFER_OVERFLOW } before do allow(FFI::MemoryPointer).to receive(:new).exactly(4).times .with(IpAdapterAddressesLh.size, NetworkingFFI::BUFFER_LENGTH) .and_return(adapter_address) allow(NetworkingFFI) .to receive(:GetAdaptersAddresses) .exactly(3).times .with(NetworkingFFI::AF_UNSPEC, 14, FFI::Pointer::NULL, adapter_address, size_ptr) .and_return(error_code) end it 'returns nil' do expect(resolver.resolve(:interfaces)).to be(nil) end end context 'when it succeeded to retrieve networking information but all interface are down' do let(:error_code) { NetworkingFFI::ERROR_SUCCES } let(:adapter) { instance_double('FFI::MemoryPointer') } let(:next_adapter) { instance_spy(FFI::Pointer) } before do allow(IpAdapterAddressesLh).to receive(:read_list).with(adapter_address).and_yield(adapter) allow(IpAdapterAddressesLh).to receive(:new).with(next_adapter).and_return(adapter) allow(adapter).to receive(:[]).with(:OperStatus).and_return(NetworkingFFI::IF_OPER_STATUS_DOWN) allow(adapter).to receive(:[]).with(:Next).and_return(next_adapter) allow(adapter).to receive(:to_ptr).and_return(FFI::Pointer::NULL) end it 'returns nil' do expect(resolver.resolve(:interfaces)).to be(nil) end end context "when it succeeded to retrieve networking information but the interface hasn't got an address" do let(:error_code) { NetworkingFFI::ERROR_SUCCES } let(:adapter) do OpenStruct.new(OperStatus: NetworkingFFI::IF_OPER_STATUS_UP, IfType: NetworkingFFI::IF_TYPE_ETHERNET_CSMACD, DnsSuffix: dns_ptr, FriendlyName: friendly_name_ptr, Flags: 0, Mtu: 1500, FirstUnicastAddress: ptr) end let(:dns_ptr) { instance_spy(FFI::Pointer) } let(:friendly_name_ptr) { instance_spy(FFI::Pointer) } let(:ptr) { instance_spy(FFI::Pointer) } let(:unicast) { OpenStruct.new(Address: ptr, Next: ptr, to_ptr: FFI::Pointer::NULL) } before do allow(IpAdapterAddressesLh).to receive(:read_list).with(adapter_address).and_yield(adapter) allow(IpAdapterUnicastAddressLH).to receive(:read_list).with(ptr).and_yield(unicast) allow(NetworkUtils).to receive(:address_to_string).with(ptr).and_return(nil) allow(IpAdapterUnicastAddressLH).to receive(:new).with(ptr).and_return(unicast) allow(NetworkUtils).to receive(:find_mac_address).with(adapter).and_return('00:50:56:9A:F8:6B') allow(friendly_name_ptr).to receive(:read_wide_string_without_length).and_return('Ethernet0') allow(dns_ptr).to receive(:read_wide_string_without_length).and_return('domain') end it 'returns interfaces' do expected = { 'Ethernet0' => { dhcp: nil, mac: '00:50:56:9A:F8:6B', mtu: 1500 } } expect(resolver.resolve(:interfaces)).to eql(expected) end it 'returns domain' do expect(resolver.resolve(:domain)).to eq('domain') end it 'returns nil for mtu fact as primary interface is nil' do expect(resolver.resolve(:mtu)).to be(nil) end it 'returns nil for dhcp fact as primary interface is nil' do expect(resolver.resolve(:dhcp)).to be(nil) end it 'returns nil for mac fact as primary interface is nil' do expect(resolver.resolve(:mac)).to be(nil) end end context 'when it succeeded to retrieve networking information but the interface has an address' do let(:error_code) { NetworkingFFI::ERROR_SUCCES } let(:adapter) do OpenStruct.new(OperStatus: NetworkingFFI::IF_OPER_STATUS_UP, IfType: NetworkingFFI::IF_TYPE_ETHERNET_CSMACD, DnsSuffix: dns_ptr, FriendlyName: friendly_name_ptr, Flags: 0, Mtu: 1500, FirstUnicastAddress: ptr, Next: ptr, to_ptr: FFI::Pointer::NULL) end let(:ptr) { instance_spy(FFI::Pointer) } let(:dns_ptr) { instance_spy(FFI::Pointer) } let(:friendly_name_ptr) { instance_spy(FFI::Pointer) } let(:unicast) { OpenStruct.new(Address: address, Next: ptr, to_ptr: FFI::Pointer::NULL, OnLinkPrefixLength: 24) } let(:address) { OpenStruct.new(lpSockaddr: ptr) } let(:sock_address) { OpenStruct.new(sa_family: NetworkingFFI::AF_INET) } let(:binding) do { address: '10.16.127.3', netmask: '255.255.255.0', network: '10.16.127.0' } end before do allow(IpAdapterAddressesLh).to receive(:read_list).with(adapter_address).and_yield(adapter) allow(IpAdapterUnicastAddressLH).to receive(:read_list).with(ptr).and_yield(unicast) allow(NetworkUtils).to receive(:address_to_string).with(address).and_return('10.16.127.3') allow(SockAddr).to receive(:new).with(ptr).and_return(sock_address) allow(NetworkUtils).to receive(:ignored_ip_address).with('10.16.127.3').and_return(false) allow(IpAdapterUnicastAddressLH).to receive(:new).with(ptr).and_return(unicast) allow(NetworkUtils).to receive(:find_mac_address).with(adapter).and_return('00:50:56:9A:F8:6B') allow(IpAdapterAddressesLh).to receive(:new).with(ptr).and_return(adapter) allow(dns_ptr).to receive(:read_wide_string_without_length).and_return('10.122.0.2') allow(friendly_name_ptr).to receive(:read_wide_string_without_length).and_return('Ethernet0') end it 'returns interface' do result = { 'Ethernet0' => { bindings: [binding], dhcp: nil, ip: '10.16.127.3', mac: '00:50:56:9A:F8:6B', mtu: 1500, netmask: '255.255.255.0', network: '10.16.127.0' } } expect(resolver.resolve(:interfaces)).to eql(result) end end context 'when it succeeded to retrieve networking information but the interface has an ipv6 address' do let(:error_code) { NetworkingFFI::ERROR_SUCCES } let(:adapter) do OpenStruct.new(OperStatus: NetworkingFFI::IF_OPER_STATUS_UP, IfType: NetworkingFFI::IF_TYPE_ETHERNET_CSMACD, DnsSuffix: dns_ptr, FriendlyName: friendly_name_ptr, Flags: 0, Mtu: 1500, FirstUnicastAddress: ptr, Next: ptr, to_ptr: FFI::Pointer::NULL) end let(:ptr) { FFI::Pointer.new } let(:dns_ptr) { FFI::Pointer.new } let(:friendly_name_ptr) { FFI::Pointer.new } let(:unicast) { OpenStruct.new(Address: address, Next: ptr, to_ptr: FFI::Pointer::NULL, OnLinkPrefixLength: 24) } let(:address) { OpenStruct.new(lpSockaddr: ptr) } let(:sock_address) { OpenStruct.new(sa_family: NetworkingFFI::AF_INET6) } let(:binding) do { address: 'fe80::7ca0:ab22:703a:b329', netmask: 'ffff:ff00::', network: 'fe80::', scope6: 'link' } end let(:domain) { 'my_domain' } let(:wchar_null) { "\0".encode(Encoding::UTF_16LE) } let(:invalid_chars) { (+"\xf0\xdc").force_encoding(Encoding::UTF_16LE) } def stub_utf16le_bytes(ptr, str) i = 0 str.encode(Encoding::UTF_16LE).each_char do |ch| allow(ptr).to receive(:get_bytes).with(i, 2).and_return(ch) i += 2 end allow(ptr).to receive(:get_bytes).with(i, 2).and_return(wchar_null) end before do allow(IpAdapterAddressesLh).to receive(:read_list).with(adapter_address).and_yield(adapter) allow(IpAdapterUnicastAddressLH).to receive(:read_list).with(ptr).and_yield(unicast) allow(NetworkUtils).to receive(:address_to_string).with(address).and_return('fe80::7ca0:ab22:703a:b329') allow(SockAddr).to receive(:new).with(ptr).and_return(sock_address) allow(NetworkUtils).to receive(:ignored_ip_address).with('fe80::7ca0:ab22:703a:b329') allow(IpAdapterUnicastAddressLH).to receive(:new).with(ptr).and_return(unicast) allow(NetworkUtils).to receive(:find_mac_address).with(adapter).and_return('00:50:56:9A:F8:6B') allow(IpAdapterAddressesLh).to receive(:new).with(ptr).and_return(adapter) stub_utf16le_bytes(dns_ptr, '') stub_utf16le_bytes(friendly_name_ptr, 'Ethernet0') end it 'returns interface' do result = { 'Ethernet0' => { bindings6: [binding], dhcp: nil, ip6: 'fe80::7ca0:ab22:703a:b329', mac: '00:50:56:9A:F8:6B', mtu: 1500, netmask6: 'ffff:ff00::', network6: 'fe80::', scope6: 'link' } } expect(resolver.resolve(:interfaces)).to eql(result) end it 'returns domain' do expect(resolver.resolve(:domain)).to eql(domain) end it 'replaces invalid characters in the friendly name' do stub_utf16le_bytes(friendly_name_ptr, invalid_chars) resolved_interface = resolver.resolve(:interfaces).keys.first expect(resolved_interface).to eq("\uFFFD") end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/windows/processors_spec.rb000066400000000000000000000114221470204764400274040ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Processors do subject(:resolver) { Facter::Resolvers::Processors } before do win = double('Facter::Util::Windows::Win32Ole') query_string = 'SELECT Name,'\ 'Architecture,'\ 'NumberOfLogicalProcessors,'\ 'NumberOfCores FROM Win32_Processor' allow(Facter::Util::Windows::Win32Ole).to receive(:new).and_return(win) allow(win).to receive(:exec_query) .with(query_string) .and_return(proc) end after do resolver.invalidate_cache end describe '#resolve' do let(:proc) do [ double( 'proc', Name: 'Pretty_Name', Architecture: 0, NumberOfLogicalProcessors: 2, NumberOfCores: 2 ) ] end it 'detects models of processors' do expect(resolver.resolve(:models)).to eql(['Pretty_Name']) end it 'detects isa' do expect(resolver.resolve(:isa)).to eql('x86') end it 'counts proccesors' do expect(resolver.resolve(:count)).to be(2) end it 'counts physical processors' do expect(resolver.resolve(:physicalcount)).to be(1) end it 'counts number of cores per socket' do expect(resolver.resolve(:cores_per_socket)).to be(2) end it 'counts number of threads per core' do expect(resolver.resolve(:threads_per_core)).to be(1) end end describe '#resolve when number of logical processors is 0' do let(:proc) do [double('proc', Name: 'Pretty_Name', Architecture: 0, NumberOfLogicalProcessors: 0, NumberOfCores: 2), double('proc', Name: 'Awesome_Name', Architecture: 10, NumberOfLogicalProcessors: 0, NumberOfCores: 2)] end it 'detects models' do expect(resolver.resolve(:models)).to eql(%w[Pretty_Name Awesome_Name]) end it 'detects isa' do expect(resolver.resolve(:isa)).to eql('x86') end it 'counts proccesors' do expect(resolver.resolve(:count)).to be(2) end it 'counts physical processors' do expect(resolver.resolve(:physicalcount)).to be(2) end it 'counts number of cores per socket' do expect(resolver.resolve(:cores_per_socket)).to be(2) end it 'counts number of threads per core' do expect(resolver.resolve(:threads_per_core)).to be(1) end end describe '#resolve logs a debug message when is an unknown architecture' do let(:proc) do [ double( 'proc', Name: 'Pretty_Name', Architecture: 10, NumberOfLogicalProcessors: 2, NumberOfCores: 2 ) ] end it 'logs that is unknown architecture' do allow(resolver.log).to receive(:debug) .with('Unable to determine processor type: unknown architecture') expect(resolver.resolve(:isa)).to be(nil) end end describe '#resolve when WMI query returns nil' do let(:proc) { nil } it 'logs that query failed and isa nil' do allow(resolver.log).to receive(:debug) .with('WMI query returned no results'\ 'for Win32_Processor with values Name, Architecture and NumberOfLogicalProcessors.') expect(resolver.resolve(:isa)).to be(nil) end it 'detects that models fact is nil' do expect(resolver.resolve(:models)).to be(nil) end it 'detects that count fact is nil' do expect(resolver.resolve(:count)).to be(nil) end it 'detects that physicalcount fact is nil' do expect(resolver.resolve(:physicalcount)).to be(nil) end it 'counts number of cores per socket' do expect(resolver.resolve(:cores_per_socket)).to be(nil) end it 'counts number of threads per core' do expect(resolver.resolve(:threads_per_core)).to be(nil) end end describe '#resolve when WMI query returns nil for Name, Architecture and NumberOfLogicalProcessors' do let(:proc) do [ double( 'proc', Name: nil, Architecture: nil, NumberOfLogicalProcessors: nil, NumberOfCores: 2 ) ] end it 'detects that isa is nil' do allow(resolver.log).to receive(:debug) .with('Unable to determine processor type: unknown architecture') expect(resolver.resolve(:isa)).to be(nil) end it 'detects that models is an array' do expect(resolver.resolve(:models)).to eql([nil]) end it 'detects count fact' do expect(resolver.resolve(:count)).to be(1) end it 'detects physicalcount' do expect(resolver.resolve(:physicalcount)).to be(1) end it 'counts number of cores per socket' do expect(resolver.resolve(:cores_per_socket)).to be(2) end it 'counts number of threads per core' do expect(resolver.resolve(:threads_per_core)).to be(1) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/windows/product_release_spec.rb000066400000000000000000000063451470204764400303720ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::ProductRelease do describe '#resolve' do let(:reg) { instance_double('Win32::Registry::HKEY_LOCAL_MACHINE') } let(:ed) { 'ServerStandard' } let(:install) { 'Server' } let(:prod) { 'Windows Server 2022 Standard' } let(:release) { '1809' } let(:display_version) { '21H2' } # https://github.com/ruby/ruby/blob/6da8f04e01fd85e54a641c6ec4816153b9557095/ext/win32/lib/win32/registry.rb#L114 let(:reg_sz) { 1 } before do allow(Win32::Registry::HKEY_LOCAL_MACHINE).to receive(:open) .with('SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion') .and_return(reg) allow(reg).to receive(:each) .and_yield('EditionID', reg_sz, ed) .and_yield('InstallationType', reg_sz, install) .and_yield('ProductName', reg_sz, prod) .and_yield('ReleaseId', reg_sz, release) .and_yield('DisplayVersion', reg_sz, display_version) allow(reg).to receive(:close) end after do Facter::Resolvers::ProductRelease.invalidate_cache end context 'when all fields exist in registry' do it 'detects edition id' do expect(Facter::Resolvers::ProductRelease.resolve(:edition_id)).to eql(ed) end it 'detects installation type' do expect(Facter::Resolvers::ProductRelease.resolve(:installation_type)).to eql(install) end it 'detects product name' do expect(Facter::Resolvers::ProductRelease.resolve(:product_name)).to eql(prod) end it 'detects release id' do expect(Facter::Resolvers::ProductRelease.resolve(:release_id)).to eql(display_version) end it 'detects display version' do expect(Facter::Resolvers::ProductRelease.resolve(:display_version)).to eql(display_version) end end context "when InstallationType doesn't exist in registry" do let(:install) { nil } it 'detects edition id' do expect(Facter::Resolvers::ProductRelease.resolve(:edition_id)).to eql(ed) end it 'detects installation type as nil' do expect(Facter::Resolvers::ProductRelease.resolve(:installation_type)).to be(nil) end it 'detects product name' do expect(Facter::Resolvers::ProductRelease.resolve(:product_name)).to eql(prod) end it 'detects release id' do expect(Facter::Resolvers::ProductRelease.resolve(:release_id)).to eql(display_version) end it 'detects display version' do expect(Facter::Resolvers::ProductRelease.resolve(:display_version)).to eql(display_version) end end context 'when DisplayVersion registry key is not available' do before do allow(Win32::Registry::HKEY_LOCAL_MACHINE).to receive(:open) .with('SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion') .and_return(reg) allow(reg).to receive(:each) .and_yield('ReleaseId', reg_sz, release) allow(reg).to receive(:close) end it 'detects release id' do expect(Facter::Resolvers::ProductRelease.resolve(:release_id)).to eql(release) end it 'detects display version' do expect(Facter::Resolvers::ProductRelease.resolve(:display_version)).to be(nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/windows/ssh_spec.rb000066400000000000000000000102611470204764400257770ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Windows::Ssh do describe '#resolve' do before do allow(ENV).to receive(:[]).with('programdata').and_return(programdata_dir) allow(File).to receive(:directory?).with("#{programdata_dir}/ssh").and_return(dir_exists) end after do Facter::Resolvers::Windows::Ssh.invalidate_cache end context 'when programdata enviroment variable is set' do let(:programdata_dir) { 'C:/ProgramData' } let(:dir_exists) { true } before do allow(Facter::Util::FileHelper).to receive(:safe_read).with("#{programdata_dir}/ssh/ssh_host_ecdsa_key.pub") .and_return(ecdsa_content) allow(Facter::Util::FileHelper).to receive(:safe_read).with("#{programdata_dir}/ssh/ssh_host_ed25519_key.pub") .and_return(ed25519_content) allow(Facter::Util::FileHelper).to receive(:safe_read).with("#{programdata_dir}/ssh/ssh_host_dsa_key.pub") .and_return('') allow(Facter::Util::FileHelper).to receive(:safe_read).with("#{programdata_dir}/ssh/ssh_host_rsa_key.pub") .and_return(rsa_content) end context 'when ecdsa, ed25519 and rsa files exists' do before do allow(Facter::Util::Resolvers::SshHelper).to receive(:create_ssh) .with('ssh-rsa', load_fixture('rsa_key').read.strip!) .and_return(rsa_result) allow(Facter::Util::Resolvers::SshHelper).to receive(:create_ssh) .with('ecdsa-sha2-nistp256', load_fixture('ecdsa_key').read.strip!) .and_return(ecdsa_result) allow(Facter::Util::Resolvers::SshHelper).to receive(:create_ssh) .with('ssh-ed25519', load_fixture('ed25519_key').read.strip!) .and_return(ed25519_result) end let(:ecdsa_exists) { true } let(:rsa_exists) { true } let(:ed25519_exists) { true } let(:ecdsa_content) { load_fixture('ecdsa').read.strip! } let(:rsa_content) { load_fixture('rsa').read.strip! } let(:ed25519_content) { load_fixture('ed25519').read.strip! } let(:ecdsa_fingerprint) do Facter::Util::Resolvers::FingerPrint.new( 'SSHFP 3 1 fd92cf867fac0042d491eb1067e4f3cabf54039a', 'SSHFP 3 2 a51271a67987d7bbd685fa6d7cdd2823a30373ab01420b094480523fabff2a05' ) end let(:rsa_fingerprint) do Facter::Util::Resolvers::FingerPrint.new( 'SSHFP 1 1 90134f93fec6ab5e22bdd88fc4d7cd6e9dca4a07', 'SSHFP 1 2 efaa26ff8169f5ffc372ebcad17aef886f4ccaa727169acdd0379b51c6c77e99' ) end let(:ed25519_fingerprint) do Facter::Util::Resolvers::FingerPrint.new( 'SSHFP 4 1 f5780634d4e34c6ef2411ac439b517bfdce43cf1', 'SSHFP 4 2 c1257b3865df22f3349f9ebe19961c8a8edf5fbbe883113e728671b42d2c9723' ) end let(:ecdsa_result) do Facter::Util::Resolvers::Ssh.new(ecdsa_fingerprint, 'ecdsa-sha2-nistp256', ecdsa_content, 'ecdsa') end let(:rsa_result) do Facter::Util::Resolvers::Ssh.new(rsa_fingerprint, 'ssh-rsa', rsa_content, 'rsa') end let(:ed25519_result) do Facter::Util::Resolvers::Ssh.new(ed25519_fingerprint, 'ssh-ed22519', ed25519_content, 'ed25519') end it 'returns ssh fact' do expect(Facter::Resolvers::Windows::Ssh.resolve(:ssh)).to eq([rsa_result, ecdsa_result, ed25519_result]) end end context 'when files are not readable' do let(:ecdsa_content) { '' } let(:rsa_content) { '' } let(:ed25519_content) { '' } it 'returns nil' do expect(Facter::Resolvers::Windows::Ssh.resolve(:ssh)).to eq(nil) end end end context 'when programdata enviroment variable is not set' do let(:programdata_dir) { '' } let(:dir_exists) { false } it 'returns nil' do expect(Facter::Resolvers::Windows::Ssh.resolve(:ssh)).to eq(nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/windows/system32_spec.rb000066400000000000000000000045761470204764400267070ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::System32 do before do allow(ENV).to receive(:[]).with('SystemRoot').and_return(win_path) bool_ptr = double('FFI::MemoryPointer', read_win32_bool: is_wow) allow(FFI::MemoryPointer).to receive(:new).with(:win32_bool, 1).and_return(bool_ptr) allow(System32FFI).to receive(:GetCurrentProcess).and_return(2) allow(System32FFI).to receive(:IsWow64Process).with(2, bool_ptr).and_return(bool) end after do Facter::Resolvers::System32.invalidate_cache end describe '#resolve when is wow 64 process' do let(:win_path) { 'C:\\Windows' } let(:bool) { 1 } let(:is_wow) { true } it 'detects sysnative dir' do expect(Facter::Resolvers::System32.resolve(:system32)).to eql("#{win_path}\\sysnative") end end describe '#resolve when it is not wow 64 process' do let(:win_path) { 'C:\\Windows' } let(:bool) { 1 } let(:is_wow) { false } it 'detects system32 dir' do expect(Facter::Resolvers::System32.resolve(:system32)).to eql("#{win_path}\\system32") end end describe '#resolve when env variable is not set' do let(:win_path) { '' } let(:bool) { 1 } let(:is_wow) { false } it 'detects system32 dir is nil and prints debug message' do allow(Facter::Resolvers::System32.log).to receive(:debug) .with('Unable to find correct value for SystemRoot enviroment variable') expect(Facter::Resolvers::System32.resolve(:system32)).to be(nil) end end describe '#resolve when env variable is found as nil' do let(:win_path) { nil } let(:bool) { 1 } let(:is_wow) { false } it 'detects system32 dir is nil and prints debug message' do allow(Facter::Resolvers::System32.log).to receive(:debug).with('Unable to find correct value for SystemRoot'\ ' enviroment variable') expect(Facter::Resolvers::System32.resolve(:system32)).to be(nil) end end describe '#resolve when IsWow64Process fails' do let(:win_path) { 'C:\\Windows' } let(:bool) { 0 } let(:is_wow) { false } it 'detects system32 dir is nil and prints debug message' do allow(Facter::Resolvers::System32.log).to receive(:debug).with('IsWow64Process failed') expect(Facter::Resolvers::System32.resolve(:system32)).to be(nil) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/windows/timezone_spec.rb000066400000000000000000000044751470204764400270460ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Windows::Timezone do before do Facter::Resolvers::Windows::Timezone.invalidate_cache end describe '#resolve timezone' do it 'resolves timezone with codepage from api' do allow(Facter::Resolvers::Windows::Timezone).to receive(:codepage_from_api).and_return('850') expect(Facter::Resolvers::Windows::Timezone.resolve(:timezone).encoding.to_s).to eql('UTF-8') end it 'resolves timezone with codepage from registry' do allow(Facter::Resolvers::Windows::Timezone).to receive(:codepage_from_api).and_return('') allow(Facter::Resolvers::Windows::Timezone).to receive(:codepage_from_registry).and_return('850') expect(Facter::Resolvers::Windows::Timezone.resolve(:timezone).encoding.to_s).to eql('UTF-8') end it 'resolves timezone with default codepage' do allow(Facter::Resolvers::Windows::Timezone).to receive(:codepage_from_api).and_return('') allow(Facter::Resolvers::Windows::Timezone).to receive(:codepage_from_registry).and_return('something_invalid') expect(Facter::Resolvers::Windows::Timezone.resolve(:timezone).encoding).to eql(Time.now.zone.encoding) end it 'detects timezone' do allow(Facter::Resolvers::Windows::Timezone).to receive(:codepage).and_return('850') timezone_result = Time.now.zone.force_encoding('CP850') expect(Facter::Resolvers::Windows::Timezone.resolve(:timezone)).to eql(timezone_result) end end describe '#codepage' do it 'gets codepage from api' do expect(Facter::Resolvers::Windows::Timezone).to receive(:codepage_from_api) Facter::Resolvers::Windows::Timezone.resolve(:timezone) end it 'gets codepage from registry' do allow(Facter::Resolvers::Windows::Timezone).to receive(:codepage_from_api).and_return('') expect(Facter::Resolvers::Windows::Timezone).to receive(:codepage_from_registry) Facter::Resolvers::Windows::Timezone.resolve(:timezone) end it 'gets invalid codepage' do allow(Facter::Resolvers::Windows::Timezone).to receive(:codepage_from_api).and_return('') allow(Facter::Resolvers::Windows::Timezone).to receive(:codepage_from_registry).and_return('something_invalid') expect { Facter::Resolvers::Windows::Timezone.resolve(:timezone) }.not_to raise_error end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/windows/uptime_spec.rb000066400000000000000000000154311470204764400265110ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Windows::Uptime do before do win = double('Facter::Util::Windows::Win32Ole') allow(Facter::Util::Windows::Win32Ole).to receive(:new).and_return(win) allow(win).to receive(:return_first).with('SELECT LocalDateTime,LastBootUpTime FROM Win32_OperatingSystem') .and_return(comp) end after do Facter::Resolvers::Windows::Uptime.invalidate_cache end describe '#resolve' do context 'when system is up for 1 hour' do let(:comp) { double('WIN32OLE', LocalDateTime: local_time, LastBootUpTime: last_bootup_time) } let(:local_time) { '20010203040506+0700' } let(:last_bootup_time) { '20010203030506+0700' } it 'resolves uptime' do expect(Facter::Resolvers::Windows::Uptime.resolve(:uptime)).to eql('1:00 hours') end it 'resolves seconds' do expect(Facter::Resolvers::Windows::Uptime.resolve(:seconds)).to be(3600) end it 'resolves hours' do expect(Facter::Resolvers::Windows::Uptime.resolve(:hours)).to be(1) end it 'resolves days' do expect(Facter::Resolvers::Windows::Uptime.resolve(:days)).to be(0) end end context 'when system is up for 1 hour and 45 minutes' do let(:comp) { double('WIN32OLE', LocalDateTime: local_time, LastBootUpTime: last_bootup_time) } let(:local_time) { '20010203045006+0700' } let(:last_bootup_time) { '20010203030506+0700' } it 'resolves uptime' do expect(Facter::Resolvers::Windows::Uptime.resolve(:uptime)).to eql('1:45 hours') end it 'resolves seconds' do expect(Facter::Resolvers::Windows::Uptime.resolve(:seconds)).to be(6300) end it 'resolves hours' do expect(Facter::Resolvers::Windows::Uptime.resolve(:hours)).to be(1) end it 'resolves days' do expect(Facter::Resolvers::Windows::Uptime.resolve(:days)).to be(0) end end context 'when system is up for 1 hour, 45 minutes and 20 seconds' do let(:comp) { double('WIN32OLE', LocalDateTime: local_time, LastBootUpTime: last_bootup_time) } let(:local_time) { '20010203045026+0700' } let(:last_bootup_time) { '20010203030506+0700' } it 'resolves uptime' do expect(Facter::Resolvers::Windows::Uptime.resolve(:uptime)).to eql('1:45 hours') end it 'resolves seconds' do expect(Facter::Resolvers::Windows::Uptime.resolve(:seconds)).to be(6320) end it 'resolves hours' do expect(Facter::Resolvers::Windows::Uptime.resolve(:hours)).to be(1) end it 'resolves days' do expect(Facter::Resolvers::Windows::Uptime.resolve(:days)).to be(0) end end context 'when system is up for 1 day' do let(:comp) { double('WIN32OLE', LocalDateTime: local_time, LastBootUpTime: last_bootup_time) } let(:local_time) { '20010204040506+0700' } let(:last_bootup_time) { '20010203040506+0700' } it 'resolves uptime' do expect(Facter::Resolvers::Windows::Uptime.resolve(:days)).to be(1) end it 'resolves seconds' do expect(Facter::Resolvers::Windows::Uptime.resolve(:seconds)).to be(86_400) end it 'resolves hours' do expect(Facter::Resolvers::Windows::Uptime.resolve(:hours)).to be(24) end it 'resolvese uptime' do expect(Facter::Resolvers::Windows::Uptime.resolve(:uptime)).to eql('1 day') end end context 'when system is up for more than 1 day' do let(:comp) { double('WIN32OLE', LocalDateTime: local_time, LastBootUpTime: last_bootup_time) } let(:local_time) { '20010204040506+0700' } let(:last_bootup_time) { '20010201120506+0700' } it 'resolves uptime days' do expect(Facter::Resolvers::Windows::Uptime.resolve(:days)).to be(2) end it 'resolves seconds' do expect(Facter::Resolvers::Windows::Uptime.resolve(:seconds)).to be(230_400) end it 'resolves hours' do expect(Facter::Resolvers::Windows::Uptime.resolve(:hours)).to be(64) end it 'resolves total uptime' do expect(Facter::Resolvers::Windows::Uptime.resolve(:uptime)).to eql('2 days') end end context 'when local time is behind last bootup time' do let(:comp) { double('WIN32OLE', LocalDateTime: local_time, LastBootUpTime: last_bootup_time) } let(:local_time) { '20010201110506+0700' } let(:last_bootup_time) { '20010201120506+0700' } before do allow(Facter::Resolvers::Windows::Uptime.log).to receive(:debug).with('Unable to determine system uptime!') end it 'logs that is unable to determine system uptime and all facts are nil' do Facter::Resolvers::Windows::Uptime.resolve(:days) expect(Facter::Resolvers::Windows::Uptime.log).to have_received(:debug).with('Unable to determine system uptime!') end it 'uptime fact is nil' do expect(Facter::Resolvers::Windows::Uptime.resolve(:uptime)).to be(nil) end end context 'when WMI query returns nil' do let(:comp) { nil } it 'logs that query failed and days nil' do allow(Facter::Resolvers::Windows::Uptime.log).to receive(:debug) .with('WMI query returned no results'\ 'for Win32_OperatingSystem with values LocalDateTime and LastBootUpTime.') allow(Facter::Resolvers::Windows::Uptime.log).to receive(:debug) .with('Unable to determine system uptime!') expect(Facter::Resolvers::Windows::Uptime.resolve(:days)).to be(nil) end it 'detects uptime fact is nil' do expect(Facter::Resolvers::Windows::Uptime.resolve(:uptime)).to be(nil) end it 'detects uptime.seconds fact is nil' do expect(Facter::Resolvers::Windows::Uptime.resolve(:seconds)).to be(nil) end it 'detects uptime.hours fact is nil' do expect(Facter::Resolvers::Windows::Uptime.resolve(:hours)).to be(nil) end end context 'when WMI query returns nil for LocalDateTime and LastBootUpTime' do let(:comp) { double('WIN32OLE', LocalDateTime: nil, LastBootUpTime: nil) } it 'logs that is unable to determine system uptime and days fact is nil' do allow(Facter::Resolvers::Windows::Uptime.log).to receive(:debug) .with('Unable to determine system uptime!') expect(Facter::Resolvers::Windows::Uptime.resolve(:days)).to be(nil) end it 'detects uptime fact is nil' do expect(Facter::Resolvers::Windows::Uptime.resolve(:uptime)).to be(nil) end it 'detects uptime.seconds fact is nil' do expect(Facter::Resolvers::Windows::Uptime.resolve(:seconds)).to be(nil) end it 'detects uptime.hours fact is nil' do expect(Facter::Resolvers::Windows::Uptime.resolve(:hours)).to be(nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/windows/virtualization_spec.rb000066400000000000000000000206751470204764400303000ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Windows::Virtualization do let(:win32ole) { instance_spy('WIN32OLE') } let(:win32ole2) { instance_spy('WIN32OLE') } let(:win) { instance_spy('Facter::Util::Windows::Win32Ole') } before do allow(Facter::Util::Windows::Win32Ole).to receive(:new).and_return(win) allow(win).to receive(:exec_query).with('SELECT Manufacturer,Model,OEMStringArray FROM Win32_ComputerSystem') .and_return(query_result) Facter::Resolvers::Windows::Virtualization.invalidate_cache end describe '#resolve VirtualBox' do before do allow(win32ole).to receive(:Model).and_return(model) allow(win32ole).to receive(:Manufacturer).and_return(manufacturer) allow(win32ole).to receive(:OEMStringArray).and_return(vbox_version) allow(win32ole2).to receive(:Model).and_return(model) allow(win32ole2).to receive(:Manufacturer).and_return(manufacturer) allow(win32ole2).to receive(:OEMStringArray).and_return(vbox_revision) end let(:query_result) { [win32ole, win32ole2] } let(:model) { 'VirtualBox' } let(:manufacturer) {} let(:vbox_version) { 'vboxVer_6.0.4' } let(:vbox_revision) { 'vboxRev_128413' } it 'detects virtual machine model' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:virtual)).to eql('virtualbox') end it 'detects that is virtual' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:is_virtual)).to be(true) end it 'detects oem_strings facts' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:oem_strings)).to eql([vbox_version, vbox_revision]) end end describe '#resolve Vmware' do before do allow(win32ole).to receive(:Model).and_return(model) allow(win32ole).to receive(:Manufacturer).and_return(manufacturer) allow(win32ole).to receive(:OEMStringArray).and_return('') end let(:query_result) { [win32ole] } let(:model) { 'VMware' } let(:manufacturer) {} it 'detects virtual machine model' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:virtual)).to eql('vmware') end it 'detects that is virtual' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:is_virtual)).to be(true) end end describe '#resolve KVM' do before do allow(win32ole).to receive(:Model).and_return(model) allow(win32ole).to receive(:Manufacturer).and_return(manufacturer) allow(win32ole).to receive(:OEMStringArray).and_return('') end let(:query_result) { [win32ole] } let(:model) { 'KVM10' } let(:manufacturer) {} it 'detects virtual machine model' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:virtual)).to eql('kvm') end it 'detects that is virtual' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:is_virtual)).to be(true) end end describe '#resolve Openstack VM' do before do allow(win32ole).to receive(:Model).and_return(model) allow(win32ole).to receive(:Manufacturer).and_return(manufacturer) allow(win32ole).to receive(:OEMStringArray).and_return('') end let(:query_result) { [win32ole] } let(:model) { 'OpenStack' } let(:manufacturer) {} it 'detects virtual machine model' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:virtual)).to eql('openstack') end it 'detects that is virtual' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:is_virtual)).to be(true) end end describe '#resolve AHV VM' do before do allow(win32ole).to receive(:Model).and_return(model) allow(win32ole).to receive(:Manufacturer).and_return(manufacturer) allow(win32ole).to receive(:OEMStringArray).and_return('') end let(:query_result) { [win32ole] } let(:model) { 'AHV' } let(:manufacturer) {} it 'detects virtual machine model' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:virtual)).to eql('ahv') end it 'detects that is virtual' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:is_virtual)).to be(true) end end describe '#resolve Microsoft VM' do before do allow(win32ole).to receive(:Model).and_return(model) allow(win32ole).to receive(:Manufacturer).and_return(manufacturer) allow(win32ole).to receive(:OEMStringArray).and_return('') end let(:query_result) { [win32ole] } let(:model) { 'Virtual Machine' } let(:manufacturer) { 'Microsoft' } it 'detects virtual machine model' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:virtual)).to eql('hyperv') end it 'detects that is virtual' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:is_virtual)).to be(true) end end describe '#resolve Xen VM' do before do allow(win32ole).to receive(:Model).and_return(model) allow(win32ole).to receive(:Manufacturer).and_return(manufacturer) allow(win32ole).to receive(:OEMStringArray).and_return('') end let(:query_result) { [win32ole] } let(:model) { '' } let(:manufacturer) { 'Xen' } it 'detects virtual machine model' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:virtual)).to eql('xen') end it 'detects that is virtual' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:is_virtual)).to be(true) end end describe '#resolve Amazon EC2 VM' do before do allow(win32ole).to receive(:Model).and_return(model) allow(win32ole).to receive(:Manufacturer).and_return(manufacturer) allow(win32ole).to receive(:OEMStringArray).and_return('') end let(:query_result) { [win32ole] } let(:model) { '' } let(:manufacturer) { 'Amazon EC2' } it 'detects virtual machine model' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:virtual)).to eql('kvm') end it 'detects that is virtual' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:is_virtual)).to be(true) end end describe '#resolve Physical Machine' do before do allow(win32ole).to receive(:Model).and_return(model) allow(win32ole).to receive(:Manufacturer).and_return(manufacturer) allow(win32ole).to receive(:OEMStringArray).and_return('') end let(:query_result) { [win32ole] } let(:model) { '' } let(:manufacturer) { '' } it 'detects virtual machine model' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:virtual)).to eql('physical') end it 'detects that is not virtual' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:is_virtual)).to be(false) end end describe '#resolve should cache facts in the same run' do let(:query_result) { nil } it 'detects virtual machine model' do Facter::Resolvers::Windows::Virtualization.instance_variable_set(:@fact_list, { virtual: 'physical' }) expect(Facter::Resolvers::Windows::Virtualization.resolve(:virtual)).to eql('physical') end it 'detects that is virtual' do Facter::Resolvers::Windows::Virtualization.instance_variable_set(:@fact_list, { is_virtual: false }) expect(Facter::Resolvers::Windows::Virtualization.resolve(:is_virtual)).to be(false) end end describe '#resolve when WMI query returns nil' do let(:query_result) { nil } it 'logs that query failed and virtual nil' do allow(Facter::Resolvers::Windows::Virtualization.log).to receive(:debug) .with('WMI query returned no results'\ ' for Win32_ComputerSystem with values Manufacturer, Model and OEMStringArray.') expect(Facter::Resolvers::Windows::Virtualization.resolve(:virtual)).to be(nil) end it 'detects that is_virtual nil' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:is_virtual)).to be(nil) end end describe '#resolve when WMI query returns nil for Model and Manufacturer' do before do allow(win32ole).to receive(:Model).and_return(nil) allow(win32ole).to receive(:Manufacturer).and_return(nil) allow(win32ole).to receive(:OEMStringArray).and_return('') end let(:query_result) { [win32ole] } it 'detects that is physical' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:virtual)).to eql('physical') end it 'detects that is_virtual is false' do expect(Facter::Resolvers::Windows::Virtualization.resolve(:is_virtual)).to be(false) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/windows/win_os_description_spec.rb000066400000000000000000000034471470204764400311130ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::WinOsDescription do before do win = double('Facter::Util::Windows::Win32Ole') allow(Facter::Util::Windows::Win32Ole).to receive(:new).and_return(win) allow(win).to receive(:return_first).with('SELECT ProductType,OtherTypeDescription FROM Win32_OperatingSystem') .and_return(comp) end after do Facter::Resolvers::WinOsDescription.invalidate_cache end describe '#resolve when query fails' do let(:comp) { nil } it 'logs debug message and facts are nil' do allow(Facter::Resolvers::WinOsDescription.log).to receive(:debug) .with('WMI query returned no results for Win32_OperatingSystem'\ 'with values ProductType and OtherTypeDescription.') expect(Facter::Resolvers::WinOsDescription.resolve(:full)).to be(nil) end end describe '#resolve' do let(:comp) { double('Facter::Util::Windows::Win32Ole', ProductType: prod, OtherTypeDescription: type) } let(:prod) { 1 } let(:type) {} it 'returns consumerrel true' do expect(Facter::Resolvers::WinOsDescription.resolve(:consumerrel)).to be(true) end it 'returns description as nil' do expect(Facter::Resolvers::WinOsDescription.resolve(:description)).to be(nil) end end describe '#resolve when product type is nil' do let(:comp) { double('Facter::Util::Windows::Win32Ole', ProductType: prod, OtherTypeDescription: type) } let(:prod) { nil } let(:type) { 'description' } it 'returns consumerrel false' do expect(Facter::Resolvers::WinOsDescription.resolve(:consumerrel)).to be(false) end it 'returns description' do expect(Facter::Resolvers::WinOsDescription.resolve(:description)).to eql('description') end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/wpar_spec.rb000066400000000000000000000016671470204764400244730ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Wpar do before do allow(Facter::Core::Execution).to receive(:execute) .with('/usr/bin/lparstat -W', logger: an_instance_of(Facter::Log)) .and_return(open3_result) end after do Facter::Resolvers::Wpar.invalidate_cache end describe '#oslevel 6.1+' do let(:open3_result) { load_fixture('lparstat_w').read } it 'returns wpar_key' do expect(Facter::Resolvers::Wpar.resolve(:wpar_key)).to eq(13) end it 'returns wpar_configured_id' do expect(Facter::Resolvers::Wpar.resolve(:wpar_configured_id)).to eq(14) end end describe '#oslevel 6.0' do let(:open3_result) { '' } it 'does not return wpar_key' do expect(Facter::Resolvers::Wpar.resolve(:wpar_key)).to be_nil end it 'does not return wpar_configured_id' do expect(Facter::Resolvers::Wpar.resolve(:wpar_configured_id)).to be_nil end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/xen_spec.rb000066400000000000000000000061131470204764400243030ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Xen do subject(:xen_resolver) { Facter::Resolvers::Xen } let(:proc_xen_file) { false } let(:xvda1_file) { false } let(:domains) { '' } before do allow(File).to receive(:exist?).and_call_original allow(File).to receive(:exist?).with('/dev/xen/evtchn').and_return(evtchn_file) allow(File).to receive(:exist?).with('/proc/xen').and_return(proc_xen_file) allow(File).to receive(:exist?).with('/dev/xvda1').and_return(xvda1_file) allow(File).to receive(:exist?).with('/usr/lib/xen-common/bin/xen-toolstack').and_return(false) allow(File).to receive(:exist?).with('/usr/sbin/xl').and_return(false) allow(File).to receive(:exist?).with('/usr/sbin/xm').and_return(true) allow(Facter::Core::Execution).to receive(:execute) .with('/usr/sbin/xm list', logger: an_instance_of(Facter::Log)).and_return(domains) xen_resolver.invalidate_cache end after do xen_resolver.invalidate_cache end context 'when not xen' do let(:evtchn_file) { false } let(:proc_xen_file) { false } let(:xvda1_file) { false } it 'returns' do allow(File).to receive(:exist?).with('/usr/sbin/xm').and_return(false) expect(xen_resolver.resolve(:vm)).to be_nil end end context 'when xen is privileged' do context 'when /dev/xen/evtchn exists' do let(:domains) { load_fixture('xen_domains').read } let(:evtchn_file) { true } it 'returns xen0' do expect(xen_resolver.resolve(:vm)).to eq('xen0') end it 'detects xen as privileged' do expect(xen_resolver.resolve(:privileged)).to be_truthy end it 'does not check other files' do expect(File).not_to have_received(:exist?).with('/proc/xen') end it 'returns domains' do expect(xen_resolver.resolve(:domains)).to eq(%w[win linux]) end end context 'when /dev/xen/evtchn does not exist' do let(:evtchn_file) { false } before do allow(Facter::Util::FileHelper) .to receive(:safe_read) .with('/proc/xen/capabilities', nil) .and_return('control_d') end it 'detects xen as privileged' do expect(xen_resolver.resolve(:privileged)).to be_truthy end end end context 'when xen is unprivileged' do let(:evtchn_file) { false } let(:xvda1_file) { true } before do allow(Facter::Util::FileHelper) .to receive(:safe_read) .with('/proc/xen/capabilities', nil) .and_return(nil) end it 'returns xenu' do expect(xen_resolver.resolve(:vm)).to eq('xenu') end it 'detects xen as unprivileged' do expect(xen_resolver.resolve(:privileged)).to be_falsey end it 'does not detect domains' do expect(xen_resolver.resolve(:domains)).to be_nil end end context 'when /dev/xvda1 is a symlink' do let(:evtchn_file) { false } before do allow(File).to receive(:symlink?).with('/dev/xvda1').and_return(true) end it 'returns nil' do expect(xen_resolver.resolve(:vm)).to be_nil end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/zfs_spec.rb000066400000000000000000000017361470204764400243210ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::ZFS do subject(:zfs_resolver) { Facter::Resolvers::ZFS } before do allow(Facter::Core::Execution).to receive(:execute) .with('zfs upgrade -v', logger: an_instance_of(Facter::Log)) .and_return(output) end after do zfs_resolver.invalidate_cache end context 'when zfs command is found' do let(:output) { load_fixture('zfs').read } it 'returns zfs version fact' do expect(zfs_resolver.resolve(:zfs_version)).to eq('6') end it 'returns zfs featurenumbers fact' do expect(zfs_resolver.resolve(:zfs_featurenumbers)).to eq('1,2,3,4,5,6') end end context 'when zfs command is not found' do let(:output) { '' } it 'returns nil for zfs version fact' do expect(zfs_resolver.resolve(:zfs_version)).to eq(nil) end it 'returns nil for zfs featurenumbers fact' do expect(zfs_resolver.resolve(:zfs_featurenumbers)).to eq(nil) end end end puppetlabs-facter-dfe6df4/spec/facter/resolvers/zpool_spec.rb000066400000000000000000000036371470204764400246640ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Resolvers::Zpool do subject(:zpool_resolver) { Facter::Resolvers::Zpool } before do allow(Facter::Core::Execution).to receive(:execute) .with('zpool upgrade -v', logger: an_instance_of(Facter::Log)) .and_return(output) end after do Facter::Resolvers::Zpool.invalidate_cache end context 'when zpool command is found' do let(:output) { load_fixture('zpool').read } it 'return zpool version fact' do expect(zpool_resolver.resolve(:zpool_version)).to eq('34') end it 'return zpool featurenumbers fact' do expect(zpool_resolver.resolve(:zpool_featurenumbers)).to eq('1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,'\ '18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34') end context 'when zpool has featureflags' do let(:output) { load_fixture('zpool-with-featureflags').read } let(:zpool_featureflags) do 'async_destroy,empty_bpobj,lz4_compress,multi_vdev_crash_dump,spacemap_histogram,enabled_txg,' \ 'hole_birth,extensible_dataset,embedded_data,bookmarks,filesystem_limits,large_blocks,large_dnode,' \ 'sha512,skein,device_removal,obsolete_counts,zpool_checkpoint,spacemap_v2' end it 'returns zpool version fact' do result = Facter::Resolvers::Zpool.resolve(:zpool_version) expect(result).to eq('5000') end it 'returns zpool featureflags fact' do result = Facter::Resolvers::Zpool.resolve(:zpool_featureflags) expect(result).to eq(zpool_featureflags) end end end context 'when zpool command is not found' do let(:output) { 'zpool command not found' } it 'returns nil for zpool version fact' do expect(zpool_resolver.resolve(:zpool_version)).to eq(nil) end it 'returns nil for zpool featureversion fact' do expect(zpool_resolver.resolve(:zpool_featurenumbers)).to eq(nil) end end end puppetlabs-facter-dfe6df4/spec/facter/util/000077500000000000000000000000001470204764400211025ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/util/aix/000077500000000000000000000000001470204764400216635ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/util/aix/odm_query_spec.rb000066400000000000000000000013351470204764400252300ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Util::Aix::ODMQuery do let(:odm_query) { Facter::Util::Aix::ODMQuery.new } before do stub_const('Facter::Util::Aix::ODMQuery::REPOS', ['CuAt']) end it 'creates a query' do odm_query.equals('name', '12345') expect(Facter::Core::Execution).to receive(:execute).with("odmget -q \"name='12345'\" CuAt", logger: an_instance_of(Facter::Log)) odm_query.execute end it 'can chain conditions' do odm_query.equals('field1', 'value').like('field2', 'value*') expect(Facter::Core::Execution).to receive(:execute) .with("odmget -q \"field1='value' AND field2 like 'value*'\" CuAt", logger: an_instance_of(Facter::Log)) odm_query.execute end end puppetlabs-facter-dfe6df4/spec/facter/util/facts/000077500000000000000000000000001470204764400222025ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/util/facts/facts_utils_spec.rb000066400000000000000000000065101470204764400260630ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Util::Facts do subject(:facts_util) { Facter::Util::Facts } describe '#discover_family' do it "discovers Fedora's family" do expect(facts_util.discover_family('rhel fedora')).to eq('RedHat') end it "discovers Centos's family" do expect(facts_util.discover_family('rhel fedora centos')).to eq('RedHat') end it "discovers PSBM's family" do expect(facts_util.discover_family('PSBM')).to eq('RedHat') end it "discovers Virtuozzo's family" do expect(facts_util.discover_family('VirtuozzoLinux')).to eq('RedHat') end it "discovers SLED's family" do expect(facts_util.discover_family('SLED')).to eq('Suse') end it "discovers KDE's family" do expect(facts_util.discover_family('KDE')).to eq('Debian') end it "discovers HuaweiOS's family" do expect(facts_util.discover_family('HuaweiOS')).to eq('Debian') end it "discovers Gentoo's family" do expect(facts_util.discover_family('gentoo')).to eq('Gentoo') end it "discovers Manjaro's family" do expect(facts_util.discover_family('Manjaro')).to eq('Archlinux') end it "discovers Mandriva's family" do expect(facts_util.discover_family('Mandriva')).to eq('Mandrake') end end describe '#release_hash_from_string' do it 'returns full release' do expect(facts_util.release_hash_from_string('6.2')['full']).to eq('6.2') end it 'returns major release' do expect(facts_util.release_hash_from_string('6.2')['major']).to eq('6') end it 'returns valid minor release' do expect(facts_util.release_hash_from_string('6.2.1')['minor']).to eq('2') end it 'returns minor release as nil' do expect(facts_util.release_hash_from_string('6')['minor']).to be_nil end it 'returns valid patch release if requested' do expect(facts_util.release_hash_from_string('6.2.1', include_patch: true)['patch']).to eq('1') end it 'returns patch release as nil if not requested' do expect(facts_util.release_hash_from_string('6.2.1')['patch']).to be_nil end it 'returns patch release as nil if requested but not in version' do expect(facts_util.release_hash_from_string('6.2')['patch']).to be_nil end it 'returns nil if data is nil' do expect(facts_util.release_hash_from_string(nil)).to be_nil end end describe '#release_hash_from_matchdata' do let(:match_data) do 'RELEASE=4.3' =~ /^RELEASE=(\d+.\d+.*)/ Regexp.last_match end it 'returns full release' do expect(facts_util.release_hash_from_matchdata(match_data)['full']).to eq('4.3') end it 'returns major release' do expect(facts_util.release_hash_from_matchdata(match_data)['major']).to eq('4') end it 'returns valid minor release' do expect(facts_util.release_hash_from_matchdata(match_data)['minor']).to eq('3') end it 'returns nil if data is nil' do expect(facts_util.release_hash_from_matchdata(nil)).to be_nil end context 'when minor version is unavailable' do let(:match_data) do 'RELEASE=4' =~ /^RELEASE=(\d+)/ Regexp.last_match end it 'returns minor release as nil' do expect(facts_util.release_hash_from_matchdata(match_data)['minor']).to be_nil end end end end puppetlabs-facter-dfe6df4/spec/facter/util/facts/posix/000077500000000000000000000000001470204764400233445ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/util/facts/posix/virtual_detector_spec.rb000066400000000000000000000352641470204764400302740ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Util::Facts::Posix::VirtualDetector do subject(:detector) { Facter::Util::Facts::Posix::VirtualDetector } describe '#platform' do before do Facter::Util::Facts::Posix::VirtualDetector.instance_variable_set(:@fact_value, nil) end context 'when in docker' do let(:vm) { 'docker' } before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(vm) end it 'calls Facter::Resolvers::Containers' do detector.platform expect(Facter::Resolvers::Containers).to have_received(:resolve).with(:vm) end it 'returns container type' do expect(detector.platform).to eq(vm) end end context 'when FreeBSD' do let(:value) { 'jail' } before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Freebsd::Virtual).to receive(:resolve).with(:vm).and_return('jail') end it 'calls Facter::Resolvers::Freebsd::Virtual' do detector.platform expect(Facter::Resolvers::Freebsd::Virtual).to have_received(:resolve).with(:vm) end it 'returns jail' do expect(detector.platform).to eq(value) end end context 'when in OpenBSD' do let(:value) { 'vmm' } before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Freebsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Openbsd::Virtual).to receive(:resolve).with(:vm).and_return('vmm') end it 'calls Facter::Resolvers::Openbsd::Virtual' do detector.platform expect(Facter::Resolvers::Openbsd::Virtual).to have_received(:resolve).with(:vm) end it 'returns vmm' do expect(detector.platform).to eq(value) end end context 'when gce' do let(:value) { 'gce' } before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Freebsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Openbsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return('Google Engine') end it 'calls Facter::Resolvers::Linux::DmiBios' do detector.platform expect(Facter::Resolvers::Linux::DmiBios).to have_received(:resolve).with(:bios_vendor) end it 'returns gce' do expect(detector.platform).to eq(value) end end context 'when xen-hvm' do let(:value) { 'xenhvm' } before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Freebsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Openbsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return(nil) allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelversion).and_return(nil) allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(value) end it 'calls Facter::Resolvers::VirtWhat' do detector.platform expect(Facter::Resolvers::VirtWhat).to have_received(:resolve).with(:vm) end it 'returns xen' do expect(detector.platform).to eq(value) end end context 'when vmware' do let(:value) { 'vmware_fusion' } before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Freebsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Openbsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return(nil) allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelversion).and_return(nil) allow(Facter::Resolvers::Vmware).to receive(:resolve).with(:vm).and_return(value) end it 'calls Facter::Resolvers::Vmware' do detector.platform expect(Facter::Resolvers::Vmware).to have_received(:resolve).with(:vm) end it 'returns vmware' do expect(detector.platform).to eq(value) end end context 'when openVz' do let(:value) { 'openvzve' } before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Freebsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Openbsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return(nil) allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Vmware).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelversion).and_return(nil) allow(Facter::Resolvers::OpenVz).to receive(:resolve).with(:vm).and_return(value) end it 'calls Facter::Resolvers::OpenVz' do detector.platform expect(Facter::Resolvers::OpenVz).to have_received(:resolve).with(:vm) end it 'returns openvz' do expect(detector.platform).to eq(value) end end context 'when vserver' do let(:value) { 'vserver_host' } before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Freebsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Openbsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return(nil) allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Vmware).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::OpenVz).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelversion).and_return(nil) allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vserver).and_return(value) end it 'calls Facter::Resolvers::VirtWhat' do detector.platform expect(Facter::Resolvers::VirtWhat).to have_received(:resolve).with(:vserver) end it 'returns vserver' do expect(detector.platform).to eq(value) end end context 'when xen' do let(:value) { 'xen0' } before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Freebsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Openbsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return(nil) allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Vmware).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::OpenVz).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vserver).and_return(nil) allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelversion).and_return(nil) allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return(value) end it 'calls Facter::Resolvers::Xen' do detector.platform expect(Facter::Resolvers::Xen).to have_received(:resolve).with(:vm) end it 'returns xen' do expect(detector.platform).to eq(value) end end context 'when bochs' do let(:value) { 'bochs' } before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Freebsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Openbsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Vmware).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::OpenVz).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vserver).and_return(nil) allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelversion).and_return(nil) allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return(nil) allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('Bochs Machine') end it 'calls Facter::Resolvers::Linux::DmiBios with bios_vendor' do detector.platform expect(Facter::Resolvers::Linux::DmiBios).to have_received(:resolve).with(:bios_vendor).twice end it 'calls Facter::Resolvers::Linux::DmiBios with product_name' do detector.platform expect(Facter::Resolvers::Linux::DmiBios).to have_received(:resolve).with(:product_name) end it 'returns bochs' do expect(detector.platform).to eq(value) end end context 'when hyper-v' do let(:value) { 'hyperv' } before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Freebsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Openbsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Vmware).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::OpenVz).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vserver).and_return(nil) allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return(nil) allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return(nil) allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelversion).and_return(nil) allow(Facter::Resolvers::Lspci).to receive(:resolve).with(:vm).and_return(value) end it 'calls Facter::Resolvers::Lspci' do detector.platform expect(Facter::Resolvers::Lspci).to have_received(:resolve).with(:vm) end it 'returns hyper-v' do expect(detector.platform).to eq(value) end end context 'when illumos-lx' do let(:value) { 'illumos-lx' } before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Freebsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Openbsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return(nil) allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return(nil) allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return('lxc') allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelversion).and_return('BrandZ virtual linux') end it 'returns illumos-lx' do expect(detector.platform).to eq(value) end end context 'when all resolvers return nil ' do let(:vm) { 'physical' } before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Freebsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Openbsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Vmware).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::OpenVz).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vserver).and_return(nil) allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return(nil) allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return(nil) allow(Facter::Resolvers::Lspci).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelversion).and_return(nil) end it 'returns physical' do expect(detector.platform).to eq(vm) end end context 'when product name is not found in the HYPERVISORS_HASH' do let(:vm) { 'physical' } before do allow(Facter::Resolvers::Containers).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Freebsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Openbsd::Virtual).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Vmware).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::OpenVz).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::VirtWhat).to receive(:resolve).with(:vserver).and_return(nil) allow(Facter::Resolvers::Xen).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Lspci).to receive(:resolve).with(:vm).and_return(nil) allow(Facter::Resolvers::Uname).to receive(:resolve).with(:kernelversion).and_return(nil) allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:bios_vendor).and_return('unknown') allow(Facter::Resolvers::Linux::DmiBios).to receive(:resolve).with(:product_name).and_return('unknown') end it 'returns virtual fact as physical' do expect(detector.platform).to eq(vm) end end end end puppetlabs-facter-dfe6df4/spec/facter/util/facts/unit_converter_spec.rb000066400000000000000000000055731470204764400266210ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Util::Facts::UnitConverter do subject(:converter) { Facter::Util::Facts::UnitConverter } describe '#bytes_to_mb' do it 'converts bytes to mega bytes' do expect(converter.bytes_to_mb(256_586_343)).to eq(244.6998052597046) end it 'returns nil if value is nil' do expect(converter.bytes_to_mb(nil)).to be(nil) end it 'converts bytes if value is string' do expect(converter.bytes_to_mb('2343455')).to eq(2.2348928451538086) end it 'returns 0 if value is 0' do expect(converter.bytes_to_mb(0)).to eq(0.0) end end describe '#hertz_to_human_readable' do it 'returns nil if value is 0' do expect(converter.hertz_to_human_readable(0)).to be_nil end it 'returns nil if value is string' do expect(converter.hertz_to_human_readable('test')).to be_nil end it 'converts to GHz' do expect(converter.hertz_to_human_readable(2_300_000_000)).to eql('2.30 GHz') end it 'converts to MHz' do expect(converter.hertz_to_human_readable(800_000_000)).to eql('800.00 MHz') end it 'handles small-ish number correctly' do expect(converter.hertz_to_human_readable(42)).to eql('42.00 Hz') end it 'converts to Hz even if argument is string' do expect(converter.hertz_to_human_readable('2400')).to eql('2.40 kHz') end it 'rounds down when 3rd decimal is lower than 5' do expect(converter.hertz_to_human_readable(2_363_000_000)).to eql('2.36 GHz') end it 'rounds up when 3rd decimal is equal with 5' do expect(converter.hertz_to_human_readable(2_365_000_000)).to eql('2.37 GHz') end it 'rounds up when 3rd decimal is greater than 5' do expect(converter.hertz_to_human_readable(2_367_000_000)).to eql('2.37 GHz') end end describe '#bytes_to_human_readable' do it 'returns nil if bytes variable is nil' do expect(converter.bytes_to_human_readable(nil)).to be(nil) end it 'returns next unit if result is 1024 after conversion' do expect(converter.bytes_to_human_readable(1_048_575.7)).to eql('1.00 MiB') end it 'returns bytes if bytes variable is less than 1024' do expect(converter.bytes_to_human_readable(1023)).to eql('1023 bytes') end it 'returns 1 Kib if bytes variable equals 1024' do expect(converter.bytes_to_human_readable(1024)).to eql('1.00 KiB') end it 'returns bytes if number exceeds etta bytes' do expect(converter.bytes_to_human_readable(3_296_472_651_763_232_323_235)).to eql('3296472651763232323235 bytes') end end describe '#pad_number' do it 'appends a 0 when conversion has one decimal digit' do expect(converter.send(:pad_number, 10.0)).to eql('10.00') end it 'leaves the value unmodified if it has two decimals' do expect(converter.send(:pad_number, 10.23)).to eql('10.23') end end end puppetlabs-facter-dfe6df4/spec/facter/util/facts/uptime_parser_spec.rb000066400000000000000000000105011470204764400264150ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Util::Facts::UptimeParser do describe '.uptime_seconds_unix' do let(:uptime_proc_file_cmd) { '/bin/cat /proc/uptime' } let(:kern_boottime_cmd) { 'sysctl -n kern.boottime' } let(:uptime_cmd) { 'uptime' } context 'when a /proc/uptime file exists' do let(:proc_uptime_value) { '2672.69 20109.75' } it 'returns the correct result' do allow(Facter::Core::Execution) .to receive(:execute) .with(uptime_proc_file_cmd, logger: an_instance_of(Facter::Log)) .and_return(proc_uptime_value) expect(Facter::Util::Facts::UptimeParser.uptime_seconds_unix).to eq(2672) end end context 'when a sysctl kern.boottime command is available only' do let!(:time_now) { Time.parse('2019-10-10 11:00:00 +0100') } let(:kern_boottime_value) do '{ sec = 60, usec = 0 } Tue Oct 10 10:59:00 2019' end it 'returns the correct result' do allow(Time).to receive(:at).with(60) { Time.parse('2019-10-10 10:59:00 +0100') } allow(Time).to receive(:now) { time_now } allow(Facter::Core::Execution) .to receive(:execute) .with(uptime_proc_file_cmd, logger: an_instance_of(Facter::Log)) .and_return('') allow(Facter::Core::Execution) .to receive(:execute) .with(kern_boottime_cmd, logger: an_instance_of(Facter::Log)) .and_return(kern_boottime_value) expect(Facter::Util::Facts::UptimeParser.uptime_seconds_unix).to eq(60) end end context 'when the uptime executable is available only' do before do allow(Facter::Core::Execution) .to receive(:execute) .with(uptime_proc_file_cmd, logger: an_instance_of(Facter::Log)) .and_return('') allow(Facter::Core::Execution) .to receive(:execute) .with(kern_boottime_cmd, logger: an_instance_of(Facter::Log)) .and_return('') end shared_examples 'uptime executable regex expectation' do |cmd_output, result| it 'returns the correct result' do allow(Facter::Core::Execution) .to receive(:execute) .with(uptime_cmd, logger: an_instance_of(Facter::Log)) .and_return(cmd_output) expect(Facter::Util::Facts::UptimeParser.uptime_seconds_unix).to eq(result) end end context 'when the output matches days, hours and minutes regex' do include_examples( 'uptime executable regex expectation', '10:00AM up 2 days, 1:00, 1 user, load average: 1.00, 0.75, 0.66', 176_400 ) end context 'when the output matches days and hours regex' do include_examples( 'uptime executable regex expectation', '10:00AM up 2 days, 1 hr(s), 1 user, load average: 1.00, 0.75, 0.66', 176_400 ) end context 'when the output matches days and minutes regex' do include_examples( 'uptime executable regex expectation', '10:00AM up 2 days, 60 min(s), 1 user, load average: 1.00, 0.75, 0.66', 176_400 ) end context 'when the output matches days regex' do include_examples( 'uptime executable regex expectation', '10:00AM up 2 days, 1 user, load average: 1.00, 0.75, 0.66', 172_800 ) end context 'when the output matches hours and minutes regex' do include_examples( 'uptime executable regex expectation', '10:00AM up 49:00, 1 user, load average: 1.00, 0.75, 0.66', 176_400 ) end context 'when the output matches hours regex' do include_examples( 'uptime executable regex expectation', '10:00AM up 49 hr(s), 1 user, load average: 1.00, 0.75, 0.66', 176_400 ) end context 'when the output matches minutes regex' do include_examples( 'uptime executable regex expectation', '10:00AM up 2940 mins, 1 user, load average: 1.00, 0.75, 0.66', 176_400 ) end context 'when the output does not match any conditional regex' do include_examples( 'uptime executable regex expectation', 'running for 2 days', 0 ) end end end end puppetlabs-facter-dfe6df4/spec/facter/util/facts/windows_release_finder_spec.rb000066400000000000000000000071331470204764400302660ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Util::Facts::WindowsReleaseFinder do let(:input) { { consumerrel: cons, description: desc, kernel_version: k_version, version: version } } describe '#find windows release when version nil' do let(:cons) { false } let(:desc) {} let(:k_version) {} let(:version) { nil } it 'returns nil' do expect(Facter::Util::Facts::WindowsReleaseFinder.find_release(input)).to be(nil) end end describe '#find windows release when version is 10' do let(:cons) { true } let(:desc) {} let(:k_version) { '10.0.123' } let(:version) { '10.0' } it 'returns 10' do expect(Facter::Util::Facts::WindowsReleaseFinder.find_release(input)).to eql('10') end end describe '#find windows release when version is 11' do let(:cons) { true } let(:desc) {} let(:k_version) { '10.0.22000' } let(:version) { '10.0' } it 'returns 11' do expect(Facter::Util::Facts::WindowsReleaseFinder.find_release(input)).to eql('11') end end describe '#find windows release when version is 2022' do let(:cons) { false } let(:desc) {} let(:k_version) { '10.0.20348' } let(:version) { '10.0' } it 'returns 2022' do expect(Facter::Util::Facts::WindowsReleaseFinder.find_release(input)).to eql('2022') end end describe '#find windows release when version is 2019' do let(:cons) { false } let(:desc) {} let(:k_version) { '10.0.17623' } let(:version) { '10.0' } it 'returns 2019' do expect(Facter::Util::Facts::WindowsReleaseFinder.find_release(input)).to eql('2019') end end describe '#find windows release when version is 2016' do let(:cons) { false } let(:desc) {} let(:k_version) { '10.0.176' } let(:version) { '10.0' } it 'returns 2016' do expect(Facter::Util::Facts::WindowsReleaseFinder.find_release(input)).to eql('2016') end end describe '#find windows release when version is 8.1' do let(:cons) { true } let(:desc) {} let(:k_version) {} let(:version) { '6.3' } it 'returns 8.1' do expect(Facter::Util::Facts::WindowsReleaseFinder.find_release(input)).to eql('8.1') end end describe '#find windows release when version is 2012 R2' do let(:cons) { false } let(:desc) {} let(:k_version) {} let(:version) { '6.3' } it 'returns 2012 R2' do expect(Facter::Util::Facts::WindowsReleaseFinder.find_release(input)).to eql('2012 R2') end end describe '#find windows release when version is XP' do let(:cons) { true } let(:desc) {} let(:k_version) {} let(:version) { '5.2' } it 'returns XP' do expect(Facter::Util::Facts::WindowsReleaseFinder.find_release(input)).to eql('XP') end end describe '#find windows release when version is 2003' do let(:cons) { false } let(:desc) {} let(:k_version) {} let(:version) { '5.2' } it 'returns 2003' do expect(Facter::Util::Facts::WindowsReleaseFinder.find_release(input)).to eql('2003') end end describe '#find windows release when version is 2003 R2' do let(:cons) { false } let(:desc) { 'R2' } let(:k_version) {} let(:version) { '5.2' } it 'returns 2003 R2' do expect(Facter::Util::Facts::WindowsReleaseFinder.find_release(input)).to eql('2003 R2') end end describe '#find windows release when version is 4.2' do let(:cons) { false } let(:desc) { 'R2' } let(:k_version) {} let(:version) { '4.2' } it 'returns 4.2' do expect(Facter::Util::Facts::WindowsReleaseFinder.find_release(input)).to eql('4.2') end end end puppetlabs-facter-dfe6df4/spec/facter/util/file_helper_spec.rb000066400000000000000000000115221470204764400247200ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Util::FileHelper do subject(:file_helper) { Facter::Util::FileHelper } let(:path) { '/Users/admin/file.txt' } let(:entries) { ['file.txt', 'a'] } let(:content) { 'file content' } # rubocop:disable Style/SpecialGlobalVars let(:sep) { $/ } # rubocop:enable Style/SpecialGlobalVars let(:error_message) do "Facter::Util::FileHelper - #{Facter::CYAN}File at: /Users/admin/file.txt is not accessible.#{Facter::RESET}" end let(:array_content) { ['line 1', 'line 2', 'line 3'] } let(:log) { Facter::Log.class_variable_get(:@@logger) } before do allow(Facter).to receive(:debugging?).and_return(true) allow(Facter::OptionStore).to receive(:color).and_return(true) end shared_context 'when file is readable' do before do allow(File).to receive(:readable?).with(path).and_return(true) end end shared_context 'when file is not readable' do before do allow(File).to receive(:readable?).with(path).and_return(false) end end describe '#safe_read' do before do allow(File).to receive(:read).with(path, anything).and_return(content) end context 'when successfully read the file content' do include_context 'when file is readable' it 'returns the file content' do expect(file_helper.safe_read(path)).to eq(content) end it 'returns the file content as UTF-8' do expect(file_helper.safe_read(path).encoding.name).to eq('UTF-8') end it 'File.readable? is called with the correct path' do file_helper.safe_read(path) expect(File).to have_received(:readable?).with(path) end it 'File.read is called with the correct path' do file_helper.safe_read(path) expect(File).to have_received(:read).with(path, anything) end it "doesn't log anything" do expect(log).not_to receive(:debug) file_helper.safe_read(path) end end context 'when failed to read the file content' do include_context 'when file is not readable' it 'returns empty string by default' do expect(file_helper.safe_read(path)).to eq('') end it 'returns nil' do expect(file_helper.safe_read(path, nil)).to eq(nil) end it 'File.readable? is called with the correct path' do file_helper.safe_read(path) expect(File).to have_received(:readable?).with(path) end it 'File.read is not called' do file_helper.safe_read(path) expect(File).not_to have_received(:read) end it 'logs a debug message' do allow(log).to receive(:debug) expect(log).to receive(:debug).with(error_message) file_helper.safe_read(path) end end end describe '#dir_children' do before do allow(Dir).to receive(:children).with(File.dirname(path)).and_return(entries) stub_const('RUBY_VERSION', '2.5.9') end it 'delegates to Dir.children' do file_helper.dir_children(File.dirname(path)) expect(Dir).to have_received(:children) end it 'correctly resolves entries' do expect(file_helper.dir_children(File.dirname(path))).to eq(entries) end end describe '#safe_read_lines' do before do allow(File).to receive(:readlines).with(path, sep, anything).and_return(array_content) end context 'when successfully read the file lines' do include_context 'when file is readable' it 'returns the file content in an array of lines' do expect(file_helper.safe_readlines(path)).to eq(array_content) end it 'File.readable? is called with the correct path' do file_helper.safe_readlines(path) expect(File).to have_received(:readable?).with(path) end it 'File.readlines is called with the correct path' do file_helper.safe_readlines(path) expect(File).to have_received(:readlines).with(path, sep, anything) end it "doesn't log anything" do expect(log).not_to receive(:debug) file_helper.safe_readlines(path) end end context 'when failed to read the file lines' do include_context 'when file is not readable' it 'returns empty array by default' do expect(file_helper.safe_readlines(path)).to eq([]) end it 'returns nil' do expect(file_helper.safe_readlines(path, nil)).to eq(nil) end it 'File.readable? is called with the correct path' do file_helper.safe_readlines(path) expect(File).to have_received(:readable?).with(path) end it 'File.readlines is not called' do file_helper.safe_readlines(path) expect(File).not_to have_received(:readlines) end it 'logs a debug message' do expect(log).to receive(:debug).with(error_message) file_helper.safe_read(path) end end end end puppetlabs-facter-dfe6df4/spec/facter/util/linux/000077500000000000000000000000001470204764400222415ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/util/linux/dhcp_spec.rb000066400000000000000000000110401470204764400245120ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Util::Linux::Dhcp do subject(:dhcp_search) { Facter::Util::Linux::Dhcp } let(:log_spy) { instance_spy(Facter::Log) } describe '#dhcp' do context 'when lease file has the dhcp' do before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/run/systemd/netif/leases/2', nil).and_return(load_fixture('dhcp_lease').read) end it 'returns dhcp ip' do expect(dhcp_search.dhcp('ens160', 2, log_spy)).to eq('10.32.22.10') end end context 'when dhclient lease file has the dhcp' do before do allow(Facter::Util::FileHelper).to receive(:safe_read).with('/run/systemd/netif/leases/1', nil).and_return(nil) allow(File).to receive(:readable?).with('/var/lib/dhclient/').and_return(true) allow(Dir).to receive(:entries).with('/var/lib/dhclient/').and_return(%w[dhclient.lo.leases dhclient.leases]) allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/var/lib/dhclient/dhclient.lo.leases', nil).and_return(load_fixture('dhclient_lease').read) end it 'returns dhcp ip' do expect(dhcp_search.dhcp('lo', 1, log_spy)).to eq('10.32.22.9') end end context 'when dhcp is available in the internal leases' do let(:network_manager_files) do %w[NetworkManager-intern.conf secret_key internal-fdgh45-345356fg-dfg-dsfge5er4-sdfghgf45ty-lo.lease timestamps NetworkManager.state seen-bssids] end before do allow(Facter::Util::FileHelper).to receive(:safe_read).with('/run/systemd/netif/leases/1', nil).and_return(nil) allow(File).to receive(:readable?).with('/var/lib/dhclient/').and_return(false) allow(File).to receive(:readable?).with('/var/lib/dhcp/').and_return(false) allow(File).to receive(:readable?).with('/var/lib/dhcp3/').and_return(false) allow(File).to receive(:readable?).with('/var/lib/NetworkManager/').and_return(true) allow(Dir).to receive(:entries).with('/var/lib/NetworkManager/').and_return(network_manager_files) allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/var/lib/NetworkManager/internal-fdgh45-345356fg-dfg-dsfge5er4-sdfghgf45ty-lo.lease', nil) .and_return(load_fixture('dhcp_internal_lease').read) allow(File).to receive(:readable?).with('/var/db/').and_return(false) end it 'returns dhcp ip' do expect(dhcp_search.dhcp('lo', 1, log_spy)).to eq('35.32.82.9') end end context 'when dhcp is available through the dhcpcd command' do before do allow(Facter::Util::FileHelper).to receive(:safe_read).with('/run/systemd/netif/leases/1', nil).and_return(nil) allow(File).to receive(:readable?).with('/var/lib/dhclient/').and_return(false) allow(File).to receive(:readable?).with('/var/lib/dhcp/').and_return(false) allow(File).to receive(:readable?).with('/var/lib/dhcp3/').and_return(false) allow(File).to receive(:readable?).with('/var/lib/NetworkManager/').and_return(false) allow(File).to receive(:readable?).with('/var/db/').and_return(false) allow(Facter::Core::Execution).to receive(:which) .with('dhcpcd').and_return('/usr/bin/dhcpcd') allow(Facter::Core::Execution).to receive(:execute) .with('/usr/bin/dhcpcd -U ens160', logger: log_spy).and_return(load_fixture('dhcpcd').read) dhcp_search.instance_eval { @dhcpcd_command = nil } end it 'returns dhcp ip' do expect(dhcp_search.dhcp('ens160', 1, log_spy)).to eq('10.32.22.9') end end context 'when dhcp is not available through the dhcpcd command' do before do allow(Facter::Util::FileHelper).to receive(:safe_read).with('/run/systemd/netif/leases/1', nil).and_return(nil) allow(File).to receive(:readable?).with('/var/lib/dhclient/').and_return(false) allow(File).to receive(:readable?).with('/var/lib/dhcp/').and_return(false) allow(File).to receive(:readable?).with('/var/lib/dhcp3/').and_return(false) allow(File).to receive(:readable?).with('/var/lib/NetworkManager/').and_return(false) allow(File).to receive(:readable?).with('/var/db/').and_return(false) allow(Facter::Core::Execution).to receive(:which) .with('dhcpcd').and_return(nil) dhcp_search.instance_eval { @dhcpcd_command = nil } end it 'returns nil' do expect(dhcp_search.dhcp('ens160', 1, log_spy)).to eq(nil) end end end end puppetlabs-facter-dfe6df4/spec/facter/util/linux/if_inet6_spec.rb000066400000000000000000000036231470204764400253070ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Util::Linux::IfInet6 do subject(:if_inet6) { Facter::Util::Linux::IfInet6 } let(:simple) do { 'ens160' => { 'fe80::250:56ff:fe9a:8481' => ['permanent'] }, 'lo' => { '::1' => ['permanent'] } } end let(:complex) do { 'temporary' => { '2001:db8::1' => ['temporary'] }, 'noad' => { '2001:db8::2' => ['noad'] }, 'optimistic' => { '2001:db8::3' => ['optimistic'] }, 'dadfailed' => { '2001:db8::4' => ['dadfailed'] }, 'homeaddress' => { '2001:db8::5' => ['homeaddress'] }, 'deprecated' => { '2001:db8::6' => ['deprecated'] }, 'tentative' => { '2001:db8::7' => ['tentative'] }, 'permanent' => { '2001:db8::8' => ['permanent'] }, 'everything' => { '2001:db8::9' => %w[temporary noad optimistic dadfailed homeaddress deprecated tentative permanent] }, 'lo' => { '::1' => ['permanent'] } } end describe '#read_flags' do context 'when only ipv6 link-local and lo ipv6 present' do before do allow(File).to receive(:exist?).and_call_original allow(File).to receive(:exist?).with('/proc/net/if_inet6').and_return(true) allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/proc/net/if_inet6', nil).and_return(load_fixture('proc_net_if_inet6').read) end it { expect(if_inet6.read_flags).to eq(simple) } end context 'when multiple IPv6 addresses present with different flags' do before do allow(File).to receive(:exist?).and_call_original allow(File).to receive(:exist?).with('/proc/net/if_inet6').and_return(true) allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/proc/net/if_inet6', nil).and_return(load_fixture('proc_net_if_inet6_complex').read) end it { expect(if_inet6.read_flags).to eq(complex) } end end end puppetlabs-facter-dfe6df4/spec/facter/util/linux/proc_spec.rb000066400000000000000000000021311470204764400245400ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Util::Linux::Proc do describe '#getenv_for_pid' do before do allow(Facter::Util::FileHelper).to receive(:safe_readlines) .with('/proc/1/environ', [], "\0", { chomp: true }) .and_return(proc_environ.readlines("\0", chomp: true)) end context 'when field exists' do let(:proc_environ) { load_fixture('proc_environ_podman') } it 'returns the field' do result = Facter::Util::Linux::Proc.getenv_for_pid(1, 'container') expect(result).to eq('podman') end end context 'when field does not exist' do let(:proc_environ) { load_fixture('proc_environ_podman') } it 'returns nil' do result = Facter::Util::Linux::Proc.getenv_for_pid(1, 'butter') expect(result).to eq(nil) end end context 'when field is empty' do let(:proc_environ) { load_fixture('proc_environ_no_value') } it 'returns an empty string' do result = Facter::Util::Linux::Proc.getenv_for_pid(1, 'bubbles') expect(result).to eq('') end end end end puppetlabs-facter-dfe6df4/spec/facter/util/linux/routing_table_spec.rb000066400000000000000000000017211470204764400264370ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Util::Linux::RoutingTable do subject(:routing_parser) { Facter::Util::Linux::RoutingTable } let(:log_spy) { instance_spy(Facter::Log) } describe '#read_routing_table' do context 'when ip route show finds an IP, Socket lib did not retrieve' do before do allow(Facter::Core::Execution).to receive(:execute) .with('ip route show', logger: log_spy).and_return(load_fixture('ip_route_show').read) allow(Facter::Core::Execution).to receive(:execute) .with('ip -6 route show', logger: log_spy).and_return(load_fixture('ip_-6_route_show').read) end it 'returns the ipv4 info' do expected = [{ interface: 'ens192', ip: '10.16.125.217' }] expect(routing_parser.read_routing_table(log_spy)[0]).to eq(expected) end it 'returns no ipv6 info' do expect(routing_parser.read_routing_table(log_spy)[1]).to eq([]) end end end end puppetlabs-facter-dfe6df4/spec/facter/util/linux/socket_parser_spec.rb000066400000000000000000000240511470204764400264460ustar00rootroot00000000000000# frozen_string_literal: true def ifaddr_obj(name, ip, mac, netmask, ipv4_type) addr_info = instance_spy(AddrInfo, getnameinfo: [mac], inspect_sockaddr: "hwaddr=#{mac}", ip_address: ip, ip?: true, ipv4?: ipv4_type) netmask = instance_spy(AddrInfo, ip_address: netmask) instance_spy(Ifaddr, name: name, addr: addr_info, netmask: netmask) end describe Facter::Util::Linux::SocketParser do subject(:socket_parser) { Facter::Util::Linux::SocketParser } let(:log_spy) { instance_spy(Facter::Log) } let(:ifaddrs) do [ ifaddr_obj('lo', '127.0.0.1', '00:00:00:00:00:00', '255.0.0.0', true), ifaddr_obj('lo', '::1', '00:00:00:00:00:00', 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', false), ifaddr_obj('ens160', '10.16.119.155', '00:50:56:9a:61:46', '255.255.240.0', true), ifaddr_obj('ens160', '10.16.127.70', '00:50:56:9a:61:46', '255.255.240.0', true), ifaddr_obj('ens160', 'fe80::250:56ff:fe9a:8481', '00:50:56:9a:61:46', 'ffff:ffff:ffff:ffff::', false), ifaddr_obj('ib0', '192.168.2.12', '80:00:02:08:fa:81:00:00:00:00:00:00:00:23:7d:ff:ff:94:73:fd', '255.255.255.0', true) ] end describe '#retrieve_interfaces' do before do allow(Socket).to receive(:getifaddrs).and_return(ifaddrs) allow(Socket).to receive(:const_defined?).with(:PF_LINK).and_return(true) allow(Facter::Core::Execution).to receive(:execute) .with('ip -o link show', logger: log_spy).and_return(load_fixture('ip_link_show_all').read) end let(:result) do { 'lo' => { bindings: [ { address: '127.0.0.1', netmask: '255.0.0.0', network: '127.0.0.0' } ], bindings6: [ { address: '::1', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network: '::1', scope6: 'host' } ] }, 'ens160' => { bindings: [ { address: '10.16.119.155', netmask: '255.255.240.0', network: '10.16.112.0' }, { address: '10.16.127.70', netmask: '255.255.240.0', network: '10.16.112.0' } ], bindings6: [ { address: 'fe80::250:56ff:fe9a:8481', netmask: 'ffff:ffff:ffff:ffff::', network: 'fe80::', scope6: 'link' } ], mac: '00:50:56:9a:61:46' }, 'ib0' => { bindings: [ { address: '192.168.2.12', netmask: '255.255.255.0', network: '192.168.2.0' } ], mac: '80:00:02:08:fa:81:00:00:00:00:00:00:00:23:7d:ff:ff:94:73:fd' } } end it 'returns all the interfaces' do expect(socket_parser.retrieve_interfaces(log_spy)).to eq(result) end context 'when bonded interfaces are present' do let(:ifaddrs) do [ ifaddr_obj('lo', '127.0.0.1', '00:00:00:00:00:00', '255.0.0.0', true), ifaddr_obj('lo', '::1', '00:00:00:00:00:00', 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', false), ifaddr_obj('ens160', '10.16.119.155', '00:50:56:9a:61:46', '255.255.240.0', true), ifaddr_obj('eth2', '10.16.127.70', '08:00:27:29:dc:a5', '255.255.240.0', true), ifaddr_obj('eth3', '11.11.0.1', '08:00:27:29:dc:a5', '255.255.0.0', true), ifaddr_obj('bond0', '11.0.0.3', '08:00:27:29:dc:a5', '255.255.0.0', true) ] end before do allow(Facter::Core::Execution).to receive(:execute) .with('ip -o link show', logger: log_spy) .and_return(load_fixture('ip_link_show_all').read) allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/proc/net/bonding/bond0', nil) .and_return(load_fixture('bond_interface_data').read) end it 'retrieves eth2 interface' do expected = { bindings: [ { address: '10.16.127.70', netmask: '255.255.240.0', network: '10.16.112.0' } ], mac: '08:00:27:29:dc:a5' } expect(socket_parser.retrieve_interfaces(log_spy)['eth2']).to eq(expected) end it 'uses the mac from /proc/net/bonding/bond0 for eth3' do result = socket_parser.retrieve_interfaces(log_spy) expect(result['eth3'][:mac]).to eq('08:00:27:d5:44:7e') end it 'retrieves bond0 interface' do expected = { bindings: [ { address: '11.0.0.3', netmask: '255.255.0.0', network: '11.0.0.0' } ], mac: '08:00:27:29:dc:a5' } expect(socket_parser.retrieve_interfaces(log_spy)['bond0']).to eq(expected) end end context 'when the defined constant is Socket::PF_PACKET, not Socket::PF_LINK' do let(:ifaddrs) do [ ifaddr_obj('ens160', '10.16.119.155', '00:50:56:9a:61:46', '255.255.240.0', true) ] end before do allow(Socket).to receive(:const_defined?).with(:PF_LINK).and_return(false) allow(Socket).to receive(:const_defined?).with(:PF_PACKET).and_return(true) end it 'manages to retrieve mac for ens160' do expect(socket_parser.retrieve_interfaces(log_spy)['ens160'][:mac]).to eq('00:50:56:9a:61:46') end end context 'when Ifaddr.addr throws an error' do before do allow(ifaddrs[4]).to receive(:addr).and_raise(SocketError) end it 'does not solve ens160 ipv6 binding' do expect(socket_parser.retrieve_interfaces(log_spy)['ens160']).not_to have_key(:bindings6) end it 'resolves the mac and ipv4 binding for ens160' do expect(socket_parser.retrieve_interfaces(log_spy)['ens160'].keys).to match_array(%i[mac bindings]) end end context 'when Ifaddr.addr.ip_address throws SocketError' do before do allow(ifaddrs[0]).to receive(:addr) do double.tap do |addr_returned_object| allow(addr_returned_object).to receive(:getnameinfo).and_return(['00:00:00:00:00:00']) allow(addr_returned_object).to receive(:ip?).and_return(true) allow(addr_returned_object).to receive(:ip_address).and_raise(SocketError) end end end it 'does not solve lo ipv4 binding' do expect(socket_parser.retrieve_interfaces(log_spy)['lo']).not_to have_key(:bindings) end it 'resolves the mac and ipv6 binding for lo' do expect(socket_parser.retrieve_interfaces(log_spy)['lo'].keys).to match_array([:bindings6]) end end context 'when Ifaddr.netmask.ip_address throws SocketError' do before do allow(ifaddrs[2]).to receive(:netmask) do double.tap do |addr_returned_object| allow(addr_returned_object).to receive(:ip_address).and_raise(SocketError) end end end it 'does not solve ens160 first ipv4 binding' do expected = [{ address: '10.16.127.70', netmask: '255.255.240.0', network: '10.16.112.0' }] expect(socket_parser.retrieve_interfaces(log_spy)['ens160'][:bindings]).to eq(expected) end end context 'when Ifaddr.addr.getnameinfo throws SocketError' do let(:ifaddrs) do [ ifaddr_obj('ens160', '10.16.119.155', '00:50:56:9a:61:46', '255.255.240.0', true) ] end before do allow(Socket).to receive(:const_defined?).with(:PF_LINK).and_return(true) allow(ifaddrs[0]).to receive(:addr) do double.tap do |addr_returned_object| allow(addr_returned_object).to receive(:getnameinfo).and_raise(SocketError) allow(addr_returned_object).to receive(:ip?).and_return(true) allow(addr_returned_object).to receive(:ip_address).and_return('10.16.119.155') allow(addr_returned_object).to receive(:ipv4?).and_return(true) end end end it 'does not retrieve mac for ens160' do expected = { 'ens160' => { bindings: [ { address: '10.16.119.155', netmask: '255.255.240.0', network: '10.16.112.0' } ] } } expect(socket_parser.retrieve_interfaces(log_spy)).to eq(expected) end end context 'when Ifaddr.addr.inspect_sockaddr throws SocketError' do let(:ifaddrs) do [ ifaddr_obj('ens160', 'fe80::250:56ff:fe9a:8481', '00:50:56:9a:61:46', 'ffff:ffff:ffff:ffff::', false) ] end before do allow(Socket).to receive(:const_defined?).with(:PF_LINK).and_return(false) allow(Socket).to receive(:const_defined?).with(:PF_PACKET).and_return(true) allow(ifaddrs[0]).to receive(:addr) do double.tap do |addr_returned_object| allow(addr_returned_object).to receive(:inspect_sockaddr) do double.tap do |inspect_sockaddr_obj| allow(inspect_sockaddr_obj).to receive(:nil?).and_return(false) allow(inspect_sockaddr_obj).to receive(:match).with(/hwaddr=([\h:]+)/).and_raise(SocketError) end end allow(addr_returned_object).to receive(:ip?).and_return(true) allow(addr_returned_object).to receive(:ip_address).and_return('::1') allow(addr_returned_object).to receive(:ipv4?).and_return(false) end end end it 'does not retrieve mac for ens160' do expected = { 'ens160' => { bindings6: [ { address: '::1', netmask: 'ffff:ffff:ffff:ffff::', network: '::', scope6: 'host' } ] } } expect(socket_parser.retrieve_interfaces(log_spy)).to eq(expected) end end context 'when Ifaddr.addr.getnameinfo returns ip instead of mac' do let(:ifaddrs) do [ ifaddr_obj('ens160', 'fe80::250:56ff:fe9a:8481', 'fe80::250:56ff:fe9a:8481', 'ffff:ffff:ffff:ffff::', false) ] end it 'does not retrieve_interfaces mac' do expect(socket_parser.retrieve_interfaces(log_spy)['ens160']).not_to have_key(:mac) end end context 'when Socket.getifaddrs throws SocketError' do before do allow(Socket).to receive(:getifaddrs).and_raise(SocketError) end it 'raises SocketError' do expect { socket_parser.retrieve_interfaces(log_spy) }.to raise_error(SocketError) end end end end puppetlabs-facter-dfe6df4/spec/facter/util/macosx/000077500000000000000000000000001470204764400223745ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/util/macosx/system_profile_executor_spec.rb000066400000000000000000000030001470204764400307060ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Util::Macosx::SystemProfileExecutor do subject(:system_profiler_executor) { Facter::Util::Macosx::SystemProfileExecutor } describe '#execute' do before do allow(Facter::Core::Execution).to receive(:execute) end it 'calls Facter::Core::Execution.execute' do system_profiler_executor.execute('SPEthernetDataType') expect(Facter::Core::Execution).to have_received(:execute) end context 'when executing system_profiler with SPEthernetDataType argument' do let(:eth_data_hash) do { type: 'Ethernet Controller', bus: 'PCI', vendor_id: '0x8086', device_id: '0x100f', subsystem_vendor_id: '0x1ab8', subsystem_id: '0x0400', revision_id: '0x0000', bsd_name: 'en0', kext_name: 'AppleIntel8254XEthernet.kext', location: '/System/Library/Extensions/IONetworkingFamily.kext/Contents/PlugIns/AppleIntel8254XEthernet.kext', version: '3.1.5' } end before do allow(Facter::Core::Execution) .to receive(:execute) .with('system_profiler SPEthernetDataType', any_args) .and_return(load_fixture('system_profile_sp_ethernet_data_type').read) end it 'returns a hash with the information' do ethernet_data_type_hash = system_profiler_executor.execute('SPEthernetDataType') expect(ethernet_data_type_hash).to eq(eth_data_hash) end end end end puppetlabs-facter-dfe6df4/spec/facter/util/resolvers/000077500000000000000000000000001470204764400231265ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/util/resolvers/aws_token_spec.rb000066400000000000000000000022261470204764400264610ustar00rootroot00000000000000# frozen_string_literal: true describe 'Facter::Util::Resolvers::Http' do subject(:aws_token) { Facter::Util::Resolvers::AwsToken } before do Facter::Util::Resolvers::AwsToken.reset end after do Facter::Util::Resolvers::AwsToken.reset end describe '#get' do it 'calls Facter::Util::Resolvers::Http.put_request' do allow(Facter::Util::Resolvers::Http).to receive(:put_request) aws_token.get expect(Facter::Util::Resolvers::Http).to have_received(:put_request) end it 'does make a second request if token is still available' do allow(Facter::Util::Resolvers::Http).to receive(:put_request).and_return('token') aws_token.get(1000) aws_token.get(1000) expect(Facter::Util::Resolvers::Http).to have_received(:put_request).once end it 'makes a second request if token is expired' do allow(Facter::Util::Resolvers::Http).to receive(:put_request).and_return('token') aws_token.get(1) now = Time.now allow(Time).to receive(:now).and_return(now + 2) aws_token.get(1) expect(Facter::Util::Resolvers::Http).to have_received(:put_request).twice end end end puppetlabs-facter-dfe6df4/spec/facter/util/resolvers/ffi/000077500000000000000000000000001470204764400236725ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/util/resolvers/ffi/load_averages_spec.rb000066400000000000000000000020351470204764400300250ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Util::Resolvers::Ffi::LoadAverages do describe '#load_averages' do let(:memory_pointer) { instance_spy(FFI::MemoryPointer) } before do allow(Facter::Util::Resolvers::Ffi::LoadAverages).to receive(:getloadavg).and_return(response) allow(FFI::MemoryPointer).to receive(:new).with(:double, 3).and_return(memory_pointer) allow(memory_pointer).to receive(:read_array_of_double).with(response).and_return(averages) end context 'when averages are returned' do let(:response) { 3 } let(:averages) { [0.19482421875, 0.2744140625, 0.29296875] } it 'returns load average' do expect(Facter::Util::Resolvers::Ffi::LoadAverages.read_load_averages).to eq(averages) end end context 'when averages are not returned' do let(:response) { -1 } let(:averages) { nil } it 'does not return load average' do expect(Facter::Util::Resolvers::Ffi::LoadAverages.read_load_averages).to eq(averages) end end end end puppetlabs-facter-dfe6df4/spec/facter/util/resolvers/filesystem_helper_spec.rb000066400000000000000000000032771470204764400302210ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Util::Resolvers::FilesystemHelper do describe '.compute_capacity' do it 'returns an integer if full' do capacity = Facter::Util::Resolvers::FilesystemHelper.send(:compute_capacity, 100, 100) expect(capacity).to eq('100%') end it 'returns an integer if empty' do capacity = Facter::Util::Resolvers::FilesystemHelper.send(:compute_capacity, 0, 100) expect(capacity).to eq('0%') end it 'returns a ratio with 2 decimals otherwise' do capacity = Facter::Util::Resolvers::FilesystemHelper.send(:compute_capacity, 421, 10_000) expect(capacity).to eq('4.21%') end end describe '#read_mountpoints' do before do mount = OpenStruct.new mount.name = +'test_name'.encode('ASCII-8BIT') mount.mount_type = +'test_type'.encode('ASCII-8BIT') mount.mount_point = +'test_mount_point'.encode('ASCII-8BIT') mount.options = +'test_options'.encode('ASCII-8BIT') mounts = [mount] allow(Sys::Filesystem).to receive(:mounts).and_return(mounts) end let(:mount_points) { Facter::Util::Resolvers::FilesystemHelper.read_mountpoints } it 'converts name from ASCII-8BIT to UTF-8' do expect(mount_points.first.name.encoding.name).to eq('UTF-8') end it 'converts mount_type from ASCII-8BIT to UTF-8' do expect(mount_points.first.mount_type.encoding.name).to eq('UTF-8') end it 'converts mount_point from ASCII-8BIT to UTF-8' do expect(mount_points.first.mount_point.encoding.name).to eq('UTF-8') end it 'converts options from ASCII-8BIT to UTF-8' do expect(mount_points.first.options.encoding.name).to eq('UTF-8') end end end puppetlabs-facter-dfe6df4/spec/facter/util/resolvers/http_spec.rb000066400000000000000000000132131470204764400254440ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Util::Resolvers::Http do subject(:http) { Facter::Util::Resolvers::Http } let(:url) { 'http://169.254.169.254/meta-data/' } before do allow(Gem).to receive(:win_platform?).and_return(false) end RSpec.shared_examples 'an http request' do context 'when success' do before do stub_request(http_verb, url).to_return(status: 200, body: 'success') end it 'returns the body of the response' do expect(http.send(client_method, url)).to eql('success') end end context 'when setting specific headers' do let(:headers) { { 'Content-Type' => 'application/json' } } before do stub_request(http_verb, url).with(headers: headers).and_return(body: 'success') end it 'adds them to the request' do expect(http.send(client_method, url, headers)).to eql('success') end end context 'when server response with error' do before do stub_request(http_verb, url).to_return(status: 500, body: 'Internal Server Error') end it 'returns empty string' do expect(http.send(client_method, url)).to eql('') end it 'logs error code' do allow(http.instance_variable_get(:@log)).to receive(:debug) expect(http.instance_variable_get(:@log)).to receive(:debug).with("Request to #{url} failed with error code 500") http.send(client_method, url) end end context 'when timeout is reached' do before do stub_request(http_verb, url).to_timeout end it 'returns empty string' do expect(http.send(client_method, url)).to eql('') end it 'logs error message' do allow(http.instance_variable_get(:@log)).to receive(:debug) expect(http.instance_variable_get(:@log)).to receive(:debug).with("Trying to connect to #{url} but got: execution expired") http.send(client_method, url) end end context 'when http request raises error' do before do stub_request(http_verb, url).to_raise(StandardError.new('some error')) end it 'returns empty string' do expect(http.send(client_method, url)).to eql('') end it 'logs error message' do allow(http.instance_variable_get(:@log)).to receive(:debug) expect(http.instance_variable_get(:@log)).to receive(:debug).with("Trying to connect to #{url} but got: some error") http.send(client_method, url) end end context 'when options[:http_debug] is set to true' do let(:net_http_class) { class_spy(Net::HTTP) } let(:net_http_instance) { instance_spy(Net::HTTP) } before do stub_const('Net::HTTP', net_http_class) Facter::Options[:http_debug] = true end it 'sets Net::Http to write request and responses to stderr' do allow(net_http_class).to receive(:new).and_return(net_http_instance) http.send(client_method, url) expect(net_http_instance).to have_received(:set_debug_output).with($stderr) end end end RSpec.shared_examples 'an http request on windows' do it_behaves_like 'an http request' context 'when host is unreachable ' do before do allow(Socket).to receive(:tcp) .with('169.254.169.254', 80, { connect_timeout: 0.6 }) .and_raise(Errno::ETIMEDOUT) end it 'returns empty string' do expect(http.send(client_method, url)).to eql('') end it 'logs error message' do allow(http.instance_variable_get(:@log)).to receive(:debug) expect(http.instance_variable_get(:@log)).to receive(:debug) .with(/((Operation|Connection) timed out)|(A connection attempt.*)/) http.send(client_method, url) end end context 'when timeout is configured' do let(:socket_spy) { class_spy(Socket) } before do stub_const('Socket', socket_spy) stub_request(http_verb, url) allow(Socket).to receive(:tcp).with('169.254.169.254', 80, { connect_timeout: 10 }) end it 'uses the desired value' do http.send(client_method, url, {}, { connection: 10 }) expect(socket_spy).to have_received(:tcp).with('169.254.169.254', 80, { connect_timeout: 10 }) end end end describe '#get_request' do let(:http_verb) { :get } let(:client_method) { :get_request } it_behaves_like 'an http request' end describe '#put_request' do let(:http_verb) { :put } let(:client_method) { :put_request } it_behaves_like 'an http request' end context 'when windows' do before do # The Windows implementation of sockets does not respect net/http # timeouts, so the http client checks if the target is reachable using Socket.tcp allow(Gem).to receive(:win_platform?).and_return(true) allow(Socket).to receive(:tcp).with('169.254.169.254', 80, { connect_timeout: 0.6 }) end describe '#get_request' do let(:http_verb) { :get } let(:client_method) { :get_request } it_behaves_like 'an http request on windows' end describe '#put_request' do let(:http_verb) { :put } let(:client_method) { :put_request } it_behaves_like 'an http request on windows' end end context 'when using a proxy' do before do stub_const('ENV', { 'http_proxy' => 'http://example.com' }) end describe '#get_request' do let(:http_verb) { :get } let(:client_method) { :get_request } it_behaves_like 'an http request' end describe '#put_request' do let(:http_verb) { :put } let(:client_method) { :put_request } it_behaves_like 'an http request' end end end puppetlabs-facter-dfe6df4/spec/facter/util/resolvers/networking/000077500000000000000000000000001470204764400253155ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/util/resolvers/networking/networking_spec.rb000066400000000000000000000244131470204764400310470ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Util::Resolvers::Networking do subject(:networking_helper) { Facter::Util::Resolvers::Networking } let(:ipv4) { '192.168.1.3' } let(:ipv6) { 'fe80::1' } let(:mask4_length) { 10 } let(:mask6_length) { 57 } describe '#build_binding' do context 'when input is ipv4 address' do let(:netmask) { IPAddr.new('255.255.240.0/255.255.240.0').to_s } let(:network) { IPAddr.new('10.16.112.0/255.255.240.0').to_s } let(:addr) { '10.16.121.248' } it 'returns ipv4 binding' do expect(networking_helper.build_binding(addr, 20)).to eql(address: addr, netmask: netmask, network: network) end end context "when mask's length is nil" do it 'returns nil' do expect(networking_helper.build_binding(ipv4, nil)).to be(nil) end end context 'when input is ipv6 address' do let(:network) do IPAddr.new('fe80:0000:0000:0000:0000:0000:0000:0000/ffff:ffff:ffff:ffff:0000:0000:0000:0000').to_s end let(:netmask) do IPAddr.new('ffff:ffff:ffff:ffff:0000:0000:0000:0000/ffff:ffff:ffff:ffff:0000:0000:0000:0000').to_s end let(:addr) { 'fe80::dc20:a2b9:5253:9b46' } it 'returns ipv6 binding' do expect(networking_helper.build_binding(addr, 64)).to eql(address: addr, netmask: netmask, network: network, scope6: 'link') end end end describe '#get_scope' do context "when address's scope is link" do let(:address) { 'fe80::b13f:903e:5f5:3b52' } it 'returns scope6' do expect(networking_helper.get_scope(address)).to eql('link') end end context "when address's scope is global" do let(:address) { '::ffff:192.0.2.128' } it 'returns scope6' do pending('JRuby 9.4.7.0 does not properly parse mixed IPv6 addresses https://github.com/jruby/jruby/issues/8248') if RUBY_PLATFORM == 'java' && RUBY_VERSION == '3.1.4' expect(networking_helper.get_scope(address)).to eql('global') end end context "when address's scope is ipv4 compatible" do let(:address) { '::192.0.2.128' } it 'returns scope6' do expect(networking_helper.get_scope(address)).to eql('compat,global') end end context "when address's scope is site" do let(:address) { 'fec0::' } it 'returns scope6' do expect(networking_helper.get_scope(address)).to eql('site') end end end describe '#ignored_ip_address' do context 'when input is empty' do it 'returns true' do expect(networking_helper.ignored_ip_address('')).to be(true) end end context 'when input starts with 127.' do it 'returns true' do expect(networking_helper.ignored_ip_address('127.255.0.2')).to be(true) end end context 'when input is a valid ipv4 address' do it 'returns false' do expect(networking_helper.ignored_ip_address('169.255.0.2')).to be(false) end end context 'when input starts with fe80' do it 'returns true' do expect(networking_helper.ignored_ip_address('fe80::')).to be(true) end end context 'when input equal with ::1' do it 'returns true' do expect(networking_helper.ignored_ip_address('::1')).to be(true) end end context 'when input is a valid ipv6 address' do it 'returns false' do expect(networking_helper.ignored_ip_address('fe70::7d01:99a1:3900:531b')).to be(false) end end end describe '#expand_main_bindings' do let(:networking_facts) do { primary_interface: 'en0', interfaces: { 'alw0' => { mtu: 1484, mac: '2e:ba:e4:83:4b:b7', bindings6: [{ address: 'fe80::2cba:e4ff:fe83:4bb7', netmask: 'ffff:ffff:ffff:ffff::', network: 'fe80::' }] }, 'bridge0' => { mtu: 1500, mac: '82:17:0e:93:9d:00' }, 'en0' => { mtu: 1500, mac: '64:5a:ed:ea:5c:81', bindings: [{ address: '192.168.1.2', netmask: '255.255.255.0', network: '192.168.1.0' }] }, 'lo0' => { mtu: 16_384, bindings: [{ address: '127.0.0.1', netmask: '255.0.0.0', network: '127.0.0.0' }], bindings6: [{ address: '::1', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network: '::1' }, { address: 'fe80::1', netmask: 'ffff:ffff:ffff:ffff::', network: 'fe80::' }] } } } end it 'expands the ipv4 binding' do expected = { mtu: 1500, mac: '64:5a:ed:ea:5c:81', bindings: [{ address: '192.168.1.2', netmask: '255.255.255.0', network: '192.168.1.0' }], ip: '192.168.1.2', netmask: '255.255.255.0', network: '192.168.1.0' } networking_helper.expand_main_bindings(networking_facts) expect(networking_facts[:interfaces]['en0']).to eq(expected) end it 'expands the ipv6 binding' do expected = { mtu: 1484, mac: '2e:ba:e4:83:4b:b7', bindings6: [{ address: 'fe80::2cba:e4ff:fe83:4bb7', netmask: 'ffff:ffff:ffff:ffff::', network: 'fe80::' }], ip6: 'fe80::2cba:e4ff:fe83:4bb7', netmask6: 'ffff:ffff:ffff:ffff::', network6: 'fe80::', scope6: 'link' } networking_helper.expand_main_bindings(networking_facts) expect(networking_facts[:interfaces]['alw0']).to eq(expected) end it 'expands both the ipv6 and ipv4 binding' do expected = { mtu: 16_384, bindings: [{ address: '127.0.0.1', netmask: '255.0.0.0', network: '127.0.0.0' }], bindings6: [{ address: '::1', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network: '::1' }, { address: 'fe80::1', netmask: 'ffff:ffff:ffff:ffff::', network: 'fe80::' }], ip: '127.0.0.1', ip6: '::1', netmask: '255.0.0.0', netmask6: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network: '127.0.0.0', network6: '::1', scope6: 'host' } networking_helper.expand_main_bindings(networking_facts) expect(networking_facts[:interfaces]['lo0']).to eq(expected) end it 'checks networking_facts have the expected keys' do expected = %i[mtu mac ip netmask network interfaces primary_interface] networking_helper.expand_main_bindings(networking_facts) expect(networking_facts.keys).to match_array(expected) end it 'exoands the primary interface' do expected = { mtu: 1500, mac: '64:5a:ed:ea:5c:81', ip: '192.168.1.2', netmask: '255.255.255.0', network: '192.168.1.0' } networking_helper.expand_main_bindings(networking_facts) expect(networking_facts).to include(expected) end context 'when there is a link-local ip address' do let(:networking_facts) do { interfaces: { 'lo0' => { mtu: 16_384, bindings6: [{ address: '::1', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network: '::1' }, { address: 'fe87::1', netmask: 'ffff:ffff:ffff:ffff::', network: 'fe87::' }] } } } end it 'expands the correct binding' do expected = { ip6: '::1', netmask6: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network6: '::1', scope6: 'host' } networking_helper.expand_main_bindings(networking_facts) expect(networking_facts[:interfaces]['lo0']).to include(expected) end end context 'when there is a unique local ip address' do let(:networking_facts) do { interfaces: { 'lo0' => { mtu: 16_384, bindings6: [{ address: '::1', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network: '::1' }, { address: 'fdfc:f496:4c6f:0:b0e3:7bff:fe3a:6baf', netmask: 'ffff:ffff:ffff:ffff::', network: 'fdfc:f496:4c6f:0::' }] } } } end it 'expands the correct binding' do expected = { ip6: '::1', netmask6: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network6: '::1', scope6: 'host' } networking_helper.expand_main_bindings(networking_facts) expect(networking_facts[:interfaces]['lo0']).to include(expected) end end context 'when there is a global ip address' do let(:networking_facts) do { interfaces: { 'lo0' => { mtu: 16_384, bindings6: [{ address: '::1', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network: '::1' }, { address: '2001:0DB8::1', netmask: 'ffff:ffff:ffff:ffff::', network: '2001:0DB8::' }] } } } end it 'expands the correct binding' do expected = { ip6: '2001:0DB8::1', netmask6: 'ffff:ffff:ffff:ffff::', network6: '2001:0DB8::', scope6: 'global' } networking_helper.expand_main_bindings(networking_facts) expect(networking_facts[:interfaces]['lo0']).to include(expected) end end end describe '#calculate_mask_length' do context 'when ip v4' do let(:netmask) { '255.0.0.0' } it 'returns 8 as mask length' do mask_length = Facter::Util::Resolvers::Networking.calculate_mask_length(netmask) expect(mask_length).to be(8) end end context 'when ip v6' do let(:netmask) { '::ffff:ffff:ffff:ffff:ffff:ffff' } it 'returns 10 as mask length' do mask_length = Facter::Util::Resolvers::Networking.calculate_mask_length(netmask) expect(mask_length).to be(96) end end end end puppetlabs-facter-dfe6df4/spec/facter/util/resolvers/networking/primary_interface_spec.rb000066400000000000000000000064561470204764400323720ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Util::Resolvers::Networking::PrimaryInterface do subject(:primary_interface) { Facter::Util::Resolvers::Networking::PrimaryInterface } describe '#read_from_route' do before do allow(Facter::Core::Execution).to receive(:execute) .and_return(load_fixture('route_n_get_default').read) end it 'parses output from `route -n get default`' do allow(Facter::Core::Execution).to receive(:which).with('route').and_return('/some/path') expect(primary_interface.read_from_route).to eq('net0') end it 'returns nil if route command does not exist' do allow(Facter::Core::Execution).to receive(:which).with('route').and_return(nil) expect(primary_interface.read_from_route).to be_nil end end describe '#read_from_proc_route' do before do allow(Facter::Util::FileHelper) .to receive(:safe_read) .with('/proc/net/route', '') \ .and_return(output) end context 'when proc net route has output' do let(:output) { load_fixture('proc_net_route').read } it 'parses output /proc/net/route file' do expect(primary_interface.read_from_proc_route).to eq('ens160') end end context 'when proc net route has no output' do let(:output) { load_fixture('proc_net_route_empty').read } it 'parses output /proc/net/route file' do expect(primary_interface.read_from_proc_route).to eq(nil) end end context 'when proc net route has blackhole default' do let(:output) { load_fixture('proc_net_route_blackhole').read } it 'parses output /proc/net/route file' do expect(primary_interface.read_from_proc_route).to eq(nil) end end end describe '#read_from_ip_route' do before do allow(Facter::Core::Execution).to receive(:execute) .and_return(load_fixture('ip_route_show_default').read) end it 'parses output from `ip route show default`' do allow(Facter::Core::Execution).to receive(:which).with('ip').and_return('/some/path') expect(primary_interface.read_from_ip_route).to eq('ens160') end it 'returns nil if route command does not exist' do allow(Facter::Core::Execution).to receive(:which).with('ip').and_return(nil) expect(primary_interface.read_from_ip_route).to be_nil end end describe '#find_in_interfaces' do let(:interfaces) do { 'lo' => { bindings: [{ address: '127.0.0.1', netmask: '255.0.0.0', network: '127.0.0.0' }], bindings6: [{ address: '::1', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', network: '::1', scope6: 'host' }], scope6: 'host', mtu: 65_536 }, 'ens160' => { bindings: [{ address: '10.16.124.1', netmask: '255.255.240.0', network: '10.16.112.0' }], dhcp: '10.32.22.9', bindings6: [{ address: 'fe80::250:56ff:fe9a:41fc', netmask: 'ffff:ffff:ffff:ffff::', network: 'fe80::', scope6: 'link' }], scope6: 'link', mac: '00:50:56:9a:41:fc', mtu: 1500 } } end it 'parses interfaces to find primary interface' do expect(primary_interface.find_in_interfaces(interfaces)).to eq('ens160') end end end puppetlabs-facter-dfe6df4/spec/facter/util/resolvers/ssh_helper_spec.rb000066400000000000000000000023241470204764400266220ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Util::Resolvers::SshHelper do subject(:ssh_helper) { Facter::Util::Resolvers::SshHelper } describe '#create_ssh' do let(:key) { load_fixture('rsa_key').read.strip } it 'returns an RSA ssh object' do expect(ssh_helper.create_ssh('ssh-rsa', key)).to \ be_an_instance_of(Facter::Util::Resolvers::Ssh).and \ have_attributes(name: 'rsa', type: 'ssh-rsa') end it 'returns sha1 fingerprint' do expect(ssh_helper.create_ssh('ssh-rsa', key).fingerprint.sha1).to \ eq('SSHFP 1 1 90134f93fec6ab5e22bdd88fc4d7cd6e9dca4a07') end it 'returns sha256 fingerprint' do expect(ssh_helper.create_ssh('ssh-rsa', key).fingerprint.sha256).to \ eq('SSHFP 1 2 efaa26ff8169f5ffc372ebcad17aef886f4ccaa727169acdd0379b51c6c77e99') end it 'ignores non-base64 characters' do nonbase64_key = "\x00\n-_#{key}" expect(ssh_helper.create_ssh('ssh-rsa', nonbase64_key).fingerprint.sha1).to \ eq('SSHFP 1 1 90134f93fec6ab5e22bdd88fc4d7cd6e9dca4a07') end it 'implements value semantics' do expect(ssh_helper.create_ssh('ssh-rsa', key)).to eq(ssh_helper.create_ssh('ssh-rsa', key)) end end end puppetlabs-facter-dfe6df4/spec/facter/util/resolvers/uptime_helper_spec.rb000066400000000000000000000027041470204764400273320ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Util::Resolvers::UptimeHelper do subject(:helper) { Facter::Util::Resolvers::UptimeHelper } context 'when the uptime is less than 1 minutes' do let(:expected_result) { { days: 0, hours: 0, seconds: 20, uptime: '0:00 hours' } } it 'returns response hash' do expect(helper.create_uptime_hash(20)).to eq(expected_result) end end context 'when the uptime is more than 1 minute and less than 1 hour' do let(:expected_result) { { days: 0, hours: 0, seconds: 620, uptime: '0:10 hours' } } it 'returns response hash' do expect(helper.create_uptime_hash(620)).to eq(expected_result) end end context 'when the uptime is more than 1 hour but less than 1 day' do let(:expected_result) { { days: 0, hours: 3, seconds: 11_420, uptime: '3:10 hours' } } it 'returns response hash' do expect(helper.create_uptime_hash(11_420)).to eq(expected_result) end end context 'when the uptime is 1 day' do let(:expected_result) { { days: 1, hours: 27, seconds: 97_820, uptime: '1 day' } } it 'returns response hash' do expect(helper.create_uptime_hash(97_820)).to eq(expected_result) end end context 'when the uptime is more than 2 day' do let(:expected_result) { { days: 2, hours: 51, seconds: 184_220, uptime: '2 days' } } it 'returns response hash' do expect(helper.create_uptime_hash(184_220)).to eq(expected_result) end end end puppetlabs-facter-dfe6df4/spec/facter/util/windows/000077500000000000000000000000001470204764400225745ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/facter/util/windows/network_utils_spec.rb000066400000000000000000000051361470204764400270510ustar00rootroot00000000000000# frozen_string_literal: true Ps = Struct.new(:PhysicalAddress, :PhysicalAddressLength) describe NetworkUtils do describe '#address_to_string' do let(:logger) { NetworkUtils.instance_variable_get(:@log) } let(:addr) { instance_spy('SocketAddress') } let(:size) { instance_spy(FFI::MemoryPointer) } let(:buffer) { instance_spy(FFI::MemoryPointer) } let(:length) { 32 } before do allow(addr).to receive(:[]).with(:lpSockaddr).and_return(address) allow(FFI::MemoryPointer).to receive(:new).with(NetworkingFFI::INET6_ADDRSTRLEN + 1).and_return(size) allow(FFI::MemoryPointer).to receive(:new).with(:wchar, NetworkingFFI::INET6_ADDRSTRLEN + 1).and_return(buffer) allow(addr).to receive(:[]).with(:lpSockaddr).and_return(address) allow(addr).to receive(:[]).with(:iSockaddrLength).and_return(length) allow(NetworkingFFI).to receive(:WSAAddressToStringW) .with(address, length, FFI::Pointer::NULL, buffer, size).and_return(error) allow(NetworkUtils).to receive(:extract_address).with(buffer).and_return('10.123.0.2') end context 'when lpSockaddr is null' do let(:address) { FFI::Pointer::NULL } let(:error) { 0 } it 'returns nil' do expect(NetworkUtils.address_to_string(addr)).to be(nil) end end context 'when error code is zero' do let(:address) { instance_spy(FFI::MemoryPointer) } let(:error) { 0 } it 'returns an address' do expect(NetworkUtils.address_to_string(addr)).to eql('10.123.0.2') end end context 'when error code is not zero' do let(:address) { instance_spy(FFI::MemoryPointer) } let(:error) { 1 } it 'returns nil and logs debug message' do allow(logger).to receive(:debug).with('address to string translation failed!') expect(NetworkUtils.address_to_string(addr)).to be(nil) end end end describe '#extract_address' do context 'when address is ipv6' do let(:addr) { 'fe80::38bf:8f11:6227:9e6b%6' } let(:input) { double(FFI::Pointer) } before do allow(input).to receive(:read_wide_string_without_length).and_return(addr) end it 'returns address without interface' do expect(NetworkUtils.extract_address(input)).to eql('fe80::38bf:8f11:6227:9e6b') end end end describe '#find_mac_address' do context 'with a char array' do let(:adapter) do Ps.new([0, 80, 86, 154, 248, 107, 0, 0], 6) end it 'returns mac address' do expect(NetworkUtils.find_mac_address(adapter)).to eql('00:50:56:9A:F8:6B') end end end end puppetlabs-facter-dfe6df4/spec/facter/util/windows/win32ole_spec.rb000066400000000000000000000020431470204764400255740ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Util::Windows::Win32Ole do before do result = double(WIN32OLE) allow(WIN32OLE).to receive(:new).with('WbemScripting.SWbemLocator').and_return(result) allow(result).to receive(:ConnectServer).with('.', 'root\\cimv2').and_return(result) allow(result).to receive(:Security_).and_return(result) allow(result).to receive(:ImpersonationLevel=).and_return(result) allow(result).to receive(:execquery).with(query).and_return(query_result) end describe '#return_first when query result is nil' do let(:query) { 'query' } let(:query_result) {} it 'returns nil' do win = Facter::Util::Windows::Win32Ole.new output = win.return_first(query) expect(output).to eq(nil) end end describe '#return_first' do let(:query) { 'query' } let(:query_result) { ['something'] } it 'returns first element' do win = Facter::Util::Windows::Win32Ole.new output = win.return_first(query) expect(output).to eq('something') end end end puppetlabs-facter-dfe6df4/spec/facter/version_spec.rb000066400000000000000000000006601470204764400231530ustar00rootroot00000000000000# frozen_string_literal: true describe Facter do describe '#reported and gemspec files version' do it 'checks that reported and facter.gemspec versions are the same' do gemspec_file_path = File.join(File.dirname(__FILE__), '..', '..', 'facter.gemspec') gemspec_facter_version = Gem::Specification.load(gemspec_file_path).version.to_s expect(gemspec_facter_version).to eq(Facter::VERSION) end end end puppetlabs-facter-dfe6df4/spec/fixtures/000077500000000000000000000000001470204764400205325ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/fixtures/aix_filesystems000066400000000000000000000002661470204764400236710ustar00rootroot00000000000000# Comment line # Another comment line # # This is a test %defaultvfs jfs2 nfs # cdrfs 5 none none procfs 6 none none sfs 16 none none namefs 1 none none ahafs 39 none none puppetlabs-facter-dfe6df4/spec/fixtures/blkid_output000066400000000000000000000007241470204764400231650ustar00rootroot00000000000000/dev/mapper/VolGroup00-LogVol01: TYPE="swap" /dev/mapper/VolGroup00-LogVol00: UUID="1bd8643b-483a-4fdc-adcd-c586384919a8" TYPE="ext3" /dev/sda1: LABEL="/boot" UUID="88077904-4fd4-476f-9af2-0f7a806ca25e" TYPE="ext3" SEC_TYPE="ext2" PARTUUID="00061fe0-01 " /dev/hdc: LABEL="VMware Tools" TYPE="iso9660" /dev/VolGroup00/LogVol00: UUID="1bd8643b-483a-4fdc-adcd-c586384919a8" TYPE="ext3" /dev/VolGroup00/LogVol01: TYPE="swap" /dev/cdrom: LABEL="VMware Tools" TYPE="iso9660"puppetlabs-facter-dfe6df4/spec/fixtures/blkid_output_root_has_partuuid000066400000000000000000000003761470204764400270030ustar00rootroot00000000000000/dev/xvda1: LABEL="cloudimg-rootfs" UUID="f387d281-b162-4d60-84b5-e7e94687e6b8" TYPE="ext4" PARTUUID="a2f52878-01" /dev/loop0: TYPE="squashfs" /dev/loop1: TYPE="squashfs" /dev/loop2: TYPE="squashfs" /dev/loop3: TYPE="squashfs" /dev/loop4: TYPE="squashfs"puppetlabs-facter-dfe6df4/spec/fixtures/bond_interface_data000066400000000000000000000033751470204764400244200ustar00rootroot00000000000000Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011) Bonding Mode: IEEE 802.3ad Dynamic link aggregation Transmit Hash Policy: layer2 (0) MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 0 Down Delay (ms): 0 Peer Notification Delay (ms): 0 802.3ad info LACP rate: fast Min links: 0 Aggregator selection policy (ad_select): stable System priority: 65535 System MAC address: 08:00:27:29:dc:a5 Active Aggregator Info: Aggregator ID: 1 Number of ports: 1 Actor Key: 9 Partner Key: 1 Partner Mac Address: 00:00:00:00:00:00 Slave Interface: eth2 MII Status: up Speed: 1000 Mbps Duplex: full Link Failure Count: 1 Permanent HW addr: 08:00:27:29:dc:a5 Slave queue ID: 0 Aggregator ID: 1 Actor Churn State: none Partner Churn State: churned Actor Churned Count: 0 Partner Churned Count: 2 details actor lacp pdu: system priority: 65535 system mac address: 08:00:27:29:dc:a5 port key: 9 port priority: 255 port number: 1 port state: 207 details partner lacp pdu: system priority: 65535 system mac address: 00:00:00:00:00:00 oper key: 1 port priority: 255 port number: 1 port state: 3 Slave Interface: eth3 MII Status: up Speed: 1000 Mbps Duplex: full Link Failure Count: 1 Permanent HW addr: 08:00:27:d5:44:7e Slave queue ID: 0 Aggregator ID: 2 Actor Churn State: churned Partner Churn State: churned Actor Churned Count: 2 Partner Churned Count: 2 details actor lacp pdu: system priority: 65535 system mac address: 08:00:27:29:dc:a5 port key: 9 port priority: 255 port number: 2 port state: 199 details partner lacp pdu: system priority: 65535 system mac address: 00:00:00:00:00:00 oper key: 1 port priority: 255 port number: 1 port state: 3 puppetlabs-facter-dfe6df4/spec/fixtures/broken_os_hierarchy000066400000000000000000000005741470204764400245020ustar00rootroot00000000000000[ { "Linux": [ "Debian": [ "Elementary", "Ubuntu", "Raspbian" ] }, { "El": [ "Fedora", "Amzn", "Centos" ] }, { "Sles": [ "Opensuse" ] } ] }, { "Solaris": [ "Bsd" ] }, "Macosx", "Windows", "Aix" ] puppetlabs-facter-dfe6df4/spec/fixtures/centos_lsb_release000066400000000000000000000003051470204764400243060ustar00rootroot00000000000000LSB Version: :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64 Distributor ID: CentOS Description: CentOS Linux release 7.2.1511 (Core) Release: 7.2.1511 Codename: Corepuppetlabs-facter-dfe6df4/spec/fixtures/cgroup_file000066400000000000000000000000701470204764400227500ustar00rootroot0000000000000012:pids:/init.scope 11:cpu,cpuacct:/init.scope 10:rdma:/puppetlabs-facter-dfe6df4/spec/fixtures/cmdline_root_device000066400000000000000000000000771470204764400244560ustar00rootroot00000000000000mem=512M console=ttyS2,115200n8 root=/dev/mmcblk0p2 rw rootwaitpuppetlabs-facter-dfe6df4/spec/fixtures/cmdline_root_device_partuuid000066400000000000000000000002101470204764400263600ustar00rootroot00000000000000BOOT_IMAGE=/boot/vmlinuz-5.4.0-1024-aws root=PARTUUID=a2f52878-01 ro console=tty1 console=ttyS0 nvme_core.io_timeout=4294967295 panic=-1puppetlabs-facter-dfe6df4/spec/fixtures/cpuinfo000066400000000000000000000102661470204764400221250ustar00rootroot00000000000000processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 79 model name : Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz stepping : 1 microcode : 0xb00002e cpu MHz : 2294.686 cache size : 46080 KB physical id : 0 siblings : 4 core id : 0 cpu cores : 4 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 20 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 invpcid rtm rdseed adx smap xsaveopt arat flush_l1d arch_capabilities bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds bogomips : 4589.37 clflush size : 64 cache_alignment : 64 address sizes : 43 bits physical, 48 bits virtual power management: processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 79 model name : Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz stepping : 1 microcode : 0xb00002e cpu MHz : 2294.686 cache size : 46080 KB physical id : 0 siblings : 4 core id : 1 cpu cores : 4 apicid : 1 initial apicid : 1 fpu : yes fpu_exception : yes cpuid level : 20 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 invpcid rtm rdseed adx smap xsaveopt arat flush_l1d arch_capabilities bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds bogomips : 4589.37 clflush size : 64 cache_alignment : 64 address sizes : 43 bits physical, 48 bits virtual power management: processor : 2 vendor_id : GenuineIntel cpu family : 6 model : 79 model name : Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz stepping : 1 microcode : 0xb00002e cpu MHz : 2294.686 cache size : 46080 KB physical id : 0 siblings : 4 core id : 2 cpu cores : 4 apicid : 2 initial apicid : 2 fpu : yes fpu_exception : yes cpuid level : 20 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 invpcid rtm rdseed adx smap xsaveopt arat flush_l1d arch_capabilities bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds bogomips : 4589.37 clflush size : 64 cache_alignment : 64 address sizes : 43 bits physical, 48 bits virtual power management: processor : 3 vendor_id : GenuineIntel cpu family : 6 model : 79 model name : Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz stepping : 1 microcode : 0xb00002e cpu MHz : 2294.686 cache size : 46080 KB physical id : 0 siblings : 4 core id : 3 cpu cores : 4 apicid : 3 initial apicid : 3 fpu : yes fpu_exception : yes cpuid level : 20 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 invpcid rtm rdseed adx smap xsaveopt arat flush_l1d arch_capabilities bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds bogomips : 4589.37 clflush size : 64 cache_alignment : 64 address sizes : 43 bits physical, 48 bits virtual power management:puppetlabs-facter-dfe6df4/spec/fixtures/cpuinfo_arm64000066400000000000000000000006061470204764400231330ustar00rootroot00000000000000processor : 0 BogoMIPS : 200.00 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics cpuid CPU implementer : 0x43 CPU architecture: 8 CPU variant : 0x1 CPU part : 0x0a1 CPU revision : 1 processor : 1 BogoMIPS : 200.00 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics cpuid CPU implementer : 0x43 CPU architecture: 8 CPU variant : 0x1 CPU part : 0x0a1 CPU revision : 1puppetlabs-facter-dfe6df4/spec/fixtures/cpuinfo_powerpc000066400000000000000000000010621470204764400236560ustar00rootroot00000000000000processor : 0 cpu : POWER8 (raw), altivec supported clock : 2926.000000MHz revision : 2.0 (pvr 004d 0200) processor : 1 cpu : POWER8 (raw), altivec supported clock : 2926.000000MHz revision : 2.0 (pvr 004d 0200) processor : 2 cpu : POWER8 (raw), altivec supported clock : 2926.000000MHz revision : 2.0 (pvr 004d 0200) processor : 3 cpu : POWER8 (raw), altivec supported clock : 2926.000000MHz revision : 2.0 (pvr 004d 0200) timebase : 512000000 platform : pSeries model : IBM pSeries (emulated by qemu) machine : CHRP IBM pSeries (emulated by qemu)puppetlabs-facter-dfe6df4/spec/fixtures/cpuinfo_wo_physical_id000066400000000000000000000101661470204764400252010ustar00rootroot00000000000000processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 79 model name : Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz stepping : 1 microcode : 0xb00002e cpu MHz : 2294.686 cache size : 46080 KB siblings : 4 core id : 0 cpu cores : 4 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 20 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 invpcid rtm rdseed adx smap xsaveopt arat flush_l1d arch_capabilities bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds bogomips : 4589.37 clflush size : 64 cache_alignment : 64 address sizes : 43 bits physical, 48 bits virtual power management: processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 79 model name : Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz stepping : 1 microcode : 0xb00002e cpu MHz : 2294.686 cache size : 46080 KB siblings : 4 core id : 1 cpu cores : 4 apicid : 1 initial apicid : 1 fpu : yes fpu_exception : yes cpuid level : 20 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 invpcid rtm rdseed adx smap xsaveopt arat flush_l1d arch_capabilities bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds bogomips : 4589.37 clflush size : 64 cache_alignment : 64 address sizes : 43 bits physical, 48 bits virtual power management: processor : 2 vendor_id : GenuineIntel cpu family : 6 model : 79 model name : Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz stepping : 1 microcode : 0xb00002e cpu MHz : 2294.686 cache size : 46080 KB siblings : 4 core id : 2 cpu cores : 4 apicid : 2 initial apicid : 2 fpu : yes fpu_exception : yes cpuid level : 20 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 invpcid rtm rdseed adx smap xsaveopt arat flush_l1d arch_capabilities bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds bogomips : 4589.37 clflush size : 64 cache_alignment : 64 address sizes : 43 bits physical, 48 bits virtual power management: processor : 3 vendor_id : GenuineIntel cpu family : 6 model : 79 model name : Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz stepping : 1 microcode : 0xb00002e cpu MHz : 2294.686 cache size : 46080 KB siblings : 4 core id : 3 cpu cores : 4 apicid : 3 initial apicid : 3 fpu : yes fpu_exception : yes cpuid level : 20 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 invpcid rtm rdseed adx smap xsaveopt arat flush_l1d arch_capabilities bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds bogomips : 4589.37 clflush size : 64 cache_alignment : 64 address sizes : 43 bits physical, 48 bits virtual power management:puppetlabs-facter-dfe6df4/spec/fixtures/df000066400000000000000000000005551470204764400210530ustar00rootroot00000000000000Filesystem 512-blocks Used Available Capacity Mounted on /dev/hd4 4194304 780504 3413800 19% / /dev/hd2 10485760 4530640 5955120 44% /usr /dev/hd3 423201 3233 419968 1% /var /proc - - - - /proc joe:/var/share 143650816 10343368 133307448 8% /tmp/salam puppetlabs-facter-dfe6df4/spec/fixtures/dhclient_lease000066400000000000000000000002711470204764400234200ustar00rootroot00000000000000lease { interface "lo"; option routers 10.32.112.1; option dhcp-message-type 5; option dhcp-server-identifier 10.32.22.9; option domain-name-servers 10.240.0.10,10.240.1.10; }puppetlabs-facter-dfe6df4/spec/fixtures/dhclient_rhel_lease_8000066400000000000000000000026101470204764400246600ustar00rootroot00000000000000default-duid "\000\004N&+>\315WL\311\2756\\\036P\3448\017"; lease { interface "eth0"; fixed-address 10.0.0.5; server-name "AMS072031502021"; option subnet-mask 255.255.255.0; option routers 10.0.0.1; option dhcp-lease-time 4294967295; option dhcp-message-type 5; option domain-name-servers 168.63.129.16; option dhcp-server-identifier 168.63.129.16; option dhcp-renewal-time 4294967295; option dhcp-rebinding-time 4294967295; option unknown-245 a8:3f:81:10; option rfc3442-classless-static-routes 0,10,0,0,1,32,168,63,129,16,10,0,0,1,32,169,254,169,254,10,0,0,1; option domain-name "peq1diqrkypunc0cz32ezmxjye.ax.internal.cloudapp.net"; renew never; rebind never; expire never; } lease { interface "eth0"; fixed-address 10.0.0.5; server-name "AMS072031502021"; option subnet-mask 255.255.255.0; option dhcp-lease-time 4294967295; option routers 10.0.0.1; option dhcp-message-type 5; option dhcp-server-identifier 168.63.129.16; option domain-name-servers 168.63.129.16; option dhcp-renewal-time 4294967295; option rfc3442-classless-static-routes 0,10,0,0,1,32,168,63,129,16,10,0,0,1,32,169,254,169,254,10,0,0,1; option unknown-245 a8:3f:81:10; option dhcp-rebinding-time 4294967295; option domain-name "peq1diqrkypunc0cz32ezmxjye.ax.internal.cloudapp.net"; renew 0 2156/10/17 20:41:21; rebind 0 2156/10/17 20:41:21; expire 0 2156/10/17 20:41:21; } puppetlabs-facter-dfe6df4/spec/fixtures/dhcp_internal_lease000066400000000000000000000004661470204764400244460ustar00rootroot00000000000000# This is private data. Do not parse. ADDRESS=11.22.36.241 NETMASK=255.255.240.0 ROUTER=99.26.666.1 SERVER_ADDRESS=35.32.82.9 NEXT_SERVER=05.3.3.100 T1=150 T2=262 LIFETIME=300 DNS=78.250.0.0 90.230.1.10 NTP=55.2.25.65 12.0.21.19 88.2.45.18 96.45.22.39 DOMAINNAME=bakery.puppetlabs.net CLIENTID=61952356faeffac puppetlabs-facter-dfe6df4/spec/fixtures/dhcp_lease000066400000000000000000000005071470204764400225460ustar00rootroot00000000000000# This is private data. Do not parse. ADDRESS=10.16.122.112 NETMASK=255.255.240.0 ROUTER=10.16.112.1 SERVER_ADDRESS=10.32.22.10 NEXT_SERVER=10.32.23.146 T1=450 T2=787 LIFETIME=900 DNS=10.240.0.10 10.240.1.10 NTP=10.32.22.9 10.0.22.10 10.0.22.11 DOMAINNAME=delivery.puppetlabs.net CLIENTID=ff9f6e852400020000ab113d3dd2dee03bb312puppetlabs-facter-dfe6df4/spec/fixtures/dhcpcd000066400000000000000000000006761470204764400217130ustar00rootroot00000000000000broadcast_address='10.16.127.255' dhcp_lease_time='300' dhcp_message_type='5' dhcp_server_identifier='10.32.22.9' domain_name='delivery.puppetlabs.net' domain_name_servers='10.240.0.10 10.240.1.10' filename='pxelinux.0' ip_address='10.16.116.66' network_number='10.16.112.0' ntp_servers='10.32.22.9 10.0.22.10 10.32.22.10 10.0.22.11' routers='10.16.112.1' subnet_cidr='20' subnet_mask='255.255.240.0' ens192: dhcp6_dump: No such file or directorypuppetlabs-facter-dfe6df4/spec/fixtures/dmi_decode_virtualbox000066400000000000000000000034311470204764400250110ustar00rootroot00000000000000# dmidecode 3.1 Getting SMBIOS data from sysfs. SMBIOS 2.5 present. 10 structures occupying 449 bytes. Table at 0x000E1000. Handle 0x0000, DMI type 0, 20 bytes BIOS Information Vendor: innotek GmbH Version: VirtualBox Release Date: 12/01/2006 Address: 0xE0000 Runtime Size: 128 kB ROM Size: 128 kB Characteristics: ISA is supported PCI is supported Boot from CD is supported Selectable boot is supported 8042 keyboard services are supported (int 9h) CGA/mono video services are supported (int 10h) ACPI is supported Handle 0x0001, DMI type 1, 27 bytes System Information Manufacturer: innotek GmbH Product Name: VirtualBox Version: 1.2 Serial Number: 0 UUID: 784198EC-5827-476E-9E24-B0E98E8958F5 Wake-up Type: Power Switch SKU Number: Not Specified Family: Virtual Machine Handle 0x0008, DMI type 2, 15 bytes Base Board Information Manufacturer: Oracle Corporation Product Name: VirtualBox Version: 1.2 Serial Number: 0 Asset Tag: Not Specified Features: Board is a hosting board Location In Chassis: Not Specified Chassis Handle: 0x0003 Type: Motherboard Contained Object Handles: 0 Handle 0x0003, DMI type 3, 13 bytes Chassis Information Manufacturer: Oracle Corporation Type: Other Lock: Not Present Version: Not Specified Serial Number: Not Specified Asset Tag: Not Specified Boot-up State: Safe Power Supply State: Safe Thermal State: Safe Security Status: None Handle 0x0007, DMI type 126, 42 bytes Inactive Handle 0x0005, DMI type 126, 15 bytes Inactive Handle 0x0006, DMI type 126, 28 bytes Inactive Handle 0x0002, DMI type 11, 7 bytes OEM Strings String 1: vboxVer_6.1.4 String 2: vboxRev_136177 Handle 0x0008, DMI type 128, 8 bytes OEM-specific Type Header and Data: 80 08 08 00 3D A0 2A 00 Handle 0xFEFF, DMI type 127, 4 bytes End Of Table puppetlabs-facter-dfe6df4/spec/fixtures/dmi_decode_vmware000066400000000000000000000063771470204764400241270ustar00rootroot00000000000000Getting SMBIOS data from sysfs. SMBIOS 2.7 present. 242 structures occupying 9908 bytes. Table at 0x000E0010. Handle 0x0000, DMI type 0, 24 bytes BIOS Information Vendor: Phoenix Technologies LTD Version: 6.00 Release Date: 12/12/2018 Address: 0xEA490 Runtime Size: 88944 bytes ROM Size: 64 kB Characteristics: ISA is supported PCI is supported PC Card (PCMCIA) is supported PNP is supported APM is supported BIOS is upgradeable BIOS shadowing is allowed ESCD support is available Boot from CD is supported Selectable boot is supported EDD is supported Print screen service is supported (int 5h) 8042 keyboard services are supported (int 9h) Serial services are supported (int 14h) Printer services are supported (int 17h) CGA/mono video services are supported (int 10h) ACPI is supported Smart battery is supported BIOS boot specification is supported Function key-initiated network boot is supported Targeted content distribution is supported BIOS Revision: 4.6 Firmware Revision: 0.0 Handle 0x0001, DMI type 1, 27 bytes System Information Manufacturer: VMware, Inc. Product Name: VMware Virtual Platform Version: None Serial Number: VMware-42 1a ee 9a 8e 13 ee e5-fc ec 82 3d cd 74 76 94 UUID: 9aee1a42-138e-e5ee-fcec-823dcd747694 Wake-up Type: Power Switch SKU Number: Not Specified Family: Not Specified Handle 0x0002, DMI type 2, 15 bytes Base Board Information Manufacturer: Intel Corporation Product Name: 440BX Desktop Reference Platform Version: None Serial Number: None Asset Tag: Not Specified Features: None Location In Chassis: Not Specified Chassis Handle: 0x0000 Type: Unknown Contained Object Handles: 0 Handle 0x0003, DMI type 3, 21 bytes Chassis Information Manufacturer: No Enclosure Type: Other Lock: Not Present Version: N/A Serial Number: None Asset Tag: No Asset Tag Boot-up State: Safe Power Supply State: Safe Thermal State: Safe Security Status: None OEM Information: 0x00001234 Height: Unspecified Number Of Power Cords: Unspecified Contained Elements: 0 Handle 0x0004, DMI type 4, 42 bytes Processor Information Socket Designation: CPU #000 Type: Central Processor Family: Unknown Manufacturer: GenuineIntel ID: 54 06 05 00 FF FB 8B 0F Version: Intel(R) Xeon(R) Gold 6138 CPU @ 2.00GHz Voltage: 3.3 V External Clock: Unknown Max Speed: 30000 MHz Current Speed: 2000 MHz Status: Populated, Enabled Upgrade: ZIF Socket L1 Cache Handle: 0x0016 L2 Cache Handle: 0x0018 L3 Cache Handle: Not Provided Serial Number: Not Specified Asset Tag: Not Specified Part Number: Not Specified Core Count: 1 Core Enabled: 1 Characteristics: 64-bit capable Execute Protection Handle 0x0004, DMI type 4, 42 bytes Processor Information Socket Designation: CPU #001 Type: Central Processor Family: Unknown Manufacturer: GenuineIntel ID: 54 06 00 00 FF FB 8B 0F Version: Intel(R) Xeon(R) Gold 6138 CPU @ 2.00GHz Voltage: 3.3 V External Clock: Unknown Max Speed: 30000 MHz Current Speed: 2000 MHz Status: Populated, Enabled Upgrade: ZIF Socket L1 Cache Handle: 0x0016 L2 Cache Handle: 0x0018 L3 Cache Handle: Not Provided Serial Number: Not Specified Asset Tag: Not Specified Part Number: Not Specified Core Count: 1 Core Enabled: 1 Characteristics: 64-bit capable Execute Protectionpuppetlabs-facter-dfe6df4/spec/fixtures/docker_cgroup000066400000000000000000000003751470204764400233100ustar00rootroot0000000000000013:name=systemd:/docker/ee6e3c05422f1273c9b41a26f2b4ec64bdb4480d63a1ad9741e05cafc1651b90 12:pids:/docker/ee6e3c05422f1273c9b41a26f2b4ec64bdb4480d63a1ad9741e05cafc1651b90 11:hugetlb:/docker/ee6e3c05422f1273c9b41a26f2b4ec64bdb4480d63a1ad9741e05cafc1651b90puppetlabs-facter-dfe6df4/spec/fixtures/ecdsa000066400000000000000000000002411470204764400215310ustar00rootroot00000000000000ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNG0AgjrPXt5/osLsmECV/qISOwaRmDW1yNSHZiAJvZ6p6ZUilg5vqtSskaUsT5XN8J2amVktN6wOHDwtWiEbpM= puppetlabs-facter-dfe6df4/spec/fixtures/ecdsa384000066400000000000000000000003151470204764400217720ustar00rootroot00000000000000ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBI+YmNHUdvMtZSEdCDJLruZjtUGsi59cf/TNkmRKFcVGgaWO54NUXT/PlTwjm7g9uS1FKbZY4+MKP0Q4KsgfGJAwn9MLsdSeUGY2UIrhQ0UM6KUUZCDot0G7Xm2pAdy/Qw== puppetlabs-facter-dfe6df4/spec/fixtures/ecdsa384_key000066400000000000000000000002711470204764400226430ustar00rootroot00000000000000AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBI+YmNHUdvMtZSEdCDJLruZjtUGsi59cf/TNkmRKFcVGgaWO54NUXT/PlTwjm7g9uS1FKbZY4+MKP0Q4KsgfGJAwn9MLsdSeUGY2UIrhQ0UM6KUUZCDot0G7Xm2pAdy/Qw== puppetlabs-facter-dfe6df4/spec/fixtures/ecdsa521000066400000000000000000000003751470204764400217710ustar00rootroot00000000000000ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAHKr7fO2HGs84ihV9+Z4Dkk4rX+FqhtKV4vGEIwnwR3r0GUIER1aIk+shXzOhCEPNqTiik5CRdE9sDhXkYDJa35+QFIBvo1i2qCNEQ1EowBbYZYBAhk3CPAhIUIYe+Achz+PCqBhqkPC+vHhqHpECAzOI0qjFuoT17rbEb4stl3n8yHfQ== puppetlabs-facter-dfe6df4/spec/fixtures/ecdsa521_key000066400000000000000000000003511470204764400226330ustar00rootroot00000000000000AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAHKr7fO2HGs84ihV9+Z4Dkk4rX+FqhtKV4vGEIwnwR3r0GUIER1aIk+shXzOhCEPNqTiik5CRdE9sDhXkYDJa35+QFIBvo1i2qCNEQ1EowBbYZYBAhk3CPAhIUIYe+Achz+PCqBhqkPC+vHhqHpECAzOI0qjFuoT17rbEb4stl3n8yHfQ== puppetlabs-facter-dfe6df4/spec/fixtures/ecdsa_key000066400000000000000000000002151470204764400224020ustar00rootroot00000000000000AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNG0AgjrPXt5/osLsmECV/qISOwaRmDW1yNSHZiAJvZ6p6ZUilg5vqtSskaUsT5XN8J2amVktN6wOHDwtWiEbpM= puppetlabs-facter-dfe6df4/spec/fixtures/ed25519000066400000000000000000000001211470204764400214450ustar00rootroot00000000000000ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC0rUF3Qt67/maEmCEn3VEp86x/xvmP09b79/7yi8liN puppetlabs-facter-dfe6df4/spec/fixtures/ed25519_key000066400000000000000000000001051470204764400223170ustar00rootroot00000000000000AAAAC3NzaC1lZDI1NTE5AAAAIC0rUF3Qt67/maEmCEn3VEp86x/xvmP09b79/7yi8liN puppetlabs-facter-dfe6df4/spec/fixtures/external_fact_yaml000066400000000000000000000000731470204764400243160ustar00rootroot00000000000000--- testsfact: time: 2020-04-28 01:44:08.148119000 +01:01puppetlabs-facter-dfe6df4/spec/fixtures/external_fact_yaml_anchor000066400000000000000000000000771470204764400256540ustar00rootroot00000000000000--- one: test: a: &a1 - foo two: TEST: A: *a1puppetlabs-facter-dfe6df4/spec/fixtures/external_fact_yaml_date000066400000000000000000000000411470204764400253060ustar00rootroot00000000000000--- testsfact: date: 2020-04-28puppetlabs-facter-dfe6df4/spec/fixtures/external_fact_yaml_no_zone000066400000000000000000000000641470204764400260450ustar00rootroot00000000000000--- testsfact: time: 2020-04-28 01:44:08.148119000puppetlabs-facter-dfe6df4/spec/fixtures/filesystems000066400000000000000000000005601470204764400230250ustar00rootroot00000000000000nodev sysfs nodev rootfs nodev ramfs nodev bdev nodev proc nodev cpuset nodev cgroup nodev cgroup2 nodev tmpfs nodev devtmpfs nodev configfs nodev debugfs nodev tracefs nodev securityfs nodev sockfs nodev dax nodev bpf nodev pipefs nodev hugetlbfs nodev devpts ext3 ext2 fuseblk ext4 nodev autofs nodev mqueue nodev pstore xfs nodev rpc_pipefspuppetlabs-facter-dfe6df4/spec/fixtures/freebsd_swapinfo000066400000000000000000000002331470204764400237730ustar00rootroot00000000000000Device 1K-blocks Used Avail Capacity /dev/ada0p2.eli 2097152 0 2097152 0% /dev/ada1p2.eli 2097152 0 2097152 0% puppetlabs-facter-dfe6df4/spec/fixtures/gce000066400000000000000000000114651470204764400212220ustar00rootroot00000000000000{ "instance": { "attributes":{ "ssh-keys":"john_doe:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA9D8Op48TtEiDmb+Gtna3Bs9B google-ssh {\"userName\":\"john.doe@puppet.com\",\"expireOn\":\"2020-08-13T12:17:19+0000\"}\njane_doe:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA9D8Op48TtEiDmb+Gtna3Bs9B google-ssh {\"userName\":\"jane.doe@puppet.com\",\"expireOn\":\"2020-08-13T12:17:19+0000\"}\n", "sshKeys":"jill_doe:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA9D8Op48TtEiDmb+Gtna3Bs9B google-ssh {\"userName\":\"jill.doe@puppet.com\",\"expireOn\":\"2020-08-13T12:17:19+0000\"}\njacob_doe:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA9D8Op48TtEiDmb+Gtna3Bs9B google-ssh {\"userName\":\"jacob.doe@puppet.com\",\"expireOn\":\"2020-08-13T12:17:19+0000\"}" }, "cpuPlatform":"Intel Broadwell", "description":"", "disks":[{"deviceName":"instance-3","index":0,"interface":"SCSI","mode":"READ_WRITE","type":"PERSISTENT"}], "guestAttributes":{}, "hostname":"instance-3.c.facter-performance-history.internal", "id":2206944706428651580, "image":"projects/ubuntu-os-cloud/global/images/ubuntu-2004-focal-v20200810", "legacyEndpointAccess":{"0.1":0,"v1beta1":0}, "licenses":[{"id":"2211838267635035815"}], "machineType":"projects/728618928092/machineTypes/n1-standard-2", "maintenanceEvent":"NONE", "name":"instance-3", "networkInterfaces":[ { "accessConfigs":[{"externalIp":"34.89.230.102","type":"ONE_TO_ONE_NAT"}], "dnsServers":["169.254.169.254"], "forwardedIps":[], "gateway":"10.156.0.1", "ip":"10.156.0.4", "ipAliases":[], "mac":"42:01:0a:9c:00:04", "mtu":1460, "network":"projects/728618928092/networks/default", "subnetmask":"255.255.240.0", "targetInstanceIps":[]}], "preempted":"FALSE", "remainingCpuTime":-1, "scheduling":{"automaticRestart":"TRUE","onHostMaintenance":"MIGRATE","preemptible":"FALSE"}, "serviceAccounts": { "728618928092-compute@developer.gserviceaccount.com": { "aliases":["default"], "email":"728618928092-compute@developer.gserviceaccount.com", "scopes":["https://www.googleapis.com/auth/devstorage.read_only", "https://www.googleapis.com/auth/logging.write", "https://www.googleapis.com/auth/monitoring.write", "https://www.googleapis.com/auth/servicecontrol", "https://www.googleapis.com/auth/service.management.readonly", "https://www.googleapis.com/auth/trace.append"] }, "default": { "aliases":["default"], "email":"728618928092-compute@developer.gserviceaccount.com", "scopes":["https://www.googleapis.com/auth/devstorage.read_only", "https://www.googleapis.com/auth/logging.write", "https://www.googleapis.com/auth/monitoring.write", "https://www.googleapis.com/auth/servicecontrol", "https://www.googleapis.com/auth/service.management.readonly", "https://www.googleapis.com/auth/trace.append"]} }, "tags":[], "virtualClock":{"driftToken":"0"}, "zone":"projects/728618928092/zones/europe-west3-c" }, "oslogin":{"authenticate":{"sessions":{}}}, "project": { "attributes": { "ssh-keys":"john_doe:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA9D8Op48TtEiDmb+Gtna3Bs9B google-ssh {\"userName\":\"john.doe@puppet.com\",\"expireOn\":\"2020-08-13T12:17:19+0000\"}\njane_doe:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA9D8Op48TtEiDmb+Gtna3Bs9B google-ssh {\"userName\":\"jane.doe@puppet.com\",\"expireOn\":\"2020-08-13T12:17:19+0000\"}\n", "sshKeys":"jill_doe:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA9D8Op48TtEiDmb+Gtna3Bs9B google-ssh {\"userName\":\"jill.doe@puppet.com\",\"expireOn\":\"2020-08-13T12:17:19+0000\"}\njacob_doe:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDA9D8Op48TtEiDmb+Gtna3Bs9B google-ssh {\"userName\":\"jacob.doe@puppet.com\",\"expireOn\":\"2020-08-13T12:17:19+0000\"}" }, "numericProjectId":728618928092, "projectId":"facter-performance-history" } }puppetlabs-facter-dfe6df4/spec/fixtures/ifconfig_mac000066400000000000000000000073151470204764400230670ustar00rootroot00000000000000lo0: flags=8049 mtu 16384 options=1203 inet 127.0.0.1 netmask 0xff000000 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 nd6 options=201 gif0: flags=8010 mtu 1280 stf0: flags=0<> mtu 1280 en0: flags=8863 mtu 1500 options=400 ether 64:5a:ed:ea:5c:81 inet 192.168.143.212 netmask 0xffffff00 broadcast 192.168.143.255 media: autoselect status: active en0.1: flags=8843 metric 0 mtu 1500 options=3 ether 08:00:27:f5:23:f7 inet 0.0.0.0 netmask 0xff000000 broadcast 255.255.255.255 groups: vlan vlan: 1 vlanpcp: 0 parent interface: em0 media: autoselect status: active nd6 options=29 en1: flags=8963 mtu 1500 options=460 ether 82:17:0e:93:9d:00 media: autoselect status: inactive en2: flags=8963 mtu 1500 options=460 ether 82:17:0e:93:9d:01 media: autoselect status: inactive bridge0: flags=8863 mtu 1500 options=63 ether 82:17:0e:93:9d:00 Configuration: id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0 maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200 root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0 ipfilter disabled flags 0x0 member: en1 flags=3 ifmaxaddr 0 port 5 priority 0 path cost 0 member: en2 flags=3 ifmaxaddr 0 port 6 priority 0 path cost 0 media: status: inactive p2p0: flags=8843 mtu 2304 options=400 ether 06:5a:ed:ea:5c:81 media: autoselect status: inactive awdl0: flags=8943 mtu 1484 options=400 ether 2e:ba:e4:83:4b:b7 inet6 fe80::2cba:e4ff:fe83:4bb7%awdl0 prefixlen 64 scopeid 0x9 nd6 options=201 media: autoselect status: active llw0: flags=8863 mtu 1500 options=400 ether 2e:ba:e4:83:4b:b7 inet6 fe80::2cba:e4ff:fe83:4bb7%llw0 prefixlen 64 scopeid 0xa nd6 options=201 media: aumm,l.j hn toselect status: active utun0: flags=8051 mtu 1380 inet6 fe80::ba29:a797:6aa:9eb%utun0 prefixlen 64 scopeid 0xb nd6 options=201 utun1: flags=8051 mtu 2000 inet6 fe80::64c6:1885:bec0:c316%utun1 prefixlen 64 scopeid 0xc nd6 options=201 utun2: flags=8051 mtu 1500 inet 10.16.132.213 --> 10.16.132.213 netmask 0xfffffe00 utun3: flags=8051 mtu 1500 inet6 2001:db8:cafe::132:213 --> 2001:db8:cafe::132:213 prefixlen 128 ib0: flags=4099 mtu 4092 infiniband 80:00:02:08:FA:81:00:00:00:00:00:00:00:00:00:00:00:00:00:00 txqueuelen 256 (InfiniBand) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ib1: flags=4099 mtu 4092 infiniband 80:00:02:09:FA:81:00:00:00:00:00:00:00:00:00:00:00:00:00:00 txqueuelen 256 (InfiniBand) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 puppetlabs-facter-dfe6df4/spec/fixtures/invalid_option_pairs.conf000066400000000000000000000001001470204764400256040ustar00rootroot00000000000000global : { external-dir : "" no-external-facts : true, }puppetlabs-facter-dfe6df4/spec/fixtures/ip_-6_route_show000066400000000000000000000000701470204764400236420ustar00rootroot00000000000000fe80::/64 dev ens160 proto kernel metric 256 pref mediumpuppetlabs-facter-dfe6df4/spec/fixtures/ip_link_show000066400000000000000000000005061470204764400231430ustar00rootroot000000000000001: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: ens160: mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether 00:50:56:9a:cb:a4 brd ff:ff:ff:ff:ff:ffpuppetlabs-facter-dfe6df4/spec/fixtures/ip_link_show_all000066400000000000000000000021641470204764400237750ustar00rootroot000000000000001: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000\ link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: ens160: mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000\ link/ether 00:50:56:9a:51:af brd ff:ff:ff:ff:ff:ff 3: ib0: mtu 4092 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 256\ link/infiniband 80:00:02:08:fa:81:00:00:00:00:00:00:00:23:7d:ff:ff:94:73:fd brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff 4: eth2: mtu 1500 qdisc fq_codel master bond0 state UP mode DEFAULT group default qlen 1000\ link/ether 08:00:27:29:dc:a5 brd ff:ff:ff:ff:ff:ff 5: eth3: mtu 1500 qdisc fq_codel master bond0 state UP mode DEFAULT group default qlen 1000\ link/ether 08:00:27:29:dc:a5 brd ff:ff:ff:ff:ff:ff 6: bond0: mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000\ link/ether 08:00:27:29:dc:a5 brd ff:ff:ff:ff:ff:ff puppetlabs-facter-dfe6df4/spec/fixtures/ip_route_show000066400000000000000000000003321470204764400233410ustar00rootroot00000000000000default via 10.16.112.1 dev ens192 proto dhcp src 10.16.125.217 metric 100 10.16.112.0/20 dev ens192 proto kernel scope link src 10.16.125.217 10.16.112.1 dev ens192 proto dhcp scope link src 10.16.125.217 metric 100puppetlabs-facter-dfe6df4/spec/fixtures/ip_route_show_default000066400000000000000000000001451470204764400250470ustar00rootroot0000000000000010.16.112.0/20 dev ens160 proto kernel scope link src 10.16.124.1 default via 10.16.112.1 dev ens160 puppetlabs-facter-dfe6df4/spec/fixtures/kern.geom.confxml000066400000000000000000000221021470204764400240040ustar00rootroot00000000000000 FD RAID DEV ada0p2.eli 4 r0w0e0 ada0p3.eli 4 r0w0e0 gpt/gptboot0 4 r0w0e0 ada0p3 3 r0w0e0 ada0p2 3 r0w0e0 ada0p1 3 r0w0e0 ada0 2 r0w0e0 ELI ada0p2.eli 3 1 1 ONETIME, W-DETACH, W-OPEN 7 hardware 128 AES-XTS ACTIVE r1w1e1 r1w1e0 ada0p2.eli 2147483648 4096 0 0 ada0p3.eli 3 119 119 BOOT, GELIBOOT 0 7 hardware 256 AES-XTS ACTIVE r1w1e1 r1w1e1 ada0p3.eli 509961302016 4096 0 0 MD ZFS::VDEV zfs::vdev 4 r1w1e1 ZFS::ZVOL SWAP swap 4 r1w1e0 PART ada0 2 GPT 128 40 1000215175 63 16 OK false r2w2e4 r1w1e1 ada0p3 509961306112 512 4096 0 4196352 1000214527 3 freebsd-zfs 2148532224 509961306112 516e7cba-6ecf-11d6-8ff8-00022d09712b 504f1547-c135-11e8-bd11-7d7cd061b26f HD(3,GPT,504f1547-c135-11e8-bd11-7d7cd061b26f,0x400800,0x3b5e0800) r1w1e1 ada0p2 2147483648 512 4096 0 2048 4196351 2 freebsd-swap 1048576 2147483648 516e7cb5-6ecf-11d6-8ff8-00022d09712b 5048d40d-c135-11e8-bd11-7d7cd061b26f HD(2,GPT,5048d40d-c135-11e8-bd11-7d7cd061b26f,0x800,0x400000) r0w0e0 ada0p1 524288 512 4096 0 40 1063 1 freebsd-boot 20480 524288 83bd6b9d-7f41-11dc-be0b-001560b84f0f 503d3458-c135-11e8-bd11-7d7cd061b26f HD(1,GPT,503d3458-c135-11e8-bd11-7d7cd061b26f,0x28,0x400) LABEL ada0p1 3 r0w0e0 r0w0e0 gpt/gptboot0 524288 512 4096 0 0 524288 1024 0 0 VFS Flashmap DISK ada0 1 r2w2e4 ada0 512110190592 512 4096 0 16 63 0 S250NXAG959927J 50025388400c2138 Samsung SSD 850 PRO 512GB puppetlabs-facter-dfe6df4/spec/fixtures/kstat_cpu000066400000000000000000000073051470204764400224570ustar00rootroot00000000000000module: cpu_info instance: 0 name: cpu_info0 class: misc brand Intel(r) Xeon(r) Gold 6138 CPU @ 2.00GHz cache_id 0 chip_id 0 clock_MHz 1995 clog_id 0 core_id 0 cpu_type i386 crtime 37.957590729 cstates_count 1014040:1014042 cstates_nsec 7731043379931:134295045809 current_clock_Hz 1995246617 current_cstate 1 current_pstate 0 family 6 fpu_type i387 compatible implementation x86 (chipid 0x0 GenuineIntel 50654 family 6 model 85 step 4 clock 2000 MHz) lgroup_id 0 max_ncpu_per_chip 1 max_ncpu_per_core 1 max_pwrcap 0 model 85 ncore_per_chip 1 ncpu_per_chip 1 pg_id 18446744073709551615 pkg_core_id 0 pstates_count null pstates_nsec null snaptime 7827.384789463 socket_type Unknown state on-line state_begin 1586929325 stepping 4 supported_frequencies_Hz 1995246617 supported_max_cstates 1 supported_max_pstates 0 vendor_id GenuineIntel module: cpu_info instance: 1 name: cpu_info1 class: misc brand Intel(r) Xeon(r) Gold 6138 CPU @ 2.00GHz cache_id 2 chip_id 2 clock_MHz 1995 clog_id 0 core_id 2 cpu_type i386 crtime 38.360143483 cstates_count 652423:652424 cstates_nsec 7734973017129:130932431358 current_clock_Hz 1995246617 current_cstate 0 current_pstate 0 family 6 fpu_type i387 compatible implementation x86 (chipid 0x2 GenuineIntel 50654 family 6 model 85 step 4 clock 2000 MHz) lgroup_id 0 max_ncpu_per_chip 1 max_ncpu_per_core 1 max_pwrcap 0 model 85 ncore_per_chip 1 ncpu_per_chip 1 pg_id 18446744073709551615 pkg_core_id 0 pstates_count null pstates_nsec null snaptime 7827.385273786 socket_type Unknown state on-line state_begin 1586929326 stepping 4 supported_frequencies_Hz 1995246617 supported_max_cstates 1 supported_max_pstates 0 vendor_id GenuineIntel puppetlabs-facter-dfe6df4/spec/fixtures/kstat_sderr000066400000000000000000000033061470204764400230040ustar00rootroot00000000000000module: sderr instance: 0 name: sd0,err class: device_error Device Not Ready 0 Hard Errors 0 Illegal Request 1 Media Error 0 No Device 0 Non-Aligned Writes 0 Predictive Failure Analysis 0 Product VMware IDE CDR00Revision Recoverable 0 Revision 1.00 Serial No Size 0 Soft Errors 0 Transport Errors 0 Vendor NECVMWar crtime 36.863598884 snaptime 10853.889452697 module: sderr instance: 1 name: sd1,err class: device_error Device Not Ready 0 Hard Errors 0 Illegal Request 8 Media Error 0 No Device 0 Non-Aligned Writes 0 Predictive Failure Analysis 0 Product Virtual disk Revision Recoverable 0 Revision 1.0 Serial No Size 21474836480 Soft Errors 0 Transport Errors 0 Vendor VMware crtime 36.668316603 snaptime 10853.889846855 puppetlabs-facter-dfe6df4/spec/fixtures/kstat_sys_pages000066400000000000000000000021541470204764400236620ustar00rootroot00000000000000module: unix instance: 0 name: system_pages class: pages availrmem 672943 crtime 0 desfree 12254 desscan 25 econtig 4230422528 fastscan 784319 freemem 641451 kernelbase 0 lotsfree 24509 minfree 6127 nalloc 42231683 nalloc_calls 21934 nfree 40207768 nfree_calls 14661 nscan 0 pagesfree 641451 pageslocked 895695 pagestotal 1568638 physmem 1568638 pp_kernel 914701 slowscan 100 snaptime 28502.92289964 puppetlabs-facter-dfe6df4/spec/fixtures/loadavg000066400000000000000000000000321470204764400220650ustar00rootroot000000000000000.00 0.03 0.03 1/165 21302puppetlabs-facter-dfe6df4/spec/fixtures/lparstat_i000066400000000000000000000002241470204764400226150ustar00rootroot00000000000000Partition Name : aix61-6 Partition Number : 15 Sub Processor Mode : - puppetlabs-facter-dfe6df4/spec/fixtures/lparstat_w000066400000000000000000000001401470204764400226300ustar00rootroot00000000000000WPAR Key : 13 WPAR Configured ID : 14 puppetlabs-facter-dfe6df4/spec/fixtures/lsblk_output_new000066400000000000000000000006141470204764400240560ustar00rootroot00000000000000NAME="/dev/sda" FSTYPE="" UUID="" LABEL="" PARTUUID="" PARTLABEL="" PARTTYPE="" NAME="/dev/sda1" FSTYPE="ext3" UUID="88077904-4fd4-476f-9af2-0f7a806ca25e" LABEL="/boot" PARTUUID="00061fe0-01" PARTLABEL="" PARTTYPE="21686148-6449-6E6F-744E-656564454649" NAME="/dev/sda2" FSTYPE="LVM2_member" UUID="edi7s0-2WVa-ZBan" LABEL="" PARTUUID="" PARTLABEL="" PARTTYPE="0fc63daf-8483-4772-8e79-3d69d8477de4"puppetlabs-facter-dfe6df4/spec/fixtures/lsblk_output_old000066400000000000000000000004541470204764400240450ustar00rootroot00000000000000NAME="/dev/sda" FSTYPE="" UUID="" LABEL="" PARTUUID="" PARTLABEL="" PARTTYPE="" NAME="/dev/sda1" FSTYPE="ext3" UUID="88077904-4fd4-476f-9af2-0f7a806ca25e" LABEL="/boot" PARTUUID="00061fe0-01" PARTLABEL="" NAME="/dev/sda2" FSTYPE="LVM2_member" UUID="edi7s0-2WVa-ZBan" LABEL="" PARTUUID="" PARTLABEL=""puppetlabs-facter-dfe6df4/spec/fixtures/lslv_output000066400000000000000000000014541470204764400230610ustar00rootroot00000000000000LOGICAL VOLUME: hd5 VOLUME GROUP: rootvg LV IDENTIFIER: 00fa684e00004c00000001715c6c0708.1 PERMISSION: read/write VG STATE: active/complete LV STATE: closed/syncd TYPE: boot WRITE VERIFY: off MAX LPs: 512 PP SIZE: 32 megabyte(s) COPIES: 1 SCHED POLICY: parallel LPs: 1 PPs: 1 STALE PPs: 0 BB POLICY: non-relocatable INTER-POLICY: minimum RELOCATABLE: no INTRA-POLICY: edge UPPER BOUND: 32 MOUNT POINT: N/A LABEL: primary_bootlv MIRROR WRITE CONSISTENCY: on/ACTIVE EACH LP COPY ON A SEPARATE PV ?: yespuppetlabs-facter-dfe6df4/spec/fixtures/lspci_aws000066400000000000000000000003051470204764400224370ustar00rootroot0000000000000000:00.0 Host bridge: Intel Corporation FX PMC [Natoma] (rev 02) 00:02.0 VGA compatible controller: Cirrus Logic GD 5446 00:03.0 Unassigned class [ff80]: XenSource, Inc. Xen Platform Device (rev 01)puppetlabs-facter-dfe6df4/spec/fixtures/lspci_vmware000066400000000000000000000006251470204764400231530ustar00rootroot0000000000000000:10.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01) 00:11.0 PCI bridge: VMware PCI bridge (rev 02) 00:18.5 PCI bridge: VMware PCI Express Root Port (rev 01) 00:18.6 PCI bridge: VMware PCI Express Root Port (rev 01) 00:18.7 PCI bridge: VMware PCI Express Root Port (rev 01) 03:00.0 Ethernet controller: VMware VMXNET3 Ethernet Controller (rev 01)puppetlabs-facter-dfe6df4/spec/fixtures/lspv_disk_output000066400000000000000000000011711470204764400240730ustar00rootroot00000000000000PHYSICAL VOLUME: hdisk0 VOLUME GROUP: rootvg PV IDENTIFIER: 00f9280c31fc0ae6 VG IDENTIFIER 00f9280c00004c00000001737084c416 PV STATE: active STALE PARTITIONS: 0 ALLOCATABLE: yes PP SIZE: 32 megabyte(s) LOGICAL VOLUMES: 12 TOTAL PPs: 959 (30688 megabytes) VG DESCRIPTORS: 2 FREE PPs: 1 (32 megabytes) HOT SPARE: no USED PPs: 958 (30656 megabytes) MAX REQUEST: 256 kilobytes FREE DISTRIBUTION: 00..00..00..00..01 USED DISTRIBUTION: 192..192..191..192..191 MIRROR POOL: Nonepuppetlabs-facter-dfe6df4/spec/fixtures/lspv_output000066400000000000000000000001041470204764400230540ustar00rootroot00000000000000hdisk0 testid0998 rootvg activepuppetlabs-facter-dfe6df4/spec/fixtures/lxc_cgroup000066400000000000000000000001141470204764400226160ustar00rootroot0000000000000012:pids:/init.scope 11:cpu,cpuacct:/init.scope 10:rdma:/ /lxc/lxc_container/puppetlabs-facter-dfe6df4/spec/fixtures/macosx_filesystems000066400000000000000000000005721470204764400244020ustar00rootroot00000000000000/dev/disk1s5 on / (apfs, local, read-only, journaled) devfs on /dev (devfs, local, nobrowse) /dev/disk1s1 on /System/Volumes/Data (apfs, local, journaled, nobrowse) /dev/disk1s4 on /private/var/vm (apfs, local, journaled, nobrowse) map auto_home on /System/Volumes/Data/home (autofs, automounted, nobrowse) .host:/VMware Shared Folders on /Volumes/VMware Shared Folders (vmhgfs)puppetlabs-facter-dfe6df4/spec/fixtures/meminfo000066400000000000000000000026131470204764400221110ustar00rootroot00000000000000MemTotal: 4036680 kB MemFree: 3547792 kB MemAvailable: 3659324 kB Buffers: 4288 kB Cached: 298624 kB SwapCached: 0 kB Active: 81968 kB Inactive: 255516 kB Active(anon): 35056 kB Inactive(anon): 264 kB Active(file): 46912 kB Inactive(file): 255252 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 2097148 kB SwapFree: 2097148 kB Dirty: 216 kB Writeback: 0 kB AnonPages: 34656 kB Mapped: 84464 kB Shmem: 680 kB KReclaimable: 29072 kB Slab: 80056 kB SReclaimable: 29072 kB SUnreclaim: 50984 kB KernelStack: 2688 kB PageTables: 1704 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 4115488 kB Committed_AS: 274552 kB VmallocTotal: 34359738367 kB VmallocUsed: 0 kB VmallocChunk: 0 kB Percpu: 1728 kB HardwareCorrupted: 0 kB AnonHugePages: 0 kB ShmemHugePages: 0 kB ShmemPmdMapped: 0 kB CmaTotal: 0 kB CmaFree: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 0 kB DirectMap4k: 100224 kB DirectMap2M: 4093952 kB DirectMap1G: 2097152 kB puppetlabs-facter-dfe6df4/spec/fixtures/meminfo2000066400000000000000000000023421470204764400221720ustar00rootroot00000000000000MemTotal: 4037608 kB MemFree: 3384496 kB MemAvailable: 3665024 kB Buffers: 2088 kB Cached: 445204 kB SwapCached: 0 kB Active: 206832 kB Inactive: 273488 kB Active(anon): 33224 kB Inactive(anon): 284 kB Active(file): 173608 kB Inactive(file): 273204 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 48 kB Writeback: 0 kB AnonPages: 33124 kB Mapped: 42864 kB Shmem: 480 kB Slab: 111772 kB SReclaimable: 71384 kB SUnreclaim: 40388 kB KernelStack: 2112 kB PageTables: 5772 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 2018804 kB Committed_AS: 214484 kB VmallocTotal: 34359738367 kB VmallocUsed: 0 kB VmallocChunk: 0 kB HardwareCorrupted: 0 kB AnonHugePages: 0 kB ShmemHugePages: 0 kB ShmemPmdMapped: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 96256 kB DirectMap2M: 4098048 kBpuppetlabs-facter-dfe6df4/spec/fixtures/meminfo_missing_available000066400000000000000000000025571470204764400256510ustar00rootroot00000000000000MemTotal: 4036680 kB MemFree: 3547792 kB Buffers: 4288 kB Cached: 298624 kB SwapCached: 0 kB Active: 81968 kB Inactive: 255516 kB Active(anon): 35056 kB Inactive(anon): 264 kB Active(file): 46912 kB Inactive(file): 255252 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 2097148 kB SwapFree: 2097148 kB Dirty: 216 kB Writeback: 0 kB AnonPages: 34656 kB Mapped: 84464 kB Shmem: 680 kB KReclaimable: 29072 kB Slab: 80056 kB SReclaimable: 29072 kB SUnreclaim: 50984 kB KernelStack: 2688 kB PageTables: 1704 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 4115488 kB Committed_AS: 274552 kB VmallocTotal: 34359738367 kB VmallocUsed: 0 kB VmallocChunk: 0 kB Percpu: 1728 kB HardwareCorrupted: 0 kB AnonHugePages: 0 kB ShmemHugePages: 0 kB ShmemPmdMapped: 0 kB CmaTotal: 0 kB CmaFree: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 0 kB DirectMap4k: 100224 kB DirectMap2M: 4093952 kB DirectMap1G: 2097152 kB puppetlabs-facter-dfe6df4/spec/fixtures/mount000066400000000000000000000011341470204764400216160ustar00rootroot00000000000000 node mounted mounted over vfs date options -------- --------------- --------------- ------ ------------ --------------- /dev/hd4 / jfs2 Mar 22 08:05 rw,log=/dev/hd8 /dev/hd2 /usr jfs2 Mar 22 08:05 rw,log=/dev/hd8 /proc /proc procfs Mar 22 08:05 rw /dev/hd10opt /opt jfs2 Mar 22 08:05 rw,log=/dev/hd8 /dev/hd3 /var x Mar 22 08:05 rw,nodev,log=/dev/hd3 joe /var/share /tmp/salam nfs3 Nov 12 04:40 puppetlabs-facter-dfe6df4/spec/fixtures/netstat_in000066400000000000000000000007141470204764400226270ustar00rootroot00000000000000Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll en0 1500 link#2 a.c6.24.39.41.3 162325 0 60252 0 0 en0 1500 10.32.77 10.32.77.30 162325 0 60252 0 0 lo0 16896 link#1 36891 0 36891 0 0 lo0 16896 127 127.0.0.1 36891 0 36891 0 0 lo0 16896 ::1%1 36891 0 36891 0 0puppetlabs-facter-dfe6df4/spec/fixtures/netstat_rn000066400000000000000000000013321470204764400226350ustar00rootroot00000000000000Routing tables Destination Gateway Flags Refs Use If Exp Groups Route Tree for Protocol Family 2 (Internet): default 10.32.77.1 UG 1 12696 en0 - - 10.32.77.0 10.32.77.40 UHSb 0 0 en0 - - => 10.32.77/24 10.32.77.40 U 0 639 en0 - - 10.32.77.40 127.0.0.1 UGHS 0 16 lo0 - - 10.32.77.255 10.32.77.40 UHSb 0 1 en0 - - 127/8 127.0.0.1 U 1 7504 lo0 - - Route Tree for Protocol Family 24 (Internet v6): ::1%1 ::1%1 UH 2 798 lo0 - -puppetlabs-facter-dfe6df4/spec/fixtures/netstat_rn_two000066400000000000000000000007141470204764400235310ustar00rootroot00000000000000Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll en0 1500 link#2 e2.69.92.64.40.2 54611 0 11532 0 0 en0 1500 10.16.78 10.16.78.58 54611 0 11532 0 0 lo0* 16896 link#1 2237 0 2237 0 0 lo0* 16896 127 127.0.0.1 2237 0 2237 0 0 lo0* 16896 ::1%1 2237 0 2237 0 0puppetlabs-facter-dfe6df4/spec/fixtures/niminfo_nim_configuration000066400000000000000000000003101470204764400257000ustar00rootroot00000000000000export NIM_NAME=aix7 export NIM_MASTER_HOSTNAME=test export NIM_MASTER_PORT=1000 export NIM_REGISTRATION_PORT=1000 export NIM_SHELL="nimsh" export NIM_MASTERID=00000000 export NIM_CONFIGURATION=masterpuppetlabs-facter-dfe6df4/spec/fixtures/niminfo_w_wrong_nim_configuration000066400000000000000000000003121470204764400274440ustar00rootroot00000000000000export NIM_NAME=aix7 export NIM_MASTER_HOSTNAME=test export NIM_MASTER_PORT=1000 export NIM_REGISTRATION_PORT=1000 export NIM_SHELL="nimsh" export NIM_MASTERID=00000000 export NIM_CONFIGURATION=testtestpuppetlabs-facter-dfe6df4/spec/fixtures/niminfo_wo_nim_configuration000066400000000000000000000002501470204764400264100ustar00rootroot00000000000000export NIM_NAME=aix7 export NIM_MASTER_HOSTNAME=test export NIM_MASTER_PORT=1000 export NIM_REGISTRATION_PORT=1000 export NIM_SHELL="nimsh" export NIM_MASTERID=00000000puppetlabs-facter-dfe6df4/spec/fixtures/openbsd_df000066400000000000000000000003751470204764400225650ustar00rootroot00000000000000Filesystem 512-blocks Used Available Capacity Mounted on /dev/sd0a 2018844 404488 1513416 21% / /dev/sd0d 2018844 1595216 322688 83% /usr /dev/sd0e 6082908 3477752 2301012 60% /usr/local puppetlabs-facter-dfe6df4/spec/fixtures/openbsd_filesystems000066400000000000000000000002051470204764400245330ustar00rootroot00000000000000/dev/sd0a on / type ffs (local) /dev/sd0d on /usr type ffs (local, nodev) /dev/sd0e on /usr/local type ffs (local, nodev, wxallowed) puppetlabs-facter-dfe6df4/spec/fixtures/os_hierarchy000066400000000000000000000006041470204764400231340ustar00rootroot00000000000000[ { "Linux": [ { "Debian": [ "Elementary", "Ubuntu", "Raspbian" ] }, { "El": [ "Fedora", "Amzn", "Centos" ] }, { "Sles": [ "Opensuse" ] } ] }, { "Solaris": [ "Bsd" ] }, "Macosx", "Windows", "Aix" ] puppetlabs-facter-dfe6df4/spec/fixtures/os_release000066400000000000000000000006021470204764400225740ustar00rootroot00000000000000NAME="Ubuntu Linux" VERSION="18.04.1 LTS (Bionic Beaver)" ID= ID_LIKE=debian PRETTY_NAME="Ubuntu 18.04.1 LTS" VERSION_ID="18.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=bionic UBUNTU_CODENAME=bionic puppetlabs-facter-dfe6df4/spec/fixtures/os_release_archlinux000066400000000000000000000004301470204764400246500ustar00rootroot00000000000000NAME="Arch Linux" PRETTY_NAME="Arch Linux" ID=arch BUILD_ID=rolling ANSI_COLOR="38;2;23;147;209" HOME_URL="https://archlinux.org/" DOCUMENTATION_URL="https://wiki.archlinux.org/" SUPPORT_URL="https://bbs.archlinux.org/" BUG_REPORT_URL="https://bugs.archlinux.org/" LOGO=archlinux puppetlabs-facter-dfe6df4/spec/fixtures/os_release_debian000066400000000000000000000004041470204764400240760ustar00rootroot00000000000000PRETTY_NAME="Debian GNU/Linux 10 (buster)" NAME="Debian GNU/Linux" VERSION_ID="10" VERSION="10 (buster)" VERSION_CODENAME=buster ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/"puppetlabs-facter-dfe6df4/spec/fixtures/os_release_devuan000066400000000000000000000000101470204764400241270ustar00rootroot00000000000000beowulf puppetlabs-facter-dfe6df4/spec/fixtures/os_release_manjarolinux000066400000000000000000000004451470204764400253700ustar00rootroot00000000000000NAME="Manjaro Linux" ID=manjaro ID_LIKE=arch BUILD_ID=rolling PRETTY_NAME="Manjaro Linux" ANSI_COLOR="32;1;24;144;200" HOME_URL="https://manjaro.org/" DOCUMENTATION_URL="https://wiki.manjaro.org/" SUPPORT_URL="https://manjaro.org/" BUG_REPORT_URL="https://bugs.manjaro.org/" LOGO=manjarolinux puppetlabs-facter-dfe6df4/spec/fixtures/os_release_mint000066400000000000000000000000441470204764400236230ustar00rootroot00000000000000DISTR_NAME="Linuxmint" RELEASE=19.3 puppetlabs-facter-dfe6df4/spec/fixtures/os_release_opensuse-leap000066400000000000000000000004101470204764400254310ustar00rootroot00000000000000NAME="openSUSE Leap" VERSION="15.1" ID="opensuse-leap" ID_LIKE="suse opensuse" VERSION_ID="15.1" PRETTY_NAME="openSUSE Leap 15.1" ANSI_COLOR="0;32" CPE_NAME="cpe:/o:opensuse:leap:15.1" BUG_REPORT_URL="https://bugs.opensuse.org" HOME_URL="https://www.opensuse.org/"puppetlabs-facter-dfe6df4/spec/fixtures/os_release_oracle_linux000066400000000000000000000006151470204764400253440ustar00rootroot00000000000000NAME="Oracle Linux Server" VERSION="7.2" ID="ol" VERSION_ID="7.2" PRETTY_NAME="Oracle Linux Server 7.2" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:oracle:linux:7:2:server" HOME_URL="https://linux.oracle.com/" BUG_REPORT_URL="https://bugzilla.oracle.com/" ORACLE_BUGZILLA_PRODUCT="Oracle Linux 7" ORACLE_BUGZILLA_PRODUCT_VERSION=7.2 ORACLE_SUPPORT_PRODUCT="Oracle Linux" ORACLE_SUPPORT_PRODUCT_VERSION=7.2puppetlabs-facter-dfe6df4/spec/fixtures/os_release_redhat_linux_with_comment000066400000000000000000000012041470204764400301160ustar00rootroot00000000000000# This is a comment NAME="Red Hat Enterprise Linux" VERSION="8.6 (Ootpa)" ID="rhel" ID_LIKE="fedora" VERSION_ID="8.6" PLATFORM_ID="platform:el8" PRETTY_NAME="Red Hat Enterprise Linux 8.6 (Ootpa)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:redhat:enterprise_linux:8::baseos" HOME_URL="https://www.redhat.com/" DOCUMENTATION_URL="https://access.redhat.com/documentation/red_hat_enterprise_linux/8/" BUG_REPORT_URL="https://bugzilla.redhat.com/" # Whoa, this is another comment! REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 8" REDHAT_BUGZILLA_PRODUCT_VERSION=8.6 REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux" REDHAT_SUPPORT_PRODUCT_VERSION="8.6"puppetlabs-facter-dfe6df4/spec/fixtures/os_release_sles000066400000000000000000000002401470204764400236200ustar00rootroot00000000000000NAME="SLES" VERSION="15" VERSION_ID="15" PRETTY_NAME="SUSE Linux Enterprise Server 15" ID="sles" ID_LIKE="suse" ANSI_COLOR="0;32" CPE_NAME="cpe:/o:suse:sles:15"puppetlabs-facter-dfe6df4/spec/fixtures/os_release_sles_sap000066400000000000000000000003001470204764400244600ustar00rootroot00000000000000NAME="SLES_SAP" VERSION="12-SP2" VERSION_ID="12.2" PRETTY_NAME="SUSE Linux Enterprise Server for SAP Applications 12 SP2" ID="sles_sap" ANSI_COLOR="0;32" CPE_NAME="cpe:/o:suse:sles_sap:12:sp2"puppetlabs-facter-dfe6df4/spec/fixtures/os_release_solaris000066400000000000000000000003061470204764400243310ustar00rootroot00000000000000 Oracle Solaris 10 1/13 s10x_u11wos_24a X86 Copyright (c) 1983, 2013, Oracle and/or its affiliates. All rights reserved. Assembled 17 January 2013puppetlabs-facter-dfe6df4/spec/fixtures/os_release_virtuozzolinux000066400000000000000000000004031470204764400260260ustar00rootroot00000000000000NAME="Virtuozzo" VERSION="7.5.1" ID="virtuozzo" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="Virtuozzo release 7.5.1" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:virtuozzoproject:vz:7" HOME_URL="http://www.virtuozzo.com" BUG_REPORT_URL="https://bugs.openvz.org/" puppetlabs-facter-dfe6df4/spec/fixtures/osx_route000066400000000000000000000004671470204764400225130ustar00rootroot00000000000000 route to: default destination: default mask: default gateway: 10.160.24.1 interface: en0 flags: recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire 0 0 0 0 0 0 1500 0puppetlabs-facter-dfe6df4/spec/fixtures/partitions_cudv_query000066400000000000000000000006451470204764400251240ustar00rootroot00000000000000CuDv: name = "hd5" status = 0 chgstatus = 1 ddins = "" location = "" parent = "rootvg" connwhere = "" PdDvLn = "logical_volume/lvsubclass/lvtype" CuDv: name = "hd6" status = 0 chgstatus = 1 ddins = "" location = "" parent = "rootvg" connwhere = "" PdDvLn = "logical_volume/lvsubclass/lvtype" puppetlabs-facter-dfe6df4/spec/fixtures/proc_environ_no_value000066400000000000000000000000341470204764400250450ustar00rootroot00000000000000bubbles=TERM_PROGRAM=tmux puppetlabs-facter-dfe6df4/spec/fixtures/proc_environ_podman000066400000000000000000000001771470204764400245230ustar00rootroot00000000000000TERM=xtermcontainer=podmanPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binHOME=/rootHOSTNAME=6461eb81ea31puppetlabs-facter-dfe6df4/spec/fixtures/proc_net_if_inet6000066400000000000000000000001601470204764400240460ustar00rootroot0000000000000000000000000000000000000000000001 01 80 10 80 lo fe80000000000000025056fffe9a8481 02 40 20 80 ens160 puppetlabs-facter-dfe6df4/spec/fixtures/proc_net_if_inet6_complex000066400000000000000000000011331470204764400255760ustar00rootroot0000000000000000000000000000000000000000000001 01 80 10 80 lo 20010db8000000000000000000000001 02 40 20 01 temporary 20010db8000000000000000000000002 02 40 20 02 noad 20010db8000000000000000000000003 02 40 20 04 optimistic 20010db8000000000000000000000004 02 40 20 08 dadfailed 20010db8000000000000000000000005 02 40 20 10 homeaddress 20010db8000000000000000000000006 02 40 20 20 deprecated 20010db8000000000000000000000007 02 40 20 40 tentative 20010db8000000000000000000000008 02 40 20 80 permanent 20010db8000000000000000000000009 02 40 20 ff everything puppetlabs-facter-dfe6df4/spec/fixtures/proc_net_route000066400000000000000000000002551470204764400235060ustar00rootroot00000000000000Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT ens160 00000000 0170100A 0003 0 0 0 00000000 0 0 0 ens160 0070100A 00000000 0001 0 0 0 00F0FFFF 0 0 0 puppetlabs-facter-dfe6df4/spec/fixtures/proc_net_route_blackhole000066400000000000000000000003531470204764400255110ustar00rootroot00000000000000Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT * 00000000 00000000 0001 0 0 0 00000000 0 0 0 puppetlabs-facter-dfe6df4/spec/fixtures/proc_net_route_empty000066400000000000000000000001071470204764400247200ustar00rootroot00000000000000Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT puppetlabs-facter-dfe6df4/spec/fixtures/proc_self_mounts000066400000000000000000000006501470204764400240370ustar00rootroot00000000000000'sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0 proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0 udev /dev devtmpfs rw,nosuid,relatime,size=3023708k,nr_inodes=755927,mode=755 0 0 devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0 tmpfs /run tmpfs rw,nosuid,noexec,relatime,size=610440k,mode=755 0 0 /dev/mapper/localhost--vg-root / ext4 rw,relatime,errors=remount-ro,data=ordered 0 0' puppetlabs-facter-dfe6df4/spec/fixtures/proc_self_mounts_selinux000066400000000000000000000006251470204764400256100ustar00rootroot00000000000000sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0 proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0 udev /dev devtmpfs rw,nosuid,relatime,size=3023708k,nr_inodes=755927,mode=755 0 0 devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0 selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0 /dev/mapper/localhost--vg-root / ext4 rw,relatime,errors=remount-ro,data=ordered 0 0 puppetlabs-facter-dfe6df4/spec/fixtures/proc_self_status000066400000000000000000000004261470204764400240360ustar00rootroot00000000000000Name: cat Umask: 0002 State: R (running) Tgid: 14437 Ngid: 0 Pid: 14437 PPid: 14122 TracerPid: 0 Uid: 1000 1000 1000 1000 Gid: 1000 1000 1000 1000 FDSize: 256 Groups: 4 20 24 25 27 29 30 44 46 108 114 1000 NStgid: 14437 NSpid: 14437 NSpgid: 14437 envID: 101 NSsid: 14122 VxID: 0puppetlabs-facter-dfe6df4/spec/fixtures/proc_self_status_host000066400000000000000000000004241470204764400250710ustar00rootroot00000000000000Name: cat Umask: 0002 State: R (running) Tgid: 14437 Ngid: 0 Pid: 14437 PPid: 14122 TracerPid: 0 Uid: 1000 1000 1000 1000 Gid: 1000 1000 1000 1000 FDSize: 256 Groups: 4 20 24 25 27 29 30 44 46 108 114 1000 NStgid: 14437 NSpid: 14437 NSpgid: 14437 envID: 0 NSsid: 14122 VxID: 0puppetlabs-facter-dfe6df4/spec/fixtures/processors_cuat000066400000000000000000000012451470204764400236750ustar00rootroot00000000000000CuAt: name = "proc0" attribute = "type" value = "PowerPC_POWER8" type = "R" generic = "D" rep = "sl" nls_index = 49 CuAt: name = "proc0" attribute = "frequency" value = "3425000000" type = "R" generic = "D" rep = "s" nls_index = 69 CuAt: name = "proc0" attribute = "smt_threads" value = "8" type = "R" generic = "D" rep = "" nls_index = 82 CuAt: name = "proc0" attribute = "smt_enabled" value = "true" type = "R" generic = "D" rep = "" nls_index = 83puppetlabs-facter-dfe6df4/spec/fixtures/processors_cudv000066400000000000000000000002631470204764400237010ustar00rootroot00000000000000CuDv: name = "proc0" status = 1 chgstatus = 2 PdDvLn = "processor/sys/proc_rspc" CuDv: name = "proc8" status = 0 chgstatus = 2 PdDvLn = "processor/sys/proc_rspc" puppetlabs-facter-dfe6df4/spec/fixtures/processors_pddv000066400000000000000000000002301470204764400236670ustar00rootroot00000000000000PdDv: type = "proc_rspc" class = "processor" Stop = "" inventory_only = 0 uniquetype = "processor/sys/proc_rspc"puppetlabs-facter-dfe6df4/spec/fixtures/prtdiag000066400000000000000000000017621470204764400221150ustar00rootroot00000000000000System Configuration: Oracle Corporation sun4v SPARC T7-1 Memory size: 8192 Megabytes ================================ Virtual CPUs ================================ CPU ID Frequency Implementation Status ------ --------- ---------------------- ------- 0 4133 MHz SPARC-M7 on-line 1 4133 MHz SPARC-M7 on-line 2 4133 MHz SPARC-M7 on-line 3 4133 MHz SPARC-M7 on-line 4 4133 MHz SPARC-M7 on-line 5 4133 MHz SPARC-M7 on-line 6 4133 MHz SPARC-M7 on-line 7 4133 MHz SPARC-M7 on-line ======================================== IO Devices ======================================= Slot + Bus Name + Model Max Speed Cur Speed Status Type Path /Width /Width -------------------------------------------------------------------------------------------puppetlabs-facter-dfe6df4/spec/fixtures/rhel5_memory000066400000000000000000000012761470204764400230720ustar00rootroot00000000000000MemTotal: 4036680 kB MemFree: 3547792 kB MemAvailable: 3659324 kB Buffers: 4288 kB Cached: 298624 kB SwapCached: 0 kB Active: 81968 kB Inactive: 255516 kB SwapTotal: 2097148 kB SwapFree: 2097148 kB Dirty: 216 kB Writeback: 0 kB AnonPages: 34656 kB Mapped: 84464 kB Slab: 80056 kB PageTables: 1704 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 4115488 kB Committed_AS: 274552 kB VmallocTotal: 34359738367 kB VmallocUsed: 0 kB VmallocChunk: 0 kB Hugepagesize: 2048 kBpuppetlabs-facter-dfe6df4/spec/fixtures/route_n_get_default000066400000000000000000000004571470204764400245010ustar00rootroot00000000000000 route to: default destination: default mask: default gateway: 10.16.112.1 interface: net0 flags: recvpipe sendpipe ssthresh rtt,ms rttvar,ms hopcount mtu expire 0 0 0 0 0 0 1500 0 puppetlabs-facter-dfe6df4/spec/fixtures/rsa000066400000000000000000000010511470204764400212370ustar00rootroot00000000000000ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDb4P6/Iw6/WoW1rMbIdpq7qSd8ktGgta2CC3CGrx4AXxjbofyegH+B9wadIrmyNcHmLFAneAmeb+H/dewRMa5Hb7tMN8z+/X9MRzlMaZDGo+1CeXQkJz7SywJrMXb00VcfSmGKe+aHr4OSdN7cXsAR3BzjUSjXdCMkNcp7bw0gcQOmMtqpxFXzbLyFeQgaXtDGwVeByzE9//mhdNv5+pcg3Jx0aC2ED9yrq78HpKYyvLx0t7SpE2i9y+meJxrk/SqlL2BJHAugRwXJkEexPr2hOoulc+PYcbEs8uGiliQEK6aqAtJYVgzcnrDajsElGkQnN9/A9uXY8N0VTLPbYBIz6v+XdWiSK+NA1uzb/GN1XnTvCP0XDTtpzBsMG/m9C02Hq6xQDDWsPp+xv2VfYlVCrlJVf/CHeKEvy78WS+HMu3McvzKmP1Topow+utEqk4qfNxEs7FwwbdDcI02dsWJWJ+1FeCz+ZiscJI0LN0NKvM3xCLGt4hf6s9/JD9b6lO8= puppetlabs-facter-dfe6df4/spec/fixtures/rsa_key000066400000000000000000000010411470204764400221060ustar00rootroot00000000000000AAAAB3NzaC1yc2EAAAADAQABAAABgQDb4P6/Iw6/WoW1rMbIdpq7qSd8ktGgta2CC3CGrx4AXxjbofyegH+B9wadIrmyNcHmLFAneAmeb+H/dewRMa5Hb7tMN8z+/X9MRzlMaZDGo+1CeXQkJz7SywJrMXb00VcfSmGKe+aHr4OSdN7cXsAR3BzjUSjXdCMkNcp7bw0gcQOmMtqpxFXzbLyFeQgaXtDGwVeByzE9//mhdNv5+pcg3Jx0aC2ED9yrq78HpKYyvLx0t7SpE2i9y+meJxrk/SqlL2BJHAugRwXJkEexPr2hOoulc+PYcbEs8uGiliQEK6aqAtJYVgzcnrDajsElGkQnN9/A9uXY8N0VTLPbYBIz6v+XdWiSK+NA1uzb/GN1XnTvCP0XDTtpzBsMG/m9C02Hq6xQDDWsPp+xv2VfYlVCrlJVf/CHeKEvy78WS+HMu3McvzKmP1Topow+utEqk4qfNxEs7FwwbdDcI02dsWJWJ+1FeCz+ZiscJI0LN0NKvM3xCLGt4hf6s9/JD9b6lO8= puppetlabs-facter-dfe6df4/spec/fixtures/selinux_config000066400000000000000000000010331470204764400234660ustar00rootroot00000000000000# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enabled # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targetedpuppetlabs-facter-dfe6df4/spec/fixtures/smbios_bios000066400000000000000000000027331470204764400227720ustar00rootroot00000000000000ID SIZE TYPE 0 64 SMB_TYPE_BIOS (BIOS information) Vendor: Phoenix Technologies LTD Version String: 6.00 Release Date: 12/12/2018 Address Segment: 0xea49 ROM Size: 65536 bytes Image Size: 88944 bytes Characteristics: 0x7c09df90 SMB_BIOSFL_ISA (ISA is supported) SMB_BIOSFL_PCI (PCI is supported) SMB_BIOSFL_PCMCIA (PCMCIA is supported) SMB_BIOSFL_PLUGNPLAY (Plug and Play is supported) SMB_BIOSFL_APM (APM is supported) SMB_BIOSFL_FLASH (BIOS is Flash Upgradeable) SMB_BIOSFL_SHADOW (BIOS shadowing is allowed) SMB_BIOSFL_ESCD (ESCD support is available) SMB_BIOSFL_CDBOOT (Boot from CD is supported) SMB_BIOSFL_SELBOOT (Selectable Boot supported) SMB_BIOSFL_EDD (EDD Spec is supported) SMB_BIOSFL_I5_PRINT (int 0x5 print screen svcs) SMB_BIOSFL_I9_KBD (int 0x9 8042 keyboard svcs) SMB_BIOSFL_I14_SER (int 0x14 serial svcs) SMB_BIOSFL_I17_PRINTER (int 0x17 printer svcs) SMB_BIOSFL_I10_CGA (int 0x10 CGA svcs) Characteristics Extension Byte 1: 0x81 SMB_BIOSXB1_ACPI (ACPI is supported) SMB_BIOSXB1_SMBAT (Smart Battery is supported) Characteristics Extension Byte 2: 0x7 SMB_BIOSXB2_BBOOT (BIOS Boot Specification supported) SMB_BIOSXB2_FKNETSVC (F-key Network Svc boot supported) SMB_BIOSXB2_ETCDIST (Enable Targeted Content Distrib.) Version Number: 0.0 Embedded Ctlr Firmware Version Number: 0.0 puppetlabs-facter-dfe6df4/spec/fixtures/smbios_chassis000066400000000000000000000005751470204764400234750ustar00rootroot00000000000000ID SIZE TYPE 3 55 SMB_TYPE_CHASSIS (system enclosure or chassis) Manufacturer: No Enclosure Version: N/A Serial Number: None Asset Tag: No Asset Tag OEM Data: 0x1234 Lock Present: N Chassis Type: 0x1 (other) Boot-Up State: 0x3 (safe) Power Supply State: 0x3 (safe) Thermal State: 0x3 (safe) Chassis Height: 0u Power Cords: 0 Element Records: 0 puppetlabs-facter-dfe6df4/spec/fixtures/smbios_system000066400000000000000000000005031470204764400233530ustar00rootroot00000000000000ID SIZE TYPE 1 123 SMB_TYPE_SYSTEM (system information) Manufacturer: VMware, Inc. Product: VMware Virtual Platform Version: None Serial Number: VMware-42 1a 46 19 2d fc 12 90-73 48 ea 8f 1a 37 cb 95 UUID: 421a4619-2dfc-1290-7348-ea8f1a37cb95 Wake-Up Event: 0x6 (power switch) SKU Number: Family: puppetlabs-facter-dfe6df4/spec/fixtures/solaris_filesystems000066400000000000000000000073501470204764400245650ustar00rootroot00000000000000* * * * Devices * scsi_vhci, instance #0 pci, instance #0 pci15ad,1976 (driver not attached) pci8086,7191, instance #0 isa, instance #0 i8042, instance #0 keyboard, instance #0 mouse, instance #0 motherboard (driver not attached) lp, instance #0 (driver not attached) asy, instance #0 (driver not attached) asy, instance #1 (driver not attached) fdc (driver not attached) pit_beep, instance #0 pci-ide, instance #0 ide, instance #0 sd, instance #0 ide, instance #1 (driver not attached) pci15ad,1976 (driver not attached) pci15ad,740 (driver not attached) display, instance #0 pci15ad,1976, instance #0 sd, instance #1 pci15ad,790, instance #1 pci15ad,7a0, instance #0 pci15ad,7b0, instance #0 pci15ad,7a0, instance #1 pci15ad,7a0, instance #2 pci15ad,7a0, instance #3 pci15ad,7a0, instance #4 fw, instance #0 sb, instance #1 cpu, instance #0 (driver not attached) cpu, instance #1 (driver not attached) fcoe, instance #0 iscsi, instance #0 options, instance #0 * * Loadable Objects * * Loadable Object Path = /platform/i86pc/kernel * drv/amd64/xsvc drv/amd64/vga_arbiter amd64/unix cpu/amd64/cpu.generic cpu/amd64/cpu_ms.AuthenticAMD cpu/amd64/cpu_ms.AuthenticAMD.15 cpu/amd64/cpu_ms.GenuineIntel cpu/amd64/cpu_ms.GenuineIntel.6.45 hard link: cpu/amd64/cpu_ms.GenuineIntel.6.62 cpu/amd64/cpu_ms.GenuineIntel.6.46 hard link: cpu/amd64/cpu_ms.GenuineIntel.6.47 drv/amd64/acpinex dacf/amd64/consconfig_dacf drv/amd64/amd_iommu drv/amd64/acpippm drv/amd64/cpudrv drv/amd64/intel_iommu drv/amd64/isa drv/amd64/npe drv/amd64/pci drv/amd64/ppm misc/amd64/gfx_private tod/amd64/zvtod drv/amd64/cpc hard link: sys/amd64/cpc misc/amd64/drmach_acpi drv/amd64/dr misc/amd64/cpr kmdb/amd64/zvpsm kmdb/amd64/pcplusmp kmdb/amd64/unix kmdb/amd64/uppc kmdb/amd64/apix kmdb/amd64/iommu drv/amd64/pci-ide drv/amd64/zvpci_stub drv/amd64/zvmm * * Loadable Object Path = /kernel * misc/amd64/dadk drv/amd64/cmdk misc/amd64/gda misc/amd64/strategy drv/amd64/cxge drv/amd64/cxgen drv/amd64/nge drv/amd64/rum fs/amd64/hsfs drv/amd64/ahci misc/qlc/amd64/qlc_fw_8100 drv/amd64/rdsv3 misc/amd64/nfssrv drv/amd64/fcip crypto/amd64/rsa drv/amd64/imraid_sas drv/amd64/ibp crypto/amd64/sha1 hard link: misc/amd64/sha1 crypto/amd64/arcfour crypto/amd64/blowfish crypto/amd64/aes crypto/amd64/camellia crypto/amd64/des crypto/amd64/ecc crypto/amd64/md5 hard link: misc/amd64/md5 crypto/amd64/intelrd drv/amd64/cryptoadm misc/amd64/bignum misc/amd64/kcf crypto/amd64/sha2 hard link: misc/amd64/sha2 crypto/amd64/sha3 hard link: misc/amd64/sha3 crypto/amd64/swrand drv/amd64/sdpib hard link: strmod/amd64/sdpib socketmod/amd64/socksdp drv/amd64/lmrc fs/amd64/udfs drv/amd64/ntxn drv/amd64/uvfs hard link: fs/amd64/uvfs drv/amd64/bge misc/amd64/fssnap_if fs/amd64/ufs drv/amd64/fcoe fs/amd64/nfs hard link: sys/amd64/nfs misc/amd64/klmmod misc/amd64/klmops misc/amd64/nfs_dlboot drv/amd64/usbftdi drv/amd64/qlcnic drv/amd64/fcsm sched/amd64/RT_DPTBL sched/amd64/FX_DPTBL pcbe/amd64/uncore.GenuineIntel.6.45 pcbe/amd64/pcbe.AuthenticAMD.21 pcbe/amd64/pcbe.GenuineIntel.15 pcbe/amd64/pcbe.GenuineIntel.6.26 pcbe/amd64/pcbe.GenuineIntel.6.60 pcbe/amd64/pcbe.GenuineIntel.6 pcbe/amd64/pcbe.GenuineIntel.6.78 pcbe/amd64/pcbe.GenuineIntel.6.15 drv/amd64/uncore pcbe/amd64/pcbe.AuthenticAMD pcbe/amd64/pcbe.GenuineIntel.6.42 drv/amd64/zcons fs/amd64/pcfs drv/amd64/poolpuppetlabs-facter-dfe6df4/spec/fixtures/solaris_ifconfig000066400000000000000000000003021470204764400237700ustar00rootroot00000000000000net0: flags=100001004843 mtu 1500 index 2 inet 10.16.115.67 netmask fffff000 broadcast 10.16.127.255 ether 0:50:56:9a:45:1c puppetlabs-facter-dfe6df4/spec/fixtures/svmon_content000066400000000000000000000012511470204764400233500ustar00rootroot00000000000000 size inuse free pin virtual mmode memory 2097152 884743 1212409 381480 454093 Ded pg space 131072 2737 work pers clnt other pin 245356 0 2108 134016 in use 454093 0 430650 PageSize PoolSize inuse pgsp pin virtual s 4 KB - 638055 2737 198376 207405 m 64 KB - 15418 0 11444 15418 L 16 MB - 0 0 0 0 S 16 GB - 0 0 0 0puppetlabs-facter-dfe6df4/spec/fixtures/swap_l000066400000000000000000000002601470204764400217400ustar00rootroot00000000000000swapfile dev swaplo blocks free /dev/zvol/dsk/rpool/swap 279,1 8 2097144 2097144 /dev/zvol/dsk/rpool/swap_test 279,3 8 1433592 1433592 puppetlabs-facter-dfe6df4/spec/fixtures/system_profile_sp_ethernet_data_type000066400000000000000000000006351470204764400301570ustar00rootroot00000000000000Ethernet Cards: ethernet: Type: Ethernet Controller Bus: PCI Vendor ID: 0x8086 Device ID: 0x100f Subsystem Vendor ID: 0x1ab8 Subsystem ID: 0x0400 Revision ID: 0x0000 BSD name: en0 Kext name: AppleIntel8254XEthernet.kext Location: /System/Library/Extensions/IONetworkingFamily.kext/Contents/PlugIns/AppleIntel8254XEthernet.kext Version: 3.1.5puppetlabs-facter-dfe6df4/spec/fixtures/system_profile_sp_hardware_data_type000066400000000000000000000011201470204764400301240ustar00rootroot00000000000000Hardware: Hardware Overview: Model Name: MacBook Pro Model Identifier: MacBookPro11,4 Processor Name: Intel Core i7 Processor Speed: 2.8 GHz Number of Processors: 1 Total Number of Cores: 4 L2 Cache (per Core): 256 KB L3 Cache: 6 MB Hyper-Threading Technology: Enabled Memory: 16 GB Boot ROM Version: 1037.60.58.0.0 (iBridge: 17.16.12551.0.0,0) SMC Version (system): 2.29f24 Serial Number (system): 123456789AAA Hardware UUID: 12345678-1111-2222-AAAA-AABBCCDDEEFF Activation Lock Status: Disabledpuppetlabs-facter-dfe6df4/spec/fixtures/system_profile_sp_software_data_type000066400000000000000000000005631470204764400301730ustar00rootroot00000000000000Software: System Software Overview: System Version: macOS 10.15.2 (19C57) Kernel Version: Darwin 19.2.0 Boot Volume: Macintosh HD Boot Mode: Normal Computer Name: Test1’s MacBook Pro User Name: Test1 Test2 (test1.test2) Secure Virtual Memory: Enabled System Integrity Protection: Enabled Time since boot: 3:28puppetlabs-facter-dfe6df4/spec/fixtures/system_profiler000066400000000000000000000017061470204764400237070ustar00rootroot00000000000000Hardware: Hardware Overview: Model Name: MacBook Pro Model Identifier: MacBookPro11,4 Processor Name: Intel Core i7 Processor Speed: 2.8 GHz Number of Processors: 1 Total Number of Cores: 4 L2 Cache (per Core): 256 KB L3 Cache: 6 MB Hyper-Threading Technology: Enabled Memory: 16 GB Boot ROM Version: 1037.60.58.0.0 (iBridge: 17.16.12551.0.0,0) SMC Version (system): 2.29f24 Serial Number (system): 123456789AAA Hardware UUID: 12345678-1111-2222-AAAA-AABBCCDDEEFF Activation Lock Status: Disabled Software: System Software Overview: System Version: macOS 10.15.2 (19C57) Kernel Version: Darwin 19.2.0 Boot Volume: Macintosh HD Boot Mode: Normal Computer Name: Test1’s MacBook Pro User Name: Test1 Test2 (test1.test2) Secure Virtual Memory: Enabled System Integrity Protection: Enabled Time since boot: 3:28 puppetlabs-facter-dfe6df4/spec/fixtures/virt-what-content000066400000000000000000000000171470204764400240500ustar00rootroot00000000000000xen xen-hvm awspuppetlabs-facter-dfe6df4/spec/fixtures/virtinfo000066400000000000000000000003421470204764400223140ustar00rootroot00000000000000VERSION 1.0 DOMAINROLE|impl=LDoms|control=false|io=false|service=false|root=false DOMAINNAME|name=sol11-11 DOMAINUUID|uuid=415dfab4-c373-4ac0-9414-8bf00801fb72 DOMAINCONTROL|name=opdx-a0-sun2 DOMAINCHASSIS|serialno=AK00358110 puppetlabs-facter-dfe6df4/spec/fixtures/vm_stat000066400000000000000000000021601470204764400221310ustar00rootroot00000000000000Mach Virtual Memory Statistics: (page size of 4096 bytes) Pages free: 1364873. Pages active: 2653007. Pages inactive: 1583485. Pages speculative: 1061442. Pages throttled: 0. Pages wired down: 986842. Pages purgeable: 207521. "Translation faults": 2444018907. Pages copy-on-write: 202802362. Pages zero filled: 1466949525. Pages reactivated: 1421652. Pages purged: 277081. File-backed pages: 1562816. Anonymous pages: 3735118. Pages stored in compressor: 1909929. Pages occupied by compressor: 737949. Decompressions: 8791424. Compressions: 13081516. Pageins: 8432517. Pageouts: 5901. Swapins: 10474828. Swapouts: 10972484. puppetlabs-facter-dfe6df4/spec/fixtures/xen_domains000066400000000000000000000004771470204764400227710ustar00rootroot00000000000000Name ID Mem VCPUs State Time(s) Domain-0 0 750 4 r----- 11794.3 win 1 1019 1 r----- 0.3 linux 2 2048 2 r----- 5624.2puppetlabs-facter-dfe6df4/spec/fixtures/zfs000066400000000000000000000007071470204764400212630ustar00rootroot00000000000000The following filesystem versions are supported: VER DESCRIPTION --- -------------------------------------------------------- 1 Initial ZFS filesystem version 2 Enhanced directory entries 3 Case insensitive and SMB credentials support 4 userquota, groupquota properties 5 System attributes 6 Multilevel file system support For more information on a particular version, including supported releases, see the ZFS Administration Guide. puppetlabs-facter-dfe6df4/spec/fixtures/zpool000066400000000000000000000024151470204764400216220ustar00rootroot00000000000000This system is currently running ZFS pool version 34. The following versions are supported: VER DESCRIPTION --- -------------------------------------------------------- 1 Initial ZFS version 2 Ditto blocks (replicated metadata) 3 Hot spares and double parity RAID-Z 4 zpool history 5 Compression using the gzip algorithm 6 bootfs pool property 7 Separate intent log devices 8 Delegated administration 9 refquota and refreservation properties 10 Cache devices 11 Improved scrub performance 12 Snapshot properties 13 snapused property 14 passthrough-x aclinherit 15 user/group space accounting 16 stmf property support 17 Triple-parity RAID-Z 18 Snapshot user holds 19 Log device removal 20 Compression using zle (zero-length encoding) 21 Deduplication 22 Received properties 23 Slim ZIL 24 System attributes 25 Improved scrub stats 26 Improved snapshot deletion performance 27 Improved snapshot creation performance 28 Multiple vdev replacements 29 RAID-Z/mirror hybrid allocator 30 Encryption 31 Improved 'zfs list' performance 32 One MB blocksize 33 Improved share support 34 Sharing with inheritance For more information on a particular version, including supported releases, see the ZFS Administration Guide.puppetlabs-facter-dfe6df4/spec/fixtures/zpool-with-featureflags000066400000000000000000000057751470204764400252550ustar00rootroot00000000000000This system supports ZFS pool feature flags. The following features are supported: FEAT DESCRIPTION ------------------------------------------------------------- async_destroy (read-only compatible) Destroy filesystems asynchronously. empty_bpobj (read-only compatible) Snapshots use less space. lz4_compress LZ4 compression algorithm support. multi_vdev_crash_dump Crash dumps to multiple vdev pools. spacemap_histogram (read-only compatible) Spacemaps maintain space histograms. enabled_txg (read-only compatible) Record txg at which a feature is enabled hole_birth Retain hole birth txg for more precise zfs send extensible_dataset Enhanced dataset functionality, used by other features. embedded_data Blocks which compress very well use even less space. bookmarks (read-only compatible) "zfs bookmark" command filesystem_limits (read-only compatible) Filesystem and snapshot limits. large_blocks Support for blocks larger than 128KB. large_dnode Variable on-disk size of dnodes. sha512 SHA-512/256 hash algorithm. skein Skein hash algorithm. device_removal Top-level vdevs can be removed, reducing logical pool size. obsolete_counts (read-only compatible) Reduce memory used by removed devices when their blocks are freed or remapped. zpool_checkpoint (read-only compatible) Pool state can be checkpointed, allowing rewind later. spacemap_v2 (read-only compatible) Space maps representing large segments are more efficient. The following legacy versions are also supported: VER DESCRIPTION --- -------------------------------------------------------- 1 Initial ZFS version 2 Ditto blocks (replicated metadata) 3 Hot spares and double parity RAID-Z 4 zpool history 5 Compression using the gzip algorithm 6 bootfs pool property 7 Separate intent log devices 8 Delegated administration 9 refquota and refreservation properties 10 Cache devices 11 Improved scrub performance 12 Snapshot properties 13 snapused property 14 passthrough-x aclinherit 15 user/group space accounting 16 stmf property support 17 Triple-parity RAID-Z 18 Snapshot user holds 19 Log device removal 20 Compression using zle (zero-length encoding) 21 Deduplication 22 Received properties 23 Slim ZIL 24 System attributes 25 Improved scrub stats 26 Improved snapshot deletion performance 27 Improved snapshot creation performance 28 Multiple vdev replacements For more information on a particular version, including supported releases, see the ZFS Administration Guide. puppetlabs-facter-dfe6df4/spec/framework/000077500000000000000000000000001470204764400206565ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/framework/cli/000077500000000000000000000000001470204764400214255ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/framework/cli/cli_launcher_spec.rb000066400000000000000000000060011470204764400254110ustar00rootroot00000000000000# frozen_string_literal: true require 'facter/framework/cli/cli_launcher' describe CliLauncher do subject(:cli_launcher) { CliLauncher } let(:args) { [] } describe '#prepare_arguments' do let(:task_list) do { 'help' => Thor::Command.new('help', 'description', 'long_description', 'wrap_long_description', 'usage'), 'query' => Thor::Command.new('query', 'description', 'long_description', 'wrap_long_description', 'usage'), 'version' => Thor::Command.new('version', 'description', 'long_description', 'wrap_long_description', 'usage'), 'list_block_groups' => Thor::Command.new('list_block_groups', 'description', 'wrap_long_description', 'long_description', 'usage'), 'list_cache_groups' => Thor::Command.new('list_cache_groups', 'description', 'wrap_long_description', 'long_description', 'usage') } end let(:map) do { '-h' => :help, '--version' => :version, '--list-block-groups' => :list_block_groups, '--list-cache-groups' => :list_cache_groups } end before do allow(Facter::Cli).to receive(:all_tasks).and_return(task_list) allow(Facter::Cli).to receive(:instance_variable_get).with(:@map).and_return(map) end context 'when arguments should be reordered' do let(:args) { %w[--debug --list-cache-groups --list-block-groups] } let(:expected_arguments) { %w[--list-cache-groups --list-block-groups --debug] } it 'reorders arguments' do prepare_arguments = CliLauncher.prepare_arguments(args) expect(prepare_arguments).to eq(expected_arguments) end end context 'when arguments should not be reordered' do let(:args) { %w[--list-cache-groups --list-block-groups --debug] } it 'does not reorder arguments' do prepare_arguments = CliLauncher.prepare_arguments(args) expect(prepare_arguments).to eq(args) end end context 'when default task should be added' do let(:args) { %w[fact1 fact2] } let(:expected_args) { %w[query fact1 fact2] } it 'adds default (query) task' do prepare_arguments = CliLauncher.prepare_arguments(args) expect(prepare_arguments).to eq(expected_args) end end end describe '#start' do context 'when no errors' do before do allow(Facter::Cli).to receive(:start) end it 'calls Facter::Cli.start' do CliLauncher.start(args) expect(Facter::Cli).to have_received(:start).with(args, debug: true) end end context 'when errors' do before do allow(Facter::OptionsValidator).to receive(:write_error_and_exit) allow(Facter::Cli).to receive(:start).with(any_args).and_raise(Thor::UnknownArgumentError.new({}, {})) end it 'calls Facter::OptionsValidator.write_error_and_exit' do CliLauncher.start(args) expect(Facter::OptionsValidator).to have_received(:write_error_and_exit) end end end end puppetlabs-facter-dfe6df4/spec/framework/config/000077500000000000000000000000001470204764400221235ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/framework/config/config_reader_spec.rb000066400000000000000000000125621470204764400262570ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::ConfigReader do subject(:config_reader) { Facter::ConfigReader } let(:linux_default_path) { File.join('/', 'etc', 'puppetlabs', 'facter', 'facter.conf') } let(:windows_default_path) { File.join('C:', 'ProgramData', 'PuppetLabs', 'facter', 'etc', 'facter.conf') } before do allow(OsDetector.instance).to receive(:identifier).and_return(os) end describe '#init' do before do allow(File).to receive(:readable?).and_return(false) end context 'without config_path sent' do context 'with os linux' do let(:os) { :linux } before do stub_const('RUBY_PLATFORM', 'linux') end it 'calls refresh_config with linux path' do config_reader.init expect(File).to have_received(:readable?).with(linux_default_path) end end context 'with os windows' do let(:os) { :windows } before do stub_const('RUBY_PLATFORM', 'windows') end it 'calls refresh_config with windows path' do config_reader.init expect(File).to have_received(:readable?).with(windows_default_path) end end context 'with JRUBY' do let(:os) { :linux } before do stub_const('RUBY_PLATFORM', 'java') end it 'load no config' do config_reader.init expect(File).to have_received(:readable?).with('') end end end context 'with config_path sent' do let(:os) { :linux } it 'calls refresh_config with custom path' do config_reader.init('/path/to/config/file') expect(File).to have_received(:readable?).with('/path/to/config/file') end end end describe '#block_list' do let(:os) { :linux } before do allow(File).to receive(:readable?).and_return(true) allow(Hocon).to receive(:load).and_return(config) end context 'with empty config file' do let(:config) { {} } it 'returns nil' do config_reader.init expect(config_reader.block_list).to eq(nil) end end context 'with blocklist in config file' do let(:config) { { 'facts' => { 'blocklist' => %w[group1 fact1] } } } it 'returns blocklisted facts' do config_reader.init expect(config_reader.block_list).to eq(%w[group1 fact1]) end end end describe '#ttls' do let(:os) { :linux } before do allow(File).to receive(:readable?).and_return(true) allow(Hocon).to receive(:load).and_return(config) end context 'with empty config file' do let(:config) { {} } it 'returns nil' do config_reader.init expect(config_reader.ttls).to eq(nil) end end context 'with ttls in config file' do let(:config) { { 'facts' => { 'ttls' => [{ 'fact_name' => '10 days' }] } } } it 'returns blocklisted facts' do config_reader.init expect(config_reader.ttls).to eq([{ 'fact_name' => '10 days' }]) end end end describe '#global' do let(:os) { :linux } before do allow(File).to receive(:readable?).and_return(true) allow(Hocon).to receive(:load).and_return(config) end context 'with empty config file' do let(:config) { {} } it 'returns nil' do config_reader.init expect(config_reader.global).to eq(nil) end end context 'with invalid config file' do let(:config) { 'some corrupt information' } let(:log) { Facter::Log.class_variable_get(:@@logger) } before do allow(Hocon).to receive(:load).and_raise(StandardError) allow(log).to receive(:warn) end it 'loggs a warning' do expect(log).to receive(:warn).with(/Facter failed to read config file/) config_reader.init end end context 'with global section in config file' do let(:config) { { 'global' => 'global_config' } } it 'returns blocklisted facts' do config_reader.init expect(config_reader.global).to eq('global_config') end end end describe '#cli' do let(:os) { :linux } before do allow(File).to receive(:readable?).and_return(true) allow(Hocon).to receive(:load).and_return(config) end context 'with empty config file' do let(:config) { {} } it 'returns nil' do config_reader.init expect(config_reader.cli).to eq(nil) end end context 'with cli section in config file' do let(:config) { { 'cli' => 'cli_config' } } it 'returns blocklisted facts' do config_reader.init expect(config_reader.cli).to eq('cli_config') end end end describe '#fact-groups' do let(:os) { :linux } before do allow(File).to receive(:readable?).and_return(true) allow(Hocon).to receive(:load).and_return(config) end context 'with empty config file' do let(:config) { {} } it 'returns nil' do config_reader.init expect(config_reader.fact_groups).to eq(nil) end end context 'with fact-groups in config file' do let(:config) { { 'fact-groups' => { 'cached-custom-facts' => ['my_custom_fact'] } } } it 'returns fact-groups' do config_reader.init expect(config_reader.fact_groups).to eq('cached-custom-facts' => ['my_custom_fact']) end end end end puppetlabs-facter-dfe6df4/spec/framework/config/fact_groups_spec.rb000066400000000000000000000122231470204764400257760ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::FactGroups do subject(:fact_groups) { Facter::FactGroups } let(:fg) { fact_groups.new } let(:config_reader) { class_spy(Facter::ConfigReader) } before do allow(Facter::ConfigReader).to receive(:init).and_return(config_reader) allow(config_reader).to receive(:block_list).and_return([]) allow(config_reader).to receive(:ttls).and_return([]) allow(config_reader).to receive(:fact_groups).and_return({}) end describe '#initialize' do it 'merges groups from facter.conf' do allow(config_reader).to receive(:fact_groups).and_return('foo' => 'bar') fct_grp = fact_groups.new expect(fct_grp.groups).to include('foo' => 'bar') end it 'merges external facts' do external_path = '/path/to/external' allow(Facter::Options).to receive(:external_dir).and_return([external_path]) allow(Dir).to receive(:exist?).with(external_path).and_return true allow(Dir).to receive(:entries).with(external_path).and_return(['.', '..', 'external.sh']) fct_grp = fact_groups.new expect(fct_grp.instance_variable_get(:@groups)).to include('external.sh' => nil) end it 'merges groups from facter.conf with default group override' do stub_const('Facter::Config::FACT_GROUPS', { 'kernel' => %w[kernel kernelversion] }) allow(config_reader).to receive(:fact_groups).and_return('kernel' => 'foo') fct_grp = fact_groups.new expect(fct_grp.groups).to eq('kernel' => 'foo') end end describe '#blocked_facts' do context 'with block_list' do before do stub_const('Facter::Config::FACT_GROUPS', 'blocked_group' => %w[fact1 fact2]) allow(config_reader).to receive(:block_list).and_return(%w[blocked_group blocked_fact]) end it 'returns a list of blocked facts' do blk_list = fact_groups.new expect(blk_list.blocked_facts).to eq(%w[fact1 fact2 blocked_fact]) end end context 'with blocked `legacy` group' do before do stub_const('Facter::Config::FACT_GROUPS', 'legacy' => %w[legacy_fact1 legacy_fact2]) allow(config_reader).to receive(:block_list).and_return(%w[legacy]) end # legacy facts are excluded because they are blocked by another mechanism that takes into account the fact's type it 'excludes legacy facts' do blk_list = fact_groups.new expect(blk_list.blocked_facts).to be_empty end end context 'without block_list' do before do allow(config_reader).to receive(:block_list).and_return([]) allow(Facter::ConfigReader).to receive(:new).and_return(config_reader) allow(config_reader).to receive(:block_list).and_return(nil) end it 'finds no block group file' do blk_list = fact_groups.new expect(blk_list.blocked_facts).to eq([]) end end end describe '#get_fact_group' do before do stub_const('Facter::Config::FACT_GROUPS', 'operating system' => %w[os os.name]) allow(config_reader).to receive(:ttls).and_return(['operating system' => '30 minutes']) end it 'returns group' do expect(fg.get_fact_group('os')).to eq('operating system') end it 'returns nil' do expect(fg.get_fact_group('memory')).to be_nil end end describe '#get_group_ttls' do let(:ttls) { ['operating system' => '30 minutes'] } before do stub_const('Facter::Config::FACT_GROUPS', 'operating system' => %w[os os.name]) allow(config_reader).to receive(:ttls).and_return(ttls) end it 'returns group' do expect(fg.get_group_ttls('operating system')).to eq(1800) end it 'returns nil' do expect(fg.get_group_ttls('memory')).to be_nil end context 'when ttls has short names for units' do let(:ttls) { ['operating system' => '10000000000000 ns', 'memory' => '10000', 'hostname' => '30 h'] } it 'returns os ttl in seconds' do expect(fg.get_group_ttls('operating system')).to eq(10_000) end it 'returns memory ttl in seconds' do expect(fg.get_group_ttls('memory')).to eq(10) end it 'returns hostname ttl in seconds' do expect(fg.get_group_ttls('hostname')).to eq(108_000) end end context 'when ttls has singular hour instead of plural hours' do let(:ttls) { ['operating system' => '1 hour', 'memory' => '1 day'] } it 'returns os ttl in seconds' do expect(fg.get_group_ttls('operating system')).to eq(3600) end it 'returns memory ttl in seconds' do expect(fg.get_group_ttls('memory')).to eq(86_400) end end context 'when ttls are invalid' do let(:ttls) { ['hostname' => '30 invalid_unit'] } let(:logger) { Facter::Log.class_variable_get(:@@logger) } before do allow(Facter::Log).to receive(:new).and_return(logger) end it 'logs an error message' do allow(logger).to receive(:error) expect(logger).to receive(:error).with('Could not parse time unit invalid_units '\ "(try #{Facter::FactGroups::STRING_TO_SECONDS.keys.reject(&:empty?).join(', ')})").twice fg.get_group_ttls('hostname') end end end end puppetlabs-facter-dfe6df4/spec/framework/core/000077500000000000000000000000001470204764400216065ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/framework/core/fact/000077500000000000000000000000001470204764400225235ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/framework/core/fact/external/000077500000000000000000000000001470204764400243455ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/framework/core/fact/external/external_fact_manager_spec.rb000066400000000000000000000022531470204764400322170ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::ExternalFactManager do describe '#resolve' do let(:custom_fact_name) { 'my_custom_fact' } let(:custom_fact_value) { 'custom_fact_value' } let(:custom_fact) { Facter::Util::Fact.new(custom_fact_name) } let(:searched_fact) { Facter::SearchedFact.new(custom_fact_name, nil, '', :custom) } let(:custom_fact_manager) { Facter::ExternalFactManager.new } before do allow(LegacyFacter).to receive(:[]).with(custom_fact_name).and_return(custom_fact) allow(custom_fact).to receive(:value).and_return(custom_fact_value) end it 'resolves one custom fact' do resolved_facts = custom_fact_manager.resolve_facts([searched_fact]) expect(resolved_facts.length).to eq(1) end it 'resolves custom fact with name my_custom_fact' do resolved_facts = custom_fact_manager.resolve_facts([searched_fact]) expect(resolved_facts.first.name).to eq(custom_fact_name) end it 'resolves custom fact with value custom_fact_value' do resolved_facts = custom_fact_manager.resolve_facts([searched_fact]) expect(resolved_facts.first.value).to eq(custom_fact_value) end end end puppetlabs-facter-dfe6df4/spec/framework/core/fact/internal/000077500000000000000000000000001470204764400243375ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/framework/core/fact/internal/internal_fact_manager_spec.rb000066400000000000000000000115541470204764400322070ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::InternalFactManager do let(:internal_fact_manager) { Facter::InternalFactManager.new } let(:os_name_class_spy) { class_spy(Facts::Linux::Os::Name) } let(:os_name_instance_spy) { instance_spy(Facts::Linux::Os::Name) } describe '#resolve_facts' do it 'resolved one core fact' do resolved_fact = mock_resolved_fact('os', 'Debian', nil) allow(os_name_class_spy).to receive(:new).and_return(os_name_instance_spy) allow(os_name_instance_spy).to receive(:call_the_resolver).and_return(resolved_fact) searched_fact = instance_spy(Facter::SearchedFact, name: 'os', fact_class: os_name_class_spy, user_query: '', type: :core) resolved_facts = internal_fact_manager.resolve_facts([searched_fact]) expect(resolved_facts).to eq([resolved_fact]) end it 'resolved one legacy fact' do networking_interface_class_spy = class_spy(Facts::Windows::NetworkInterfaces) windows_networking_interface = instance_spy(Facts::Windows::NetworkInterfaces) resolved_fact = mock_resolved_fact('network_Ethernet0', '192.168.5.121', nil, :legacy) allow(networking_interface_class_spy).to receive(:new).and_return(windows_networking_interface) allow(windows_networking_interface).to receive(:call_the_resolver).and_return(resolved_fact) searched_fact = instance_spy(Facter::SearchedFact, name: 'network_.*', fact_class: networking_interface_class_spy, user_query: '', type: :core) resolved_facts = internal_fact_manager.resolve_facts([searched_fact]) expect(resolved_facts).to eq([resolved_fact]) end context 'when resolved fact is of type nil' do let(:searched_fact) do instance_spy(Facter::SearchedFact, name: 'missing_fact', fact_class: nil, user_query: '', type: :nil) end let(:resolved_fact) { instance_spy(Facter::ResolvedFact) } before do allow(Facter::ResolvedFact).to receive(:new).and_return(resolved_fact) end it 'resolved one nil fact' do resolved_facts = internal_fact_manager.resolve_facts([searched_fact]) expect(resolved_facts).to eq([resolved_fact]) end end context 'when there are multiple search facts pointing to the same fact' do before do resolved_fact = mock_resolved_fact('os', 'Debian', nil) allow(os_name_class_spy).to receive(:new).and_return(os_name_instance_spy) allow(os_name_instance_spy).to receive(:call_the_resolver).and_return(resolved_fact) searched_fact = instance_spy(Facter::SearchedFact, name: 'os.name', fact_class: os_name_class_spy, user_query: '', type: :core) searched_fact_with_alias = instance_spy(Facter::SearchedFact, name: 'operatingsystem', fact_class: os_name_class_spy, user_query: '', type: :core) internal_fact_manager.resolve_facts([searched_fact, searched_fact_with_alias]) end it 'resolves the fact for all searched facts' do expect(os_name_instance_spy).to have_received(:call_the_resolver).twice end end context 'when fact throws exception' do let(:searched_fact) do instance_spy(Facter::SearchedFact, name: 'os', fact_class: os_name_class_spy, user_query: '', type: :core) end let(:logger) { Facter::Log.class_variable_get(:@@logger) } before do allow(os_name_class_spy).to receive(:new).and_return(os_name_instance_spy) exception = StandardError.new('error_message') exception.set_backtrace(%w[backtrace]) allow(os_name_instance_spy).to receive(:call_the_resolver).and_raise(exception) end it 'does not store the fact value' do resolved_facts = internal_fact_manager.resolve_facts([searched_fact]) expect(resolved_facts).to match_array [] end it 'logs backtrace as error with --trace option' do allow(Facter::Options).to receive(:[]) allow(Facter::Options).to receive(:[]).with(:trace).and_return(true) expect(logger) .to receive(:error) .with("Facter::InternalFactManager - #{colorize("error_message\nbacktrace", Facter::RED)}") internal_fact_manager.resolve_facts([searched_fact]) end it 'logs error message as error without --trace option' do expect(logger) .to receive(:error) .with("Facter::InternalFactManager - #{colorize('error_message', Facter::RED)}") internal_fact_manager.resolve_facts([searched_fact]) end end end end puppetlabs-facter-dfe6df4/spec/framework/core/fact_loaders/000077500000000000000000000000001470204764400242345ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/framework/core/fact_loaders/class_discoverer_spec.rb000066400000000000000000000014021470204764400311220ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::ClassDiscoverer do describe '#discover_classes' do let(:result) { [Facts::Windows::NetworkInterfaces, Facts::Windows::FipsEnabled] } before do Singleton.__init__(Facter::ClassDiscoverer) end it 'loads all classes' do allow(Module).to receive(:const_get).with('Facts::Windows').and_return(Facts::Windows) allow(Facts::Windows).to receive(:constants).and_return(%i[NetworkInterfaces FipsEnabled]) expect(Facter::ClassDiscoverer.instance.discover_classes('Windows')).to eq(result) end it 'loads no classes' do allow(Module).to receive(:const_get).and_return([]) expect(Facter::ClassDiscoverer.instance.discover_classes('Debian')).to eq([]) end end end puppetlabs-facter-dfe6df4/spec/framework/core/fact_loaders/external_fact_loader_spec.rb000066400000000000000000000053001470204764400317360ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::ExternalFactLoader do let(:collection) { instance_double(LegacyFacter::Util::Collection) } let(:external_fact) { Facter::Util::Fact.new('external_fact', options: { fact_type: :external }) } let(:custom_fact) { Facter::Util::Fact.new('custom_fact', options: { fact_type: :custom }) } before do allow(LegacyFacter).to receive(:collection).and_return(collection) allow(collection).to receive(:external_facts).and_return({}) allow(collection).to receive(:custom_facts).and_return([]) end describe '#custom_facts' do context 'when one custom fact is loaded' do before do allow(collection).to receive(:custom_facts).and_return({ 'custom_fact' => custom_fact }) allow(Facter::Options).to receive(:custom_dir?).and_return(true) allow(Facter::Options).to receive(:custom_dir).and_return(['custom_fact_dir']) end it 'returns one custom fact' do external_fact_loader = Facter::ExternalFactLoader.new expect(external_fact_loader.custom_facts.size).to eq(1) end it 'returns custom fact with name custom_fact' do external_fact_loader = Facter::ExternalFactLoader.new expect(external_fact_loader.custom_facts.first.name).to eq('custom_fact') end end context 'when no custom facts are loaded' do before do allow(collection).to receive(:custom_facts).and_return([]) end it 'return no custom facts' do external_fact_loader = Facter::ExternalFactLoader.new expect(external_fact_loader.custom_facts).to eq([]) end end end describe '#external_facts' do context 'when loads one external fact' do before do allow(collection).to receive(:external_facts).and_return({ 'external_fact' => external_fact }) allow(Facter::Options).to receive(:external_dir?).and_return(true) allow(Facter::Options).to receive(:external_dir).and_return(['external_fact_dir']) end it 'returns one external fact' do external_fact_loader = Facter::ExternalFactLoader.new expect(external_fact_loader.external_facts.size).to eq(1) end it 'returns external fact with name external_fact' do external_fact_loader = Facter::ExternalFactLoader.new expect(external_fact_loader.external_facts.first.name).to eq('external_fact') end end context 'when loads no external facts' do before do allow(collection).to receive(:external_facts).and_return([]) end it 'return no external facts' do external_fact_loader = Facter::ExternalFactLoader.new expect(external_fact_loader.external_facts).to eq([]) end end end end puppetlabs-facter-dfe6df4/spec/framework/core/fact_loaders/fact_loader_spec.rb000066400000000000000000000147031470204764400300430ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::FactLoader do describe '#load' do let(:internal_fact_loader_double) { instance_spy(Facter::InternalFactLoader) } let(:external_fact_loader_double) { instance_spy(Facter::ExternalFactLoader) } let(:ubuntu_os_name) { instance_spy(Facts::Linux::Os::Name) } let(:networking_class) { instance_spy(Facts::Windows::NetworkInterfaces) } let(:loaded_fact_os_name) { instance_spy(Facter::LoadedFact, name: 'os.name', klass: ubuntu_os_name, type: :core) } let(:loaded_fact_os_name_legacy) do instance_spy(Facter::LoadedFact, name: 'operatingsystem', klass: ubuntu_os_name, type: :legacy) end let(:loaded_fact_networking) do instance_spy(Facter::LoadedFact, name: 'network_.*', klass: networking_class, type: :legacy) end let(:loaded_fact_custom_fact) { instance_spy(Facter::LoadedFact, name: 'custom_fact', klass: nil, type: :custom) } let(:loaded_env_custom_fact) do instance_spy(Facter::LoadedFact, name: 'os.name', klass: nil, type: :external, is_env: true) end before do Singleton.__init__(Facter::FactLoader) allow(Facter::InternalFactLoader).to receive(:new).and_return(internal_fact_loader_double) allow(Facter::ExternalFactLoader).to receive(:new).and_return(external_fact_loader_double) end it 'loads all internal facts' do options = { user_query: true } facts_to_load = [loaded_fact_os_name, loaded_fact_networking] allow(internal_fact_loader_double).to receive(:facts).and_return(facts_to_load) allow(external_fact_loader_double).to receive(:custom_facts).and_return([]) allow(external_fact_loader_double).to receive(:external_facts).and_return([]) loaded_facts = Facter::FactLoader.instance.load(options[:user_query], options) expect(loaded_facts).to eq(facts_to_load) end it 'loads core facts' do options = {} facts_to_load = [loaded_fact_os_name] allow(internal_fact_loader_double).to receive(:core_facts).and_return(facts_to_load) allow(external_fact_loader_double).to receive(:custom_facts).and_return([]) allow(external_fact_loader_double).to receive(:external_facts).and_return([]) loaded_facts = Facter::FactLoader.instance.load(nil, options) expect(loaded_facts).to eq(facts_to_load) end it 'blocks one internal fact' do options = { blocked_facts: ['os.name'] } facts_to_load = [loaded_fact_os_name, loaded_fact_os_name_legacy] allow(internal_fact_loader_double).to receive(:core_facts).and_return(facts_to_load) allow(external_fact_loader_double).to receive(:custom_facts).and_return([]) allow(external_fact_loader_double).to receive(:external_facts).and_return([]) loaded_facts = Facter::FactLoader.instance.load(nil, options) expect(loaded_facts.size).to eq(0) end it 'blocks one legacy fact' do options = { blocked_facts: ['operatingsystem'] } facts_to_load = [loaded_fact_os_name, loaded_fact_os_name_legacy] allow(internal_fact_loader_double).to receive(:core_facts).and_return(facts_to_load) allow(external_fact_loader_double).to receive(:custom_facts).and_return([]) allow(external_fact_loader_double).to receive(:external_facts).and_return([]) loaded_facts = Facter::FactLoader.instance.load(nil, options) expect(loaded_facts.size).to eq(1) end context 'when blocking custom facts' do before do facts_to_load = [loaded_fact_custom_fact] allow(internal_fact_loader_double).to receive(:core_facts).and_return([]) allow(external_fact_loader_double).to receive(:custom_facts).and_return(facts_to_load) allow(external_fact_loader_double).to receive(:external_facts).and_return([]) end it 'blocks one custom fact' do options = { custom_facts: true, blocked_facts: ['custom_fact'] } loaded_facts = Facter::FactLoader.instance.load(nil, options) expect(loaded_facts.size).to eq(0) end end it 'loads the same amount of core facts everytime' do options = { user_query: true } facts_to_load = [loaded_fact_os_name, loaded_fact_networking] allow(internal_fact_loader_double).to receive(:facts).and_return(facts_to_load) allow(external_fact_loader_double).to receive(:custom_facts).and_return([]) allow(external_fact_loader_double).to receive(:external_facts).and_return([]) loaded_facts1 = Facter::FactLoader.instance.load(options[:user_query], options) loaded_facts2 = Facter::FactLoader.instance.load(options[:user_query], options) expect(loaded_facts1).to eq(loaded_facts2) end it 'loads the same amount of custom facts everytime' do options = { blocked_facts: ['os.name'], custom_facts: true } facts_to_load = [loaded_fact_os_name] allow(internal_fact_loader_double).to receive(:core_facts).and_return(facts_to_load) allow(external_fact_loader_double).to receive(:custom_facts).and_return(facts_to_load) allow(external_fact_loader_double).to receive(:external_facts).and_return([]) loaded_facts1 = Facter::FactLoader.instance.load(nil, options) loaded_facts2 = Facter::FactLoader.instance.load(nil, options) expect(loaded_facts1).to eq(loaded_facts2) end it 'env facts override core facts' do options = { external_facts: true } allow(internal_fact_loader_double).to receive(:core_facts).and_return([loaded_fact_os_name]) allow(external_fact_loader_double).to receive(:custom_facts).and_return([]) allow(external_fact_loader_double).to receive(:external_facts).and_return([loaded_env_custom_fact]) loaded_facts = Facter::FactLoader.instance.load(nil, options) expect(loaded_facts).to be_an_instance_of(Array).and contain_exactly( loaded_env_custom_fact ) end context 'when blocking legacy group' do before do facts_to_load = [loaded_fact_os_name_legacy] allow(internal_fact_loader_double).to receive(:core_facts).and_return(facts_to_load) allow(external_fact_loader_double).to receive(:custom_facts).and_return([]) allow(external_fact_loader_double).to receive(:external_facts).and_return([]) end let(:options) { { block_list: 'legacy' } } it 'blocks legacy facts' do loaded_facts = Facter::FactLoader.instance.load(nil, options) expect(loaded_facts).to be_empty end end end end puppetlabs-facter-dfe6df4/spec/framework/core/fact_loaders/internal_fact_loader_spec.rb000066400000000000000000000173431470204764400317420ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::InternalFactLoader do describe '#initialize' do subject(:internal_fact_loader) { Facter::InternalFactLoader.new } let(:os_detector_mock) { instance_spy(OsDetector) } let(:class_discoverer_mock) { instance_spy(Facter::ClassDiscoverer) } before do allow(os_detector_mock).to receive(:hierarchy).and_return([:Linux]) allow(OsDetector).to receive(:instance).and_return(os_detector_mock) end context 'when loading one legacy fact' do before do allow(os_detector_mock).to receive(:hierarchy).and_return([:Windows]) allow(OsDetector).to receive(:instance).and_return(os_detector_mock) allow(class_discoverer_mock) .to receive(:discover_classes) .with(:Windows) .and_return([Facts::Windows::NetworkInterfaces]) allow(Facter::ClassDiscoverer).to receive(:instance).and_return(class_discoverer_mock) stub_const('Facts::Windows::NetworkInterfaces::FACT_NAME', 'network_.*') end it 'loads no core facts' do expect(internal_fact_loader.core_facts).to be_empty end it 'loads one legacy fact' do expect(internal_fact_loader.legacy_facts.size).to eq(1) end it 'loads one fact with :legacy type' do expect(internal_fact_loader.legacy_facts.first.type).to eq(:legacy) end end context 'when loading one core fact' do before do allow(class_discoverer_mock) .to receive(:discover_classes) .with(:Linux) .and_return([Facts::Linux::Path]) allow(Facter::ClassDiscoverer).to receive(:instance).and_return(class_discoverer_mock) stub_const('Facts::Linux::Path::FACT_NAME', 'path') end it 'loads no legacy facts' do expect(internal_fact_loader.legacy_facts).to be_empty end it 'loads one core fact' do expect(internal_fact_loader.core_facts.size).to eq(1) end it 'loads one fact with :core type' do expect(internal_fact_loader.core_facts.first.type).to eq(:core) end end context 'when loading one legacy fact and one core fact' do before do allow(os_detector_mock).to receive(:hierarchy).and_return([:Windows]) allow(OsDetector).to receive(:instance).and_return(os_detector_mock) allow(class_discoverer_mock) .to receive(:discover_classes) .with(:Windows) .and_return([Facts::Windows::NetworkInterfaces, Facts::Windows::Path]) allow(Facter::ClassDiscoverer).to receive(:instance).and_return(class_discoverer_mock) stub_const('Facts::Windows::NetworkInterface::FACT_NAME', 'network_.*') stub_const('Facts::Windows::OsName::FACT_NAME', 'path') end it 'loads two facts' do expect(internal_fact_loader.facts.size).to eq(2) end it 'loads one legacy fact' do expect(internal_fact_loader.facts.count { |lf| lf.type == :legacy }).to eq(1) end it 'loads one core fact' do expect(internal_fact_loader.facts.count { |lf| lf.type == :core }).to eq(1) end end context 'when loading no facts' do before do allow(class_discoverer_mock) .to receive(:discover_classes) .with(:Linux) .and_return([]) allow(Facter::ClassDiscoverer).to receive(:instance).and_return(class_discoverer_mock) end it 'loads no facts' do expect(internal_fact_loader.facts).to be_empty end end context 'when loading hierarchy of facts' do before do allow(os_detector_mock).to receive(:hierarchy).and_return(%i[Linux Rhel]) allow(OsDetector).to receive(:instance).and_return(os_detector_mock) allow(class_discoverer_mock) .to receive(:discover_classes) .with(:Linux) .and_return([Facts::Linux::Os::Family]) allow(class_discoverer_mock) .to receive(:discover_classes) .with(:Rhel) .and_return([Facts::Rhel::Os::Family]) allow(Facter::ClassDiscoverer).to receive(:instance).and_return(class_discoverer_mock) stub_const('Facts::Linux::Path::FACT_NAME', 'os.family') stub_const('Facts::Rhel::Path::FACT_NAME', 'os.family') end it 'loads one fact' do core_facts = internal_fact_loader.facts.select { |loaded_fact| loaded_fact.type == :core } expect(core_facts.size).to eq(1) end it 'loads os.family fact' do core_facts = internal_fact_loader.facts.select { |loaded_fact| loaded_fact.type == :core } expect(core_facts.first.name).to eq('os.family') end it 'loads only Rhel path' do core_facts = internal_fact_loader.facts.select { |loaded_fact| loaded_fact.type == :core } expect(core_facts.first.klass).to eq(Facts::Rhel::Os::Family) end end context 'when loading fact with aliases' do before do allow(class_discoverer_mock) .to receive(:discover_classes) .with(:Linux) .and_return([Facts::Linux::Os::Name]) allow(Facter::ClassDiscoverer).to receive(:instance).and_return(class_discoverer_mock) stub_const('Facts::Linux::Os::Name::FACT_NAME', 'os.name') stub_const('Facts::Linux::Os::Name::ALIASES', 'operatingsystem') end it 'loads two facts' do expect(internal_fact_loader.facts.size).to eq(2) end it 'loads one core fact' do expect(internal_fact_loader.core_facts.size).to eq(1) end it 'loads one legacy fact' do expect(internal_fact_loader.legacy_facts.size).to eq(1) end it 'loads a core fact with the fact name' do expect(internal_fact_loader.core_facts.first.name).to eq('os.name') end it 'loads a legacy fact with the alias name' do expect(internal_fact_loader.legacy_facts.first.name).to eq('operatingsystem') end end context 'when loading wildcard facts' do before do allow(os_detector_mock).to receive(:hierarchy).and_return([:Windows]) allow(OsDetector).to receive(:instance).and_return(os_detector_mock) allow(class_discoverer_mock) .to receive(:discover_classes) .with(:Windows) .and_return([Facts::Windows::NetworkInterfaces]) allow(Facter::ClassDiscoverer).to receive(:instance).and_return(class_discoverer_mock) stub_const('Facts::Windows::NetworkInterfaces::FACT_NAME', 'network_.*') end it 'loads one fact' do expect(internal_fact_loader.facts.size).to eq(1) end it 'loads one legacy fact' do expect(internal_fact_loader.legacy_facts.size).to eq(1) end it 'contains a wildcard at the end' do expect(internal_fact_loader.legacy_facts.first.name).to end_with('.*') end it 'loads no core facts' do expect(internal_fact_loader.core_facts).to be_empty end end context 'when loading legacy fact without wildcard' do before do allow(class_discoverer_mock) .to receive(:discover_classes) .with(:Linux) .and_return([Facts::Debian::Lsbdistid]) allow(Facter::ClassDiscoverer).to receive(:instance).and_return(class_discoverer_mock) stub_const('Facts::Debian::Lsbdistid::FACT_NAME', 'lsbdistid') end it 'loads one fact' do expect(internal_fact_loader.facts.size).to eq(1) end it 'loads one legacy fact' do expect(internal_fact_loader.legacy_facts.size).to eq(1) end it 'does not contain a wildcard at the end' do expect(internal_fact_loader.legacy_facts.first.name).not_to end_with('.*') end it 'loads no core facts' do expect(internal_fact_loader.core_facts).to be_empty end end end end puppetlabs-facter-dfe6df4/spec/framework/core/fact_manager_spec.rb000066400000000000000000000361511470204764400255620ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::FactManager do let(:internal_manager) { instance_spy(Facter::InternalFactManager) } let(:external_manager) { instance_spy(Facter::ExternalFactManager) } let(:cache_manager) { instance_spy(Facter::CacheManager) } let(:fact_loader) { instance_double(Facter::FactLoader) } let(:logger) { instance_spy(Facter::Log) } def stub_query_parser(withs, returns) allow(Facter::QueryParser).to receive(:parse).with(*withs).and_return(returns) end def stub_internal_manager(withs, returns) allow(internal_manager).to receive(:resolve_facts).with(withs).and_return(returns) end def stub_external_manager(withs, returns) allow(external_manager).to receive(:resolve_facts).with(withs).and_return(returns) end def stub_cache_manager(withs, returns) allow(cache_manager).to receive(:resolve_facts).with(withs).and_return([withs, Array(returns)]) allow(cache_manager).to receive(:cache_facts) end before do Singleton.__init__(Facter::FactManager) Singleton.__init__(Facter::FactLoader) allow(Facter::Log).to receive(:new).and_return(logger) allow(Facter::InternalFactManager).to receive(:new).and_return(internal_manager) allow(Facter::ExternalFactManager).to receive(:new).and_return(external_manager) allow(Facter::CacheManager).to receive(:new).and_return(cache_manager) allow(Facter::FactLoader).to receive(:new).and_return(fact_loader) end describe '#resolve_facts' do let(:os) { 'os' } let(:os_klass) { instance_double(Facts::Linux::Os::Name) } let(:user_query) { [] } let(:loaded_facts) do [ instance_double(Facter::LoadedFact, name: 'os.name', klass: os_klass, type: :core), instance_double(Facter::LoadedFact, name: 'custom_fact', klass: nil, type: :custom) ] end let(:searched_facts) do [ instance_double( Facter::SearchedFact, name: os, fact_class: os_klass, user_query: '', type: :core ), instance_double( Facter::SearchedFact, name: 'my_custom_fact', fact_class: nil, user_query: '', type: :custom ) ] end let(:resolved_fact) { mock_resolved_fact(os, 'Ubuntu', os) } before do allow(Facter::FactLoader.instance).to receive(:load).and_return(loaded_facts) stub_query_parser([user_query, loaded_facts], searched_facts) stub_internal_manager(searched_facts, [resolved_fact]) stub_external_manager(searched_facts, nil) stub_cache_manager(searched_facts, []) end it 'resolved all facts' do resolved_facts = Facter::FactManager.instance.resolve_facts(user_query) expect(resolved_facts).to eq([resolved_fact]) end end describe '#resolve_fact' do context 'with custom fact' do let(:user_query) { 'custom_fact' } let(:fact_name) { 'custom_fact' } let(:custom_fact) { instance_double(Facter::LoadedFact, name: fact_name, klass: nil, type: :custom) } let(:loaded_facts) { [custom_fact] } let(:searched_facts) do [ instance_double( Facter::SearchedFact, name: fact_name, fact_class: nil, user_query: '', type: :custom ) ] end let(:resolved_fact) { mock_resolved_fact(fact_name, 'custom', fact_name, :custom) } let(:cached_fact) { mock_resolved_fact(fact_name, 'cached_custom', fact_name, :custom) } context 'when is found in custom_dir/fact_name.rb' do before do # mock custom_fact_by_filename to return resolved_fact allow(fact_loader).to receive(:load_custom_fact).and_return(loaded_facts) stub_query_parser([[user_query], loaded_facts], searched_facts) stub_internal_manager(searched_facts, [resolved_fact]) stub_external_manager(searched_facts, [resolved_fact]) stub_cache_manager(searched_facts, []) # mock core_or_external_fact to return nil allow(fact_loader).to receive(:load_internal_facts).and_return([]) allow(fact_loader).to receive(:load_external_facts).and_return([]) stub_query_parser([[user_query], []], []) stub_internal_manager([], []) stub_external_manager([], []) stub_cache_manager([], []) end it 'tries to load it from fact_name.rb' do Facter::FactManager.instance.resolve_fact(user_query) expect(logger).to have_received(:debug) .with("Searching fact: #{user_query} in file: #{user_query}.rb") end it 'loads core and external facts' do Facter::FactManager.instance.resolve_fact(user_query) expect(logger).to have_received(:debug) .with("Searching fact: #{user_query} in core facts and external facts") end it 'does not load all custom facts' do Facter::FactManager.instance.resolve_fact(user_query) expect(logger).not_to have_received(:debug) .with("Searching fact: #{user_query} in all custom facts") end it 'resolves fact' do resolved_facts = Facter::FactManager.instance.resolve_fact(user_query) expect(resolved_facts).to eql([resolved_fact]) end end context 'when is not found in custom_dir/fact_name.rb' do before do # mock custom_fact_by_filename to return nil allow(fact_loader).to receive(:load_custom_fact).and_return([]) stub_query_parser([[user_query], []], []) stub_external_manager(searched_facts, []) stub_cache_manager([], []) # mock core_or_external_fact to return nil allow(fact_loader).to receive(:load_internal_facts).and_return([]) allow(fact_loader).to receive(:load_external_facts).and_return([]) stub_query_parser([[user_query], []], []) stub_internal_manager([], []) stub_external_manager([], []) stub_cache_manager([], []) # mock all_custom_facts to return resolved_fact allow(fact_loader).to receive(:load_custom_facts).and_return(loaded_facts) stub_query_parser([[user_query], loaded_facts], searched_facts) stub_external_manager(searched_facts, [resolved_fact]) stub_cache_manager(searched_facts, []) end it 'tries to load it from fact_name.rb' do Facter::FactManager.instance.resolve_fact(user_query) expect(logger).to have_received(:debug) .with("Searching fact: #{user_query} in file: #{user_query}.rb") end it 'loads core and external facts' do Facter::FactManager.instance.resolve_fact(user_query) expect(logger).to have_received(:debug) .with("Searching fact: #{user_query} in core facts and external facts") end it 'loads all custom facts' do Facter::FactManager.instance.resolve_fact(user_query) expect(logger).to have_received(:debug) .with("Searching fact: #{user_query} in all custom facts") end it 'resolves fact' do resolved_facts = Facter::FactManager.instance.resolve_fact(user_query) expect(resolved_facts).to eql([resolved_fact]) end end context 'when fact is cached' do before do # mock custom_fact_by_filename to return cached_fact allow(fact_loader).to receive(:load_custom_fact).and_return(loaded_facts) stub_query_parser([[user_query], loaded_facts], searched_facts) stub_internal_manager(searched_facts, []) stub_external_manager(searched_facts, []) stub_cache_manager(searched_facts, cached_fact) # mock core_or_external_fact to return nil allow(fact_loader).to receive(:load_internal_facts).and_return([]) allow(fact_loader).to receive(:load_external_facts).and_return([]) stub_query_parser([[user_query], []], []) stub_internal_manager([], []) stub_external_manager([], []) stub_cache_manager([], []) end it 'returns the cached fact' do resolved_facts = Facter::FactManager.instance.resolve_fact(user_query) expect(resolved_facts).to eql([cached_fact]) end end end context 'with core fact' do let(:user_query) { 'os.name' } let(:os_klass) { instance_double(Facts::Linux::Os::Name) } let(:bool_klass) { instance_double(Facts::Linux::FipsEnabled) } let(:nil_klass) { instance_double(Facts::Linux::Virtual) } let(:core_fact) { instance_double(Facter::LoadedFact, name: 'os.name', klass: os_klass, type: :core) } let(:bool_core_fact) { instance_double(Facter::LoadedFact, name: 'fips_enabled', klass: bool_klass, type: :core) } let(:nil_core_fact) { instance_double(Facter::LoadedFact, name: 'virtual', klass: nil_klass, type: :core) } let(:loaded_facts) { [core_fact, bool_core_fact, nil_core_fact] } let(:searched_facts) do [ instance_double( Facter::SearchedFact, name: 'os', fact_class: os_klass, user_query: '', type: :core ), instance_double( Facter::SearchedFact, name: 'fips_enabled', fact_class: bool_klass, user_query: '', type: :core ), instance_double( Facter::SearchedFact, name: 'virtual', fact_class: nil_klass, user_query: '', type: :core ) ] end let(:resolved_fact) { mock_resolved_fact('os.name', 'darwin', 'os.name', :core) } before do # mock custom_fact_by_filename to return nil allow(fact_loader).to receive(:load_custom_fact).and_return([]) stub_query_parser([[user_query], []], []) stub_external_manager(searched_facts, []) stub_cache_manager([], []) # mock core_or_external_fact to return the core resolved_fact allow(fact_loader).to receive(:load_internal_facts).and_return(loaded_facts) allow(fact_loader).to receive(:load_external_facts).and_return([]) stub_query_parser([[user_query], loaded_facts], searched_facts) stub_internal_manager(searched_facts, [resolved_fact]) stub_external_manager([], []) stub_cache_manager(searched_facts, []) end it 'tries to load it from fact_name.rb' do Facter::FactManager.instance.resolve_fact(user_query) expect(logger).to have_received(:debug) .with("Searching fact: #{user_query} in file: #{user_query}.rb") end it 'loads core and external facts' do Facter::FactManager.instance.resolve_fact(user_query) expect(logger).to have_received(:debug) .with("Searching fact: #{user_query} in core facts and external facts") end it 'does not load all custom facts' do Facter::FactManager.instance.resolve_fact(user_query) expect(logger).not_to have_received(:debug) .with("Searching fact: #{user_query} in all custom facts") end it 'resolves fact' do resolved_facts = Facter::FactManager.instance.resolve_fact(user_query) expect(resolved_facts).to eql([resolved_fact]) end context 'when nil' do let(:user_query) { 'virtual' } let(:resolved_fact) { mock_resolved_fact('virtual', nil, 'virtual', :core) } before do # mock all custom facts to return [] allow(fact_loader).to receive(:load_custom_facts).and_return([]) end it 'does not resolve fact' do resolved_facts = Facter::FactManager.instance.resolve_fact(user_query) expect(resolved_facts).to be_empty end end context 'when boolean false' do let(:user_query) { 'fips_enabled' } let(:resolved_fact) { mock_resolved_fact('fips_enabled', false, 'fips_enabled', :core) } it 'resolves fact to false' do resolved_facts = Facter::FactManager.instance.resolve_fact(user_query) expect(resolved_facts.first.value).to be(false) end end end context 'with non existent fact' do let(:user_query) { 'non_existent' } let(:fact_name) { 'non_existent' } let(:custom_fact) { instance_double(Facter::LoadedFact, name: 'custom_fact', klass: nil, type: :custom) } let(:loaded_facts) { [custom_fact] } let(:resolved_fact) { mock_resolved_fact(fact_name, 'custom', fact_name, :custom) } before do # mock custom_fact_by_filename to return nil allow(fact_loader).to receive(:load_custom_fact).and_return([]) stub_query_parser([[user_query], []], []) stub_external_manager([], []) stub_cache_manager([], []) # mock core_or_external_fact to return nil allow(fact_loader).to receive(:load_internal_facts).and_return([]) allow(fact_loader).to receive(:load_external_facts).and_return([]) stub_query_parser([[user_query], []], []) stub_internal_manager([], []) stub_external_manager([], []) stub_cache_manager([], []) # mock all_custom_facts to return nil allow(fact_loader).to receive(:load_custom_facts).and_return([]) stub_query_parser([[user_query], []], []) stub_external_manager([], []) stub_cache_manager([], []) end it 'tries to load it from fact_name.rb' do Facter::FactManager.instance.resolve_fact(user_query) expect(logger).to have_received(:debug) .with("Searching fact: #{user_query} in file: #{user_query}.rb") end it 'loads core and external facts' do Facter::FactManager.instance.resolve_fact(user_query) expect(logger).to have_received(:debug) .with("Searching fact: #{user_query} in core facts and external facts") end it 'loads all custom facts' do Facter::FactManager.instance.resolve_fact(user_query) expect(logger).to have_received(:debug) .with("Searching fact: #{user_query} in all custom facts") end it 'resolves fact' do resolved_facts = Facter::FactManager.instance.resolve_fact(user_query) expect(resolved_facts).to eql([]) end end end describe '#resolve_core' do let(:user_query) { [] } let(:ubuntu_os_name) { class_double(Facts::Linux::Os::Name) } let(:loaded_facts) do instance_double(Facter::LoadedFact, name: 'os.name', klass: ubuntu_os_name, type: :core) end let(:searched_fact) do instance_double( Facter::SearchedFact, name: 'os', fact_class: ubuntu_os_name, user_query: '', type: :core ) end let(:resolved_fact) { mock_resolved_fact('os', 'Ubuntu', 'os') } it 'resolves all core facts' do allow(fact_loader).to receive(:load_internal_facts).and_return(loaded_facts) allow(fact_loader).to receive(:internal_facts).and_return(loaded_facts) allow(fact_loader).to receive(:load_external_facts).and_return([]) stub_query_parser([user_query, loaded_facts], [searched_fact]) stub_internal_manager([searched_fact], [resolved_fact]) stub_cache_manager([searched_fact], []) resolved_facts = Facter::FactManager.instance.resolve_core(user_query) expect(resolved_facts).to eq([resolved_fact]) end end end puppetlabs-facter-dfe6df4/spec/framework/core/options/000077500000000000000000000000001470204764400233015ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/framework/core/options/option_store_spec.rb000066400000000000000000000230021470204764400273610ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::OptionStore do subject(:option_store) { Facter::OptionStore } before do option_store.reset end after do option_store.reset end describe '#all' do it 'returns default values' do expect(option_store.all).to eq( debug: false, verbose: false, log_level: :warn, show_legacy: true, custom_facts: true, blocked_facts: [], ruby: true, external_facts: true, config: nil, strict: false, json: false, hocon: false, cache: true, yaml: false, puppet: false, ttls: [], block: true, cli: nil, config_file_custom_dir: [], config_file_external_dir: [], default_external_dir: [], fact_groups: {}, sequential: true, block_list: {}, color: true, trace: false, timing: false, external_dir: [], custom_dir: [], allow_external_loggers: true, force_dot_resolution: false, http_debug: false ) end end describe '#no_ruby=' do context 'when false' do before do option_store.no_ruby = false end it 'sets ruby to true' do expect(option_store.ruby).to be true end end context 'when true' do before do option_store.no_ruby = true end it 'sets ruby to false' do expect(option_store.ruby).to be false end it 'sets custom facts to false' do expect(option_store.custom_facts).to be false end it 'adds ruby to blocked facts' do expect(option_store.blocked_facts).to include('ruby') end end end describe '#no_block' do context 'when true' do before do option_store.no_block = true end it 'sets block to false' do expect(option_store.block).to be false end end context 'when false' do before do option_store.no_block = false end it 'sets block to true' do expect(option_store.block).to be true end end end describe '#no_cache' do context 'when true' do before do option_store.no_cache = true end it 'sets block to false' do expect(option_store.cache).to be false end end context 'when false' do before do option_store.no_cache = false end it 'sets cache to true' do expect(option_store.cache).to be true end end end describe '#no_color' do context 'when true' do before do option_store.no_color = true end it 'sets color to false' do expect(option_store.color).to be false end end context 'when false' do before do option_store.no_color = false end it 'sets color to true' do expect(option_store.color).to be true end end end describe '#external_dir' do context 'with external_dir with values' do before do option_store.external_dir = ['external_dir_path'] end it 'returns external_dir' do expect(option_store.external_dir).to eq(['external_dir_path']) end end context 'with @no_external_facts true' do before do option_store.no_external_facts = true end it 'returns external dir' do expect(option_store.external_dir).to be_empty end end context 'with @no_external_facts false and external_dir empty' do before do option_store.no_external_facts = false option_store.external_dir = [] end context 'with @config_file_external_dir empty' do before do option_store.config_file_external_dir = [] option_store.default_external_dir = ['/default_path'] end it 'returns default dir' do expect(option_store.external_dir).to eq(['/default_path']) end end context 'with @config_file_external_dir with values' do before do option_store.config_file_external_dir = ['/path_from_config_file'] end it 'returns default dir' do expect(option_store.external_dir).to eq(['/path_from_config_file']) end end end end describe '#blocked_facts=' do context 'with empty array' do it 'does not override existing array' do option_store.blocked_facts = ['os'] option_store.blocked_facts = [] expect(option_store.blocked_facts).to eq(['os']) end end context 'with array' do it 'appends dirs' do option_store.blocked_facts = ['os'] option_store.blocked_facts = ['os2'] expect(option_store.blocked_facts).to eq(%w[os os2]) end end end describe '#custom_dir' do context 'when @custom_dir has values' do before do option_store.custom_dir = ['/custom_dir_path'] end it 'returns custom_dir' do expect(option_store.custom_dir).to eq(['/custom_dir_path']) end end context 'when @custom_dir is empty' do before do option_store.custom_dir = [] option_store.config_file_custom_dir = ['/path_from_config_file'] end it 'returns config_file_custom_dir' do expect(option_store.custom_dir).to eq(['/path_from_config_file']) end end end describe '#custom_dir=' do context 'with array' do it 'overrides dirs' do option_store.custom_dir = ['/customdir1'] option_store.custom_dir = ['/customdir2'] expect(option_store.custom_dir).to eq(['/customdir2']) end it 'sets ruby to true' do option_store.instance_variable_set(:@ruby, false) expect do option_store.custom_dir = ['/customdir1'] end.to change(option_store, :ruby) .from(false).to(true) end end end describe '#debug' do before do allow(Facter::Log).to receive(:level=).with(level) end context 'when true' do let(:level) { :debug } it 'sets debug to true and log_level to :debug' do expect do option_store.debug = true end.to change(option_store, :log_level) .from(:warn).to(:debug) end end context 'when false' do let(:level) { :warn } it 'sets log_level to default (:warn)' do option_store.instance_variable_set(:@log_level, :info) expect do option_store.debug = false end.to change(option_store, :log_level) .from(:info).to(:warn) end end end describe '#verbose=' do before do allow(Facter::Log).to receive(:level=).with(level) end context 'when true' do let(:level) { :info } it 'sets log_level to :info' do expect do option_store.verbose = true end.to change(option_store, :log_level) .from(:warn).to(:info) end end context 'when false' do let(:level) { :warn } it 'sets log_level to default (:warn)' do option_store.instance_variable_set(:@log_level, :debug) expect do option_store.debug = false end.to change(option_store, :log_level) .from(:debug).to(:warn) end end end describe '#no_custom_facts=' do context 'when false' do it 'sets ruby to true' do option_store.instance_variable_set(:@ruby, false) expect do option_store.no_custom_facts = false end.to change(option_store, :ruby) .from(false).to(true) end end end describe '#log_level=' do let(:facter_log) { class_spy('Facter::Log') } before do stub_const('Facter::Log', facter_log) allow(Facter).to receive(:trace) end context 'when :trace' do it 'sets log_level to :debug' do expect do option_store.log_level = :trace end.to change(option_store, :log_level) .from(:warn).to(:debug) end end context 'when :debug' do it 'sets logl_level :debug' do expect do option_store.log_level = :debug end.to change(option_store, :log_level) .from(:warn).to(:debug) end end context 'when :info' do it 'sets log_level to :info' do expect do option_store.log_level = :info end.to change(option_store, :log_level) .from(:warn).to(:info) end end end describe '#show_legacy=' do context 'when true' do it 'sets ruby to true' do option_store.instance_variable_set(:@ruby, false) expect do option_store.show_legacy = true end.to change(option_store, :ruby) .from(false).to(true) end end context 'when false' do it 'sets show_legacy to false' do option_store.show_legacy = false expect(option_store.show_legacy).to be false end end end describe '#send' do it 'sets values for attributes' do option_store.instance_variable_set(:@strict, true) expect do option_store.set('strict', false) end.to change(option_store, :strict) .from(true).to(false) end end describe '#reset' do before do allow(Facter::Log).to receive(:level=).with(:debug) end it 'resets to default' do default = option_store.all option_store.cli = true option_store.log_level = :debug option_store.show_legacy = false option_store.external_dir = ['external_dir_path'] option_store.reset expect(option_store.all).to eq(default) end end end puppetlabs-facter-dfe6df4/spec/framework/core/options/options_validator_spec.rb000066400000000000000000000052201470204764400303770ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::OptionsValidator do describe '#validate' do let(:logger) { instance_spy(Facter::Log) } before do allow(Facter::Log).to receive(:new).and_return(logger) end context 'when CLI options are invalid pairs' do let(:options) { ['--puppet', '--no-ruby'] } let(:error_code) { 1 } it 'writes message and exit' do allow(logger).to receive(:error).with('--puppet and --no-ruby options conflict:'\ ' please specify only one.', true) allow(Facter::Cli).to receive(:start).with(['--help']) expect { Facter::OptionsValidator.validate(options) }.to raise_error( an_instance_of(SystemExit) .and(having_attributes(status: error_code)) ) end end context 'when config file options are invalid pairs' do let(:error_code) { 1 } it 'writes message and exit' do expect do expect do Facter::Options.init_from_cli(config: 'spec/fixtures/invalid_option_pairs.conf') end.to raise_error( an_instance_of(SystemExit) .and(having_attributes(status: error_code)) ) end.to output(/Usage/).to_stdout end end context 'when options are duplicated' do let(:options) { ['--puppet', '-p'] } let(:error_code) { 1 } it 'writes message and exit' do allow(logger).to receive(:error).with('option --puppet '\ 'cannot be specified more than once.', true) allow(Facter::Cli).to receive(:start).with(['--help']) expect { Facter::OptionsValidator.validate(options) }.to raise_error( an_instance_of(SystemExit) .and(having_attributes(status: error_code)) ) end end context 'when options are valid' do let(:options) { ['--puppet', '--no-external-facts'] } it 'writes message and exit' do expect { Facter::OptionsValidator.validate(options) }.not_to raise_error end end context 'when parsing resolved options' do # rubocop:disable Style/BlockDelimiters let(:options) { { puppet: true, external_facts: false, external_dir: Facter::OptionStore.default_external_dir + [''], ruby: true, custom_facts: true } } # rubocop:enable Style/BlockDelimiters it 'writes message and exit' do stub_const('Puppet', { pluginfactdest: '' }) expect { Facter::OptionsValidator.validate_configs(options) }.not_to raise_error end end end end puppetlabs-facter-dfe6df4/spec/framework/core/options_spec.rb000066400000000000000000000070351470204764400246450ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Options do subject(:options) { Facter::Options } describe '#init_from_cli' do let(:option_store) { class_spy('Facter::OptionStore') } let(:config_file_options) { class_spy('Facter::ConfigFileOptions') } let(:options_validator) { class_spy('Facter::OptionsValidator') } before do stub_const('Facter::ConfigFileOptions', config_file_options) stub_const('Facter::OptionStore', option_store) stub_const('Facter::OptionsValidator', options_validator) allow(config_file_options).to receive(:get).and_return({}) end it 'calls OptionStore with cli' do Facter::Options.init_from_cli expect(option_store).to have_received(:cli=).with(true) end it 'calls OptionStore with show_legacy' do Facter::Options.init_from_cli expect(option_store).to have_received(:show_legacy=).with(false) end context 'with config_file' do let(:config_file_opts) { { 'debug' => true, 'ruby' => true } } before do allow(config_file_options).to receive(:get).and_return(config_file_opts) end it 'calls ConfigFileOptions.init with config_path' do Facter::Options.init_from_cli(config: 'path/to/config') expect(config_file_options).to have_received(:init).with('path/to/config') end it 'calls OptionStore.set.init with cli_options' do Facter::Options.init_from_cli config_file_opts.each do |key, value| expect(option_store).to have_received(:set).with(key, value) end end end context 'with cli_options' do let(:cli_options) { { 'debug' => true, 'ruby' => true } } it 'calls OptionStore.set.init with cli_options' do Facter::Options.init_from_cli(cli_options) cli_options.each do |key, value| expect(option_store).to have_received(:set).with(key, value) end end context 'with log_level as option' do it 'munges the value none to unknown' do Facter::Options.init_from_cli({ 'log_level' => 'none' }) expect(option_store).to have_received(:set).with('log_level', 'unknown') end it 'munges the value log_level to empty string' do Facter::Options.init_from_cli({ 'log_level' => 'log_level' }) expect(option_store).to have_received(:set).with('log_level', '') end it 'leaves known log level unmunged' do Facter::Options.init_from_cli({ 'log_level' => 'debug' }) expect(option_store).to have_received(:set).with('log_level', 'debug') end end end end describe '#init' do let(:option_store) { class_spy('Facter::OptionStore') } let(:config_file_options) { class_spy('Facter::ConfigFileOptions') } before do stub_const('Facter::ConfigFileOptions', config_file_options) stub_const('Facter::OptionStore', option_store) allow(config_file_options).to receive(:get).and_return({}) end it 'calls OptionStore with cli' do Facter::Options.init expect(option_store).to have_received(:cli=).with(false) end context 'with config_file' do let(:config_file_opts) { { 'debug' => true, 'ruby' => true } } before do allow(config_file_options).to receive(:get).and_return(config_file_opts) end it 'calls OptionStore.set.init with cli_options' do Facter::Options.init config_file_opts.each do |key, value| expect(option_store).to have_received(:set).with(key, value) end end end end end puppetlabs-facter-dfe6df4/spec/framework/core/session_cache_spec.rb000066400000000000000000000005251470204764400257550ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::SessionCache do let(:uname_resolver) { Facter::Resolvers::Uname.new } it 'registers resolver subscription' do expect(uname_resolver.class).to receive(:invalidate_cache) Facter::SessionCache.subscribe(uname_resolver.class) Facter::SessionCache.invalidate_all_caches end end puppetlabs-facter-dfe6df4/spec/framework/detector/000077500000000000000000000000001470204764400224675ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/framework/detector/os_detector_spec.rb000066400000000000000000000172551470204764400263520ustar00rootroot00000000000000# frozen_string_literal: true require 'rbconfig' describe OsDetector do let(:os_hierarchy) { instance_spy(Facter::OsHierarchy) } let(:logger) { instance_spy(Facter::Log) } let(:initial_os) { RbConfig::CONFIG['host_os'] } before do RbConfig::CONFIG['host_os'] = initial_os Singleton.__init__(OsDetector) allow(Facter::Log).to receive(:new).and_return(logger) allow(Facter::OsHierarchy).to receive(:new).and_return(os_hierarchy) end after do RbConfig::CONFIG['host_os'] = initial_os end describe 'initialize' do context 'when os is macosx' do before do RbConfig::CONFIG['host_os'] = 'darwin' allow(os_hierarchy).to receive(:construct_hierarchy).with(:macosx).and_return(['macosx']) end it 'detects os as macosx' do expect(OsDetector.instance.identifier).to eq(:macosx) end it 'calls hierarchy construction with macosx identifier' do OsDetector.instance expect(os_hierarchy).to have_received(:construct_hierarchy).with(:macosx) end it 'construct hierarchy with darwin identifier' do expect(OsDetector.instance.hierarchy).to eq(['macosx']) end end context 'when os is windows' do before do RbConfig::CONFIG['host_os'] = 'mingw' allow(os_hierarchy).to receive(:construct_hierarchy).with(:windows).and_return(['windows']) end it 'detects os as windows' do expect(OsDetector.instance.identifier).to eq(:windows) end it 'calls hierarchy construction with windows identifier' do OsDetector.instance expect(os_hierarchy).to have_received(:construct_hierarchy).with(:windows) end it 'construct hierarchy with windows identifier' do expect(OsDetector.instance.hierarchy).to eq(['windows']) end end context 'when os is solaris' do before do RbConfig::CONFIG['host_os'] = 'solaris' allow(os_hierarchy).to receive(:construct_hierarchy).with(:solaris).and_return(['solaris']) end it 'detects os as solaris' do expect(OsDetector.instance.identifier).to eq(:solaris) end it 'calls hierarchy construction with solaris identifier' do OsDetector.instance expect(os_hierarchy).to have_received(:construct_hierarchy).with(:solaris) end it 'construct hierarchy with solaris identifier' do expect(OsDetector.instance.hierarchy).to eq(['solaris']) end end context 'when os is aix' do before do RbConfig::CONFIG['host_os'] = 'aix' allow(os_hierarchy).to receive(:construct_hierarchy).with(:aix).and_return(['aix']) end it 'detects os as aix' do expect(OsDetector.instance.identifier).to eq(:aix) end it 'calls hierarchy construction with aix identifier' do OsDetector.instance expect(os_hierarchy).to have_received(:construct_hierarchy).with(:aix) end it 'construct hierarchy with aix identifier' do expect(OsDetector.instance.hierarchy).to eq(['aix']) end end context 'when os cannot be detected' do before do RbConfig::CONFIG['host_os'] = 'my_custom_os' end it 'raises error if it could not detect os' do expect { OsDetector.instance.identifier }.to raise_error(RuntimeError, 'unknown os: "my_custom_os"') end end context 'when host_os is linux' do before do RbConfig::CONFIG['host_os'] = 'linux' # OS detected for Devuan and Arch Linux is special, so we need to explicitly stub it # See https://github.com/puppetlabs/facter/issues/2752 allow(File).to receive(:readable?).with('/etc/devuan_version').and_return(false) allow(File).to receive(:readable?).with('/etc/arch-release').and_return(false) allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:id) allow(Facter::Resolvers::RedHatRelease).to receive(:resolve).with(:id).and_return(:redhat) allow(Facter::Resolvers::SuseRelease).to receive(:resolve).with(:id) allow(os_hierarchy).to receive(:construct_hierarchy).with(:redhat).and_return(%w[linux redhat]) end it 'detects linux distro' do expect(OsDetector.instance.identifier).to be(:redhat) end it 'calls Facter::OsHierarchy with construct_hierarchy' do OsDetector.instance expect(os_hierarchy).to have_received(:construct_hierarchy).with(:redhat) end it 'calls Facter::Resolvers::OsRelease with id' do OsDetector.instance expect(Facter::Resolvers::OsRelease).to have_received(:resolve).with(:id) end it 'calls Facter::Resolvers::RedHatRelease with id' do OsDetector.instance expect(Facter::Resolvers::RedHatRelease).to have_received(:resolve).with(:id) end context 'when distribution is not known' do before do allow(Facter::Resolvers::RedHatRelease).to receive(:resolve).with(:id).and_return('my_linux_distro') allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:id_like).and_return(nil) allow(os_hierarchy).to receive(:construct_hierarchy).and_return([]) allow(os_hierarchy).to receive(:construct_hierarchy).with(:linux).and_return(['linux']) Singleton.__init__(OsDetector) end it 'falls back to linux' do expect(OsDetector.instance.identifier).to eq(:my_linux_distro) end context 'when no hierarchy for os identifier' do it 'logs debug message' do OsDetector.instance expect(logger) .to have_received(:debug) .with('Could not detect hierarchy using os identifier: my_linux_distro , trying with family') end end context 'when no os family detected' do it 'logs debug message' do OsDetector.instance expect(logger) .to have_received(:debug) .with('Could not detect hierarchy using family , falling back to Linux') end end it 'constructs hierarchy with linux' do expect(OsDetector.instance.hierarchy).to eq(['linux']) end context 'when family is known' do before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:id_like).and_return(:ubuntu) allow(os_hierarchy).to receive(:construct_hierarchy).with('ubuntu').and_return(%w[Linux Debian Ubuntu]) Singleton.__init__(OsDetector) end it 'constructs hierarchy with linux' do expect(OsDetector.instance.hierarchy).to eq(%w[Linux Debian Ubuntu]) end it 'logs debug message' do OsDetector.instance expect(logger) .to have_received(:debug) .with('Could not detect hierarchy using os identifier: my_linux_distro , trying with family') end end context 'when there are multiple families' do before do allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:id_like).and_return('Rhel centos fedora') allow(os_hierarchy).to receive(:construct_hierarchy).with('Rhel').and_return(%w[]) allow(os_hierarchy).to receive(:construct_hierarchy).with('centos').and_return(%w[Linux El]) Singleton.__init__(OsDetector) end it 'constructs hierarchy with linux and el' do expect(OsDetector.instance.hierarchy).to eq(%w[Linux El]) end it 'does not call construct hierarchy with fedora' do OsDetector.instance expect(os_hierarchy).not_to have_received(:construct_hierarchy).with('fedora') end end end end end end puppetlabs-facter-dfe6df4/spec/framework/detector/os_hierarchy_spec.rb000066400000000000000000000036411470204764400265110ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::OsHierarchy do subject(:os_hierarchy) { Facter::OsHierarchy.new } before do stub_const('Facter::Config::OS_HIERARCHY', JSON.parse(load_fixture('os_hierarchy').read)) allow(Facter::Log).to receive(:new).and_return(log) end let(:log) { instance_spy(Facter::Log) } describe '#construct_hierarchy' do context 'when searched_os is ubuntu' do it 'constructs hierarchy' do hierarchy = os_hierarchy.construct_hierarchy(:ubuntu) expect(hierarchy).to eq(%w[Linux Debian Ubuntu]) end end context 'when searched_os is debian' do it 'constructs hierarchy' do hierarchy = os_hierarchy.construct_hierarchy(:debian) expect(hierarchy).to eq(%w[Linux Debian]) end end context 'when searched_os is linux' do it 'constructs hierarchy' do hierarchy = os_hierarchy.construct_hierarchy(:linux) expect(hierarchy).to eq(%w[Linux]) end end context 'when there is no os hierarchy' do let(:my_os_name) { 'Myos' } before do stub_const('Facter::Config::OS_HIERARCHY', nil) end it 'returns the searched os as the hierarchy' do hierarchy = os_hierarchy.construct_hierarchy(:myos) expect(hierarchy).to eq([my_os_name]) end it 'logs debug message' do os_hierarchy.construct_hierarchy(:myos) expect(log).to have_received(:debug).with("There is no os_hierarchy, will fall back to: #{my_os_name}") end end context 'when searched_os is nil' do it 'constructs hierarchy' do hierarchy = os_hierarchy.construct_hierarchy(nil) expect(hierarchy).to eq([]) end end context 'when searched_os is not in hierarchy' do it 'constructs hierarchy' do hierarchy = os_hierarchy.construct_hierarchy(:my_os) expect(hierarchy).to eq([]) end end end end puppetlabs-facter-dfe6df4/spec/framework/formatters/000077500000000000000000000000001470204764400230445ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/framework/formatters/fact_formatter_spec.rb000066400000000000000000000012431470204764400274030ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::FormatterFactory do it 'creates a json formatter' do options = { json: true } json_fact_formatter = Facter::FormatterFactory.build(options) expect(json_fact_formatter).to be_a Facter::JsonFactFormatter end it 'creates a yaml formatter' do options = { yaml: true } json_fact_formatter = Facter::FormatterFactory.build(options) expect(json_fact_formatter).to be_a Facter::YamlFactFormatter end it 'creates a legacy formatter' do options = {} json_fact_formatter = Facter::FormatterFactory.build(options) expect(json_fact_formatter).to be_a Facter::LegacyFactFormatter end end puppetlabs-facter-dfe6df4/spec/framework/formatters/hocon_fact_formatter_spec.rb000066400000000000000000000051721470204764400305760ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::HoconFactFormatter do it 'formats to hocon when no user query' do resolved_fact1 = instance_double(Facter::ResolvedFact, name: 'os.name', value: 'Darwin', user_query: '', type: :core) resolved_fact2 = instance_double(Facter::ResolvedFact, name: 'os.family', value: 'Darwin', user_query: '', type: :core) resolved_fact3 = instance_double(Facter::ResolvedFact, name: 'os.architecture', value: 'x86_64', user_query: '', type: :core) resolved_fact_list = [resolved_fact1, resolved_fact2, resolved_fact3] formatted_output = Facter::HoconFactFormatter.new.format(resolved_fact_list) expected_output = "os={\n \s\sarchitecture=\"x86_64\"\n \s\sfamily=Darwin\n \s\sname=Darwin\n}\n" expect(formatted_output).to eq(expected_output) end it 'formats to hocon for a single user query' do resolved_fact = instance_double(Facter::ResolvedFact, name: 'os.name', value: 'Darwin', user_query: 'os.name', type: :core) resolved_fact_list = [resolved_fact] formatted_output = Facter::HoconFactFormatter.new.format(resolved_fact_list) expected_output = 'Darwin' expect(formatted_output).to eq(expected_output) end it 'formats to hocon for multiple user queries' do resolved_fact1 = instance_double(Facter::ResolvedFact, name: 'os.name', value: 'Darwin', user_query: 'os.name', type: :core) resolved_fact2 = instance_double(Facter::ResolvedFact, name: 'os.family', value: 'Darwin', user_query: 'os.family', type: :core) resolved_fact_list = [resolved_fact1, resolved_fact2] formatted_output = Facter::HoconFactFormatter.new.format(resolved_fact_list) expected_output = "\"os.family\"=Darwin\n\"os.name\"=Darwin\n" expect(formatted_output).to eq(expected_output) end it 'formats to hocon for empty resolved fact array' do formatted_output = Facter::HoconFactFormatter.new.format([]) expect(formatted_output).to eq(nil) end it 'returns empty string when the fact value is nil' do resolved_fact1 = instance_double(Facter::ResolvedFact, name: 'my_external_fact', value: nil, user_query: 'my_external_fact', type: :core) resolved_fact_list = [resolved_fact1] formatted_output = Facter::HoconFactFormatter.new.format(resolved_fact_list) expect(formatted_output).to eq('') end end puppetlabs-facter-dfe6df4/spec/framework/formatters/json_fact_formatter_spec.rb000066400000000000000000000041671470204764400304440ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::JsonFactFormatter do it 'formats to json when no user query' do resolved_fact1 = instance_double(Facter::ResolvedFact, name: 'os.name', value: 'Darwin', user_query: '', type: :core) resolved_fact2 = instance_double(Facter::ResolvedFact, name: 'os.family', value: 'Darwin', user_query: '', type: :core) resolved_fact3 = instance_double(Facter::ResolvedFact, name: 'os.architecture', value: 'x86_64', user_query: '', type: :core) resolved_fact_list = [resolved_fact1, resolved_fact2, resolved_fact3] formatted_output = Facter::JsonFactFormatter.new.format(resolved_fact_list) expected_output = "{\n \"os\": {\n \"architecture\": \"x86_64\",\n \"family\": \"Darwin\",\n \"name\": \"Darwin\"\n }\n}" expect(formatted_output).to eq(expected_output) end it 'formats to json for a single user query' do resolved_fact = instance_double(Facter::ResolvedFact, name: 'os.name', value: 'Darwin', user_query: 'os.name', type: :core) resolved_fact_list = [resolved_fact] formatted_output = Facter::JsonFactFormatter.new.format(resolved_fact_list) expected_output = "{\n \"os.name\": \"Darwin\"\n}" expect(formatted_output).to eq(expected_output) end it 'formats to json for multiple user queries' do resolved_fact1 = instance_double(Facter::ResolvedFact, name: 'os.name', value: 'Darwin', user_query: 'os.name', type: :core) resolved_fact2 = instance_double(Facter::ResolvedFact, name: 'os.family', value: 'Darwin', user_query: 'os.family', type: :core) resolved_fact_list = [resolved_fact1, resolved_fact2] formatted_output = Facter::JsonFactFormatter.new.format(resolved_fact_list) expected_output = "{\n \"os.family\": \"Darwin\",\n \"os.name\": \"Darwin\"\n}" expect(formatted_output).to eq(expected_output) end end puppetlabs-facter-dfe6df4/spec/framework/formatters/legacy_fact_formatter_spec.rb000066400000000000000000000214351470204764400307340ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::LegacyFactFormatter do subject(:legacy_formatter) { Facter::LegacyFactFormatter.new } let(:resolved_fact1) do Facter::ResolvedFact.new('resolved_fact1', 'resolved_fact1_value') end let(:resolved_fact2) do Facter::ResolvedFact.new('resolved_fact2', 'resolved_fact2_value') end let(:nested_fact1) do Facter::ResolvedFact.new('my.nested.fact1', [0, 1, 2, 3, 'my_nested_fact_value']) end let(:nested_fact2) do Facter::ResolvedFact.new('my.nested.fact2', [0, 1, 2, 'my_nested_fact_value']) end let(:nested_fact3) do Facter::ResolvedFact.new('my.nested.fact3', { 'my_nested_fact_value' => ['first', { 'another' => 'value' }] }) end let(:nil_resolved_fact1) do Facter::ResolvedFact.new('nil_resolved_fact1', nil) end let(:nil_resolved_fact2) do Facter::ResolvedFact.new('nil_resolved_fact2', nil) end let(:nil_nested_fact1) do Facter::ResolvedFact.new('my.nested.fact1', nil) end let(:nil_nested_fact2) do Facter::ResolvedFact.new('my.nested.fact2', nil) end let(:win_path) do Facter::ResolvedFact.new('path', 'C:\\Program Files\\Puppet Labs\\Puppet\\bin;C:\\cygwin64\\bin') end let(:wrong_query_fact) do Facter::ResolvedFact.new('mountpoints', { '/tmp' => 'something' }) end before do resolved_fact1.user_query = 'resolved_fact1' resolved_fact2.user_query = 'resolved_fact2' nested_fact1.user_query = 'my.nested.fact1.4' nested_fact2.user_query = 'my.nested.fact2.3' nested_fact3.user_query = 'my.nested.fact3.my_nested_fact_value.1.another' nil_resolved_fact1.user_query = 'nil_resolved_fact1' nil_resolved_fact2.user_query = 'nil_resolved_fact2' nil_nested_fact1.user_query = 'my' nil_nested_fact2.user_query = 'my.nested.fact2' win_path.user_query = '' wrong_query_fact.user_query = 'mountpoints.asd' end context 'when no user query' do let(:expected_output) { "resolved_fact1 => resolved_fact1_value\nresolved_fact2 => resolved_fact2_value" } context 'when facts have value' do it 'returns output' do expect(legacy_formatter.format([resolved_fact1, resolved_fact2])).to eq(expected_output) end end context 'when facts values are nil' do before do nil_resolved_fact1.user_query = '' nil_resolved_fact2.user_query = '' resolved_fact2.user_query = '' nil_nested_fact1.user_query = '' nil_nested_fact2.user_query = '' end context 'when is root level fact' do it 'prints no values if all facts are nil' do expect(legacy_formatter.format([nil_resolved_fact1, nil_resolved_fact2])).to eq('') end it 'prints only the fact that is not nil' do expect(legacy_formatter.format([nil_resolved_fact1, resolved_fact2])).to eq('resolved_fact2 =>'\ ' resolved_fact2_value') end end context 'when facts are nested' do it 'prints no values if all facts are nil' do expect(legacy_formatter.format([nil_nested_fact1, nil_nested_fact2])).to eq('') end it 'prints only the fact that is not nil' do expect(legacy_formatter.format([nil_nested_fact1, nil_nested_fact2, resolved_fact2])) .to eq('resolved_fact2 => resolved_fact2_value') end end end end context 'when one user query' do context 'when facts have values' do it 'returns single value' do expect(legacy_formatter.format([resolved_fact1])).to eq('resolved_fact1_value') end it 'returns a single value for a nested fact' do expect(legacy_formatter.format([nested_fact1])).to eq('my_nested_fact_value') end context 'when there is a single user query that contains :' do let(:resolved_fact) do instance_spy(Facter::ResolvedFact, name: 'networking.ip6', value: 'fe80::7ca0:ab22:703a:b329', user_query: 'networking.ip6', type: :core) end it 'returns single value without replacing : with =>' do expect(legacy_formatter.format([resolved_fact])).to eq('fe80::7ca0:ab22:703a:b329') end end context 'when Windows path' do let(:expected_output) { 'path => C:\\Program Files\\Puppet Labs\\Puppet\\bin;C:\\cygwin64\\bin' } it 'returns path with one escaped backslash' do expect(legacy_formatter.format([win_path])).to eq(expected_output) end end end context 'when fact value is nil' do context 'with root level fact' do it 'prints no values if all facts are nil' do expect(legacy_formatter.format([nil_resolved_fact1])).to eq('') end end context 'with facts that are nested' do it 'returns empty strings for first level query' do expect(legacy_formatter.format([nil_nested_fact1])).to eq('') end it 'returns empty strings for leaf level query' do nil_nested_fact1.user_query = 'my.nested.fact1' expect(legacy_formatter.format([nil_nested_fact1])).to eq('') end end end context 'when user query is wrong' do it 'prints no value' do expect(legacy_formatter.format([wrong_query_fact])).to eq('') end it 'does not raise if fact leaf is string' do wrong_query_fact.user_query = 'mountpoints./tmp.asd' expect { legacy_formatter.format([wrong_query_fact]) }.not_to raise_error end end end context 'when multiple user queries' do context 'with facts that have values' do let(:expected_output) { "resolved_fact1 => resolved_fact1_value\nresolved_fact2 => resolved_fact2_value" } let(:nested_expected_output) do "my.nested.fact1.4 => my_nested_fact_value\nmy.nested.fact2.3 => my_nested_fact_value" end it 'returns output' do expect(legacy_formatter.format([resolved_fact1, resolved_fact2])).to eq(expected_output) end it 'returns output for multiple user queries' do expect(legacy_formatter.format([nested_fact1, nested_fact2])).to eq(nested_expected_output) end context 'when value is a hash' do it "returns 'value'" do expect(legacy_formatter.format([nested_fact3])).to eq('value') end end end context 'with fact value that is nil' do context 'with a root level fact' do it 'prints no values if all facts are nil' do expect(legacy_formatter.format([nil_resolved_fact1, nil_resolved_fact2])) .to eq("nil_resolved_fact1 => \nnil_resolved_fact2 => ") end it 'prints a value only for the fact that is not nil' do expect(legacy_formatter.format([nil_resolved_fact1, resolved_fact2])) .to eq("nil_resolved_fact1 => \nresolved_fact2 => resolved_fact2_value") end end context 'with facts that are nested' do it 'returns empty strings for first and leaf level query' do expect(legacy_formatter.format([nil_resolved_fact1, nil_nested_fact2])) .to eq("my.nested.fact2 => \nnil_resolved_fact1 => ") end it 'returns empty strings for leaf level query' do nil_nested_fact1.user_query = 'my.nested.fact1' expect(legacy_formatter.format([nil_resolved_fact1, resolved_fact2])) .to eq("nil_resolved_fact1 => \nresolved_fact2 => resolved_fact2_value") end end end end context 'when there is an empty resolved fact array' do it 'returns nil' do expect(legacy_formatter.format([])).to eq(nil) end end context 'when fact starts with double ":"' do let(:resolved_fact) do instance_spy(Facter::ResolvedFact, name: 'networking', value: { ip6: '::1' }, user_query: 'networking', type: :core) end it 'formats the fact correctly' do expect(legacy_formatter.format([resolved_fact])) .to eq("{\n ip6 => \"::1\"\n}") end end context 'when fact name contains a windows path' do let(:resolved_fact) do instance_spy(Facter::ResolvedFact, name: 'C:\\Program Files\\App', value: 'bin_dir', user_query: '', type: :core) end it 'formats the fact correctly' do expect(legacy_formatter.format([resolved_fact])) .to eq('C:\\Program Files\\App => bin_dir') end end context 'when fact value contains newline' do let(:resolved_fact) do instance_spy(Facter::ResolvedFact, name: 'custom_fact', value: 'value1 \n value2', user_query: '', type: :core) end it 'formats the fact correctly' do expect(legacy_formatter.format([resolved_fact])) .to eq("custom_fact => value1 \n value2") end end end puppetlabs-facter-dfe6df4/spec/framework/formatters/yaml_fact_formatter_spec.rb000066400000000000000000000054521470204764400304330ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::YamlFactFormatter do subject(:yaml_formatter) { Facter::YamlFactFormatter.new } let(:resolved_fact1) do instance_spy(Facter::ResolvedFact, name: 'os.name', value: 'Darwin', user_query: user_query1, type: :core) end let(:resolved_fact2) do instance_spy(Facter::ResolvedFact, name: 'os.family', value: 'Darwin', user_query: user_query2, type: :core) end let(:resolved_fact3) do instance_spy(Facter::ResolvedFact, name: 'os.architecture', value: 'x86_64', user_query: user_query3, type: :core) end let(:float_fact) do instance_spy(Facter::ResolvedFact, name: 'memory', value: 1024.0, user_query: '', type: :core) end let(:user_query1) { '' } let(:user_query2) { '' } let(:user_query3) { '' } context 'when no user query' do let(:resolved_fact_list) { [resolved_fact1, resolved_fact2, resolved_fact3] } let(:expected_output) { "os:\n architecture: x86_64\n family: \"Darwin\"\n name: \"Darwin\"\n" } it 'formats to yaml' do expect(yaml_formatter.format(resolved_fact_list)).to eq(expected_output) end end context 'when there is a single user query' do let(:resolved_fact_list) { [resolved_fact1] } let(:expected_output) { "os.name: \"Darwin\"\n" } let(:user_query1) { 'os.name' } it 'formats to yaml' do expect(yaml_formatter.format(resolved_fact_list)).to eq(expected_output) end end context 'when there are multiple user queries' do let(:resolved_fact_list) { [resolved_fact1, resolved_fact2] } let(:expected_output) { "os.family: \"Darwin\"\nos.name: \"Darwin\"\n" } let(:user_query1) { 'os.name' } let(:user_query2) { 'os.family' } it 'formats to yaml' do expect(yaml_formatter.format(resolved_fact_list)).to eq(expected_output) end end context 'when on Windows' do let(:win_path) do instance_spy(Facter::ResolvedFact, name: 'path', value: value, user_query: '', type: :core) end let(:value) { 'C:\\Program Files\\Puppet Labs\\Puppet\\bin;C:\\cygwin64\\bin' } let(:expected_output) { "path: \"C:\\\\Program Files\\\\Puppet Labs\\\\Puppet\\\\bin;C:\\\\cygwin64\\\\bin\"\n" } let(:resolved_fact_list) { [win_path] } it 'formats quoted path with double escaped backslashes' do expect(yaml_formatter.format(resolved_fact_list)).to eq(expected_output) end end context 'when resolving float numbers' do let(:resolved_fact_list) { [float_fact] } let(:expected_output) { "memory: 1024.0\n" } it 'does not use quotes' do expect(yaml_formatter.format(resolved_fact_list)).to eq(expected_output) end end end puppetlabs-facter-dfe6df4/spec/framework/logging/000077500000000000000000000000001470204764400223045ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/framework/logging/logger_spec.rb000066400000000000000000000211001470204764400251140ustar00rootroot00000000000000# frozen_string_literal: true describe Logger do subject(:log) { Facter::Log.new(Class) } let(:logger) { Facter::Log.class_variable_get(:@@logger) } before do Facter::Options[:color] = false end describe '#debug' do before do allow(Facter).to receive(:debugging?).and_return(true) end context 'when debugging is set to false' do it 'no debug messages are sent' do allow(Facter).to receive(:debugging?).and_return(false) expect(logger).not_to receive(:debug) log.debug('info_message') end end shared_examples 'writes debug message with no color' do it 'calls debug on logger' do expect(logger).to receive(:debug).with('Class - debug_message') log.debug('debug_message') end end shared_examples 'writes debug message with color' do it 'calls debug on logger' do expect(logger).to receive(:debug) .with("Class - #{Facter::CYAN}debug_message#{Facter::RESET}") log.debug('debug_message') end end it_behaves_like 'writes debug message with no color' context 'when message callback is provided' do after do Facter::Log.class_variable_set(:@@message_callback, nil) end it 'provides on_message hook' do logger_double = instance_spy(Logger) Facter.on_message do |level, message| logger_double.debug("on_message called with level: #{level}, message: #{message}") end log.debug('test') expect(logger_double).to have_received(:debug).with('on_message called with level: debug, message: test') end end context 'when call is made during os detection in os_detector.rb and facter.rb is not fully loaded' do before do allow(Facter).to receive(:respond_to?).with(:debugging?).and_return(false) end it_behaves_like 'writes debug message with no color' it 'does not call Facter.debugging?' do log.debug('debug_message') expect(Facter).not_to have_received(:debugging?) end end context 'when non Windows OS' do before do allow(OsDetector.instance).to receive(:identifier).and_return(:macosx) end context 'when --colorize option is enabled' do before do Facter::Options[:color] = true end it_behaves_like 'writes debug message with color' end end context 'when Windows OS' do before do allow(OsDetector.instance).to receive(:identifier).and_return(:windows) end context 'when --colorize option is enabled' do before do Facter::Options[:color] = true end it_behaves_like 'writes debug message with color' end end end describe '#debugonce' do before do allow(Facter).to receive(:debugging?).and_return(true) end it 'writes the same debug message only once' do message = 'Some error message' expect(logger).to receive(:debug).once.with("Class - #{message}") log.debugonce(message) log.debugonce(message) end end describe '#info' do it 'writes info message' do expect(logger).to receive(:info).with('Class - info_message') log.info('info_message') end context 'when non Windows OS' do before do allow(OsDetector.instance).to receive(:identifier).and_return(:macosx) end context 'when --colorize option is enabled' do before do Facter::Options[:color] = true end it 'print Green (32) info message' do expect(logger) .to receive(:info) .with("Class - #{Facter::GREEN}info_message#{Facter::RESET}") log.info('info_message') end end end context 'when Windows OS' do before do allow(OsDetector.instance).to receive(:identifier).and_return(:windows) end context 'when --colorize option is enabled' do before do Facter::Options[:color] = true end it 'print info message' do expect(logger).to receive(:info) .with("Class - #{Facter::GREEN}info_message#{Facter::RESET}") log.info('info_message') end end end end describe '#warn' do it 'writes warn message' do expect(logger).to receive(:warn).with('Class - warn_message') log.warn('warn_message') end context 'when non Windows OS' do before do allow(OsDetector.instance).to receive(:identifier).and_return(:macosx) end context 'when --colorize option is enabled' do before do Facter::Options[:color] = true end it 'print Yellow (33) info message' do expect(logger) .to receive(:warn) .with("Class - #{Facter::YELLOW}warn_message#{Facter::RESET}") log.warn('warn_message') end end end context 'when Windows OS' do before do allow(OsDetector.instance).to receive(:identifier).and_return(:windows) end context 'when --colorize option is enabled' do before do Facter::Options[:color] = true end it 'print warn message' do expect(logger).to receive(:warn) .with("Class - #{Facter::YELLOW}warn_message#{Facter::RESET}") log.warn('warn_message') end end end end describe '#warnonce' do before do allow(Facter).to receive(:debugging?).and_return(true) end it 'writes the same debug message only once' do message = 'Some error message' expect(logger).to receive(:warn).once.with("Class - #{message}") log.warnonce(message) log.warnonce(message) end end describe '#error' do it 'writes error message with color on macosx' do allow(OsDetector.instance).to receive(:detect).and_return(:macosx) expect(logger).to receive(:error).with("Class - #{Facter::RED}error_message#{Facter::RESET}") log.error('error_message', true) end it 'writes error message colorized on Windows' do allow(OsDetector.instance).to receive(:identifier).and_return(:windows) expect(logger).to receive(:error).with("Class - #{Facter::RED}error_message#{Facter::RESET}") log.error('error_message', true) end it 'writes error message' do expect(logger).to receive(:error).with('Class - error_message') log.error('error_message') end end describe '#level=' do it 'sets the log level' do expect(logger).to receive(:level=).with(:error) Facter::Log.level = :error end end describe '#log_exception' do let(:exception) { Exception.new('Test exception') } it 'writes exception message without --trace option' do expect(logger).to receive(:error).with("Class - #{colorize('Test exception', Facter::RED)}") log.log_exception(exception) end it 'writes exception message and backtrace with --trace option' do allow(Facter::Options).to receive(:[]) allow(Facter::Options).to receive(:[]).with(:trace).and_return(true) allow(exception).to receive(:backtrace).and_return(['backtrace:1']) expect(logger) .to receive(:error) .with("Class - #{colorize("Test exception\nbacktrace:1", Facter::RED)}") log.log_exception(exception) end end describe '.clear_messages' do before do allow(Facter).to receive(:debugging?).and_return(true) end it 'clears debugonce messages' do message = 'Some error message' expect(logger).to receive(:debug).twice.with("Class - #{message}") log.debugonce(message) Facter::Log.clear_messages log.debugonce(message) end it 'clears warnonce messages' do message = 'Some error message' expect(logger).to receive(:warn).twice.with("Class - #{message}") log.warnonce(message) Facter::Log.clear_messages log.warnonce(message) end end describe '.show_time' do before do allow(Facter::Log).to receive(:timing?).and_return(true) end it 'prints the message to stderr' do expect { Facter::Log.show_time('foo') }.to output("\e[32mfoo\e[0m\n").to_stderr end end describe 'setting the timing mode' do it 'is enabled when the given value is true' do Facter::Log.timing(true) expect(Facter::Log.timing?).to be true end it 'is disabled when the given value is false' do Facter::Log.timing(false) expect(Facter::Log.timing?).to be false end it 'is disabled when the given value is nil' do Facter::Log.timing(nil) expect(Facter::Log.timing?).to be nil end end end puppetlabs-facter-dfe6df4/spec/framework/utils/000077500000000000000000000000001470204764400220165ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/framework/utils/utils_spec.rb000066400000000000000000000037641470204764400245270ustar00rootroot00000000000000# frozen_string_literal: true describe Facter::Utils do let(:hash_to_change) { { this: { is: [{ 1 => 'test' }] } } } let(:result) { { 'this' => { 'is' => [{ '1' => 'test' }] } } } describe '.deep_stringify_keys' do it 'stringifies keys in hash' do expect(Facter::Utils.deep_stringify_keys(hash_to_change)).to eql(result) end end describe '.try_to_bool' do it 'converts to bool when truthy' do expect(Facter::Utils.try_to_bool('true')).to be true end it 'converts to bool when falsey' do expect(Facter::Utils.try_to_bool('false')).to be false end it 'leaves the string unchanged otherwise' do expect(Facter::Utils.try_to_bool('something else')).to eql('something else') end end describe '.try_to_int' do context 'when possible, converts to int' do it 'leaves int as it is' do expect(Facter::Utils.try_to_int(7)).to be(7) end it 'converts string int' do expect(Facter::Utils.try_to_int('7')).to be(7) end it 'converts positive string int' do expect(Facter::Utils.try_to_int('+7')).to be(7) end it 'converts negative string int' do expect(Facter::Utils.try_to_int('-7')).to be(-7) end it 'converts float' do expect(Facter::Utils.try_to_int(7.10)).to be(7) end end context 'when not possible, does not convert to int' do it 'does not convert non-numerical string' do expect(Facter::Utils.try_to_int('string')).to be('string') end it 'does not convert partial string int' do expect(Facter::Utils.try_to_int('7string')).to be('7string') end it 'does not convert boolean true' do expect(Facter::Utils.try_to_int(true)).to be(true) end it 'does not convert boolean false' do expect(Facter::Utils.try_to_int(false)).to be(false) end it 'does not convert string float' do expect(Facter::Utils.try_to_int('7.10')).to be('7.10') end end end end puppetlabs-facter-dfe6df4/spec/mocks/000077500000000000000000000000001470204764400177755ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec/mocks/augeas.rb000066400000000000000000000002421470204764400215650ustar00rootroot00000000000000# frozen_string_literal: true class Augeas def self.create(opts = {}, &block); end def self.open(root = nil, loadpath = nil, flags = NONE, &block); end end puppetlabs-facter-dfe6df4/spec/mocks/ffi.rb000066400000000000000000000027231470204764400210720ustar00rootroot00000000000000# frozen_string_literal: true module FFI ERROR_MORE_DATA = 234 CURRENT_PROCESS = 0 MAX_PATH = 32_767 @error_number = nil def self.typedef(arg1, arg2); end def self.errno @error_number end def self.define_errno(arg) @error_number = arg end def self.type_size(arg); end module Library LIBC = 'libc' def ffi_convention(arg); end def ffi_lib(*); end def attach_function(*); end def enum(*); end def GetAdaptersAddresses(*); end def getkerninfo(*) 0 end def getloadavg(*); end def sysctl(*); end def sysctlbyname(*); end def WSAAddressToStringW(*); end def GetNativeSystemInfo(*); end def GetUserNameExW(*); end def IsUserAnAdmin(*); end def RtlGetVersion(*); end def GetPerformanceInfo(*); end def IsWow64Process(*); end def GetCurrentProcess(*); end end class Pointer NULL = nil def write_uint32(); end def read_uint32(); end def get_bytes(*); end def self.size; end end class MemoryPointer def initialize(*); end def read_array_of_double(*); end def to_ptr; end def [](*); end def write_int(*); end def read_int; end def read_uint32(); end def self.size; end end class Struct def self.layout(*); end def self.size; end def initialize(*); end def [](*); end def []=(*); end end class Union def self.layout(*); end def self.size; end end end puppetlabs-facter-dfe6df4/spec/mocks/flush_fake_error.rb000066400000000000000000000001111470204764400236330ustar00rootroot00000000000000# frozen_string_literal: true class FlushFakeError < StandardError; end puppetlabs-facter-dfe6df4/spec/mocks/kernel.rb000066400000000000000000000004101470204764400215750ustar00rootroot00000000000000# frozen_string_literal: true LIBS_TO_SKIP = %w[win32ole ffi win32/registry sys/filesystem augeas].freeze module Kernel alias old_require require def require(path) old_require(path) unless LIBS_TO_SKIP.include?(path) end def at_exit(&block); end end puppetlabs-facter-dfe6df4/spec/mocks/socket.rb000066400000000000000000000003461470204764400216150ustar00rootroot00000000000000# frozen_string_literal: true class Ifaddr def name; end def addr; end def netmask; end end class AddrInfo def ip_address; end def ip?; end def ipv4?; end def getnameinfo; end def inspect_sockaddr; end end puppetlabs-facter-dfe6df4/spec/mocks/sys_filesystem.rb000066400000000000000000000050261470204764400234070ustar00rootroot00000000000000# frozen_string_literal: true module Sys class Filesystem def self.mounts; end class Mount # The name of the mounted resource. attr_accessor :name # The mount point/directory. attr_accessor :mount_point # The type of filesystem mount, e.g. ufs, nfs, etc. attr_accessor :mount_type # A list of comma separated options for the mount, e.g. nosuid, etc. attr_accessor :options # The time the filesystem was mounted. May be nil. attr_accessor :mount_time # The dump frequency in days. May be nil. attr_accessor :dump_frequency # The pass number of the filessytem check. May be nil. attr_accessor :pass_number end class Stat # The path of the filesystem. attr_accessor :path # The preferred system block size. attr_accessor :block_size # The fragment size, i.e. fundamental filesystem block size. attr_accessor :fragment_size # The total number of +fragment_size+ blocks in the filesystem. attr_accessor :blocks # The total number of free blocks in the filesystem. attr_accessor :blocks_free # The number of free blocks available to unprivileged processes. attr_accessor :blocks_available # The total number of files/inodes that can be created. attr_accessor :files # The total number of files/inodes on the filesystem. attr_accessor :files_free # The number of free files/inodes available to unprivileged processes. attr_accessor :files_available # The filesystem identifier. attr_accessor :filesystem_id # A bit mask of flags. attr_accessor :flags # The maximum length of a file name permitted on the filesystem. attr_accessor :name_max # The filesystem type, e.g. UFS. attr_accessor :base_type # Returns the total space on the partition. def bytes_total blocks * fragment_size end # Returns the total amount of free space on the partition. def bytes_free blocks_free * fragment_size end # Returns the amount of free space available to unprivileged processes. def bytes_available blocks_available * fragment_size end # Returns the total amount of used space on the partition. def bytes_used bytes_total - bytes_free end # Returns the percentage of the partition that has been used. def percent_used 100 - (100.0 * bytes_free.to_f / bytes_total.to_f) end end end end puppetlabs-facter-dfe6df4/spec/mocks/util.rb000066400000000000000000000035501470204764400213020ustar00rootroot00000000000000# frozen_string_literal: true def mock_os(os_name) allow(OsDetector.instance) .to receive(:identifier) .and_return(os_name) end def mock_fact_loader_with_legacy(os_name, loaded_facts_hash) allow(Facter::InternalFactLoader) .to receive(:load_with_legacy) .with(os_name) .and_return(loaded_facts_hash) end def mock_fact_loader(os_name, loaded_fact_hash) allow(Facter::InternalFactLoader) .to receive(:load) .with(os_name) .and_return(loaded_fact_hash) end def mock_query_parser(user_query, loaded_fact_hash) query_parser_spy = instance_spy(Facter::QueryParser) allow(query_parser_spy) .to receive(:parse) .with(user_query, loaded_fact_hash) end private_methods def allow_attr_change(resolved_fact_mock, fact_value) allow(resolved_fact_mock) .to receive(:value=) .with(fact_value) allow(resolved_fact_mock) .to receive(:user_query=) end def mock_resolved_fact(fact_name, fact_value, user_query = nil, type = :core) resolved_fact_mock = instance_double( Facter::ResolvedFact, name: fact_name, value: fact_value, user_query: user_query, type: type, legacy?: type == :legacy, core?: type == :core, file: nil, resolves?: fact_name == user_query ) allow_attr_change(resolved_fact_mock, fact_value) resolved_fact_mock end def mock_fact(fact_class_name, resolved_fact_to_return, fact_name = nil) fact_mock = instance_spy(fact_class_name) allow(fact_class_name) .to receive(:new) .and_return(fact_mock) allow(fact_class_name) .to receive(:call_the_resolver) .and_return(resolved_fact_to_return) stub_const(fact_class_name.to_s, fact_name) if fact_name.present? fact_mock end def load_fixture(filename) File.open(File.join('spec', 'fixtures', filename)) end puppetlabs-facter-dfe6df4/spec/mocks/win32.rb000066400000000000000000000005121470204764400212620ustar00rootroot00000000000000# frozen_string_literal: true module Win32 class Registry def keys; end def close; end module API end class HKEY_LOCAL_MACHINE def self.open(*); end def close; end def any?; end def each; end def [](*); end def keys; end def read(*); end end end end puppetlabs-facter-dfe6df4/spec/mocks/win32_registry_error.rb000066400000000000000000000001561470204764400244270ustar00rootroot00000000000000# frozen_string_literal: true module Win32 class Registry class Error < RuntimeError end end end puppetlabs-facter-dfe6df4/spec/mocks/win32ole.rb000066400000000000000000000003441470204764400217650ustar00rootroot00000000000000# frozen_string_literal: true class WIN32OLE def initialize(*); end def ConnectServer(*); end def Security_; end def ImpersonationLevel=; end def Model; end def Manufacturer; end def OEMStringArray; end end puppetlabs-facter-dfe6df4/spec/spec_helper.rb000066400000000000000000000057101470204764400215020ustar00rootroot00000000000000# frozen_string_literal: true require 'pathname' ROOT_DIR = Pathname.new(File.expand_path('..', __dir__)) unless defined?(ROOT_DIR) ENV['RACK_ENV'] = 'test' require 'bundler/setup' require 'simplecov' # Configure SimpleCov SimpleCov.start do track_files 'lib/**/*.rb' add_filter 'spec' end require 'open3' require 'thor' require 'fileutils' require_relative '../lib/facter/resolvers/base_resolver' unit_tests = ARGV.grep(/spec_integration/).empty? Dir[ROOT_DIR.join('spec/mocks/*.rb')].sort.each { |file| require file } if unit_tests require_relative 'custom_facts/puppetlabs_spec/files' require 'facter' require 'facter/framework/cli/cli' require 'facter/framework/cli/cli_launcher' if unit_tests Dir.glob(File.join('./lib/facter/util', '/**/*/', '*.rb')).sort.each(&method(:require)) Dir.glob(File.join('./lib/facter/facts', '/**/*/', '*.rb')).sort.each(&method(:require)) Dir.glob(File.join('./lib/facter/resolvers', '/**/*/', '*.rb')).sort.each(&method(:require)) end default_coverage = 90 SimpleCov.minimum_coverage ENV['COVERAGE'] || default_coverage def colorize(str, color) "#{color}#{str}#{Facter::RESET}" end # Configure webmock require 'webmock/rspec' WebMock.disable_net_connect! # Configure test logger logdest = ENV['FACTER_TEST_LOG'] ? File.new(ENV['FACTER_TEST_LOG'], 'w') : StringIO.new logger = Logger.new(logdest) # Configure RSpec RSpec.configure do |config| # Enable flags like --only-failures and --next-failure config.example_status_persistence_file_path = '.rspec_status' # Disable RSpec exposing methods globally on `Module` and `main` config.disable_monkey_patching! config.expose_dsl_globally = true config.expect_with :rspec do |c| c.syntax = :expect end config.mock_with :rspec do |mocks| # This option should be set when all dependencies are being loaded # before a spec run, as is the case in a typical spec helper. It will # cause any verifying double instantiation for a class that does not # exist to raise, protecting against incorrectly spelt names. mocks.verify_doubled_constant_names = true # This option forces the same argument and method existence checks that are # performed for object_double are also performed on partial doubles. # You should set this unless you have a good reason not to. # It defaults to off only for backwards compatibility. mocks.verify_partial_doubles = true end config.before(:all) do Facter::Log.class_variable_set(:@@logger, logger) # rubocop:disable Style/ClassVars end config.before do |test| m = test.metadata logger.info("*** BEGIN TEST #{m[:file_path]}:#{m[:line_number]}") LegacyFacter.clear Facter.clear_messages end config.after do Facter::OptionStore.reset Facter::ConfigReader.clear Facter::ConfigFileOptions.clear end # This will cleanup any files that were created with tmpdir or tmpfile config.extend PuppetlabsSpec::Files config.after do PuppetlabsSpec::Files.cleanup end end puppetlabs-facter-dfe6df4/spec_integration/000077500000000000000000000000001470204764400212645ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/spec_integration/facter_block_legacy_spec.rb000066400000000000000000000037571470204764400266010ustar00rootroot00000000000000# frozen_string_literal: true require 'json' require_relative 'spec_helper' describe 'Facter' do context 'when legacy facts is blocked' do let(:facter_conf_content) do 'facts : { blocklist : [ "legacy" ], }' end let(:core_facts) do %w[dmi facterversion identity is_virtual kernel kernelmajversion kernelrelease kernelversion memory networking os path processors ruby system_uptime timezone virtual] end let(:legacy_facts) do %w[architecture augeasversion dhcp_servers fqdn gid hardwareisa hardwaremodel hostname id interfaces ipaddress ipaddress6 ipaddress6_.* ipaddress_.* macaddress macaddress_.* memoryfree memoryfree_mb memorysize memorysize_mb mtu_.* netmask netmask6 netmask6_.* netmask_.* network network6 network6_.* network_.* operatingsystem operatingsystemmajrelease operatingsystemrelease osfamily physicalprocessorcount processor[0-9]+.* processorcount productname rubyplatform rubysitedir rubyversion scope6 scope6_.* sp_boot_mode sp_boot_volume sp_cpu_type sp_current_processor_speed sp_kernel_version sp_l2_cache_core sp_l3_cache sp_local_host_name sp_machine_model sp_machine_name sp_number_processors sp_os_version sp_packages sp_physical_memory sp_platform_uuid sp_secure_vm sp_serial_number sp_uptime sp_user_name swapencrypted swapfree swapfree_mb swapsize swapsize_mb uptime uptime_days uptime_hours uptime_seconds] end let(:facter_output) do facter_conf_path = IntegrationHelper.create_file('./temp/facter.conf', facter_conf_content) out, = IntegrationHelper.exec_facter('-c', facter_conf_path, '--show-legacy', '-j') JSON.parse(out) end after do FileUtils.rm_rf('./temp') end it 'checks legacy facts are blocked' do expect(facter_output.keys).not_to match_array(legacy_facts) end it 'checks core fact are not blocked' do expect(facter_output.keys).to include(*core_facts) end end end puppetlabs-facter-dfe6df4/spec_integration/facter_resolve_spec.rb000066400000000000000000000053671470204764400256410ustar00rootroot00000000000000# frozen_string_literal: true require_relative 'spec_helper' describe Facter do context 'when recursively calling facter in an external/custom fact' do ext_dir = Dir.mktmpdir ext_fact_path = File.join(ext_dir, 'extfact') if LegacyFacter::Util::Config.windows? ext_fact_path << '.ps1' ext_fact_path.tr!('/', '\\') script = <<~SCRIPTEND bundle exec facter --external-dir #{ext_dir} os SCRIPTEND else script = <<~POSIXSCRIPT #!/usr/bin/env ruby require 'json' `bundle exec facter --external-dir #{ext_dir} os`.strip POSIXSCRIPT end File.write(ext_fact_path, script) FileUtils.chmod('+x', ext_fact_path) it 'detects facter invocations recursively and stops external facts from recursing' do # in-process entrypoints write to our in-memory logger, not stdout/err facter_entrypoints = [ [proc { `bundle exec facter --external-dir #{ext_dir} os` }, false], [proc { Facter.resolve("--external-dir #{ext_dir}") }, true], [proc { Facter.resolve("os.family --external-dir #{ext_dir}") }, true], [ proc do Facter::OptionStore.external_dir = [ext_dir] Facter.to_hash end, true ] ] time = Benchmark.measure do # This iterates over the supported entry points that would attempt to resolve # external facts; if any one of them descends into recursion, it will exceed # the DEFAULT_EXECUTION_TIMEOUT; otherwise, each of these calls should be only # be a few seconds. logger = Facter::Log.class_variable_get(:@@logger) facter_entrypoints.each do |entrypoint, inprocess| if inprocess expect(logger).to receive(:warn).with(/Recursion detected/) entrypoint.call else expect { entrypoint.call }.to output(/Recursion detected/).to_stderr_from_any_process end Facter.reset Facter.clear Facter::OptionStore.reset LegacyFacter.clear end end expect(time.real).to be < Facter::Core::Execution::Base::DEFAULT_EXECUTION_TIMEOUT end end context 'when calling the ruby API resolve' do it 'returns a hash that includes legacy values' do result = Facter.resolve('--show-legacy') expect(result['uptime_hours']).not_to be_nil end it "returns a hash that doesn't include legacy values" do result = Facter.resolve('') expect(result['uptime_hours']).to be_nil end context 'when calling for specfic legacy fact' do it 'returns a hash that includes legacy values' do result = Facter.resolve('uptime_hours') expect(result['uptime_hours']).not_to be_nil end end end end puppetlabs-facter-dfe6df4/spec_integration/facter_spec.rb000066400000000000000000000664631470204764400241060ustar00rootroot00000000000000# frozen_string_literal: true require_relative 'spec_helper' describe 'Facter' do include PuppetlabsSpec::Files let(:ext_facts_dir) { tmpdir('external_facts') } let(:custom_facts_dir) { tmpdir('custom_facts') } def write_to_file(file_name, to_write, dir = ext_facts_dir) file = File.join(dir, file_name) File.open(file, 'w') { |f| f.print to_write } end def tmp_filename(tmp_filename) "#{(0...8).map { rand(65..90).chr }.join}_#{tmp_filename}" end describe '.value' do context 'with core facts' do context 'when facts are structured' do it 'does not return wrong values when the query is wrong' do expect(Facter.value('os.name.something')).to be(nil) end end context 'when facts have hash values' do it 'does not return wrong values when the query is wrong' do expect(Facter.value('mountpoints./.available.something')).to be(nil) end end context 'with array as value' do it 'can access value by index' do expect(Facter.value('processors.models.0')).not_to be_nil end it 'cannot access non existent index' do expect(Facter.value('processors.models.1000')).to be_nil end it 'does not use non numeric string as index' do expect(Facter.value('processors.models.abc')).to be_nil end it 'does not use non negative index' do expect(Facter.value('processors.models.-1')).to be_nil end it 'respects the filter tokens' do expect(Facter.value('processors')['models'][0]).to eql(Facter.value('processors.models.0')) end end end context 'with custom facts' do context 'with null bytes' do let(:logger) { instance_spy(Facter::Log) } normalization_error = LegacyFacter::Util::Normalization::NormalizationError it 'logs an error when a fact keyname contains a null byte' do facter_code = proc do Facter.add("key\0bad_name") do setcode { 'valid_value' } end end facter_code.call do expect(logger).to receive(:log_exception).with(an_instance_of(normalization_error)) do |exception| expect(exception.message).to match(/contains a null byte reference/) end end end it 'logs an error when a fact value contains a null byte' do facter_code = proc do Facter.add('keyname') do setcode { "bad\0value" } end end facter_code.call do expect(logger).to receive(:log_exception).with(an_instance_of(normalization_error)) do |exception| expect(exception.message).to match(/contains a null byte reference/) end end end end context 'with array as value' do before do Facter.add('arr_fact') do setcode { %w[x y z] } end end it 'can access value by index' do expect(Facter.value('arr_fact.0')).to eql('x') end it 'cannot access non existent index' do expect(Facter.value('arr_fact.3')).to be_nil end it 'does not use non numeric string as index' do expect(Facter.value('arr_fact.abc')).to be_nil end it 'does not use non negative index' do expect(Facter.value('arr_fact.-1')).to be_nil end end context 'when having name collision with a core legacy fact' do # core legacy fact -> network_.* before do Facter.search(custom_facts_dir) data = <<-RUBY Facter.add(:network_nexthop_ip) do setcode { 'network_nexthop_ip' } end RUBY write_to_file(tmp_filename('custom_fact.rb'), data, custom_facts_dir) end it 'resolves the custom fact' do expect(Facter.value(:network_nexthop_ip)).to eql('network_nexthop_ip') end end end context 'with external facts' do context 'with facts that have null bytes' do before do Facter.search_external([ext_facts_dir]) data = { "bad_key\u0000" => 'valid value', 'valid_key' => "\x00" } write_to_file(tmp_filename('bad_facts.yaml'), YAML.dump(data)) end it 'shows errors in the logs when trying to read in the facts with bad keys' do expect { Facter.value("bad_key\u0000") }.to raise_error(ArgumentError) end it 'shows errors in the logs when trying to read in the facts with bad values' do allow(Facter).to receive(:log_exception) do |exception, message| expect(exception).to be_a_kind_of(LegacyFacter::Util::Normalization::NormalizationError) expect(message).to match(/contains a null byte reference/) end expect(Facter.value('valid_key')).to be_nil end end context 'with array as value' do before do Facter.search_external([ext_facts_dir]) data = { 'arr_ext_fact' => %w[ex1 ex2] } write_to_file(tmp_filename('os_fact.yaml'), YAML.dump(data)) end it 'can access value by index' do expect(Facter.value('arr_ext_fact.0')).to eql('ex1') end it 'cannot access non existent index' do expect(Facter.value('arr_ext_fact.3')).to be_nil end it 'does not use non numeric string as index' do expect(Facter.value('arr_ext_fact.abc')).to be_nil end it 'does not use non negative index' do expect(Facter.value('arr_ext_fact.-1')).to be_nil end end end context 'when structured facts are disabled' do before do Facter::Options[:force_dot_resolution] = false end context 'with custom fact' do context 'with nested Facter.value calls' do before do Facter.search(custom_facts_dir) data = <<-RUBY Facter.add(:a) do setcode { 'a' } end Facter.value(:kernel) Facter.add(:b) do setcode { 'b' } end RUBY write_to_file(tmp_filename('custom_fact.rb'), data, custom_facts_dir) end it 'does not override original user query' do expect(Facter.value('b')).to eql('b') end end context 'when has the same name as a structured core fact' do before do Facter.add('os.name', weight: 999) do setcode { 'custom_fact' } end end it 'overrides part of the core fact' do expect(Facter.value('os.name')).to eql('custom_fact') end it 'does not override in the root fact' do expect(Facter.value('os')['name']).not_to eql('custom_fact') end it 'does not override the whole root fact' do expect(Facter.value('os')['family']).not_to be(nil) end end context 'when has the same name as a root core fact' do before do Facter.add('os', weight: 999) do setcode { 'custom_fact_root' } end end it 'overrides the core fact' do expect(Facter.value('os')).to eql('custom_fact_root') end end context 'when standalone fact' do before do Facter.add('a.b.c') do setcode { 'custom' } end end it 'works with fact name' do expect(Facter.value('a.b.c')).to eql('custom') end it 'does not work with extra token in fact name' do expect(Facter.value('a.b.c.d')).to be(nil) end it 'does not work with partial fact name' do expect(Facter.value('a.b')).to be(nil) end it 'does not work with first fact segment' do expect(Facter.value('a')).to be(nil) end end end context 'with external fact' do context 'when has the same name as a structured core fact' do before do Facter.search_external([ext_facts_dir]) data = { 'os.name' => 'external_fact' } write_to_file(tmp_filename('os_fact.yaml'), YAML.dump(data)) end it 'overrides part of the core fact' do expect(Facter.value('os.name')).to eql('external_fact') end it 'does not override in the root fact' do expect(Facter.value('os')['name']).not_to eql('external_fact') end it 'does not override the whole root fact' do expect(Facter.value('os')['family']).not_to be(nil) end end context 'when has the same name as a root core fact' do before do Facter.search_external([ext_facts_dir]) data = { 'os' => 'external_fact_root' } write_to_file(tmp_filename('os_root_fact.yaml'), YAML.dump(data)) end it 'overrides the core fact' do expect(Facter.value('os')).to eql('external_fact_root') end end context 'with standalone fact' do before do Facter.search_external([ext_facts_dir]) data = { 'a.b.c' => 'external' } write_to_file(tmp_filename('data.yaml'), YAML.dump(data)) end it 'works with full fact name' do expect(Facter.value('a.b.c')).to eql('external') end it 'does not work with extra token in fact name' do expect(Facter.value('a.b.c.d')).to be(nil) end it 'does not work with partial fact name' do expect(Facter.value('a.b')).to be(nil) end it 'does not work with first fact segment' do expect(Facter.value('a')).to be(nil) end end end end context 'when structured facts are enabled' do before do Facter::Options[:force_dot_resolution] = true end after do Facter::Options[:force_dot_resolution] = false end context 'with custom fact' do context 'when has the same name as a structured core fact' do before do Facter.add('os.name', weight: 999) do setcode { 'custom_fact' } end end it 'overrides part of the core fact' do expect(Facter.value('os.name')).to eql('custom_fact') end it 'overrides in the root fact' do expect(Facter.value('os')['name']).to eql('custom_fact') end it 'does not override the whole root fact' do expect(Facter.value('os')['family']).not_to be(nil) end end context 'when has the same name as a root core fact' do before do Facter.add('os', weight: 999) do setcode { 'custom_fact_root' } end end it 'overrides the core fact' do expect(Facter.value('os')).to eql('custom_fact_root') end end context 'when standalone fact' do let(:fact_name) { 'a.b.c' } before do Facter.add(fact_name) do setcode { 'custom' } end end it 'works with fact name' do expect(Facter.value('a.b.c')).to eql('custom') end it 'does not work with extra token in fact name' do expect(Facter.value('a.b.c.d')).to be(nil) end it 'works with partial fact name' do expect(Facter.value('a.b')).to eql({ 'c' => 'custom' }) end it 'works with first fact segment' do expect(Facter.value('a')).to eql({ 'b' => { 'c' => 'custom' } }) end end end context 'with external fact' do context 'when has the same name as a structured core fact' do before do Facter.search_external([ext_facts_dir]) data = { 'os.name' => 'external_fact' } write_to_file(tmp_filename('os_fact.yaml'), YAML.dump(data)) end it 'overrides part of the core fact' do expect(Facter.value('os.name')).to eql('external_fact') end it 'overrides in the root fact' do expect(Facter.value('os')['name']).to eql('external_fact') end it 'does not override the whole root fact' do expect(Facter.value('os')['family']).not_to be(nil) end end context 'when has the same name as a root core fact' do before do Facter.search_external([ext_facts_dir]) data = { 'os' => 'external_fact_root' } write_to_file(tmp_filename('os_root_fact.yaml'), YAML.dump(data)) end it 'overrides the core fact' do expect(Facter.value('os')).to eql('external_fact_root') end end context 'when standalone fact' do before do Facter.search_external([ext_facts_dir]) data = { 'a.b.c' => 'external' } write_to_file(tmp_filename('data.yaml'), YAML.dump(data)) end it 'works with full fact name' do expect(Facter.value('a.b.c')).to eql('external') end it 'does not work with extra token in fact name' do expect(Facter.value('a.b.c.d')).to be(nil) end it 'works with partial fact name' do expect(Facter.value('a.b')).to eql({ 'c' => 'external' }) end it 'works with first fact segment' do expect(Facter.value('a')).to eql({ 'b' => { 'c' => 'external' } }) end end end end end describe '.to_user_output' do context 'with custom facts' do context 'with array as value' do before do Facter.add('arr_fact') do setcode { %w[x y z] } end end it 'can access value by index' do expect(Facter.to_user_output({}, 'arr_fact.0')).to eql(['x', 0]) end it 'cannot access non existent index' do expect(Facter.to_user_output({}, 'arr_fact.3')).to eql(['', 0]) end it 'does not use non numeric string as index' do expect(Facter.to_user_output({}, 'arr_fact.abc')).to eql(['', 0]) end it 'does not use non negative index' do expect(Facter.to_user_output({}, 'arr_fact.-1')).to eql(['', 0]) end end end context 'with external facts' do context 'with array as value' do before do Facter.search_external([ext_facts_dir]) data = { 'arr_ext_fact' => %w[ex1 ex2] } write_to_file(tmp_filename('os_fact.yaml'), YAML.dump(data)) end it 'can access value by index' do expect(Facter.to_user_output({}, 'arr_ext_fact.0')).to eql(['ex1', 0]) end it 'cannot access non existent index' do expect(Facter.to_user_output({}, 'arr_ext_fact.3')).to eql(['', 0]) end it 'does not use non numeric string as index' do expect(Facter.to_user_output({}, 'arr_ext_fact.abc')).to eql(['', 0]) end it 'does not use non negative index' do expect(Facter.to_user_output({}, 'arr_ext_fact.-1')).to eql(['', 0]) end end end context 'when structured facts are disabled' do before do Facter::Options[:force_dot_resolution] = false end context 'with custom fact' do context 'when has the same name as a structured core fact' do before do Facter.add('os.name', weight: 999) do setcode { 'custom_fact' } end end it 'overrides part of the core fact' do expect(Facter.to_user_output({}, 'os.name')).to eql(['custom_fact', 0]) end it 'does not override in the root fact' do result = JSON.parse(Facter.to_user_output({ json: true }, 'os')[0]) expect(result['os']['name']).not_to eql('custom_fact') end it 'does not override the whole fact' do result = JSON.parse(Facter.to_user_output({ json: true }, 'os')[0]) expect(result['os']['family']).not_to be(nil) end end context 'when has the same name as a root core fact' do before do Facter.add('os', weight: 999) do setcode { 'custom_fact_root' } end end it 'overrides the core fact' do expect(Facter.to_user_output({}, 'os')).to eql(['custom_fact_root', 0]) end end context 'when standalone fact' do let(:fact_name) { 'a.b.c' } before do Facter.add(fact_name) do setcode { 'custom' } end end it 'works with fact name' do expect(Facter.to_user_output({}, 'a.b.c')).to eql(['custom', 0]) end it 'does not work with extra token in fact name' do expect(Facter.to_user_output({}, 'a.b.c.d')).to eql(['', 0]) end it 'does not work with partial fact name' do expect(Facter.to_user_output({}, 'a.b')).to eql(['', 0]) end it 'does not work with first fact segment' do expect(Facter.to_user_output({}, 'a')).to eql(['', 0]) end end end context 'with external fact' do context 'when has the same name as a structured core fact' do before do Facter.search_external([ext_facts_dir]) data = { 'os.name' => 'external_fact' } write_to_file(tmp_filename('os_fact.yaml'), YAML.dump(data)) end it 'overrides part of the core fact' do expect(Facter.to_user_output({}, 'os.name')).to eql(['external_fact', 0]) end it 'does not override in the root fact' do result = JSON.parse(Facter.to_user_output({ json: true }, 'os')[0]) expect(result['os']['name']).not_to eql('external_fact') end it 'does not override the whole fact' do result = JSON.parse(Facter.to_user_output({ json: true }, 'os')[0]) expect(result['os']['family']).not_to be(nil) end end context 'when has the same name as a root core fact' do before do Facter.search_external([ext_facts_dir]) data = { 'os' => 'external_fact_root' } write_to_file(tmp_filename('os_root_fact.yaml'), YAML.dump(data)) end it 'overrides the core fact' do expect(Facter.to_user_output({}, 'os')).to eql(['external_fact_root', 0]) end end context 'when standalone fact' do before do Facter.search_external([ext_facts_dir]) data = { 'a.b.c' => 'external' } write_to_file(tmp_filename('data.yaml'), YAML.dump(data)) end it 'works with full fact name' do expect(Facter.to_user_output({}, 'a.b.c')).to eql(['external', 0]) end it 'does not work with extra token in fact name' do expect(Facter.to_user_output({}, 'a.b.c.d')).to eql(['', 0]) end it 'does not work with partial fact name' do expect(Facter.to_user_output({}, 'a.b')).to eql(['', 0]) end it 'does not work with first fact segment' do expect(Facter.to_user_output({}, 'a')).to eql(['', 0]) end end end end context 'when structured facts are enabled' do before do Facter::Options[:force_dot_resolution] = true end after do Facter::Options[:force_dot_resolution] = false end context 'with custom fact' do context 'when has the same name as a structured core fact' do before do Facter.add('os.name', weight: 999) do setcode { 'custom_fact' } end end it 'overrides part of the core fact' do expect(Facter.to_user_output({}, 'os.name')).to eql(['custom_fact', 0]) end it 'overrides in the root fact' do result = JSON.parse(Facter.to_user_output({ json: true }, 'os')[0]) expect(result['os']['name']).to eql('custom_fact') end it 'does not override the whole fact' do result = JSON.parse(Facter.to_user_output({ json: true }, 'os')[0]) expect(result['os']['family']).not_to be(nil) end end context 'when has the same name as a root core fact' do before do Facter.add('os', weight: 999) do setcode { 'custom_fact_root' } end end it 'overrides the core fact' do expect(Facter.to_user_output({}, 'os')).to eql(['custom_fact_root', 0]) end end context 'when standalone fact' do let(:fact_name) { 'a.b.c' } before do Facter.add(fact_name) do setcode { 'custom' } end end it 'works with fact name' do expect(Facter.to_user_output({}, 'a.b.c')).to eql(['custom', 0]) end it 'does not work with extra token in fact name' do expect(Facter.to_user_output({}, 'a.b.c.d')).to eql(['', 0]) end it 'works with partial fact name' do expect(Facter.to_user_output({}, 'a.b')).to eql(["{\n c => \"custom\"\n}", 0]) end it 'works with first fact segment' do expect(Facter.to_user_output({}, 'a')).to eql(["{\n b => {\n c => \"custom\"\n }\n}", 0]) end end end context 'with external fact' do context 'when has the same name as a structured core fact' do before do Facter.search_external([ext_facts_dir]) data = { 'os.name' => 'external_fact' } write_to_file(tmp_filename('os_fact.yaml'), YAML.dump(data)) end it 'overrides part of the core fact' do expect(Facter.to_user_output({}, 'os.name')).to eql(['external_fact', 0]) end it 'overrides in the root fact' do result = JSON.parse(Facter.to_user_output({ json: true }, 'os')[0]) expect(result['os']['name']).to eql('external_fact') end it 'does not override the whole fact' do result = JSON.parse(Facter.to_user_output({ json: true }, 'os')[0]) expect(result['os']['family']).not_to be(nil) end end context 'when has the same name as a root core fact' do before do Facter.search_external([ext_facts_dir]) data = { 'os' => 'external_fact_root' } write_to_file(tmp_filename('os_root_fact.yaml'), YAML.dump(data)) end it 'overrides the core fact' do expect(Facter.to_user_output({}, 'os')).to eql(['external_fact_root', 0]) end end context 'when standalone fact' do before do Facter.search_external([ext_facts_dir]) data = { 'a.b.c' => 'external' } write_to_file(tmp_filename('data.yaml'), YAML.dump(data)) end it 'works with full fact name' do expect(Facter.to_user_output({}, 'a.b.c')).to eql(['external', 0]) end it 'does not work with extra token in fact name' do expect(Facter.to_user_output({}, 'a.b.c.d')).to eql(['', 0]) end it 'works with partial fact name' do expect(Facter.to_user_output({}, 'a.b')).to eql(["{\n c => \"external\"\n}", 0]) end it 'works with first fact segment' do expect(Facter.to_user_output({}, 'a')).to eql(["{\n b => {\n c => \"external\"\n }\n}", 0]) end end end end end describe '.fact' do context 'with core facts' do context 'when facts are structured' do it 'does not return ResolvedFact when the query is wrong' do expect(Facter.fact('os.name.something')).to be_nil end end context 'when facts have hash values' do it 'does not return ResolvedFact when the query is wrong' do expect(Facter.fact('mountpoints./.available.something')).to be_nil end end context 'with array as value' do it 'returns a ResolvedFact with value' do expect(Facter.fact('processors.models.0')).to be_instance_of(Facter::ResolvedFact) end it 'cannot access non existent index' do expect(Facter.fact('processors.models.1000')).to be_nil end it 'does not use non numeric string as index' do expect(Facter.fact('processors.models.abc')).to be_nil end it 'does not use non negative index' do expect(Facter.fact('processors.models.-1')).to be_nil end end end context 'with custom facts' do context 'when fact has value' do before do Facter.add('my_fact') do setcode { 'my_value' } end end it 'returns a ResolvedFact with value' do expect(Facter.fact('my_fact')).to be_instance_of(Facter::ResolvedFact).and have_attributes(value: 'my_value') end end context 'when fact value is nil' do before do Facter.add('custom1', weight: 999) do setcode { nil } end end it 'returns a ResolvedFact with value: nil' do expect(Facter.fact('custom1')).to be_instance_of(Facter::ResolvedFact).and have_attributes(value: nil) end end context 'with array as value' do before do Facter.add('arr_fact') do setcode { %w[x y z] } end end it 'returns a ResolvedFact with value for an existent index' do expect(Facter.fact('arr_fact.0')).to be_instance_of(Facter::ResolvedFact).and have_attributes(value: 'x') end it 'cannot access non existent index' do expect(Facter.fact('arr_fact.3')).to be_nil end it 'does not use non numeric string as index' do expect(Facter.fact('arr_fact.abc')).to be_nil end it 'does not use non negative index' do expect(Facter.fact('arr_fact.-1')).to be_nil end end end context 'with external facts' do context 'with array as value' do before do Facter.search_external([ext_facts_dir]) data = { 'arr_ext_fact' => %w[ex1 ex2] } write_to_file(tmp_filename('os_fact.yaml'), YAML.dump(data)) end it 'can access value by index' do expect(Facter.fact('arr_ext_fact.0')) .to be_instance_of(Facter::ResolvedFact) .and have_attributes(value: 'ex1') end it 'cannot access non existent index' do expect(Facter.fact('arr_ext_fact.3')).to be_nil end it 'does not use non numeric string as index' do expect(Facter.fact('arr_ext_fact.abc')).to be_nil end it 'does not use non negative index' do expect(Facter.fact('arr_ext_fact.-1')).to be_nil end end end context 'when searching for a fact that does not exists' do it 'returns nil' do expect(Facter.fact('non_existent')).to be_nil end end end end puppetlabs-facter-dfe6df4/spec_integration/facter_to_hash_spec.rb000066400000000000000000000075141470204764400256030ustar00rootroot00000000000000# frozen_string_literal: true require_relative 'spec_helper' describe Facter do context 'when calling facter cli' do context 'with no user query' do it 'returns no stderr' do _, err, = IntegrationHelper.exec_facter expect(err).not_to match(/ERROR Facter/) end it 'returns 0 exit code' do _, _, status = IntegrationHelper.exec_facter expect(status.exitstatus).to eq(0) end it 'returns valid output' do out, = IntegrationHelper.exec_facter root_facts = ['memory => {', 'networking => {', 'os => {', 'path =>', 'processors => {'] expect(out).to include(*root_facts) end it 'returns valid json output' do out, = IntegrationHelper.exec_facter('-j') expect do JSON.parse(out) end.not_to raise_exception end end context 'when concatenating short options' do context 'when using valid flags' do it 'returns no error' do _, err = IntegrationHelper.exec_facter('-pjdt') expect(err).not_to match(/ERROR Facter::OptionsValidator - unrecognised option/) end end context 'when using flags and subcommands' do it 'returns validation error' do _, err = IntegrationHelper.exec_facter('-pjdtz') expect(err).to match(/ERROR Facter::OptionsValidator - .*unrecognised option '-z'/) end end context 'when concatenating JSON and DEBUG flags' do out, err = IntegrationHelper.exec_facter('-jd') it 'outputs in valid JSON format' do expect do JSON.parse(out) end.not_to raise_exception end it 'outputs DEBUG logs' do expect(err).to match(/DEBUG/) end end context 'when concatenating timing and DEBUG flags' do out, err = IntegrationHelper.exec_facter('-td') it 'outputs timings of facts' do expect(out).to match(/fact .*, took: .* seconds/) end it 'outputs DEBUG logs' do expect(err).to match(/DEBUG/) end end end context 'with user query' do it 'returns fqdn' do out, = IntegrationHelper.exec_facter('fqdn') expect(out).not_to be_empty end it 'returns ip' do out, = IntegrationHelper.exec_facter('ipaddress') expect(out).to match(/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/) end it 'returns ipaddress6', :skip_outside_ci do out, = IntegrationHelper.exec_facter('ipaddress6') expect(out).to match(/([a-z0-9]{1,4}:{1,2})+[a-z0-9]{1,4}/) end it 'returns hostname' do out, = IntegrationHelper.exec_facter('hostname') expect(out).not_to be_empty end it 'returns domain', if: IntegrationHelper.jruby? do out, = IntegrationHelper.exec_facter('domain') expect(out).not_to be_empty end end end context 'when calling the ruby API to_hash' do it 'returns a hash with values' do fact_hash = Facter.to_hash expect(fact_hash).to be_instance_of(Hash) end it 'contains fqdn' do fact_hash = Facter.to_hash expect(fact_hash['fqdn']).not_to be_empty end it 'contains ipaddress' do fact_hash = Facter.to_hash expect(fact_hash['ipaddress']).to match(/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/) end it 'contains ipaddress6', :skip_outside_ci do fact_hash = Facter.to_hash expect(fact_hash['ipaddress6']).to match(/([a-z0-9]{1,4}:{1,2})+[a-z0-9]{1,4}/) end it 'contains hostname' do fact_hash = Facter.to_hash expect(fact_hash['hostname']).not_to be_empty end it 'contains domain', if: IntegrationHelper.jruby? do fact_hash = Facter.to_hash expect(fact_hash['domain']).not_to be_empty end end end puppetlabs-facter-dfe6df4/spec_integration/integration_helper.rb000066400000000000000000000006541470204764400255000ustar00rootroot00000000000000# frozen_string_literal: true require 'open3' class IntegrationHelper class << self def exec_facter(*args) cmd = %w[bundle exec facter].concat(args) Open3.capture3(*cmd) end def jruby? RUBY_PLATFORM == 'java' end def create_file(path, content) dir = File.dirname(path) FileUtils.mkdir_p(dir) File.write(path, content) File.expand_path(path) end end end puppetlabs-facter-dfe6df4/spec_integration/spec_helper.rb000066400000000000000000000033131470204764400241020ustar00rootroot00000000000000# frozen_string_literal: true require 'facter' require_relative 'integration_helper' require_relative '../spec/custom_facts/puppetlabs_spec/files' # prevent facter from loading its spec files as facts $LOAD_PATH.delete_if { |entry| entry =~ %r{facter/spec} } # Configure RSpec RSpec.configure do |config| # Enable flags like --only-failures and --next-failure config.example_status_persistence_file_path = '.rspec_status' # exclude `skip_outside_ci` tests if not running on CI config.filter_run_excluding :skip_outside_ci unless ENV['CI'] # Disable RSpec exposing methods globally on `Module` and `main` config.disable_monkey_patching! config.expose_dsl_globally = true config.expect_with :rspec do |c| c.syntax = :expect end config.mock_with :rspec do |mocks| # This option should be set when all dependencies are being loaded # before a spec run, as is the case in a typical spec helper. It will # cause any verifying double instantiation for a class that does not # exist to raise, protecting against incorrectly spelt names. mocks.verify_doubled_constant_names = true # This option forces the same argument and method existence checks that are # performed for object_double are also performed on partial doubles. # You should set this unless you have a good reason not to. # It defaults to off only for backwards compatibility. mocks.verify_partial_doubles = true end config.after do Facter.reset Facter.clear Facter::OptionStore.reset LegacyFacter.clear end # This will cleanup any files that were created with tmpdir or tmpfile config.extend PuppetlabsSpec::Files config.after(:all) do PuppetlabsSpec::Files.cleanup end end puppetlabs-facter-dfe6df4/tasks/000077500000000000000000000000001470204764400170545ustar00rootroot00000000000000puppetlabs-facter-dfe6df4/tasks/check.rake000066400000000000000000000006151470204764400207770ustar00rootroot00000000000000# frozen_string_literal: true desc 'Check changes before committing' task(:check) do puts puts '<------------- Running unit tests ------------->' Rake::Task['spec_random'].invoke puts puts '<------------- Running integration tests ------------->' Rake::Task['spec_integration'].invoke puts puts '<------------- Running rubocop ------------->' Rake::Task['rubocop'].invoke end puppetlabs-facter-dfe6df4/tasks/fact_list_generator.rake000066400000000000000000000015621470204764400237420ustar00rootroot00000000000000# frozen_string_literal: true desc 'Create a fact list for the specified os' task :fact_list_generator, [:os_name] do |_, args| ROOT_DIR = Pathname.new(File.expand_path('..', __dir__)) unless defined?(ROOT_DIR) unless args[:os_name] raise ArgumentError, "Expected an os name, such as `bundle exec rake 'fact_list_generator[Ubuntu]'`" end require 'facter/framework/core/file_loader' os_hierarchy = Facter::OsHierarchy.new hierarchy = os_hierarchy.construct_hierarchy(args[:os_name]) internal_fact_loader = Facter::InternalFactLoader.new(hierarchy) facts = internal_fact_loader.facts fact_mapping = [] facts.each do |loaded_fact| fact_hash = {} fact_hash[:name] = loaded_fact.name fact_hash[:klass] = loaded_fact.klass fact_hash[:type] = loaded_fact.type fact_mapping << fact_hash end puts JSON.pretty_generate(fact_mapping) end puppetlabs-facter-dfe6df4/tasks/manpages.rake000066400000000000000000000012061470204764400215120ustar00rootroot00000000000000# frozen_string_literal: true desc 'Build Facter manpages' task :gen_manpages do require 'fileutils' ronn_args = '--manual="Facter manual" --organization="Puppet, Inc." --roff' # Locate ronn begin require 'ronn' rescue LoadError abort('Run `bundle install --with documentation` to install the `ronn` gem.') end ronn = `which ronn`.chomp abort('Ronn does not appear to be installed') unless File.executable?(ronn) FileUtils.mkdir_p('./man/man8') `RUBYLIB=./lib:$RUBYLIB bin/facter --man > ./man/man8/facter.8.ronn` `#{ronn} #{ronn_args} ./man/man8/facter.8.ronn` FileUtils.rm('./man/man8/facter.8.ronn') end puppetlabs-facter-dfe6df4/tasks/rubocop.rake000066400000000000000000000002331470204764400213670ustar00rootroot00000000000000# frozen_string_literal: true require 'rubocop/rake_task' RuboCop::RakeTask.new(:rubocop) do |t| t.options = ['--display-cop-names', '--parallel'] end puppetlabs-facter-dfe6df4/tasks/spec.rake000066400000000000000000000011011470204764400206430ustar00rootroot00000000000000# frozen_string_literal: true begin require 'rspec/core/rake_task' desc 'Run rspec test in sequential order' RSpec::Core::RakeTask.new(:spec) desc 'Run rspec test in random order' RSpec::Core::RakeTask.new(:spec_random) do |t| t.rspec_opts = '--order random' end desc 'Run rspec integration test in random order' RSpec::Core::RakeTask.new(:spec_integration) do |t| t.rspec_opts = '--pattern spec_integration/**/*_spec.rb '\ '--default-path spec_integration --order random' end rescue LoadError puts 'Could not load rspec' end