debian-forge/osbuild/solver/__init__.py
Tomáš Hozza 65ef88687e osbuild/solver: add InvalidRequestError exception
This will allow validating request arguments in the solver method in a
different way for dnf4 and dnf5 and raising an exception if needed.

Signed-off-by: Tomáš Hozza <thozza@redhat.com>
2024-09-18 12:26:36 +02:00

82 lines
1.9 KiB
Python
Executable file

import abc
import os
import urllib.error
import urllib.parse
import urllib.request
class Solver(abc.ABC):
@abc.abstractmethod
def dump(self):
pass
@abc.abstractmethod
def depsolve(self, arguments):
pass
@abc.abstractmethod
def search(self, args):
pass
class SolverBase(Solver):
# put any shared helpers in here
pass
class SolverException(Exception):
pass
class GPGKeyReadError(SolverException):
pass
class TransactionError(SolverException):
pass
class RepoError(SolverException):
pass
class MarkingError(SolverException):
pass
class DepsolveError(SolverException):
pass
class InvalidRequestError(SolverException):
pass
def modify_rootdir_path(path, root_dir):
if path and root_dir:
# if the root_dir is set, we need to translate the key path to be under this directory
return os.path.join(root_dir, path.lstrip("/"))
return path
def read_keys(paths, root_dir=None):
keys = []
for path in paths:
url = urllib.parse.urlparse(path)
if url.scheme == "file":
path = url.path
path = modify_rootdir_path(path, root_dir)
try:
with open(path, mode="r", encoding="utf-8") as keyfile:
keys.append(keyfile.read())
except Exception as e:
raise GPGKeyReadError(f"error loading gpg key from {path}: {e}") from e
elif url.scheme in ["http", "https"]:
try:
resp = urllib.request.urlopen(urllib.request.Request(path))
keys.append(resp.read().decode())
except urllib.error.URLError as e:
raise GPGKeyReadError(f"error reading remote gpg key at {path}: {e}") from e
else:
raise GPGKeyReadError(f"unknown url scheme for gpg key: {url.scheme} ({path})")
return keys