def system_profile(machine_id, installed_rpms, yum_repos_d, dnf_modules):
    profile = {}
    if machine_id:
        profile["id"] = machine_id.content[0].strip()
    profile["installed_packages"] = []
    if installed_rpms:
        for pkg_name in installed_rpms.packages:
            pkg = installed_rpms.get_max(pkg_name)
            profile["installed_packages"].append(pkg.nevra)

    profile["yum_repos"] = []
    if yum_repos_d:
        for repo_file in yum_repos_d:
            if repo_file.file_name == 'redhat.repo':
                for repo in repo_file:
                    if repo_file[repo].get('enabled',
                                           '1').lower() in ('1', 'true',
                                                            'enabled', 'yes',
                                                            'on'):
                        profile["yum_repos"].append(repo)
                break

    profile["dnf_modules"] = []
    if dnf_modules:
        for module in dnf_modules:
            for module_name in module.sections():
                profile["dnf_modules"].append({
                    'name':
                    module_name,
                    'stream':
                    module.get(module_name, 'stream')
                })
    metadata_response = make_metadata()
    metadata_response.update(profile)
    return metadata_response
Ejemplo n.º 2
0
def canonical_facts(insights_id, machine_id, bios_uuid, submanid, ips, fqdn,
                    mac_addresses):
    return make_metadata(
        insights_id=_safe_parse(insights_id),
        machine_id=_safe_parse(machine_id),
        bios_uuid=_safe_parse(bios_uuid),
        subscription_manager_id=submanid.data if submanid else None,
        ip_addresses=ips.data if ips else [],
        mac_addresses=list(
            filter(None, (_safe_parse(c)
                          for c in mac_addresses))) if mac_addresses else [],
        fqdn=_safe_parse(fqdn),
    )
Ejemplo n.º 3
0
def canonical_facts(
    insights_id, machine_id, bios_uuid, submanid, ips, fqdn, mac_addresses
):

    facts = dict(
        insights_id=valid_uuid_or_None(_safe_parse(insights_id)),
        machine_id=valid_uuid_or_None(_safe_parse(machine_id)),
        bios_uuid=valid_uuid_or_None(_safe_parse(bios_uuid)),
        subscription_manager_id=valid_uuid_or_None(submanid.data if submanid else None),
        ip_addresses=ips.data if ips else [],
        mac_addresses=valid_mac_addresses(mac_addresses) if mac_addresses else [],
        fqdn=_safe_parse(fqdn),
    )

    return make_metadata(**_filter_falsy(facts))
Ejemplo n.º 4
0
def performance_profile(pmlog_summary, lscpu, aws_instance_id,
                        azure_instance_type):
    profile = {}
    performance_metrics = [
        'mem.physmem', 'mem.util.used', 'kernel.all.cpu.user',
        'kernel.all.cpu.sys', 'kernel.all.cpu.nice', 'kernel.all.cpu.steal',
        'kernel.all.cpu.idle', 'kernel.all.cpu.wait.total', 'disk.all.total',
        'mem.util.cached', 'mem.util.bufmem', 'mem.util.free'
    ]
    profile["total_cpus"] = int(lscpu.info.get('CPUs'))
    if aws_instance_id:
        profile["instance_type"] = aws_instance_id.get('instanceType')
    elif azure_instance_type:
        profile["instance_type"] = azure_instance_type.raw
    else:
        profile["instance_type"] = None
    for i in performance_metrics:
        profile[i] = _.get(pmlog_summary, f'{i}.val')

    metadata_response = make_metadata()
    metadata_response.update(profile)
    return metadata_response
