From 4c751a75d22fa74a4a9c8dea01e1329a76e95ebd Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Tue, 24 Oct 2023 11:15:25 +0000 Subject: [PATCH 01/20] Translated using Weblate (Spanish) Currently translated at 100.0% (1551 of 1551 strings) --- plinth/locale/es/LC_MESSAGES/django.po | 112 +++++++++++-------------- 1 file changed, 51 insertions(+), 61 deletions(-) diff --git a/plinth/locale/es/LC_MESSAGES/django.po b/plinth/locale/es/LC_MESSAGES/django.po index e77b95601..7459efa35 100644 --- a/plinth/locale/es/LC_MESSAGES/django.po +++ b/plinth/locale/es/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-23 20:05-0400\n" -"PO-Revision-Date: 2023-09-27 10:59+0000\n" +"PO-Revision-Date: 2023-10-25 12:01+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.1-dev\n" +"X-Generator: Weblate 5.1.1-dev\n" #: doc/dev/_templates/layout.html:11 msgid "Page source" @@ -1560,27 +1560,22 @@ msgid "Low Memory" msgstr "Poca memoria libre" #: plinth/modules/diagnostics/__init__.py:248 -#, fuzzy -#| msgid "Run Diagnostics" msgid "Running diagnostics" -msgstr "Ejecutar diagnósticos" +msgstr "Ejecutando los diagnósticos" #: plinth/modules/diagnostics/__init__.py:289 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." msgstr "" +"Se han encontrado {issue_count} problemas durante las pruebas rutinarias." #: plinth/modules/diagnostics/__init__.py:290 -#, fuzzy -#| msgid "Diagnostic Results" msgid "Diagnostics results" -msgstr "Resultado del diagnóstico" +msgstr "Resultados de los diagnósticos" #: plinth/modules/diagnostics/__init__.py:295 -#, fuzzy -#| msgid "Diagnostic Results" msgid "Go to diagnostics results" -msgstr "Resultado del diagnóstico" +msgstr "Ir a los resultados de los diagnósticos" #: plinth/modules/diagnostics/templates/diagnostics.html:16 #: plinth/modules/diagnostics/templates/diagnostics_button.html:11 @@ -1588,10 +1583,8 @@ msgid "Run Diagnostics" msgstr "Ejecutar diagnósticos" #: plinth/modules/diagnostics/templates/diagnostics.html:21 -#, fuzzy -#| msgid "Results" msgid "View Results" -msgstr "Resultados" +msgstr "Ver los resultados" #: plinth/modules/diagnostics/templates/diagnostics_app.html:10 msgid "Diagnostic Results" @@ -1607,10 +1600,8 @@ msgid "This app does not support diagnostics" msgstr "Esta aplicación no soporta diagnósticos" #: plinth/modules/diagnostics/templates/diagnostics_full.html:17 -#, fuzzy -#| msgid "Run Diagnostics" msgid "Re-run Diagnostics" -msgstr "Ejecutar diagnósticos" +msgstr "Volver a ejecutar los diagnósticos" #: plinth/modules/diagnostics/templates/diagnostics_full.html:21 msgid "Diagnostics test is currently running" @@ -3167,6 +3158,10 @@ msgid "" "Wikipedia available without using the internet, but it is potentially " "suitable for all HTML content. Kiwix packages are in the ZIM file format." msgstr "" +"Kiwix es un lector sin conexión para contenidos web. Es un software pensado " +"para que la Wikipedia esté disponible sin usar Internet, pero es " +"potencialmente adecuado para todo el contenido HTML. Los paquetes Kiwix " +"están en el formato ZIM." #: plinth/modules/kiwix/__init__.py:25 msgid "" @@ -3180,6 +3175,15 @@ msgid "" "
  • Magazines: Low-tech Magazine
  • \n" " " msgstr "" +"Kiwix puede alojar varios tipos de contenido:\n" +"
      \n" +"
    • Versiones sin conexión de páginas web: proyectos Wikimedia, Stack " +"Exchange
    • \n" +"
    • Contenidos de vídeo: Khan Academy, TED Talks, Crash Course
    • \n" +"
    • Materiales educativos: PHET, TED Ed, Vikidia
    • \n" +"
    • eBooks: Proyecto Gutenberg
    • \n" +"
    • Revistas: Low-tech Magazine
    • \n" +"
    " #: plinth/modules/kiwix/__init__.py:33 #: plinth/modules/kiwix/templates/kiwix-add-package.html:14 @@ -3189,25 +3193,26 @@ msgid "" "project or create your own." msgstr "" +"Puede descargar paquetes de contenido del proyecto Kiwix o crear los suyos propios." #: plinth/modules/kiwix/__init__.py:53 msgid "Manage Kiwix content server" -msgstr "" +msgstr "Gestionar el servidor de contenido Kiwix" #: plinth/modules/kiwix/__init__.py:56 plinth/modules/kiwix/manifest.py:8 msgid "Kiwix" -msgstr "" +msgstr "Kiwix" #: plinth/modules/kiwix/__init__.py:57 msgid "Offline Wikipedia" -msgstr "" +msgstr "Wikipedia sin conexión" #: plinth/modules/kiwix/forms.py:23 -#, fuzzy -#| msgid "Backup files have to be in .tar.gz format" msgid "Content packages have to be in .zim format" -msgstr "" -"Los archivos de la copia de seguridad deben de estar en formato .tar.gz" +msgstr "Los paquetes deben estar en formato .zim" #: plinth/modules/kiwix/forms.py:25 #, python-brace-format @@ -3216,73 +3221,64 @@ msgid "" "{box_name}. If Kiwix fails to add the file, it will be deleted immediately " "to save disk space." msgstr "" +"Los archivos ZIM cargados se almacenarán en {kiwix_home}/content en su " +"{box_name}. Si Kiwix no consigue añadir el archivo, se eliminará " +"inmediatamente para ahorrar espacio en disco." #: plinth/modules/kiwix/templates/kiwix-add-package.html:24 #, python-format msgid "You have %(max_filesize)s of free disk space available." -msgstr "" +msgstr "Dispone de %(max_filesize)s espacio libre en el disco." #: plinth/modules/kiwix/templates/kiwix-add-package.html:36 -#, fuzzy -#| msgid "Upload file" msgid "Upload ZIM file" -msgstr "Subir archivo" +msgstr "Cargar el archivo ZIM" #: plinth/modules/kiwix/templates/kiwix-delete-package.html:11 -#, fuzzy, python-format -#| msgid "Delete Wiki or Blog %(name)s" +#, python-format msgid "Delete content package %(name)s" -msgstr "Borrar Wiki o Blog %(name)s" +msgstr "Eliminar el paquete de contenidos %(name)s" #: plinth/modules/kiwix/templates/kiwix-delete-package.html:17 msgid "" "Delete this package permanently? You may add it back later if you have a " "copy of the ZIM file." msgstr "" +"¿Borrar este paquete definitivamente? Puedes volver a añadirlo más tarde si " +"tienes una copia del archivo ZIM." #: plinth/modules/kiwix/templates/kiwix.html:11 msgid "Manage Content Packages" -msgstr "" +msgstr "Gestionar los paquetes del contenido" #: plinth/modules/kiwix/templates/kiwix.html:15 -#, fuzzy -#| msgid "Add a new peer" msgid "Add a content package" -msgstr "Añadir nuevo par" +msgstr "Añadir un paquete de contenidos" #: plinth/modules/kiwix/templates/kiwix.html:17 -#, fuzzy -#| msgid "Package" msgid "Add Package" -msgstr "Paquete" +msgstr "Añadir un paquete" #: plinth/modules/kiwix/templates/kiwix.html:24 -#, fuzzy -#| msgid "No status available." msgid "No content packages available." -msgstr "Estado de actualización No disponible." +msgstr "No hay paquetes de contenido disponibles." #: plinth/modules/kiwix/templates/kiwix.html:37 -#, fuzzy, python-format -#| msgid "Delete site %(site)s" +#, python-format msgid "Delete package %(title)s" -msgstr "Eliminar sitio %(site)s" +msgstr "Borrar el paquete %(title)s" #: plinth/modules/kiwix/views.py:49 msgid "Content package added." -msgstr "" +msgstr "Se ha añadido un paquete de contenidos." #: plinth/modules/kiwix/views.py:54 -#, fuzzy -#| msgid "Add a new peer" msgid "Add a new content package" -msgstr "Añadir nuevo par" +msgstr "Añadir un nuevo paquete de contenidos" #: plinth/modules/kiwix/views.py:83 -#, fuzzy -#| msgid "Failed to add user to group." msgid "Failed to add content package." -msgstr "Ha fallado añadir al o la usuaria al grupo." +msgstr "No se ha podido añadir el paquete de contenido." #: plinth/modules/letsencrypt/__init__.py:25 #, python-brace-format @@ -3526,13 +3522,6 @@ msgstr "" "@username:domainname." #: plinth/modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:26 -#, fuzzy -#| msgid "" -#| "\n" -#| " Warning! Changing the domain name after the " -#| "initial\n" -#| " setup is currently not supported.\n" -#| " " msgid "" "\n" " Warning! Changing the domain name after this step " @@ -3542,9 +3531,10 @@ msgid "" " " msgstr "" "\n" -" Atención! Actualmente no está soportado cambiar el " -"nombre\n" -" de dominio una vez hecha la configuración inicial.\n" +" ¡Atención! Cambiar el nombre del dominio después de " +"este paso \n" +" requerirá desinstalar y volver a instalar la aplicación, lo que " +"borrará los datos de la aplicación.\n" " " #: plinth/modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:35 From b5ad386d6c73e5fde1b6b13ab484c0a10e286862 Mon Sep 17 00:00:00 2001 From: Burak Yavuz Date: Thu, 26 Oct 2023 19:38:48 +0000 Subject: [PATCH 02/20] Translated using Weblate (Turkish) Currently translated at 98.5% (1529 of 1551 strings) --- plinth/locale/tr/LC_MESSAGES/django.po | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po index d41828472..e85338e17 100644 --- a/plinth/locale/tr/LC_MESSAGES/django.po +++ b/plinth/locale/tr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-23 20:05-0400\n" -"PO-Revision-Date: 2023-09-27 10:59+0000\n" +"PO-Revision-Date: 2023-10-28 04:14+0000\n" "Last-Translator: Burak Yavuz \n" "Language-Team: Turkish \n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.1-dev\n" +"X-Generator: Weblate 5.2-dev\n" #: doc/dev/_templates/layout.html:11 msgid "Page source" @@ -1538,10 +1538,8 @@ msgid "Low Memory" msgstr "Düşük Bellek" #: plinth/modules/diagnostics/__init__.py:248 -#, fuzzy -#| msgid "Run Diagnostics" msgid "Running diagnostics" -msgstr "Tanılamayı Çalıştır" +msgstr "Tanılama çalıştırılıyor" #: plinth/modules/diagnostics/__init__.py:289 #, no-python-format, python-brace-format @@ -1549,16 +1547,12 @@ msgid "Found {issue_count} issues during routine tests." msgstr "" #: plinth/modules/diagnostics/__init__.py:290 -#, fuzzy -#| msgid "Diagnostic Results" msgid "Diagnostics results" -msgstr "Tanı Sonuçları" +msgstr "Tanı sonuçları" #: plinth/modules/diagnostics/__init__.py:295 -#, fuzzy -#| msgid "Diagnostic Results" msgid "Go to diagnostics results" -msgstr "Tanı Sonuçları" +msgstr "Tanı sonuçlarına git" #: plinth/modules/diagnostics/templates/diagnostics.html:16 #: plinth/modules/diagnostics/templates/diagnostics_button.html:11 @@ -1566,10 +1560,8 @@ msgid "Run Diagnostics" msgstr "Tanılamayı Çalıştır" #: plinth/modules/diagnostics/templates/diagnostics.html:21 -#, fuzzy -#| msgid "Results" msgid "View Results" -msgstr "Sonuçlar" +msgstr "Sonuçları Görüntüle" #: plinth/modules/diagnostics/templates/diagnostics_app.html:10 msgid "Diagnostic Results" @@ -1585,10 +1577,8 @@ msgid "This app does not support diagnostics" msgstr "Bu uygulama tanılamayı desteklemiyor" #: plinth/modules/diagnostics/templates/diagnostics_full.html:17 -#, fuzzy -#| msgid "Run Diagnostics" msgid "Re-run Diagnostics" -msgstr "Tanılamayı Çalıştır" +msgstr "Tanılamayı Yeniden Çalıştır" #: plinth/modules/diagnostics/templates/diagnostics_full.html:21 msgid "Diagnostics test is currently running" From 520ce34e7c26c43732dc32e12441363856e9cccd Mon Sep 17 00:00:00 2001 From: Ettore Atalan Date: Sun, 29 Oct 2023 09:10:43 +0000 Subject: [PATCH 03/20] Translated using Weblate (German) Currently translated at 98.1% (1523 of 1551 strings) --- plinth/locale/de/LC_MESSAGES/django.po | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/plinth/locale/de/LC_MESSAGES/django.po b/plinth/locale/de/LC_MESSAGES/django.po index 7fdce21ef..150111c98 100644 --- a/plinth/locale/de/LC_MESSAGES/django.po +++ b/plinth/locale/de/LC_MESSAGES/django.po @@ -10,8 +10,8 @@ msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-23 20:05-0400\n" -"PO-Revision-Date: 2023-09-29 12:00+0000\n" -"Last-Translator: Dietmar \n" +"PO-Revision-Date: 2023-10-30 10:00+0000\n" +"Last-Translator: Ettore Atalan \n" "Language-Team: German \n" "Language: de\n" @@ -19,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.1-dev\n" +"X-Generator: Weblate 5.2-dev\n" #: doc/dev/_templates/layout.html:11 msgid "Page source" @@ -1576,7 +1576,7 @@ msgstr "Wenig Speicher" #, fuzzy #| msgid "Run Diagnostics" msgid "Running diagnostics" -msgstr "Diagnose starten" +msgstr "Laufende Diagnose" #: plinth/modules/diagnostics/__init__.py:289 #, no-python-format, python-brace-format @@ -1584,16 +1584,12 @@ msgid "Found {issue_count} issues during routine tests." msgstr "" #: plinth/modules/diagnostics/__init__.py:290 -#, fuzzy -#| msgid "Diagnostic Results" msgid "Diagnostics results" msgstr "Diagnose-Ergebnisse" #: plinth/modules/diagnostics/__init__.py:295 -#, fuzzy -#| msgid "Diagnostic Results" msgid "Go to diagnostics results" -msgstr "Diagnose-Ergebnisse" +msgstr "Zu Diagnose-Ergebnisse gehen" #: plinth/modules/diagnostics/templates/diagnostics.html:16 #: plinth/modules/diagnostics/templates/diagnostics_button.html:11 @@ -1601,10 +1597,8 @@ msgid "Run Diagnostics" msgstr "Diagnose starten" #: plinth/modules/diagnostics/templates/diagnostics.html:21 -#, fuzzy -#| msgid "Results" msgid "View Results" -msgstr "Ergebnis" +msgstr "Ergebnisse ansehen" #: plinth/modules/diagnostics/templates/diagnostics_app.html:10 msgid "Diagnostic Results" @@ -1620,10 +1614,8 @@ msgid "This app does not support diagnostics" msgstr "Diese App unterstützt keine Diagnose" #: plinth/modules/diagnostics/templates/diagnostics_full.html:17 -#, fuzzy -#| msgid "Run Diagnostics" msgid "Re-run Diagnostics" -msgstr "Diagnose starten" +msgstr "Diagnose erneut ausführen" #: plinth/modules/diagnostics/templates/diagnostics_full.html:21 msgid "Diagnostics test is currently running" From 2a8b9b94ba650597cd6412ccceb0f57a0958d1da Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 23 Oct 2023 13:12:15 -0400 Subject: [PATCH 04/20] app: Update diagnose() docstring Signed-off-by: James Valleroy [sunil: Add reference documentation for the DiagnosticCheck and Result classes] [sunil: Add link to DiagnosticCheck class from docstring] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- doc/dev/reference/components/index.rst | 9 +++++++++ plinth/app.py | 16 +++++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/doc/dev/reference/components/index.rst b/doc/dev/reference/components/index.rst index 52c2e8d42..ad3fd9d97 100644 --- a/doc/dev/reference/components/index.rst +++ b/doc/dev/reference/components/index.rst @@ -33,3 +33,12 @@ Base Classes .. autoclass:: plinth.app.FollowerComponent :members: + +Other Classes +^^^^^^^^^^^^^ + +.. autoclass:: plinth.modules.diagnostics.check.DiagnosticCheck + :members: + +.. autoclass:: plinth.modules.diagnostics.check.Result + :members: diff --git a/plinth/app.py b/plinth/app.py index fef709259..17927270f 100644 --- a/plinth/app.py +++ b/plinth/app.py @@ -211,10 +211,11 @@ class App: def diagnose(self): """Run diagnostics and return results. - Return value must be a list of results. Each result is a two-tuple with - first value as user visible description of the test followed by the + Return value must be a list of results. Each result is a + :class:`~plinth.modules.diagnostics.check.DiagnosticCheck` with a + unique check_id, a user visible description of the test, and the result. The test result is a string enumeration from 'failed', - 'passed', 'error' and 'warning'. + 'passed', 'error', 'warning' and 'not_done'. Results are typically collected by diagnosing each component of the app and then supplementing the results with any app level diagnostic tests. @@ -303,10 +304,11 @@ class Component: def diagnose(): """Run diagnostics and return results. - Return value must be a list of results. Each result is a two-tuple with - first value as user visible description of the test followed by the - result. The test result is a string enumeration from 'failed', 'passed' - and 'error'. + Return value must be a list of results. Each result is a + :class:`~plinth.modules.diagnostics.check.DiagnosticCheck` with a + unique check_id, a user visible description of the test, and the + result. The test result is a string enumeration from 'failed', + 'passed', 'error', 'warning' and 'not_done'. Also see :meth:`.has_diagnostics`. From 1f90047621f449334db23aba53e0da8405fef6d3 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Thu, 26 Oct 2023 19:52:57 -0400 Subject: [PATCH 05/20] diagnostics: Add shortcut to re-run setup for app - When running diagnostics for an app, if there are any failures or warnings, then show a button to re-run setup. - When showing all diagnostics results, if there are any failures or warnings for an app, then show a button to re-run setup for that app. Signed-off-by: James Valleroy [sunil: Use Result class instead of strings for comparison] [sunil: Use flex box's justify-content-between to improve button styling] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- plinth/modules/diagnostics/__init__.py | 6 ++++++ .../templates/diagnostics_app.html | 13 +++++++++++- .../templates/diagnostics_full.html | 21 ++++++++++++++----- plinth/modules/diagnostics/views.py | 10 +++++++++ 4 files changed, 44 insertions(+), 6 deletions(-) diff --git a/plinth/modules/diagnostics/__init__.py b/plinth/modules/diagnostics/__init__.py index 0009438b9..0285270a2 100644 --- a/plinth/modules/diagnostics/__init__.py +++ b/plinth/modules/diagnostics/__init__.py @@ -126,6 +126,7 @@ def _run_on_all_enabled_modules(): app_results = { 'diagnosis': None, 'exception': None, + 'show_rerun_setup': False, } try: @@ -135,6 +136,11 @@ def _run_on_all_enabled_modules(): exception) app_results['exception'] = str(exception) + for check in app_results['diagnosis']: + if check.result in [Result.FAILED, Result.WARNING]: + app_results['show_rerun_setup'] = True + break + with results_lock: current_results['results'][app_id].update(app_results) current_results['progress_percentage'] = \ diff --git a/plinth/modules/diagnostics/templates/diagnostics_app.html b/plinth/modules/diagnostics/templates/diagnostics_app.html index b1bd75dd4..ba2eb77e7 100644 --- a/plinth/modules/diagnostics/templates/diagnostics_app.html +++ b/plinth/modules/diagnostics/templates/diagnostics_app.html @@ -9,7 +9,18 @@

    {% trans "Diagnostic Results" %}

    -

    {% blocktrans %}App: {{ app_name }}{% endblocktrans %}

    +
    +

    {% blocktrans %}App: {{ app_name }}{% endblocktrans %}

    + + {% if show_rerun_setup %} +
    + {% csrf_token %} + +
    + {% endif %} +
    {% if results %} {% include "diagnostics_results.html" with results=results %} diff --git a/plinth/modules/diagnostics/templates/diagnostics_full.html b/plinth/modules/diagnostics/templates/diagnostics_full.html index a6e59ebef..836abd505 100644 --- a/plinth/modules/diagnostics/templates/diagnostics_full.html +++ b/plinth/modules/diagnostics/templates/diagnostics_full.html @@ -33,11 +33,22 @@ {% if results %}

    {% trans "Results" %}

    {% for app_id, app_data in results.results.items %} -

    - {% blocktrans with app_name=app_data.name %} - App: {{app_name}} - {% endblocktrans %} -

    +
    +

    + {% blocktrans with app_name=app_data.name %} + App: {{app_name}} + {% endblocktrans %} +

    + + {% if app_data.show_rerun_setup %} +
    + {% csrf_token %} + +
    + {% endif %} +
    {% if app_data.diagnosis %} {% include "diagnostics_results.html" with results=app_data.diagnosis %} diff --git a/plinth/modules/diagnostics/views.py b/plinth/modules/diagnostics/views.py index 7b1c0830a..a7006b886 100644 --- a/plinth/modules/diagnostics/views.py +++ b/plinth/modules/diagnostics/views.py @@ -17,6 +17,8 @@ from plinth.app import App from plinth.modules import diagnostics from plinth.views import AppView +from .check import Result + logger = logging.getLogger(__name__) @@ -87,10 +89,18 @@ def diagnose_app(request, app_id): exception) diagnosis_exception = str(exception) + show_rerun_setup = False + for check in diagnosis: + if check.result in [Result.FAILED, Result.WARNING]: + show_rerun_setup = True + break + return TemplateResponse( request, 'diagnostics_app.html', { 'title': _('Diagnostic Test'), + 'app_id': app_id, 'app_name': app_name, 'results': diagnosis, 'exception': diagnosis_exception, + 'show_rerun_setup': show_rerun_setup, }) From e3c2546b795ba078446873e99527f01dd58e8f4d Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 30 Oct 2023 15:40:30 -0700 Subject: [PATCH 06/20] datetime: Fix diagnostic test for checking NTP server sync Fixes: #2384 - This was missed during the original transition to DiagnosticCheck class for returning diagnostic results. Tests: - In vagrant container, test that the diagnostic test result shows up in datetime app and it passes. - Running full diagnostics on the system works. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/datetime/__init__.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plinth/modules/datetime/__init__.py b/plinth/modules/datetime/__init__.py index 209154ba4..edee893dd 100644 --- a/plinth/modules/datetime/__init__.py +++ b/plinth/modules/datetime/__init__.py @@ -11,6 +11,7 @@ from plinth import app as app_module from plinth import menu from plinth.daemon import Daemon, RelatedDaemon from plinth.modules.backups.components import BackupRestore +from plinth.modules.diagnostics.check import DiagnosticCheck, Result from plinth.package import Packages from . import manifest @@ -107,13 +108,14 @@ class DateTimeApp(app_module.App): def _diagnose_time_synchronized(): """Check whether time is synchronized to NTP server.""" - result = 'failed' + result = Result.FAILED try: output = subprocess.check_output( ['timedatectl', 'show', '--property=NTPSynchronized', '--value']) if 'yes' in output.decode(): - result = 'passed' + result = Result.PASSED except subprocess.CalledProcessError: pass - return [_('Time synchronized to NTP server'), result] + return DiagnosticCheck('datetime-ntp-sync', + _('Time synchronized to NTP server'), result) From f1059804767bc733f35e5d97db84658e84b4cafa Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 30 Oct 2023 15:44:17 -0700 Subject: [PATCH 07/20] apache: tests: Update to use DiagnosticCheck class Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/apache/tests/test_components.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/plinth/modules/apache/tests/test_components.py b/plinth/modules/apache/tests/test_components.py index 119de8c9e..4c575ad2b 100644 --- a/plinth/modules/apache/tests/test_components.py +++ b/plinth/modules/apache/tests/test_components.py @@ -73,18 +73,22 @@ def test_webserver_diagnose(diagnose_url_on_all, diagnose_url): """Test running diagnostics.""" def on_all_side_effect(url, check_certificate, expect_redirects): - return [('test-result-' + url, 'success')] + return [ + DiagnosticCheck('test-all-id', 'test-result-' + url, 'success') + ] def side_effect(url, check_certificate): - return ('test-result-' + url, 'success') + return DiagnosticCheck('test-id', 'test-result-' + url, 'success') diagnose_url_on_all.side_effect = on_all_side_effect diagnose_url.side_effect = side_effect webserver1 = Webserver('test-webserver', 'test-config', urls=['{host}url1', 'url2'], expect_redirects=True) results = webserver1.diagnose() - assert results == [('test-result-{host}url1', 'success'), - ('test-result-url2', 'success')] + assert results == [ + DiagnosticCheck('test-all-id', 'test-result-{host}url1', 'success'), + DiagnosticCheck('test-id', 'test-result-url2', 'success') + ] diagnose_url_on_all.assert_has_calls( [call('{host}url1', check_certificate=False, expect_redirects=True)]) diagnose_url.assert_has_calls([call('url2', check_certificate=False)]) From 14279cc07a4bc92ea8f46dd4f929420fcfcd7f41 Mon Sep 17 00:00:00 2001 From: Burak Yavuz Date: Wed, 1 Nov 2023 05:32:19 +0000 Subject: [PATCH 08/20] Translated using Weblate (Turkish) Currently translated at 100.0% (1551 of 1551 strings) --- plinth/locale/tr/LC_MESSAGES/django.po | 89 +++++++++++++------------- 1 file changed, 45 insertions(+), 44 deletions(-) diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po index e85338e17..6481ea187 100644 --- a/plinth/locale/tr/LC_MESSAGES/django.po +++ b/plinth/locale/tr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-23 20:05-0400\n" -"PO-Revision-Date: 2023-10-28 04:14+0000\n" +"PO-Revision-Date: 2023-11-03 20:31+0000\n" "Last-Translator: Burak Yavuz \n" "Language-Team: Turkish \n" @@ -1544,7 +1544,7 @@ msgstr "Tanılama çalıştırılıyor" #: plinth/modules/diagnostics/__init__.py:289 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." -msgstr "" +msgstr "Sıradan denemeler sırasında {issue_count} sorun bulundu." #: plinth/modules/diagnostics/__init__.py:290 msgid "Diagnostics results" @@ -3140,6 +3140,10 @@ msgid "" "Wikipedia available without using the internet, but it is potentially " "suitable for all HTML content. Kiwix packages are in the ZIM file format." msgstr "" +"Kiwix, web içeriği için çevrimdışı bir okuyucudur. Vikipedi’yi interneti " +"kullanmadan kullanılabilir hale getirmeyi amaçlayan bir yazılımdır, ancak " +"potansiyel olarak tüm HTML içeriği için uygundur. Kiwix paketleri ZIM " +"dosyası biçimindedir." #: plinth/modules/kiwix/__init__.py:25 msgid "" @@ -3153,6 +3157,15 @@ msgid "" "
  • Magazines: Low-tech Magazine
  • \n" " " msgstr "" +"Kiwix çeşitli içerik türlerini barındırabilir:\n" +"
      \n" +"
    • Web sitelerinin çevrimdışı sürümleri: Wikimedia projects, Stack " +"Exchange
    • \n" +"
    • Video içeriği: Khan Academy, TED Talks, Crash Course
    • \n" +"
    • Eğitim materyalleri: PHET, TED Ed, Vikidia
    • \n" +"
    • eKitaplar: Project Gutenberg
    • \n" +"
    • Dergiler: Low-tech Magazine
    • \n" +"
    " #: plinth/modules/kiwix/__init__.py:33 #: plinth/modules/kiwix/templates/kiwix-add-package.html:14 @@ -3162,24 +3175,26 @@ msgid "" "project or create your own." msgstr "" +"Kiwix projesinden içerik paketlerini indirebilirsiniz veya " +"kendinizinkini oluşturabilirsiniz." #: plinth/modules/kiwix/__init__.py:53 msgid "Manage Kiwix content server" -msgstr "" +msgstr "Kiwix içerik sunucusunu yönetin" #: plinth/modules/kiwix/__init__.py:56 plinth/modules/kiwix/manifest.py:8 msgid "Kiwix" -msgstr "" +msgstr "Kiwix" #: plinth/modules/kiwix/__init__.py:57 msgid "Offline Wikipedia" -msgstr "" +msgstr "Çevrimdışı Vikipedi" #: plinth/modules/kiwix/forms.py:23 -#, fuzzy -#| msgid "Backup files have to be in .tar.gz format" msgid "Content packages have to be in .zim format" -msgstr "Yedekleme dosyaları .tar.gz biçiminde olmak zorundadır" +msgstr "İçerik paketleri .zim biçiminde olmak zorundadır" #: plinth/modules/kiwix/forms.py:25 #, python-brace-format @@ -3188,73 +3203,64 @@ msgid "" "{box_name}. If Kiwix fails to add the file, it will be deleted immediately " "to save disk space." msgstr "" +"Yüklenen ZIM dosyaları, {box_name} cihazınızda {kiwix_home}/content altında " +"saklanacaktır. Eğer Kiwix dosyayı eklemek için başarısız olursa, disk " +"alanından tasarruf etmek için dosya hemen silinecektir." #: plinth/modules/kiwix/templates/kiwix-add-package.html:24 #, python-format msgid "You have %(max_filesize)s of free disk space available." -msgstr "" +msgstr "Mevcut %(max_filesize)s boş disk alanınız var." #: plinth/modules/kiwix/templates/kiwix-add-package.html:36 -#, fuzzy -#| msgid "Upload file" msgid "Upload ZIM file" -msgstr "Dosya yükle" +msgstr "ZIM dosyası yükle" #: plinth/modules/kiwix/templates/kiwix-delete-package.html:11 -#, fuzzy, python-format -#| msgid "Delete Wiki or Blog %(name)s" +#, python-format msgid "Delete content package %(name)s" -msgstr "%(name)s Viki veya Blog'unu Sil" +msgstr "%(name)s içerik paketini sil" #: plinth/modules/kiwix/templates/kiwix-delete-package.html:17 msgid "" "Delete this package permanently? You may add it back later if you have a " "copy of the ZIM file." msgstr "" +"Bu paket kalıcı olarak silinsin mi? ZIM dosyasının bir kopyasına sahipseniz " +"daha sonra tekrar ekleyebilirsiniz." #: plinth/modules/kiwix/templates/kiwix.html:11 msgid "Manage Content Packages" -msgstr "" +msgstr "İçerik Paketlerini Yönet" #: plinth/modules/kiwix/templates/kiwix.html:15 -#, fuzzy -#| msgid "Add a new peer" msgid "Add a content package" -msgstr "Yeni bir kişi ekle" +msgstr "İçerik paketi ekle" #: plinth/modules/kiwix/templates/kiwix.html:17 -#, fuzzy -#| msgid "Package" msgid "Add Package" -msgstr "Paket" +msgstr "Paket Ekle" #: plinth/modules/kiwix/templates/kiwix.html:24 -#, fuzzy -#| msgid "No status available." msgid "No content packages available." -msgstr "Mevcut durum yok." +msgstr "Mevcut içerik paketleri yok." #: plinth/modules/kiwix/templates/kiwix.html:37 -#, fuzzy, python-format -#| msgid "Delete site %(site)s" +#, python-format msgid "Delete package %(title)s" -msgstr "%(site)s sitesini sil" +msgstr "%(title)s paketini sil" #: plinth/modules/kiwix/views.py:49 msgid "Content package added." -msgstr "" +msgstr "İçerik paketi eklendi." #: plinth/modules/kiwix/views.py:54 -#, fuzzy -#| msgid "Add a new peer" msgid "Add a new content package" -msgstr "Yeni bir kişi ekle" +msgstr "Yeni bir içerik paketi ekle" #: plinth/modules/kiwix/views.py:83 -#, fuzzy -#| msgid "Failed to add user to group." msgid "Failed to add content package." -msgstr "Kullanıcıyı gruba ekleme başarısız oldu." +msgstr "İçerik paketi ekleme başarısız oldu." #: plinth/modules/letsencrypt/__init__.py:25 #, python-brace-format @@ -3498,13 +3504,6 @@ msgstr "" "etkialanıadı şeklinde görünecektir." #: plinth/modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:26 -#, fuzzy -#| msgid "" -#| "\n" -#| " Warning! Changing the domain name after the " -#| "initial\n" -#| " setup is currently not supported.\n" -#| " " msgid "" "\n" " Warning! Changing the domain name after this step " @@ -3514,8 +3513,10 @@ msgid "" " " msgstr "" "\n" -" Uyarı! İlk ayarlamadan sonra etki alanı adının\n" -" değiştirilmesi şu anda desteklenmiyor.\n" +" Uyarı! Bu adımdan sonra etki alanı adının " +"değiştirilmesi, uygulamanın verilerini\n" +" silecek olan uygulamanın kaldırılmasını ve yeniden yüklenmesini " +"gerektirecektir.\n" " " #: plinth/modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:35 From 3f2620f1d8375ce01389e722eabeb630a1f65b32 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Thu, 2 Nov 2023 19:18:07 +0000 Subject: [PATCH 09/20] Translated using Weblate (Ukrainian) Currently translated at 100.0% (1551 of 1551 strings) --- plinth/locale/uk/LC_MESSAGES/django.po | 108 +++++++++++-------------- 1 file changed, 49 insertions(+), 59 deletions(-) diff --git a/plinth/locale/uk/LC_MESSAGES/django.po b/plinth/locale/uk/LC_MESSAGES/django.po index d7dbe453c..5ad4bd4d1 100644 --- a/plinth/locale/uk/LC_MESSAGES/django.po +++ b/plinth/locale/uk/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-23 20:05-0400\n" -"PO-Revision-Date: 2023-09-29 12:01+0000\n" +"PO-Revision-Date: 2023-11-03 20:31+0000\n" "Last-Translator: Ihor Hordiichuk \n" "Language-Team: Ukrainian \n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 5.1-dev\n" +"X-Generator: Weblate 5.2-dev\n" #: doc/dev/_templates/layout.html:11 msgid "Page source" @@ -1548,27 +1548,21 @@ msgid "Low Memory" msgstr "Мало памʼяті" #: plinth/modules/diagnostics/__init__.py:248 -#, fuzzy -#| msgid "Run Diagnostics" msgid "Running diagnostics" -msgstr "Запустити діагностику" +msgstr "Виконується діагностика" #: plinth/modules/diagnostics/__init__.py:289 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." -msgstr "" +msgstr "Знайдено {issue_count} проблеми під час звичайних перевірок." #: plinth/modules/diagnostics/__init__.py:290 -#, fuzzy -#| msgid "Diagnostic Results" msgid "Diagnostics results" msgstr "Результати діагностики" #: plinth/modules/diagnostics/__init__.py:295 -#, fuzzy -#| msgid "Diagnostic Results" msgid "Go to diagnostics results" -msgstr "Результати діагностики" +msgstr "Перейти до результатів діагностики" #: plinth/modules/diagnostics/templates/diagnostics.html:16 #: plinth/modules/diagnostics/templates/diagnostics_button.html:11 @@ -1576,10 +1570,8 @@ msgid "Run Diagnostics" msgstr "Запустити діагностику" #: plinth/modules/diagnostics/templates/diagnostics.html:21 -#, fuzzy -#| msgid "Results" msgid "View Results" -msgstr "Результати" +msgstr "Переглянути результати" #: plinth/modules/diagnostics/templates/diagnostics_app.html:10 msgid "Diagnostic Results" @@ -1595,10 +1587,8 @@ msgid "This app does not support diagnostics" msgstr "Цей застосунок не підтримує діагностику" #: plinth/modules/diagnostics/templates/diagnostics_full.html:17 -#, fuzzy -#| msgid "Run Diagnostics" msgid "Re-run Diagnostics" -msgstr "Запустити діагностику" +msgstr "Повторно запустити діагностику" #: plinth/modules/diagnostics/templates/diagnostics_full.html:21 msgid "Diagnostics test is currently running" @@ -3159,6 +3149,10 @@ msgid "" "Wikipedia available without using the internet, but it is potentially " "suitable for all HTML content. Kiwix packages are in the ZIM file format." msgstr "" +"Kiwix — це офлайн-читач вебконтенту. Це програмне забезпечення, призначене " +"для того, щоб зробити Вікіпедію доступною без доступу до інтернету, але він " +"потенційно придатний для будь-якого HTML-контенту. Пакунки Kiwix мають " +"формат ZIM." #: plinth/modules/kiwix/__init__.py:25 msgid "" @@ -3172,6 +3166,14 @@ msgid "" "
  • Magazines: Low-tech Magazine
  • \n" " " msgstr "" +"Kiwix може розміщувати різні види контенту:\n" +"
      \n" +"
    • Офлайн-версії вебсайтів: Проєкти Вікімедіа, Stack Exchange
    • \n" +"
    • Відеоматеріали: Khan Academy, TED Talks, Crash Course
    • \n" +"
    • Освітні матеріали: PHET, TED Ed, Vikidia
    • \n" +"
    • еКниги: Project Gutenberg
    • \n" +"
    • Журнали: Low-tech Magazine
    • \n" +"
    " #: plinth/modules/kiwix/__init__.py:33 #: plinth/modules/kiwix/templates/kiwix-add-package.html:14 @@ -3181,24 +3183,26 @@ msgid "" "project or create your own." msgstr "" +"Ви можете завантажити пакунки матеріалів з проєкту Kiwix " +"або створити власні." #: plinth/modules/kiwix/__init__.py:53 msgid "Manage Kiwix content server" -msgstr "" +msgstr "Керування сервером вмісту Kiwix" #: plinth/modules/kiwix/__init__.py:56 plinth/modules/kiwix/manifest.py:8 msgid "Kiwix" -msgstr "" +msgstr "Kiwix" #: plinth/modules/kiwix/__init__.py:57 msgid "Offline Wikipedia" -msgstr "" +msgstr "Вікіпедія офлайн" #: plinth/modules/kiwix/forms.py:23 -#, fuzzy -#| msgid "Backup files have to be in .tar.gz format" msgid "Content packages have to be in .zim format" -msgstr "Файли резервної копії повинні бути у форматі .tar.gz" +msgstr "Пакунки вмісту мають бути у форматі .zim" #: plinth/modules/kiwix/forms.py:25 #, python-brace-format @@ -3207,73 +3211,64 @@ msgid "" "{box_name}. If Kiwix fails to add the file, it will be deleted immediately " "to save disk space." msgstr "" +"Завантажені ZIM-файли будуть зберігатися в теці {kiwix_home}/content у " +"вашому {box_name}. Якщо Kiwix не зможе додати файл, він буде негайно " +"видалений для економії дискового простору." #: plinth/modules/kiwix/templates/kiwix-add-package.html:24 #, python-format msgid "You have %(max_filesize)s of free disk space available." -msgstr "" +msgstr "Вам доступно %(max_filesize)s дискового простору." #: plinth/modules/kiwix/templates/kiwix-add-package.html:36 -#, fuzzy -#| msgid "Upload file" msgid "Upload ZIM file" -msgstr "Вивантажити файл" +msgstr "Вивантажити ZIM-файл" #: plinth/modules/kiwix/templates/kiwix-delete-package.html:11 -#, fuzzy, python-format -#| msgid "Delete Wiki or Blog %(name)s" +#, python-format msgid "Delete content package %(name)s" -msgstr "Видалити вікі або блоґ %(name)s" +msgstr "Видалити пакунок вмісту %(name)s" #: plinth/modules/kiwix/templates/kiwix-delete-package.html:17 msgid "" "Delete this package permanently? You may add it back later if you have a " "copy of the ZIM file." msgstr "" +"Видалити цей пакунок назавжди? Ви можете додати його пізніше, якщо у вас є " +"копія ZIM-файлу." #: plinth/modules/kiwix/templates/kiwix.html:11 msgid "Manage Content Packages" -msgstr "" +msgstr "Керувати пакунками вмісту" #: plinth/modules/kiwix/templates/kiwix.html:15 -#, fuzzy -#| msgid "Add a new peer" msgid "Add a content package" -msgstr "Додати новий вузол" +msgstr "Додати пакунок вмісту" #: plinth/modules/kiwix/templates/kiwix.html:17 -#, fuzzy -#| msgid "Package" msgid "Add Package" -msgstr "Пакунок" +msgstr "Додати пакунок" #: plinth/modules/kiwix/templates/kiwix.html:24 -#, fuzzy -#| msgid "No status available." msgid "No content packages available." -msgstr "Стан недоступний." +msgstr "Пакунки вмісту недоступні." #: plinth/modules/kiwix/templates/kiwix.html:37 -#, fuzzy, python-format -#| msgid "Delete site %(site)s" +#, python-format msgid "Delete package %(title)s" -msgstr "Видалити сайт %(site)s" +msgstr "Видалити пакунок %(title)s" #: plinth/modules/kiwix/views.py:49 msgid "Content package added." -msgstr "" +msgstr "Додано пакунок вмісту." #: plinth/modules/kiwix/views.py:54 -#, fuzzy -#| msgid "Add a new peer" msgid "Add a new content package" -msgstr "Додати новий вузол" +msgstr "Додати новий пакунок вмісту" #: plinth/modules/kiwix/views.py:83 -#, fuzzy -#| msgid "Failed to add user to group." msgid "Failed to add content package." -msgstr "Не вдалося додати користувача до групи." +msgstr "Не вдалося додати пакунок вмісту." #: plinth/modules/letsencrypt/__init__.py:25 #, python-brace-format @@ -3517,13 +3512,6 @@ msgstr "" "вигляд @ім'я_користувача:назва_домену." #: plinth/modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:26 -#, fuzzy -#| msgid "" -#| "\n" -#| " Warning! Changing the domain name after the " -#| "initial\n" -#| " setup is currently not supported.\n" -#| " " msgid "" "\n" " Warning! Changing the domain name after this step " @@ -3533,8 +3521,10 @@ msgid "" " " msgstr "" "\n" -" Увага! Зміна назви домену після початкового\n" -" налаштування зараз не підтримується.\n" +" Увага! Зміна назви домену після цього кроку потребує " +"видалення\n" +" та перевстановлення застосунку, що призведе до знищення даних " +"застосунку.\n" " " #: plinth/modules/matrixsynapse/templates/matrix-synapse-pre-setup.html:35 From 58b2c3a7968b0c505aecf0f37bc2d604a55e3d9b Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Wed, 1 Nov 2023 19:02:02 +0000 Subject: [PATCH 10/20] Translated using Weblate (Albanian) Currently translated at 95.0% (1474 of 1551 strings) --- plinth/locale/sq/LC_MESSAGES/django.po | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/plinth/locale/sq/LC_MESSAGES/django.po b/plinth/locale/sq/LC_MESSAGES/django.po index f35d06f1f..21702adec 100644 --- a/plinth/locale/sq/LC_MESSAGES/django.po +++ b/plinth/locale/sq/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-23 20:05-0400\n" -"PO-Revision-Date: 2023-02-25 11:36+0000\n" +"PO-Revision-Date: 2023-11-03 20:31+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Weblate 5.2-dev\n" #: doc/dev/_templates/layout.html:11 msgid "Page source" @@ -1999,7 +1999,6 @@ msgid "Monal - XMPP Chat" msgstr "Monal - Fjalosje XMPP" #: plinth/modules/ejabberd/manifest.py:64 -#, fuzzy msgid "Siskin IM" msgstr "Siskin IM" @@ -3263,10 +3262,9 @@ msgid "No content packages available." msgstr "S’ka gjendje të ditur." #: plinth/modules/kiwix/templates/kiwix.html:37 -#, fuzzy, python-format -#| msgid "Delete site %(site)s" +#, python-format msgid "Delete package %(title)s" -msgstr "Fshije sajtin %(site)s" +msgstr "Fshije paketën %(title)s" #: plinth/modules/kiwix/views.py:49 msgid "Content package added." @@ -4025,7 +4023,7 @@ msgstr "Fjalëkalimi i ardhjes u ndryshua" #: plinth/modules/mumble/views.py:53 msgid "Root channel name changed." -msgstr "Emri i kanalit rrënjë ndryshoi" +msgstr "Emri i kanalit rrënjë ndryshoi." #: plinth/modules/names/__init__.py:22 #, python-brace-format @@ -5941,7 +5939,7 @@ msgstr "Lexoni dhe pajtohuni te prurje lajmesh" #: plinth/modules/rssbridge/__init__.py:49 #: plinth/modules/rssbridge/manifest.py:10 msgid "RSS-Bridge" -msgstr "RSS-Bridge" +msgstr "" #: plinth/modules/rssbridge/__init__.py:50 msgid "RSS Feed Generator" From 300f90f2a2722dec7712bfaa1fd537e1f7fc65a8 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 30 Oct 2023 16:54:52 -0700 Subject: [PATCH 11/20] backups: Don't leave services stopped if backup fails - We stop services before backup and restart them when backup is completed. However, if backup fails, we are not restarting the services. With this change, ensure that stopped services are restarted even if backup process fails. - Similarly for restore operation. Tests: - Backup and restore of an app work. - Functional tests for matrix-synapse work. - Run the following two tests without the patch to ensure that the reported bug is reproducible. - Make a backup operation fail by raising an exception in the privileged code that takes backup. Enable matrix-synapse app. Run backup including the matrix-synapse app. Backup fails and shows an error. The service is stopped before backup and restarted after backup failure. - Make a restore operation fail by raising an exception in the privileged code that does restore. Enable matrix-synapse app. Run backup including the matrix-synapse app and try to restore it. Restore fails and shows an error. The service is stopped before restore and restarted after restore failure. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/backups/api.py | 41 +++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/plinth/modules/backups/api.py b/plinth/modules/backups/api.py index 6763b396e..2213b3d4e 100644 --- a/plinth/modules/backups/api.py +++ b/plinth/modules/backups/api.py @@ -126,16 +126,17 @@ def backup_apps(backup_handler, path, app_ids=None, encryption_passphrase=None, backup_root = '/' snapshotted = False - packet = Packet('backup', 'apps', backup_root, components, path, - archive_comment) - _run_operation(backup_handler, packet, - encryption_passphrase=encryption_passphrase) - - if snapshotted: - _delete_snapshot(snapshot) - else: - _restore_services(original_state) - _lockdown_apps(components, lockdown=False) + try: + packet = Packet('backup', 'apps', backup_root, components, path, + archive_comment) + _run_operation(backup_handler, packet, + encryption_passphrase=encryption_passphrase) + finally: + if snapshotted: + _delete_snapshot(snapshot) + else: + _restore_services(original_state) + _lockdown_apps(components, lockdown=False) def restore_apps(restore_handler, app_ids=None, create_subvolume=True, @@ -157,15 +158,17 @@ def restore_apps(restore_handler, app_ids=None, create_subvolume=True, restore_root = '/' subvolume = False - packet = Packet('restore', 'apps', restore_root, components, backup_file) - _run_operation(restore_handler, packet, - encryption_passphrase=encryption_passphrase) - - if subvolume: - _switch_to_subvolume(subvolume) - else: - _restore_services(original_state) - _lockdown_apps(components, lockdown=False) + try: + packet = Packet('restore', 'apps', restore_root, components, + backup_file) + _run_operation(restore_handler, packet, + encryption_passphrase=encryption_passphrase) + finally: + if subvolume: + _switch_to_subvolume(subvolume) + else: + _restore_services(original_state) + _lockdown_apps(components, lockdown=False) def _install_apps_before_restore(components): From 5e6c6767488fc49783d7cc3d21539bd762c0776f Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Wed, 1 Nov 2023 11:32:24 -0700 Subject: [PATCH 12/20] operation: Fix issue with re-running setup when it fails first time When setup is run from the application thread after startup, it continuously tries until it succeeds. However, after making the first attempt, it does not collect the status of the operation keeping the operation object in operation manager. When trying for the second time, trying to create operation with same ID fails since the operation is already present. Fix this by allowing the operation to be recreated if the existing operation has failed. Tests: - Unit tests pass. - Functional tests for bepasty app pass. - Install an app. Create an error in the setup mechanism for an app. Increment is app version number. Start the service and notice that setup of app is attempted and fails. Few seconds later the setup is attempted again and the process continues. Each time the failure is due to fault in the app's setup method rather than operation not being accepted. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/operation.py | 3 ++- plinth/tests/test_operation.py | 23 ++++++++++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/plinth/operation.py b/plinth/operation.py index acbcbe016..ce8c3095c 100644 --- a/plinth/operation.py +++ b/plinth/operation.py @@ -187,7 +187,8 @@ class OperationsManager: def new(self, op_id: str, *args, **kwargs) -> Operation: """Create a new operation instance and add to global list.""" with self._lock: - if op_id in self._operations: + if (op_id in self._operations and self._operations[op_id].state != + Operation.State.COMPLETED): raise KeyError('Operation in progress/scheduled') kwargs['on_complete'] = self._on_operation_complete diff --git a/plinth/tests/test_operation.py b/plinth/tests/test_operation.py index f4baaeeb1..d3bd45ce9 100644 --- a/plinth/tests/test_operation.py +++ b/plinth/tests/test_operation.py @@ -285,16 +285,29 @@ def test_manager_new_without_show_message(): def test_manager_new_raises(): """Test that a new operation is always unique.""" manager = OperationsManager() - operation1 = manager.new('testop1', 'testapp', 'op1', Mock()) + event1 = threading.Event() + event2 = threading.Event() - # Creating operation with same id throws exception + operation1 = manager.new('testop1', 'testapp', 'op1', + lambda: event1.wait()) + + # Creating operation with different ID works + operation2 = manager.new('testop2', 'testapp', 'op3', lambda: event2.set()) + + assert manager._operations == OrderedDict(testop1=operation1, + testop2=operation2) + + # Creating operation with same id while the operation is running/scheduled + # throws exception with pytest.raises(KeyError): manager.new('testop1', 'testapp', 'op1', Mock()) - # Creating operation with different ID works - operation2 = manager.new('testop2', 'testapp', 'op3', Mock()) + # Creating operation with same id after the operation is completed works. + event1.set() # Allow the first operation to complete + event2.wait(10) # Wait until the second operation has started + operation1_new = manager.new('testop1', 'testapp', 'op1', Mock()) - assert manager._operations == OrderedDict(testop1=operation1, + assert manager._operations == OrderedDict(testop1=operation1_new, testop2=operation2) From e6e6896d0d1c2ea96dc76128a6d6c8d66b809327 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sat, 4 Nov 2023 09:59:06 -0700 Subject: [PATCH 13/20] coturn: Fix incorrectly passing transport argument to STUN URIs Closes: #2362. Passing ?transport= parameter in STUN URIs is invalid. It always uses UDP. Chrome and perhaps Firefox has recently started enforcing the correct syntax leading to failures using the Coturn server URIs we set in Janus. This also likely effects matrix-syanpse and ejabberd clients. Links: 1) https://www.rfc-editor.org/rfc/rfc7064#section-3.1 2) https://bugs.chromium.org/p/chromium/issues/detail?id=1385735 Tests: - Install Coturn. Observe that STUN URIs shown don't contain the 'transport' parameter. - Install Janus and launch the meeting room. Notice that the STUN URIs in the room page don't have 'transport' parameter. - Install ejabberd and notice that the auto-configured STUN URIs don't have 'transport' parameter. - Install matrix-synapse and notice that the auto-configured STUN URIs don't have 'transport' parameter. - Install ejabberd and matrix-synapse. Ensure that STUN URIs manually. They are not allowed to 'transport' parameter for the STUN URIs but must have transport parameter for TURN URIs. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/coturn/components.py | 10 ++-- plinth/modules/coturn/forms.py | 3 +- .../modules/coturn/tests/test_components.py | 46 +++++++++++++++++-- 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/plinth/modules/coturn/components.py b/plinth/modules/coturn/components.py index 1e8a83fba..ae05267bf 100644 --- a/plinth/modules/coturn/components.py +++ b/plinth/modules/coturn/components.py @@ -17,7 +17,8 @@ TURN_REST_TTL = 24 * 3600 TURN_REST_USER = 'fbxturnuser' -TURN_URI_REGEX = r'(stun|turn):(.*):([0-9]{4})\?transport=(tcp|udp)' +TURN_URI_REGEX = \ + r'(stun:(.*):([0-9]{4}))|(turn:(.*):([0-9]{4})\?transport=(tcp|udp))' @dataclass @@ -43,8 +44,9 @@ class TurnConfiguration: """Generate URIs after object initialization if necessary.""" if self.domain and not self.uris: self.uris = [ - f'{typ}:{self.domain}:3478?transport={transport}' - for typ in ['stun', 'turn'] for transport in ['tcp', 'udp'] + f'stun:{self.domain}:3478', + f'turn:{self.domain}:3478?transport=tcp', + f'turn:{self.domain}:3478?transport=udp' ] def to_json(self) -> str: @@ -59,7 +61,7 @@ class TurnConfiguration: def validate_turn_uris(turn_uris: list[str]) -> bool: """Return whether the given TURN URI is valid.""" pattern = re.compile(TURN_URI_REGEX) - return all(map(pattern.match, turn_uris)) + return all(map(pattern.fullmatch, turn_uris)) @dataclass diff --git a/plinth/modules/coturn/forms.py b/plinth/modules/coturn/forms.py index e57740c1c..0f6f93608 100644 --- a/plinth/modules/coturn/forms.py +++ b/plinth/modules/coturn/forms.py @@ -18,7 +18,8 @@ def get_domain_choices(): def turn_uris_validator(turn_uris): """Validate list of STUN/TURN Server URIs.""" - if not TurnConfiguration.validate_turn_uris(turn_uris.split("\n")): + uris = [uri for uri in turn_uris.split('\r\n') if uri] + if not TurnConfiguration.validate_turn_uris(uris): raise ValidationError(_('Invalid list of STUN/TURN Server URIs')) diff --git a/plinth/modules/coturn/tests/test_components.py b/plinth/modules/coturn/tests/test_components.py index bf7678888..524cad258 100644 --- a/plinth/modules/coturn/tests/test_components.py +++ b/plinth/modules/coturn/tests/test_components.py @@ -3,6 +3,7 @@ Tests for the Coturn app component. """ +import json from unittest.mock import call, patch import pytest @@ -26,16 +27,15 @@ def fixture_empty_component_list(): TurnConsumer._all = {} -def test_configuration_init(): +def test_turn_configuration_init(): """Test creating configuration object.""" config = TurnConfiguration('test-domain.example', [], 'test-shared-secret') assert config.domain == 'test-domain.example' assert config.shared_secret == 'test-shared-secret' assert config.uris == [ - "stun:test-domain.example:3478?transport=tcp", - "stun:test-domain.example:3478?transport=udp", - "turn:test-domain.example:3478?transport=tcp", - "turn:test-domain.example:3478?transport=udp", + 'stun:test-domain.example:3478', + 'turn:test-domain.example:3478?transport=tcp', + 'turn:test-domain.example:3478?transport=udp', ] config = TurnConfiguration(None, ['test-uri1', 'test-uri2'], @@ -59,6 +59,42 @@ def test_configuration_init(): assert config.credential == 'test-credential' +def test_turn_configuration_to_json(): + """Test exporting configuration to JSON.""" + config = TurnConfiguration('test-domain.example', [], 'test-shared-secret') + assert json.loads(config.to_json()) == { + 'domain': 'test-domain.example', + 'uris': [ + 'stun:test-domain.example:3478', + 'turn:test-domain.example:3478?transport=tcp', + 'turn:test-domain.example:3478?transport=udp', + ], + 'shared_secret': 'test-shared-secret' + } + + +def test_turn_configuration_validate_turn_uris(): + """Test validation method to check for STUN/TURN URIs.""" + valid_uris = [ + 'stun:test-domain.example:3478', + 'turn:test-domain.example:3478?transport=tcp', + 'turn:test-domain.example:3478?transport=udp', + ] + invalid_uris = [ + 'x-invalid-uri', + 'stun:', + 'stun:domain-port-missing.example', + 'stun:testing.example:1234invalid-append', + 'turn:testing.example:1234', + 'turn:testing.example:1234?invalid-param=value', + 'turn:testing.example:1234?transport=invalid-value', + 'turn:testing.example:1234?transport=tcp-invalid-append', + ] + assert TurnConfiguration().validate_turn_uris(valid_uris) + for uri in invalid_uris: + assert not TurnConfiguration().validate_turn_uris([uri]) + + def test_component_init_and_list(): """Test initializing and listing all the components.""" component1 = TurnConsumer('component1') From e42740b5891a5da7f2848a24ebb84e1102c5bd24 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sat, 4 Nov 2023 10:09:50 -0700 Subject: [PATCH 14/20] matrixsynapse: Update old STUN URIs to remove 'transport' parameter - If the STUN/TURN configuration is not managed by FreedomBox, the parameters are left unchanged. Tests: - Install app after installing Coturn. Notice that STUN URI doesn't have a 'transport' parameter. - Install app without the patches after installing Coturn. Notice that STUN URIs have 'transport' parameter. Then apply patches. Setup is run. 'transport' parameter is removed and only one STUN URI is present. matrix-synapse server restarts successfully and don't have show any errors/warnings regarding STUN/TURN configuration during startup. - Install app without patches and set custom STUN/TURN URIs. Apply patches. Setup is run. The URIs are not changed. Reviewed-by: James Valleroy --- plinth/modules/matrixsynapse/__init__.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/plinth/modules/matrixsynapse/__init__.py b/plinth/modules/matrixsynapse/__init__.py index 4480adecd..9078111d5 100644 --- a/plinth/modules/matrixsynapse/__init__.py +++ b/plinth/modules/matrixsynapse/__init__.py @@ -44,7 +44,7 @@ class MatrixSynapseApp(app_module.App): app_id = 'matrixsynapse' - _version = 9 + _version = 10 def __init__(self): """Create components for the app.""" @@ -129,9 +129,14 @@ class MatrixSynapseApp(app_module.App): self.get_component('letsencrypt-matrixsynapse').setup_certificates() - # Configure STUN/TURN only if there's a valid TLS domain set for Coturn - config = self.get_component('turn-matrixsynapse').get_configuration() - update_turn_configuration(config, force=True) + if not old_version or get_turn_configuration()[1]: + # Configure STUN/TURN only if there's a valid TLS domain set for + # Coturn. Do this if app is being freshly installed or if it is + # previously installed and configured to use STUN/TURN + # auto-management. + config = self.get_component( + 'turn-matrixsynapse').get_configuration() + update_turn_configuration(config, force=True) def uninstall(self): """De-configure and uninstall the app.""" From f4d8d3d04625ae7220b5b2e5424d78fa49cc7ae6 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sat, 4 Nov 2023 10:16:51 -0700 Subject: [PATCH 15/20] ejabberd: Update old STUN URIs to remove 'transport' parameter - If the STUN/TURN configuration is not managed by FreedomBox, the parameters are left unchanged. Tests: - Install app after installing Coturn. Notice that STUN URI doesn't have a 'transport' parameter. - Install app without the patches after installing Coturn. Notice that STUN URIs have 'transport' parameter. Then apply patches. Setup is run. 'transport' parameter is removed and only one STUN URI is present. matrix-synapse server restarts successfully and don't have show any errors/warnings regarding STUN/TURN configuration during startup. - Install app without patches and set custom STUN/TURN URIs. Apply patches. Setup is run. The URIs are not changed. Reviewed-by: James Valleroy --- plinth/modules/ejabberd/__init__.py | 13 +++++++++---- plinth/modules/ejabberd/privileged.py | 18 ++++++++++++------ 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/plinth/modules/ejabberd/__init__.py b/plinth/modules/ejabberd/__init__.py index 3ee7771b0..d4489c7a1 100644 --- a/plinth/modules/ejabberd/__init__.py +++ b/plinth/modules/ejabberd/__init__.py @@ -50,7 +50,7 @@ class EjabberdApp(app_module.App): app_id = 'ejabberd' - _version = 7 + _version = 8 def __init__(self): """Create components for the app.""" @@ -148,9 +148,14 @@ class EjabberdApp(app_module.App): if not old_version: self.enable() - # Configure STUN/TURN only if there's a valid TLS domain set for Coturn - configuration = self.get_component('turn-ejabberd').get_configuration() - update_turn_configuration(configuration, force=True) + if not old_version or get_turn_configuration()[1]: + # Configure STUN/TURN only if there's a valid TLS domain set for + # Coturn. Do this if app is being freshly installed or if it is + # previously installed and configured to use STUN/TURN + # auto-management. + configuration = self.get_component( + 'turn-ejabberd').get_configuration() + update_turn_configuration(configuration, force=True) class EjabberdTurnConsumer(TurnConsumer): diff --git a/plinth/modules/ejabberd/privileged.py b/plinth/modules/ejabberd/privileged.py index 7dd6e6498..11851c734 100644 --- a/plinth/modules/ejabberd/privileged.py +++ b/plinth/modules/ejabberd/privileged.py @@ -30,7 +30,7 @@ yaml = YAML() yaml.allow_duplicate_keys = True yaml.preserve_quotes = True # type: ignore [assignment] -TURN_URI_REGEX = r'(stun|turn):(.*):([0-9]{4})\?transport=(tcp|udp)' +TURN_URI_REGEX = r'(stun|turn):(.*):([0-9]{4})(?:\?transport=(tcp|udp))?' @privileged @@ -290,7 +290,7 @@ def _generate_service(uri: str) -> dict: if not match: raise ValueError('URL does not match TURN URI') - typ, domain, port, transport = match.groups() + typ, domain, port, transport = match.groups('udp') return { "host": domain, "port": int(port), @@ -301,10 +301,16 @@ def _generate_service(uri: str) -> dict: def _generate_uris(services: list[dict]) -> list[str]: """Generate STUN/TURN URIs from ejabberd mod_stun_disco service config.""" - return [ - f"{s['type']}:{s['host']}:{s['port']}?transport={s['transport']}" - for s in services - ] + uris = [] + for s in services: + uri = f"{s['type']}:{s['host']}:{s['port']}" + if s['type'] != 'stun': + uri += f"?transport={s['transport']}" + + if uri not in uris: + uris.append(uri) + + return uris @privileged From fd1955a0842ffe2b25091a026eaa98ca64711bf0 Mon Sep 17 00:00:00 2001 From: Joseph Nuthalapati Date: Wed, 25 Oct 2023 06:44:03 +0530 Subject: [PATCH 16/20] tests: functional: Run tests on two app servers - Using `--dist=loadscope` splits the tests based on module, thus ensuring each app's tests get assigned to one worker only. - Though app servers run in 2 separate VMs, the pytest-xdist workers simply run in two Python subprocesses (`-n 2`). This allows us to generate a unified test report. Signed-off-by: Joseph Nuthalapati Reviewed-by: Sunil Mohan Adapa --- .ci/functional-tests.yml | 20 +++++++++++++------- plinth/tests/functional/__init__.py | 13 +++++++++++-- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/.ci/functional-tests.yml b/.ci/functional-tests.yml index 1655fd651..2e839574a 100644 --- a/.ci/functional-tests.yml +++ b/.ci/functional-tests.yml @@ -11,8 +11,12 @@ - export AWS_DEFAULT_REGION=us-east-1 - | aws lambda invoke --function-name launch_app_server --payload '{"launch_template_name": "'"$LAUNCH_TEMPLATE_NAME"'", "instance_name": "'"$INSTANCE_NAME"'", "ci_project_id": "'"$CI_PROJECT_ID"'", "build_job_id": "'"$BUILD_JOB_ID"'"}' response.json - - echo "APP_SERVER_IP=$(jq -r '.app_server_ip' response.json)" >> app-servers.env - - echo "INSTANCE_ID=$(jq -r '.instance_id' response.json)" >> app-servers.env + - echo "APP_SERVER_IP_1=$(jq -r '.app_server_ip' response.json)" >> app-servers.env + - echo "INSTANCE_ID_1=$(jq -r '.instance_id' response.json)" >> app-servers.env + - | + aws lambda invoke --function-name launch_app_server --payload '{"launch_template_name": "'"$LAUNCH_TEMPLATE_NAME"'", "instance_name": "'"$INSTANCE_NAME"'", "ci_project_id": "'"$CI_PROJECT_ID"'", "build_job_id": "'"$BUILD_JOB_ID"'"}' response.json + - echo "APP_SERVER_IP_2=$(jq -r '.app_server_ip' response.json)" >> app-servers.env + - echo "INSTANCE_ID_2=$(jq -r '.instance_id' response.json)" >> app-servers.env tags: - functional-tests artifacts: @@ -22,7 +26,7 @@ .run-functional-tests: stage: functional-tests timeout: 3h - # Need to find a way of running the cleanup step even on failure + # Need to find another way of running the cleanup step even on failure allow_failure: true when: delayed # Wait for the app-server to come up. Saves time for the CI runners. @@ -35,10 +39,11 @@ script: - cp -r . /home/tester/freedombox && chown -R tester:tester /home/tester/freedombox - | - sudo FREEDOMBOX_URL="https://$APP_SERVER_IP" -u tester bash -c \ - 'cd /home/tester/freedombox && py.test-3 -v --durations=10 --include-functional --splinter-headless --template=html1/index.html --report=functional-tests.html' + sudo APP_SERVER_URL_1="https://$APP_SERVER_IP_1" APP_SERVER_URL_2="https://$APP_SERVER_IP_2" -u tester bash -c \ + 'cd /home/tester/freedombox && py.test-3 -v --durations=10 --include-functional --splinter-headless -n 2 --dist=loadscope --template=html1/index.html --report=functional-tests.html' after_script: - - echo "INSTANCE_ID=$INSTANCE_ID" >> app-servers.env + - echo "INSTANCE_ID_1=$INSTANCE_ID_1" >> app-servers.env + - echo "INSTANCE_ID_2=$INSTANCE_ID_2" >> app-servers.env - cp /home/tester/freedombox/functional-tests.html . - cp -r /home/tester/freedombox/screenshots/ . artifacts: @@ -55,6 +60,7 @@ script: - export AWS_DEFAULT_REGION=us-east-1 - | - aws lambda invoke --function-name terminate_app_server --payload '{"instance_id": "'"$INSTANCE_ID"'"}' response.json + aws lambda invoke --function-name terminate_app_server --payload '{"instance_id": "'"$INSTANCE_ID_1"'"}' response.json + aws lambda invoke --function-name terminate_app_server --payload '{"instance_id": "'"$INSTANCE_ID_2"'"}' response.json tags: - functional-tests diff --git a/plinth/tests/functional/__init__.py b/plinth/tests/functional/__init__.py index 26a74b2d9..d2a6dcc51 100644 --- a/plinth/tests/functional/__init__.py +++ b/plinth/tests/functional/__init__.py @@ -22,8 +22,17 @@ from selenium.webdriver.support.ui import WebDriverWait config = configparser.ConfigParser() config.read(pathlib.Path(__file__).with_name('config.ini')) -config['DEFAULT']['url'] = os.environ.get('FREEDOMBOX_URL', - config['DEFAULT']['url']).rstrip('/') +# Configuration to allow each pytest-xdist worker to hit a dedicated +# app server. See .ci/functional-tests.yml for usage. +worker = os.environ.get('PYTEST_XDIST_WORKER', 'master') +if worker == 'master': + config['DEFAULT']['url'] = os.environ.get( + 'FREEDOMBOX_URL', config['DEFAULT']['url']).rstrip('/') +else: + # worker_ids are like gw0, gw1, ... + worker_number = int(worker.lstrip('gw')) + 1 + config['DEFAULT']['url'] = os.environ[f'APP_SERVER_URL_{worker_number}'] + config['DEFAULT']['ssh_port'] = os.environ.get('FREEDOMBOX_SSH_PORT', config['DEFAULT']['ssh_port']) config['DEFAULT']['samba_port'] = os.environ.get( From a11197b2852bb2a30f619785634a8de0f1201dd4 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Wed, 1 Nov 2023 11:14:53 -0700 Subject: [PATCH 17/20] email: Increase the size of the message to 100MiB - This includes the envelope size, so the actual size of the message and attachments is somewhat lower. Tests: - Install the app freshly with the patch. Notice that message_size_limit is set to 102400000 by running 'postconf message_size_limit'. - Install the app without the patch. Apply patche and notice that the app is updated. Notice that message_size_limit is set to 102400000 by running 'postconf message_size_limit'. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/email/__init__.py | 2 +- plinth/modules/email/privileged/postfix.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/plinth/modules/email/__init__.py b/plinth/modules/email/__init__.py index 666dee9f4..947f45d63 100644 --- a/plinth/modules/email/__init__.py +++ b/plinth/modules/email/__init__.py @@ -53,7 +53,7 @@ class EmailApp(plinth.app.App): app_id = 'email' - _version = 3 + _version = 4 def __init__(self): """Initialize the email app.""" diff --git a/plinth/modules/email/privileged/postfix.py b/plinth/modules/email/privileged/postfix.py index dde893141..fe8aab279 100644 --- a/plinth/modules/email/privileged/postfix.py +++ b/plinth/modules/email/privileged/postfix.py @@ -29,7 +29,9 @@ default_config = { ','.join([ 'permit_sasl_authenticated', 'defer_unauth_destination', - ]) + ]), + 'message_size_limit': + '102400000', } submission_options: dict[str, str] = { From 4c37d54f5cc0fa44a0b854b3aec6175483fd324a Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 6 Nov 2023 20:21:54 -0500 Subject: [PATCH 18/20] locale: Update translation strings Signed-off-by: James Valleroy --- plinth/locale/ar/LC_MESSAGES/django.po | 58 +++++++++-------- plinth/locale/ar_SA/LC_MESSAGES/django.po | 58 +++++++++-------- plinth/locale/bg/LC_MESSAGES/django.po | 64 +++++++++--------- plinth/locale/bn/LC_MESSAGES/django.po | 58 +++++++++-------- plinth/locale/cs/LC_MESSAGES/django.po | 64 +++++++++--------- plinth/locale/da/LC_MESSAGES/django.po | 68 ++++++++++--------- plinth/locale/de/LC_MESSAGES/django.po | 64 +++++++++--------- plinth/locale/django.pot | 58 +++++++++-------- plinth/locale/el/LC_MESSAGES/django.po | 68 ++++++++++--------- plinth/locale/es/LC_MESSAGES/django.po | 68 ++++++++++--------- plinth/locale/fa/LC_MESSAGES/django.po | 58 +++++++++-------- plinth/locale/fake/LC_MESSAGES/django.po | 62 +++++++++--------- plinth/locale/fr/LC_MESSAGES/django.po | 68 ++++++++++--------- plinth/locale/gl/LC_MESSAGES/django.po | 58 +++++++++-------- plinth/locale/gu/LC_MESSAGES/django.po | 58 +++++++++-------- plinth/locale/hi/LC_MESSAGES/django.po | 62 +++++++++--------- plinth/locale/hu/LC_MESSAGES/django.po | 68 ++++++++++--------- plinth/locale/id/LC_MESSAGES/django.po | 68 ++++++++++--------- plinth/locale/it/LC_MESSAGES/django.po | 68 ++++++++++--------- plinth/locale/ja/LC_MESSAGES/django.po | 58 +++++++++-------- plinth/locale/kn/LC_MESSAGES/django.po | 58 +++++++++-------- plinth/locale/lt/LC_MESSAGES/django.po | 58 +++++++++-------- plinth/locale/lv/LC_MESSAGES/django.po | 58 +++++++++-------- plinth/locale/nb/LC_MESSAGES/django.po | 68 ++++++++++--------- plinth/locale/nl/LC_MESSAGES/django.po | 64 +++++++++--------- plinth/locale/pl/LC_MESSAGES/django.po | 64 +++++++++--------- plinth/locale/pt/LC_MESSAGES/django.po | 58 +++++++++-------- plinth/locale/ru/LC_MESSAGES/django.po | 68 ++++++++++--------- plinth/locale/si/LC_MESSAGES/django.po | 58 +++++++++-------- plinth/locale/sl/LC_MESSAGES/django.po | 64 +++++++++--------- plinth/locale/sq/LC_MESSAGES/django.po | 64 +++++++++--------- plinth/locale/sr/LC_MESSAGES/django.po | 58 +++++++++-------- plinth/locale/sv/LC_MESSAGES/django.po | 64 +++++++++--------- plinth/locale/ta/LC_MESSAGES/django.po | 58 +++++++++-------- plinth/locale/te/LC_MESSAGES/django.po | 68 ++++++++++--------- plinth/locale/tr/LC_MESSAGES/django.po | 64 +++++++++--------- plinth/locale/uk/LC_MESSAGES/django.po | 72 +++++++++++---------- plinth/locale/vi/LC_MESSAGES/django.po | 64 +++++++++--------- plinth/locale/zh_Hans/LC_MESSAGES/django.po | 68 ++++++++++--------- plinth/locale/zh_Hant/LC_MESSAGES/django.po | 58 +++++++++-------- 40 files changed, 1340 insertions(+), 1172 deletions(-) diff --git a/plinth/locale/ar/LC_MESSAGES/django.po b/plinth/locale/ar/LC_MESSAGES/django.po index 9a1ea48ad..f5d551552 100644 --- a/plinth/locale/ar/LC_MESSAGES/django.po +++ b/plinth/locale/ar/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-23 20:05-0400\n" +"POT-Creation-Date: 2023-11-06 20:16-0500\n" "PO-Revision-Date: 2023-10-19 06:18+0000\n" "Last-Translator: Shaik \n" "Language-Team: Arabic \n" "Language-Team: Arabic (Saudi Arabia) \n" "Language-Team: Bulgarian \n" "Language-Team: Bengali \n" "Language-Team: Czech \n" "Language-Team: Danish \n" "Language-Team: German \n" "Language-Team: LANGUAGE \n" @@ -77,12 +77,12 @@ msgid "" "later." msgstr "" -#: plinth/forms.py:80 plinth/modules/coturn/forms.py:30 +#: plinth/forms.py:80 plinth/modules/coturn/forms.py:31 #: plinth/modules/mumble/forms.py:21 msgid "TLS domain" msgstr "" -#: plinth/forms.py:82 plinth/modules/coturn/forms.py:32 +#: plinth/forms.py:82 plinth/modules/coturn/forms.py:33 #: plinth/modules/mumble/forms.py:23 msgid "" "Select a domain to use TLS with. If the list is empty, please configure at " @@ -1258,7 +1258,7 @@ msgstr "" msgid "VoIP Helper" msgstr "" -#: plinth/modules/coturn/forms.py:22 +#: plinth/modules/coturn/forms.py:23 msgid "Invalid list of STUN/TURN Server URIs" msgstr "" @@ -1270,17 +1270,17 @@ msgstr "" msgid "Use the following shared authentication secret:" msgstr "" -#: plinth/modules/datetime/__init__.py:19 +#: plinth/modules/datetime/__init__.py:20 msgid "" "Network time server is a program that maintains the system time in " "synchronization with servers on the Internet." msgstr "" -#: plinth/modules/datetime/__init__.py:66 +#: plinth/modules/datetime/__init__.py:67 msgid "Date & Time" msgstr "" -#: plinth/modules/datetime/__init__.py:119 +#: plinth/modules/datetime/__init__.py:121 msgid "Time synchronized to NTP server" msgstr "" @@ -1346,7 +1346,7 @@ msgid "" msgstr "" #: plinth/modules/diagnostics/__init__.py:49 -#: plinth/modules/diagnostics/__init__.py:229 +#: plinth/modules/diagnostics/__init__.py:235 msgid "Diagnostics" msgstr "" @@ -1369,49 +1369,49 @@ msgstr "" #. Translators: This is the unit of computer storage Mebibyte similar to #. Megabyte. -#: plinth/modules/diagnostics/__init__.py:195 +#: plinth/modules/diagnostics/__init__.py:201 msgid "MiB" msgstr "" #. Translators: This is the unit of computer storage Gibibyte similar to #. Gigabyte. -#: plinth/modules/diagnostics/__init__.py:200 +#: plinth/modules/diagnostics/__init__.py:206 msgid "GiB" msgstr "" -#: plinth/modules/diagnostics/__init__.py:207 +#: plinth/modules/diagnostics/__init__.py:213 msgid "You should disable some apps to reduce memory usage." msgstr "" -#: plinth/modules/diagnostics/__init__.py:212 +#: plinth/modules/diagnostics/__init__.py:218 msgid "You should not install any new apps on this system." msgstr "" -#: plinth/modules/diagnostics/__init__.py:224 +#: plinth/modules/diagnostics/__init__.py:230 #, no-python-format, python-brace-format msgid "" "System is low on memory: {percent_used}% used, {memory_available} " "{memory_available_unit} free. {advice_message}" msgstr "" -#: plinth/modules/diagnostics/__init__.py:226 +#: plinth/modules/diagnostics/__init__.py:232 msgid "Low Memory" msgstr "" -#: plinth/modules/diagnostics/__init__.py:248 +#: plinth/modules/diagnostics/__init__.py:254 msgid "Running diagnostics" msgstr "" -#: plinth/modules/diagnostics/__init__.py:289 +#: plinth/modules/diagnostics/__init__.py:295 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." msgstr "" -#: plinth/modules/diagnostics/__init__.py:290 +#: plinth/modules/diagnostics/__init__.py:296 msgid "Diagnostics results" msgstr "" -#: plinth/modules/diagnostics/__init__.py:295 +#: plinth/modules/diagnostics/__init__.py:301 msgid "Go to diagnostics results" msgstr "" @@ -1428,12 +1428,18 @@ msgstr "" msgid "Diagnostic Results" msgstr "" -#: plinth/modules/diagnostics/templates/diagnostics_app.html:12 +#: plinth/modules/diagnostics/templates/diagnostics_app.html:13 #, python-format msgid "App: %(app_name)s" msgstr "" -#: plinth/modules/diagnostics/templates/diagnostics_app.html:21 +#: plinth/modules/diagnostics/templates/diagnostics_app.html:20 +#: plinth/modules/diagnostics/templates/diagnostics_full.html:48 +#: plinth/templates/toolbar.html:53 +msgid "Re-run setup" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics_app.html:32 msgid "This app does not support diagnostics" msgstr "" @@ -1449,12 +1455,12 @@ msgstr "" msgid "Results" msgstr "" -#: plinth/modules/diagnostics/templates/diagnostics_full.html:37 +#: plinth/modules/diagnostics/templates/diagnostics_full.html:38 #, python-format msgid "" "\n" -" App: %(app_name)s\n" -" " +" App: %(app_name)s\n" +" " msgstr "" #: plinth/modules/diagnostics/templates/diagnostics_results.html:11 @@ -1466,7 +1472,7 @@ msgstr "" msgid "Result" msgstr "" -#: plinth/modules/diagnostics/views.py:92 +#: plinth/modules/diagnostics/views.py:100 msgid "Diagnostic Test" msgstr "" @@ -7787,10 +7793,6 @@ msgstr "" msgid "Backup" msgstr "" -#: plinth/templates/toolbar.html:53 -msgid "Re-run setup" -msgstr "" - #: plinth/templates/toolbar.html:59 plinth/templates/toolbar.html:60 #: plinth/templates/uninstall.html:30 msgid "Uninstall" diff --git a/plinth/locale/el/LC_MESSAGES/django.po b/plinth/locale/el/LC_MESSAGES/django.po index 7f661bb98..dec774b6f 100644 --- a/plinth/locale/el/LC_MESSAGES/django.po +++ b/plinth/locale/el/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-23 20:05-0400\n" +"POT-Creation-Date: 2023-11-06 20:16-0500\n" "PO-Revision-Date: 2022-09-14 17:20+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Greek \n" "Language-Team: Spanish descargar paquetes de contenido del proyecto Kiwix o crear los suyos propios." +"href=\"https://openzim.org/wiki/Build_your_ZIM_file\" target=\"_blank\" " +"rel=\"noopener noreferrer\">crear los suyos propios." #: plinth/modules/kiwix/__init__.py:53 msgid "Manage Kiwix content server" @@ -8956,10 +8966,6 @@ msgstr "Actualización" msgid "Backup" msgstr "Copia de seguridad" -#: plinth/templates/toolbar.html:53 -msgid "Re-run setup" -msgstr "Volver a ejecutar la configuración" - #: plinth/templates/toolbar.html:59 plinth/templates/toolbar.html:60 #: plinth/templates/uninstall.html:30 msgid "Uninstall" diff --git a/plinth/locale/fa/LC_MESSAGES/django.po b/plinth/locale/fa/LC_MESSAGES/django.po index 1bba609a5..b7bc8dad7 100644 --- a/plinth/locale/fa/LC_MESSAGES/django.po +++ b/plinth/locale/fa/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-23 20:05-0400\n" +"POT-Creation-Date: 2023-11-06 20:16-0500\n" "PO-Revision-Date: 2022-09-14 17:19+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Persian \n" "Language-Team: Plinth Developers \n" "Language-Team: French \n" "Language-Team: Galician \n" "Language-Team: Gujarati \n" "Language-Team: Hindi \n" "Language-Team: Hungarian \n" "Language-Team: Indonesian \n" "Language-Team: Italian \n" "Language-Team: Japanese \n" "Language-Team: Kannada \n" "Language-Team: Lithuanian \n" "Language-Team: Latvian \n" "Language-Team: Norwegian Bokmål \n" "Language-Team: Dutch \n" "Language-Team: Polish \n" "Language-Team: Portuguese \n" "Language-Team: Russian \n" "Language-Team: Sinhala \n" "Language-Team: Slovenian \n" "Language-Team: Albanian \n" "Language-Team: Serbian \n" "Language-Team: Swedish \n" "Language-Team: LANGUAGE \n" @@ -78,12 +78,12 @@ msgid "" "later." msgstr "" -#: plinth/forms.py:80 plinth/modules/coturn/forms.py:30 +#: plinth/forms.py:80 plinth/modules/coturn/forms.py:31 #: plinth/modules/mumble/forms.py:21 msgid "TLS domain" msgstr "" -#: plinth/forms.py:82 plinth/modules/coturn/forms.py:32 +#: plinth/forms.py:82 plinth/modules/coturn/forms.py:33 #: plinth/modules/mumble/forms.py:23 msgid "" "Select a domain to use TLS with. If the list is empty, please configure at " @@ -1259,7 +1259,7 @@ msgstr "" msgid "VoIP Helper" msgstr "" -#: plinth/modules/coturn/forms.py:22 +#: plinth/modules/coturn/forms.py:23 msgid "Invalid list of STUN/TURN Server URIs" msgstr "" @@ -1271,17 +1271,17 @@ msgstr "" msgid "Use the following shared authentication secret:" msgstr "" -#: plinth/modules/datetime/__init__.py:19 +#: plinth/modules/datetime/__init__.py:20 msgid "" "Network time server is a program that maintains the system time in " "synchronization with servers on the Internet." msgstr "" -#: plinth/modules/datetime/__init__.py:66 +#: plinth/modules/datetime/__init__.py:67 msgid "Date & Time" msgstr "" -#: plinth/modules/datetime/__init__.py:119 +#: plinth/modules/datetime/__init__.py:121 msgid "Time synchronized to NTP server" msgstr "" @@ -1347,7 +1347,7 @@ msgid "" msgstr "" #: plinth/modules/diagnostics/__init__.py:49 -#: plinth/modules/diagnostics/__init__.py:229 +#: plinth/modules/diagnostics/__init__.py:235 msgid "Diagnostics" msgstr "" @@ -1370,49 +1370,49 @@ msgstr "" #. Translators: This is the unit of computer storage Mebibyte similar to #. Megabyte. -#: plinth/modules/diagnostics/__init__.py:195 +#: plinth/modules/diagnostics/__init__.py:201 msgid "MiB" msgstr "" #. Translators: This is the unit of computer storage Gibibyte similar to #. Gigabyte. -#: plinth/modules/diagnostics/__init__.py:200 +#: plinth/modules/diagnostics/__init__.py:206 msgid "GiB" msgstr "" -#: plinth/modules/diagnostics/__init__.py:207 +#: plinth/modules/diagnostics/__init__.py:213 msgid "You should disable some apps to reduce memory usage." msgstr "" -#: plinth/modules/diagnostics/__init__.py:212 +#: plinth/modules/diagnostics/__init__.py:218 msgid "You should not install any new apps on this system." msgstr "" -#: plinth/modules/diagnostics/__init__.py:224 +#: plinth/modules/diagnostics/__init__.py:230 #, no-python-format, python-brace-format msgid "" "System is low on memory: {percent_used}% used, {memory_available} " "{memory_available_unit} free. {advice_message}" msgstr "" -#: plinth/modules/diagnostics/__init__.py:226 +#: plinth/modules/diagnostics/__init__.py:232 msgid "Low Memory" msgstr "" -#: plinth/modules/diagnostics/__init__.py:248 +#: plinth/modules/diagnostics/__init__.py:254 msgid "Running diagnostics" msgstr "" -#: plinth/modules/diagnostics/__init__.py:289 +#: plinth/modules/diagnostics/__init__.py:295 #, no-python-format, python-brace-format msgid "Found {issue_count} issues during routine tests." msgstr "" -#: plinth/modules/diagnostics/__init__.py:290 +#: plinth/modules/diagnostics/__init__.py:296 msgid "Diagnostics results" msgstr "" -#: plinth/modules/diagnostics/__init__.py:295 +#: plinth/modules/diagnostics/__init__.py:301 msgid "Go to diagnostics results" msgstr "" @@ -1429,12 +1429,18 @@ msgstr "" msgid "Diagnostic Results" msgstr "" -#: plinth/modules/diagnostics/templates/diagnostics_app.html:12 +#: plinth/modules/diagnostics/templates/diagnostics_app.html:13 #, python-format msgid "App: %(app_name)s" msgstr "" -#: plinth/modules/diagnostics/templates/diagnostics_app.html:21 +#: plinth/modules/diagnostics/templates/diagnostics_app.html:20 +#: plinth/modules/diagnostics/templates/diagnostics_full.html:48 +#: plinth/templates/toolbar.html:53 +msgid "Re-run setup" +msgstr "" + +#: plinth/modules/diagnostics/templates/diagnostics_app.html:32 msgid "This app does not support diagnostics" msgstr "" @@ -1450,12 +1456,12 @@ msgstr "" msgid "Results" msgstr "" -#: plinth/modules/diagnostics/templates/diagnostics_full.html:37 +#: plinth/modules/diagnostics/templates/diagnostics_full.html:38 #, python-format msgid "" "\n" -" App: %(app_name)s\n" -" " +" App: %(app_name)s\n" +" " msgstr "" #: plinth/modules/diagnostics/templates/diagnostics_results.html:11 @@ -1467,7 +1473,7 @@ msgstr "" msgid "Result" msgstr "" -#: plinth/modules/diagnostics/views.py:92 +#: plinth/modules/diagnostics/views.py:100 msgid "Diagnostic Test" msgstr "" @@ -7788,10 +7794,6 @@ msgstr "" msgid "Backup" msgstr "" -#: plinth/templates/toolbar.html:53 -msgid "Re-run setup" -msgstr "" - #: plinth/templates/toolbar.html:59 plinth/templates/toolbar.html:60 #: plinth/templates/uninstall.html:30 msgid "Uninstall" diff --git a/plinth/locale/te/LC_MESSAGES/django.po b/plinth/locale/te/LC_MESSAGES/django.po index 645409eda..27fc127ee 100644 --- a/plinth/locale/te/LC_MESSAGES/django.po +++ b/plinth/locale/te/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-23 20:05-0400\n" +"POT-Creation-Date: 2023-11-06 20:16-0500\n" "PO-Revision-Date: 2023-10-24 00:04+0000\n" "Last-Translator: Joseph Nuthalapati \n" "Language-Team: Telugu \n" "Language-Team: Turkish \n" "Language-Team: Ukrainian create your own." msgstr "" -"Ви можете завантажити пакунки матеріалів з проєкту Kiwix " -"або створити власні." +"Ви можете завантажити пакунки матеріалів з проєкту " +"Kiwix або створити власні." #: plinth/modules/kiwix/__init__.py:53 msgid "Manage Kiwix content server" @@ -8935,10 +8945,6 @@ msgstr "Оновити" msgid "Backup" msgstr "Резервна копія" -#: plinth/templates/toolbar.html:53 -msgid "Re-run setup" -msgstr "Повторно розпочати налаштування" - #: plinth/templates/toolbar.html:59 plinth/templates/toolbar.html:60 #: plinth/templates/uninstall.html:30 msgid "Uninstall" diff --git a/plinth/locale/vi/LC_MESSAGES/django.po b/plinth/locale/vi/LC_MESSAGES/django.po index 44cc5b340..56f626c5c 100644 --- a/plinth/locale/vi/LC_MESSAGES/django.po +++ b/plinth/locale/vi/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-23 20:05-0400\n" +"POT-Creation-Date: 2023-11-06 20:16-0500\n" "PO-Revision-Date: 2021-07-28 08:34+0000\n" "Last-Translator: bruh \n" "Language-Team: Vietnamese \n" "Language-Team: Chinese (Simplified) \n" "Language-Team: Chinese (Traditional) Date: Mon, 6 Nov 2023 21:02:47 -0500 Subject: [PATCH 19/20] doc: Fetch latest manual Signed-off-by: James Valleroy --- doc/manual/en/OrangePiZero.raw.wiki | 2 +- doc/manual/en/ReleaseNotes.raw.wiki | 20 ++++++++++++++++++++ doc/manual/es/OrangePiZero.raw.wiki | 2 +- doc/manual/es/ReleaseNotes.raw.wiki | 20 ++++++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/doc/manual/en/OrangePiZero.raw.wiki b/doc/manual/en/OrangePiZero.raw.wiki index b5102cf42..e3e8dbe8d 100644 --- a/doc/manual/en/OrangePiZero.raw.wiki +++ b/doc/manual/en/OrangePiZero.raw.wiki @@ -2,7 +2,7 @@ {{attachment:orange-pi-zero.jpg|Orange Pi Zero|width=649,height=537}} -[[http://www.orangepi.org/orangepizero/|Orange Pi Zero]] is a single board computer available at very low price. It uses the Allwinner H2 SoC, and has 256MB/512MB DDR3 SDRAM. It doesn't require any non-free firmware to run !FreedomBox. However, the onboard Wi-Fi module needs proprietary firmware to work. The board is available in two versions: with 256MB RAM and 512MB RAM. The version with 512 MB RAM is recommended for !FreedomBox. Even then, !FreedomBox is expected to gracefully run only a small number of services. +[[http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-Zero.html|Orange Pi Zero]] is a single board computer available at very low price. It uses the Allwinner H2 SoC, and has 256MB/512MB DDR3 SDRAM. It doesn't require any non-free firmware to run !FreedomBox. However, the onboard Wi-Fi module needs proprietary firmware to work. The board is available in two versions: with 256MB RAM and 512MB RAM. The version with 512 MB RAM is recommended for !FreedomBox. Even then, !FreedomBox is expected to gracefully run only a small number of services. '''Important:''' Read [[FreedomBox/Hardware|general advice]] about hardware before building a !FreedomBox with this single board computer. diff --git a/doc/manual/en/ReleaseNotes.raw.wiki b/doc/manual/en/ReleaseNotes.raw.wiki index 6f400148c..1e70e8f2e 100644 --- a/doc/manual/en/ReleaseNotes.raw.wiki +++ b/doc/manual/en/ReleaseNotes.raw.wiki @@ -8,6 +8,26 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 23.20 (2023-11-06) == + +=== Highlights === + + * backups: Don't leave services stopped if backup fails + * coturn: Fix incorrectly passing transport argument to STUN URIs + +=== Other Changes === + + * apache: tests: Update to use !DiagnosticCheck class + * app: Update diagnose() docstring + * datetime: Fix diagnostic test for checking NTP server sync + * diagnostics: Add shortcut to re-run setup for app + * ejabberd: Update old STUN URIs to remove 'transport' parameter + * email: Increase the size of the message to 100MiB + * locale: Update translations for Albanian, German, Spanish, Turkish, Ukrainian + * matrixsynapse: Update old STUN URIs to remove 'transport' parameter + * operation: Fix issue with re-running setup when it fails first time + * tests: functional: Run tests on two app servers + == FreedomBox 23.19 (2023-10-23) == === Highlights === diff --git a/doc/manual/es/OrangePiZero.raw.wiki b/doc/manual/es/OrangePiZero.raw.wiki index b5102cf42..e3e8dbe8d 100644 --- a/doc/manual/es/OrangePiZero.raw.wiki +++ b/doc/manual/es/OrangePiZero.raw.wiki @@ -2,7 +2,7 @@ {{attachment:orange-pi-zero.jpg|Orange Pi Zero|width=649,height=537}} -[[http://www.orangepi.org/orangepizero/|Orange Pi Zero]] is a single board computer available at very low price. It uses the Allwinner H2 SoC, and has 256MB/512MB DDR3 SDRAM. It doesn't require any non-free firmware to run !FreedomBox. However, the onboard Wi-Fi module needs proprietary firmware to work. The board is available in two versions: with 256MB RAM and 512MB RAM. The version with 512 MB RAM is recommended for !FreedomBox. Even then, !FreedomBox is expected to gracefully run only a small number of services. +[[http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-Zero.html|Orange Pi Zero]] is a single board computer available at very low price. It uses the Allwinner H2 SoC, and has 256MB/512MB DDR3 SDRAM. It doesn't require any non-free firmware to run !FreedomBox. However, the onboard Wi-Fi module needs proprietary firmware to work. The board is available in two versions: with 256MB RAM and 512MB RAM. The version with 512 MB RAM is recommended for !FreedomBox. Even then, !FreedomBox is expected to gracefully run only a small number of services. '''Important:''' Read [[FreedomBox/Hardware|general advice]] about hardware before building a !FreedomBox with this single board computer. diff --git a/doc/manual/es/ReleaseNotes.raw.wiki b/doc/manual/es/ReleaseNotes.raw.wiki index 6f400148c..1e70e8f2e 100644 --- a/doc/manual/es/ReleaseNotes.raw.wiki +++ b/doc/manual/es/ReleaseNotes.raw.wiki @@ -8,6 +8,26 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 23.20 (2023-11-06) == + +=== Highlights === + + * backups: Don't leave services stopped if backup fails + * coturn: Fix incorrectly passing transport argument to STUN URIs + +=== Other Changes === + + * apache: tests: Update to use !DiagnosticCheck class + * app: Update diagnose() docstring + * datetime: Fix diagnostic test for checking NTP server sync + * diagnostics: Add shortcut to re-run setup for app + * ejabberd: Update old STUN URIs to remove 'transport' parameter + * email: Increase the size of the message to 100MiB + * locale: Update translations for Albanian, German, Spanish, Turkish, Ukrainian + * matrixsynapse: Update old STUN URIs to remove 'transport' parameter + * operation: Fix issue with re-running setup when it fails first time + * tests: functional: Run tests on two app servers + == FreedomBox 23.19 (2023-10-23) == === Highlights === From d22d142490c5c9cb677f07ca35b023b8ec1e4cd9 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 6 Nov 2023 21:08:59 -0500 Subject: [PATCH 20/20] Release v23.20 to unstable Signed-off-by: James Valleroy --- debian/changelog | 39 +++++++++++++++++++++++++++++++++++++++ plinth/__init__.py | 2 +- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 5b7ef4dc9..e1f08152c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,42 @@ +freedombox (23.20) unstable; urgency=medium + + [ gallegonovato ] + * Translated using Weblate (Spanish) + + [ Burak Yavuz ] + * Translated using Weblate (Turkish) + * Translated using Weblate (Turkish) + + [ Ettore Atalan ] + * Translated using Weblate (German) + + [ James Valleroy ] + * app: Update diagnose() docstring + * diagnostics: Add shortcut to re-run setup for app + * locale: Update translation strings + * doc: Fetch latest manual + + [ Sunil Mohan Adapa ] + * datetime: Fix diagnostic test for checking NTP server sync + * apache: tests: Update to use DiagnosticCheck class + * backups: Don't leave services stopped if backup fails + * operation: Fix issue with re-running setup when it fails first time + * coturn: Fix incorrectly passing transport argument to STUN URIs + * matrixsynapse: Update old STUN URIs to remove 'transport' parameter + * ejabberd: Update old STUN URIs to remove 'transport' parameter + * email: Increase the size of the message to 100MiB + + [ Ihor Hordiichuk ] + * Translated using Weblate (Ukrainian) + + [ Besnik Bleta ] + * Translated using Weblate (Albanian) + + [ Joseph Nuthalapati ] + * tests: functional: Run tests on two app servers + + -- James Valleroy Mon, 06 Nov 2023 21:03:50 -0500 + freedombox (23.19) unstable; urgency=medium [ gallegonovato ] diff --git a/plinth/__init__.py b/plinth/__init__.py index eb212d68e..87f304897 100644 --- a/plinth/__init__.py +++ b/plinth/__init__.py @@ -3,4 +3,4 @@ Package init file. """ -__version__ = '23.19' +__version__ = '23.20'