Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(FACT-2218) virtual fact for OSX #1945

Merged
merged 9 commits into from
Jun 30, 2020
2 changes: 2 additions & 0 deletions .rubocop_todo.yml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ RSpec/FilePath:
- 'spec/framework/formatters/legacy_fact_formatter_spec.rb'
- 'spec/framework/formatters/yaml_fact_formatter_spec.rb'
- 'spec/framework/utils/utils_spec.rb'
- 'spec/facter/resolvers/macosx/utils/system_profile_executor_spec.rb'


# Offense count: 15
# Configuration parameters: AssignmentOnly.
Expand Down
6 changes: 3 additions & 3 deletions lib/facts/macosx/is_virtual.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ def virtual?
end

def hypervisor_name
model_identifier = Facter::Resolvers::SystemProfiler.resolve(:model_identifier)
model_identifier = Facter::Resolvers::Macosx::SystemProfiler.resolve(:model_identifier)
return 'vmware' if model_identifier&.start_with?('VMware')

boot_rom_version = Facter::Resolvers::SystemProfiler.resolve(:boot_rom_version)
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::SystemProfiler.resolve(:subsystem_vendor_id)
subsystem_vendor_id = Facter::Resolvers::Macosx::SystemProfiler.resolve(:subsystem_vendor_id)
return 'parallels' if subsystem_vendor_id&.start_with?('0x1ab8')
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/boot_mode.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class BootMode
ALIASES = 'sp_boot_mode'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:boot_mode)
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
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/boot_rom_version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class BootRomVersion
ALIASES = 'sp_boot_rom_version'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:boot_rom_version)
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
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/boot_volume.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class BootVolume
ALIASES = 'sp_boot_volume'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:boot_volume)
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
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/computer_name.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class ComputerName
ALIASES = 'sp_local_host_name'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:computer_name)
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
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/cores.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class Cores
ALIASES = 'sp_number_processors'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:total_number_of_cores)
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
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/hardware_uuid.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class HardwareUuid
ALIASES = 'sp_hardware_uuid'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:hardware_uuid)
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
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/kernel_version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class KernelVersion
ALIASES = 'sp_kernel_version'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:kernel_version)
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
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/l2_cache_per_core.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class L2CachePerCore
ALIASES = 'sp_l2_cache_per_core'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:l2_cache_per_core)
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
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/l3_cache.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class L3Cache
ALIASES = 'sp_l3_cache'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:l3_cache)
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
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/memory.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class Memory
ALIASES = 'sp_memory'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:memory)
fact_value = Facter::Resolvers::Macosx::SystemProfiler.resolve(:memory)
[Facter::ResolvedFact.new(FACT_NAME, fact_value), Facter::ResolvedFact.new(ALIASES, fact_value, :legacy)]
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/model_identifier.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class ModelIdentifier
ALIASES = 'sp_machine_model'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:model_identifier)
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
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/model_name.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class ModelName
ALIASES = 'sp_machine_name'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:model_name)
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
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/processor_name.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class ProcessorName
ALIASES = 'sp_processor_name'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:processor_name)
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
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/processor_speed.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class ProcessorSpeed
ALIASES = 'sp_current_processor_speed'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:processor_speed)
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
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/processors.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class Processors
ALIASES = 'sp_cpu_type'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:number_of_processors)
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
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/secure_virtual_memory.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class SecureVirtualMemory
ALIASES = 'sp_secure_vm'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:secure_virtual_memory)
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
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/serial_number.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class SerialNumber
ALIASES = 'sp_serial_number'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:serial_number_system)
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
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/smc_version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class SmcVersion
ALIASES = 'sp_smc_version_system'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:smc_version_system)
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
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/system_version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class SystemVersion
ALIASES = 'sp_os_version'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:system_version)
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
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/uptime.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class Uptime
ALIASES = 'sp_uptime'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:time_since_boot)
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
Expand Down
2 changes: 1 addition & 1 deletion lib/facts/macosx/system_profiler/username.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class Username
ALIASES = 'sp_user_name'

def call_the_resolver
fact_value = Facter::Resolvers::SystemProfiler.resolve(:user_name)
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
Expand Down
32 changes: 32 additions & 0 deletions lib/facts/macosx/virtual.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# 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

Facter::ResolvedFact.new(FACT_NAME, fact_value)
end

private

def check_vmware
model_identifier = Facter::Resolvers::Macosx::SystemProfiler.resolve(:model_identifier)
return 'vmware' if model_identifier&.start_with?('VMware')
end

def check_virtualbox
boot_rom_version = Facter::Resolvers::Macosx::SystemProfiler.resolve(:boot_rom_version)
return 'virtualbox' if boot_rom_version&.start_with?('VirtualBox')
end

def check_parallels
subsystem_vendor_id = Facter::Resolvers::Macosx::SystemProfiler.resolve(:subsystem_vendor_id)
return 'parallels' if subsystem_vendor_id&.start_with?('0x1ab8')
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is 0x1ab8 constant? Won't it change on other versions?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a constant used since Facter 2.x

result = "parallels" if output["spethernet_subsystem-vendor-id"] =~ /0x1ab8/

It is the same for Facter 3.x

if (line == "Subsystem Vendor ID: 0x1ab8") {

end
end
end
end
90 changes: 37 additions & 53 deletions lib/resolvers/macosx/system_profiler_resolver.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,59 +2,43 @@

module Facter
module Resolvers
class SystemProfiler < BaseResolver
# model_name
# model_identifier
# processor_name
# processor_speed
# number_of_processors
# total_number_of_cores
# l2_cache_per_core
# l3_cache
# hyper-threading_technology
# memory
# boot_rom_version
# serial_number_system
# hardware_uuid
# activation_lock_status
# system_version
# kernel_version
# boot_volume
# boot_mode
# computer_name
# user_name
# secure_virtual_memory
# system_integrity_protection
# time_since_boot
# smc_version_system

@semaphore = Mutex.new
@fact_list = {}

class << self
private

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

def retrieve_system_profiler(fact_name)
@fact_list ||= {}

log.debug 'Executing command: system_profiler SPSoftwareDataType SPHardwareDataType'
output = Facter::Core::Execution.execute(
'system_profiler SPHardwareDataType SPSoftwareDataType', logger: log
).force_encoding('UTF-8')
@fact_list = output.scan(/.*:[ ].*$/).map { |e| e.strip.match(/(.*?): (.*)/).captures }.to_h
normalize_factlist

@fact_list[fact_name]
end

def normalize_factlist
@fact_list = @fact_list.map do |k, v|
[k.downcase.tr(' ', '_').delete("\(\)").to_sym, v]
end.to_h
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

@semaphore = Mutex.new
@fact_list = {}

class << self
private

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

def retrieve_system_profiler(fact_name)
@fact_list ||= {}

case fact_name
when *SP_HARDWARE_DATA_TYPE
@fact_list.merge!(SystemProfileExecutor.execute('SPHardwareDataType'))
when *SP_SOFTWARE_DATA_TYPE
@fact_list.merge!(SystemProfileExecutor.execute('SPSoftwareDataType'))
when *SP_ETHERNET_DATA_TYPE
@fact_list.merge!(SystemProfileExecutor.execute('SPEthernetDataType'))
end

@fact_list[fact_name]
end
end
end
end
Expand Down
38 changes: 38 additions & 0 deletions lib/resolvers/macosx/utils/system_profile_executor.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# frozen_string_literal: true

module Facter
module Resolvers
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.map do |k, v|
[k.downcase.tr(' ', '_').delete("\(\)").to_sym, v]
end.to_h
end
end
end
end
end
end
Loading