Ejemplo n.º 5
0
def performance_profile(lscpu, aws_instance_id, azure_instance_type,
                        pmlog_summary):
    profile = {}
    if pmlog_summary is not None:
        performance_metrics = [
            'hinv.ncpu',
            'mem.physmem',
            'mem.util.available',
            'disk.dev.total',
            'kernel.all.cpu.idle',
            'kernel.all.pressure.cpu.some.avg',
            'kernel.all.pressure.io.full.avg',
            'kernel.all.pressure.io.some.avg',
            'kernel.all.pressure.memory.full.avg',
            'kernel.all.pressure.memory.some.avg',
        ]
        for i in performance_metrics:
            if i in [
                    'hinv.ncpu', 'mem.physmem', 'mem.util.available',
                    'kernel.all.cpu.idle'
            ]:
                profile[i] = _.get(pmlog_summary, f'{i}.val')
            else:
                profile[i] = _.get(pmlog_summary, i)

    profile["total_cpus"] = int(lscpu.info.get('CPUs'))
    if aws_instance_id:
        profile["instance_type"] = aws_instance_id.get('instanceType')
        profile["region"] = aws_instance_id.get('region')
    elif azure_instance_type:
        profile["instance_type"] = azure_instance_type.raw
    else:
        profile["instance_type"] = None
        profile["region"] = None

    metadata_response = make_metadata()
    metadata_response.update(profile)
    return metadata_response
Ejemplo n.º 6
0
def system_profile(hostname, cpu_info, virt_what, meminfo, ip_addr, dmidecode,
                   redhat_release, uname, lsmod, installed_rpms, unit_files,
                   ps_auxcww, date_utc, uptime, yum_repos_d, ls_etc,
                   cloud_provider, display_name, version_info):
    """
    This method applies parsers to a host and returns a system profile that can
    be sent to inventory service.

    Note that we strip all keys with the value of "None". Inventory service
    ignores any key with None as the value.
    """
    profile = {}
    if uname:
        profile['arch'] = uname.arch

    if dmidecode:
        try:
            profile['bios_release_date'] = dmidecode.bios.get('release_date')
            profile['bios_vendor'] = dmidecode.bios.get('vendor')
            profile['bios_version'] = dmidecode.bios.get('version')
        except AttributeError:
            pass

    if cpu_info:
        profile['cpu_flags'] = cpu_info.flags
        profile['number_of_cpus'] = cpu_info.cpu_count
        profile['number_of_sockets'] = cpu_info.socket_count
        if cpu_info.core_total and cpu_info.socket_count:
            profile[
                'cores_per_socket'] = cpu_info.core_total // cpu_info.socket_count

    if unit_files:
        profile['enabled_services'] = _enabled_services(unit_files)
        profile['installed_services'] = _installed_services(unit_files)

    if virt_what:
        profile['infrastructure_type'] = _get_virt_phys_fact(virt_what)
        profile['infrastructure_vendor'] = virt_what.generic

    if installed_rpms:
        profile['installed_packages'] = sorted(
            [str(p[0]) for p in installed_rpms.packages.values()])

    if lsmod:
        profile['kernel_modules'] = list(lsmod.data.keys())

    if uptime and date_utc:
        boot_time = date_utc.datetime - uptime.uptime
        profile['last_boot_time'] = boot_time.isoformat()

    if ip_addr:
        network_interfaces = []
        for iface in ip_addr:
            interface = {
                'ipv4_addresses': iface.addrs(version=4),
                'ipv6_addresses': iface.addrs(version=6),
                'mac_address': _safe_fetch_interface_field(iface, 'mac'),
                'mtu': _safe_fetch_interface_field(iface, 'mtu'),
                'name': _safe_fetch_interface_field(iface, 'name'),
                'state': _safe_fetch_interface_field(iface, 'state'),
                'type': _safe_fetch_interface_field(iface, 'type')
            }
            network_interfaces.append(_remove_empties(interface))

        profile['network_interfaces'] = network_interfaces

    if uname:
        profile['os_kernel_version'] = uname.version
        profile['os_kernel_release'] = uname.release

    if redhat_release:
        try:
            profile['os_release'] = redhat_release.rhel
        except AttributeError:
            pass

    if ps_auxcww:
        profile['running_processes'] = list(ps_auxcww.running)

    if meminfo:
        profile['system_memory_bytes'] = meminfo.total

    if yum_repos_d:
        repos = []
        for yum_repo_file in yum_repos_d:
            for yum_repo_definition in yum_repo_file:
                baseurl = yum_repo_file[yum_repo_definition].get('baseurl', [])
                repo = {
                    'name':
                    yum_repo_file[yum_repo_definition].get('name'),
                    'base_url':
                    baseurl[0] if len(baseurl) > 0 else None,
                    'enabled':
                    _to_bool(
                        yum_repo_file[yum_repo_definition].get('enabled')),
                    'gpgcheck':
                    _to_bool(
                        yum_repo_file[yum_repo_definition].get('gpgcheck'))
                }
                repos.append(_remove_empties(repo))
        profile['yum_repos'] = repos

    if ls_etc:
        profile['satellite_managed'] = any(
            ls_etc.dir_contains(*satellite_file)
            for satellite_file in SATELLITE_MANAGED_FILES.values()
            if satellite_file[0] in ls_etc)
    if cloud_provider:
        profile['cloud_provider'] = cloud_provider.cloud_provider

    if display_name:
        profile['display_name'] = display_name.content[0]

    if version_info:
        version_info_json = json.loads(version_info.content[0])
        profile['insights_client_version'] = version_info_json[
            'client_version']
        profile['insights_egg_version'] = version_info_json['core_version']

    metadata_response = make_metadata()
    profile_sans_none = _remove_empties(profile)
    metadata_response.update(profile_sans_none)
    return metadata_response
