Skip to content
This repository has been archived by the owner on Jun 19, 2020. It is now read-only.

Commit

Permalink
(maint) Add os.release facts on FreeBSD
Browse files Browse the repository at this point in the history
  • Loading branch information
smortex committed Apr 30, 2020
1 parent 60117e2 commit 010a16f
Show file tree
Hide file tree
Showing 6 changed files with 179 additions and 1 deletion.
36 changes: 36 additions & 0 deletions lib/facts/freebsd/os/release.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# 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)

version, branch_value, patchlevel_value = installed_userland.split('-')
major_value, minor_value = version.split('.')
if patchlevel_value
branch_value = "#{branch_value}-#{patchlevel_value}"
patchlevel_value = patchlevel_value.sub(/\Ap/, '')
end

value = {
full: installed_userland,
major: major_value,
branch: branch_value
}

value[:minor] = minor_value if minor_value
value[:patchlevel] = patchlevel_value if patchlevel_value

[Facter::ResolvedFact.new(FACT_NAME, value),
Facter::ResolvedFact.new(ALIASES.first, major_value, :legacy),
Facter::ResolvedFact.new(ALIASES.last, installed_userland, :legacy)]
end
end
end
end
end
2 changes: 2 additions & 0 deletions lib/framework/detector/os_detector.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ def detect
:macosx
when /linux/
detect_distro
when /freebsd/
:freebsd
when /bsd/
:bsd
when /solaris/
Expand Down
36 changes: 36 additions & 0 deletions lib/resolvers/freebsd/freebsd_version_resolver.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# frozen_string_literal: true

module Facter
module Resolvers
module Freebsd
class FreebsdVersion < BaseResolver
@semaphore = Mutex.new
@fact_list ||= {}

class << self
private

def post_resolve(fact_name)
@fact_list.fetch(fact_name) { freebsd_version_system_call(fact_name) }
end

def freebsd_version_system_call(fact_name)
output, _status = Open3.capture2('/bin/freebsd-version -kru')

build_fact_list(output)

@fact_list[fact_name]
end

def build_fact_list(output)
freebsd_version_results = output.split("\n")

@fact_list[:installed_kernel] = freebsd_version_results[0].strip
@fact_list[:running_kernel] = freebsd_version_results[1].strip
@fact_list[:installed_userland] = freebsd_version_results[2].strip
end
end
end
end
end
end
6 changes: 5 additions & 1 deletion os_hierarchy.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,11 @@
},
{
"Solaris": [
"Bsd"
{
"Bsd": [
"Freebsd"
]
}
]
},
"Macosx",
Expand Down
71 changes: 71 additions & 0 deletions spec/facter/facts/freebsd/os/release_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# 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 'calls Facter::Resolvers::Freebsd::FreebsdVersion' do
fact.call_the_resolver
expect(Facter::Resolvers::Freebsd::FreebsdVersion).to have_received(:resolve).with(:installed_userland)
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',
'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 'calls Facter::Resolvers::Freebsd::FreebsdVersion' do
fact.call_the_resolver
expect(Facter::Resolvers::Freebsd::FreebsdVersion).to have_received(:resolve).with(:installed_userland)
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',
'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 'calls Facter::Resolvers::Freebsd::FreebsdVersion' do
fact.call_the_resolver
expect(Facter::Resolvers::Freebsd::FreebsdVersion).to have_received(:resolve).with(:installed_userland)
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' => '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
29 changes: 29 additions & 0 deletions spec/facter/resolvers/freebsd/freebsd_version_resolver_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# frozen_string_literal: true

describe Facter::Resolvers::Freebsd::FreebsdVersion do
before do
allow(Open3).to receive(:capture2)
.with('/bin/freebsd-version -kru')
.and_return('13.0-CURRENT
12.1-RELEASE-p3
12.0-STABLE')
end

it 'returns installed kernel' do
result = Facter::Resolvers::Freebsd::FreebsdVersion.resolve(:installed_kernel)

expect(result).to eq('13.0-CURRENT')
end

it 'returns running kernel' do
result = Facter::Resolvers::Freebsd::FreebsdVersion.resolve(:running_kernel)

expect(result).to eq('12.1-RELEASE-p3')
end

it 'returns installed userland' do
result = Facter::Resolvers::Freebsd::FreebsdVersion.resolve(:installed_userland)

expect(result).to eq('12.0-STABLE')
end
end

0 comments on commit 010a16f

Please sign in to comment.