Skip to content

Commit

Permalink
Merge pull request #1945 from puppetlabs/FACT-2218
Browse files Browse the repository at this point in the history
(FACT-2218) virtual fact for OSX
  • Loading branch information
oanatmaria authored Jun 30, 2020
2 parents 2248ea3 + 09c9f9c commit 8a3accd
Show file tree
Hide file tree
Showing 54 changed files with 609 additions and 249 deletions.
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')
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

0 comments on commit 8a3accd

Please sign in to comment.