Source code for insights.parsers.subscription_manager

# -*- coding: utf-8 -*-
"""
subscription-manager commands
=============================

Parsers for parsing output of the ``subscription-manager`` commands.

SubscriptionManagerID - command ``subscription-manager identity``
-----------------------------------------------------------------

SubscriptionManagerFacts - command ``subscription-manager facts``
-----------------------------------------------------------------

SubscriptionManagerStatus - command ``subscription-manager status``
-------------------------------------------------------------------

SubscriptionManagerSyspurpose - command ``subscription-manager syspurpose``
---------------------------------------------------------------------------
"""

import uuid

from insights.core import CommandParser, JSONParser
from insights.core.exceptions import SkipComponent
from insights.core.filters import add_filter
from insights.core.plugins import parser
from insights.specs import Specs

add_filter(
    Specs.subscription_manager_facts,
    [
        'conversions.activity',
        'image-builder.osbuild-composer.api-type',
        'instance_id',
    ],
)


def _local_kv_split(lines):
    ret = dict()
    for line in lines:
        # handle full-width colon
        line = line.replace(':', ': ')
        if ': ' in line:
            key, val = [_l.strip() for _l in line.split(': ', 1)]
            ret[key] = val
    if ret:
        return ret
    raise SkipComponent


[docs] @parser(Specs.subscription_manager_id) class SubscriptionManagerID(CommandParser, dict): """ Reads the output of subscription-manager identity and retrieves the UUID Example output:: system identity: 6655c27c-f561-4c99-a23f-111111111111 name: rhel7.localdomain org name: 1234567 org ID: 1234567 Examples:: >>> type(subman_id) <class 'insights.parsers.subscription_manager.SubscriptionManagerID'> >>> subman_id.identity == '6655c27c-f561-4c99-a23f-111111111111' True >>> subman_id.get('org ID') == '1234567' True >>> subman_id.uuid == '6655c27c-f561-4c99-a23f-111111111111' True """
[docs] def parse_content(self, content): self.update(_local_kv_split(content))
@property def identity(self): """ Returns the value of 'system identity'. Multiple language support is from: - https://github.com/candlepin/subscription-manager/tree/main/po """ SYSID_MULT_LANG = [ 'system identity', # en first 'identidad de sistema', 'identidade do sistema', 'identità del sistema', 'identité du système', 'Systemidentität', 'идентификация системы', 'तंत्र पहचान', 'प्रणाली ओळख', 'চিস্টেম পৰিচয়', 'সিস্টেম পরিচয়', 'ਸਿਸਟਮ ਸ਼ਨਾਖਤ', 'સિસ્ટમ ઓળખ', 'ତନ୍ତ୍ର ପରିଚୟ', 'கணினி அடையாளம்', 'వ్యవస్థ గుర్తింపు', 'ವ್ಯವಸ್ಥೆಯ ಗುರುತು', 'സിസ്റ്റം ഐഡന്റിറ്റി', 'სისტემის იდენტიფიკატორი', 'システム ID', '系統身份', '系统身份', '시스템 ID', ] for name in SYSID_MULT_LANG: if name in self: return self[name] @property def uuid(self): """ Returns the UUID of 'system identity' in standard format (32 digits separated by hyphens). """ if self.identity: return str(uuid.UUID(self.identity))
[docs] @parser(Specs.subscription_manager_facts) class SubscriptionManagerFacts(CommandParser, dict): """ Class for parsing the output of `subscription-manager facts` command. Typical output of the command is:: aws_instance_id: 567890567890 network.ipv6_address: ::1 uname.sysname: Linux uname.version: #1 SMP PREEMPT Fri Sep 2 16:07:40 EDT 2022 virt.host_type: rhev, kvm virt.is_guest: True Examples: >>> type(rhsm_facts) <class 'insights.parsers.subscription_manager.SubscriptionManagerFacts'> >>> rhsm_facts['aws_instance_id'] '567890567890' """
[docs] def parse_content(self, content): self.update(_local_kv_split(content))
[docs] @parser(Specs.subscription_manager_status) class SubscriptionManagerStatus(CommandParser, dict): """ Reads the output of subscription-manager status Example output:: +-------------------------------------------+ System Status Details +-------------------------------------------+ Overall Status: Disabled Content Access Mode is set to Simple Content Access. This host has access to content, regardless of subscription status. System Purpose Status: Disabled Examples:: >>> type(subman_status) <class 'insights.parsers.subscription_manager.SubscriptionManagerStatus'> >>> subman_status['Overall Status'] == 'Disabled' True >>> subman_status['Content Access Mode'] == 'Simple Content Access' True >>> subman_status['System Purpose Status'] == 'Disabled' True """
[docs] def parse_content(self, content): self.unparsed_lines = [] for line in content: line = line.strip() if not line: continue if ': ' in line: key, val = [_l.strip() for _l in line.split(': ', 1)] self[key] = val elif line.startswith('Content Access Mode is set to'): self['Content Access Mode'] = ( line.split('.', 1)[0].split('Content Access Mode is set to')[1].strip() ) elif line.startswith("Red Hat Enterprise Linux for Virtual Datacenters"): subscription_type = line.split(',')[1].strip(':').strip() if ',' in line else '' self['Red Hat Enterprise Linux for Virtual Datacenters'] = subscription_type elif "Guest has not been reported on any host" in line: self.unparsed_lines.append(line) if not self: raise SkipComponent
[docs] @parser(Specs.subscription_manager_syspurpose) class SubscriptionManagerSyspurpose(CommandParser, JSONParser): """ Reads the output of subscription-manager syspurpose Example output:: { "addons": [], "role": "Red Hat Enterprise Linux Server", "service_level_agreement": "Standard", "usage": "Development/Test" } Examples:: >>> type(subman_syspurpose) <class 'insights.parsers.subscription_manager.SubscriptionManagerSyspurpose'> >>> subman_syspurpose.get('role') == 'Red Hat Enterprise Linux Server' True >>> subman_syspurpose['service_level_agreement'] == 'Standard' True >>> subman_syspurpose['usage'] == 'Development/Test' True """ pass