Ejemplo n.º 7
0
def system_profile(hostname, cpu_info, virt_what, meminfo, ip_addr, dmidecode,
                   redhat_release, uname, lsmod, installed_rpms, unit_files,
                   ps_auxcww, date_utc, uptime, yum_repos_d, dnf_modules,
                   cloud_provider, display_name, version_info, product_ids,
                   branch_info, tags):
    """
    This method applies parsers to a host and returns a system profile that can
    be sent to inventory service.

    Note that we strip all keys with the value of "None". Inventory service
    ignores any key with None as the value.
    """
    profile = {"tags": []}
    if uname:
        profile['arch'] = uname.arch

    if dmidecode:
        try:
            profile['bios_release_date'] = dmidecode.bios.get('release_date')
            profile['bios_vendor'] = dmidecode.bios.get('vendor')
            profile['bios_version'] = dmidecode.bios.get('version')
        except AttributeError:
            pass

    if cpu_info:
        profile['cpu_flags'] = cpu_info.flags
        profile['number_of_cpus'] = cpu_info.cpu_count
        profile['number_of_sockets'] = cpu_info.socket_count
        if cpu_info.core_total and cpu_info.socket_count:
            profile[
                'cores_per_socket'] = cpu_info.core_total // cpu_info.socket_count

    if unit_files:
        profile['enabled_services'] = _enabled_services(unit_files)
        profile['installed_services'] = _installed_services(unit_files)

    if virt_what:
        profile['infrastructure_type'] = _get_virt_phys_fact(virt_what)
        profile['infrastructure_vendor'] = virt_what.generic

    if installed_rpms:
        profile['installed_packages'] = sorted(
            [installed_rpms.get_max(p).nevra for p in installed_rpms.packages])

    if lsmod:
        profile['kernel_modules'] = list(lsmod.data.keys())

    if date_utc:
        # re-inject UTC timezone into date_utc in order to obtain isoformat w/ TZ offset
        utc_tz = datetime.timezone(datetime.timedelta(hours=0), name="UTC")
        utcdate = date_utc.datetime.replace(tzinfo=utc_tz)
        profile['captured_date'] = utcdate.isoformat()

    if uptime and date_utc:
        boot_time = date_utc.datetime - uptime.uptime
        profile['last_boot_time'] = boot_time.isoformat()

    if ip_addr:
        network_interfaces = []
        for iface in ip_addr:
            interface = {
                'ipv4_addresses': iface.addrs(version=4),
                'ipv6_addresses': iface.addrs(version=6),
                'mac_address': _safe_fetch_interface_field(iface, 'mac'),
                'mtu': _safe_fetch_interface_field(iface, 'mtu'),
                'name': _safe_fetch_interface_field(iface, 'name'),
                'state': _safe_fetch_interface_field(iface, 'state'),
                'type': _safe_fetch_interface_field(iface, 'type')
            }
            network_interfaces.append(_remove_empties(interface))

        profile['network_interfaces'] = network_interfaces

    if uname:
        profile['os_kernel_version'] = uname.version
        profile['os_kernel_release'] = uname.release

    if redhat_release:
        try:
            profile['os_release'] = redhat_release.rhel
        except AttributeError:
            pass

    if ps_auxcww:
        profile['running_processes'] = list(ps_auxcww.running)

    if meminfo:
        profile['system_memory_bytes'] = meminfo.total

    if yum_repos_d:
        repos = []
        for yum_repo_file in yum_repos_d:
            for yum_repo_definition in yum_repo_file:
                baseurl = yum_repo_file[yum_repo_definition].get('baseurl', [])
                repo = {
                    'id':
                    yum_repo_definition,
                    'name':
                    yum_repo_file[yum_repo_definition].get('name'),
                    'base_url':
                    baseurl[0] if len(baseurl) > 0 else None,
                    'enabled':
                    _to_bool(
                        yum_repo_file[yum_repo_definition].get('enabled')),
                    'gpgcheck':
                    _to_bool(
                        yum_repo_file[yum_repo_definition].get('gpgcheck'))
                }
                repos.append(_remove_empties(repo))
        profile['yum_repos'] = repos

    if dnf_modules:
        modules = []
        for module in dnf_modules:
            for module_name in module.sections():
                modules.append({
                    'name': module_name,
                    'stream': module.get(module_name, 'stream')
                })
        profile['dnf_modules'] = modules

    if cloud_provider:
        profile['cloud_provider'] = cloud_provider.cloud_provider

    if display_name:
        profile['display_name'] = display_name.content[0]

    if version_info:
        version_info_json = json.loads(version_info.content[0])
        profile['insights_client_version'] = version_info_json[
            'client_version']
        profile['insights_egg_version'] = version_info_json['core_version']

    if branch_info:
        branch_info_json = json.loads(branch_info.content.decode("utf-8"))
        if branch_info_json["remote_branch"] != -1:
            profile["satellite_managed"] = True
            profile["satellite_id"] = branch_info_json["remote_leaf"]
        else:
            profile["satellite_managed"] = False
        if branch_info_json.get("labels"):
            profile["tags"] = profile["tags"] + branch_info_json["labels"]

    if product_ids:
        profile['installed_products'] = [{
            'id': product_id
        } for product_id in product_ids.ids]

    if tags:
        tags_json = json.loads(tags.content.decode("utf-8"))
        for item in tags_json:
            item["namespace"] = "insights-client"
        profile["tags"] = profile["tags"] + tags_json

    metadata_response = make_metadata()
    profile_sans_none = _remove_empties(profile)
    metadata_response.update(profile_sans_none)
    return metadata_response
