Project

General

Profile

Download (4.33 KB) Statistics
| Branch: | Tag: | Revision:
module Katello
class RhsmFactParser < ::FactParser
def architecture
name = facts['lscpu.architecture'] || facts['uname.machine']
name = "x86_64" if name == "amd64"
name = "i386" if name == "i686"
Architecture.where(:name => name).first_or_create if name.present?
end

def model
if facts['virt::is_guest'] == "true"
name = facts['lscpu.hypervisor_vendor']
else
name = facts['dmi.system.product_name']
end
::Model.where(:name => name.strip).first_or_create if name.present?
end

def support_interfaces_parsing?
true
end

def get_facts_for_interface(interface)
{
'link' => true,
'macaddress' => get_rhsm_mac(interface),
'ipaddress' => get_rhsm_ip(interface),
'ipaddress6' => get_rhsm_ipv6(interface),
}.reject { |_, value| value.nil? }
end

def interfaces
virtual_interface_regexp = /\A([^.]*?)\.(\d+)\z/
super.tap do |interfaces|
interfaces.each do |name, attributes|
attributes[:virtual] = true if name =~ virtual_interface_regexp
end
end
end

def get_interfaces
mac_keys = facts.keys.select { |f| f =~ /net\.interface\..*\.mac_address/ }
names = mac_keys.map do |key|
key.sub('net.interface.', '').sub('.mac_address', '') if facts[key] != 'none'
end
names.compact
end

def operatingsystem
name = facts['distribution.name']
version = facts['distribution.version']
return nil if name.nil? || version.nil?

os_name = distribution_to_puppet_os(name)
major, minor = version.split('.')
unless facts['ignore_os']
os_attributes = {:major => major, :minor => minor || '', :name => os_name}

release_name = os_release_name(os_name)
if release_name
os_attributes[:release_name] = release_name
end

if facts['distribution.name'] == 'Red Hat Enterprise Linux Workstation'
os_attributes[:name] = os_name + '_Workstation'
end

if facts['distribution.name'] == 'CentOS Stream'
os_attributes[:name] = "CentOS_Stream"
end

if facts['distribution.name'] == 'CentOS Linux'
os_attributes[:name] = "CentOS"
end

::Operatingsystem.find_or_create_by(os_attributes)
end
end

def os_release_name(os_name)
if os_name&.match(::Operatingsystem::FAMILIES['Debian'])
facts['distribution.id']&.split&.first&.downcase
end
end

# required to be defined, even if they return nil
def domain
end

def environment
end

def ipmi_interface
end

def boot_timestamp
facts['proc_stat.btime']&.to_i
end

def virtual
facts['virt.is_guest']
end

def ram
facts['memory.memtotal'].to_i / 1024 if facts['memory.memtotal']
end

def sockets
facts['cpu.cpu_socket(s)']
end

def cores
facts['cpu.core(s)_per_socket']
end

def kernel_version
facts['uname.release']
end

def bios
{
:vendor => facts['dmi::bios::all_records::vendor'],
:version => facts['dmi::bios::all_records::version'],
:release_date => facts['dmi::bios::all_records::release_date'],
}
end

private

def get_rhsm_ip(interface)
ip = facts["net.interface.#{interface}.ipv4_address"]
Net::Validations.validate_ip(ip) ? ip : nil
end

def get_rhsm_ipv6(interface)
ip = facts["net.interface.#{interface}.ipv6_address.global"] || facts["net.interface.#{interface}.ipv6_address.host"]
Net::Validations.validate_ip6(ip) ? ip : nil
end

def get_rhsm_mac(interface)
# if secondary then permanent_mac_address contains the physical mac
facts["net.interface.#{interface}.permanent_mac_address"] || facts["net.interface.#{interface}.mac_address"]
end

def distribution_to_puppet_os(name)
case name.downcase
when /red\s*hat/
'RedHat'
when /centos/
'CentOS'
when /fedora/
'Fedora'
when /sles/, /suse.*enterprise.*/
'SLES'
when /debian/
'Debian'
when /ubuntu/
'Ubuntu'
when /oracle/
'OracleLinux'
when /almalinux/
'AlmaLinux'
when /rocky/
'Rocky'
when /amazon/
'Amazon'
else
'Unknown'
end
end
end
end
(2-2/2)