From ddc42e5c8c120a50b30b8c6fc5ae61088732169f Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 6 Nov 2019 18:35:21 +0100 Subject: [PATCH 01/29] Make sure the users actually exists when migrating legacy custom permissions --- .../data_migrations/0011_setup_group_permission.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/yunohost/data_migrations/0011_setup_group_permission.py b/src/yunohost/data_migrations/0011_setup_group_permission.py index e9ca32294..c80686344 100644 --- a/src/yunohost/data_migrations/0011_setup_group_permission.py +++ b/src/yunohost/data_migrations/0011_setup_group_permission.py @@ -7,7 +7,7 @@ from moulinette.utils.log import getActionLogger from moulinette.utils.filesystem import read_yaml from yunohost.tools import Migration -from yunohost.user import user_group_create, user_group_update +from yunohost.user import user_list, user_group_create, user_group_update from yunohost.app import app_setting, app_list from yunohost.regenconf import regen_conf, BACKUP_CONF_DIR from yunohost.permission import permission_create, user_permission_update, permission_sync_to_user @@ -109,10 +109,11 @@ class MyMigration(Migration): url = "/" if domain and path else None if permission: - allowed_groups = permission.split(',') + known_users = user_list()["users"].keys() + allowed = [user for user in permission.split(',') if user in known_users] else: - allowed_groups = ["all_users"] - permission_create(app+".main", url=url, allowed=allowed_groups, sync_perm=False) + allowed = ["all_users"] + permission_create(app+".main", url=url, allowed=allowed, sync_perm=False) app_setting(app, 'allowed_users', delete=True) From 0beec2e0cb338597dbdecd8d82c43689c3c14145 Mon Sep 17 00:00:00 2001 From: Kayou Date: Thu, 7 Nov 2019 22:32:24 +0900 Subject: [PATCH 02/29] Add arg in permission callback --- src/yunohost/permission.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/yunohost/permission.py b/src/yunohost/permission.py index c53804d49..7866e7277 100644 --- a/src/yunohost/permission.py +++ b/src/yunohost/permission.py @@ -179,6 +179,7 @@ def user_permission_update(operation_logger, permission, add=None, remove=None, # Trigger app callbacks app = permission.split(".")[0] + sub_permission = permission.split(".")[1] old_allowed_users = set(existing_permission["corresponding_users"]) new_allowed_users = set(new_permission["corresponding_users"]) @@ -187,9 +188,9 @@ def user_permission_update(operation_logger, permission, add=None, remove=None, effectively_removed_users = old_allowed_users - new_allowed_users if effectively_added_users: - hook_callback('post_app_addaccess', args=[app, ','.join(effectively_added_users)]) + hook_callback('post_app_addaccess', args=[app, ','.join(effectively_added_users), sub_permission]) if effectively_removed_users: - hook_callback('post_app_removeaccess', args=[app, ','.join(effectively_removed_users)]) + hook_callback('post_app_removeaccess', args=[app, ','.join(effectively_removed_users), sub_permission]) return new_permission @@ -241,6 +242,7 @@ def user_permission_reset(operation_logger, permission, sync_perm=True): # Trigger app callbacks app = permission.split(".")[0] + sub_permission = permission.split(".")[1] old_allowed_users = set(existing_permission["corresponding_users"]) new_allowed_users = set(new_permission["corresponding_users"]) @@ -249,9 +251,9 @@ def user_permission_reset(operation_logger, permission, sync_perm=True): effectively_removed_users = old_allowed_users - new_allowed_users if effectively_added_users: - hook_callback('post_app_addaccess', args=[app, ','.join(effectively_added_users)]) + hook_callback('post_app_addaccess', args=[app, ','.join(effectively_added_users), sub_permission]) if effectively_removed_users: - hook_callback('post_app_removeaccess', args=[app, ','.join(effectively_removed_users)]) + hook_callback('post_app_removeaccess', args=[app, ','.join(effectively_removed_users), sub_permission]) return new_permission From 6d5b90cc236c82bc83ec3ffa8e86254dcdfe0eff Mon Sep 17 00:00:00 2001 From: Kay0u Date: Thu, 7 Nov 2019 23:32:08 +0900 Subject: [PATCH 03/29] Refactor group permission --- src/yunohost/permission.py | 157 +++++++++++++++++++------------------ 1 file changed, 79 insertions(+), 78 deletions(-) diff --git a/src/yunohost/permission.py b/src/yunohost/permission.py index 7866e7277..8e1be4451 100644 --- a/src/yunohost/permission.py +++ b/src/yunohost/permission.py @@ -92,7 +92,6 @@ def user_permission_update(operation_logger, permission, add=None, remove=None, remove -- List of groups or usernames to remove from to this permission """ from yunohost.hook import hook_callback - from yunohost.user import user_group_list from yunohost.utils.ldap import _get_ldap_interface ldap = _get_ldap_interface() @@ -111,7 +110,6 @@ def user_permission_update(operation_logger, permission, add=None, remove=None, raise YunohostError('permission_not_found', permission=permission) current_allowed_groups = existing_permission["allowed"] - all_existing_groups = user_group_list()['groups'].keys() operation_logger.related_to.append(('app', permission.split(".")[0])) # Compute new allowed group list (and make sure what we're doing make sense) @@ -121,8 +119,6 @@ def user_permission_update(operation_logger, permission, add=None, remove=None, if add: groups_to_add = [add] if not isinstance(add, list) else add for group in groups_to_add: - if group not in all_existing_groups: - raise YunohostError('group_unknown', group=group) if group in current_allowed_groups: logger.warning(m18n.n('permission_already_allowed', permission=permission, group=group)) else: @@ -133,8 +129,6 @@ def user_permission_update(operation_logger, permission, add=None, remove=None, if remove: groups_to_remove = [remove] if not isinstance(remove, list) else remove for group in groups_to_remove: - if group not in all_existing_groups: - raise YunohostError('group_unknown', group=group) if group not in current_allowed_groups: logger.warning(m18n.n('permission_already_disallowed', permission=permission, group=group)) else: @@ -161,37 +155,10 @@ def user_permission_update(operation_logger, permission, add=None, remove=None, operation_logger.start() - try: - ldap.update('cn=%s,ou=permission' % permission, - {'groupPermission': ['cn=' + g + ',ou=groups,dc=yunohost,dc=org' for g in new_allowed_groups]}) - except Exception as e: - raise YunohostError('permission_update_failed', permission=permission, error=e) + new_permission = _update_ldap_group_permission(permission=permission, allowed=new_allowed_groups, sync_perm=sync_perm) logger.debug(m18n.n('permission_updated', permission=permission)) - # Trigger permission sync if asked - - if sync_perm: - permission_sync_to_user() - - new_permission = user_permission_list(full=True)["permissions"][permission] - - # Trigger app callbacks - - app = permission.split(".")[0] - sub_permission = permission.split(".")[1] - - old_allowed_users = set(existing_permission["corresponding_users"]) - new_allowed_users = set(new_permission["corresponding_users"]) - - effectively_added_users = new_allowed_users - old_allowed_users - effectively_removed_users = old_allowed_users - new_allowed_users - - if effectively_added_users: - hook_callback('post_app_addaccess', args=[app, ','.join(effectively_added_users), sub_permission]) - if effectively_removed_users: - hook_callback('post_app_removeaccess', args=[app, ','.join(effectively_removed_users), sub_permission]) - return new_permission @@ -226,35 +193,10 @@ def user_permission_reset(operation_logger, permission, sync_perm=True): operation_logger.related_to.append(('app', permission.split(".")[0])) operation_logger.start() - default_permission = {'groupPermission': ['cn=all_users,ou=groups,dc=yunohost,dc=org']} - try: - ldap.update('cn=%s,ou=permission' % permission, default_permission) - except Exception as e: - raise YunohostError('permission_update_failed', permission=permission, error=e) + new_permission = _update_ldap_group_permission(permission=permission, allowed="all_users", sync_perm=sync_perm) logger.debug(m18n.n('permission_updated', permission=permission)) - if sync_perm: - permission_sync_to_user() - - new_permission = user_permission_list(full=True)["permissions"][permission] - - # Trigger app callbacks - - app = permission.split(".")[0] - sub_permission = permission.split(".")[1] - - old_allowed_users = set(existing_permission["corresponding_users"]) - new_allowed_users = set(new_permission["corresponding_users"]) - - effectively_added_users = new_allowed_users - old_allowed_users - effectively_removed_users = old_allowed_users - new_allowed_users - - if effectively_added_users: - hook_callback('post_app_addaccess', args=[app, ','.join(effectively_added_users), sub_permission]) - if effectively_removed_users: - hook_callback('post_app_removeaccess', args=[app, ','.join(effectively_removed_users), sub_permission]) - return new_permission # @@ -288,7 +230,6 @@ def permission_create(operation_logger, permission, url=None, allowed=None, sync re:domain.tld/app/api/[A-Z]*$ -> domain.tld/app/api/[A-Z]*$ """ - from yunohost.user import user_group_list from yunohost.utils.ldap import _get_ldap_interface ldap = _get_ldap_interface() @@ -315,20 +256,6 @@ def permission_create(operation_logger, permission, url=None, allowed=None, sync 'gidNumber': gid, } - # If who should be allowed is explicitly provided, use this info - if allowed: - if not isinstance(allowed, list): - allowed = [allowed] - # (though first we validate that the targets actually exist) - all_existing_groups = user_group_list()['groups'].keys() - for g in allowed: - if g not in all_existing_groups: - raise YunohostError('group_unknown', group=g) - attr_dict['groupPermission'] = ['cn=%s,ou=groups,dc=yunohost,dc=org' % g for g in allowed] - # For main permission, we add all users by default - elif permission.endswith(".main"): - attr_dict['groupPermission'] = ['cn=all_users,ou=groups,dc=yunohost,dc=org'] - if url: attr_dict['URL'] = url @@ -340,11 +267,20 @@ def permission_create(operation_logger, permission, url=None, allowed=None, sync except Exception as e: raise YunohostError('permission_creation_failed', permission=permission, error=e) - if sync_perm: - permission_sync_to_user() + to_add = None + + # If who should be allowed is explicitly provided, use this info + if allowed: + if not isinstance(allowed, list): + to_add = [allowed] + # For main permission, we add all users by default + elif permission.endswith(".main"): + to_add = "all_users" + + new_permission = _update_ldap_group_permission(permission=permission, allowed=to_add, sync_perm=sync_perm) logger.debug(m18n.n('permission_created', permission=permission)) - return user_permission_list(full=True)["permissions"][permission] + return new_permission @is_unit_operation() @@ -473,3 +409,68 @@ def permission_sync_to_user(): # Reload unscd, otherwise the group ain't propagated to the LDAP database os.system('nscd --invalidate=passwd') os.system('nscd --invalidate=group') + +def _update_ldap_group_permission(permission, allowed, sync_perm=True): + """ + Internal function that will rewrite user permission + + permission -- Name of the permission (e.g. mail or nextcloud or wordpress.editors) + allowed -- A list of group/user to allow for the permission + """ + + from yunohost.hook import hook_callback + from yunohost.user import user_group_list + from yunohost.utils.ldap import _get_ldap_interface + ldap = _get_ldap_interface() + + # Fetch currently allowed groups for this permission + + existing_permission = user_permission_list(full=True)["permissions"].get(permission, None) + if existing_permission is None: + raise YunohostError('permission_not_found', permission=permission) + + all_existing_groups = user_group_list()['groups'].keys() + + if allowed: + if not isinstance(allowed, list): + allowed = [allowed] + for group in allowed: + if group not in all_existing_groups: + raise YunohostError('group_unknown', group=group) + else: + if sync_perm: + permission_sync_to_user() + + return user_permission_list(full=True)["permissions"][permission] + + try: + ldap.update('cn=%s,ou=permission' % permission, + {'groupPermission': ['cn=' + g + ',ou=groups,dc=yunohost,dc=org' for g in allowed]}) + except Exception as e: + raise YunohostError('permission_update_failed', permission=permission, error=e) + + # Trigger permission sync if asked + + if sync_perm: + permission_sync_to_user() + + new_permission = user_permission_list(full=True)["permissions"][permission] + + # Trigger app callbacks + + app = permission.split(".")[0] + sub_permission = permission.split(".")[1] + + old_allowed_users = set(existing_permission["corresponding_users"]) + new_allowed_users = set(new_permission["corresponding_users"]) + + effectively_added_users = new_allowed_users - old_allowed_users + effectively_removed_users = old_allowed_users - new_allowed_users + + if effectively_added_users: + hook_callback('post_app_addaccess', args=[app, ','.join(effectively_added_users, sub_permission)]) + if effectively_removed_users: + hook_callback('post_app_removeaccess', args=[app, ','.join(effectively_removed_users, sub_permission)]) + + return new_permission + From c826a37aaace0459a2f3eff322008cbbe669e424 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Sun, 10 Nov 2019 21:34:57 +0900 Subject: [PATCH 04/29] Improve permission helpers --- data/helpers.d/setting | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/data/helpers.d/setting b/data/helpers.d/setting index 185e6111f..bf4e804ec 100644 --- a/data/helpers.d/setting +++ b/data/helpers.d/setting @@ -257,6 +257,7 @@ ynh_webpath_register () { # re:/api/[A-Z]*$ -> domain.tld/app/api/[A-Z]*$ # re:domain.tld/app/api/[A-Z]*$ -> domain.tld/app/api/[A-Z]*$ # +# Requires YunoHost version 3.7.0 or higher. ynh_permission_create() { declare -Ar args_array=( [p]=permission= [u]=url= [a]=allowed= ) local permission @@ -274,7 +275,18 @@ ynh_permission_create() { allowed=",allowed=['${allowed//';'/"','"}']" fi - yunohost tools shell -c "from yunohost.permission import permission_create; permission_create('$app.$permission', url=$url ${allowed:-} , sync_perm=False)" + # Check if permission already exists + if ynh_permission_exists --permission $permission; then + # If permission exits, update it + local add + if [[ -n ${add:-} ]]; then + add="--add ${allowed//';'/" "}" + fi + ynh_exec_warn_less ynh_permission_update --permission $permission ${add:-} + else + # If not, create it + yunohost tools shell -c "from yunohost.permission import permission_create; permission_create('$app.$permission', url=$url ${allowed:-} , sync_perm=False)" + fi } # Remove a permission for the app (note that when the app is removed all permission is automatically removed) @@ -284,6 +296,7 @@ ynh_permission_create() { # usage: ynh_permission_delete --permission "permission" # | arg: permission - the name for the permission (by default a permission named "main" is removed automatically when the app is removed) # +# Requires YunoHost version 3.7.0 or higher. ynh_permission_delete() { declare -Ar args_array=( [p]=permission= ) local permission @@ -292,12 +305,27 @@ ynh_permission_delete() { yunohost tools shell -c "from yunohost.permission import permission_delete; permission_delete('$app.$permission', sync_perm=False)" } +# Check if a permission exists +# +# usage: ynh_permission_exists --permission=permission +# | arg: -p, --permission - the permission to check +# +# Requires YunoHost version 3.7.0 or higher. +ynh_permission_exists() { + declare -Ar args_array=( [p]=permission= ) + local permission + ynh_handle_getopts_args "$@" + + yunohost user permission list -s | grep -w -q "$app.$permission" +} + # Redefine the url associated to a permission # # usage: ynh_permission_url --permission "permission" --url "url" # | arg: permission - the name for the permission (by default a permission named "main" is removed automatically when the app is removed) # | arg: url - (optional) URL for which access will be allowed/forbidden # +# Requires YunoHost version 3.7.0 or higher. ynh_permission_url() { declare -Ar args_array=([p]=permission= [u]=url=) local permission @@ -322,6 +350,7 @@ ynh_permission_url() { # | arg: remove - the list of group or users to remove from the permission # # example: ynh_permission_update --permission admin --add samdoe --remove all_users +# Requires YunoHost version 3.7.0 or higher. ynh_permission_update() { declare -Ar args_array=( [p]=permission= [a]=add= [r]=remove= ) local permission From cbc1c82df7fbe221fa3262c9f6aa50893662b657 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Sun, 10 Nov 2019 22:08:33 +0900 Subject: [PATCH 05/29] Fix parameters --- data/helpers.d/setting | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/data/helpers.d/setting b/data/helpers.d/setting index bf4e804ec..adc318bef 100644 --- a/data/helpers.d/setting +++ b/data/helpers.d/setting @@ -271,20 +271,18 @@ ynh_permission_create() { url="None" fi - if [[ -n ${allowed:-} ]]; then - allowed=",allowed=['${allowed//';'/"','"}']" - fi - # Check if permission already exists if ynh_permission_exists --permission $permission; then # If permission exits, update it - local add - if [[ -n ${add:-} ]]; then - add="--add ${allowed//';'/" "}" + if [[ -n ${allowed:-} ]]; then + allowed="--add ${allowed//';'/" "}" fi - ynh_exec_warn_less ynh_permission_update --permission $permission ${add:-} + ynh_exec_warn_less ynh_permission_update --permission $permission ${allowed:-} else # If not, create it + if [[ -n ${allowed:-} ]]; then + allowed=",allowed=['${allowed//';'/"','"}']" + fi yunohost tools shell -c "from yunohost.permission import permission_create; permission_create('$app.$permission', url=$url ${allowed:-} , sync_perm=False)" fi } From e8bf6eec80d15999ef4f3f1374b973e3785b1295 Mon Sep 17 00:00:00 2001 From: Kay0u Date: Mon, 11 Nov 2019 09:56:09 +0900 Subject: [PATCH 06/29] fail if permission already exists --- data/helpers.d/setting | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/data/helpers.d/setting b/data/helpers.d/setting index adc318bef..8046dfab4 100644 --- a/data/helpers.d/setting +++ b/data/helpers.d/setting @@ -271,20 +271,11 @@ ynh_permission_create() { url="None" fi - # Check if permission already exists - if ynh_permission_exists --permission $permission; then - # If permission exits, update it - if [[ -n ${allowed:-} ]]; then - allowed="--add ${allowed//';'/" "}" - fi - ynh_exec_warn_less ynh_permission_update --permission $permission ${allowed:-} - else - # If not, create it - if [[ -n ${allowed:-} ]]; then - allowed=",allowed=['${allowed//';'/"','"}']" - fi - yunohost tools shell -c "from yunohost.permission import permission_create; permission_create('$app.$permission', url=$url ${allowed:-} , sync_perm=False)" + if [[ -n ${allowed:-} ]]; then + allowed=",allowed=['${allowed//';'/"','"}']" fi + + yunohost tools shell -c "from yunohost.permission import permission_create; permission_create('$app.$permission', url=$url ${allowed:-} , sync_perm=False)" } # Remove a permission for the app (note that when the app is removed all permission is automatically removed) From 6ff99f7cba7da1fcbbd5091830d70d867f748c1c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 4 Nov 2019 19:23:30 +0100 Subject: [PATCH 07/29] Improve app_upgrade error management --- locales/en.json | 4 +- src/yunohost/app.py | 96 +++++++++++++++++++++++---------------------- 2 files changed, 52 insertions(+), 48 deletions(-) diff --git a/locales/en.json b/locales/en.json index 27f25e095..6c7d0b42d 100644 --- a/locales/en.json +++ b/locales/en.json @@ -31,7 +31,6 @@ "app_location_unavailable": "This URL is either unavailable, or conflicts with the already installed app(s):\n{apps:s}", "app_manifest_invalid": "Something is wrong with the app manifest: {error}", "app_not_upgraded": "The app '{failed_app}' failed to upgrade, and as a consequence the following apps upgrades have been cancelled: {apps}", - "app_upgrade_stopped": "Upgrading all apps was stopped to prevent possible damage because one app could not be upgraded", "app_not_correctly_installed": "{app:s} seems to be incorrectly installed", "app_not_installed": "Could not find the app '{app:s}' in the list of installed apps: {all_apps}", "app_not_properly_removed": "{app:s} has not been properly removed", @@ -50,7 +49,8 @@ "app_unsupported_remote_type": "Unsupported remote type used for the app", "app_upgrade_several_apps": "The following apps will be upgraded: {apps}", "app_upgrade_app_name": "Now upgrading {app}…", - "app_upgrade_failed": "Could not upgrade {app:s}", + "app_upgrade_failed": "Could not upgrade {app:s}: {error}", + "app_upgrade_script_failed": "An error occurred inside the app upgrade script", "app_upgrade_some_app_failed": "Some apps could not be upgraded", "app_upgraded": "{app:s} upgraded", "apps_already_up_to_date": "All apps are already up-to-date", diff --git a/src/yunohost/app.py b/src/yunohost/app.py index a4185b880..f92adf9e4 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -727,82 +727,86 @@ def app_upgrade(app=[], url=None, file=None): # Execute App upgrade script os.system('chown -hR admin: %s' % INSTALL_TMP) + # Execute the app upgrade script + upgrade_failed = True try: upgrade_retcode = hook_exec(extracted_app_folder + '/scripts/upgrade', args=args_list, env=env_dict)[0] + + upgrade_failed = True if upgrade_retcode != 0 else False + if upgrade_failed: + error = m18n.n('app_upgrade_script_failed') + logger.exception(m18n.n("app_upgrade_failed", app=app_instance_name, error=error)) + failure_message_with_debug_instructions = operation_logger.error(error) + # Script got manually interrupted ... N.B. : KeyboardInterrupt does not inherit from Exception except (KeyboardInterrupt, EOFError): upgrade_retcode = -1 + error = m18n.n('operation_interrupted') + logger.exception(m18n.n("app_upgrade_failed", app=app_instance_name, error=error)) + failure_message_with_debug_instructions = operation_logger.error(error) + # Something wrong happened in Yunohost's code (most probably hook_exec) except Exception: import traceback - logger.exception(m18n.n('unexpected_error', error=u"\n" + traceback.format_exc())) + error = m18n.n('unexpected_error', error=u"\n" + traceback.format_exc()) + logger.exception(m18n.n("app_install_failed", app=app_instance_name, error=error)) + failure_message_with_debug_instructions = operation_logger.error(error) finally: - - # Did the script succeed ? - if upgrade_retcode == -1: - error_msg = m18n.n('operation_interrupted') - operation_logger.error(error_msg) - elif upgrade_retcode != 0: - error_msg = m18n.n('app_upgrade_failed', app=app_instance_name) - operation_logger.error(error_msg) - - # Did it broke the system ? + # Whatever happened (install success or failure) we check if it broke the system + # and warn the user about it try: broke_the_system = False _assert_system_is_sane_for_app(manifest, "post") except Exception as e: broke_the_system = True - error_msg = operation_logger.error(str(e)) + logger.exception(m18n.n("app_upgrade_failed", app=app_instance_name, error=str(e))) + failure_message_with_debug_instructions = operation_logger.error(str(e)) # If upgrade failed or broke the system, # raise an error and interrupt all other pending upgrades - if upgrade_retcode != 0 or broke_the_system: + if upgrade_failed or broke_the_system: # display this if there are remaining apps if apps[number + 1:]: - logger.error(m18n.n('app_upgrade_stopped')) not_upgraded_apps = apps[number:] - # we don't want to continue upgrading apps here in case that breaks - # everything - raise YunohostError('app_not_upgraded', + logger.error(m18n.n('app_not_upgraded', failed_app=app_instance_name, - apps=', '.join(not_upgraded_apps)) - else: - raise YunohostError(error_msg, raw_msg=True) + apps=', '.join(not_upgraded_apps))) + + raise YunohostError(failure_message_with_debug_instructions, raw_msg=True) # Otherwise we're good and keep going ! - else: - now = int(time.time()) - # TODO: Move install_time away from app_setting - app_setting(app_instance_name, 'update_time', now) - status['upgraded_at'] = now + now = int(time.time()) + # TODO: Move install_time away from app_setting + app_setting(app_instance_name, 'update_time', now) + status['upgraded_at'] = now - # Clean hooks and add new ones - hook_remove(app_instance_name) - if 'hooks' in os.listdir(extracted_app_folder): - for hook in os.listdir(extracted_app_folder + '/hooks'): - hook_add(app_instance_name, extracted_app_folder + '/hooks/' + hook) + # Clean hooks and add new ones + hook_remove(app_instance_name) + if 'hooks' in os.listdir(extracted_app_folder): + for hook in os.listdir(extracted_app_folder + '/hooks'): + hook_add(app_instance_name, extracted_app_folder + '/hooks/' + hook) - # Store app status - with open(app_setting_path + '/status.json', 'w+') as f: - json.dump(status, f) + # Store app status + with open(app_setting_path + '/status.json', 'w+') as f: + json.dump(status, f) - # Replace scripts and manifest and conf (if exists) - os.system('rm -rf "%s/scripts" "%s/manifest.toml %s/manifest.json %s/conf"' % (app_setting_path, app_setting_path, app_setting_path, app_setting_path)) + # Replace scripts and manifest and conf (if exists) + os.system('rm -rf "%s/scripts" "%s/manifest.toml %s/manifest.json %s/conf"' % (app_setting_path, app_setting_path, app_setting_path, app_setting_path)) - if os.path.exists(os.path.join(extracted_app_folder, "manifest.json")): - os.system('mv "%s/manifest.json" "%s/scripts" %s' % (extracted_app_folder, extracted_app_folder, app_setting_path)) - if os.path.exists(os.path.join(extracted_app_folder, "manifest.toml")): - os.system('mv "%s/manifest.toml" "%s/scripts" %s' % (extracted_app_folder, extracted_app_folder, app_setting_path)) + if os.path.exists(os.path.join(extracted_app_folder, "manifest.json")): + os.system('mv "%s/manifest.json" "%s/scripts" %s' % (extracted_app_folder, extracted_app_folder, app_setting_path)) + if os.path.exists(os.path.join(extracted_app_folder, "manifest.toml")): + os.system('mv "%s/manifest.toml" "%s/scripts" %s' % (extracted_app_folder, extracted_app_folder, app_setting_path)) - for file_to_copy in ["actions.json", "actions.toml", "config_panel.json", "config_panel.toml", "conf"]: - if os.path.exists(os.path.join(extracted_app_folder, file_to_copy)): - os.system('cp -R %s/%s %s' % (extracted_app_folder, file_to_copy, app_setting_path)) + for file_to_copy in ["actions.json", "actions.toml", "config_panel.json", "config_panel.toml", "conf"]: + if os.path.exists(os.path.join(extracted_app_folder, file_to_copy)): + os.system('cp -R %s/%s %s' % (extracted_app_folder, file_to_copy, app_setting_path)) - # So much win - logger.success(m18n.n('app_upgraded', app=app_instance_name)) + # So much win + logger.success(m18n.n('app_upgraded', app=app_instance_name)) - hook_callback('post_app_upgrade', args=args_list, env=env_dict) - operation_logger.success() + hook_callback('post_app_upgrade', args=args_list, env=env_dict) + operation_logger.success() permission_sync_to_user() From 71878f6bbecbb6868916ad11e10d4a603bf9a31d Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Mon, 4 Nov 2019 20:20:12 +0100 Subject: [PATCH 08/29] Move debug log dump from ynh_exit_properly to the core after failed app operation --- data/helpers.d/utils | 37 ------------------------------------- src/yunohost/app.py | 31 +++++++++++++++++++++++++++++++ src/yunohost/backup.py | 7 +++++-- 3 files changed, 36 insertions(+), 39 deletions(-) diff --git a/data/helpers.d/utils b/data/helpers.d/utils index e1feed6b1..a359423bb 100644 --- a/data/helpers.d/utils +++ b/data/helpers.d/utils @@ -28,43 +28,6 @@ ynh_exit_properly () { # Small tempo to avoid the next message being mixed up with other DEBUG messages sleep 0.5 - ynh_print_err --message="!!\n $app's script has encountered an error. Its execution was cancelled.\n!!" - - # If the script is executed from the CLI, dump the end of the log that precedes the crash. - if [ "$YNH_INTERFACE" == "cli" ] - then - # Unset xtrace to not spoil the log - set +x - - local ynh_log="/var/log/yunohost/yunohost-cli.log" - - # Wait for the log to be fill with the data until the crash. - local timeout=0 - while ! tail --lines=20 "$ynh_log" | grep --quiet "+ ynh_exit_properly" - do - ((timeout++)) - if [ $timeout -eq 500 ]; then - break - fi - done - - echo -e "\e[34m\e[1mPlease find here an extract of the log before the crash:\e[0m" >&2 - # Tail the last 30 lines of log of YunoHost - # But remove all lines after "ynh_exit_properly" - # Remove the timestamp at the beginning of the line - # Remove "yunohost.hook..." - # Add DEBUG and color it at the beginning of each log line. - echo -e "$(tail --lines=30 "$ynh_log" \ - | sed '1,/+ ynh_exit_properly/!d' \ - | sed 's/^[[:digit:]: ,-]*//g' \ - | sed 's/ *yunohost.hook.*\]/ -/g' \ - | sed 's/^WARNING /&/g' \ - | sed 's/^DEBUG /& /g' \ - | sed 's/^INFO /& /g' \ - | sed 's/^/\\e[34m\\e[1m[DEBUG]\\e[0m: /g')" >&2 - set -x - fi - if type -t ynh_clean_setup > /dev/null; then # Check if the function exist in the app script. ynh_clean_setup # Call the function to do specific cleaning for the app. fi diff --git a/src/yunohost/app.py b/src/yunohost/app.py index f92adf9e4..2d32fc0cc 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -738,6 +738,8 @@ def app_upgrade(app=[], url=None, file=None): error = m18n.n('app_upgrade_script_failed') logger.exception(m18n.n("app_upgrade_failed", app=app_instance_name, error=error)) failure_message_with_debug_instructions = operation_logger.error(error) + if msettings.get('interface') != 'api': + dump_app_log_extract_for_debugging(operation_logger) # Script got manually interrupted ... N.B. : KeyboardInterrupt does not inherit from Exception except (KeyboardInterrupt, EOFError): upgrade_retcode = -1 @@ -1002,6 +1004,8 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu error = m18n.n('app_install_script_failed') logger.exception(m18n.n("app_install_failed", app=app_id, error=error)) failure_message_with_debug_instructions = operation_logger.error(error) + if msettings.get('interface') != 'api': + dump_app_log_extract_for_debugging(operation_logger) # Script got manually interrupted ... N.B. : KeyboardInterrupt does not inherit from Exception except (KeyboardInterrupt, EOFError): error = m18n.n('operation_interrupted') @@ -1118,6 +1122,33 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu hook_callback('post_app_install', args=args_list, env=env_dict) +def dump_app_log_extract_for_debugging(operation_logger): + + with open(operation_logger.log_path, "r") as f: + lines = f.readlines() + + lines_to_display = [] + for line in lines: + + if not ": " in line.strip(): + continue + + # A line typically looks like + # 2019-10-19 16:10:27,611: DEBUG - + mysql -u piwigo --password=********** -B piwigo + # And we just want the part starting by "DEBUG - " + line = line.strip().split(": ", 1)[1] + lines_to_display.append(line) + + if line.endswith("+ ynh_exit_properly"): + break + elif len(lines_to_display) > 20: + lines_to_display.pop(0) + + logger.warning("Here's an extract of the logs before the crash. It might help debugging the error:") + for line in lines_to_display: + logger.info(line) + + def _migrate_legacy_permissions(app): from yunohost.permission import user_permission_list, user_permission_update diff --git a/src/yunohost/backup.py b/src/yunohost/backup.py index 213f2cec1..3344d2807 100644 --- a/src/yunohost/backup.py +++ b/src/yunohost/backup.py @@ -36,14 +36,14 @@ from datetime import datetime from glob import glob from collections import OrderedDict -from moulinette import msignals, m18n +from moulinette import msignals, m18n, msettings from yunohost.utils.error import YunohostError from moulinette.utils import filesystem from moulinette.utils.log import getActionLogger from moulinette.utils.filesystem import read_file, mkdir, write_to_yaml, read_yaml from yunohost.app import ( - app_info, _is_installed, _parse_app_instance_name, _patch_php5 + app_info, _is_installed, _parse_app_instance_name, _patch_php5, dump_app_log_extract_for_debugging ) from yunohost.hook import ( hook_list, hook_info, hook_callback, hook_exec, CUSTOM_HOOK_FOLDER @@ -1399,6 +1399,9 @@ class RestoreManager(): logger.exception(msg) operation_logger.error(msg) + if msettings.get('interface') != 'api': + dump_app_log_extract_for_debugging(operation_logger) + self.targets.set_result("apps", app_instance_name, "Error") remove_script = os.path.join(app_scripts_in_archive, 'remove') From fe56354f369203a1da569d044535ff7a8ebe2aae Mon Sep 17 00:00:00 2001 From: Dominik Roesli Date: Wed, 30 Oct 2019 08:27:33 +0000 Subject: [PATCH 09/29] Translated using Weblate (German) Currently translated at 34.3% (193 of 562 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/de/ --- locales/de.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/locales/de.json b/locales/de.json index 6699f508c..3c0d00ce5 100644 --- a/locales/de.json +++ b/locales/de.json @@ -293,7 +293,7 @@ "backup_abstract_method": "Diese Backup-Methode wird noch nicht unterstützt", "backup_applying_method_tar": "Erstellen des Backup-tar Archives…", "backup_applying_method_copy": "Kopiere alle Dateien ins Backup…", - "app_change_url_no_script": "Die Anwendung '{app_name:s}' unterstützt bisher keine URL-Modufikation. Vielleicht gibt es eine Aktualisierung.", + "app_change_url_no_script": "Die Anwendung '{app_name:s}' unterstützt bisher keine URL-Modifikation. Vielleicht sollte sie aktualisiert werden.", "app_location_unavailable": "Diese URL ist nicht verfügbar oder wird von einer installierten Anwendung genutzt:\n{apps:s}", "backup_applying_method_custom": "Rufe die benutzerdefinierte Backup-Methode '{method:s}' auf…", "backup_archive_system_part_not_available": "Der System-Teil '{part:s}' ist in diesem Backup nicht enthalten", @@ -350,7 +350,7 @@ "app_start_remove": "Anwendung {app} wird entfernt…", "app_start_install": "Anwendung {app} wird installiert…", "app_not_upgraded": "Die App '{failed_app}' konnte nicht aktualisiert werden. Infolgedessen wurden die folgenden App-Upgrades abgebrochen: {apps}", - "app_make_default_location_already_used": "Die App \"{app}\" kann nicht als Standard für die Domain \"{domain}\" festgelegt werden. Sie wird bereits von der anderen App \"{other_app}\" verwendet", + "app_make_default_location_already_used": "Die App \"{app}\" kann nicht als Standard für die Domain \"{domain}\" festgelegt werden. Sie wird bereits von der App \"{other_app}\" verwendet", "aborting": "Breche ab.", "app_action_cannot_be_ran_because_required_services_down": "Diese App erfordert einige Dienste, die derzeit nicht verfügbar sind. Bevor Sie fortfahren, sollten Sie versuchen, die folgenden Dienste neu zu starten (und möglicherweise untersuchen, warum sie nicht verfügbar sind): {services}", "already_up_to_date": "Nichts zu tun. Alles ist bereits auf dem neusten Stand.", @@ -414,5 +414,8 @@ "global_settings_key_doesnt_exists": "Der Schlüssel'{settings_key:s}' existiert nicht in den globalen Einstellungen, du kannst alle verfügbaren Schlüssel sehen, indem du 'yunohost settings list' ausführst", "log_app_makedefault": "Mache '{}' zur Standard-Anwendung", "hook_json_return_error": "Konnte die Rückkehr vom Einsprungpunkt {path:s} nicht lesen. Fehler: {msg:s}. Unformatierter Inhalt: {raw_content}", - "app_full_domain_unavailable": "Es tut uns leid, aber diese Anwendung erfordert die Installation einer vollständigen Domäne, aber einige andere Anwendungen sind bereits auf der Domäne'{domain}' installiert. Eine mögliche Lösung ist das Hinzufügen und Verwenden einer Subdomain, die dieser Anwendung zugeordnet ist." + "app_full_domain_unavailable": "Es tut uns leid, aber diese Anwendung erfordert die Installation auf einer eigenen Domain, aber einige andere Anwendungen sind bereits auf der Domäne'{domain}' installiert. Eine mögliche Lösung ist das Hinzufügen und Verwenden einer Subdomain, die dieser Anwendung zugeordnet ist.", + "app_install_failed": "Installation von {app} fehlgeschlagen: {error}", + "app_install_script_failed": "Im Installationsscript ist ein Fehler aufgetreten", + "app_remove_after_failed_install": "Entfernen der App nach fehlgeschlagener Installation…" } From 434fef5d8cb0f578654068ed7df6aa41f79f6cf0 Mon Sep 17 00:00:00 2001 From: xaloc33 Date: Sun, 3 Nov 2019 22:26:53 +0000 Subject: [PATCH 10/29] Translated using Weblate (Catalan) Currently translated at 100.0% (562 of 562 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/ca/ --- locales/ca.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/ca.json b/locales/ca.json index 32bbfb50f..9a00b5c07 100644 --- a/locales/ca.json +++ b/locales/ca.json @@ -626,5 +626,6 @@ "permission_already_up_to_date": "No s'ha actualitzat el permís perquè la petició d'afegir/eliminar ja corresponent a l'estat actual.", "permission_currently_allowed_for_visitors": "El permís ja el tenen el grup de visitants a més d'altres grups. Segurament s'hauria de revocar el permís al grup dels visitants o eliminar els altres grups als que s'ha atribuït.", "permission_currently_allowed_for_all_users": "El permís ha el té el grup de tots els usuaris (all_users) a més d'altres grups. Segurament s'hauria de revocar el permís a «all_users» o eliminar els altres grups als que s'ha atribuït.", - "permission_require_account": "El permís {permission} només té sentit per als usuaris que tenen un compte, i per tant no es pot activar per als visitants." + "permission_require_account": "El permís {permission} només té sentit per als usuaris que tenen un compte, i per tant no es pot activar per als visitants.", + "app_remove_after_failed_install": "Eliminant l'aplicació després que hagi fallat la instal·lació…" } From 930181afd875e0c2e47286b356a1f74ba158e6bb Mon Sep 17 00:00:00 2001 From: Filip Bengtsson Date: Thu, 31 Oct 2019 04:34:15 +0000 Subject: [PATCH 11/29] Translated using Weblate (Swedish) Currently translated at 1.6% (9 of 562 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/sv/ --- locales/sv.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/locales/sv.json b/locales/sv.json index 4960d43aa..85572756d 100644 --- a/locales/sv.json +++ b/locales/sv.json @@ -1,3 +1,11 @@ { - "password_too_simple_1": "Lösenordet måste bestå av minst åtta tecken" + "password_too_simple_1": "Lösenordet måste bestå av minst åtta tecken", + "app_action_broke_system": "Åtgärden verkar ha fått följande viktiga tjänster att haverera: {services}", + "already_up_to_date": "Ingenting att göra. Allt är redan uppdaterat.", + "admin_password": "Administratörslösenord", + "admin_password_too_long": "Välj gärna ett lösenord som inte innehåller fler än 127 tecken", + "admin_password_change_failed": "Kan inte byta lösenord", + "action_invalid": "Ej tillåten åtgärd '{action:s}'", + "admin_password_changed": "Administratörskontots lösenord ändrades", + "aborting": "Avbryter." } From a7dc8ad10ff0f2091712e507db70606b898132b4 Mon Sep 17 00:00:00 2001 From: advocatux Date: Wed, 30 Oct 2019 15:30:49 +0000 Subject: [PATCH 12/29] Translated using Weblate (Spanish) Currently translated at 100.0% (562 of 562 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/es/ --- locales/es.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/es.json b/locales/es.json index d216b8a9a..e40a168a7 100644 --- a/locales/es.json +++ b/locales/es.json @@ -637,5 +637,6 @@ "permission_already_up_to_date": "El permiso no se ha actualizado porque las peticiones de incorporación o eliminación ya coinciden con el estado actual.", "permission_currently_allowed_for_visitors": "Este permiso se concede actualmente a los visitantes además de otros grupos. Probablemente quiere o eliminar el permiso de «visitors» o eliminar los otros grupos a los que está otorgado actualmente.", "permission_currently_allowed_for_all_users": "Este permiso se concede actualmente a todos los usuarios además de los otros grupos. Probablemente quiere o eliminar el permiso de «all_users» o eliminar los otros grupos a los que está otorgado actualmente.", - "permission_require_account": "El permiso {permission} solo tiene sentido para usuarios con una cuenta y, por lo tanto, no se puede activar para visitantes." + "permission_require_account": "El permiso {permission} solo tiene sentido para usuarios con una cuenta y, por lo tanto, no se puede activar para visitantes.", + "app_remove_after_failed_install": "Eliminando la aplicación tras el fallo de instalación…" } From 5aa5c1140f2614ba149a60492a6a951f60bd678f Mon Sep 17 00:00:00 2001 From: amirale qt Date: Tue, 5 Nov 2019 08:45:33 +0000 Subject: [PATCH 13/29] Translated using Weblate (Turkish) Currently translated at 0.2% (1 of 562 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/tr/ --- locales/tr.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/locales/tr.json b/locales/tr.json index 0967ef424..c6eb58ed1 100644 --- a/locales/tr.json +++ b/locales/tr.json @@ -1 +1,3 @@ -{} +{ + "password_too_simple_1": "Şifre en az 8 karakter uzunluğunda olmalı" +} From 473c7a9c2d9318006691b10fcb77fed32819caa6 Mon Sep 17 00:00:00 2001 From: amirale qt Date: Tue, 5 Nov 2019 07:32:56 +0000 Subject: [PATCH 14/29] Translated using Weblate (Basque) Currently translated at 0.2% (1 of 562 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/eu/ --- locales/eu.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/locales/eu.json b/locales/eu.json index 0967ef424..539fb9157 100644 --- a/locales/eu.json +++ b/locales/eu.json @@ -1 +1,3 @@ -{} +{ + "password_too_simple_1": "Pasahitzak gutxienez 8 karaktere izan behar ditu" +} From 230059602470c1b06bc14d6b99b052c093983c0f Mon Sep 17 00:00:00 2001 From: amirale qt Date: Tue, 5 Nov 2019 13:33:02 +0000 Subject: [PATCH 15/29] Translated using Weblate (French) Currently translated at 100.0% (562 of 562 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/fr/ --- locales/fr.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/fr.json b/locales/fr.json index 15f82baf1..645e285ad 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -664,5 +664,6 @@ "permission_currently_allowed_for_all_users": "Cette autorisation est actuellement accordée à tous les utilisateurs en plus des autres groupes. Vous voudrez probablement soit supprimer l'autorisation 'all_users', soit supprimer les autres groupes auxquels il est actuellement autorisé.", "app_install_failed": "Impossible d'installer {app}: {error}", "app_install_script_failed": "Une erreur est survenue dans le script d'installation de l'application", - "permission_require_account": "Permission {permission} n'a de sens que pour les utilisateurs ayant un compte et ne peut donc pas être activé pour les visiteurs." + "permission_require_account": "Permission {permission} n'a de sens que pour les utilisateurs ayant un compte et ne peut donc pas être activé pour les visiteurs.", + "app_remove_after_failed_install": "Supprimer l'application après l'échec de l'installation…" } From be598a0610303569251bf50a91b4d00740185a28 Mon Sep 17 00:00:00 2001 From: amirale qt Date: Tue, 5 Nov 2019 13:33:34 +0000 Subject: [PATCH 16/29] Translated using Weblate (Esperanto) Currently translated at 95.6% (537 of 562 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/eo/ --- locales/eo.json | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/locales/eo.json b/locales/eo.json index 720485ba6..a25fa505e 100644 --- a/locales/eo.json +++ b/locales/eo.json @@ -141,7 +141,7 @@ "field_invalid": "Nevalida kampo '{:s}'", "log_app_makedefault": "Faru '{}' la defaŭlta apliko", "migration_0003_still_on_jessie_after_main_upgrade": "Io okazis malbone dum la ĉefa ĝisdatigo: Ĉu la sistemo ankoraŭ estas en Jessie‽ Por esplori la aferon, bonvolu rigardi {log}:s …", - "migration_0011_can_not_backup_before_migration": "La sekurkopio de la sistemo antaŭ la migrado malsukcesis. Migrado malsukcesis. Eraro: {error:s}", + "migration_0011_can_not_backup_before_migration": "La sekurkopio de la sistemo ne povis finiĝi antaŭ ol la migrado malsukcesis. Eraro: {error:s}", "migration_0011_create_group": "Krei grupon por ĉiu uzanto…", "backup_system_part_failed": "Ne eblis sekurkopi la sistemon de '{part:s}'", "global_settings_setting_security_postfix_compatibility": "Kongruo vs sekureca kompromiso por la Postfix-servilo. Afektas la ĉifradojn (kaj aliajn aspektojn pri sekureco)", @@ -151,8 +151,8 @@ "migration_0011_backup_before_migration": "Krei sekurkopion de LDAP-datumbazo kaj agordojn antaŭ la efektiva migrado.", "migration_0011_LDAP_config_dirty": "Similas ke vi agordis vian LDAP-agordon. Por ĉi tiu migrado la LDAP-agordo bezonas esti ĝisdatigita.\nVi devas konservi vian aktualan agordon, reintaligi la originalan agordon per funkciado de \"yunohost iloj regen-conf -f\" kaj reprovi la migradon", "migration_0011_migrate_permission": "Migrado de permesoj de agordoj al aplikoj al LDAP…", - "migration_0011_migration_failed_trying_to_rollback": "Migrado malsukcesis ... provante reverti la sistemon.", - "migrations_dependencies_not_satisfied": "Ne eblas kuri migradon {id} ĉar unue vi devas ruli ĉi tiujn migradojn: {dependencies_id}", + "migration_0011_migration_failed_trying_to_rollback": "Ne povis migri ... provante redakti la sistemon.", + "migrations_dependencies_not_satisfied": "Rulu ĉi tiujn migradojn: '{dependencies_id}', antaŭ migrado {id}.", "migrations_failed_to_load_migration": "Ne povis ŝarĝi migradon {id}: {error}", "migrations_exclusive_options": "'--auto', '--skip' kaj '--force-rerun' estas reciproke ekskluzivaj ebloj.", "migrations_must_provide_explicit_targets": "Vi devas provizi eksplicitajn celojn kiam vi uzas '--skip' aŭ '--force-rerun'", @@ -162,7 +162,7 @@ "tools_upgrade_cant_hold_critical_packages": "Ne povis teni kritikajn pakojn…", "upnp_dev_not_found": "Neniu UPnP-aparato trovita", "migration_description_0012_postgresql_password_to_md5_authentication": "Devigu PostgreSQL-aŭtentigon uzi MD5 por lokaj ligoj", - "migration_0011_done": "Migrado sukcesis. Vi nun kapablas administri uzantajn grupojn.", + "migration_0011_done": "Migrado finiĝis. Vi nun kapablas administri uzantajn grupojn.", "migration_0011_LDAP_update_failed": "Ne povis ĝisdatigi LDAP. Eraro: {error:s}", "pattern_password": "Devas esti almenaŭ 3 signoj longaj", "root_password_desynchronized": "La pasvorta administranto estis ŝanĝita, sed YunoHost ne povis propagandi ĉi tion al la radika pasvorto!", @@ -194,9 +194,9 @@ "migration_0011_rollback_success": "Sistemo ruliĝis reen.", "migration_0011_update_LDAP_database": "Ĝisdatigante LDAP-datumbazon…", "migration_0011_update_LDAP_schema": "Ĝisdatigante LDAP-skemon…", - "migration_0011_failed_to_remove_stale_object": "Malsukcesis forigi neokazan objekton {dn}: {error}", + "migration_0011_failed_to_remove_stale_object": "Ne povis forigi neuzatan objekton {dn}: {error}", "migrations_already_ran": "Tiuj migradoj estas jam faritaj: {ids}", - "migrations_no_such_migration": "Estas neniu migrado nomata {id}", + "migrations_no_such_migration": "Estas neniu migrado nomata '{id}'", "permission_already_allowed": "Grupo '{group}' jam havas permeson '{permission}' ebligita'", "permission_already_disallowed": "Grupo '{group}' jam havas permeson '{permission}' malebligita'", "permission_cannot_remove_main": "Forigo de ĉefa permeso ne rajtas", @@ -266,7 +266,7 @@ "migration_description_0008_ssh_conf_managed_by_yunohost_step2": "Lasu la SSH-agordon estu administrata de YunoHost (paŝo 2, manlibro)", "restore_confirm_yunohost_installed": "Ĉu vi vere volas restarigi jam instalitan sistemon? [{answers:s}]", "pattern_positive_number": "Devas esti pozitiva nombro", - "monitor_stats_file_not_found": "Statistika dosiero ne trovita", + "monitor_stats_file_not_found": "Ne povis trovi la statistikan dosieron", "certmanager_error_no_A_record": "Neniu DNS 'A' rekordo trovita por '{domain:s}'. Vi bezonas atentigi vian domajnan nomon al via maŝino por povi instali atestilon Lasu-Ĉifri. (Se vi scias, kion vi faras, uzu '--no-checks' por malŝalti tiujn ĉekojn.)", "update_apt_cache_failed": "Ne eblis ĝisdatigi la kaŝmemoron de APT (paka administranto de Debian). Jen rubujo de la sources.list-linioj, kiuj povus helpi identigi problemajn liniojn:\n{sourcelist}", "migrations_no_migrations_to_run": "Neniuj migradoj por funkcii", @@ -339,7 +339,7 @@ "log_app_upgrade": "Ĝisdatigu la aplikon '{}'", "log_help_to_get_failed_log": "La operacio '{desc}' ne povis finiĝi. Bonvolu dividi la plenan ŝtipon de ĉi tiu operacio per la komando 'yunohost log display {name} --share' por akiri helpon", "migration_description_0002_migrate_to_tsig_sha256": "Plibonigu sekurecon de DynDNS TSIG-ĝisdatigoj per SHA-512 anstataŭ MD5", - "monitor_disabled": "Servila monitorado nun malŝaltis", + "monitor_disabled": "Servilo-monitorado nun malŝaltita", "pattern_port": "Devas esti valida havena numero (t.e. 0-65535)", "port_already_closed": "Haveno {port:d} estas jam fermita por {ip_version:s} rilatoj", "hook_name_unknown": "Nekonata hoko-nomo '{name:s}'", @@ -407,7 +407,7 @@ "migration_0003_not_jessie": "La nuna Debian-distribuo ne estas Jessie!", "user_unknown": "Nekonata uzanto: {user:s}", "migrations_to_be_ran_manually": "Migrado {id} devas funkcii permane. Bonvolu iri al Iloj → Migradoj en la retpaĝa paĝo, aŭ kuri `yunohost tools migrations migrate`.", - "migration_0008_warning": "Se vi komprenas tiujn avertojn kaj konsentas lasi YunoHost pretervidi vian nunan agordon, faru la migradon. Alie, vi ankaŭ povas salti la migradon - kvankam ĝi ne rekomendas.", + "migration_0008_warning": "Se vi komprenas tiujn avertojn kaj volas ke YunoHost preterlasu vian nunan agordon, faru la migradon. Alie, vi ankaŭ povas salti la migradon, kvankam ĝi ne rekomendas.", "certmanager_cert_renew_success": "Ni Ĉifru atestilon renovigitan por la domajno '{domain:s}'", "global_settings_reset_success": "Antaŭaj agordoj nun estas rezervitaj al {path:s}", "pattern_domain": "Devas esti valida domajna nomo (t.e. mia-domino.org)", @@ -477,14 +477,14 @@ "log_tools_maindomain": "Faru de '{}' la ĉefa domajno", "maindomain_change_failed": "Ne povis ŝanĝi la ĉefan domajnon", "mail_domain_unknown": "Nevalida retadreso por domajno '{domain:s}'. Bonvolu uzi domajnon administritan de ĉi tiu servilo.", - "migrations_cant_reach_migration_file": "Ne povis aliri migrajn dosierojn ĉe la vojo% s", + "migrations_cant_reach_migration_file": "Ne povis aliri migrajn dosierojn ĉe la vojo '% s'", "pattern_email": "Devas esti valida retpoŝtadreso (t.e.iu@domain.org)", "mail_alias_remove_failed": "Ne povis forigi retpoŝton alias '{mail:s}'", "regenconf_file_manually_removed": "La dosiero de agordo '{conf}' estis forigita permane, kaj ne estos kreita", - "monitor_enabled": "Servila monitorado nun ŝaltis", + "monitor_enabled": "Servilo-monitorado nun", "domain_exists": "La domajno jam ekzistas", "migration_description_0001_change_cert_group_to_sslcert": "Ŝanĝu grupajn permesojn de 'metronomo' al 'ssl-cert'", - "mysql_db_creation_failed": "MySQL-datumbazkreado malsukcesis", + "mysql_db_creation_failed": "Ne povis krei MySQL-datumbazon", "ldap_initialized": "LDAP inicializis", "migrate_tsig_not_needed": "Vi ne ŝajnas uzi DynDNS-domajnon, do neniu migrado necesas.", "certmanager_domain_cert_not_selfsigned": "La atestilo por domajno {domajno:s} ne estas mem-subskribita. Ĉu vi certas, ke vi volas anstataŭigi ĝin? (Uzu '--force' por fari tion.)", @@ -495,7 +495,7 @@ "global_settings_bad_choice_for_enum": "Malbona elekto por agordo {setting:s}, ricevita '{choice:s}', sed disponeblaj elektoj estas: {available_choices:s}", "server_shutdown": "La servilo haltos", "log_tools_migrations_migrate_forward": "Migri antaŭen", - "migration_0008_no_warning": "Neniu grava risko identigita pri superregado de via SSH-agordo, tamen oni ne povas esti absolute certa;)! Ekfunkciu la migradon por superregi ĝin. Alie, vi ankaŭ povas salti la migradon - kvankam ĝi ne rekomendas.", + "migration_0008_no_warning": "Supersalti vian SSH-agordon estu sekura, kvankam ĉi tio ne povas esti promesita! Ekfunkciu la migradon por superregi ĝin. Alie, vi ankaŭ povas salti la migradon, kvankam ĝi ne rekomendas.", "regenconf_now_managed_by_yunohost": "La agorda dosiero '{conf}' nun estas administrata de YunoHost (kategorio {category}).", "server_reboot_confirm": "Ĉu la servilo rekomencos tuj, ĉu vi certas? [{answers:s}]", "log_app_install": "Instalu la aplikon '{}'", @@ -563,5 +563,6 @@ "permission_currently_allowed_for_visitors": "Ĉi tiu permeso estas nuntempe donita al vizitantoj aldone al aliaj grupoj. Vi probable volas aŭ forigi la permeson de \"vizitantoj\" aŭ forigi la aliajn grupojn al kiuj ĝi nun estas koncedita.", "permission_currently_allowed_for_all_users": "Ĉi tiu permeso estas nuntempe donita al ĉiuj uzantoj aldone al aliaj grupoj. Vi probable volas aŭ forigi la permeson \"all_users\" aŭ forigi la aliajn grupojn, kiujn ĝi nuntempe donas.", "app_install_failed": "Ne povis instali {app} : {error}", - "app_install_script_failed": "Eraro okazis en la skripto de instalado de la app" + "app_install_script_failed": "Eraro okazis en la skripto de instalado de la app", + "app_remove_after_failed_install": "Forigado de la app post la instala fiasko …" } From 242ccc3c3d6774a7f9c05c255268d170d2cf7df4 Mon Sep 17 00:00:00 2001 From: advocatux Date: Thu, 7 Nov 2019 09:12:30 +0000 Subject: [PATCH 17/29] Translated using Weblate (Spanish) Currently translated at 89.0% (540 of 607 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/es/ --- locales/es.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/locales/es.json b/locales/es.json index e40a168a7..d526f442f 100644 --- a/locales/es.json +++ b/locales/es.json @@ -638,5 +638,10 @@ "permission_currently_allowed_for_visitors": "Este permiso se concede actualmente a los visitantes además de otros grupos. Probablemente quiere o eliminar el permiso de «visitors» o eliminar los otros grupos a los que está otorgado actualmente.", "permission_currently_allowed_for_all_users": "Este permiso se concede actualmente a todos los usuarios además de los otros grupos. Probablemente quiere o eliminar el permiso de «all_users» o eliminar los otros grupos a los que está otorgado actualmente.", "permission_require_account": "El permiso {permission} solo tiene sentido para usuarios con una cuenta y, por lo tanto, no se puede activar para visitantes.", - "app_remove_after_failed_install": "Eliminando la aplicación tras el fallo de instalación…" + "app_remove_after_failed_install": "Eliminando la aplicación tras el fallo de instalación…", + "diagnosis_basesystem_host": "El servidor está ejecutando Debian {debian_version}.", + "diagnosis_basesystem_kernel": "El servidor está ejecutando el núcleo de Linux {kernel_version}", + "diagnosis_basesystem_ynh_single_version": "{0} versión: {1} ({2})", + "diagnosis_basesystem_ynh_main_version": "El servidor está ejecutando YunoHost {main_version} ({repo})", + "diagnosis_basesystem_ynh_inconsistent_versions": "Está ejecutando versiones incoherentes de los paquetes de YunoHost... probablemente por una actualización errónea o parcial." } From 31957a6296b9110e159aa9306dd7618bef7f262e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quent=C3=AD?= Date: Sun, 10 Nov 2019 16:49:52 +0000 Subject: [PATCH 18/29] Translated using Weblate (Occitan) Currently translated at 39.9% (242 of 607 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/oc/ --- locales/oc.json | 84 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 78 insertions(+), 6 deletions(-) diff --git a/locales/oc.json b/locales/oc.json index 320a18341..f848bae1b 100644 --- a/locales/oc.json +++ b/locales/oc.json @@ -5,7 +5,7 @@ "app_already_installed": "{app:s} es ja installat", "app_already_up_to_date": "{app:s} es ja a jorn", "installation_complete": "Installacion acabada", - "app_id_invalid": "Id d’aplicacion incorrècte", + "app_id_invalid": "ID d’aplicacion incorrècte", "app_install_files_invalid": "Fichièrs d’installacion incorrèctes", "app_no_upgrade": "Pas cap d’aplicacion d’actualizar", "app_not_correctly_installed": "{app:s} sembla pas ben installat", @@ -41,15 +41,15 @@ "backup_archive_name_unknown": "L’archiu local de salvagarda apelat « {name:s} » es desconegut", "action_invalid": "Accion « {action:s} » incorrècta", "app_argument_choice_invalid": "Causida invalida pel paramètre « {name:s} », cal que siá un de {choices:s}", - "app_argument_invalid": "Valor invalida pel paramètre « {name:s} » : {error:s}", + "app_argument_invalid": "Causissètz una valor invalida pel paramètre « {name:s} » : {error:s}", "app_argument_required": "Lo paramètre « {name:s} » es requesit", - "app_change_url_failed_nginx_reload": "La reaviada de nginx a fracassat. Vaquí la sortida de « nginx -t » :\n{nginx_errors:s}", + "app_change_url_failed_nginx_reload": "Reaviada de NGINX impossibla. Vaquí la sortida de « nginx -t » :\n{nginx_errors:s}", "app_change_url_identical_domains": "L’ancian e lo novèl coble domeni/camin son identics per {domain:s}{path:s}, pas res a far.", - "app_change_url_success": "L’URL de l’aplicacion {app:s} a cambiat per {domain:s}{path:s}", + "app_change_url_success": "L’URL de l’aplicacion {app:s} es ara {domain:s}{path:s}", "app_checkurl_is_deprecated": "Packagers /!\\ ’app checkurl’ es obsolèt ! Utilizatz ’app register-url’ a la plaça !", "app_extraction_failed": "Extraccion dels fichièrs d’installacion impossibla", "app_incompatible": "L’aplicacion {app} es pas compatibla amb vòstra version de YunoHost", - "app_location_already_used": "L’aplicacion « {app} » es ja installada a aqueste emplaçament ({path})", + "app_location_already_used": "L’aplicacion « {app} » es ja installada dins ({path})", "app_manifest_invalid": "Manifest d’aplicacion incorrècte : {error}", "app_package_need_update": "Lo paquet de l’aplicacion {app} deu èsser actualizat per poder seguir los cambiaments de YunoHost", "app_requirements_checking": "Verificacion dels paquets requesits per {app}…", @@ -612,5 +612,77 @@ "migrations_must_provide_explicit_targets": "Devètz fornir una cibla explicita quand utilizatz using --skip o --force-rerun", "migrations_exclusive_options": "--auto, --skip, e --force-rerun son las opcions exclusivas.", "migrations_failed_to_load_migration": "Cargament impossible de la migracion {id} : {error}", - "migrations_already_ran": "Aquelas migracions s’executèron ja : {ids}" + "migrations_already_ran": "Aquelas migracions s’executèron ja : {ids}", + "diagnosis_basesystem_ynh_main_version": "Lo servidor fonciona amb YunoHost {main_version} ({repo})", + "migrations_dependencies_not_satisfied": "Executatz aquestas migracions : « {dependencies_id} », abans la migracion {id}.", + "migrations_no_such_migration": "I a pas cap de migracion apelada « {id} »", + "migrations_not_pending_cant_skip": "Aquestas migracions son pas en espèra, las podètz pas doncas ignorar : {ids}", + "app_action_broke_system": "Aquesta accion sembla aver copat de servicis importants : {services}", + "diagnosis_display_tip_web": "Podètz anar a la seccion Diagnostic (dins l’ecran d’acuèlh) per veire los problèmas trobats.", + "diagnosis_ip_no_ipv6": "Lo servidor a pas d’adreça IPv5 activa.", + "diagnosis_ip_not_connected_at_all": "Lo servidor sembla pas connectat a Internet ?!", + "diagnosis_security_all_good": "Cap de vulnerabilitat de seguretat critica pas trobada.", + "diagnosis_description_regenconf": "Configuracion sistèma", + "diagnosis_http_ok": "Lo domeni {domain} accessible de l’exterior.", + "app_full_domain_unavailable": "Aquesta aplicacion a d’èsser installada sul seu pròpri domeni, mas i a d’autras aplicacions installadas sus aqueste domeni « {domain} ». Podètz utilizar allòc un josdomeni dedicat a aquesta aplicacion.", + "app_upgrade_stopped": "L’actualizacion de totas las aplicacions s‘es arrestada per evitar de possibles damatges pr’amor qu’èra pas possible d’actualizar una aplicacion", + "diagnosis_dns_bad_conf": "Configuracion DNS incorrècta o inexistenta pel domeni {domain} (categoria {category})", + "diagnosis_ram_verylow": "Lo sistèma a solament {available_abs_MB} Mo ({available_percent}%) de memòria RAM disponibla ! (d’un total de {total_abs_MB} MB)", + "diagnosis_ram_ok": "Lo sistèma a encara {available_abs_MB} Mo ({available_percent}%) de memòria RAM disponibla d’un total de {total_abs_MB} MB).", + "permission_already_allowed": "Lo grop « {group} » a ja la permission « {permission} » activada", + "permission_already_disallowed": "Lo grop « {group} » a ja la permission « {permission} » desactivada", + "permission_cannot_remove_main": "La supression d’una permission màger es pas autorizada", + "log_permission_url": "Actualizacion de l’URL ligada a la permission « {} »", + "app_install_failed": "Installacion impossibla de {app} : {error}", + "app_install_script_failed": "Una error s’es producha en installar lo script de l’aplicacion", + "migration_0011_failed_to_remove_stale_object": "Supression impossibla d’un objècte obsolèt {dn} : {error}", + "apps_already_up_to_date": "Totas las aplicacions son ja al jorn", + "app_remove_after_failed_install": "Supression de l’aplicacion aprèp fracàs de l’installacion…", + "group_already_exist": "Lo grop {group} existís ja", + "group_already_exist_on_system": "Lo grop {group} existís ja dins lo sistèma de grops", + "group_user_not_in_group": "L’utilizaire {user} es pas dins lo grop {group}", + "log_user_permission_reset": "Restablir la permission « {} »", + "user_already_exists": "L’utilizaire {user} existís ja", + "diagnosis_basesystem_host": "Lo servidor fonciona amb Debian {debian_version}.", + "diagnosis_basesystem_kernel": "Lo servidor fonciona amb lo nuclèu Linuxl {kernel_version}", + "diagnosis_basesystem_ynh_single_version": "{0} version : {1} ({2})", + "diagnosis_basesystem_ynh_inconsistent_versions": "Utilizatz de versions inconsistentas dels paquets de YunoHost… probablament a causa d'una actualizacion fracassada o parciala.", + "diagnosis_display_tip_cli": "Podètz executar « yunohost diagnosis show --issues » per mostrar las errors trobadas.", + "diagnosis_ignored_issues": "(+ {nb_ignored} problèma(es) ignorat(s))", + "diagnosis_everything_ok": "Tot sembla corrècte per {category} !", + "diagnosis_ip_connected_ipv4": "Lo servidor es connectat a Internet via IPv4 !", + "diagnosis_ip_no_ipv4": "Lo servidor a pas d’adreça IPv4 activa.", + "diagnosis_ip_connected_ipv6": "Lo servidor es connectat a Internet via IPv6 !", + "diagnosis_ip_dnsresolution_working": "La resolucion del nom de domeni fonciona !", + "diagnosis_dns_good_conf": "Bona configuracion DNS pel domeni {domain} (categoria {category})", + "diagnosis_failed_for_category": "Lo diagnostic a reüssit per la categoria « {category} » : {error}", + "diagnosis_cache_still_valid": "(Memòria cache totjorn valida pel diagnostic {category}. Cap d’autre diagnostic pel moment !)", + "diagnosis_found_errors": "{errors} errors importantas trobadas ligadas a {category} !", + "diagnosis_services_good_status": "Lo servici {service} es {status} coma previst !", + "diagnosis_services_bad_status": "Lo servici {service} es {status} :/", + "diagnosis_swap_ok": "Lo sistèma a {total_MB} MB d’escambi !", + "diagnosis_regenconf_allgood": "Totes los fichièrs de configuracion son confòrmes a la configuracion recomandada !", + "diagnosis_regenconf_manually_modified": "Lo fichièr de configuracion {file} foguèt modificat manualament.", + "diagnosis_regenconf_manually_modified_details": "Es probablament bon tan que sabètz çò que fasètz ;) !", + "diagnosis_regenconf_nginx_conf_broken": "La configuracion de nginx sembla èsser copada !", + "diagnosis_security_vulnerable_to_meltdown": "Semblatz èsser vulnerable a la vulnerabilitat de seguretat critica de Meltdown", + "diagnosis_description_basesystem": "Sistèma de basa", + "diagnosis_description_ip": "Connectivitat Internet", + "diagnosis_description_dnsrecords": "Enregistraments DNS", + "diagnosis_description_services": "Verificacion d’estat de servicis", + "diagnosis_description_systemresources": "Resorgas sistèma", + "diagnosis_description_ports": "Exposicion dels pòrts", + "diagnosis_description_http": "Exposicion HTTP", + "diagnosis_description_security": "Verificacion de seguretat", + "diagnosis_ports_unreachable": "Lo pòrt {port} es pas accessible de l’exterior.", + "diagnosis_ports_ok": "Lo pòrt {port} es accessible de l’exterior.", + "diagnosis_http_unreachable": "Lo domeni {domain} es pas accessible via HTTP de l’exterior.", + "diagnosis_unknown_categories": "La categorias seguentas son desconegudas : {categories}", + "diagnosis_ram_low": "Lo sistèma a {available_abs_MB} Mo ({available_percent}%) de memòria RAM disponibla d’un total de {total_abs_MB} MB). Atencion.", + "diagnosis_regenconf_manually_modified_debian": "Lo fichier de configuracion {file} foguèt modificat manualament respècte al fichièr per defaut de Debian.", + "log_permission_create": "Crear la permission « {} »", + "log_permission_delete": "Suprimir la permission « {} »", + "log_user_group_create": "Crear lo grop « {} »", + "log_user_permission_update": "Actualizacion dels accèsses per la permission « {} »", + "operation_interrupted": "L’operacion es estada interrompuda manualament ?" } From eaf9bfafcc631628172a4b0a3180dcc9aae510fc Mon Sep 17 00:00:00 2001 From: xaloc33 Date: Thu, 7 Nov 2019 10:42:27 +0000 Subject: [PATCH 19/29] Translated using Weblate (Catalan) Currently translated at 100.0% (607 of 607 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/ca/ --- locales/ca.json | 71 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/locales/ca.json b/locales/ca.json index 9a00b5c07..3a40712ca 100644 --- a/locales/ca.json +++ b/locales/ca.json @@ -162,7 +162,7 @@ "admin_password_too_long": "Trieu una contrasenya de menys de 127 caràcters", "dpkg_is_broken": "No es pot fer això en aquest instant perquè dpkg/APT (els gestors de paquets del sistema) sembla estar mal configurat… Podeu intentar solucionar-ho connectant-vos per SSH i executant «sudo dpkg --configure -a».", "dnsmasq_isnt_installed": "sembla que dnsmasq no està instal·lat, executeu \"apt-get remove bind9 && apt-get install dnsmasq\"", - "domain_cannot_remove_main": "No es pot eliminar el domini principal. S'ha d'establir un nou domini primer", + "domain_cannot_remove_main": "No es pot eliminar «{domain:s}» ja que és el domini principal, primer s'ha d'establir un nou domini principal utilitzant «yunohost domain main-domain -n », aquí hi ha una llista dels possibles dominis: {other_domains:s}", "domain_cert_gen_failed": "No s'ha pogut generar el certificat", "domain_created": "S'ha creat el domini", "domain_creation_failed": "No s'ha pogut crear el domini {domain}: {error}", @@ -627,5 +627,72 @@ "permission_currently_allowed_for_visitors": "El permís ja el tenen el grup de visitants a més d'altres grups. Segurament s'hauria de revocar el permís al grup dels visitants o eliminar els altres grups als que s'ha atribuït.", "permission_currently_allowed_for_all_users": "El permís ha el té el grup de tots els usuaris (all_users) a més d'altres grups. Segurament s'hauria de revocar el permís a «all_users» o eliminar els altres grups als que s'ha atribuït.", "permission_require_account": "El permís {permission} només té sentit per als usuaris que tenen un compte, i per tant no es pot activar per als visitants.", - "app_remove_after_failed_install": "Eliminant l'aplicació després que hagi fallat la instal·lació…" + "app_remove_after_failed_install": "Eliminant l'aplicació després que hagi fallat la instal·lació…", + "diagnosis_basesystem_ynh_main_version": "El servidor funciona amb YunoHost {main_version} ({repo})", + "diagnosis_ram_low": "El sistema només té {available_abs_MB} MB ({available_percent}%) de memòria RAM disponibles d'un total de {total_abs_MB} MB. Aneu amb compte.", + "diagnosis_swap_none": "El sistema no té swap. Hauríeu de considerar afegir un mínim de 256 MB de swap per evitar situacions en les que el sistema es queda sense memòria.", + "diagnosis_regenconf_manually_modified": "El fitxer de configuració {file} ha estat modificat manualment.", + "diagnosis_regenconf_nginx_conf_broken": "Sembla que s'ha trencat la configuració NGINX!", + "diagnosis_security_vulnerable_to_meltdown_details": "Per arreglar-ho, hauríeu d'actualitzar i reiniciar el sistema per tal de carregar el nou nucli de linux (o contactar amb el proveïdor del servidor si no funciona). Vegeu https://meltdownattack.com/ per a més informació.", + "diagnosis_http_could_not_diagnose": "No s'ha pogut diagnosticar si el domini és accessible des de l'exterior. Error: {error}", + "domain_cannot_remove_main_add_new_one": "No es pot eliminar «{domain:s}» ja que és el domini principal i únic domini, primer s'ha d'afegir un altre domini utilitzant «yunohost domain add », i després fer-lo el domini principal amb «yunohost domain main-domain -n » i després es pot eliminar el domini «{domain:s}» utilitzant «yunohost domain remove {domain:s}».", + "diagnosis_basesystem_host": "El servidor funciona amb Debian {debian_version}.", + "diagnosis_basesystem_kernel": "El servidor funciona amb el nucli de Linux {kernel_version}", + "diagnosis_basesystem_ynh_single_version": "{0} versió: {1}({2})", + "diagnosis_basesystem_ynh_inconsistent_versions": "Esteu utilitzant versions inconsistents dels paquets de YunoHost… probablement a causa d'una actualització fallida o parcial.", + "diagnosis_display_tip_web": "Podeu anar a la secció de Diagnòstics (en la pantalla principal) per veure els errors que s'han trobat.", + "diagnosis_failed_for_category": "Ha fallat el diagnòstic per la categoria «{category}» : {error}", + "diagnosis_display_tip_cli": "Podeu executar «yunohost diagnosis show --issues» per mostrar els errors que s'han trobat.", + "diagnosis_cache_still_valid": "(La memòria cau encara és vàlida pel diagnòstic de {category}. No es tornar a diagnosticar de moment!)", + "diagnosis_cant_run_because_of_dep": "No es pot fer el diagnòstic per {category} mentre hi ha problemes importants relacionats amb {dep}.", + "diagnosis_ignored_issues": "(+ {nb_ignored} problema(es) ignorat(s))", + "diagnosis_found_errors": "S'ha trobat problema(es) important(s) {errors} relacionats amb {category}!", + "diagnosis_found_errors_and_warnings": "S'ha trobat problema(es) important(s) {errors} (i avis(os) {warnings}) relacionats amb {category}!", + "diagnosis_found_warnings": "S'han trobat ítems {warnings} que es podrien millorar per {category}.", + "diagnosis_everything_ok": "Tot sembla correcte per {category}!", + "diagnosis_failed": "No s'han pogut obtenir els resultats del diagnòstic per la categoria «{category}» : {error}", + "diagnosis_ip_connected_ipv4": "El servidor està connectat a Internet amb IPv4!", + "diagnosis_ip_no_ipv4": "El servidor no té una IPv4 que funcioni.", + "diagnosis_ip_connected_ipv6": "El servidor està connectat a Internet amb IPv6!", + "diagnosis_ip_no_ipv6": "El servidor no té una IPv6 que funcioni.", + "diagnosis_ip_not_connected_at_all": "Sembla que el servidor no està connectat a internet!?", + "diagnosis_ip_dnsresolution_working": "La resolució de nom de domini està funcionant!", + "diagnosis_ip_broken_dnsresolution": "La resolució de nom de domini falla per algun motiu… Està el tallafocs bloquejant les peticions DNS?", + "diagnosis_ip_broken_resolvconf": "La resolució de nom de domini sembla caiguda en el servidor, podria estar relacionat amb el fet que /etc/resolv.conf no apunta cap a 127.0.0.1.", + "diagnosis_ip_weird_resolvconf": "La resolució DNS sembla estar funcionant, però aneu amb compte ja que esteu utilitzant un versió personalitzada de /etc/resolv.conf.", + "diagnosis_ip_weird_resolvconf_details": "En canvi, aquest fitxer hauria de ser un enllaç simbòlic cap a /etc/resolvconf/run/resolv.conf i que aquest apunti cap a 127.0.0.1 (dnsmasq). La configuració del «resolver» real s'hauria de fer via /etc/resolv.dnsmaq.conf.", + "diagnosis_dns_good_conf": "Bona configuració DNS pel domini {domain} (categoria {category})", + "diagnosis_dns_bad_conf": "Configuració DNS incorrecta o inexistent pel domini {domain} (categoria {category})", + "diagnosis_dns_missing_record": "Segons la configuració DNS recomanada, hauríeu d'afegir un registre DNS de tipus {0}, nom {1} i valor {2}", + "diagnosis_dns_discrepancy": "Segons la configuració DNS recomanada, el valor pel registre DNS de tipus {0} i nom {1} hauria de ser {2}, en comptes de {3}.", + "diagnosis_services_good_status": "El servei {service} està {status} tal i com s'esperava!", + "diagnosis_services_bad_status": "El servei {service} està {status} :/", + "diagnosis_diskusage_verylow": "El lloc d'emmagatzematge {mountpoint} (en l'aparell {device}) només té disponibles {free_abs_GB} GB ({free_percent}%). Hauríeu de considerar alliberar una mica d'espai.", + "diagnosis_diskusage_low": "El lloc d'emmagatzematge {mountpoint} (en l'aparell {device}) només té disponibles {free_abs_GB} GB ({free_percent}%). Aneu amb compte.", + "diagnosis_diskusage_ok": "El lloc d'emmagatzematge {mountpoint} (en l'aparell {device}) encara té {free_abs_GB} GB ({free_percent}%) lliures!", + "diagnosis_ram_verylow": "El sistema només té {available_abs_MB} MB ({available_percent}%) de memòria RAM disponibles! (d'un total de {total_abs_MB} MB)", + "diagnosis_ram_ok": "El sistema encara té {available_abs_MB} MB ({available_percent}%) de memòria RAM disponibles d'un total de {total_abs_MB} MB.", + "diagnosis_swap_notsomuch": "El sistema només té {total_MB} MB de swap. Hauríeu de considerar tenir un mínim de 256 MB per evitar situacions en les que el sistema es queda sense memòria.", + "diagnosis_swap_ok": "El sistema té {total_MB} MB de swap!", + "diagnosis_regenconf_allgood": "Tots els fitxers de configuració estan en acord amb la configuració recomanada!", + "diagnosis_regenconf_manually_modified_details": "No hauria de ser cap problema sempre i quan sapigueu el que esteu fent ;) !", + "diagnosis_regenconf_manually_modified_debian": "El fitxer de configuració {file} ha estat modificat manualment respecte al fitxer per defecte de Debian.", + "diagnosis_regenconf_manually_modified_debian_details": "No hauria de ser cap problema, però ho haureu de vigilar...", + "diagnosis_security_all_good": "No s'ha trobat cap vulnerabilitat de seguretat crítica.", + "diagnosis_security_vulnerable_to_meltdown": "Sembla que el sistema és vulnerable a la vulnerabilitat de seguretat crítica Meltdown", + "diagnosis_description_basesystem": "Sistema de base", + "diagnosis_description_ip": "Connectivitat a Internet", + "diagnosis_description_dnsrecords": "Registres DNS", + "diagnosis_description_services": "Verificació de l'estat dels serveis", + "diagnosis_description_systemresources": "Recursos del sistema", + "diagnosis_description_ports": "Exposició dels ports", + "diagnosis_description_http": "Exposició HTTP", + "diagnosis_description_regenconf": "Configuració del sistema", + "diagnosis_description_security": "Verificacions de seguretat", + "diagnosis_ports_could_not_diagnose": "No s'ha pogut diagnosticar si els ports són accessibles des de l'exterior. Error: {error}", + "diagnosis_ports_unreachable": "El port {port} no és accessible des de l'exterior.", + "diagnosis_ports_ok": "El port {port} és accessible des de l'exterior.", + "diagnosis_http_ok": "El domini {domain} és accessible des de l'exterior.", + "diagnosis_http_unreachable": "El domini {domain} no és accessible a través de HTTP des de l'exterior.", + "diagnosis_unknown_categories": "Les següents categories són desconegudes: {categories}" } From cba136d42d4f5c4a223d4cbc5f8d35fff48cb1dd Mon Sep 17 00:00:00 2001 From: amirale qt Date: Thu, 7 Nov 2019 12:48:53 +0000 Subject: [PATCH 20/29] Translated using Weblate (French) Currently translated at 96.4% (585 of 607 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/fr/ --- locales/fr.json | 51 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/locales/fr.json b/locales/fr.json index 645e285ad..5fb72d679 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -665,5 +665,54 @@ "app_install_failed": "Impossible d'installer {app}: {error}", "app_install_script_failed": "Une erreur est survenue dans le script d'installation de l'application", "permission_require_account": "Permission {permission} n'a de sens que pour les utilisateurs ayant un compte et ne peut donc pas être activé pour les visiteurs.", - "app_remove_after_failed_install": "Supprimer l'application après l'échec de l'installation…" + "app_remove_after_failed_install": "Supprimer l'application après l'échec de l'installation…", + "diagnosis_display_tip_web": "Vous pouvez aller à la section Diagnostic (dans l'écran d'accueil) pour voir les problèmes rencontrés.", + "diagnosis_cant_run_because_of_dep": "Impossible d'exécuter le diagnostic pour {category} alors qu'il existe des problèmes importants liés à {dep}.", + "diagnosis_found_errors": "Trouvé {errors} problème(s) significatif(s) lié(s) à {category} !", + "diagnosis_found_errors_and_warnings": "Trouvé {errors} problème(s) significatif(s) (et {warnings} (avertissement(s)) en relation avec {category} !", + "diagnosis_ip_not_connected_at_all": "Le serveur ne semble pas du tout connecté à Internet !?", + "diagnosis_ip_weird_resolvconf": "La résolution DNS semble fonctionner, mais soyer prudent en utilisant un fichier /etc/resolv.conf personnalisé.", + "diagnosis_ip_weird_resolvconf_details": "Au lieu de cela, ce fichier devrait être un lien symbolique vers /etc/resolvconf/run/resolv.conf lui-même pointant vers 127.0.0.1 (dnsmasq). Les résolveurs réels doivent être configurés via /etc/resolv.dnsmasq.conf.", + "diagnosis_dns_missing_record": "Selon la configuration DNS recommandée, vous devez ajouter un enregistrement DNS de type {0}, nom {1} et valeur {2}", + "diagnosis_diskusage_ok": "Le stockage {mountpoint} (sur le périphérique {device}) a toujours {espace libre {free_abs_GB} GB ({free_percent}%) !", + "diagnosis_ram_ok": "Le système dispose toujours de {available_abs_MB} MB ({available_percent}%) de RAM sur {total_abs_MB} MB.", + "diagnosis_regenconf_allgood": "Tous les fichiers de configuration sont conformes à la configuration recommandée !", + "diagnosis_security_vulnerable_to_meltdown": "Vous semblez vulnérable à la vulnérabilité de sécurité critique de Meltdown", + "diagnosis_basesystem_host": "Le serveur exécute Debian {debian_version}.", + "diagnosis_basesystem_kernel": "Le serveur exécute le noyau Linux {kernel_version}", + "diagnosis_basesystem_ynh_single_version": "{0} version: {1} ({2})", + "diagnosis_basesystem_ynh_main_version": "Le serveur exécute YunoHost {main_version} ({repo})", + "diagnosis_basesystem_ynh_inconsistent_versions": "Vous exécutez des versions incohérentes des packages YunoHost ... probablement à cause d'une mise à niveau partielle ou échouée.", + "diagnosis_display_tip_cli": "Vous pouvez exécuter 'yunohost diagnosis show --issues' pour afficher les problèmes détectés.", + "diagnosis_failed_for_category": "Échec du diagnostic pour la catégorie '{category}' : {error}", + "diagnosis_cache_still_valid": "(Le cache est toujours valide pour le diagnostic {category}. Pas re-diagnostiquer pour le moment!)", + "diagnosis_ignored_issues": "(+ {nb_ignored} questions ignorée(s))", + "diagnosis_found_warnings": "Trouvé {warnings} objet(s) pouvant être amélioré(s) pour {category}.", + "diagnosis_everything_ok": "Tout semble bien pour {category} !", + "diagnosis_failed": "Impossible d'extraire le résultat du diagnostic pour la catégorie '{category}': {error}", + "diagnosis_ip_connected_ipv4": "Le serveur est connecté à Internet via IPv4 !", + "diagnosis_ip_no_ipv4": "Le serveur ne dispose pas d’une adresse IPv4 active.", + "diagnosis_ip_connected_ipv6": "Le serveur est connecté à Internet via IPv6 !", + "diagnosis_ip_no_ipv6": "Le serveur ne dispose pas d'une adresse IPv6 active.", + "diagnosis_ip_dnsresolution_working": "La résolution de nom de domaine fonctionne !", + "diagnosis_ip_broken_dnsresolution": "La résolution du nom de domaine semble interrompue pour une raison quelconque ... Un pare-feu bloque-t-il les requêtes DNS ?", + "diagnosis_ip_broken_resolvconf": "La résolution du nom de domaine semble cassée sur votre serveur, ce qui semble lié au fait que /etc/resolv.conf ne pointe pas vers 127.0.0.1.", + "diagnosis_dns_good_conf": "Bonne configuration DNS pour le domaine {domain} (catégorie {category})", + "diagnosis_dns_bad_conf": "Configuration DNS incorrecte/manquante pour le domaine {domain} (catégorie {category})", + "diagnosis_dns_discrepancy": "Selon la configuration DNS recommandée, la valeur de l'enregistrement DNS de type {0} et nom {1} doit être {2} et non {3}.", + "diagnosis_services_bad_status": "Le service {service} est {status} :/", + "diagnosis_services_good_status": "Le service {service} est {status} comme prévu !", + "diagnosis_diskusage_verylow": "Le stockage {mountpoint} (sur le périphérique {device}) ne dispose que de {free_abs_GB} Go ({free_percent}%). Vous devriez vraiment envisager de nettoyer un peu d'espace.", + "diagnosis_diskusage_low": "Le stockage {mountpoint} (sur le périphérique {device}) ne dispose que de {free_abs_GB} Go ({free_percent}%). Faites attention.", + "diagnosis_ram_verylow": "Le système ne dispose plus que de {available_abs_MB} MB ({available_percent}%)! (sur {total_abs_MB} Mo)", + "diagnosis_ram_low": "Le système n'a plus de {available_abs_MB} MB ({available_percent}%) RAM sur {total_abs_MB} MB. Faites attention.", + "diagnosis_swap_none": "Le système n'a aucun échange. Vous devez envisager d’ajouter au moins 256 Mo de swap pour éviter les situations où le système manque de mémoire.", + "diagnosis_swap_notsomuch": "Le système ne dispose que de {total_MB} Mo de swap. Vous devez envisager d'avoir au moins 256 Mo pour éviter les situations où le système manque de mémoire.", + "diagnosis_swap_ok": "Le système dispose de {total_MB} Mo de swap !", + "diagnosis_regenconf_manually_modified": "Le fichier de configuration {file} a été modifié manuellement.", + "diagnosis_regenconf_manually_modified_debian": "Le fichier de configuration {file} a été modifié manuellement par rapport à celui par défaut de Debian.", + "diagnosis_regenconf_manually_modified_details": "C'est probablement OK tant que vous savez ce que vous faites;) !", + "diagnosis_regenconf_manually_modified_debian_details": "Cela peut probablement être OK, mais il faut garder un œil dessus ...", + "diagnosis_regenconf_nginx_conf_broken": "La configuration de nginx semble être cassée !", + "diagnosis_security_all_good": "Aucune vulnérabilité de sécurité critique n'a été trouvée." } From f28f990349c7f929f156f071322575bddc636da1 Mon Sep 17 00:00:00 2001 From: amirale qt Date: Wed, 13 Nov 2019 21:00:09 +0000 Subject: [PATCH 21/29] Translated using Weblate (Esperanto) Currently translated at 83.9% (506 of 603 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/eo/ --- locales/eo.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/locales/eo.json b/locales/eo.json index a25fa505e..7fe36db64 100644 --- a/locales/eo.json +++ b/locales/eo.json @@ -564,5 +564,16 @@ "permission_currently_allowed_for_all_users": "Ĉi tiu permeso estas nuntempe donita al ĉiuj uzantoj aldone al aliaj grupoj. Vi probable volas aŭ forigi la permeson \"all_users\" aŭ forigi la aliajn grupojn, kiujn ĝi nuntempe donas.", "app_install_failed": "Ne povis instali {app} : {error}", "app_install_script_failed": "Eraro okazis en la skripto de instalado de la app", - "app_remove_after_failed_install": "Forigado de la app post la instala fiasko …" + "app_remove_after_failed_install": "Forigado de la app post la instala fiasko …", + "diagnosis_basesystem_host": "Servilo funkcias Debian {debian_version}.", + "apps_catalog_init_success": "Aplikoj katalogsistemo inicializita !", + "apps_catalog_updating": "Ĝisdatigante katalogo de aplikoj ...", + "apps_catalog_failed_to_download": "Ne eblas elŝuti la katalogon de {apps_catalog}: {error}", + "apps_catalog_obsolete_cache": "La kaŝmemoro de la katalogo de programoj estas malplena aŭ malaktuala.", + "apps_catalog_update_success": "La aplika katalogo estis ĝisdatigita!", + "diagnosis_basesystem_kernel": "Servilo funkcias Linuksan kernon {kernel_version}", + "diagnosis_basesystem_ynh_single_version": "{0} versio: {1} ({2})", + "diagnosis_basesystem_ynh_main_version": "Servilo funkcias YunoHost {main_version} ({repo})", + "diagnosis_basesystem_ynh_inconsistent_versions": "Vi prizorgas malkonsekvencajn versiojn de la YunoHost-pakoj... plej probable pro malsukcesa aŭ parta ĝisdatigo.", + "diagnosis_display_tip_web": "Vi povas iri al la sekcio Diagnozo (en la hejmekrano) por vidi la trovitajn problemojn." } From bce2dfae265ca43db3cbe931144e7e9ca522e599 Mon Sep 17 00:00:00 2001 From: xaloc33 Date: Wed, 13 Nov 2019 22:44:19 +0000 Subject: [PATCH 22/29] Translated using Weblate (Catalan) Currently translated at 100.0% (603 of 603 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/ca/ --- locales/ca.json | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/locales/ca.json b/locales/ca.json index 3a40712ca..848838bda 100644 --- a/locales/ca.json +++ b/locales/ca.json @@ -308,7 +308,7 @@ "migration_description_0007_ssh_conf_managed_by_yunohost_step1": "La configuració SSH serà gestionada per YunoHost (pas 1, automàtic)", "migration_description_0008_ssh_conf_managed_by_yunohost_step2": "La configuració SSH serà gestionada per YunoHost (pas 2, manual)", "migration_description_0009_decouple_regenconf_from_services": "Desvincula el mecanisme regen-conf dels serveis", - "migration_description_0010_migrate_to_apps_json": "Elimina les llistes d'aplicacions obsoletes i utilitza la nova llista unificada «apps.json» en el seu lloc", + "migration_description_0010_migrate_to_apps_json": "Elimina els catàlegs d'aplicacions obsolets i utilitza la nova llista unificada «apps.json» en el seu lloc (obsolet, substituït per la migració 13)", "migration_0003_backward_impossible": "La migració Stretch no és reversible.", "migration_0003_start": "Ha començat la migració a Stretch. Els registres estaran disponibles a {logfile}.", "migration_0003_patching_sources_list": "Modificant el fitxer sources.lists…", @@ -320,7 +320,7 @@ "migration_0003_system_not_fully_up_to_date": "El vostre sistema no està completament actualitzat. S'ha de fer una actualització normal abans de fer la migració a Stretch.", "migration_0003_still_on_jessie_after_main_upgrade": "Hi ha hagut un problema durant l'actualització principal: El sistema encara està amb Jessie? Per investigar el problema, mireu el registres a {log}:s…", "migration_0003_general_warning": "Tingueu en compte que la migració és una operació delicada. L'equip de YunoHost a fet els possibles per revisar-la i provar-la, però la migració pot provocar errors en parts del sistema o aplicacions.\n\nPer tant, es recomana:\n - Fer una còpia de seguretat de les dades o aplicacions importants. Més informació a https://yunohost.org/backup;\n - Sigueu pacient un cop llençada la migració: en funció de la connexió a internet i el maquinari, pot trigar fins a unes hores per actualitzar-ho tot.\n\nD'altra banda, el port per SMTP, utilitzat per clients de correu externs (com Thunderbird o K9-Mail) ha canviat de 465 (SSL/TLS) a 587 (STARTTLS). L'antic port (465) serà tancat automàticament, i el nou port (587) serà obert en el tallafocs. Tots els usuaris *hauran* d'adaptar la configuració dels clients de correu en acord amb aquests canvis.", - "migration_0003_problematic_apps_warning": "Tingueu en compte que s'han detectat les aplicacions, possiblement, problemàtiques següents. Sembla que aquestes no s'han instal·lat des d'una applist, o que no estan marcades com a «working». Per conseqüent, no podem garantir que segueixin funcionant després de l'actualització: {problematic_apps}", + "migration_0003_problematic_apps_warning": "Tingueu en compte que s'han detectat les aplicacions, possiblement, problemàtiques següents. Sembla que aquestes no s'han instal·lat des d'un catàleg d'aplicacions, o que no estan marcades com a «working». Per conseqüent, no podem garantir que segueixin funcionant després de l'actualització: {problematic_apps}", "migration_0003_modified_files": "Tingueu en compte que s'han detectat els següents fitxers que han estat modificats manualment i podrien sobreescriure's al final de l'actualització: {manually_modified_files}", "migration_0005_postgresql_94_not_installed": "PostgreSQL no està instal·lat en el sistema. No hi ha res per fer.", "migration_0005_postgresql_96_not_installed": "PostgreSQL 9.4 està instal·lat, però no PostgreSQL 9.6? Alguna cosa estranya a passat en el sistema :( …", @@ -694,5 +694,14 @@ "diagnosis_ports_ok": "El port {port} és accessible des de l'exterior.", "diagnosis_http_ok": "El domini {domain} és accessible des de l'exterior.", "diagnosis_http_unreachable": "El domini {domain} no és accessible a través de HTTP des de l'exterior.", - "diagnosis_unknown_categories": "Les següents categories són desconegudes: {categories}" + "diagnosis_unknown_categories": "Les següents categories són desconegudes: {categories}", + "apps_catalog_init_success": "S'ha iniciat el sistema de catàleg d'aplicacions!", + "apps_catalog_updating": "S'està actualitzant el catàleg d'aplicacions…", + "apps_catalog_failed_to_download": "No s'ha pogut descarregar el catàleg d'aplicacions {apps_catalog}: {error}", + "apps_catalog_obsolete_cache": "La memòria cau del catàleg d'aplicacions és buida o obsoleta.", + "apps_catalog_update_success": "S'ha actualitzat el catàleg d'aplicacions!", + "diagnosis_mail_ougoing_port_25_ok": "El port de sortida 25 no està bloquejat i els correus es poden enviar a altres servidors.", + "diagnosis_mail_ougoing_port_25_blocked": "Sembla que el port de sortida 25 està bloquejat. Hauríeu d'intentar desbloquejar-lo al panell de configuració del proveïdor d'accés a internet (o allotjador). Mentrestant, el servidor no podrà enviar correus a altres servidors.", + "diagnosis_description_mail": "Correu electrònic", + "migration_description_0013_futureproof_apps_catalog_system": "Migrar al nou sistema de catàleg d'aplicacions resistent al pas del temps" } From b40ccc6063628e4edcd506488ef29ced18b0c655 Mon Sep 17 00:00:00 2001 From: amirale qt Date: Wed, 13 Nov 2019 20:18:22 +0000 Subject: [PATCH 23/29] Translated using Weblate (French) Currently translated at 100.0% (603 of 603 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/fr/ --- locales/fr.json | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/locales/fr.json b/locales/fr.json index 5fb72d679..1300657cf 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -77,7 +77,7 @@ "domain_created": "Le domaine a été créé", "domain_creation_failed": "Impossible de créer le domaine {domain}: {error}", "domain_deleted": "Le domaine a été supprimé", - "domain_deletion_failed": "Impossible de supprimer le domaine {domain}: {error}", + "domain_deletion_failed": "Impossible de supprimer le domaine {domain}:{error}", "domain_dyndns_already_subscribed": "Vous avez déjà souscris à un domaine DynDNS", "domain_dyndns_invalid": "Domaine incorrect pour un usage avec DynDNS", "domain_dyndns_root_unknown": "Domaine DynDNS principal inconnu", @@ -270,7 +270,7 @@ "ldap_init_failed_to_create_admin": "L’initialisation de l'annuaire LDAP n’a pas réussi à créer l’utilisateur admin", "ssowat_persistent_conf_read_error": "Impossible de lire la configuration persistante de SSOwat : {error:s}. Modifiez le fichier /etc/ssowat/conf.json.persistent pour réparer la syntaxe JSON", "ssowat_persistent_conf_write_error": "Impossible de sauvegarder de la configuration persistante de SSOwat : {error:s}. Modifiez le fichier /etc/ssowat/conf.json.persistent pour réparer la syntaxe JSON", - "domain_cannot_remove_main": "Impossible de supprimer le domaine principal. Définissez d'abord un nouveau domaine principal", + "domain_cannot_remove_main": "Vous ne pouvez pas supprimer '{domain: s}' car il s'agit du domaine principal. Vous devez d'abord définir un autre domaine comme domaine principal à l'aide de 'yunohost domain main-domain -n ', voici la liste des domaines candidats. : {other_domains: s}", "certmanager_self_ca_conf_file_not_found": "Le fichier de configuration pour l’autorité du certificat auto-signé est introuvable (fichier : {file:s})", "certmanager_unable_to_parse_self_CA_name": "Impossible d’analyser le nom de l’autorité du certificat auto-signé (fichier : {file:s})", "mailbox_used_space_dovecot_down": "Le service de courriel Dovecot doit être démarré, si vous souhaitez voir l’espace disque occupé par la messagerie", @@ -394,7 +394,7 @@ "migration_0003_system_not_fully_up_to_date": "Votre système n’est pas complètement à jour. Veuillez mener une mise à jour classique avant de lancer à migration à Stretch.", "migration_0003_still_on_jessie_after_main_upgrade": "Quelque chose s’est mal passé pendant la mise à niveau principale : le système est toujours sur Debian Jessie !? Pour investiguer sur le problème, veuillez regarder les journaux {log}:s …", "migration_0003_general_warning": "Veuillez noter que cette migration est une opération délicate. Si l’équipe YunoHost a fait de son mieux pour la relire et la tester, la migration pourrait tout de même casser des parties de votre système ou de vos applications.\n\nEn conséquence, nous vous recommandons :\n - de lancer une sauvegarde de vos données ou applications critiques. Plus d’informations sur https://yunohost.org/backup ;\n - d’être patient après avoir lancé la migration : selon votre connexion internet et matériel, cela pourrait prendre jusqu’à quelques heures pour que tout soit à niveau.\n\nEn outre, le port SMTP utilisé par les clients de messagerie externes comme (Thunderbird ou K9-Mail) a été changé de 465 (SSL/TLS) à 587 (STARTTLS). L’ancien port 465 sera automatiquement fermé et le nouveau port 587 sera ouvert dans le pare-feu. Vous et vos utilisateurs *devront* adapter la configuration de vos clients de messagerie en conséquence.", - "migration_0003_problematic_apps_warning": "Veuillez noter que des applications possiblement problématiques ont été détectées. Il semble qu’elles n’aient pas été installées depuis une liste d’application ou qu’elles ne soit pas marquées comme « fonctionnelles ». En conséquence, nous ne pouvons pas garantir qu’elles fonctionneront après la mise à niveau : {problematic_apps}", + "migration_0003_problematic_apps_warning": "Veuillez noter que les applications installées potentiellement problématiques suivantes ont été détectées. Il semble que celles-ci n'ont pas été installées à partir d'un catalogue d'applications, ou ne sont pas marquées comme \"working \". Par conséquent, il ne peut pas être garanti qu'ils fonctionneront toujours après la mise à niveau: {problematic_apps}", "migration_0003_modified_files": "Veuillez noter que les fichiers suivants ont été détectés comme modifiés manuellement et pourraient être écrasés à la fin de la mise à niveau : {manually_modified_files}", "migrations_list_conflict_pending_done": "Vous ne pouvez pas utiliser --previous et --done simultanément.", "migrations_to_be_ran_manually": "La migration {id} doit être lancée manuellement. Veuillez aller dans Outils > Migrations dans l’interface admin, ou lancer `yunohost tools migrations migrate`.", @@ -541,7 +541,7 @@ "global_settings_setting_security_ssh_compatibility": "Compatibilité versus compromis sécuritaire pour le serveur SSH. Affecte les cryptogrammes (et d'autres aspects liés à la sécurité)", "global_settings_setting_security_postfix_compatibility": "Compatibilité versus compromis sécuritaire pour le serveur Postfix. Affecte les cryptogrammes (et d'autres aspects liés à la sécurité)", "migration_description_0009_decouple_regenconf_from_services": "Dissocier le mécanisme « regen-conf » des services", - "migration_description_0010_migrate_to_apps_json": "Supprimer les listes d'applications obsolètes et utiliser la nouvelle liste unifiée 'apps.json' à la place", + "migration_description_0010_migrate_to_apps_json": "Supprimez les catalogues d'applications obsolètes et utilisez à la place la nouvelle liste unifiée 'apps.json' (obsolète, remplacée par la migration 13).", "regenconf_file_kept_back": "Le fichier de configuration '{conf}' devait être supprimé par « regen-conf » (catégorie {category}) mais a été conservé.", "regenconf_updated": "La configuration a été mise à jour pour la catégorie '{category}'", "regenconf_would_be_updated": "La configuration aurait dû être mise à jour pour la catégorie '{category}'", @@ -625,7 +625,7 @@ "migrations_running_forward": "Exécution de la migration {id}…", "migrations_success_forward": "Migration {id} terminée", "need_define_permission_before": "Redéfinissez l'autorisation à l'aide de 'yunohost user permission add -u USER' avant de supprimer un groupe autorisé", - "operation_interrupted": "L'opération a-t-elle été interrompue manuellement ?", + "operation_interrupted": "L'opération a été interrompue manuellement ?", "permission_already_clear": "L'autorisation '{permission: s}' est déjà vide pour l'application {app: s}", "permission_already_exist": "L'autorisation '{permission}' existe déjà", "permission_created": "Permission '{permission:s}' créée", @@ -714,5 +714,32 @@ "diagnosis_regenconf_manually_modified_details": "C'est probablement OK tant que vous savez ce que vous faites;) !", "diagnosis_regenconf_manually_modified_debian_details": "Cela peut probablement être OK, mais il faut garder un œil dessus ...", "diagnosis_regenconf_nginx_conf_broken": "La configuration de nginx semble être cassée !", - "diagnosis_security_all_good": "Aucune vulnérabilité de sécurité critique n'a été trouvée." + "diagnosis_security_all_good": "Aucune vulnérabilité de sécurité critique n'a été trouvée.", + "apps_catalog_init_success": "Système de catalogue d'applications initialisé !", + "apps_catalog_failed_to_download": "Impossible de télécharger le catalogue des applications {apps_catalog}:{error}", + "diagnosis_mail_ougoing_port_25_blocked": "Le port sortant 25 semble être bloqué. Vous devriez essayer de le débloquer dans le panneau de configuration de votre fournisseur de services Internet (ou hébergeur). En attendant, le serveur ne pourra pas envoyer de courrier électronique à d'autres serveurs.", + "domain_cannot_remove_main_add_new_one": "Vous ne pouvez pas supprimer '{domain:s}' car il s'agit du domaine principal et de votre seul domaine. Vous devez d'abord ajouter un autre domaine à l'aide de 'yunohost domain add ', puis définir comme domaine principal à l'aide de ' yunohost domain main-domain -n ' et vous pouvez ensuite supprimer le domaine '{domaine: s}' à l'aide de 'yunohost domain remove {domain:s}'.'", + "diagnosis_security_vulnerable_to_meltdown_details": "Pour résoudre ce problème, vous devez mettre à niveau votre système et redémarrer pour charger le nouveau noyau Linux (ou contacter votre fournisseur de serveur si cela ne fonctionne pas). Voir https://meltdownattack.com/ pour plus d'informations.", + "diagnosis_description_basesystem": "Système de base", + "diagnosis_description_ip": "Connectivité Internet", + "diagnosis_description_dnsrecords": "Enregistrements DNS", + "diagnosis_description_services": "Vérification de l'état des services", + "diagnosis_description_systemresources": "Ressources système", + "diagnosis_description_ports": "Exposition des ports", + "diagnosis_description_http": "Exposition HTTP", + "diagnosis_description_regenconf": "Configurations système", + "diagnosis_description_security": "Contrôles de sécurité", + "diagnosis_ports_could_not_diagnose": "Impossible de diagnostiquer si les ports sont accessibles de l'extérieur. Erreur: {error}", + "apps_catalog_updating": "Mise à jour du catalogue d'applications...", + "apps_catalog_obsolete_cache": "Le cache du catalogue d'applications est vide ou obsolète.", + "apps_catalog_update_success": "Le catalogue des applications a été mis à jour !", + "diagnosis_mail_ougoing_port_25_ok": "Le port sortant 25 n'est pas bloqué et le courrier électronique peut être envoyé à d'autres serveurs.", + "diagnosis_description_mail": "Email", + "diagnosis_ports_unreachable": "Le port {port} n'est pas accessible de l'extérieur.", + "diagnosis_ports_ok": "Le port {port} est accessible de l'extérieur.", + "diagnosis_http_could_not_diagnose": "Impossible de diagnostiquer si le domaine est accessible de l'extérieur. Erreur: {error}", + "diagnosis_http_ok": "Le domaine {domain} est accessible de l'extérieur.", + "diagnosis_http_unreachable": "Le domaine {domain} est inaccessible via HTTP de l'extérieur.", + "diagnosis_unknown_categories": "Les catégories suivantes sont inconnues: {categories}", + "migration_description_0013_futureproof_apps_catalog_system": "Migrer vers le nouveau système de catalogue d'applications à l'épreuve du temps" } From c6dbb6292b07cf7f3f6d03585ab51d40f4659891 Mon Sep 17 00:00:00 2001 From: advocatux Date: Wed, 13 Nov 2019 12:16:01 +0000 Subject: [PATCH 24/29] Translated using Weblate (Spanish) Currently translated at 89.6% (540 of 603 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/es/ --- locales/es.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/locales/es.json b/locales/es.json index d526f442f..e33d2c3ae 100644 --- a/locales/es.json +++ b/locales/es.json @@ -643,5 +643,20 @@ "diagnosis_basesystem_kernel": "El servidor está ejecutando el núcleo de Linux {kernel_version}", "diagnosis_basesystem_ynh_single_version": "{0} versión: {1} ({2})", "diagnosis_basesystem_ynh_main_version": "El servidor está ejecutando YunoHost {main_version} ({repo})", - "diagnosis_basesystem_ynh_inconsistent_versions": "Está ejecutando versiones incoherentes de los paquetes de YunoHost... probablemente por una actualización errónea o parcial." + "diagnosis_basesystem_ynh_inconsistent_versions": "Está ejecutando versiones incoherentes de los paquetes de YunoHost... probablemente por una actualización errónea o parcial.", + "diagnosis_failed_for_category": "Diagnóstico fallido para la categoría «{category}» : {error}", + "diagnosis_cache_still_valid": "(Caché aún válida para el diagnóstico de {category}. ¡Aún no se ha rediagnosticado!)", + "diagnosis_found_errors_and_warnings": "¡Encontrado(s) error(es) significativo(s) {errors} (y aviso(s) {warnings}) relacionado(s) con {category}!", + "diagnosis_display_tip_web": "Puede ir a la sección de diagnóstico (en la pantalla principal) para ver los problemas encontrados.", + "diagnosis_display_tip_cli": "Puede ejecutar «yunohost diagnosis show --issues» para mostrar los problemas encontrados.", + "apps_catalog_init_success": "¡Sistema de catálogo de aplicaciones inicializado!", + "apps_catalog_updating": "Actualizando catálogo de aplicaciones...", + "apps_catalog_failed_to_download": "No se pudo descargar el catálogo de aplicaciones {apps_catalog}: {error}", + "apps_catalog_obsolete_cache": "La caché del catálogo de aplicaciones está vacía u obsoleta.", + "apps_catalog_update_success": "¡El catálogo de aplicaciones ha sido actualizado!", + "diagnosis_cant_run_because_of_dep": "No se puede ejecutar el diagnóstico para {category} mientras haya problemas importantes relacionados con {dep}.", + "diagnosis_ignored_issues": "(+ {nb_ignored} problema(s) ignorado(s))", + "diagnosis_found_errors": "¡Encontrado(s) error(es) significativo(s) {errors} relacionado(s) con {category}!", + "diagnosis_found_warnings": "Encontrado elemento(s) {warnings} que puede(n) ser mejorado(s) para {category}.", + "diagnosis_everything_ok": "¡Todo se ve bien para {category}!" } From ee226ff2634f343e4400b0f2eb3bb0f4e30b78d5 Mon Sep 17 00:00:00 2001 From: amirale qt Date: Fri, 15 Nov 2019 08:51:30 +0000 Subject: [PATCH 25/29] Translated using Weblate (Esperanto) Currently translated at 84.7% (505 of 596 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/eo/ --- locales/eo.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/locales/eo.json b/locales/eo.json index 7fe36db64..4b8a76d3c 100644 --- a/locales/eo.json +++ b/locales/eo.json @@ -575,5 +575,9 @@ "diagnosis_basesystem_ynh_single_version": "{0} versio: {1} ({2})", "diagnosis_basesystem_ynh_main_version": "Servilo funkcias YunoHost {main_version} ({repo})", "diagnosis_basesystem_ynh_inconsistent_versions": "Vi prizorgas malkonsekvencajn versiojn de la YunoHost-pakoj... plej probable pro malsukcesa aŭ parta ĝisdatigo.", - "diagnosis_display_tip_web": "Vi povas iri al la sekcio Diagnozo (en la hejmekrano) por vidi la trovitajn problemojn." + "diagnosis_display_tip_web": "Vi povas iri al la sekcio Diagnozo (en la hejmekrano) por vidi la trovitajn problemojn.", + "diagnosis_cache_still_valid": "(Kaŝmemoro ankoraŭ validas por {category} diagnozo. Ankoraŭ ne re-diagnoza!)", + "diagnosis_cant_run_because_of_dep": "Ne eblas fari diagnozon por {category} dum estas gravaj problemoj rilataj al {dep}.", + "diagnosis_display_tip_cli": "Vi povas aranĝi 'yunohost diagnosis show --issues' por aperigi la trovitajn problemojn.", + "diagnosis_failed_for_category": "Diagnozo malsukcesis por kategorio '{category}': {error}" } From 174d1d6b98ddc4d3e42a9cdae91e5f403433f715 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quent=C3=AD?= Date: Thu, 14 Nov 2019 16:53:08 +0000 Subject: [PATCH 26/29] Translated using Weblate (Occitan) Currently translated at 42.1% (251 of 596 strings) Translation: YunoHost/core Translate-URL: https://translate.yunohost.org/projects/yunohost/core/oc/ --- locales/oc.json | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/locales/oc.json b/locales/oc.json index f848bae1b..aa233d8b8 100644 --- a/locales/oc.json +++ b/locales/oc.json @@ -684,5 +684,19 @@ "log_permission_delete": "Suprimir la permission « {} »", "log_user_group_create": "Crear lo grop « {} »", "log_user_permission_update": "Actualizacion dels accèsses per la permission « {} »", - "operation_interrupted": "L’operacion es estada interrompuda manualament ?" + "operation_interrupted": "L’operacion es estada interrompuda manualament ?", + "group_cannot_be_edited": "Lo grop « {group} » pòt pas èsser modificat manualament.", + "group_cannot_be_deleted": "Lo grop « {group} » pòt pas èsser suprimit manualament.", + "diagnosis_found_warnings": "Trobat {warnings} element(s) que se poirián melhorar per {category}.", + "diagnosis_dns_missing_record": "Segon la configuracion DNS recomandada, vos calriá ajustar un enregistrament DNS de tipe {0}, nom {1} e valor {2}", + "diagnosis_dns_discrepancy": "Segon la configuracion DNS recomandada, la valor per l’enregistrament DNS de tipe {0} e nom {1} deuriá èsser {2} allòc de {3}.", + "diagnosis_regenconf_manually_modified_debian_details": "Es pas problematic, mas car téner d’agacher...", + "diagnosis_ports_could_not_diagnose": "Impossible de diagnosticar se los pòrts son accessibles de l’exterior. Error : {error}", + "diagnosis_http_could_not_diagnose": "Impossible de diagnosticar se lo domeni es accessible de l’exterior. Error : {error}", + "apps_catalog_updating": "Actualizacion del catalòg d’aplicacion…", + "apps_catalog_failed_to_download": "Telecargament impossible del catalòg d’aplicacions {apps_catalog} : {error}", + "apps_catalog_obsolete_cache": "La memòria cache del catalòg d’aplicacion es voida o obsolèta.", + "apps_catalog_update_success": "Lo catalòg d’aplicacions es a jorn !", + "diagnosis_mail_ougoing_port_25_ok": "Lo pòrt de sortida 25 es pas blocat e lo corrièr electronic pòt partir als autres servidors.", + "diagnosis_description_mail": "Corrièl" } From 68a67a9ac14b1f787a8a73fbd17d66cd9e414958 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 15 Nov 2019 16:48:54 +0100 Subject: [PATCH 27/29] Update changelog for 3.7.0.2 --- debian/changelog | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/debian/changelog b/debian/changelog index 578a8e314..e7926cd95 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,15 @@ +yunohost (3.7.0.2) testing; urgency=low + + - [fix] Make sure the users actually exists when migrating legacy custom permissions + - [mod] Move debug log dump from ynh_exit_properly to the core after failed app operation (#833) + - [enh] Improve app_upgrade error management (#832) + - [mod] Refactor group permission (#837) + - [enh] Add permission name in permission callback when adding/removing allowed users (#836) + - [enh] Improve permission helpers (#840) + - [i18n] Improve translations for German, Catalan, Swedish, Spanish, Turkish, Basque, French, Esperanto, Occitan + + -- Alexandre Aubin Fri, 15 Nov 2019 16:45:00 +0000 + yunohost (3.7.0.1) testing; urgency=low - Hotfix to avoid having a shitload of warnings displayed during the permission migration From 61e6840ed3c913cc7ecf84b01727a09e48ae40e0 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 16 Nov 2019 15:33:51 +0100 Subject: [PATCH 28/29] Only run these commands if the variables are not empty --- data/helpers.d/systemd | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/data/helpers.d/systemd b/data/helpers.d/systemd index 4b3b5a289..105678b88 100644 --- a/data/helpers.d/systemd +++ b/data/helpers.d/systemd @@ -165,9 +165,15 @@ ynh_systemd_action() { # # usage: ynh_clean_check_starting ynh_clean_check_starting () { - # Stop the execution of tail. - kill -s 15 $pid_tail 2>&1 - ynh_secure_remove "$templog" 2>&1 + if [ -n "$pid_tail" ] + then + # Stop the execution of tail. + kill -s 15 $pid_tail 2>&1 + fi + if [ -n "$templog" ] + then + ynh_secure_remove "$templog" 2>&1 + fi } From 551ff807923eb74a1783e8abdd3e41cc22f3bfad Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 16 Nov 2019 15:46:23 +0100 Subject: [PATCH 29/29] Improve ynh_secure_remove to detect empty args instead of miserably saying 'Avoid deleting .' --- data/helpers.d/utils | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/data/helpers.d/utils b/data/helpers.d/utils index a359423bb..d449f0c39 100644 --- a/data/helpers.d/utils +++ b/data/helpers.d/utils @@ -312,22 +312,23 @@ ynh_secure_remove () { ynh_print_warn --message="/!\ Packager ! You provided more than one argument to ynh_secure_remove but it will be ignored... Use this helper with one argument at time." fi - if [[ "$forbidden_path" =~ "$file" \ + if [[ -z "$file" ]] + then + ynh_print_warn --message="ynh_secure_remove called with empty argument, ignoring." + else if [[ "$forbidden_path" =~ "$file" \ # Match all paths or subpaths in $forbidden_path || "$file" =~ ^/[[:alnum:]]+$ \ # Match all first level paths from / (Like /var, /root, etc...) || "${file:${#file}-1}" = "/" ]] # Match if the path finishes by /. Because it seems there is an empty variable then - ynh_print_warn --message="Avoid deleting $file." + ynh_print_warn --message="Not deleting '$file' because it is not an acceptable path to delete." + else if [ -e "$file" ] + then + rm -R "$file" else - if [ -e "$file" ] - then - sudo rm -R "$file" - else - ynh_print_info --message="$file wasn't deleted because it doesn't exist." - fi - fi + ynh_print_info --message="'$file' wasn't deleted because it doesn't exist." + fi fi fi } # Extract a key from a plain command output