Source code for univention.management.console.modules.setup.checks.repositories

# SPDX-FileCopyrightText: 2024-2025 Univention GmbH
# SPDX-License-Identifier: AGPL-3.0-only

import subprocess
from collections.abc import Iterable, Iterator
from os import environ
from shlex import quote
from typing import cast

from univention.config_registry import ucr_live as UCR
from univention.management.console.log import MODULE


PROXY_MAP = {
    "http_proxy": 'proxy/http',
    "https_proxy": 'proxy/https',
    "no_proxy": 'proxy/no_proxy',
}


[docs] def get_unreachable_repository_servers() -> list[str]: """ Start a process to check the reachability of important servers. Servers: * UCS repository server (`repository/online/server`) * App server (`repository/app_center/server`) * `docker.software-univention.de` :returns: List of URLs. """ servers = [ UCR.get('repository/online/server'), UCR.get('repository/app_center/server'), 'docker.software-univention.de', ] processes = list(start_curl_processes(servers)) wait_for_processes_to_finish(processes) log_warnings_about_unreachable_repository_servers(zip(servers, processes)) return [server for server, process in zip(servers, processes) if process.returncode != 0]
[docs] def start_curl_processes(servers: Iterable[str]) -> Iterator[subprocess.Popen]: """ Start a :command:`curl` process to check the reachability of important servers.process :param servers: List of URLs to check. :returns: List of processes. """ ENV = { envvar: UCR[ucrvar] for (envvar, ucrvar) in PROXY_MAP.items() if ucrvar in UCR } env = dict(environ, **ENV) for server in servers: cmd = ['curl', '--max-time', '10', '--silent', '--show-error', '--head', server] yield subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=env)
[docs] def wait_for_processes_to_finish(processes: Iterable[subprocess.Popen]) -> None: """ Wait until all processes have finished. :param processes: List of processes. """ for process in processes: process.wait()
[docs] def log_warnings_about_unreachable_repository_servers(servers_with_curl_processes: Iterable[tuple[str, subprocess.Popen]]) -> None: """ Log a message for all failed processes. :param processes: List of 2-tuples (URL, process) """ for server, process in servers_with_curl_processes: if process.returncode != 0: stdout, _strerr = process.communicate() MODULE.warning("'%s' exited with returncode %s: %s", " ".join(quote(arg) for arg in cast(Iterable[str], process.args)), process.returncode, stdout.decode(errors="replace"))