From 47fe3b008f18ef7e218aa46faf01f8fd38c62a95 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 12 Oct 2017 16:09:56 -0400 Subject: [PATCH 01/61] Update changelog for 2.7.3 release --- debian/changelog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/debian/changelog b/debian/changelog index 33897c61..6275c445 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +moulinette (2.7.3) testing; urgency=low + + * Optional expected status code for download_text/json (#153) + * Allow to give lock to multiple processes (#154) + + -- Alexandre Aubin Thu, 12 Oct 2017 16:09:27 -0400 + moulinette (2.7.2) stable; urgency=low * Revert hack for buildchain, found a proper solution From 7e940ba8ac6695de99216eb9df2e30e3955c1e49 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 2 Dec 2017 12:27:04 -0500 Subject: [PATCH 02/61] Update changelog for 2.7.5 release --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 6275c445..3b95897b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +moulinette (2.7.5) stable; urgency=low + + (Bumping version for stable release) + + -- Alexandre Aubin Sat, 02 Dec 2017 12:26:43 -0500 + moulinette (2.7.3) testing; urgency=low * Optional expected status code for download_text/json (#153) From a239546704248545c460e875a59cf5dc64a41053 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Fri, 5 Jan 2018 02:09:09 +0100 Subject: [PATCH 03/61] [fix] indicate where those damn logs files are --- locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index 6eda60ca..77ea7c2b 100644 --- a/locales/en.json +++ b/locales/en.json @@ -8,7 +8,7 @@ "deprecated_command": "'{prog} {command}' is deprecated and will be removed in the future", "deprecated_command_alias": "'{prog} {old}' is deprecated and will be removed in the future, use '{prog} {new}' instead", "error": "Error:", - "error_see_log": "An error occurred. Please see the log for details.", + "error_see_log": "An error occurred. Please see the logs for details, they are located in /var/log/yunohost/.", "file_exists": "File already exists: '{path}'", "file_not_exist": "File does not exist: '{path}'", "folder_exists": "Folder already exists: '{path}'", From 7207a3218d35b724d0ad5c4f2c838e8374d59da5 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Fri, 5 Jan 2018 02:22:42 +0100 Subject: [PATCH 04/61] [fix] pep8 --- moulinette/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/moulinette/core.py b/moulinette/core.py index 1407f76d..ac4b261e 100644 --- a/moulinette/core.py +++ b/moulinette/core.py @@ -500,7 +500,7 @@ class MoulinetteLock(object): lock_pids = f.read().strip().split('\n') # Make sure to convert those pids to integers - lock_pids = [ int(pid) for pid in lock_pids ] + lock_pids = [int(pid) for pid in lock_pids] return lock_pids From 93a0ee72a164c26bf961aebafa45e6b9f7662708 Mon Sep 17 00:00:00 2001 From: David B Date: Fri, 22 Dec 2017 14:12:33 +0000 Subject: [PATCH 05/61] [i18n] Translated using Weblate (Spanish) Currently translated at 100.0% (51 of 51 strings) --- locales/es.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/locales/es.json b/locales/es.json index 52516dd2..7863d7d7 100644 --- a/locales/es.json +++ b/locales/es.json @@ -36,5 +36,18 @@ "unknown_user": "Usuario '{user}' desconocido", "values_mismatch": "Los valores no coinciden", "warning": "Advertencia:", - "websocket_request_expected": "Una petición de WebSocket prevista" + "websocket_request_expected": "Se esperaba una petición WebSocket", + "cannot_open_file": "No se pudo abrir el fichero{file:s} (motivo:{error:s})", + "cannot_write_file": "No se pudo escribir el fichero {file:s} (motivo: {error:s})", + "unknown_error_reading_file": "Error desconocido al intentar leer el fichero {file:s}", + "corrupted_json": "Json corrupto leido desde {ressource:s} (motivo: {error:s})", + "error_writing_file": "Error al escribir el fichero {file:s}: {error:s}", + "error_removing": "Error al eliminar {path:s}: {error:s}", + "error_changing_file_permissions": "Error al cambiar los permisos para {path:s}: {error:s}", + "invalid_url": "Url no válida {url:s} (¿existe este sitio web?)", + "download_ssl_error": "Error SSL al conectar con {url:s}", + "download_timeout": "{url:s} tardó demasiado en responder, me rindo.", + "download_unknown_error": "Error al descargar datos desde {url:s} : {error:s}", + "download_bad_status_code": "{url:s} devolvió el código de estado {code:s}", + "command_unknown": "Comando '{command:s}' desconocido ?" } From 0495836af74b2f233eb057e9f6a158bf70c43d9b Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Holcroft Date: Fri, 11 Aug 2017 16:13:00 +0000 Subject: [PATCH 06/61] [i18n] Translated using Weblate (French) Currently translated at 100.0% (51 of 51 strings) --- locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/fr.json b/locales/fr.json index a006ec42..62262b24 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -8,7 +8,7 @@ "deprecated_command": "« {prog} {command} » est déprécié et sera bientôt supprimé", "deprecated_command_alias": "« {prog} {old} » est déprécié et sera bientôt supprimé, utilisez « {prog} {new} » à la place", "error": "Erreur :", - "error_see_log": "Une erreur est survenue. Veuillez consulter les journaux pour plus de détails.", + "error_see_log": "Une erreur est survenue. Veuillez consulter les journaux pour plus de détails, ils sont situés en /var/log/yunohost/.", "file_exists": "Le fichier existe déjà : « {path} »", "file_not_exist": "Le fichier « {path} » n'existe pas", "folder_exists": "Le dossier existe déjà : « {path} »", From 1a93f851c65174dd1c9cae569a1c25919f973830 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 16 Jan 2018 17:13:20 -0500 Subject: [PATCH 07/61] Update changelog for 2.7.6 release --- debian/changelog | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/debian/changelog b/debian/changelog index 3b95897b..67c7142b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,12 @@ +moulinette (2.7.6) testing; urgency=low + + * [fix] Indicate where those damn logs files are + * [i18n] Improve Spanish and French translations + + Thanks to all contributors (Bram, Jibec, David B.) ! <3 + + -- Alexandre Aubin Tue, 16 Jan 2018 17:12:19 -0500 + moulinette (2.7.5) stable; urgency=low (Bumping version for stable release) From 6d74c6d7b8d2843c366184237e734920c6b52a54 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 18 Jan 2018 17:42:04 -0500 Subject: [PATCH 08/61] Update changelog for 2.7.7 release --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 67c7142b..fede3511 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +moulinette (2.7.7) stable; urgency=low + + (Bumping version for stable release) + + -- Alexandre Aubin Thu, 18 Jan 2018 17:41:43 -0500 + moulinette (2.7.6) testing; urgency=low * [fix] Indicate where those damn logs files are From 24440b2b722eb74065d5c43e511cce1d5ebdac88 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Wed, 7 Feb 2018 20:32:17 +0000 Subject: [PATCH 09/61] Added translation using Weblate (Arabic) --- locales/ar.json | 53 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 locales/ar.json diff --git a/locales/ar.json b/locales/ar.json new file mode 100644 index 00000000..77ea7c2b --- /dev/null +++ b/locales/ar.json @@ -0,0 +1,53 @@ +{ + "argument_required": "Argument '{argument}' is required", + "authentication_profile_required": "Authentication to profile '{profile}' required", + "authentication_required": "Authentication required", + "authentication_required_long": "Authentication is required to perform this action", + "colon": "{}: ", + "confirm": "Confirm {prompt}", + "deprecated_command": "'{prog} {command}' is deprecated and will be removed in the future", + "deprecated_command_alias": "'{prog} {old}' is deprecated and will be removed in the future, use '{prog} {new}' instead", + "error": "Error:", + "error_see_log": "An error occurred. Please see the logs for details, they are located in /var/log/yunohost/.", + "file_exists": "File already exists: '{path}'", + "file_not_exist": "File does not exist: '{path}'", + "folder_exists": "Folder already exists: '{path}'", + "folder_not_exist": "Folder does not exist", + "instance_already_running": "An instance is already running", + "invalid_argument": "Invalid argument '{argument}': {error}", + "invalid_password": "Invalid password", + "invalid_usage": "Invalid usage, pass --help to see help", + "ldap_attribute_already_exists": "Attribute '{attribute}' already exists with value '{value}'", + "ldap_operation_error": "An error occurred during LDAP operation", + "ldap_server_down": "Unable to reach LDAP server", + "logged_in": "Logged in", + "logged_out": "Logged out", + "not_logged_in": "You are not logged in", + "operation_interrupted": "Operation interrupted", + "password": "Password", + "pattern_not_match": "Does not match pattern", + "permission_denied": "Permission denied", + "root_required": "You must be root to perform this action", + "server_already_running": "A server is already running on that port", + "success": "Success!", + "unable_authenticate": "Unable to authenticate", + "unable_retrieve_session": "Unable to retrieve the session", + "unknown_group": "Unknown '{group}' group", + "unknown_user": "Unknown '{user}' user", + "values_mismatch": "Values don't match", + "warning": "Warning:", + "websocket_request_expected": "Expected a WebSocket request", + "cannot_open_file": "Could not open file {file:s} (reason: {error:s})", + "cannot_write_file": "Could not write file {file:s} (reason: {error:s})", + "unknown_error_reading_file": "Unknown error while trying to read file {file:s}", + "corrupted_json": "Corrupted json read from {ressource:s} (reason: {error:s})", + "error_writing_file": "Error when writing file {file:s}: {error:s}", + "error_removing": "Error when removing {path:s}: {error:s}", + "error_changing_file_permissions": "Error when changing permissions for {path:s}: {error:s}", + "invalid_url": "Invalid url {url:s} (does this site exists ?)", + "download_ssl_error": "SSL error when connecting to {url:s}", + "download_timeout": "{url:s} took too long to answer, gave up.", + "download_unknown_error": "Error when downloading data from {url:s} : {error:s}", + "download_bad_status_code": "{url:s} returned status code {code:s}", + "command_unknown": "Command '{command:s}' unknown ?" +} From b07bb7c9c114d8b4c03c40897d9aa61ab9dc7725 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Wed, 7 Feb 2018 20:41:44 +0000 Subject: [PATCH 10/61] [i18n] Translated using Weblate (Arabic) Currently translated at 100.0% (51 of 51 strings) --- locales/ar.json | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/locales/ar.json b/locales/ar.json index 77ea7c2b..0edac702 100644 --- a/locales/ar.json +++ b/locales/ar.json @@ -2,46 +2,46 @@ "argument_required": "Argument '{argument}' is required", "authentication_profile_required": "Authentication to profile '{profile}' required", "authentication_required": "Authentication required", - "authentication_required_long": "Authentication is required to perform this action", + "authentication_required_long": "المصادقة مطلوبة قبل القيام بهذا الإجراء", "colon": "{}: ", - "confirm": "Confirm {prompt}", + "confirm": "تأكيد {prompt}", "deprecated_command": "'{prog} {command}' is deprecated and will be removed in the future", "deprecated_command_alias": "'{prog} {old}' is deprecated and will be removed in the future, use '{prog} {new}' instead", - "error": "Error:", + "error": "خطأ :", "error_see_log": "An error occurred. Please see the logs for details, they are located in /var/log/yunohost/.", - "file_exists": "File already exists: '{path}'", - "file_not_exist": "File does not exist: '{path}'", - "folder_exists": "Folder already exists: '{path}'", - "folder_not_exist": "Folder does not exist", + "file_exists": "إنّ الملف موجود من قبل : '{path}'", + "file_not_exist": "الملف غير موجود : '{path}'", + "folder_exists": "إنّ المجلد موجود من قبل : '{path}'", + "folder_not_exist": "المجلد غير موجود", "instance_already_running": "An instance is already running", "invalid_argument": "Invalid argument '{argument}': {error}", - "invalid_password": "Invalid password", + "invalid_password": "كلمة السر خاطئة", "invalid_usage": "Invalid usage, pass --help to see help", "ldap_attribute_already_exists": "Attribute '{attribute}' already exists with value '{value}'", "ldap_operation_error": "An error occurred during LDAP operation", "ldap_server_down": "Unable to reach LDAP server", "logged_in": "Logged in", - "logged_out": "Logged out", + "logged_out": "تم تسجيل خروجك", "not_logged_in": "You are not logged in", - "operation_interrupted": "Operation interrupted", - "password": "Password", + "operation_interrupted": "تم توقيف العملية", + "password": "كلمة السر", "pattern_not_match": "Does not match pattern", "permission_denied": "Permission denied", - "root_required": "You must be root to perform this action", - "server_already_running": "A server is already running on that port", - "success": "Success!", - "unable_authenticate": "Unable to authenticate", + "root_required": "يتوجب عليك أن تكون مدير الجذر root للقيام بهذا الإجراء", + "server_already_running": "هناك خادم يشتغل على ذاك المنفذ", + "success": "تم بنجاح !", + "unable_authenticate": "تعذرت المصادقة", "unable_retrieve_session": "Unable to retrieve the session", "unknown_group": "Unknown '{group}' group", "unknown_user": "Unknown '{user}' user", - "values_mismatch": "Values don't match", - "warning": "Warning:", + "values_mismatch": "القيمتين غير متطابقتين", + "warning": "تحذير :", "websocket_request_expected": "Expected a WebSocket request", "cannot_open_file": "Could not open file {file:s} (reason: {error:s})", "cannot_write_file": "Could not write file {file:s} (reason: {error:s})", - "unknown_error_reading_file": "Unknown error while trying to read file {file:s}", + "unknown_error_reading_file": "طرأ هناك خطأ ما أثناء عملية قراءة الملف {file:s}", "corrupted_json": "Corrupted json read from {ressource:s} (reason: {error:s})", - "error_writing_file": "Error when writing file {file:s}: {error:s}", + "error_writing_file": "Error when writing file {file:s}: {error:s}", "error_removing": "Error when removing {path:s}: {error:s}", "error_changing_file_permissions": "Error when changing permissions for {path:s}: {error:s}", "invalid_url": "Invalid url {url:s} (does this site exists ?)", From 4e379dcf9f43f7d431e2ab1c6967244a5fe96f74 Mon Sep 17 00:00:00 2001 From: pitchum Date: Sun, 22 Apr 2018 00:27:53 +0200 Subject: [PATCH 11/61] Logging time needed to load the python module for an action (versus time needed to execute it). --- moulinette/actionsmap.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/moulinette/actionsmap.py b/moulinette/actionsmap.py index 9e1468f1..5951ca59 100644 --- a/moulinette/actionsmap.py +++ b/moulinette/actionsmap.py @@ -469,10 +469,13 @@ class ActionsMap(object): # Lock the moulinette for the namespace with MoulinetteLock(namespace, timeout): + start = time() try: mod = __import__('%s.%s' % (namespace, category), globals=globals(), level=0, fromlist=[func_name]) + logger.debug('loading python module %s took %.3fs', + '%s.%s' % (namespace, category), time() - start) func = getattr(mod, func_name) except (AttributeError, ImportError): logger.exception("unable to load function %s.%s", @@ -495,7 +498,7 @@ class ActionsMap(object): return func(**arguments) finally: stop = time() - logger.debug('action [%s] ended after %.3fs', + logger.debug('action [%s] executed in %.3fs', log_id, stop - start) @staticmethod From cd4581c3df075c9f66dc4d3a758648613bdd55eb Mon Sep 17 00:00:00 2001 From: pitchum Date: Sun, 22 Apr 2018 00:31:14 +0200 Subject: [PATCH 12/61] Lazy load some python imports (perfs improved a lot). --- moulinette/utils/network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/moulinette/utils/network.py b/moulinette/utils/network.py index c083dea6..27e753e3 100644 --- a/moulinette/utils/network.py +++ b/moulinette/utils/network.py @@ -1,5 +1,4 @@ import errno -import requests import json from moulinette import m18n @@ -17,6 +16,7 @@ def download_text(url, timeout=30, expected_status_code=200): expected_status_code -- Status code expected from the request. Can be None to ignore the status code. """ + import requests # lazy loading this module for performance reasons # Assumptions assert isinstance(url, str) From 455b7e49c0b61724fb53e52ba7c6d8c53c63307c Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Tue, 24 Apr 2018 11:08:51 +0200 Subject: [PATCH 13/61] [mod] remove catch-all try and provide real exception --- moulinette/authenticators/ldap.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/moulinette/authenticators/ldap.py b/moulinette/authenticators/ldap.py index ea874605..53cd0899 100644 --- a/moulinette/authenticators/ldap.py +++ b/moulinette/authenticators/ldap.py @@ -62,7 +62,8 @@ class Authenticator(BaseAuthenticator): try: # Retrieve identity who = self.con.whoami_s() - except: + except Exception as e: + logger.warning("Error during ldap authentication process: %s", e) return False else: if who[3:] == self.userdn: @@ -131,9 +132,9 @@ class Authenticator(BaseAuthenticator): try: result = self.con.search_s(base, ldap.SCOPE_SUBTREE, filter, attrs) - except: + except Exception as e: logger.exception("error during LDAP search operation with: base='%s', " - "filter='%s', attrs=%s", base, filter, attrs) + "filter='%s', attrs=%s and exception %s", base, filter, attrs, e) raise MoulinetteError(169, m18n.g('ldap_operation_error')) result_list = [] @@ -162,9 +163,9 @@ class Authenticator(BaseAuthenticator): try: self.con.add_s(dn, ldif) - except: + except Exception as e: logger.exception("error during LDAP add operation with: rdn='%s', " - "attr_dict=%s", rdn, attr_dict) + "attr_dict=%s and exception %s", rdn, attr_dict, e) raise MoulinetteError(169, m18n.g('ldap_operation_error')) else: return True @@ -183,8 +184,8 @@ class Authenticator(BaseAuthenticator): dn = rdn + ',' + self.basedn try: self.con.delete_s(dn) - except: - logger.exception("error during LDAP delete operation with: rdn='%s'", rdn) + except Exception as e: + logger.exception("error during LDAP delete operation with: rdn='%s' and exception %s", rdn, e) raise MoulinetteError(169, m18n.g('ldap_operation_error')) else: return True @@ -212,9 +213,10 @@ class Authenticator(BaseAuthenticator): dn = new_rdn + ',' + self.basedn self.con.modify_ext_s(dn, ldif) - except: + except Exception as e: logger.exception("error during LDAP update operation with: rdn='%s', " - "attr_dict=%s, new_rdn=%s", rdn, attr_dict, new_rdn) + "attr_dict=%s, new_rdn=%s and exception: %s", rdn, attr_dict, + new_rdn, e) raise MoulinetteError(169, m18n.g('ldap_operation_error')) else: return True From 1830b229a88dcb9035be444bede3942fdc8c7084 Mon Sep 17 00:00:00 2001 From: Bram Date: Sun, 29 Apr 2018 17:17:43 +0200 Subject: [PATCH 14/61] [fix] avoid cases where get_cookie returns None Reference https://bottlepy.org/docs/dev/api.html#bottle.BaseRequest.get_cookie Might now be the most beautiful solution ever but at least it will produce a real error message. --- moulinette/interfaces/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/moulinette/interfaces/api.py b/moulinette/interfaces/api.py index 1c5e3d67..c102d9af 100644 --- a/moulinette/interfaces/api.py +++ b/moulinette/interfaces/api.py @@ -438,7 +438,7 @@ class _ActionsMapPlugin(object): try: s_secret = self.secrets[s_id] s_hash = request.get_cookie('session.hashes', - secret=s_secret)[authenticator.name] + secret=s_secret, default={})[authenticator.name] except KeyError: if authenticator.name == 'default': msg = m18n.g('authentication_required') From 89d2b3bb5cfdcb42c6f97f79030e6174280618ed Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Wed, 7 Feb 2018 22:21:17 +0000 Subject: [PATCH 15/61] [i18n] Translated using Weblate (Arabic) Currently translated at 100.0% (51 of 51 strings) --- locales/ar.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/locales/ar.json b/locales/ar.json index 0edac702..0d95adf9 100644 --- a/locales/ar.json +++ b/locales/ar.json @@ -1,37 +1,37 @@ { "argument_required": "Argument '{argument}' is required", "authentication_profile_required": "Authentication to profile '{profile}' required", - "authentication_required": "Authentication required", + "authentication_required": "المصادقة مطلوبة", "authentication_required_long": "المصادقة مطلوبة قبل القيام بهذا الإجراء", "colon": "{}: ", "confirm": "تأكيد {prompt}", "deprecated_command": "'{prog} {command}' is deprecated and will be removed in the future", "deprecated_command_alias": "'{prog} {old}' is deprecated and will be removed in the future, use '{prog} {new}' instead", "error": "خطأ :", - "error_see_log": "An error occurred. Please see the logs for details, they are located in /var/log/yunohost/.", + "error_see_log": "طرأ هناك خطأ. يرجى الإطلاع على السجلات للمزيد مِن التفاصيل على المسار /var/log/yunohost/.", "file_exists": "إنّ الملف موجود من قبل : '{path}'", "file_not_exist": "الملف غير موجود : '{path}'", "folder_exists": "إنّ المجلد موجود من قبل : '{path}'", "folder_not_exist": "المجلد غير موجود", "instance_already_running": "An instance is already running", - "invalid_argument": "Invalid argument '{argument}': {error}", + "invalid_argument": "المُعامِل غير صالح '{argument}': {error}", "invalid_password": "كلمة السر خاطئة", "invalid_usage": "Invalid usage, pass --help to see help", "ldap_attribute_already_exists": "Attribute '{attribute}' already exists with value '{value}'", - "ldap_operation_error": "An error occurred during LDAP operation", - "ldap_server_down": "Unable to reach LDAP server", + "ldap_operation_error": "طرأ هناك خطأ أثناء عملية في LDAP", + "ldap_server_down": "لا يمكن الإتصال بخادم LDAP", "logged_in": "Logged in", "logged_out": "تم تسجيل خروجك", - "not_logged_in": "You are not logged in", + "not_logged_in": "لم تقم بعدُ بتسجيل دخولك", "operation_interrupted": "تم توقيف العملية", "password": "كلمة السر", "pattern_not_match": "Does not match pattern", - "permission_denied": "Permission denied", + "permission_denied": "رُفض التصريح", "root_required": "يتوجب عليك أن تكون مدير الجذر root للقيام بهذا الإجراء", "server_already_running": "هناك خادم يشتغل على ذاك المنفذ", "success": "تم بنجاح !", "unable_authenticate": "تعذرت المصادقة", - "unable_retrieve_session": "Unable to retrieve the session", + "unable_retrieve_session": "تعذرت مواصلة الجلسة", "unknown_group": "Unknown '{group}' group", "unknown_user": "Unknown '{user}' user", "values_mismatch": "القيمتين غير متطابقتين", From 6f97256c04b87e2160613605198193d3d7849e94 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Sun, 11 Feb 2018 10:12:33 +0000 Subject: [PATCH 16/61] [i18n] Translated using Weblate (Arabic) Currently translated at 100.0% (51 of 51 strings) --- locales/ar.json | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/locales/ar.json b/locales/ar.json index 0d95adf9..b88fbce6 100644 --- a/locales/ar.json +++ b/locales/ar.json @@ -1,53 +1,53 @@ { - "argument_required": "Argument '{argument}' is required", - "authentication_profile_required": "Authentication to profile '{profile}' required", + "argument_required": "المُعامِل '{argument}' مطلوب", + "authentication_profile_required": "المصادقة مع الملف الشخصي '{profile}' مطلوبة", "authentication_required": "المصادقة مطلوبة", "authentication_required_long": "المصادقة مطلوبة قبل القيام بهذا الإجراء", "colon": "{}: ", "confirm": "تأكيد {prompt}", - "deprecated_command": "'{prog} {command}' is deprecated and will be removed in the future", - "deprecated_command_alias": "'{prog} {old}' is deprecated and will be removed in the future, use '{prog} {new}' instead", + "deprecated_command": "'{prog} {command}' تم التخلي عنه و سوف تتم إزالته مستقبلا", + "deprecated_command_alias": "'{prog} {old}' تم التخلي عنه و سوف يتم إزالته مستقبلا، إستخدم '{prog} {new}' بدلا من ذلك", "error": "خطأ :", "error_see_log": "طرأ هناك خطأ. يرجى الإطلاع على السجلات للمزيد مِن التفاصيل على المسار /var/log/yunohost/.", "file_exists": "إنّ الملف موجود من قبل : '{path}'", "file_not_exist": "الملف غير موجود : '{path}'", "folder_exists": "إنّ المجلد موجود من قبل : '{path}'", "folder_not_exist": "المجلد غير موجود", - "instance_already_running": "An instance is already running", + "instance_already_running": "هناك نسخة خادوم تشتغل مِن قبل", "invalid_argument": "المُعامِل غير صالح '{argument}': {error}", "invalid_password": "كلمة السر خاطئة", - "invalid_usage": "Invalid usage, pass --help to see help", - "ldap_attribute_already_exists": "Attribute '{attribute}' already exists with value '{value}'", + "invalid_usage": "إستعمال غير صالح، إستخدم --help لعرض المساعدة", + "ldap_attribute_already_exists": "الخاصية '{attribute}' موجودة مسبقا و تحمل القيمة '{value}'", "ldap_operation_error": "طرأ هناك خطأ أثناء عملية في LDAP", "ldap_server_down": "لا يمكن الإتصال بخادم LDAP", - "logged_in": "Logged in", + "logged_in": "مُتّصل", "logged_out": "تم تسجيل خروجك", "not_logged_in": "لم تقم بعدُ بتسجيل دخولك", "operation_interrupted": "تم توقيف العملية", "password": "كلمة السر", - "pattern_not_match": "Does not match pattern", + "pattern_not_match": "لا يتطابق مع النموذج", "permission_denied": "رُفض التصريح", "root_required": "يتوجب عليك أن تكون مدير الجذر root للقيام بهذا الإجراء", "server_already_running": "هناك خادم يشتغل على ذاك المنفذ", "success": "تم بنجاح !", "unable_authenticate": "تعذرت المصادقة", "unable_retrieve_session": "تعذرت مواصلة الجلسة", - "unknown_group": "Unknown '{group}' group", - "unknown_user": "Unknown '{user}' user", + "unknown_group": "الفريق '{group}' مجهول", + "unknown_user": "المستخدم '{user}' مجهول", "values_mismatch": "القيمتين غير متطابقتين", "warning": "تحذير :", - "websocket_request_expected": "Expected a WebSocket request", - "cannot_open_file": "Could not open file {file:s} (reason: {error:s})", - "cannot_write_file": "Could not write file {file:s} (reason: {error:s})", + "websocket_request_expected": "كان ينتظر طلبًا عبر الويب سوكت WebSocket", + "cannot_open_file": "ليس بالإمكان فتح الملف {file:s} (السبب : {error:s})", + "cannot_write_file": "لا يمكن الكتابة في الملف {file:s} (السبب : {error:s})", "unknown_error_reading_file": "طرأ هناك خطأ ما أثناء عملية قراءة الملف {file:s}", - "corrupted_json": "Corrupted json read from {ressource:s} (reason: {error:s})", - "error_writing_file": "Error when writing file {file:s}: {error:s}", - "error_removing": "Error when removing {path:s}: {error:s}", - "error_changing_file_permissions": "Error when changing permissions for {path:s}: {error:s}", - "invalid_url": "Invalid url {url:s} (does this site exists ?)", - "download_ssl_error": "SSL error when connecting to {url:s}", - "download_timeout": "{url:s} took too long to answer, gave up.", - "download_unknown_error": "Error when downloading data from {url:s} : {error:s}", - "download_bad_status_code": "{url:s} returned status code {code:s}", - "command_unknown": "Command '{command:s}' unknown ?" + "corrupted_json": "قراءة json مُشوّهة مِن {ressource:s} (السبب : {error:s})", + "error_writing_file": "طرأ هناك خطأ أثناء الكتابة في الملف {file:s}: {error:s}", + "error_removing": "خطأ أثناء عملية حذف {path:s}: {error:s}", + "error_changing_file_permissions": "خطأ أثناء عملية تعديل التصريحات لـ {path:s}: {error:s}", + "invalid_url": "خطأ في عنوان الرابط {url:s} (هل هذا الموقع موجود حقًا ؟)", + "download_ssl_error": "خطأ في الإتصال الآمن عبر الـ SSL أثناء محاولة الإتصال بـ {url:s}", + "download_timeout": "{url:s} استغرق مدة طويلة جدا للإستجابة، فتوقّف.", + "download_unknown_error": "خطأ أثناء عملية تنزيل البيانات مِن {url:s} : {error:s}", + "download_bad_status_code": "{url:s} أعاد رمز الحالة {code:s}", + "command_unknown": "الأمر '{command:s}' غير معروف ؟" } From 47646862fd73bb73d1f07a0465910713a9ec88a2 Mon Sep 17 00:00:00 2001 From: "Anonymous (technical account)" Date: Mon, 19 Mar 2018 14:32:20 +0000 Subject: [PATCH 17/61] [i18n] Translated using Weblate (Dutch) Currently translated at 74.5% (38 of 51 strings) --- locales/nl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/nl.json b/locales/nl.json index 22f7c766..51317d4a 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -6,7 +6,7 @@ "colon": "{}: ", "confirm": "Bevestig {prompt}", "error": "Fout:", - "error_see_log": "Er is een fout opgetreden, zie logboek voor meer informatie.", + "error_see_log": "Er is een fout opgetreden, zie logboek voor meer informatie. Je kan deze vinden in /var/log/yunohost/", "file_exists": "Kan '{path}' niet aanmaken: Bestand bestaat al", "file_not_exist": "Bestand bestaat niet: '{path}'", "folder_exists": "kan map ‘{path}’ niet aanmaken: Bestand bestaat al", From d2fcc4b5285c38ec43fd41858a3fb88a83ca2dc5 Mon Sep 17 00:00:00 2001 From: Matthieu Date: Mon, 19 Mar 2018 14:43:34 +0000 Subject: [PATCH 18/61] [i18n] Translated using Weblate (Dutch) Currently translated at 100.0% (51 of 51 strings) --- locales/nl.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/locales/nl.json b/locales/nl.json index 51317d4a..ab547d48 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -36,5 +36,18 @@ "deprecated_command": "'{prog} {command}' is verouderd en wordt binnenkort verwijderd", "deprecated_command_alias": "'{prog} {old}' is verouderd en wordt binnenkort verwijderd, gebruik '{prog} {new}' in plaats daarvan", "unknown_group": "Groep '{group}' is onbekend", - "unknown_user": "Gebruiker '{user}' is onbekend" + "unknown_user": "Gebruiker '{user}' is onbekend", + "cannot_open_file": "Niet mogelijk om bestand {file:s} te openen (reden: {error:s})", + "cannot_write_file": "Niet gelukt om bestand {file:s} te schrijven (reden: {error:s})", + "unknown_error_reading_file": "Ongekende fout tijdens het lezen van bestand {file:s}", + "corrupted_json": "Corrupte json gelezen van {ressource:s} (reden: {error:s})", + "error_writing_file": "Fout tijdens het schrijven van bestand {file:s}: {error:s}", + "error_removing": "Fout tijdens het verwijderen van {path:s}: {error:s}", + "error_changing_file_permissions": "Fout tijdens het veranderen van machtiging voor {path:s}: {error:s}", + "invalid_url": "Ongeldige URL {url:s} (bestaat deze website?)", + "download_ssl_error": "SSL fout gedurende verbinding met {url:s}", + "download_timeout": "{url:s} neemt te veel tijd om te antwoorden, we geven het op.", + "download_unknown_error": "Fout tijdens het downloaden van data van {url:s}: {error:s}", + "download_bad_status_code": "{url:s} stuurt status code {code:s}", + "command_unknown": "Opdracht '{command:s}' ongekend ?" } From a47f952fe93aa76e4141b67bfffd66bbbc27c36f Mon Sep 17 00:00:00 2001 From: Matthieu Date: Mon, 19 Mar 2018 14:45:39 +0000 Subject: [PATCH 19/61] [i18n] Translated using Weblate (Dutch) Currently translated at 100.0% (51 of 51 strings) --- locales/nl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/nl.json b/locales/nl.json index ab547d48..86cd873e 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -6,7 +6,7 @@ "colon": "{}: ", "confirm": "Bevestig {prompt}", "error": "Fout:", - "error_see_log": "Er is een fout opgetreden, zie logboek voor meer informatie. Je kan deze vinden in /var/log/yunohost/", + "error_see_log": "Er is een fout opgetreden, zie logboek voor meer informatie. Je kan deze vinden in /var/log/yunohost/.", "file_exists": "Kan '{path}' niet aanmaken: Bestand bestaat al", "file_not_exist": "Bestand bestaat niet: '{path}'", "folder_exists": "kan map ‘{path}’ niet aanmaken: Bestand bestaat al", From e3b14936756b314cbf37becf0fb848ba275f6ac5 Mon Sep 17 00:00:00 2001 From: Jeroen Keerl Date: Mon, 19 Mar 2018 14:46:17 +0000 Subject: [PATCH 20/61] [i18n] Translated using Weblate (Dutch) Currently translated at 100.0% (51 of 51 strings) --- locales/nl.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locales/nl.json b/locales/nl.json index 86cd873e..f8a9ac9d 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -1,8 +1,8 @@ { "argument_required": "Argument {argument} is vereist", "authentication_profile_required": "Authenticatie tot profiel '{profile}' is vereist", - "authentication_required": "Authenticatie vereist", - "authentication_required_long": "Authenticatie is vereist om deze actie uit te voeren", + "authentication_required": "Aanmelding vereist", + "authentication_required_long": "Aanmelding is vereist om deze actie uit te voeren", "colon": "{}: ", "confirm": "Bevestig {prompt}", "error": "Fout:", From fb27f0d65bb6a5aa3d42d0435d95fd3ff05e4de9 Mon Sep 17 00:00:00 2001 From: Matthieu Date: Mon, 19 Mar 2018 14:46:33 +0000 Subject: [PATCH 21/61] [i18n] Translated using Weblate (Dutch) Currently translated at 100.0% (51 of 51 strings) --- locales/nl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/nl.json b/locales/nl.json index f8a9ac9d..f1c31c32 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -9,7 +9,7 @@ "error_see_log": "Er is een fout opgetreden, zie logboek voor meer informatie. Je kan deze vinden in /var/log/yunohost/.", "file_exists": "Kan '{path}' niet aanmaken: Bestand bestaat al", "file_not_exist": "Bestand bestaat niet: '{path}'", - "folder_exists": "kan map ‘{path}’ niet aanmaken: Bestand bestaat al", + "folder_exists": "Deze map bestaat al: '{path}'", "folder_not_exist": "Map bestaat niet", "instance_already_running": "Er is al een instantie aan het draaien", "invalid_argument": "Onjuist argument '{argument}': {error}", From 9a30667ad00402a3fedb0ca5390ac6c6e5350c73 Mon Sep 17 00:00:00 2001 From: Jeroen Keerl Date: Mon, 19 Mar 2018 14:47:09 +0000 Subject: [PATCH 22/61] [i18n] Translated using Weblate (Dutch) Currently translated at 100.0% (51 of 51 strings) --- locales/nl.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locales/nl.json b/locales/nl.json index f1c31c32..5f1729ee 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -11,8 +11,8 @@ "file_not_exist": "Bestand bestaat niet: '{path}'", "folder_exists": "Deze map bestaat al: '{path}'", "folder_not_exist": "Map bestaat niet", - "instance_already_running": "Er is al een instantie aan het draaien", - "invalid_argument": "Onjuist argument '{argument}': {error}", + "instance_already_running": "Er is al een instantie aktief", + "invalid_argument": "Ongeldig argument '{argument}': {error}", "invalid_password": "Ongeldig wachtwoord", "invalid_usage": "Geef 'pass --help' in voor meer informatie", "ldap_attribute_already_exists": "Attribuut bestaat al: '{attribute}={value}'", From 060160957faac255bc0ee6bc4b335618bc0d4277 Mon Sep 17 00:00:00 2001 From: Matthieu Date: Mon, 19 Mar 2018 14:54:50 +0000 Subject: [PATCH 23/61] [i18n] Translated using Weblate (Dutch) Currently translated at 100.0% (51 of 51 strings) --- locales/nl.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locales/nl.json b/locales/nl.json index 5f1729ee..5d7aa671 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -7,15 +7,15 @@ "confirm": "Bevestig {prompt}", "error": "Fout:", "error_see_log": "Er is een fout opgetreden, zie logboek voor meer informatie. Je kan deze vinden in /var/log/yunohost/.", - "file_exists": "Kan '{path}' niet aanmaken: Bestand bestaat al", + "file_exists": "Kan '{path}' niet aanmaken: bestand bestaat al", "file_not_exist": "Bestand bestaat niet: '{path}'", "folder_exists": "Deze map bestaat al: '{path}'", "folder_not_exist": "Map bestaat niet", - "instance_already_running": "Er is al een instantie aktief", + "instance_already_running": "Er is al een instantie actief", "invalid_argument": "Ongeldig argument '{argument}': {error}", "invalid_password": "Ongeldig wachtwoord", - "invalid_usage": "Geef 'pass --help' in voor meer informatie", - "ldap_attribute_already_exists": "Attribuut bestaat al: '{attribute}={value}'", + "invalid_usage": "Ongeldig gebruik, doe --help om de hulptekst te lezen", + "ldap_attribute_already_exists": "Attribuut '{attribute}' bestaat al met waarde '{value}'", "ldap_operation_error": "Er is een fout opgetreden bij het uitvoeren van LDAP operatie", "ldap_server_down": "Kan LDAP server niet bereiken", "logged_in": "Ingelogd", @@ -34,7 +34,7 @@ "warning": "Waarschuwing:", "websocket_request_expected": "Verwachtte een WebSocket request", "deprecated_command": "'{prog} {command}' is verouderd en wordt binnenkort verwijderd", - "deprecated_command_alias": "'{prog} {old}' is verouderd en wordt binnenkort verwijderd, gebruik '{prog} {new}' in plaats daarvan", + "deprecated_command_alias": "'{prog} {old}' is verouderd en wordt binnenkort verwijderd, gebruik in de plaats '{prog} {new}'", "unknown_group": "Groep '{group}' is onbekend", "unknown_user": "Gebruiker '{user}' is onbekend", "cannot_open_file": "Niet mogelijk om bestand {file:s} te openen (reden: {error:s})", From 908329b231890ca582d785b2ed0dd99c6832be54 Mon Sep 17 00:00:00 2001 From: Matthieu Date: Mon, 19 Mar 2018 14:56:04 +0000 Subject: [PATCH 24/61] [i18n] Translated using Weblate (French) Currently translated at 100.0% (51 of 51 strings) --- locales/fr.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locales/fr.json b/locales/fr.json index 62262b24..f4b30008 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -27,7 +27,7 @@ "password": "Mot de passe", "pattern_not_match": "Ne correspond pas au motif", "permission_denied": "Permission refusée", - "root_required": "Vous devez avoir les droits super-utilisateur pour exécuter cette action", + "root_required": "Vous devez avoir les droits super-utilisateur (root) pour exécuter cette action", "server_already_running": "Un serveur est déjà en cours d'exécution sur ce port", "success": "Succès !", "unable_authenticate": "Impossible de vous authentifier", @@ -49,5 +49,5 @@ "download_timeout": "{url:s} a pris trop de temps pour répondre, abandon.", "download_unknown_error": "Erreur lors du téléchargement des données à partir de {url:s}:{error:s}", "download_bad_status_code": "{url:s} code de statut renvoyé {code:s}", - "command_unknown": "Commande {command:s} inconnue ?" + "command_unknown": "Commande '{command:s}' inconnue ?" } From fa676ce461b88501997f99bcbf1da33bd2aa1351 Mon Sep 17 00:00:00 2001 From: Matthieu Date: Mon, 19 Mar 2018 14:56:45 +0000 Subject: [PATCH 25/61] [i18n] Translated using Weblate (Dutch) Currently translated at 100.0% (51 of 51 strings) 1996 spelling: https://nl.wiktionary.org/wiki/aktief --- locales/nl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/nl.json b/locales/nl.json index 5d7aa671..54e72c97 100644 --- a/locales/nl.json +++ b/locales/nl.json @@ -26,7 +26,7 @@ "pattern_not_match": "Past niet in het patroon", "permission_denied": "Toegang geweigerd", "root_required": "Je moet root zijn om deze actie uit te voeren", - "server_already_running": "Er is al een server aktief op die poort", + "server_already_running": "Er is al een server actief op die poort", "success": "Succes!", "unable_authenticate": "Aanmelding niet mogelijk", "unable_retrieve_session": "Kan de sessie niet ophalen", From c43c0d70bf663b33786eced5dc378c7209b909b6 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Holcroft Date: Tue, 20 Mar 2018 21:05:55 +0000 Subject: [PATCH 26/61] [i18n] Translated using Weblate (French) Currently translated at 100.0% (51 of 51 strings) --- locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/fr.json b/locales/fr.json index f4b30008..66d78358 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -27,7 +27,7 @@ "password": "Mot de passe", "pattern_not_match": "Ne correspond pas au motif", "permission_denied": "Permission refusée", - "root_required": "Vous devez avoir les droits super-utilisateur (root) pour exécuter cette action", + "root_required": "Vous devez être super-utilisateur pour exécuter cette action", "server_already_running": "Un serveur est déjà en cours d'exécution sur ce port", "success": "Succès !", "unable_authenticate": "Impossible de vous authentifier", From f0ea5c2a779ce8d0df5c8dcfa4d4bd978657fa21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quent=C3=AD?= Date: Fri, 27 Apr 2018 12:13:29 +0000 Subject: [PATCH 27/61] Added translation using Weblate (Occitan) --- locales/oc.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 locales/oc.json diff --git a/locales/oc.json b/locales/oc.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/locales/oc.json @@ -0,0 +1 @@ +{} From 26019b9cf2fcfd2364abb6be8f771871431ba104 Mon Sep 17 00:00:00 2001 From: David B Date: Fri, 22 Dec 2017 14:12:54 +0000 Subject: [PATCH 28/61] [i18n] Translated using Weblate (Spanish) Currently translated at 100.0% (51 of 51 strings) --- locales/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/es.json b/locales/es.json index 7863d7d7..78ca1ca7 100644 --- a/locales/es.json +++ b/locales/es.json @@ -8,7 +8,7 @@ "deprecated_command": "'{prog} {command}' está obsoleto y será eliminado en el futuro", "deprecated_command_alias": "'{prog} {old}' está obsoleto y se eliminará en el futuro, use '{prog} {new}' en su lugar", "error": "Error:", - "error_see_log": "Ha ocurrido un error. Consulte el registro para obtener más información.", + "error_see_log": "Ha ocurrido un error. Consulte el registro para obtener más información, localizado en /var/log/yunohost/.", "file_exists": "El archivo ya existe: '{path}'", "file_not_exist": "El archivo no existe: '{path}'", "folder_exists": "El directorio ya existe: '{path}'", From 8efc7ebe64a8bc9ec98f522616a5c0c8c6ecbf58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quent=C3=AD?= Date: Fri, 27 Apr 2018 12:56:32 +0000 Subject: [PATCH 29/61] [i18n] Translated using Weblate (Occitan) Currently translated at 7.8% (4 of 51 strings) --- locales/oc.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/locales/oc.json b/locales/oc.json index 0967ef42..177697ec 100644 --- a/locales/oc.json +++ b/locales/oc.json @@ -1 +1,6 @@ -{} +{ + "argument_required": "L'argument {argument} es requesit", + "authentication_profile_required": "L'identificacion del perfil {profile} es reqursida", + "authentication_required": "Autentificacion requesida", + "authentication_required_long": "Una autentificacion es requesida per acomplir aquesta accion" +} From 50f78dc8c8e5cf961a76dff16418f276c3bdec07 Mon Sep 17 00:00:00 2001 From: bjarkan Date: Sat, 28 Apr 2018 16:27:53 +0000 Subject: [PATCH 30/61] [i18n] Translated using Weblate (Spanish) Currently translated at 100.0% (51 of 51 strings) --- locales/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/es.json b/locales/es.json index 78ca1ca7..36fd562b 100644 --- a/locales/es.json +++ b/locales/es.json @@ -13,7 +13,7 @@ "file_not_exist": "El archivo no existe: '{path}'", "folder_exists": "El directorio ya existe: '{path}'", "folder_not_exist": "El directorio no existe", - "instance_already_running": "El programa ya se está ejecutando", + "instance_already_running": "Una instancia ya se está ejecutando", "invalid_argument": "Argumento no válido '{argument}': {error}", "invalid_password": "Contraseña no válida", "invalid_usage": "Uso no válido, utilice --help para ver la ayuda", From 3e617e18ab4bc254742f7f8f2cb6eb9bdc4adbce Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 1 May 2018 23:38:30 +0000 Subject: [PATCH 31/61] Update changelog for 2.7.11 release --- debian/changelog | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/debian/changelog b/debian/changelog index fede3511..727c4eed 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,15 @@ +moulinette (2.7.11) testing; urgency=low + + * [i18n] Improve translations for Arabic, Dutch, French, Occitan, Spanish + * [enh] Improve performances by lazy-loading some imports + * [enh] Log time needed to load a python module for an action + * [fix] Avoid cases where get_cookie returns None + * [mod] Improve exception logging in ldap stuff + + Thanks to all contributors (pitchum, Bram, ButteflyOfFire, J. Keerl, Matthieu, Jibec, David B, Quenti, bjarkan) <3 ! + + -- Alexandre Aubin Tue, 01 May 2018 23:33:59 +0000 + moulinette (2.7.7) stable; urgency=low (Bumping version for stable release) From e322a41f39d7466cacf7b99679ac1851c1d5dfb4 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 3 May 2018 03:24:45 +0200 Subject: [PATCH 32/61] Update changelog for Stretch beta 3.0.0~beta1 --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 727c4eed..2fd882b7 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +moulinette (3.0.0~beta1) testing; urgency=low + + Beta release for Stretch + + -- Alexandre Aubin Thu, 03 May 2018 03:04:45 +0000 + moulinette (2.7.11) testing; urgency=low * [i18n] Improve translations for Arabic, Dutch, French, Occitan, Spanish From 7f9cc03f3f6bf3620b54a7310fcec756d0680102 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 6 May 2018 16:57:36 +0000 Subject: [PATCH 33/61] Update changelog for 2.7.12 release --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 727c4eed..d0b79a62 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +moulinette (2.7.12) stable; urgency=low + + * Bumping version number for stable release + + -- Alexandre Aubin Sun, 06 May 2018 16:57:18 +0000 + moulinette (2.7.11) testing; urgency=low * [i18n] Improve translations for Arabic, Dutch, French, Occitan, Spanish From 9c19858bbd2b99de1c14b19ccc64750169b0c87b Mon Sep 17 00:00:00 2001 From: Everton Cardoso Date: Sun, 6 May 2018 06:00:47 +0000 Subject: [PATCH 34/61] [i18n] Translated using Weblate (Portuguese) Currently translated at 98.0% (50 of 51 strings) --- locales/pt.json | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/locales/pt.json b/locales/pt.json index 896da217..eaf83237 100644 --- a/locales/pt.json +++ b/locales/pt.json @@ -34,7 +34,19 @@ "websocket_request_expected": "Esperado um pedido a WebSocket", "deprecated_command": "'{prog} {command}' está obsoleto e será removido no futuro", "deprecated_command_alias": "'{prog} {old}' está obsoleto e será removido no futuro, em vez disso, usa '{prog} {new}'", - "error_see_log": "Um erro ocorreu. Por favor, veja mais detalhes no log.", + "error_see_log": "Ocorreu um erro . Por favor, veja os logs para maiores detalhes, eles estão localizados em /var/log/yunohost/.", "unknown_group": "Grupo '{group}' desconhecido", - "unknown_user": "Nome de utilizador '{user}' desconhecido" + "unknown_user": "Nome de utilizador '{user}' desconhecido", + "cannot_open_file": "Não foi possível abrir o arquivo {file:s} (reason: {error:s})", + "cannot_write_file": "Não foi possível abrir o arquivo {file:s} (reason: {error:s})", + "unknown_error_reading_file": "Erro desconhecido ao tentar ler o arquivo {file:s}", + "error_writing_file": "Erro ao gravar arquivo {file:s}: {error:s}", + "error_removing": "Erro ao remover {path:s}: {error:s}", + "error_changing_file_permissions": "Erro ao alterar as permissões para {path:s}: {error:s}", + "invalid_url": "URL inválida {url:s} (does this site exists ?)", + "download_ssl_error": "Erro de SSL ao conectar-se a {url:s}", + "download_timeout": "{url:s} demorou muito para responder, desistiu.", + "download_unknown_error": "Erro quando baixando os dados de {url:s} : {error:s}", + "download_bad_status_code": "{url:s} retornou o código de status {code:s}", + "command_unknown": "Comando '{command:s}' desconhecido ?" } From 9677450a6d4a9afd58e56d6a245787943e46255e Mon Sep 17 00:00:00 2001 From: Quenti Date: Mon, 7 May 2018 09:48:54 +0000 Subject: [PATCH 35/61] [i18n] Translated using Weblate (Occitan) Currently translated at 13.7% (7 of 51 strings) --- locales/oc.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/locales/oc.json b/locales/oc.json index 177697ec..f4b8ad79 100644 --- a/locales/oc.json +++ b/locales/oc.json @@ -2,5 +2,8 @@ "argument_required": "L'argument {argument} es requesit", "authentication_profile_required": "L'identificacion del perfil {profile} es reqursida", "authentication_required": "Autentificacion requesida", - "authentication_required_long": "Una autentificacion es requesida per acomplir aquesta accion" + "authentication_required_long": "Una autentificacion es requesida per acomplir aquesta accion", + "logged_in": "Connectat", + "logged_out": "Desconnectat", + "password": "Senhal" } From f8a1a6aabb2f55c7cdd560b8a32771d8de8c26d8 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Sat, 12 May 2018 05:58:00 +0200 Subject: [PATCH 36/61] [enh] new utils to read yaml files --- doc/utils/filesystem.rst | 1 + locales/en.json | 1 + moulinette/utils/filesystem.py | 23 +++++++++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/doc/utils/filesystem.rst b/doc/utils/filesystem.rst index c58c3367..6ae30928 100644 --- a/doc/utils/filesystem.rst +++ b/doc/utils/filesystem.rst @@ -3,6 +3,7 @@ File system operation utils .. autofunction:: moulinette.utils.filesystem.read_file .. autofunction:: moulinette.utils.filesystem.read_json +.. autofunction:: moulinette.utils.filesystem.read_yaml .. autofunction:: moulinette.utils.filesystem.write_to_file .. autofunction:: moulinette.utils.filesystem.append_to_file .. autofunction:: moulinette.utils.filesystem.write_to_json diff --git a/locales/en.json b/locales/en.json index 77ea7c2b..5adaab5b 100644 --- a/locales/en.json +++ b/locales/en.json @@ -41,6 +41,7 @@ "cannot_write_file": "Could not write file {file:s} (reason: {error:s})", "unknown_error_reading_file": "Unknown error while trying to read file {file:s}", "corrupted_json": "Corrupted json read from {ressource:s} (reason: {error:s})", + "corrupted_yaml": "Corrupted yaml read from {ressource:s} (reason: {error:s})", "error_writing_file": "Error when writing file {file:s}: {error:s}", "error_removing": "Error when removing {path:s}: {error:s}", "error_changing_file_permissions": "Error when changing permissions for {path:s}: {error:s}", diff --git a/moulinette/utils/filesystem.py b/moulinette/utils/filesystem.py index 1740a7a6..07da4bf7 100644 --- a/moulinette/utils/filesystem.py +++ b/moulinette/utils/filesystem.py @@ -1,4 +1,5 @@ import os +import yaml import errno import shutil import json @@ -64,6 +65,28 @@ def read_json(file_path): return loaded_json +def read_yaml(file_path): + """ + Safely read a yaml file + + Keyword argument: + file_path -- Path to the yaml file + """ + + # Read file + file_content = read_file(file_path) + + # Try to load yaml to check if it's syntaxically correct + try: + loaded_yaml = yaml.safe_load(file_content) + except ValueError as e: + raise MoulinetteError(errno.EINVAL, + m18n.g('corrupted_yaml', + ressource=file_path, error=str(e))) + + return loaded_yaml + + def write_to_file(file_path, data, file_mode="w"): """ Write a single string or a list of string to a text file. From cee5eb562a696afba2d4c28ede1613ee54539620 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 28 May 2018 02:57:10 +0200 Subject: [PATCH 37/61] Update changelog --- debian/changelog | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/debian/changelog b/debian/changelog index d0b79a62..a8db0b31 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,12 @@ +moulinette (2.7.13) testing; urgency=low + + * [i18n] Improve translations for Portugueuse, Occitan + * [enh] Add read_yaml util (#161) + + Contributors : Bram, by0ne, Quent-in + + -- Alexandre Aubin Mon, 28 May 2018 02:55:00 +0000 + moulinette (2.7.12) stable; urgency=low * Bumping version number for stable release From 1a5484ad1c291e7d7c3e102b69afe0c7350cccbb Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 28 May 2018 03:00:27 +0200 Subject: [PATCH 38/61] Update changelog --- debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/changelog b/debian/changelog index 834a4227..7c3bc077 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +moulinette (3.0.0~beta1.1) testing; urgency=low + + Merging with Jessie's branches + + -- Alexandre Aubin Mon, 28 May 2018 02:55:00 +0000 + moulinette (3.0.0~beta1) testing; urgency=low Beta release for Stretch From 4e4fb4125b6f3c788c171fa2b59b0a111dd54af1 Mon Sep 17 00:00:00 2001 From: ljf Date: Tue, 5 Jun 2018 17:57:06 +0200 Subject: [PATCH 39/61] [fix] Display the date in a correct format --- moulinette/utils/serialize.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/moulinette/utils/serialize.py b/moulinette/utils/serialize.py index bc0e6d1d..692be658 100644 --- a/moulinette/utils/serialize.py +++ b/moulinette/utils/serialize.py @@ -1,5 +1,6 @@ import logging from json.encoder import JSONEncoder +import datetime logger = logging.getLogger('moulinette.utils.serialize') @@ -24,6 +25,10 @@ class JSONExtendedEncoder(JSONEncoder): hasattr(o, '__iter__') and hasattr(o, 'next')): return list(o) + # Convert compatible containers into list + if isinstance(o, datetime.datetime) or isinstance(o, datetime.date): + return str(o) + # Return the repr for object that json can't encode logger.warning('cannot properly encode in JSON the object %s, ' 'returned repr is: %r', type(o), o) From aa8040451dc88d325b9233558062d305b54664f0 Mon Sep 17 00:00:00 2001 From: Bram Date: Thu, 7 Jun 2018 13:39:14 +0200 Subject: [PATCH 40/61] [mod] we moved away from redmine --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bdeedcf5..dd61aafd 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ prototype interfaces for your application. Issues ------ -- [Please report issues on YunoHost bugtracker](https://dev.yunohost.org/projects/yunohost/issues) (no registration needed). +- [Please report issues on YunoHost bugtracker](https://github.com/YunoHost/issues). Overview -------- From 2b3a557b8203e781fddafe54d19e693931680019 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Holcroft Date: Sat, 19 May 2018 12:22:42 +0000 Subject: [PATCH 41/61] [i18n] Translated using Weblate (French) Currently translated at 100.0% (52 of 52 strings) --- locales/fr.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/locales/fr.json b/locales/fr.json index 66d78358..911b9813 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -1,8 +1,8 @@ { "argument_required": "L'argument « {argument} » est requis", - "authentication_profile_required": "Authentification au profil « {profile} » requise", + "authentication_profile_required": "L’authentification au profil « {profile} » requise", "authentication_required": "Authentification requise", - "authentication_required_long": "L'authentification est requise pour exécuter cette action", + "authentication_required_long": "L’authentification est requise pour exécuter cette action", "colon": "{} : ", "confirm": "Confirmez : {prompt}", "deprecated_command": "« {prog} {command} » est déprécié et sera bientôt supprimé", @@ -49,5 +49,6 @@ "download_timeout": "{url:s} a pris trop de temps pour répondre, abandon.", "download_unknown_error": "Erreur lors du téléchargement des données à partir de {url:s}:{error:s}", "download_bad_status_code": "{url:s} code de statut renvoyé {code:s}", - "command_unknown": "Commande '{command:s}' inconnue ?" + "command_unknown": "Commande '{command:s}' inconnue ?", + "corrupted_yaml": "YAML corrompu lu {ressource:s} depuis (cause : {error:s})" } From 964c5595efeac7d527b6339da8935e70ffa7bc05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=B2u=20utilizaire?= Date: Wed, 23 May 2018 15:24:12 +0000 Subject: [PATCH 42/61] [i18n] Translated using Weblate (Occitan) Currently translated at 57.6% (30 of 52 strings) --- locales/oc.json | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/locales/oc.json b/locales/oc.json index f4b8ad79..02ae69ef 100644 --- a/locales/oc.json +++ b/locales/oc.json @@ -5,5 +5,28 @@ "authentication_required_long": "Una autentificacion es requesida per acomplir aquesta accion", "logged_in": "Connectat", "logged_out": "Desconnectat", - "password": "Senhal" + "password": "Senhal", + "colon": "{}: ", + "confirm": "Confirmatz : {prompt}", + "deprecated_command": "« {prog} {command} » es despreciat e serà lèu suprimit", + "deprecated_command_alias": "« {prog} {old} » es despreciat e serà lèu suprimit, utilizatz « {prog} {new} » allòc", + "error": "Error :", + "error_see_log": "Una error s’es prducha. Mercés de consultar los jornals per mai detalhs, son plaçats dins /var/log/yunohost/.", + "file_exists": "Lo fichièr existís ja : « {path} »", + "file_not_exist": "Lo fichièr « {path} » existís pas", + "folder_exists": "Lo repertòri existís ja : « {path} »", + "folder_not_exist": "Lo repertòri existís pas", + "instance_already_running": "Una instància es ja en execucion", + "invalid_argument": "Argument « {argument} » incorrècte : {error}", + "invalid_password": "Senhal incorrècte", + "ldap_server_down": "Impossible d’aténher lo servidor LDAP", + "not_logged_in": "Cap de session començada", + "pattern_not_match": "Correspond pas al patron", + "permission_denied": "Permission refusada", + "root_required": "Cal èsser root per realizar aquesta accion", + "unable_retrieve_session": "Impossible de recuperar la session", + "unknown_group": "Grop « {group} » desconegut", + "unknown_user": "Utilizaire « {user} » desconegut", + "values_mismatch": "Las valors correspondon pas", + "warning": "Atencion :" } From 80f36b6c70bd400d2a76ad214191b7fe864d9f8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=B2u=20utilizaire?= Date: Thu, 24 May 2018 07:44:59 +0000 Subject: [PATCH 43/61] [i18n] Translated using Weblate (Occitan) Currently translated at 96.1% (50 of 52 strings) --- locales/oc.json | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/locales/oc.json b/locales/oc.json index 02ae69ef..088193a2 100644 --- a/locales/oc.json +++ b/locales/oc.json @@ -11,7 +11,7 @@ "deprecated_command": "« {prog} {command} » es despreciat e serà lèu suprimit", "deprecated_command_alias": "« {prog} {old} » es despreciat e serà lèu suprimit, utilizatz « {prog} {new} » allòc", "error": "Error :", - "error_see_log": "Una error s’es prducha. Mercés de consultar los jornals per mai detalhs, son plaçats dins /var/log/yunohost/.", + "error_see_log": "Una error s’es producha. Mercés de consultar los jornals per mai detalhs, son plaçats dins /var/log/yunohost/.", "file_exists": "Lo fichièr existís ja : « {path} »", "file_not_exist": "Lo fichièr « {path} » existís pas", "folder_exists": "Lo repertòri existís ja : « {path} »", @@ -28,5 +28,25 @@ "unknown_group": "Grop « {group} » desconegut", "unknown_user": "Utilizaire « {user} » desconegut", "values_mismatch": "Las valors correspondon pas", - "warning": "Atencion :" + "warning": "Atencion :", + "invalid_usage": "Usatge invalid, utilizatz --help per accedir a l’ajuda", + "ldap_attribute_already_exists": "L’atribut « {attribute} » existís ja amb la valor : {value}", + "ldap_operation_error": "Una error s’es producha pendent l’operacion LDAP", + "operation_interrupted": "Operacion interrompuda", + "server_already_running": "Un servidor es ja en execucion sus aqueste pòrt", + "success": "Capitada !", + "unable_authenticate": "Impossible de vos autentificar", + "websocket_request_expected": "Una requèsta WebSocket èra esperada", + "cannot_open_file": "Impossible de dobrir lo fichièr {file:s} (rason : {error:s})", + "cannot_write_file": "Escritura impossibla del fichièr {file:s} (rason : {error:s})", + "unknown_error_reading_file": "Error desconeguda en ensajar de legir lo fichièr {file:s}", + "error_writing_file": "Error en escriure lo fichièr {file:s} : {error:s}", + "error_removing": "Error en suprimir {path:s} : {error:s}", + "error_changing_file_permissions": "Error en modificar las permissions per {path:s} : {error:s}", + "invalid_url": "Url invalida {url:s} (existís aqueste site ?)", + "download_ssl_error": "Error SSL en se connectant a {url:s}", + "download_timeout": "{url:s} a trigat per respondre, avèm quitat d’esperar.", + "download_unknown_error": "Error en telecargar de donadas de {url:s} : {error:s}", + "download_bad_status_code": "{url:s} tòrna lo còdi d’estat {code:s}", + "command_unknown": "Comanda {command:s} desconeguda ?" } From 0067886c4ed7e8b4e68b8b9fc8f74ac280cb7286 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=B2u=20utilizaire?= Date: Mon, 28 May 2018 12:09:02 +0000 Subject: [PATCH 44/61] [i18n] Translated using Weblate (Occitan) Currently translated at 100.0% (52 of 52 strings) --- locales/oc.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/locales/oc.json b/locales/oc.json index 088193a2..cf361fdc 100644 --- a/locales/oc.json +++ b/locales/oc.json @@ -48,5 +48,7 @@ "download_timeout": "{url:s} a trigat per respondre, avèm quitat d’esperar.", "download_unknown_error": "Error en telecargar de donadas de {url:s} : {error:s}", "download_bad_status_code": "{url:s} tòrna lo còdi d’estat {code:s}", - "command_unknown": "Comanda {command:s} desconeguda ?" + "command_unknown": "Comanda {command:s} desconeguda ?", + "corrupted_json": "Fichièr Json corromput legit de {ressource:s} (rason : {error:s})", + "corrupted_yaml": "Fichièr YAML corromput legit de {ressource:s} (rason : {error:s})" } From a67c8b68188f2fda9f02caefc9a0ba1881362558 Mon Sep 17 00:00:00 2001 From: htmk Date: Wed, 30 May 2018 05:06:02 +0000 Subject: [PATCH 45/61] [i18n] Translated using Weblate (Portuguese) Currently translated at 100.0% (52 of 52 strings) --- locales/pt.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/locales/pt.json b/locales/pt.json index eaf83237..583c1c66 100644 --- a/locales/pt.json +++ b/locales/pt.json @@ -48,5 +48,7 @@ "download_timeout": "{url:s} demorou muito para responder, desistiu.", "download_unknown_error": "Erro quando baixando os dados de {url:s} : {error:s}", "download_bad_status_code": "{url:s} retornou o código de status {code:s}", - "command_unknown": "Comando '{command:s}' desconhecido ?" + "command_unknown": "Comando '{command:s}' desconhecido ?", + "corrupted_json": "Json corrompido lido do {ressource:s} (reason: {error:s})", + "corrupted_yaml": "Yaml corrompido lido do {ressource:s} (motivo: {error:s})" } From 32a22d77f23c3d83df2c3ca172aeae3d88d904c3 Mon Sep 17 00:00:00 2001 From: Quenti Date: Wed, 30 May 2018 17:22:41 +0000 Subject: [PATCH 46/61] [i18n] Translated using Weblate (Occitan) Currently translated at 100.0% (52 of 52 strings) --- locales/oc.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/locales/oc.json b/locales/oc.json index cf361fdc..7ec0cfb6 100644 --- a/locales/oc.json +++ b/locales/oc.json @@ -1,23 +1,23 @@ { - "argument_required": "L'argument {argument} es requesit", - "authentication_profile_required": "L'identificacion del perfil {profile} es reqursida", + "argument_required": "L’argument {argument} es requesit", + "authentication_profile_required": "L’identificacion del perfil {profile} es requesida", "authentication_required": "Autentificacion requesida", "authentication_required_long": "Una autentificacion es requesida per acomplir aquesta accion", "logged_in": "Connectat", "logged_out": "Desconnectat", "password": "Senhal", "colon": "{}: ", - "confirm": "Confirmatz : {prompt}", - "deprecated_command": "« {prog} {command} » es despreciat e serà lèu suprimit", - "deprecated_command_alias": "« {prog} {old} » es despreciat e serà lèu suprimit, utilizatz « {prog} {new} » allòc", - "error": "Error :", + "confirm": "Confirmatz : {prompt}", + "deprecated_command": "« {prog} {command} » es despreciat e serà lèu suprimit", + "deprecated_command_alias": "« {prog} {old} » es despreciat e serà lèu suprimit, utilizatz « {prog} {new} » allòc", + "error": "Error :", "error_see_log": "Una error s’es producha. Mercés de consultar los jornals per mai detalhs, son plaçats dins /var/log/yunohost/.", - "file_exists": "Lo fichièr existís ja : « {path} »", - "file_not_exist": "Lo fichièr « {path} » existís pas", - "folder_exists": "Lo repertòri existís ja : « {path} »", + "file_exists": "Lo fichièr existís ja : « {path} »", + "file_not_exist": "Lo fichièr « {path} » existís pas", + "folder_exists": "Lo repertòri existís ja : « {path} »", "folder_not_exist": "Lo repertòri existís pas", "instance_already_running": "Una instància es ja en execucion", - "invalid_argument": "Argument « {argument} » incorrècte : {error}", + "invalid_argument": "Argument « {argument} » incorrècte : {error}", "invalid_password": "Senhal incorrècte", "ldap_server_down": "Impossible d’aténher lo servidor LDAP", "not_logged_in": "Cap de session començada", @@ -25,12 +25,12 @@ "permission_denied": "Permission refusada", "root_required": "Cal èsser root per realizar aquesta accion", "unable_retrieve_session": "Impossible de recuperar la session", - "unknown_group": "Grop « {group} » desconegut", - "unknown_user": "Utilizaire « {user} » desconegut", + "unknown_group": "Grop « {group} » desconegut", + "unknown_user": "Utilizaire « {user} » desconegut", "values_mismatch": "Las valors correspondon pas", - "warning": "Atencion :", + "warning": "Atencion :", "invalid_usage": "Usatge invalid, utilizatz --help per accedir a l’ajuda", - "ldap_attribute_already_exists": "L’atribut « {attribute} » existís ja amb la valor : {value}", + "ldap_attribute_already_exists": "L’atribut « {attribute} » existís ja amb la valor : {value}", "ldap_operation_error": "Una error s’es producha pendent l’operacion LDAP", "operation_interrupted": "Operacion interrompuda", "server_already_running": "Un servidor es ja en execucion sus aqueste pòrt", @@ -49,6 +49,6 @@ "download_unknown_error": "Error en telecargar de donadas de {url:s} : {error:s}", "download_bad_status_code": "{url:s} tòrna lo còdi d’estat {code:s}", "command_unknown": "Comanda {command:s} desconeguda ?", - "corrupted_json": "Fichièr Json corromput legit de {ressource:s} (rason : {error:s})", - "corrupted_yaml": "Fichièr YAML corromput legit de {ressource:s} (rason : {error:s})" + "corrupted_json": "Fichièr Json corromput legit de {ressource:s} (rason : {error:s})", + "corrupted_yaml": "Fichièr YAML corromput legit de {ressource:s} (rason : {error:s})" } From 1b4c8eac6a7239aea9862c0616ec5725875faedc Mon Sep 17 00:00:00 2001 From: htmk Date: Wed, 30 May 2018 05:07:04 +0000 Subject: [PATCH 47/61] [i18n] Translated using Weblate (Portuguese) Currently translated at 100.0% (52 of 52 strings) --- locales/pt.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/pt.json b/locales/pt.json index 583c1c66..cfc73e1e 100644 --- a/locales/pt.json +++ b/locales/pt.json @@ -49,6 +49,6 @@ "download_unknown_error": "Erro quando baixando os dados de {url:s} : {error:s}", "download_bad_status_code": "{url:s} retornou o código de status {code:s}", "command_unknown": "Comando '{command:s}' desconhecido ?", - "corrupted_json": "Json corrompido lido do {ressource:s} (reason: {error:s})", + "corrupted_json": "Json corrompido lido do {ressource:s} (motivo: {error:s})", "corrupted_yaml": "Yaml corrompido lido do {ressource:s} (motivo: {error:s})" } From 7e3227701d1084e3940948d04f507ed896ba4daa Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Fri, 1 Jun 2018 17:48:19 +0000 Subject: [PATCH 48/61] [i18n] Translated using Weblate (Arabic) Currently translated at 98.0% (51 of 52 strings) --- locales/ar.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/ar.json b/locales/ar.json index b88fbce6..f0ca8df8 100644 --- a/locales/ar.json +++ b/locales/ar.json @@ -49,5 +49,6 @@ "download_timeout": "{url:s} استغرق مدة طويلة جدا للإستجابة، فتوقّف.", "download_unknown_error": "خطأ أثناء عملية تنزيل البيانات مِن {url:s} : {error:s}", "download_bad_status_code": "{url:s} أعاد رمز الحالة {code:s}", - "command_unknown": "الأمر '{command:s}' غير معروف ؟" + "command_unknown": "الأمر '{command:s}' غير معروف ؟", + "corrupted_yaml": "قراءة مُشوّهة لنسق yaml مِن {ressource:s} (السبب : {error:s})" } From cf07c34fe3a3d7b8767e50e77e609253dd177cff Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Sat, 9 Jun 2018 11:38:43 +0200 Subject: [PATCH 49/61] [enh] Use isoformat date RFC 3339 --- moulinette/utils/serialize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/moulinette/utils/serialize.py b/moulinette/utils/serialize.py index 692be658..cccf956d 100644 --- a/moulinette/utils/serialize.py +++ b/moulinette/utils/serialize.py @@ -27,7 +27,7 @@ class JSONExtendedEncoder(JSONEncoder): # Convert compatible containers into list if isinstance(o, datetime.datetime) or isinstance(o, datetime.date): - return str(o) + return o.isoformat() # Return the repr for object that json can't encode logger.warning('cannot properly encode in JSON the object %s, ' From c83d582313b8936000412b5bb48f418e580146e5 Mon Sep 17 00:00:00 2001 From: "ljf (zamentur)" Date: Sat, 9 Jun 2018 11:41:26 +0200 Subject: [PATCH 50/61] [fix] Bad comment --- moulinette/utils/serialize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/moulinette/utils/serialize.py b/moulinette/utils/serialize.py index cccf956d..800cf1b0 100644 --- a/moulinette/utils/serialize.py +++ b/moulinette/utils/serialize.py @@ -25,7 +25,7 @@ class JSONExtendedEncoder(JSONEncoder): hasattr(o, '__iter__') and hasattr(o, 'next')): return list(o) - # Convert compatible containers into list + # Display the date in its iso format ISO-8601 Internet Profile (RFC 3339) if isinstance(o, datetime.datetime) or isinstance(o, datetime.date): return o.isoformat() From 66cadc60248f0687d8cb6cedc7baaea077038b7c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 17 Jun 2018 01:43:00 +0000 Subject: [PATCH 51/61] Update changelog for 2.7.14 release --- debian/changelog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/debian/changelog b/debian/changelog index a8db0b31..3a6267ff 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +moulinette (2.7.14) stable; urgency=low + + * Improve French, Occitan, Portuguese, Arabic translations + * Release as stable + + -- Alexandre Aubin Sun, 17 Jun 2018 01:42:12 +0000 + moulinette (2.7.13) testing; urgency=low * [i18n] Improve translations for Portugueuse, Occitan From 3e0493a92ffaf1ac8bf5ca692575df07fed40075 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 17 Jun 2018 01:47:25 +0000 Subject: [PATCH 52/61] Update changelog for 3.0.0 --- debian/changelog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/debian/changelog b/debian/changelog index e356d731..19011c65 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +moulinette (3.0.0) stable; urgency=low + + Merging with Jessie's branches + Releasing as stable + + -- Alexandre Aubin Sun, 17 Jun 2018 03:46:00 +0000 + moulinette (3.0.0~beta1.1) testing; urgency=low Merging with Jessie's branches From 75a21ad8122ffef051b2ab857b4ef75866d38646 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Sun, 24 Jun 2018 11:03:40 +0200 Subject: [PATCH 53/61] [mod] execute async consumers in the main process --- moulinette/utils/process.py | 13 +++++++++++-- moulinette/utils/stream.py | 34 ++++++++++++++++++++++++---------- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/moulinette/utils/process.py b/moulinette/utils/process.py index e48f27a9..332e7ebc 100644 --- a/moulinette/utils/process.py +++ b/moulinette/utils/process.py @@ -81,14 +81,23 @@ def call_async_output(args, callback, **kwargs): if separate_stderr: stderr_reader, stderr_consum = async_file_reading(p.stderr, callback[1]) while not stdout_reader.eof() and not stderr_reader.eof(): + while not stdout_consum.empty() or not stderr_consum.empty(): + # alternate between the 2 consumers to avoid desynchronisation + # this way is not 100% perfect but should do it + stdout_consum.process_next_line() + stderr_consum.process_next_line() time.sleep(.1) stderr_reader.join() - stderr_consum.join() + # clear the queues + stdout_consum.process_current_queue() + stderr_consum.process_current_queue() else: while not stdout_reader.eof(): + stdout_consum.process_current_queue() time.sleep(.1) stdout_reader.join() - stdout_consum.join() + # clear the queue + stdout_consum.process_current_queue() # on slow hardware, in very edgy situations it is possible that the process # isn't finished just after having closed stdout and stderr, so we wait a diff --git a/moulinette/utils/stream.py b/moulinette/utils/stream.py index 46b6ff88..e0350af5 100644 --- a/moulinette/utils/stream.py +++ b/moulinette/utils/stream.py @@ -40,14 +40,29 @@ class AsynchronousFileReader(Process): Process.join(self, timeout) -def consume_queue(queue, callback): - """Consume the queue and give content to the callback.""" - while True: - line = queue.get() - if line: - if line == StopIteration: - break - callback(line) +class Consummer(object): + def __init__(self, queue, callback): + self.queue = queue + self.callback = callback + + def empty(self): + return self.queue.empty() + + def process_next_line(self): + if not self.empty(): + line = self.queue.get() + if line: + if line == StopIteration: + return + self.callback(line) + + def process_current_queue(self): + while not self.empty(): + line = self.queue.get() + if line: + if line == StopIteration: + break + self.callback(line) def async_file_reading(fd, callback): @@ -55,6 +70,5 @@ def async_file_reading(fd, callback): queue = SimpleQueue() reader = AsynchronousFileReader(fd, queue) reader.start() - consummer = Process(target=consume_queue, args=(queue, callback)) - consummer.start() + consummer = Consummer(queue, callback) return (reader, consummer) From 9b700e0a373f4ec4de485e0a21d8239228b726f4 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Mon, 25 Jun 2018 15:16:31 +0200 Subject: [PATCH 54/61] [fix] sometime we get an empty string --- moulinette/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/moulinette/core.py b/moulinette/core.py index ac4b261e..fc147c01 100644 --- a/moulinette/core.py +++ b/moulinette/core.py @@ -500,7 +500,7 @@ class MoulinetteLock(object): lock_pids = f.read().strip().split('\n') # Make sure to convert those pids to integers - lock_pids = [int(pid) for pid in lock_pids] + lock_pids = [int(pid) for pid in lock_pids if pid.strip() != ''] return lock_pids From cbd2c1611cd115f6ac2bb282adb802fac6818372 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Fri, 20 Jul 2018 14:11:29 +0200 Subject: [PATCH 55/61] [fix] this error can also occur and is fixed by regenerating the cache https://paste.yunohost.org/uvojidumik.rb (reported from support chan) --- moulinette/actionsmap.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/moulinette/actionsmap.py b/moulinette/actionsmap.py index 5951ca59..807eab14 100644 --- a/moulinette/actionsmap.py +++ b/moulinette/actionsmap.py @@ -391,7 +391,7 @@ class ActionsMap(object): with open(actionsmap_pkl) as f: actionsmaps[n] = pickle.load(f) # TODO: Switch to python3 and catch proper exception - except IOError: + except (IOError, EOFError): self.use_cache = False actionsmaps = self.generate_cache(namespaces) elif use_cache: # cached file doesn't exists From 6f9bb5454233205b60efdff3b9b1e1a620fb8218 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 25 Jul 2018 14:38:34 +0000 Subject: [PATCH 56/61] Microdecision: prefix info messages with blue 'Info:' --- locales/en.json | 1 + moulinette/interfaces/cli.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index 5adaab5b..1d95b6f1 100644 --- a/locales/en.json +++ b/locales/en.json @@ -13,6 +13,7 @@ "file_not_exist": "File does not exist: '{path}'", "folder_exists": "Folder already exists: '{path}'", "folder_not_exist": "Folder does not exist", + "info": "Info:", "instance_already_running": "An instance is already running", "invalid_argument": "Invalid argument '{argument}': {error}", "invalid_password": "Invalid password", diff --git a/moulinette/interfaces/cli.py b/moulinette/interfaces/cli.py index 8ed96ced..00737b5e 100644 --- a/moulinette/interfaces/cli.py +++ b/moulinette/interfaces/cli.py @@ -182,7 +182,7 @@ class TTYHandler(logging.StreamHandler): if self.level <= log.DEBUG: # add level name before message level = '%s ' % record.levelname - elif record.levelname in ['SUCCESS', 'WARNING', 'ERROR']: + elif record.levelname in ['SUCCESS', 'WARNING', 'ERROR', 'INFO']: # add translated level name before message level = '%s ' % m18n.g(record.levelname.lower()) color = self.LEVELS_COLOR.get(record.levelno, 'white') From 8f2d094e0c14bbe4f7bf18e4eff412866732b47d Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Mon, 6 Aug 2018 02:31:22 +0200 Subject: [PATCH 57/61] [fix] don't crash when failed to format a translatable string --- moulinette/core.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/moulinette/core.py b/moulinette/core.py index fc147c01..4e1b20f4 100644 --- a/moulinette/core.py +++ b/moulinette/core.py @@ -89,13 +89,20 @@ class Translator(object): """ if key in self._translations.get(self.locale, {}): - return self._translations[self.locale][key].encode('utf-8').format(*args, **kwargs) + try: + return self._translations[self.locale][key].encode('utf-8').format(*args, **kwargs) + except KeyError as e: + logger.warning("Failed to format translated string '%s' with error: %s" % (key, e)) if self.default_locale != self.locale and key in self._translations.get(self.default_locale, {}): logger.info("untranslated key '%s' for locale '%s'", key, self.locale) - return self._translations[self.default_locale][key].encode('utf-8').format(*args, **kwargs) + try: + return self._translations[self.default_locale][key].encode('utf-8').format(*args, **kwargs) + except KeyError as e: + logger.warning("Failed to format translatable string '%s' with error: %s" % (key, e)) + return key logger.exception("unable to retrieve key '%s' for default locale '%s'", key, self.default_locale) From abc20856317da69910f44768b0729749eed609c0 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Mon, 6 Aug 2018 02:37:38 +0200 Subject: [PATCH 58/61] [mod] stronger warning messages --- moulinette/core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/moulinette/core.py b/moulinette/core.py index 4e1b20f4..7c372886 100644 --- a/moulinette/core.py +++ b/moulinette/core.py @@ -92,7 +92,7 @@ class Translator(object): try: return self._translations[self.locale][key].encode('utf-8').format(*args, **kwargs) except KeyError as e: - logger.warning("Failed to format translated string '%s' with error: %s" % (key, e)) + logger.exception("Failed to format translated string '%s' with error: %s" % (key, e)) if self.default_locale != self.locale and key in self._translations.get(self.default_locale, {}): logger.info("untranslated key '%s' for locale '%s'", @@ -101,7 +101,7 @@ class Translator(object): try: return self._translations[self.default_locale][key].encode('utf-8').format(*args, **kwargs) except KeyError as e: - logger.warning("Failed to format translatable string '%s' with error: %s" % (key, e)) + logger.exception("Failed to format translatable string '%s' with error: %s" % (key, e)) return key logger.exception("unable to retrieve key '%s' for default locale '%s'", From a26258e4185fc13c46fc5ec7251e3491c3e432ad Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Mon, 6 Aug 2018 02:38:07 +0200 Subject: [PATCH 59/61] [mod] fallback on english on failure --- moulinette/core.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/moulinette/core.py b/moulinette/core.py index 7c372886..8bf53d89 100644 --- a/moulinette/core.py +++ b/moulinette/core.py @@ -88,13 +88,15 @@ class Translator(object): - key -- The key to translate """ + failed_to_format = False if key in self._translations.get(self.locale, {}): try: return self._translations[self.locale][key].encode('utf-8').format(*args, **kwargs) except KeyError as e: logger.exception("Failed to format translated string '%s' with error: %s" % (key, e)) + failed_to_format = True - if self.default_locale != self.locale and key in self._translations.get(self.default_locale, {}): + if failed_to_format or (self.default_locale != self.locale and key in self._translations.get(self.default_locale, {})): logger.info("untranslated key '%s' for locale '%s'", key, self.locale) From c3f4f8e58bbb40f0df2cfe5c225a6d1be656559b Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Mon, 6 Aug 2018 02:38:24 +0200 Subject: [PATCH 60/61] [mod] return the informated string, it's give more information to the user --- moulinette/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/moulinette/core.py b/moulinette/core.py index 8bf53d89..c6e367f7 100644 --- a/moulinette/core.py +++ b/moulinette/core.py @@ -104,7 +104,7 @@ class Translator(object): return self._translations[self.default_locale][key].encode('utf-8').format(*args, **kwargs) except KeyError as e: logger.exception("Failed to format translatable string '%s' with error: %s" % (key, e)) - return key + return self._translations[self.locale][key].encode('utf-8') logger.exception("unable to retrieve key '%s' for default locale '%s'", key, self.default_locale) From d79dc67e977b3b0ce19ab9d1da8fc321336dfcd9 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 15 Aug 2018 19:51:34 +0000 Subject: [PATCH 61/61] Update changelog for 3.1.0 --- debian/changelog | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/debian/changelog b/debian/changelog index 19011c65..5a98bd8c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,14 @@ +moulinette (3.1.0) stable; urgency=low + + * Fix datetime output formats (#163) + * Add the missing Info: prefix for info messages + * Rework a bit the way we handle async outputs (#166) + * Don't crash the moulinette if we fail to format a string (#168) + + Thanks to all contributors : ljf, Bram, Aleks ! + + -- Alexandre Aubin Wed, 15 Aug 2018 21:44:00 +0000 + moulinette (3.0.0) stable; urgency=low Merging with Jessie's branches