anaconda/anaconda-40.22.3.13/pyanaconda/modules/common/structures/payload.py
2024-11-14 21:39:56 -08:00

287 lines
8.5 KiB
Python

#
# DBus structures for the payload data.
#
# Copyright (C) 2020 Red Hat, Inc.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions of
# the GNU General Public License v.2, or (at your option) any later version.
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY expressed or implied, including the implied warranties of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details. You should have received a copy of the
# GNU General Public License along with this program; if not, write to the
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA. Any Red Hat trademarks that are incorporated in the
# source code or documentation are not subject to the GNU General Public
# License and may only be used or replicated with the express permission of
# Red Hat, Inc.
#
from dasbus.structure import DBusData
from dasbus.typing import * # pylint: disable=wildcard-import
from pyanaconda.core.path import join_paths
from pyanaconda.core.constants import URL_TYPE_BASEURL, DNF_DEFAULT_REPO_COST, REPO_ORIGIN_USER
__all__ = ["RepoConfigurationData", "SSLConfigurationData"]
class SSLConfigurationData(DBusData):
"""Structure with SSL configuration settings."""
def __init__(self):
self._ca_cert_path = ""
self._client_cert_path = ""
self._client_key_path = ""
@property
def ca_cert_path(self) -> Str:
"""Get CA certificate path."""
return self._ca_cert_path
@ca_cert_path.setter
def ca_cert_path(self, ca_cert_path: Str):
self._ca_cert_path = ca_cert_path
@property
def client_cert_path(self) -> Str:
"""Get client certificate path."""
return self._client_cert_path
@client_cert_path.setter
def client_cert_path(self, client_cert_path: Str):
self._client_cert_path = client_cert_path
@property
def client_key_path(self) -> Str:
"""Get client key path."""
return self._client_key_path
@client_key_path.setter
def client_key_path(self, client_key_path: Str):
self._client_key_path = client_key_path
def is_empty(self):
"""Is this configuration empty?
:rtype: bool
"""
return not any([
self._ca_cert_path,
self._client_cert_path,
self._client_key_path]
)
def __repr__(self):
"""Convert this data object to a string."""
if not self.is_empty():
return super().__repr__()
# Don't list attributes if none of them are set.
return "{}()".format(self.__class__.__name__)
class RepoConfigurationData(DBusData):
"""Structure to hold repository configuration."""
def __init__(self):
self._name = ""
self._origin = REPO_ORIGIN_USER
self._enabled = True
self._url = ""
self._type = URL_TYPE_BASEURL
self._ssl_verification_enabled = True
self._ssl_configuration = SSLConfigurationData()
self._proxy = ""
self._cost = DNF_DEFAULT_REPO_COST
self._exclude_packages = []
self._included_packages = []
self._installation_enabled = False
@classmethod
def from_directory(cls, directory_path):
"""Generate RepoConfigurationData url from directory path.
This will basically add file:/// to the directory and set it to url with a proper type.
:param str directory_path: directory which will be used to create url
:return: RepoConfigurationData instance
"""
data = RepoConfigurationData()
data.url = join_paths("file:///", directory_path)
return data
@classmethod
def from_url(cls, url):
"""Create a new configuration for the specified URL.
:param str url: a URL of the installation source
:return RepoConfigurationData: a new configuration
"""
data = RepoConfigurationData()
data.url = url
return data
@property
def name(self) -> Str:
"""Get name of this repository.
If name is not set it will be generated by source.
"""
return self._name
@name.setter
def name(self, name: Str):
self._name = name
@property
def origin(self) -> Str:
"""The origin of the repository.
Supported values:
SYSTEM Provided by the system.
USER Specified by a user.
TREEINFO Generated from a .treeinfo file.
:return: a type of the origin
"""
return self._origin
@origin.setter
def origin(self, value: Str):
self._origin = value
@property
def enabled(self) -> Bool:
"""Is the repository enabled?
:return: True or False
"""
return self._enabled
@enabled.setter
def enabled(self, value):
self._enabled = value
@property
def url(self) -> Str:
"""Get link to the repository."""
return self._url
@url.setter
def url(self, url: Str):
self._url = url
@property
def type(self) -> Str:
"""Get type of the url.
Possible values:
- BASEURL
- MIRRORLIST
- METALINK
"""
return self._type
@type.setter
def type(self, url_type: Str):
self._type = url_type
@property
def ssl_verification_enabled(self) -> Bool:
"""Is ssl verification enabled?
You can disable SSL verification to reach server with certificate
which is not part of installation environment.
"""
return self._ssl_verification_enabled
@ssl_verification_enabled.setter
def ssl_verification_enabled(self, ssl_verification_enabled: Bool):
self._ssl_verification_enabled = ssl_verification_enabled
@property
def ssl_configuration(self) -> SSLConfigurationData:
"""Inner structure for SSL configuration.
See SSLConfigurationData for more details.
"""
return self._ssl_configuration
@ssl_configuration.setter
def ssl_configuration(self, ssl_configuration: SSLConfigurationData):
self._ssl_configuration = ssl_configuration
@property
def proxy(self) -> Str:
"""Get proxy URL for this repository.
:return: a proxy URL
"""
return self._proxy
@proxy.setter
def proxy(self, proxy: Str):
self._proxy = proxy
@property
def cost(self) -> Int:
"""Cost value of this repository.
The relative cost of accessing this repository. This value is compared when the
priorities of two repositories are the same. The repository with the lowest cost is picked.
Default value is 1000.
"""
return self._cost
@cost.setter
def cost(self, cost: Int):
self._cost = cost
@property
def excluded_packages(self) -> List[Str]:
"""Packages which won't be fetched from the repository.
A list of package names and globs that must not be fetched from this repository.
This is useful if multiple repositories provide the same package and you
want to make sure it is not fetched from a particular repository during installation.
"""
return self._exclude_packages
@excluded_packages.setter
def excluded_packages(self, excluded_packages: List[Str]):
self._exclude_packages = excluded_packages
@property
def included_packages(self) -> List[Str]:
"""Get packages which only should be installed from the repository.
A list of package names and globs that can be pulled from this repository.
Any other packages provided by the repository not on this list will be ignored.
This is useful if you want to install just a single package or set of packages
from a repository while including all other packages the repository provides.
"""
return self._included_packages
@included_packages.setter
def included_packages(self, included_packages: List[Str]):
self._included_packages = included_packages
@property
def installation_enabled(self) -> Bool:
"""Should the repository be installed to the target system?
The installer will generate a repo file with a configuration
of this repository and write it to the target system.
:return: True or False
"""
return self._installation_enabled
@installation_enabled.setter
def installation_enabled(self, value: Bool):
self._installation_enabled = value