From c31b6e207c6bc17ffcc3d2b4d1f45fe5c5202a12 Mon Sep 17 00:00:00 2001 From: Goffi Date: Wed, 4 Mar 2026 15:49:47 +0100 Subject: [PATCH] applicactions: fix applications: This patch fix application configuration parsing. Peertube and Weblate can be started again. --- .../libervia_app_peertube.yaml | 4 ++-- .../libervia_app_weblate.yaml | 14 ++++++------ .../plugin_misc_app_manager/__init__.py | 22 ++++++++++++++++--- libervia/backend/tools/config.py | 6 ++++- 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/libervia/backend/plugins/plugin_app_manager_docker/libervia_app_peertube.yaml b/libervia/backend/plugins/plugin_app_manager_docker/libervia_app_peertube.yaml index 90293154..4e22614e 100644 --- a/libervia/backend/plugins/plugin_app_manager_docker/libervia_app_peertube.yaml +++ b/libervia/backend/plugins/plugin_app_manager_docker/libervia_app_peertube.yaml @@ -51,7 +51,7 @@ override: PEERTUBE_DB_PASSWORD: &db_password !libervia_generate_pwd {name: db} PEERTUBE_DB_SSL: "false" PEERTUBE_DB_HOSTNAME: "postgres" - PEERTUBE_WEBSERVER_HOSTNAME: !libervia_conf ["application peertube", "hostname"] + PEERTUBE_WEBSERVER_HOSTNAME: !libervia_conf ["application.peertube", "hostname"] PEERTUBE_TRUST_PROXY: '["127.0.0.1", "loopback", "172.18.0.0/16"]' PEERTUBE_SECRET: !libervia_generate_pwd {name: secret} PEERTUBE_SMTP_HOSTNAME: !libervia_conf ["email", "server"] @@ -59,7 +59,7 @@ override: PEERTUBE_SMTP_PASSWORD: !libervia_conf ["email", "password"] PEERTUBE_SMTP_DISABLE_STARTTLS: !libervia_conf ["email", "starttls", "false", "not"] PEERTUBE_SMTP_PORT: !libervia_conf ["email", "port"] - PEERTUBE_SMTP_FROM: !libervia_conf ["application peertube", "email_from", "peertube@example.com"] + PEERTUBE_SMTP_FROM: !libervia_conf ["application.peertube", "email_from", "peertube@example.com"] PEERTUBE_SMTP_TLS: "false" PEERTUBE_ADMIN_EMAIL: !libervia_conf ["common", "email_admins_list", "", "first"] PEERTUBE_OBJECT_STORAGE_UPLOAD_ACL_PUBLIC: "public-read" diff --git a/libervia/backend/plugins/plugin_app_manager_docker/libervia_app_weblate.yaml b/libervia/backend/plugins/plugin_app_manager_docker/libervia_app_weblate.yaml index 52fea4db..dc2a0cab 100644 --- a/libervia/backend/plugins/plugin_app_manager_docker/libervia_app_weblate.yaml +++ b/libervia/backend/plugins/plugin_app_manager_docker/libervia_app_weblate.yaml @@ -14,15 +14,15 @@ override: environment: WEBLATE_DEBUG: 0 WEBLATE_URL_PREFIX: !libervia_param [url_prefix, /weblate] - WEBLATE_EMAIL_HOST: !libervia_conf ["application weblate", "email_server"] - WEBLATE_EMAIL_HOST_USER: !libervia_conf ["application weblate", "email_username"] - WEBLATE_EMAIL_HOST_PASSWORD: !libervia_conf ["application weblate", "email_password"] - WEBLATE_SERVER_EMAIL: !libervia_conf ["application weblate", "email_from", "weblate@example.com"] - WEBLATE_DEFAULT_FROM_EMAIL: !libervia_conf ["application weblate", "email_from", "weblate@example.com"] - WEBLATE_SITE_DOMAIN: !libervia_conf ["application weblate", "public_url"] + WEBLATE_EMAIL_HOST: !libervia_conf ["application.weblate", "email_server"] + WEBLATE_EMAIL_HOST_USER: !libervia_conf ["application.weblate", "email_username"] + WEBLATE_EMAIL_HOST_PASSWORD: !libervia_conf ["application.weblate", "email_password"] + WEBLATE_SERVER_EMAIL: !libervia_conf ["application.weblate", "email_from", "weblate@example.com"] + WEBLATE_DEFAULT_FROM_EMAIL: !libervia_conf ["application.weblate", "email_from", "weblate@example.com"] + WEBLATE_SITE_DOMAIN: !libervia_conf ["application.weblate", "public_url"] WEBLATE_ADMIN_PASSWORD: !libervia_generate_pwd {name: admin} WEBLATE_ADMIN_EMAIL: !libervia_conf ["common", "email_admins_list", "", "first"] - WEBLATE_ENABLE_HTTPS: !libervia_conf ["application weblate", "enable_https", "1"] + WEBLATE_ENABLE_HTTPS: !libervia_conf ["application.weblate", "enable_https", "1"] volumes: - ./settings-override.py:/app/data/settings-override.py:ro expose: diff --git a/libervia/backend/plugins/plugin_misc_app_manager/__init__.py b/libervia/backend/plugins/plugin_misc_app_manager/__init__.py index ab9f73d8..191fd49f 100644 --- a/libervia/backend/plugins/plugin_misc_app_manager/__init__.py +++ b/libervia/backend/plugins/plugin_misc_app_manager/__init__.py @@ -150,7 +150,7 @@ class AppManager: ) data["_instance_dir_obj"].cleanup() - def _libervia_conf_constr(self, loader, node) -> str: + def _libervia_conf_constr(self, loader, node) -> str|None: """Get a value from Libervia configuration A list is expected with either "name" of a config parameter, a one or more of @@ -178,7 +178,21 @@ class AppManager: "is expected" ) - value = getattr(getattr(G.config, section), name) or default + try: + if section.startswith("application."): + key = section[12:].strip() + if not key: + raise ValueError("Invalid configuration section: {section!r}}") + value = G.config.application.get(key, {}).get(name, default) + else: + value = getattr(getattr(G.config, section), name) or default + except (AttributeError, KeyError): + from pudb import set_trace; set_trace() + raise ValueError( + f"Invalid configuration request: {section=}, {name=}, {default=}, " + f"{filter=}" + ) + # FIXME: "public_url" is used only here and doesn't take multi-sites into account if name == "public_url" and (not value or value.startswith("http")): if not value: @@ -201,9 +215,11 @@ class AppManager: if filter_ is None: pass elif filter_ == "first": + if not value: + raise ValueError("Invalid value: {value!r}") value = value[0] elif filter_ == "not": - value = C.bool(value) + assert isinstance(value, bool) value = C.bool_const(not value).lower() else: raise ValueError(f"unmanaged filter: {filter_}") diff --git a/libervia/backend/tools/config.py b/libervia/backend/tools/config.py index f56bc8c2..24d5a739 100644 --- a/libervia/backend/tools/config.py +++ b/libervia/backend/tools/config.py @@ -22,7 +22,7 @@ from collections import defaultdict from pathlib import Path from socket import getfqdn -from typing import Annotated, Literal, TypeVar, cast +from typing import Annotated, Any, Literal, TypeVar, cast from pydantic import ( AfterValidator, @@ -384,6 +384,10 @@ class Settings(BaseSettings): email: EmailSettings = Field(default_factory=EmailSettings) tls: TLSSettings = Field(default_factory=TLSSettings) tor: TorSettings = Field(default_factory=TorSettings) + application: dict[str, dict[str, str]] = Field( + default_factory=dict, + description="Application specific settings, used by app manager." + ) plugin: dict = Field(default_factory=dict, description="Plugin specific settings.") component: dict = Field( default_factory=dict, description="Component specific settings."