Ejemplo n.º 8
0
def system_profile(
    hostname,
    cpu_info,
    virt_what,
    meminfo,
    ip_addr,
    dmidecode,
    redhat_release,
    uname,
    lsmod,
    lscpu,
    sap,
    sestatus,
    tuned,
    installed_rpms,
    unit_files,
    ps_auxcww,
    date_utc,
    uptime,
    yum_repos_d,
    dnf_modules,
    cloud_provider,
    display_name,
    version_info,
    product_ids,
    branch_info,
    tags,
):
    """
    This method applies parsers to a host and returns a system profile that can
    be sent to inventory service.

    Note that we strip all keys with the value of "None". Inventory service
    ignores any key with None as the value.
    """
    profile = {"tags": {}}
    if uname:
        profile["arch"] = uname.arch

    if dmidecode:
        try:
            profile["bios_release_date"] = dmidecode.bios.get("release_date")
            profile["bios_vendor"] = dmidecode.bios.get("vendor")
            profile["bios_version"] = dmidecode.bios.get("version")
        except AttributeError:
            pass

    if cpu_info:
        profile["cpu_flags"] = cpu_info.flags
        profile["number_of_cpus"] = cpu_info.cpu_count
        profile["number_of_sockets"] = cpu_info.socket_count

    if lscpu:
        profile["cores_per_socket"] = lscpu.info['Cores per socket']

    if sap:
        profile["sap_system"] = True
        sids = {sap.sid(instance) for instance in sap.local_instances}
        profile["sap_sids"] = sorted(list(sids))
        if sap.local_instances:
            inst = sap.local_instances[0]
            if sap[inst].number not in ["98", "99"]:
                profile["sap_instance_number"] = sap[inst].number

    if tuned:
        profile["tuned_profile"] = tuned.data['active']

    if sestatus:
        profile["selinux_current_mode"] = sestatus.data['current_mode'].lower()
        profile["selinux_config_file"] = sestatus.data['mode_from_config_file']

    if unit_files:
        profile["enabled_services"] = _enabled_services(unit_files)
        profile["installed_services"] = _installed_services(unit_files)

    if virt_what:
        profile["infrastructure_type"] = _get_virt_phys_fact(virt_what)
        profile["infrastructure_vendor"] = virt_what.generic

    if installed_rpms:
        profile["installed_packages"] = sorted(
            [installed_rpms.get_max(p).nevra for p in installed_rpms.packages])

    if lsmod:
        profile["kernel_modules"] = list(lsmod.data.keys())

    if date_utc:
        # re-inject UTC timezone into date_utc in order to obtain isoformat w/ TZ offset
        utc_tz = datetime.timezone(datetime.timedelta(hours=0), name="UTC")
        utcdate = date_utc.datetime.replace(tzinfo=utc_tz)
        profile["captured_date"] = utcdate.isoformat()

    if uptime and date_utc:
        boot_time = date_utc.datetime - uptime.uptime
        profile["last_boot_time"] = boot_time.isoformat()

    if ip_addr:
        network_interfaces = []
        for iface in ip_addr:
            interface = {
                "ipv4_addresses": iface.addrs(version=4),
                "ipv6_addresses": iface.addrs(version=6),
                "mac_address": _safe_fetch_interface_field(iface, "mac"),
                "mtu": _safe_fetch_interface_field(iface, "mtu"),
                "name": _safe_fetch_interface_field(iface, "name"),
                "state": _safe_fetch_interface_field(iface, "state"),
                "type": _safe_fetch_interface_field(iface, "type"),
            }
            network_interfaces.append(_remove_empties(interface))

        profile["network_interfaces"] = network_interfaces

    if uname:
        profile["os_kernel_version"] = uname.version
        profile["os_kernel_release"] = uname.release

    if redhat_release:
        try:
            profile["os_release"] = redhat_release.rhel
        except AttributeError:
            pass

    if ps_auxcww:
        profile["running_processes"] = list(ps_auxcww.running)

    if meminfo:
        profile["system_memory_bytes"] = meminfo.total

    if yum_repos_d:
        repos = []
        for yum_repo_file in yum_repos_d:
            for yum_repo_definition in yum_repo_file:
                baseurl = yum_repo_file[yum_repo_definition].get("baseurl", [])
                repo = {
                    "id":
                    yum_repo_definition,
                    "name":
                    yum_repo_file[yum_repo_definition].get("name"),
                    "base_url":
                    baseurl[0] if len(baseurl) > 0 else None,
                    "enabled":
                    _to_bool(
                        yum_repo_file[yum_repo_definition].get("enabled")),
                    "gpgcheck":
                    _to_bool(
                        yum_repo_file[yum_repo_definition].get("gpgcheck")),
                }
                repos.append(_remove_empties(repo))
        profile["yum_repos"] = repos

    if dnf_modules:
        modules = []
        for module in dnf_modules:
            for module_name in module.sections():
                modules.append({
                    "name": module_name,
                    "stream": module.get(module_name, "stream")
                })
        profile["dnf_modules"] = modules

    if cloud_provider:
        profile["cloud_provider"] = cloud_provider.cloud_provider

    if display_name:
        profile["display_name"] = display_name.content[0]

    if version_info:
        version_info_json = json.loads(version_info.content[0])
        profile["insights_client_version"] = version_info_json[
            "client_version"]
        profile["insights_egg_version"] = version_info_json["core_version"]

    if branch_info:
        branch_info_json = json.loads(branch_info.content.decode("utf-8"))
        if branch_info_json["remote_branch"] != -1:
            profile["satellite_managed"] = True
            profile["satellite_id"] = branch_info_json["remote_leaf"]
        else:
            profile["satellite_managed"] = False
        if branch_info_json.get("labels"):
            if type(branch_info_json["labels"]) == list:
                new_tags = format_tags(branch_info_json["labels"])
                profile["tags"].update(new_tags)
            else:
                profile["tags"].update(branch_info_json["labels"])

    if product_ids:
        profile["installed_products"] = [{
            "id": product_id
        } for product_id in product_ids.ids]

    if tags:
        tags_json = json.loads(tags.content.decode("utf-8"))
        if type(tags_json) == list:
            new_tags = format_tags(tags_json)
            profile["tags"].update(new_tags)
        else:
            # Need to turn the values into a list
            for entry in tags_json.keys():
                for k, v in tags_json[entry].items():
                    if type(tags_json[entry][k]) != list:
                        tags_json[entry][k] = []
                        tags_json[entry][k].append(v)
            profile["tags"].update(tags_json)

    metadata_response = make_metadata()
    profile_sans_none = _remove_empties(profile)
    metadata_response.update(profile_sans_none)
    return metadata_response
