HEX
Server: Apache
System: Linux a16-asgard6.hospedagemuolhost.com.br 5.14.0-570.52.1.el9_6.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Oct 15 06:39:08 EDT 2025 x86_64
User: maoristu4c3dbd03 (1436)
PHP: 8.1.33
Disabled: NONE
Upload Files
File: //lib64/python3.9/site-packages/rhsmlib/services/config.py
# Copyright (c) 2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
import rhsm.config
import collections.abc
from typing import Iterator, Any, Union


class Config(collections.abc.MutableMapping):
    """
    Class for managing RHSM configuration file (rhsm.conf)
    """

    def __init__(self, parser: rhsm.config.RhsmConfigParser = None, auto_persist: bool = False):
        if parser:
            self._parser = parser
        else:
            self._parser = rhsm.config.get_config_parser()

        self.auto_persist = auto_persist

        self._sections = {}
        for s in self._parser.sections():
            self._sections[s] = ConfigSection(self, self._parser, s, self.auto_persist)
        super(Config, self).__init__()

    def persist(self) -> None:
        self._parser.save()

    def defaults(self) -> dict:
        return self._parser.defaults()

    def __getitem__(self, name: str) -> "ConfigSection":
        if name in self:
            return self._sections[name]
        raise KeyError("No configuration section '%s' exists" % name)

    def __setitem__(self, key: str, value: Any) -> None:
        try:
            value.items()
        except Exception:
            raise

        if key in self:
            # Similar to __delitem__ but with no persistence
            self._parser.remove_section(key)
            # Be aware that RhsmConfigParser is very diligent about keeping
            # default values in the configuration.  Deleting the section will result
            # in all the section's values being reset to the defaults.
            del self._sections[key]

        self._parser.add_section(key)
        self._sections[key] = ConfigSection(self, self._parser, key, self.auto_persist)

        for k, v in value.items():
            self._sections[key][k] = v

        if self.auto_persist:
            self.persist()

    def __delitem__(self, key: str) -> None:
        self._parser.remove_section(key)
        del self._sections[key]
        if self.auto_persist:
            self.persist()

    def __contains__(self, key: str) -> bool:
        return key in self._sections

    def __iter__(self) -> Iterator:
        return iter(self._parser.sections())

    def iter_sections(self) -> Iterator:
        """An iterator that yields the actual ConfigSection objects instead of just
        the names of the sections."""
        for s in self._parser.sections():
            yield self[s]

    def __len__(self) -> int:
        return len(self._parser.sections())

    def __repr__(self) -> str:
        result = {}
        for name, s in list(self._sections.items()):
            result[name] = repr(s)
        return "%s" % result


class ConfigSection(collections.abc.MutableMapping):
    """
    Class representing section in rhsm.conf configuration file
    """

    def __init__(
        self, wrapper: Config, parser: rhsm.config.RhsmConfigParser, section: str, auto_persist: bool = False
    ):
        self._wrapper = wrapper
        self._parser = parser
        self._section = section
        self.auto_persist = auto_persist

    def __iter__(self) -> Iterator:
        return iter(self._parser.options(self._section))

    def __getitem__(self, key: str) -> str:
        if key in self:
            return self._parser.get(self._section, key)
        raise KeyError("Property '%s' does not exist in section '%s'" % (key, self._section))

    def __setitem__(self, key: str, value: Any) -> None:
        self._parser.set(self._section, key, value)
        if self.auto_persist:
            self._wrapper.persist()

    def __delitem__(self, key: str) -> None:
        if key in self:
            self._parser.remove_option(self._section, key)
            if self.auto_persist:
                self._persist()
        else:
            raise KeyError("Property '%s' does not exist in section '%s'" % (key, self._section))

    def __contains__(self, key: str) -> bool:
        return self._parser.has_option(self._section, key)

    def __len__(self) -> int:
        return len(self._parser.options(self._section))

    def _persist(self) -> None:
        self._wrapper.persist()

    def __repr__(self) -> str:
        return "%s" % self._parser.items(self._section)

    def get_int(self, key: str) -> Union[int, None]:
        """
        Try to get integer value for given key
        :param key: String with key.
        :return: Return integer value, when key exists. Otherwise, return None.
        """
        return self._parser.get_int(self._section, key)

    def get_default(self, key: str) -> Union[str, None]:
        """
        Try to get default value for given key.
        :param key: String with key
        :return: Return string representation of default value, when default value for given key exists.
            Otherwise, return None.
        """
        return self._parser.get_default(self._section, key)

    def has_default(self, key: str) -> bool:
        return self._parser.has_default(self._section, key)