diff --git a/lib/facts/debian/os/name.rb b/lib/facts/debian/os/name.rb index 2b7b021d6..ad13db282 100644 --- a/lib/facts/debian/os/name.rb +++ b/lib/facts/debian/os/name.rb @@ -8,7 +8,7 @@ class Name ALIASES = 'operatingsystem' def call_the_resolver - fact_value = Facter::Resolvers::LsbRelease.resolve(:distributor_id) + fact_value = Facter::Resolvers::OsRelease.resolve(:name) [Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)] end diff --git a/lib/facts/debian/os/release.rb b/lib/facts/debian/os/release.rb index c64752bd1..f4fe3ce93 100644 --- a/lib/facts/debian/os/release.rb +++ b/lib/facts/debian/os/release.rb @@ -8,7 +8,7 @@ class Release ALIASES = %w[operatingsystemmajrelease operatingsystemrelease].freeze def call_the_resolver - fact_value = Facter::Resolvers::LsbRelease.resolve(:release) + fact_value = Facter::Resolvers::OsRelease.resolve(:release) return Facter::ResolvedFact.new(FACT_NAME, nil) unless fact_value @@ -16,7 +16,7 @@ def call_the_resolver release = { 'full' => fact_value, 'major' => versions[0], - 'minor' => versions[1] + 'minor' => versions[1].gsub(/^0([1-9])/, '\1') } [Facter::ResolvedFact.new(FACT_NAME, release), diff --git a/lib/resolvers/debian_version_resolver.rb b/lib/resolvers/debian_version_resolver.rb deleted file mode 100644 index 0eebca6b1..000000000 --- a/lib/resolvers/debian_version_resolver.rb +++ /dev/null @@ -1,34 +0,0 @@ -# frozen_string_literal: true - -module Facter - module Resolvers - class DebianVersion < BaseResolver - # :major - # :minor - # :full - - @semaphore = Mutex.new - @fact_list ||= {} - - class << self - private - - def post_resolve(fact_name) - @fact_list.fetch(fact_name) { read_debian_version(fact_name) } - end - - def read_debian_version(fact_name) - output, _status = Open3.capture2('cat /etc/debian_version') - full_version = output.delete("\n") - versions = full_version.split('.') - - @fact_list[:full] = full_version - @fact_list[:major] = versions[0] - @fact_list[:minor] = versions[1].gsub(/^0([1-9])/, '\1') - - @fact_list[fact_name] - end - end - end - end -end diff --git a/lib/resolvers/os_release_resolver.rb b/lib/resolvers/os_release_resolver.rb index c82dc924b..b48ba720d 100644 --- a/lib/resolvers/os_release_resolver.rb +++ b/lib/resolvers/os_release_resolver.rb @@ -39,6 +39,7 @@ def read_os_release_file(fact_name) fill_fact_list(pairs) process_name + find_debian_release if @fact_list[:name].match?(/Debian/) @fact_list[fact_name] end @@ -48,6 +49,7 @@ def fill_fact_list(pairs) result.each { |k, v| @fact_list[k.downcase.to_sym] = v } @fact_list[:identifier] = @fact_list[:id] + @fact_list[:release] = @fact_list[:version_id] end def process_name @@ -59,6 +61,13 @@ def process_name @fact_list[:name].split(' ')[0].strip end end + + def find_debian_release + return unless File.readable?('/etc/debian_version') + + version = File.read('/etc/debian_version') + @fact_list[:release] = version.strip + end end end end diff --git a/spec/facter/facts/debian/os/name_spec.rb b/spec/facter/facts/debian/os/name_spec.rb index aaf193478..3b04652d7 100644 --- a/spec/facter/facts/debian/os/name_spec.rb +++ b/spec/facter/facts/debian/os/name_spec.rb @@ -7,12 +7,12 @@ let(:value) { 'Debian' } before do - allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:distributor_id).and_return(value) + allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:name).and_return(value) end - it 'calls Facter::Resolvers::LsbRelease' do + it 'calls Facter::Resolvers::OsRelease' do fact.call_the_resolver - expect(Facter::Resolvers::LsbRelease).to have_received(:resolve).with(:distributor_id) + expect(Facter::Resolvers::OsRelease).to have_received(:resolve).with(:name) end it 'returns operating system name fact' do diff --git a/spec/facter/facts/debian/os/release_spec.rb b/spec/facter/facts/debian/os/release_spec.rb index 526ce17e9..079654870 100644 --- a/spec/facter/facts/debian/os/release_spec.rb +++ b/spec/facter/facts/debian/os/release_spec.rb @@ -5,16 +5,16 @@ subject(:fact) { Facts::Debian::Os::Release.new } before do - allow(Facter::Resolvers::LsbRelease).to receive(:resolve).with(:release).and_return(value) + allow(Facter::Resolvers::OsRelease).to receive(:resolve).with(:release).and_return(value) end context 'when lsb_release installed' do - let(:value) { '10.9' } - let(:value_final) { { 'full' => '10.9', 'major' => '10', 'minor' => '9' } } + let(:value) { '10.09' } + let(:value_final) { { 'full' => '10.09', 'major' => '10', 'minor' => '9' } } - it 'calls Facter::Resolvers::LsbRelease' do + it 'calls Facter::Resolvers::OsRelease' do fact.call_the_resolver - expect(Facter::Resolvers::LsbRelease).to have_received(:resolve).with(:release) + expect(Facter::Resolvers::OsRelease).to have_received(:resolve).with(:release) end it 'returns release fact' do diff --git a/spec/facter/resolvers/debian_version_resolver_spec.rb b/spec/facter/resolvers/debian_version_resolver_spec.rb deleted file mode 100644 index f53232602..000000000 --- a/spec/facter/resolvers/debian_version_resolver_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -describe Facter::Resolvers::DebianVersion do - before do - allow(Open3).to receive(:capture2) - .with('cat /etc/debian_version') - .and_return("10.01\n") - end - - it 'returns full' do - result = Facter::Resolvers::DebianVersion.resolve(:full) - - expect(result).to eq('10.01') - end - - it 'returns major' do - result = Facter::Resolvers::DebianVersion.resolve(:major) - - expect(result).to eq('10') - end - - it 'returns minor' do - result = Facter::Resolvers::DebianVersion.resolve(:minor) - - expect(result).to eq('1') - end -end diff --git a/spec/facter/resolvers/os_release_resolver_spec.rb b/spec/facter/resolvers/os_release_resolver_spec.rb index af90aa3df..67f0d23ba 100644 --- a/spec/facter/resolvers/os_release_resolver_spec.rb +++ b/spec/facter/resolvers/os_release_resolver_spec.rb @@ -1,39 +1,96 @@ # frozen_string_literal: true describe Facter::Resolvers::OsRelease do - before do - allow(File).to receive(:readable?) - .with('/etc/os-release') - .and_return(true) + context 'when os is ubuntu' do + before do + allow(File).to receive(:readable?) + .with('/etc/os-release') + .and_return(true) - allow(File).to receive(:read) - .with('/etc/os-release') - .and_return(load_fixture('os_release').read) + allow(File).to receive(:read) + .with('/etc/os-release') + .and_return(load_fixture('os_release').read) + end - Facter::Resolvers::OsRelease.invalidate_cache - end + after do + Facter::Resolvers::OsRelease.invalidate_cache + end - it 'returns os NAME' do - result = Facter::Resolvers::OsRelease.resolve(:name) + it 'returns os NAME' do + result = Facter::Resolvers::OsRelease.resolve(:name) - expect(result).to eq('Ubuntu') - end + expect(result).to eq('Ubuntu') + end - it 'returns os PRETTY_NAME' do - result = Facter::Resolvers::OsRelease.resolve(:pretty_name) + it 'returns os PRETTY_NAME' do + result = Facter::Resolvers::OsRelease.resolve(:pretty_name) - expect(result).to eq('Ubuntu 18.04.1 LTS') - end + 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_ID' do - result = Facter::Resolvers::OsRelease.resolve(:version_id) + it 'returns os release' do + result = Facter::Resolvers::OsRelease.resolve(:release) - expect(result).to eq('18.04') + 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 end - it 'returns os VERSION_CODENAME' do - result = Facter::Resolvers::OsRelease.resolve(:version_codename) + context 'when os is Debian' do + before do + allow(File).to receive(:readable?).with('/etc/os-release').and_return(true) + + allow(File).to receive(:read) + .with('/etc/os-release') + .and_return(load_fixture('os_release_debian').read) + + allow(File).to receive(:readable?).with('/etc/debian_version').and_return(true) + allow(File).to receive(:read).with('/etc/debian_version').and_return("10.0\n") + end + + after do + Facter::Resolvers::OsRelease.invalidate_cache + end + + it 'returns os release' do + result = Facter::Resolvers::OsRelease.resolve(:release) + + expect(result).to eq('10.0') + end + + 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' do + result = Facter::Resolvers::OsRelease.resolve(:version_id) + + expect(result).to eq('10') + end + + it 'returns os VERSION_CODENAME' do + result = Facter::Resolvers::OsRelease.resolve(:version_codename) - expect(result).to eq('bionic') + expect(result).to eq('buster') + end end end diff --git a/spec/fixtures/os_release_debian b/spec/fixtures/os_release_debian new file mode 100644 index 000000000..9dec8014a --- /dev/null +++ b/spec/fixtures/os_release_debian @@ -0,0 +1,9 @@ +PRETTY_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/" \ No newline at end of file