Ejemplo n.º 9
0
def system_profile(
    hostname,
    aws_instance_id,
    azure_instance_plan,
    cpu_info,
    virt_what,
    meminfo,
    ip_addr,
    dmidecode,
    redhat_release,
    rhsm_releasever,
    uname,
    lsmod,
    lscpu,
    sap,
    sestatus,
    tuned,
    gcp_license_codes,
    gb_status,
    hdb_version,
    installed_rpms,
    unit_files,
    pmlog_summary,
    ps_auxcww,
    date_utc,
    uptime,
    yum_repos_d,
    dnf_modules,
    cloud_provider,
    display_name,
    ansible_host,
    version_info,
    product_ids,
    branch_info,
    tags,
):
    """
    This method applies parsers to a host and returns a system profile that can
    be sent to inventory service.

    Note that we strip all keys with the value of "None". Inventory service
    ignores any key with None as the value.
    """
    profile = {"tags": {"insights-client": {}}}

    if uname:
        try:
            profile["arch"] = uname.arch
        except Exception as e:
            catch_error("uname", e)
            raise

    if dmidecode:
        try:
            if dmidecode.bios:
                profile["bios_release_date"] = dmidecode.bios.get(
                    "release_date")
                profile["bios_vendor"] = dmidecode.bios.get("vendor")
                profile["bios_version"] = dmidecode.bios.get("version")
        except Exception as e:
            catch_error("dmidecode", e)
            raise

    if aws_instance_id:
        if aws_instance_id.get("marketplaceProductCodes"):
            if len(aws_instance_id["marketplaceProductCodes"]) >= 1:
                profile["is_marketplace"] = True

    if azure_instance_plan:
        if any([
                azure_instance_plan.name,
                azure_instance_plan.product,
                azure_instance_plan.publisher,
        ]):
            profile["is_marketplace"] = True

    if gcp_license_codes:
        for i in gcp_license_codes.ids:
            if i in GCP_CONFIRMED_CODES:
                profile["is_marketplace"] = True

    if gb_status:
        # use presence of greenboot as proxy for whether the system should be
        # considered "edge" this should change to use rpm-ostree status once we
        # have it in place.
        profile["host_type"] = "edge"

        # Set the greenboot status
        profile["greenboot_status"] = ("red" if gb_status.red else "green"
                                       if gb_status.green else "Unknown")
        profile["greenboot_status"] = ("red" if gb_status.red else "green"
                                       if gb_status.green else "Unknown")
        profile[
            "greenboot_fallback_detected"] = True if gb_status.fallback else False

    if cpu_info:
        try:
            profile["cpu_flags"] = cpu_info.flags
            profile["cpu_model"] = cpu_info.model_name
            profile["number_of_cpus"] = cpu_info.cpu_count
            profile["number_of_sockets"] = cpu_info.socket_count
        except Exception as e:
            catch_error("cpuinfo", e)
            raise

    if lscpu:
        try:
            profile["cores_per_socket"] = int(
                lscpu.info.get("Cores per socket"))
        except Exception as e:
            catch_error("lscpu", e)
            raise

    if sap:
        try:
            profile["sap_system"] = True
            sids = {sap.sid(instance) for instance in sap.local_instances}
            profile["sap_sids"] = sorted(list(sids))
            if sap.local_instances:
                inst = sap.local_instances[0]
                profile["sap_instance_number"] = sap[inst].number
        except Exception as e:
            catch_error("sap", e)
            raise

    if hdb_version:
        try:
            if type(hdb_version) == list:
                profile["sap_version"] = hdb_version[0].version
            else:
                profile["sap_version"] = hdb_version.version
        except Exception as e:
            catch_error("hdb_version", e)
            raise

    if tuned:
        try:
            if "active" in tuned.data:
                profile["tuned_profile"] = tuned.data["active"]
        except Exception as e:
            catch_error("tuned", e)
            raise

    if sestatus:
        try:
            profile["selinux_current_mode"] = sestatus.data[
                "current_mode"].lower()
            profile["selinux_config_file"] = sestatus.data[
                "mode_from_config_file"]
        except Exception as e:
            catch_error("sestatus", e)
            raise

    if unit_files:
        try:
            profile["enabled_services"] = _enabled_services(unit_files)
            profile["installed_services"] = _installed_services(unit_files)
        except Exception as e:
            catch_error("unit_files", e)
            raise

    if virt_what:
        try:
            profile["infrastructure_type"] = _get_virt_phys_fact(virt_what)
            profile["infrastructure_vendor"] = virt_what.generic
        except Exception as e:
            catch_error("virt_what", e)
            raise

    if installed_rpms:
        try:
            # the sorts work on InstalledRpm instances, which will use the RPM
            # ordering algorithm.
            latest = _get_latest_packages(installed_rpms)
            profile["installed_packages"] = [
                p.nevra for p in _sort_packages(latest)
            ]

            stale = _get_stale_packages(installed_rpms)
            profile["installed_packages_delta"] = [
                p.nevra for p in _sort_packages(stale)
            ]

            gpg_pubkeys = _get_gpg_pubkey_packages(installed_rpms)
            profile["gpg_pubkeys"] = [p.package for p in sorted(gpg_pubkeys)]
        except Exception as e:
            catch_error("installed_packages", e)
            raise

    if lsmod:
        try:
            profile["kernel_modules"] = sorted(list(lsmod.data.keys()))
        except Exception as e:
            catch_error("lsmod", e)
            raise

    if date_utc:
        try:
            # re-inject UTC timezone into date_utc in order to obtain isoformat w/ TZ offset
            utc_tz = datetime.timezone(datetime.timedelta(hours=0), name="UTC")
            utcdate = date_utc.datetime.replace(tzinfo=utc_tz)
            profile["captured_date"] = utcdate.isoformat()
        except Exception as e:
            catch_error("date_utc", e)
            raise

    if uptime and date_utc:
        try:
            boot_time = date_utc.datetime - uptime.uptime
            profile["last_boot_time"] = boot_time.astimezone().isoformat()
        except Exception as e:
            catch_error("uptime", e)
            raise

    if ip_addr:
        try:
            network_interfaces = []
            for iface in ip_addr:
                interface = {
                    "ipv4_addresses": iface.addrs(version=4),
                    "ipv6_addresses": iface.addrs(version=6),
                    "mac_address": _safe_fetch_interface_field(iface, "mac"),
                    "mtu": _safe_fetch_interface_field(iface, "mtu"),
                    "name": _safe_fetch_interface_field(iface, "name"),
                    "state": _safe_fetch_interface_field(iface, "state"),
                    "type": _safe_fetch_interface_field(iface, "type"),
                }
                network_interfaces.append(_remove_empties(interface))

            profile["network_interfaces"] = sorted(network_interfaces,
                                                   key=lambda k: k["name"])
        except Exception as e:
            catch_error("ip_addr", e)
            raise

    if uname:
        try:
            profile["os_kernel_version"] = uname.version
            profile["os_kernel_release"] = uname.release
        except Exception as e:
            catch_error("uname", e)
            raise

    if redhat_release:
        try:
            profile["os_release"] = redhat_release.rhel
            profile["operating_system"] = {
                "major": redhat_release.major,
                "minor": redhat_release.minor,
                "name": "RHEL",
            }
        except Exception as e:
            catch_error("redhat_release", e)
            raise

    # When inventory allows us to delete system facts, do that instead using empty string here
    profile["rhsm"] = {"version": ""}
    if rhsm_releasever:
        try:
            # We can add pre-parsed minor + major values, but the schema specifies just version
            # {"major": rhsm_releasever.major, "minor": rhsm_releasever.minor}
            if rhsm_releasever.set:
                profile["rhsm"] = {"version": rhsm_releasever.set}
        except Exception as e:
            catch_error("rhsm_releasever", e)
            raise

    if ps_auxcww:
        try:
            profile["running_processes"] = sorted(list(ps_auxcww.running))
        except Exception as e:
            catch_error("ps_auxcww", e)
            raise

    if meminfo:
        try:
            profile["system_memory_bytes"] = meminfo.total
        except Exception as e:
            catch_error("meminfo", e)
            raise

    if yum_repos_d:
        try:
            repos = []
            for yum_repo_file in yum_repos_d:
                for yum_repo_definition in yum_repo_file:
                    baseurl = yum_repo_file[yum_repo_definition].get(
                        "baseurl", [])
                    repo = {
                        "id":
                        yum_repo_definition,
                        "name":
                        yum_repo_file[yum_repo_definition].get("name"),
                        "base_url":
                        baseurl[0] if len(baseurl) > 0 else None,
                        "enabled":
                        _to_bool(
                            yum_repo_file[yum_repo_definition].get("enabled")),
                        "gpgcheck":
                        _to_bool(yum_repo_file[yum_repo_definition].get(
                            "gpgcheck")),
                    }
                    repos.append(_remove_empties(repo))
            profile["yum_repos"] = sorted(repos, key=lambda k: k["name"])
        except Exception as e:
            catch_error("yum_repos_d", e)
            raise

    if dnf_modules:
        try:
            modules = []
            for module in dnf_modules:
                for module_name in module.sections():
                    modules.append({
                        "name": module_name,
                        "stream": module.get(module_name, "stream"),
                    })
            profile["dnf_modules"] = sorted(modules, key=lambda k: k["name"])
        except Exception as e:
            catch_error("dnf_modules", e)
            raise

    if cloud_provider:
        try:
            profile["cloud_provider"] = cloud_provider.cloud_provider
        except Exception as e:
            catch_error("cloud_provider", e)
            raise

    if display_name:
        try:
            profile["display_name"] = display_name.content[0]
        except Exception as e:
            catch_error("display_name", e)
            raise

    if ansible_host:
        try:
            profile["ansible_host"] = ansible_host.content[0]
        except Exception as e:
            catch_error("ansible_host", e)
            raise

    if version_info:
        try:
            version_info_json = json.loads(version_info.content[0])
            profile["insights_client_version"] = version_info_json[
                "client_version"]
            profile["insights_egg_version"] = version_info_json["core_version"]
        except Exception as e:
            catch_error("version_info", e)
            raise

    if branch_info:
        try:
            branch_info_json = json.loads(branch_info.content.decode("utf-8"))
            if branch_info_json["remote_branch"] != -1:
                profile["satellite_managed"] = True
                profile["satellite_id"] = branch_info_json["remote_leaf"]
            else:
                profile["satellite_managed"] = False
            if branch_info_json.get("labels"):
                if type(branch_info_json["labels"]) == list:
                    new_tags = format_tags(branch_info_json["labels"])
                    profile["tags"].update(new_tags)
                else:
                    profile["tags"].update(branch_info_json["labels"])
        except Exception as e:
            catch_error("branch_info", e)
            raise

    if product_ids:
        installed_products = []
        try:
            for product_id in list(product_ids.ids):
                installed_products.append({"id": product_id})
            profile["installed_products"] = sorted(installed_products,
                                                   key=lambda k: k["id"])
        except Exception as e:
            catch_error("product_ids", e)
            raise

    if tags:
        try:
            tags_json = json.loads(tags.content.decode("utf-8"))
            if type(tags_json) == list:
                new_tags = format_tags(tags_json)
                profile["tags"].update(new_tags)
            else:
                # Need to turn the values into a list
                for entry in tags_json.keys():
                    for k, v in tags_json[entry].items():
                        if type(tags_json[entry][k]) != list:
                            tags_json[entry][k] = []
                            tags_json[entry][k].append(v)
                profile["tags"].update(tags_json)
        except Exception as e:
            catch_error("tags", e)
            raise

    if pmlog_summary:
        profile["is_ros"] = True

    metadata_response = make_metadata()
    profile_sans_none = _remove_empties(profile)
    metadata_response.update(profile_sans_none)
    return metadata_response